論“有經驗”的工程師

作者: Daniel Teng  來源: 博客園  發布時間: 2009-11-08 12:03  閱讀: 1004 次  推薦: 0   原文鏈接   [收藏]  

  上個星期跟同事一起討論什么是有經驗的工程師的問題,使我我覺得很多人對“有經驗”的定義有很大的偏差。因此我想分享我對這個問題的看法。首先看一下經驗的定義。

  第一種定義,工作時間越長越有經驗。經常有人會問我這樣的問題,“我們需要找一個有五年左右工作經驗的.Net工程師,我們應該考什么樣的題目”,獵頭經常會問我:“你們需要的大約有多少年經驗的工程師”。一般人會把經驗值與工作年限畫一個等號。其實這兩者之間有一定的聯系,但兩者之間沒有一個公式,更談不上一種線性關系(工作時間越長,越有經驗)。Bob大叔有一篇文章叫"Multi-Dimension Seniority",分析了其中的道理。參見下圖:

  就像一般人一樣,在Sam剛剛開始工作時期,由于基本上是一張白紙,需要學習基本的技能,因此這一個階段是一個不斷學習的階段,在這期間他的經驗值是在不斷增長的。但是隨著他能夠承擔一部分任務,他用在學習的上的時間開始變少,因此從這個階段盡管經驗還在增長,但是增長速度要比前一階段慢很多,因此他一直都只能在“學徒”(Apprentice) 層次。很明顯他的經驗值,資深程度跟他的工作年限沒有很大的關系。
Jasmine就不同了,她沒有停止學習,不停地實踐,因此她的經驗隨著時間不斷增長,最終達到“大師”(Master)層次。Jasmine的經驗是隨著工作年限增長而不斷豐富的。但是這種人在現實中是極少數,而且是需要環境的。
 

  第二種定義,知識或技能越多越有經驗。很多人熱衷于研究很多新的技術,技巧,新的工具,熱衷于考各種證書(曾經見過一個簡歷,這個Candidate在一年之內拿到了PMP, OCP, MCTS, IBM Certified Solution Designer, Microsoft Certified Business Management Solutions Specialist )。可是這只能證明這些人了解過這方面的東西,并不代表這些人能夠熟練的使用這些技術技巧解決問題。一個看過了《七天學會Pascal》的人,掌握了Pascal的基本知識,但是這并不意味著他能夠寫出好的Pascal程序。有很多的知識和技能(Knowledge & Skill)當然不是壞事,但是這不等同于有能力。一個工程師即使了解很多新的技術,也不代表他能寫出好的代碼。如果一個工程師能優雅地設計出軟件系統。寫出整潔的代碼(Clean Code),能夠設計出巧妙的架構,這代表的就是能力(Competence)。知識和技能只能算是能力的一個必要條件。歷史上有一個著名的例子,“紙上談兵”。趙括熟讀了很多兵書,應該說很有知識,而能力卻很差,結果葬送了四十萬大軍和整個趙國。

  因此應該轉換觀念,不僅僅以工作時間長短或者了解多少技術、技能來衡量水平高低。我們真正應該關注的是能力(Competence),也就是在實際工作中,通過靈活運用掌握的技術、技巧來解決實際問題的能力。顯然,能力高低比知識的多少要難衡量得多。能力絕對不是可以通過考試衡量出來的。現在市場上充斥著各種各樣的證書,其實絕大多數都是衡量知識,跟能力沒有太大的關系。衡量能力需要通過一種客觀的社會評價體系。其實就是需要類似于學術界的“科學引文索引SCI”的系統,一篇論文質量的高低,取決于該論文被引用的次數,引用次數越多說明論文越有價值,當然也就客觀地反映了作者的能力。對于軟件領域,也有一些類似的客觀標準,比如:所貢獻的開源軟件的下載次數,被使用的次數;出版的有影響力的書籍、論文、博客文章;在社區中的口碑等等。Google也是利用這種類似的系統來對關鍵詞的相似度進行排名,還有一個簡單的例子就是博客園的“我推薦”。其實還有一些是衡量能力的證書,比如Certified Scrum Master其實是一個衡量知識的證書,但是Certified Scrum Practitioner就是一個衡量能力的證書。

  那什么樣的能力對工程師來說最重要呢?我認為有兩種
  • 首先是抽象(Abstraction)能力,對于任何的問題都能通過分析系統的表現,抽象出它的本質,然后使用相應的模式去解決。設計軟件架構,說白了就是一個關于抽象的問題,設計架構其實就是要決定哪些地方需要預留擴展,因此需要抽象;哪些地方比較雷同,需要抽象出共同的模式。
  • 其次是做權衡(Tradeoff)的能力,設計沒有好壞,也沒有絕對,并不使用最新的、最酷的技術就是最好的設計。大系統的設計都是受各種因素制約的(用英語說就是It depends),真正有經驗的工程師能夠根據各種項目因素做出合適的選擇。
  培養這兩種能力的方法很簡單,就是多學多練。通過不斷的學習,擴充自己的知識面,掌握更多的模式,從而能夠在實際工作中用合適的工具、方法、模式去解決問題;其次就要通過不斷實踐學到的東西。這其實就是一個理論->實踐->理論不斷反復的過程。
0
0
 
標簽:程序人生
 
 

文章列表

arrow
arrow
    全站熱搜

    大師兄 發表在 痞客邦 留言(0) 人氣()