不能跳過的《程式設計師的職業素養(The Clean Coder)》中的一個章節

出版圈郭志敏發表於2012-08-23

enter image description here

我猜,你之所以拿起這本書,因為你是程式設計師,“職業素養”這個說法吸引了你。你應該如此。我們這種專業人士迫切渴求的,正是“職業素養”。

我也是程式設計師。我編了42年 的程式。這42年裡,我什麼都經歷過。我被開除過,也被表揚過。我當過小組長,當過主管,也當過普通員工,甚至當過CEO。我的同事有聰明絕頂的,也有混日子的懶蛋 。我曾經開發過尖端的嵌入式軟硬體系統,也寫過尋常公司的工資系統。我用過COBOL、FORTRAN、BAL、PDP-8、PDP-11、C、C++、Java、Ruby、Smalltalk,還有其他許多語言和系統。我的同事有混工資的傢伙,也包括無可挑剔的專業人士。本書要講的,正是那些無可挑剔的專業人士。

在這本書裡,我會嘗試定義專業程式設計師。我會講解,成為真正專業的程式設計師,需要什麼樣的態度、原則、行動。

這些態度、原則、行動從哪裡得知?它們源於我一路走來的親身體會。坦白說,看到我第一次作程式設計師時的表現,你幾乎不會想到與“專業”二字搭邊。

那是1969年,我17歲的時候。我父親督促本地一家名為ASC的公司僱用我為兼職程式設計師。(是的,我父親做得出這種事情。我曾見到他衝到疾馳的汽車前,伸出雙臂大喊“停”,車真的就停下來了。沒人敢對他說不。)那家公司把我扔在保管所有IBM電腦操作手冊的房間裡。我的任務就是把歷年的更新記錄到操作手冊上。就是在那裡,我第一次見到了“本頁有意留空”這句話。

這個活幹了好幾天之後,我的上司讓我寫個簡單的Easycoder 程式。領到這個任務可真叫人激動,我還從來沒在真正的計算機上寫過程式呢。不過,我曾鑽研過Autocoder的說明書,對如何開始寫這個程式,我也有些模糊的想法。

程式要做的就是,從磁帶上讀取記錄,將舊的ID替換為新的ID。新的ID從1開始,逐個加1。然後,把更換了新ID的記錄寫到新的磁帶上。

上司給我看了一個架子,上面堆著許多紅色和藍色的打孔卡片。想象一下,你買了50張紙牌,一半是紅色的,一半是藍色的,然後把它們一張張疊起來。那些打孔卡片就是這個樣子的。總的來看它們紅藍相間,每部分顏色都包含了大概200張卡片。卡片的內容是所有程式設計師都會用到的子程式庫的原始碼。程式設計師通常會拿走堆在最上面的卡片,確認沒拿錯其他卡片,然後把卡片排在自己程式卡片的末尾。

我自己的程式寫在編碼表單上。編碼表單是紙做的巨大的矩形列表,有25行,80列。每一行對應一張卡片。程式用大寫字母和2號鉛筆填在編碼表單上。每行的最後6列,用2號鉛筆編上號。通常編號以10為基礎遞增,這樣將來還可以插入卡片。

填完編碼表單,就要交給負責打孔的人。這家公司有幾十名女員工,她們從一個大公文框中取出編碼表單,然後把這些表單“打”到打孔機上。打孔機很像打字機,不過字元是打在卡片上的,而不是紙上。

過一天,負責紙帶打孔的人會把對應的紙帶通過辦公交流信件發回給我。我那一小堆的打孔卡片,用我的編碼表單包起來,外面用橡皮筋捆上。我想看看哪些卡片有打孔問題,但沒有發現。所以我拿了一張子程式庫的卡片,附加在我的程式卡片末尾,上樓交給電腦操作員。

計算機安放在密封的房間,有鎖閉的大門,有高出地面的地板(用來走線)。我敲了門,操作員一臉嚴肅地拿走我那堆卡片,放在計算機房的另一個公文框內。等他們有空的時候,就會執行我的程式。

第二天,我拿回了自己的卡片。卡片外面裹著執行結果詳單,用另一根橡皮筋捆起來(那時候我們得用很多橡皮筋)。

我翻開結果詳單,發現編譯失敗了。詳單裡的出錯訊息我壓根看不懂,所以我去找了上司。他仔細看了看,嘰嘰咕咕地說了幾句,在上面做了個記號,然後拿起我的卡片,告訴我跟他走。

上司帶我去了打孔室,找了一臺沒人用的打孔機。他逐個糾正了程式卡片上的錯誤,又加上了一兩張卡片。他簡單地介紹自己在做什麼,但我根本來不及弄明白。

