學習和使用技術的四種層次

lucida發表於2014-05-06

 關於

  Bjarne Stroustrup在他的新書《A tour of C++

  裡面舉了一個旅行的例子來比喻初學程式語言:

…as an analogy, think of a short sightseeing tour of a city, such as Copenhagen or New York. In just a few hours, you are given a quick peek at the major attractions, told a few background stories, and usually given some suggestions what to see next…

…you do not know the city after such a tour. You do not understand all you have seen and heard. You do not know how to navigate the formal and informal rules that govern life in the city…

…to really know a city, you have to live in it, often for years.

  簡而言之,程式語言是City,而開發者則是Traveller——這是一個很有意思的比喻,在這篇文章裡,我試圖延續這個類比(Analogy)——把這個類比放大到初學,掌握,瞭解以至精通一門技術的層面。

  不過需要注意:我自己並沒有精通哪一門技術——所以這篇文章的內容是值得懷疑(susceptible)的,但它可以作為一個不錯的參考。

 0. Stranger(陌生人)

  使用一項技術最初的層次就是聽說過沒用過——就像我們之中的大多數人都聽過南極,聽過北極,知道南極有企鵝,北極有北極熊,但是卻從來沒有去過南極或北極。

  Stranger具有以下的特徵:

  • 知道這項技術的名字。
  • 知道這項技術的一些術語。
  • 知道這項技術的一些關鍵人物的名字。
  • 瞭解少量技術的細節,但沒有使用這項技術的實際經驗。

  以我本人和RoR來打個比方:

  • 知道RoR是Ruby on Rails。
  • 知道Rails,Gem和Rake的存在。
  • 知道DHH也知道松本行弘。
  • 看過The Ruby Programming Language,還使用一個基於RoR的部落格框架Octopress寫部落格。
  • 但從來沒有使用RoR去搭建網站。

  所以我是一個RoR的Stranger。

  對於新技術,絕大多數人都是Stranger——但是就我對國內技術社群的觀察,相當數量的Stranger意識不到自己還是Stranger——認為知道一點術語一些人名就算了解一門技術,甚至把它寫在簡歷上(Familiar with XXX)或是開始與別人進行討論(當然都是毫無意義的討論)。

 1. Tourist(旅行者)

  當開發者真正開始用一項技術作出了可以用的東西:

  • 面向使用者的產品(End-User-Oriented Product),比如一個手機應用,或是一個瀏覽器外掛。
  • 或是面向程式設計師的工具(Programmer-Oriented Tools),比如一個頁面抓取框架,或一個簡單的Parser Generator。
  • 注意教科書範例(Textbook examples)和Hello world不屬於可以用的東西——這些只是Dead Code——被執行一兩次,然後被遺忘。

  這時這個開發者就進入到了Tourist階段:

  • 瞭解這項技術的基本元素。
  • 使用這項技術做出了實用的產品或工具。
  • 瞭解對這項技術的部分細節。

  根據的學習目的的不同,Tourist又可以分為Salesman和Sightseer。

  1.1. Salesman(旅行商)

  Salesman是具有明確目的的Tourist——他們學習技術的目標是為了完成某一項業務,就像旅行商去某地出差是為了賣商品而非觀光一樣。

  絕大多數職業開發者在開發生涯中都會扮演Salesman這個角色——接到一個任務,涉及到某項不熟悉的技術,需要在限定時間內完成。

  1.2. Sightseer(觀光者)

  和Salesman相反,Sightseer學習技術的目標是為了擴充視野,增加見識,而非完成某項特定業務。

  具有主動學習精神的開發者在業餘時會時常扮演Sightseer角色——找到自己認為有價值的新技術或是基礎知識進行系統學習,從而拓寬視野,提高水平。

 2. Resident(居住者)

  如果一個旅行者在一個地方待了半年以上,那麼他/她就會變得原來越像當地人。隨著Tourist對某項技術的日益精進,他/她會逐漸演變成這項技術的Resident:

  • 熟悉這項技術的基本元素。
  • 熟悉這項技術的生態系統(Ecology):既包括開發工具(編輯器,命令列工具,整合開發環境等),也包括開發社群(討論組,郵件列表等)。
  • 瞭解這項技術能做什麼,不能做什麼。
  • 瞭解這項技術有那些坑,如何繞過這些坑,以及識別這些坑帶來的問題。
  • 對某些領域有深入的研究——但並不受限於特定領域。
  • 使用這項技術做出了有相當價值的產品或工具。

  同Tourist一樣,根據使用技術的目標不同,Resident可以分為Worker和Craftsman:

  2.1. Worker(工人)

  技術是Worker的謀生手段,一個優秀的Worker應具備以下特徵:

  • 對於給定問題,知道如何給出經濟有效的解決方案。
  • 以團隊合作為主,瞭解團隊合作的價值,能夠推動團隊專案健康前進。
  • 追求按時交付。

  2.2. Craftsman(工匠)

  同Worker不同,技術並非Craftsman的謀生手段,而是某種“副業”——用來提升聲望,修煉開發水平。

  一個優秀的Craftman往往具備以下特點:

  • 對於給定問題,知道如何給出優雅的解決方案。
  • 以單兵作戰為主,主要靠個人推進專案,但也能進行一定程度的團隊合作。
  • 追求極致美感。

 3. Architect(架構者)

  有想法且有能力的人在一個地方待久了都會有將這個地方變的更好的衝動——一種方式是從源頭出發,推翻舊制度建立新社會,也就是革命;另一種方式則是保留現有的制度,對其進行溫和但持續的改進,也就是改良。

  技術也是如此,任何技術都跟不上開發者成長的腳步,當這種差距到達一定程度時,就會有卓越的開發者站出來,創造出新的技術,他們就是Architect:

  • 熟悉多項互相關聯的技術,並瞭解他們的優勢和不足。
  • 具備強大的領導能力,深厚的基礎和大量實際開發經驗。
  • 能夠帶動整個技術的生態系統發展。
  • 好吧,我編不下去了(尼瑪我要都知道我還至於是IT苦屌麼 –_-)

  如果你看過Matrix 2: Reloaded

  就會知道Architect這個詞放在這裡再好不過。

  根據目標不同,Architect分為Reformist和Revolutionist。

  3.1. Reformist(改良者)

  改良者的目標:把現有技術變的更好。(Makes existing technology better)

  例如:

  3.2. Revolutionist(革命者)

  革命者的目標:用更好的技術取代現有技術。(Replaces existing technology with better one)

  例如:

  • Alan Kay把細胞的概念引入軟體開發]進而創造出OOP的核心概念。
  • Don Knuth對計算機演算法(TAOCP)以及計算機排版(TEX)的貢獻。
  • iPhone於2010年之前的任何手機(iPhone4除外)。

 小結

  這篇文章利用A Tour of C++裡的隱喻,把學習/使用技術分成了四個層次七個頭銜:Stranger,Tourist(Salesman,Sightseer),Resident(Worker,Craftsman),Architect(Reformist,Revolutionist),然後給出了各個頭銜所應具備的特徵和能力。

  關於同類文章

  之前也有類似的文章,例如 程式設計師的十層境界 和 開發者的八種境界

相關文章