20年前,最好的程式設計師是那些能夠把整個程式裝配進一個64Kb的.COM檔案裡的人。那些對Intel 80386掌握最多的人在程式設計中是偶像般的存在。
那是因為在20年前的計算機昂貴了而程式設計師廉價。那是黑客情懷的時代。那個時代已經過去了。那種情懷現在已經不被讚賞了,因為市場狀況已經完全相反了。
現在,計算機變得便宜而程式設計師變得昂貴了。當下的時代是設計師情懷的時代,如今我們程式碼的可讀性比程式碼的效能更為重要。
Hacker and designer mentality
視訊地址:https://www.youtube.com/watch?v=qdqcayTLlLk
硬體價格 vs 工資
看這個圖表。這是最近20年來(1994-2014)兩者的對比趨勢圖。第一種曲線呈現下降的趨勢並表明了計算機記憶體和硬碟儲存器在近20年來變得很便宜。
第二種曲線趨勢演示了在同一時期軟體開發者工資上漲了多少。精確點來說,大概是第一種的三倍。我沒有找到一個關於這兩者對比的正式報告,但是可以肯定程式設計師的工資還會增長,這對任何人來說已經不是什麼祕密了。對於高階開發者來說,年薪200,000美元不再只是個夢想。然而在20年前,在周圍的人中,年薪60K美元已經是最好的報酬了。我發現一篇關於這個話題的非常有趣的文章。
基本上,這意味著在1994年為了開發一個PHP網站,我們不得不花費比現在(2014年)1000倍更多的資金在硬體方面和比現在(2014年)3倍更少的工資給開發者。然而我們還是在這討論一樣的堆疊技術。使用一樣配有Apache Http伺服器的Linux機器。
不同之處,在1994年,如果我們的應用因為硬體資源限制出現了效能問題,我們每次新增1G的額外記憶體需要支付35,000美元,而在2014年,我們只需要支付10美元.
在1994年,相對於購買新的硬體,去聘用更多的程式設計師並要求他們去優化程式碼或者重構程式碼的收益更大。在2014年,實際上情況恰恰相反。現在,花錢去把伺服器的規模擴大兩倍比花錢聘用程式設計師來優化軟體更便宜。(特別是當伺服器是虛擬雲伺服器時)
在1994年最好的工程師擁有“黑客情懷”,而在2014年“設計師情懷”更受歡迎。
黑客情懷
擁有黑客情懷的人會認為這個輸出斐波那契數列的Java方法是一段“優雅的程式碼”(你嗎?):
1 2 3 4 |
public int f(int n) { return n>2?f(n-1)+f(n-2):1; } |
我列出了一個優秀黑客應有的品質:
- 能夠使用一種語言中所有的別人知道(和不知道的)特性。
- 能辨別其他人是黑客還是新手還是黑客寫手
- 對規則和標準會感到無聊和厭倦。
- 不寫單元測試-資歷少時會寫
- 享受挑戰–他能在那展現它的才華。
- 喜歡討論多於寫文件,因為他們覺得這樣更有趣
- 討厭別人修改他的程式碼。
- 喜歡馬上投入一個專案裡。
黑客是一個有才華的人。他想在他編寫的軟體裡展現他的才華。他享受程式設計並且寫程式碼主要是為了好玩。我可以這麼說,他已經和他的程式碼結為伴侶了並且在與程式碼離婚後他無法想象以後的幸福生活。程式碼所有權是黑客所關心的東西–他知道他自己是程式碼的所有者。
當我問我任意的一個黑客朋友時,“其他人怎樣才能理解這段程式碼的是幹什麼的?”。我幾乎總是得到同樣的答案-“他們要問我!”(通常是帶著真誠的微笑自豪地說)
設計師情懷
擁有設計師情懷的人會重構上面的程式碼使它便於閱讀。他會認為這個Java函式是一段“優雅的程式碼”(你覺得呢?):
1 2 3 4 5 6 7 8 9 |
public int fibo(final int pos) { final int num; if (pos > 2) { num = fibo(pos - 1) + fibo(pos - 2); } else { num = 1; } return num; } |
我認為這些品質是一個好的設計師所擁有的:
- 傾向於使用傳統的程式設計技術
- 假定任何人都是新手並循規蹈矩地寫程式碼
- 喜歡設定一些規則並遵循它們
- 喜歡寫文件多於直接討論並且喜歡文件自動生成多於手寫
- 把更多的編碼時間花費在單元測試上
- 討厭挑戰和加班工作
- 喜歡看到它的程式碼被修改和重構
- 同時進行比較少的專案工作
設計師是一個優秀的團隊角色。他對團隊的發展,標準,規則,教育和紀律的貢獻跟他對原始碼的貢獻一樣多。他總是能確保一旦他離開專案他的程式碼和想法依然保留下來並執行。
對一個好的設計師來說,最滿意的是能夠看到它的程式碼擁有它自己的人生–被修改,被優化,被重構和最終退休。設計師把他自己看做是程式碼的父母-一旦它足夠年大去走路和說話,它不得不去過自己的生活。
未來
如果你認為你自己是一個黑客,我相信這是做出改變的時候了。黑客的時代已經成為過去了。
在不久的將來,我們可能甚至不用考慮硬體問題並且在擁有無限大記憶體,CPU頻率和儲存空間的彈性計算平臺上執行我們的應用程式。我們僅僅需要為資源使用和絕大多數效能問題付費,這僅僅是在我們每個月的賬單裡新增小額的額外費用。我們將不會關心任何的優化問題。
同時,優秀的工程師將會變得越來越昂貴,僅僅去檢查下軟體並診斷,一個小時要收費500多美元。這就像優秀的律師和牙醫。
這就是為什麼,當開發一個新軟體產品時,那些付錢的客戶更關心的是它的可維護性。專案贊助人明白他們獲取利潤的最好解決方案是需要一個可讀性、維護性和自動化最高的專案。