他把新的卡片帶到計算機房,然後敲了門。他對操作員說了幾句神祕的話,便跟在操作員身後進入了機房,還招手示意我跟上去。我們看著操作員開動磁帶儲存器,讀入紙帶。磁帶旋轉起來,印表機噠噠響起來,然後便結束了,程式執行正常了。

又過了一天,我的上司對我表示了感謝,告訴我以後不用來了。顯然,ASC認為他們沒時間去教一個17歲的孩子寫程式。

但是我和ASC卻沒有就此斷了關係。過了幾個月,我得到了一份全職的工作(雖然是三班倒的第二班),管理ASC的離線印表機。這些印表機以磁帶上儲存的圖片為材料,印刷垃圾郵件。我的任務是給印表機裝紙,給磁帶機裝磁帶,解決卡紙問題,除此之外,就是盯著機器執行。

那是1970年,我上不了大學,也不想上大學。越南戰爭還打得熱鬧,學校裡一片喧囂。我一直如飢似渴地學習使用COBOL、FORTRAN、PL/1、PDP-8、 IBM 360組合語言。我的想法是不去上大學,自學成材,儘自己的力量去找份程式設計的工作。

一年後我做到了。我晉升為ASC的全職程式設計師。我與兩個好朋友——Richard和Tim,我們都是19歲——一起,與同一組的另外3名程式設計師為卡車司機工會編寫實時會計系統。我用的計算機是Varian 620i。這種微機很簡單,結構類似PDP-8,區別在於它的字長為16位,而且有兩個暫存器。我們使用的語言也是彙編。 這個系統的每行程式碼都是我們自己寫的,我說的是,每一行程式碼。我們自己寫了作業系統,自己寫了中斷頭,自己寫了IO驅動器,自己寫了磁碟檔案系統,自己寫了記憶體的交換覆蓋模組,甚至自己寫了重定位的連結器,所有的應用程式都是自己寫的。我們持續工作了8個月,每週工作70到80小時,為了趕那該死的工期。當時,我的工資是每年7200美元。

系統按期交付了,之後我們便辭職了。

辭職是突然的,而且是有預謀的。要知道,所有工作都完成,順利交付了系統之後,公司才給我們漲了2%的薪水。我們感到受騙了,我們的勞動不受尊重。我們中的一些人另找了工作,徑直辭了職。

我卻選了一條不同,而且非常不幸的路。我和一個朋友衝進老闆辦公室去發洩,出來的時候還在大吵大嚷。這可真過癮——但只過了一天的癮。

第二天,我忽然發現沒有工作了。我19歲,失業,沒有學位。我面試了一些程式設計師的職位,但都表現得不夠理想。所以我在我姐夫的割草機修理鋪幹了4個月。不幸的是,我腦子裡可能缺少修理割草機的那根弦。他最後只好讓我走人了,我的感覺糟透了。

那時候我每天凌晨3點才睡覺,睡覺之前的活動是吃比薩,在我父母的老式黑白電視機上看很老的恐怖電影,雖然那些電影裡只有幾個鬼怪可看。我睡到下午1點才起來,希望逃避沉悶慘淡的白天。我在本地一所社群大學學習微積分,但是考試卻通不過。我真是個廢物。

我母親把我拉到一邊說,我的生活糟透了,只有傻瓜才會沒找好下家就辭職,才會這麼衝動辭職,才會和同事一起鬧事。她還告訴我,辭職前一定要找好下家,要非常冷靜,非常沉著,不要拉上其他人。她勸我打電話給以前的老闆求情。我母親說:你要把姿態放低。

19歲的人根本不知道什麼是放低姿態,我也不能例外。但是,現實已經撕碎了我的驕傲。最後我給老闆打了電話,而且真正把姿態放得很低。結果奏效了,老闆很高興讓我重新上班,給我6800美元的年薪,我也欣然接受。

我又在那裡工作了18個月,觀察自己的一舉一動,儘自己努力成為一名有價值的員工。我升了職,加了薪,有了穩定的收入。生活走上了正軌。我離職時沒和公司起任何衝突,同時我已經確定了更好的去處。

你可能認為我就此成熟,就這樣成為了專業人士。其實並非如此。這段經歷只是我需要學習的眾多課程的第一課。後來,我曾經因為粗心耽誤了關鍵日期被炒魷魚,因為不小心向客戶洩露機密資料幾乎被炒魷魚。我曾經領導過一個沒指望的專案,看著它垮掉,明知需要他人幫助卻無動於衷。我曾經好強地維護自己的技術決策,即便這些決策在客戶的需求面前黯然失色。我曾經僱用完全不合適的人,給我的僱主背上沉重的負擔。最糟糕的是,因為我領導無方,導致其他兩個人被開。

所以,請你把這本書看成我的錯誤大全,它記錄了我幹過的所有蠢事;也請你把這本書當成一份指引,讓它帶你繞開我曾經走過的彎路。

相關文章