一個優秀的程式設計師如何能練就成一個卓越的程式設計師?
先等等,暫時不談卓越,先談談如何成為一個優秀的程式設計師。
從第一步到第N步並沒有明確的路線圖。事實上,第N步到底是什麼還不確定。就像邏輯型思維的開發者一樣,缺乏明確的目標會讓從入門到精通的道路變得異常崎嶇。
過去的幾年中,我花了不少時間來思索這個問題。我該如何從一名能力尚可的程式設計師修煉成一個真正優秀的程式設計師呢?
成功是什麼?
當我對成功有清晰的目標、量化的標準的時候,我就能發揮我的最大潛力。比如,我想實現5分鐘跑完一英里這個目標。好吧。這個路程很容易測量,成功的界限分明。我很容易知道跑一英里需要多久,網上也到處都是提高跑步速度的建議和訓練計劃。我可以選擇一個計劃並付諸努力,我深信我最終能夠實現目標。這是一個神奇的可量化的計劃,因此,每個星期我都可以檢測到距離我的終極目標還有多遠。
但是如何界定你是否成為了“足夠優秀的程式設計師”呢?一言蔽之,難以界定。這個目標從一開始就太主觀,太模糊,太簡單,無法量化。那麼我們能找到能量化的東西嗎?
我們都有過一些提高我們技能的經驗。我們可能曾經學過一門開啟我們思路的新語言。我們也可能曾經有過一套完美的設計方案,但直到最終投入生產時才發現它漏洞百出,但我們因此而成長。有一些經驗增長你的技能,有一些讓你遇見反模式(注:反模式是指軟體開發中經常被用到的但效率不高的模式。),並讓你認知它們為什麼是反模式。正是這些經驗給你上了課,影響了你的思維模式,改變了你解決問題的方法,最終改善了你的設計。而你是否獲得了某種經驗,這是顯而易見的。把經驗當做是我們的收穫或許很有趣。
所以,雖然這需要付出時間,但我現在學會了適應成為“一個真正優秀的程式設計師”這一目標的不可量化性。如果一個程式設計師依靠經驗取得了某些進展,那麼我們就能有一個清晰的路線圖來實現“成為真正優秀的程式設計師”這一終極目標。我想這個路線圖應該是這樣的:
- 1.確定哪些技能能夠幫助程式設計師進步
- 2.著重積累某一個技能的經驗
- 3.直到這個技能完全掌握(成功攻關!)
- 4.反覆思考這個技能,直到融會貫通[A]
- 5.重新回到第二步,選擇一項新的技能
如何更好的開始第一步呢?下面列出了一些程式設計目標,我粗略的分了一下類。我會在本文的結尾和你一起討論下想法。
[B]程式設計目標
學習不同的程式語言範例
- 用匯編語言寫一個應用
- 用函式式語言寫一個應用
- 用面嚮物件語言寫一個應用
- 用基於原型的語言寫一個應用
- 用邏輯程式語言寫一個應用
- 用Actor模型寫一個應用
- 用Forth語言寫一個應用[C]
擴寬對我們開發時使用的基本元件的瞭解:
- 寫一個網路客戶端(如HTTP, FTP客戶端)
- 寫一個裝置驅動程式
- 寫一個B叉樹資料庫
- 改進一個現有的庫包,來獲得更好的使用者體驗
- 寫一個提供外掛模型的應用或框架
- 寫一個測試框架
- 寫一個程式語言
更上一層樓:不斷的練習,積累
- 完成五個code katas (Kata是來自日本武術的概念,通過不斷的重複和練習來提高技藝)
- 用Koan程式設計來學習一種你想學的語言
- 參加程式設計進修課程
- 閱讀SICP,完成所有的練習
編寫程式並開源:
- 為開源專案貢獻力量
- 讓別人接受你的補丁
- 獲得一個重要的開源專案的提交許可權
- 釋出一個開源專案
- 優化一個開源專案的程式碼,詳細記錄並分享出來
通過教導別人來提高自己[D]
- 做一個繪聲繪色的演講
- 在一個本地使用者組面前演講
- 在一個會議上演講
- 開設一個訓練課程
- 釋出一個教程
- 釋出一個開源專案的有建設性程式碼稽核
- 寫一本有關程式設計的書
關於這些目標
現在讓我們來多說一點。注意這些目標都是可量化的。每一個都有個布林值:你要麼完成了,要麼沒有。例如,雖然很難界定你是否掌握了一門函式式語言,但是非常容易確定你是否用函式式語言寫了一個應用。後者是可觀測的,可量化的,布林值。以上所有的目標都具有這一特性──可量化性。
無可否認,這個可量化性並非無懈可擊。就拿在一個會議上進行演講來說,你當然可以做一個很爛的演講,然後還可以拍拍胸脯說你實現了這個目標。不過既然你是我這篇部落格的讀者,我假設你想成為一個優秀的程式設計師,你是一個對自身要求很高的人,不會是僅僅完成了某個任務就沾沾自喜的人。
既然我們在討論改善,那麼你對這份列表有什麼改進意見呢?
這個列表作為GitHub的有效依據,你們可以隨意fork並新增更多的成績。(確保它們是可量化的。)
或者fork之後,你可以劃分出你已經取得的成績。你還可以為你正在努力的目標做上標記。(可以參考Justin Blake, Pierre Chapuis, Yann Esposito的分支)
你也可以寫評論,什麼經驗讓你變得更為優秀,以及你希望下一步實現什麼目標。
註釋
[A]不得不強調下第四步。想要更出色的實現目標,你必須在你進行下一步之前停下來回想一下,問問自己到底學到了什麼。花些時間寫下些想法,更好的做法是,和他人分享,與其他完成同樣任務的人作個對比,看看你的學習效果。
在coderwall.com這個網站,你可以更詳細瞭解以目標為驅動的學習方法。
[C]Forth本身就是一個語言範例。
[D]我想起Paulo Freire 的一句名言:“傳授知識本身就是在學習傳授知識的藝術…”
英文原文:Programming Achievements: How to Level Up as a Developer,編譯:伯樂線上-唐小娟