專家級新手

 Gordon Lau 劉偉中

Gordon Lau 劉偉中

2019-03-19

今次要介紹的,是一個非常常見之現象,不論你是學寫程式、學做甜品、學寫文章,又或是練習球技、體能訓練等,都會經常窺見其身影。 想像一下:你的朋友問你:「你的駕駛技巧好嗎?比較起其他司機來說如何?」如果你本身有駕駛執照,但是不常常駕車,大概你會回答:「中規中矩吧,平均水平」;經常駕駛的人,因為經驗豐富,會覺得自己是中上甚至良好之水平。然而,這個想法人人都有,卻與現實完全相悖:因為任何羣體之中,必然有一半個體在中位數(Median)以下而一項經典的調查發現,八成的司機都認為自己的駕駛水平在平均之上這明顯代表在駕駛技術的世界上,大部份人都有自視過高的問題,也代表其實大多數司機,無法準確判斷駕駛技術之高下。

dunning-kruger.jpg

Source

駕駛世界是一個特例嗎?當然不是。人類自視過高是一個相當普遍的現象,普遍到心理學家為此現象改了一個名:達克效應(Dunning-Kruger Effect)。達克效應是一種認知偏差,欠缺能力的人,往往錯誤地以為自己實力比實際上更優秀,反之,真正有能力的人,卻對自己的實力有準確判斷。

編程世界亦是大同小異,大家都遇過一些自信滿滿的程式設計師,以高手自居,細談之下才發覺其實其經驗相當匱乏,也欠缺系統化的思維。更令人深感痛苦的是,就筆者觀察所發現,編程其實比其他範圍更「盛產」這些技術低下、自視甚高的人,原因何在呢?

編程的反饋週期(Feedback Cycle)

人類學習一件事物,必需要現實世界的反饋(Feedback):學打乒乓球,當然要習慣閱讀球路的落點,才能逐漸改進自己的技術;學會駕駛,一樣要閱讀與其他汽車的距離是否平均,轉彎時是否有充夠空間。編程呢?編程的反饋週期很長,一個專案由零至完成可能為時五年以上,就可以明白為何很軟件工程師有多年工作經驗,卻無完成一個完整專案的經驗了。超長的反饋週期,令軟件工程師很難得到充足的反饋,去判斷自己的決定是否合適。想像一下,一個技術平常之人,與乒乓球冠軍比賽,斷斷不會誤以為自己是乒乓球高手,因為大概會被「大炒」11比0;學習駕駛,就算天份再好,也不會自以為是舒麥加的級數,因為反饋很多也很明顯,再自視過高,在高手面前,也會向現實低頭。編程由於缺乏準確的反饋機制,程式碼審查(Code Review)亦未夠普及,很容易使本身技術不高的人,誤以為自己是當世高手,這類人,有個很形象化的名字,稱為「專家級新手」(Expert Beginner)。

德雷福斯模型

新手是新手,專家是專家,何謂專家級新手?要容易理解,最好是先理解學習心理學,也就是德雷福斯模型(Dreyfus model of skill acquisition),這個模型嘗試解釋人學習的進程,將學習一項技能之程度類比成如一級級階梯的結構。

the_Dreyfus_model.png

Source

這個模型將技能的熟練程度分為五個層次:專家(Expert)、熟練者(Proficient)、能勝任者(Competent)、進階初學者(Advanced Beginner)、初學者(Novice)。最低的級別是初學者的級別,隨著實踐經驗,拾級而上,最終就成為了該技能之專家。

  • 愈往上,愈有大局觀(Big Picture),也愈不拘泥於規則,所以孔子所言:「七十而從心所欲、不踰矩」也就是到七十歲隨心所欲,也不會違背仁的精神。能夠隨心所欲,當然是因為早已將行仁之法融會貫通,不用只跟規則而行。在編程的世界舉一例,專家通常明白各式的編程範式(Paradigm)有各自的好處,不用拘泥於Object oriented還是 Functional Programming。

  • 愈往上,愈以直覺的方式理解。這正正解釋了為何真正的專家,往往對相關學科有一個敏銳的直覺。愈往下,愈要「畫公仔畫出腸」才能明白。

  • 愈往下,愈會跟從規則,愈容易出現知其然而不知其所以然,以背誦為主的教育方法往往只能將學習者帶至下面幾個層次,因為縱使將所有規則都背得滾瓜爛熟,也不會無顧明白整個大局是如何運作。

  • 能勝任者(Competent)開始有全面之理解(Holistic View),開始Know what he/she does not know,所以進階初學者(Advanced Beginner)是最後一層沒有全面理解的級別。

