在我整個職業生涯,能有幸與一群非常出色的人一起工作、學習、解決一些技術性難題,建立了幾家很成功的公司。近期,我和工程團隊交流我在這個專案中學到的知識。這次交流產生了我的個人工程法則。這不是『規則』或者『工程師指導路線』,它僅僅是一些我們寫程式碼的時候需要注意的準則。
保持懷疑
這由我個人經歷得出,因為我是通過自學成為程式設計師的,我從不相信計算機。我從不相信我剛剛啟動的作業系統。我修復的bug那才是真正被修復了。除過測試程式碼以外,所有程式碼的執行方式都如我想象的那樣。我不相信任何事情,即使是我自己。我不相信我已經搞明白了,直至多次核實。我與懷疑為友,它也應該成為你的朋友。經常去尋找一種方法去測試你的假設,或者再次核查你是否遺漏了什麼。這些環節在大多數情況下是不需要的。但有的時候它真的很重要。
不要欺騙計算機
換句話說是“避免抽象漏洞”,不要以系統沒有明確指出的方法來使用系統,不要指望那樣的行為所帶來的作用。不要做哪些對於下一個使用者不明確的事情,因為這個系統不是為他們設計的或者他們沒有說明文件。如果使用者量超過當前使用者三個數量級,你也許應該重新構思你的設計。如果合同暗示但是並沒有保證能使用,你應該調整元件與合同保持一致。計算機是一個討厭的傢伙。當你欺騙它的時候,最後它總會反咬一口。
保持簡潔
我喜歡擴充套件問題和解決問題,這正是我們正在做的事。但是許多時間,僅僅是因為我們能看見了一個能被解決的問題,並不意味著它目前值的被解決。我經常把自己看做一個相當愚蠢的程式設計師-我喜歡簡潔、容易被理解的設計。這是一個極大的挑戰-任何人都能用複雜的方法解決問題,但是隻有優秀的程式設計師才能用簡單、容易理解的方法解決問題。透徹思考一個問題然後使用簡單、穩妥的方法解決去解決它。讓你自己理解是最重要的事情。編碼的大多數時間是用在維護,而不是創造。
優化的第一條準則:不要優化
這出自約翰·本特利的《程式設計珠璣》(它能幫助你學會像一個有經驗的程式設計師一樣思考,它也許是一本古老的書,但是大多數內容在今天仍然出奇地適用) 。優化能夠表現在許多方面:速度、適用於未來、潛在規模、可能的使用者等。問題是大多數優化的效果最終並沒有被用到,對優化或多或少的定義,讓設計變得更加複雜。所以,優化的第一準則是不要優化,直到你完全清晰地理解了一個問題。(他的第二條規則是,不要優化。意思是,即使你知道如何優化也不要優化,直到你真正需要優化的時候)
不要僅僅是修復特定的bug,消除掉所有再次發生的可能性
不要為你犯下的錯誤表示抱歉,要表示憤怒,保證它不會再一次讓出現。我討厭bug,我討厭讓我製造出bug的系統。我討厭我自己的軟體有bug,我討厭創造出本可以避免的bug。我真的很討厭修復同樣的bug兩次,所以每當我修復完一個bug,我會思考下面這些問題:現在這個bug可能會發生在哪裡?將來它會發生在哪裡?是什麼導致了這樣類似的bug。我如何才能一次性消除掉所有的bug?現在可不可以一併修復?
不斷假設
因為我在我的創業公司花費了大量時間,我養成了常常自我提問的習慣,“我為什麼要做這個,它能解決什麼問題?有沒有什麼更重要的事情我能做?”。任何時候你都應該有這樣的態度。不斷追問給自己的假設。你解決的真正問題是什麼?有沒有人請求你解決表象問題而不是問題的根源?這個解決方案完備嗎?過於完備嗎?值得這麼做嗎?
做長遠的構思,慢下來,往往會更快
這也許是最重要的一個。這是很容易理解的,作為一個工程師,我們喜歡高效率。我們喜歡盡我們所能去創造更多的東西。但是如果我們不從長遠考慮,最後的任何進展都會變得越來越困難。有時候我們在不明白真相的時候編寫程式,之後我們不得不返回來重做。有時候我們的解決方案很容易解決當前的問題,但是對於更大的問題卻無能為力。有時候我們趕進度沒完成整個設計,這導致後來花費更多的時間來修復之前不完善的設計。有時候我們懶得使用正確的方式去寫程式碼,或者僅僅是拷貝或竊取一些程式碼,因為趕時間或者我們不想把問題思考透徹。我見過太多這樣的事情。關於這個問題已經有了其他更好的解釋了。但是我要重複的是-我們的目標是逐漸開發出更多好的特性,有更多的使用者量。這個曲線每天不會增加很多,但是不管我們每天做了多少,與之前的工作聯絡在一起。放眼長遠。
關心你的程式碼
我猜這個不需要過多的解釋,但是我還是時常看見人們忽視它。為你的工作自豪,關心你寫下的程式碼!當我準備偷懶的時候,我常常想象:在未來某天,我要去處理我的爛程式碼。你也不需要太過極端-我曾經在谷歌開玩笑,工程師像寵物一樣對待他們的程式碼。在哪裡我更像是一個農場主 – 務實,沒有感情。但即使這樣,我也經常討厭我的那些設計不夠優秀的程式碼,它們工作的不夠好,可讀性差。
廉價、快速、正確 — 挑選兩個
這是軟體行業的鐵三角。這是世界上所有軟體工程師的工作方式。但是它不是一個自滿的理由。事實上,這是你每日面對的敵人。好的軟體與優秀的軟體的不同點在於如何權衡這個鐵三角。常常,真正好的軟體想辦法在這三者中都佔一點點。試著成為這樣的程式設計師- 你能否找到一種更加優雅的設計,它執行快速而且依然保持正確性?你能否放鬆一些要求以快速達到目標?你也許並總是能做到。事實上,你不應破壞這個三角。但是如果別無選擇,確保你明白你選擇了哪方面的妥協,為什麼這樣選擇,以及是不是目前最好的選擇。
總結:保持好奇。任何時候儘可能學習更多
好了,這一個是比什麼都重要職業建議。作為一個工程師如果你沒有好奇心,不真正的關心、學習的新知識。不關心新的科技或新的語言、思想,那麼你為什麼在這個行業?絕不是我的完美原則,或者純粹的思維/表現像一個成功的工程師,但我敢打賭可能有相當數量的想法與其他人一致。我很想聽聽你的想法。