一個優秀開發者如何才能變得偉大?
還是先不想如何變得偉大:一個不錯的開發者如何變成一個優秀的開發者?
從第一步到第N步并沒有确定的路徑,哎呀,甚至不知道第N步是什麼. 能邏輯思考的都明白,缺乏一個确定的路線意味着,想從新手到大師,将會是一個艱辛的旅程。在過去幾年間,我還是花了相當一些時間,反複思考這一個難題。接下來是什麼?我該如何做才能從一個優秀的開發者成為一個相當優秀的開發者?
成功到底是什麼樣子的?
當我有一個清晰的目标以及一個可以衡量的成功标準的時候,我做的最好。比如,我想5分鐘跑一英裡,這很好衡量,而且成功是明确定義了的。我知道現在我一英裡我可以跑多快,而且網上到處都是如何跑快的建議和訓練項目。我可以選擇一種訓練項目,努力訓練,我非常自信最後能夠達到我所期待的目标。而且這個非常容易被衡量,每一周我都可以知道我距離自己的終極目标還有多少.
但是,你如何去衡量自己是否達到了一個“相當優秀的開發者”這樣一個級别呢?簡單得講,你不能夠。這個目标,如上所述,非常的主觀,非常的寬泛,簡直是無法衡量的。是以,我們該如何定義一個可以衡量的東西?
和想5分鐘跑一英裡差不多,我們可以從對比現在作為程式員的自己和所期望能成為的程式員來入手。五分鐘一英裡的賽跑者有而十分鐘一英裡的賽跑者缺乏的經曆是什麼?讓大師級程式員獲益而新手程式員缺乏的經曆是什麼?這裡關鍵的是經曆。
我們都曾有過某種特定的經曆提升了我們作為程式員的技能。我們曾學習過一種新的語言,而讓我們有一種新的思維方式。或者,我們都曾精雕細琢過完美的設計,隻是為了觀察其在苛刻的現實環境下暴露出的缺陷. 我們是以變成更好的程式員。是以,有些經曆給了你新的技術。而有些則是不同的模式,并且能夠讓你了解為什麼會這樣。正是這些經曆在教你,影響你的思維過程,,影響你解決問題的方法,改進你的設計。友善的是,你是否有過某種特定的經曆是很容易被衡量的。(如果把這些經曆想成是成就就很有意思啦。)
雖然花了些時間,但是我已經對我那不可衡量懸而未絕的目标,達到“相當優秀的開發者”的級别,感到不煩惱了。如果一個開發者能夠以他的經曆來區分,也許我們已經有了一個明确定義的路徑朝向“相當優秀的開發者”這麼一個大方向了。我揣測這麼一條路徑,應該是這樣子的:
1、标志着從一個普通人成長成程式員的經曆
2、選擇某種經曆去追求
3、追去的經曆完成了。(成就解鎖了!)
4、經曆的反思,深入的思考。[A]
5、傳回第2步,這次是選擇一個新的經曆。
如何以一種更好方式開始第一步,而不是衆包給各位。這裡我給出了一部分程式設計的成就,松散的分了組。[B]我會在文末為你提供多種方式,讓你來創造你自己的想法。
成就
學習多種程式設計範式:
用彙編語言寫一個程式
用函數式程式設計語言寫一個應用
用面向對象語言寫一個應用
用基于原型的語言寫一個應用
用邏輯程式設計語言寫一個應用
用Actor模型寫一個應用
用Forth語言寫一個應用[C]
體驗不同平台上程式設計的來龍去脈:
寫過一個普通的Web應用
寫過一個普通的桌面應用
寫過一個普通的手機應用
寫過一個普通的嵌入式應用
寫過一個實時系統
增強你對開發人員所常用的子產品的了解:
寫過一個網絡用戶端(HTTP, FTP等)
寫過一個裝置驅動
寫過一個B-tree資料庫
包裝現有的一個庫,以提供更好(更愉快)的使用者體驗
編寫一個應用程式或架構,提供插件模型
寫過測試架構
寫過程式設計語言
讓自己知道koans, katas, 以及歲月的智慧:
完成過五個code katas
對你想學習的一個語言,完成programming koans
參加一次 coderetreat
閱讀 SICP 并完成所有練習
開源程式設計:
為一個開源項目共享代碼
更新檔被接受
在一個重要的開源項目中得到送出權限
釋出一個開源項目
對一個開源項目實施Refactotum
通過教授别人來學習[D]:
發表一次啟迪性的講話
在一個本地使用者組中演講
在一個會議中演講
教授一次教育訓練課程
釋出一個教程
釋出一個開源項目的constructive code review
寫一本程式設計的書
關于成就
現在,讓我們來繼續探讨一會兒。注意每一個成就都是可以衡量的。每一個都是一個布爾值:你完成或者沒有完成。例如,很難衡量你是否學過一個函數式程式設計語言,但是卻可以輕易的知道你是否用函數式程式設計語言寫過一個程式。後者是客觀察、可測量、布爾的。這種可衡量性意圖适用所有這些成就。
需要承認的是,這種可衡量性并不完美。比如在一個會議演講這個成就:你完全可以做到一般稱職的時候就說你赢得了這份成就。但是如果你正在讀這篇文字,我假設你是想要變得卓越。你知道隻是為了把一項從清單中劃掉而号稱做到是非常遜的。
既然我們談到了改進
既然我們談到了改進,你會如何改進這個清單呢?
這個清單現在在github上作為一個gist,你可以任意的fork它然後添加更多的成就(確定你加的成就是可以衡量的)。或者fork它然後标記那些你已經征服了的成就。你還可以标記你正在做的一項,(例如,你可以去看看這些forks :Justin Blake, Pierre Chapuis, Yann Esposito. )
或者發表評論:什麼經曆将你塑造成一個更好的開發者?以及你會接下來去解鎖哪一個成就?
注釋
[A] 我無法充分的強調第4步。為了獲得幾乎每個成就,你應該停頓和反思這些經曆,然後再移動到下一個。反思。問問自己,你學到什麼,花些時間來寫下這些想法。更好的是,與别人分享,并且對比其他人也已經獲得這一成就的人,看看你的學習收獲的如何。
[B] 可以去 coderwall.com看看基于成就的模型這些方面的,很有意思。.
[C] Forth基本上是自己的範式
[D] 突然想到了這句: “寓學于教” — Paulo Freire