論“有經驗”的工程師
上個星期跟同事一起討論什么是有經驗的工程師的問題,使我我覺得很多人對“有經驗”的定義有很大的偏差。因此我想分享我對這個問題的看法。首先看一下經驗的定義。
第一種定義,工作時間越長越有經驗。經常有人會問我這樣的問題,“我們需要找一個有五年左右工作經驗的.Net工程師,我們應該考什么樣的題目”,獵頭經常會問我:“你們需要的大約有多少年經驗的工程師”。一般人會把經驗值與工作年限畫一個等號。其實這兩者之間有一定的聯系,但兩者之間沒有一個公式,更談不上一種線性關系(工作時間越長,越有經驗)。Bob大叔有一篇文章叫"Multi-Dimension Seniority",分析了其中的道理。參見下圖:
第二種定義,知識或技能越多越有經驗。很多人熱衷于研究很多新的技術,技巧,新的工具,熱衷于考各種證書(曾經見過一個簡歷,這個Candidate在一年之內拿到了PMP, OCP, MCTS, IBM Certified Solution Designer, Microsoft Certified Business Management Solutions Specialist )。可是這只能證明這些人了解過這方面的東西,并不代表這些人能夠熟練的使用這些技術技巧解決問題。一個看過了《七天學會Pascal》的人,掌握了Pascal的基本知識,但是這并不意味著他能夠寫出好的Pascal程序。有很多的知識和技能(Knowledge & Skill)當然不是壞事,但是這不等同于有能力。一個工程師即使了解很多新的技術,也不代表他能寫出好的代碼。如果一個工程師能優雅地設計出軟件系統。寫出整潔的代碼(Clean Code),能夠設計出巧妙的架構,這代表的就是能力(Competence)。知識和技能只能算是能力的一個必要條件。歷史上有一個著名的例子,“紙上談兵”。趙括熟讀了很多兵書,應該說很有知識,而能力卻很差,結果葬送了四十萬大軍和整個趙國。
那什么樣的能力對工程師來說最重要呢?我認為有兩種
- 首先是抽象(Abstraction)能力,對于任何的問題都能通過分析系統的表現,抽象出它的本質,然后使用相應的模式去解決。設計軟件架構,說白了就是一個關于抽象的問題,設計架構其實就是要決定哪些地方需要預留擴展,因此需要抽象;哪些地方比較雷同,需要抽象出共同的模式。
- 其次是做權衡(Tradeoff)的能力,設計沒有好壞,也沒有絕對,并不使用最新的、最酷的技術就是最好的設計。大系統的設計都是受各種因素制約的(用英語說就是It depends),真正有經驗的工程師能夠根據各種項目因素做出合適的選擇。
留言列表