Company Ghost Story 公司鬼故事 2

contents

  1. 1. C/C++
    1. 1.1. Overprotection
    2. 1.2. Evil Comma
    3. 1.3. Export
    4. 1.4. Test Script
  2. 2. Algorithm
    1. 2.1. List vs Hash
  3. 3. Math
    1. 3.1. Degree vs Radian
  4. 4. Git
    1. 4.1. linter
  5. 5. Windows
    1. 5.1. Set Env Variable
  6. 6. Jenkins
    1. 6.1. Build Artifacts
    2. 6.2. Build Pipeline

C/C++

Overprotection

1
2
3
4
5
bool find_intersect(list<shape> a, tree b, shape c) {
if (b == null)
b = new tree(a);
return b.find_intersect(c);
}

過度保護,造成最後沒人知道 a 和 b 的關係。結果有時候 b 不是由 a 建立的,整串都不知道在做什麼。

Evil Comma

1
2
if (str[0] == '-');
str = str.substr(1);

排版已經告訴你可能發生了問題,但看起來還是救不了下面那一行。似乎沒有發生意外,但是非常恐怖。

Export

1
2
3
4
string x = "";
for (int i = 0; i < n; i++)
x = x + pts[i].str();
// x += pts[i].str();

組成不是大問題,串起來就崩潰 $O(n^2)$。請善用 in-place 的串接。

Test Script

1
2
3
4
// testXXX.cpp
int main() {
... // 100,000+ lines
}
1
g++ testXXX.cpp -O3

浪費生命從編譯時間著手,拜託開 -O0 就好,這樣就近乎線性時間的編譯速度。開到 -O3 會有平方層級的編譯時間,$(10^5)^2$ 雖然也不是很多,但突然從幾秒變成幾個小時是有可能的。

Algorithm

List vs Hash

List 比 Hash 快,不用計算雜湊值,直接比對更快。

數量一大是不是要平行去找了啊,小伙子。

Math

Degree vs Radian

1
2
3
double rotate90(double deg) {
return Math.toRadian(deg + 90) % 90;
}

不會弧度記算沒關係,晚點我們再檢查一下還有哪一段混著算吧。希望都沒事。

Git

linter

不要 format code,因為 git blame 不好看。

1
2
3
4
5
6
7
8
9
for (int i = 0; i < n; i++) {
try
{
Data rowData = data.getRow(i);
}
catch (Exception e)
{
}
}

心靜自然涼,再多的 try-catch 我也可以接受。沒事,我不會受到傷害。

Windows

Set Env Variable

1
2
1. 我的電腦 > 內容 > 進階內容設定 > 環境變數
2. 重新開機 // ?????

在大部分情況是不用重新開機,重新開啟 shell 即可。

Jenkins

Build Artifacts

每一次建置結果都保存下來,用定時刪除。

大部分的建置結果只需要保留進 25 次就差不多,如果每一次建置就要耗掉 1 GB 的硬碟空間,那在一天內上傳了好幾次,就會看到 1 TB 硬碟直接死去。

請不要說買硬碟解決問題,這並沒有解決根本問題。

Build Pipeline

充分運用硬體資源,全部平行。

有些工作是需要整台伺服器的計算資源,如果安排兩個以上的工作時,會造成另一個工作結果不穩定。而有些工作會需要大量的硬碟 IO,兩個以上甚至會造成卡死的狀態。

請不要說買更多的機器或 CPU 解決問題,這只要開一個有平行工作,另一個工作沒設計好就會自動失敗。