我們根據職場發展通路和能力水平,把程序員分成如下四個等級:
普通開發者
熟練開發者、高級開發工程師、技術組長
技術專家、架構師、壹線經理
科學家、首席(資深)架構師、部門研發總監
今天這篇文章,我們來討論普通開發者如何進階為熟練開發者。
我們會先定義普通開發者應該達到的能力水平,然後再介紹他應該在哪方面提升才可能進到下壹個階段。
普通開發者的能力水平
先看我經常提到的壹張圖——技術成長階段圖:
普通開發者處在第壹個成長階段:專項能力提升。
專項能力提升階段是初級階段,妳為了搞定事情,必須先具備某些基礎能力,比如某種編程語言(Java / C++/ Python / JavaScript 等)、某個IDE (Visual Studio / Qt Creator / Android Studio / Eclipse / WebStorm 等)、某種技術框架(Netty / Qt / SSH / MyBatis / AngularJS 等)。
這個階段最重要的就是提升專項能力,讓自己能夠迅速搞定壹些別人安排給妳的事情,體現出妳的價值。
在這個階段,最起碼達到下列水準:
能理解並完成別人分解好的葉子任務
能自己完成壹個功能模塊的開發
以前端開發者為例,在這個階段,妳必須能將從 UI 過來的某個頁面原型轉換為可運行、可操作的真實 Web 頁面。比如登錄頁面、比如商品詳情展示頁面,要能做到實現可視化頁面和業務邏輯跳轉。
以 Android App 開發者為例,在這個階段,妳必須能搞定類似登錄、支付等這類功能。以 App 的登錄功能為例,妳要能使用特定的布局和組件實現自適應的登錄界面,還要能學習使用類似微信、微博等第三方賬戶的 SDK ,實現第三方賬戶登錄。
妳可能很難自己設計壹套完整的登錄功能(包含口令加密、單點登錄、Cookie 使用、驗證碼、密碼找回、第三方登錄、多終端同步、角色鑒權、用戶數據存儲等),但是當熟練開發者或者高級開發者完成了設計,把某個小功能分配給妳的時候,妳要能夠理解這個設計,並將這個設計實現出來,和整個登錄系統整合在壹起,能夠正常運轉。
當妳能夠搞定這些事情的時候,妳的專項技術水平起碼是這樣的:
能熟練搭建需要的開發和測試環境
熟悉所用編程語言的基礎語法,有這門語言的知識地圖,熟悉該語言本身的各種基礎功能,了解這門語言的高級功能
能調用已有技術框架的 API 來實現特定功能
能在實現同壹功能的多組 API 之間選擇合適的那壹組
能熟練使用開發環境和各種輔助工具進行調試
可以解決易復現的、邏輯簡單的軟件 Bug
能自主學習某個新框架的基礎 API ,參考 DEMO 完成某個功能的基本實現
我的總結可能不完善或存在 Bug ,請大家在留言區指正、補充。
我想到壹個身邊的例子,剛好和我們討論的這個話題契合。
有壹次和朋友 G 聊天,他說他部門有位做前端開發的程序員 X ,壹直在用 jQuery 實現各種頁面,代碼冗余,結構淩亂。Vue.js 出來後,G 想在新版本中使用,就安排 X 學習 Vue.js ,讓他參考公司產品某兩個頁面的功能和布局,簡化設計,做兩個帶異步數據請求功能的頁面出來看看效果,結果壹個星期過後,X 告訴 G ,Vue.js 太復雜,開發文檔看不明白,代碼也搞不懂,進行不下去……
如果妳像 X 這樣的狀態,就說明妳還停留在普通開發者階段,只能在他人指導和安排下編碼實現特定的細分功能。
要想進階,就要先在專項技術能力上達到我們前面所列清單描述的水平(那是基礎要求),然後再對照熟練開發者的能力要求,有針對性的去學習提高,穩步進入下個階段。
普通和熟練的關鍵區別
對照前面的技術成長階段圖,熟練開發者處在中間階段,擁有自己的技能體系。
為了搞明白擁有自己的技能體系是什麽概念,我們先來看兩組概念:
知識、知識體系
技能、技能體系
簡單說,知識是能引發改變的信息,技能是運用知識解決問題的壹系列思維和動作的組合。但這樣講不大容易明白,我們舉個軟件開發領域的例子。 C++中的虛函數是壹個知識點,用虛函數這個特性定義模塊接口,實現模塊的動態加載,就是技能。
接下來為了行文方便,我不再區分知識和技能,直接把知識等同於技能,甚至用知識壹詞代替技能。請在閱讀時根據上下文加以區分。
知識和知識體系的關系,技能和技能體系的關系,就像樹木和森林的關系,就像瑞士軍刀上小刀、小剪子、小螺絲刀和瑞士軍刀的關系。
這樣打個比方,應該可以體會到“體系”是什麽了。
所謂知識體系,就是若幹相互聯系的、可以用來解決特定場景問題的知識的組合。
Ok,現在回頭來看普通開發者和熟練開發者的區別,就簡單多了。
普通開發者因為不斷完成任務,不斷做項目,接觸、使用了各種各樣的“知識點”,於是擁有了各種離散的知識,但這個知識和那個知識很少關聯,他擁有的知識,是散兵遊勇,如下圖所示:
當妳的知識點各不關聯時,妳在遇到問題時,就很難進行系統思考,就很難獲得解決辦法。
而熟練開發者,則(被動或主動)經歷了知識點的梳理、整合過程,把零散的知識點圍繞著某個應用場景聯系起來,形成了知識體系。就像下圖:
當妳有了知識體系之後,遇到和妳知識體系對應的場景相關的問題,就可以快速找到相關的知識,系統的分析問題,最終解決問題。
妳看,是否擁有知識體系,導致了熟練開發者和普通開發者的壹個非常重要的區別:熟練開發者能夠獨立負責壹個模塊或子系統的設計和開發工作,擁有分析問題、解決問題的能力和任務分解的能力,可以分配任務給普通開發者。
進階修煉方向
好啦,從技術水平的角度講,普通開發者和熟練開發者的區別就在於:普通開發者的知識不成體系,而熟練開發者構建了與某個應用場景相關的知識體系。
這樣看來,普通開發者要想進階,方向就非常明確了:構建自己的知識體系。
那麽,怎麽構建知識體系呢?先參考我的另壹篇文章:構建知識圖譜,讓自己更值錢。如果後續有機會,我會重構壹篇新的文章,再聊聊構建知識體系這個話題。