專家級新手

德氏模型顯示一個很美好的願景,也就是每個人都會隨著更多的實踐,改善自己的技能。而現實上,大家常常可以看見一些「經驗與能力不相稱」之人,就是經驗很多,能力卻相當平庸。筆者常常想起一句不知何來的佳句:

十年經驗,不是十個一年經驗的總和。

這句恰恰與德氏模型相符,十年經驗是拾級而上,直至專家的級別;十個一年經驗只是將進階初學者級別重覆十次而已。更糟糕的是,是成為了一個專家級新手!

ExpertBeginner.jpg

Source

由此圖可見,右手邊是跟德氏模型一樣的五個級別,左邊卻多出了一個專家級新手(Expert Beginner)的級別, 專家級新手沒有可能更上一層樓,因為專家級新手一個最明顯的特徵就是相信自己已經學會所有相關知識,再無進步的空間,所以於他而言,自己已經是專家的級別(當然筆者很懷疑有此類性格的人是否懂得德氏學習模型)。而專家級新手由進階級新手分支出去亦有其原因,因為如上面所言,能勝任者開始有全局觀,所以知道自己的不足,因此明明是新手,卻以為自己是專家這種情況,只會在進階級新手身上出現。

解救專家級新手

既然專家級新手技術上其實是新手,與真正的專家交流,能否使其明白自己的不足呢?問題是,通常專家級新手的煉成,往往是一個缺乏真正專家的環境所造就,例如一間非IT公司的唯一有電腦技術知識的員工,就很容易變成專家級新手;更甚者,當專家級新手成為高層之後,會下意識排斥機構聘請或諮詢任何真正的專家,最終導致整個機構只能容下其他專家級新手,這就是職場上著名的「死海效應」(Dead Sea Effect),也就是有能力的人都如水蒸發了,留下來的只有鹽,而且愈來愈鹹。所以大家常常發覺有些機構整體技術低落,彷彿無人在乎,正是死海效應之結果。

dead_sea_effect.jpg

Source

辨認專家級新手

專家級新手有如此大之影響,甚至乎影響整個機構,當然要及早辨認。 可幸是當你理解這個概念,要辨認專家級新手其實不太困難。以下是一些常見的特徵:

1. 相信自己所熟習的框架、程式語言是白銀子彈(Silver Bullet),能解決所有問題。

專家級新手通常非常熟習一種技術,也認為世間上所有問題都利用該技術輕易解決,也就是大家常常聽到的「太陽底下無新事」。 一個經典例子是XML之濫用,XML其實並不適合作為資料傳送的格式,正是由於相信XML乃Silver Bullet的想法,因此在很多無須 XML的情況也會多加濫用。

2. 無興趣學習新事物,或不理解新趨勢發展之背後原因

近年單頁面應用程式(Single Page Application)的發展,從根本改變了大家對網頁程式開發的理解,由於瀏覽器運算能力與日俱增, ReactAngularVue.js令軟件工程師以SPA作為前端,後端只作JSON API Server,因此後端可以Microservice的方式運作,改善可靠性及可擴展性。網頁則愈來愈多以Static Website Generator開發。可是即使是在如此發展大勢之下,還是有一些人反其道而行,提倡日漸落 後的單一架構(Monolithic Architecture),專家級新手的故步自封,實在令人大惑不解。

3. 傾向以輩份(Seniority)判斷技術問題

驟聽之下,似乎與本文一直强調的專家有所衝突,不是一直都認為技術層次有高下嗎?要留意的是,專家級新手判別技術問題的方法,常以提出意見者的職位、年資甚至乎年紀去判斷,正正就是將十個一年經驗當成十年經驗壞例子。更甚者,用人唯親、因人廢言等,就更無須多言。

總結

專家級新手是人類認知偏差造成的結果,對機構尤其是科技為主的公司有著決定性的影響,實在不可不察。 本文的專家級新手一詞及很多其他概念,翻譯自一篇很有趣的博客How Developers Stop Learning: Rise of the Expert Beginner,大家如有興趣瞭解更多,可以詳加細讀。

留言

延伸閱讀

軟件工程及軟件工藝

好Programmer是怎樣煉成的?

有一種病叫Excel病

破除迷思系列:高手一定唔用Windows ?

破除迷思系列:Programmer 做到三十歲就要轉行?

破除迷思系列:用Command Line 的都是Hacker?

破除迷思系列:Programming language 有高下?Java 、PHP 無人再用?