常看到一個軟體工程師的大哉問:「什麼是資深(Senior)工程師」,老實說每個人心中的答案肯定不一樣,所以每間公司的標準也不同。網友說得很好,資深工程師要具備問題解決(problem solving)的能力,這也是教育界推崇程式設計的理由之一。可是,到底什麼是問題解決能力?字面上的意思非常清楚,實際訓練的方式卻非常模糊。為什麼這些人就是有本事解決問題?所以學程式就一定能解決問題嗎?
我覺得可以從三個面向來討論資深工程師如何把問題解決:技術面、溝通面、規劃面。技術面絕對是不可缺少的項目,除了程式之外,還包括資訊工程與領域知識(domain knowledge)。通常能夠解決問題並不在你多麼會寫程式,因為會寫程式的人很多所以不會成為問題,只有在知識匱乏的地方才會產生問題(需求)。所以具備與資訊技術相關的豐富知識,應該是資深工程師的基本條件。
有的人說資深工程師要會帶人教人,但「自己懂」跟「會教」本來就是兩件事,要求一個沒受過訓練的人會教實在有點強求,況且這個和問題解決沒有直接關聯。那麼什麼是和問題解決有關的呢?我想溝通還是必要的吧。即使不用像業務那樣伶牙俐齒,至少對自己公司內部的人或是PM要有辦法溝通,否則怎麼確認需求、怎麼和別人合作?所以雖然工程師的溝通需求不高,但基本程度仍然是必需的。
問題解決能力到底是什麼?我應該思考十年有了吧(大概書讀得不夠多)。我相信自己有這個能力,卻不知道它從何而來。當我開始學習專案管理的時候,看到「系統化思維」這個詞,身為一個做系統的軟體工程師,理所當然具備系統化思維;我相信它與問題解決能力有密切關聯,但我仍然無法描述清楚「能力從何而來?」。不清楚它的來源,就無法做有效率的培訓或評估,所以我認為這是很重要的事。
工作幾年之後,我發現一件令人意外的事。原來即使是會寫程式的科班生,也不見得能做系統分析的工作。我的五專畢業專題就要做系統分析才有辦法進行,所以我一直以為這對工程師來說是基本。畢竟要無中生有變出一套系統來,系統分析是必要的第一步,這就是上面提到規劃面的部份。當然,規劃可以分成很多不同的層面,從雲端硬體架構、軟體流程架構,到程式邏輯架構等等,都有專門的職稱可以代表。此時我終於明白自己為什麼能夠具備系統化思維能力了,因為我原本就喜歡系統分析的工作,這兩個詞彙主要是應用在不同領域產生的差異。
如何培養問題解決能力?如何培養系統化思維?我查到的資料都是很模糊的語言,什麼綜觀全局、經驗累積…怎麼看都跟廢話沒啥兩樣。有一天我突然就懂了,原來大家都有通靈的本領,難怪那麼厲害。工作這幾年如果問我對公司最大的貢獻是什麼?我想總歸一句話就是幫公司解決問題吧。不認識我的人想必會問「你憑什麼?」,我自己也在問「我憑什麼?」。我憑什麼知道這個人有辦法或有希望解決問題?而不是亂槍打鳥一切跟著感覺走?我不是先知,我的理性告訴我心中有個評斷的標準,但我不知道那是什麼。
所以資深工程師為什麼能解決問題?看看上面排除人的因素,就是知識技術與系統分析了,那麼運用到別的領域,則是系統化思維。所以什麼是系統化思維?它需要兩項基礎能力:邏輯推理與分析歸納,但只有這二項能力不代表你能做好系統分析的工作,缺少的那一塊叫軟體工程,即是系統分析的「方法論」。想到這裡,我終於豁然開朗了。剛畢業的時候,我能做出符合需求的系統,卻不知道這個需求是會改變的。所以我開始學習如何做出更有彈性的系統,在不讓系統變得太複雜的情況下,又能保持某種程度的彈性,不會說明天需求一變,我的系統又要整個重寫。如果說我的邏輯與分析歸納能力在這段時間都沒有改變,那麼能夠使我寫出更彈性系統、解決更多問題的,其實是系統設計的方法。所以方法論很重要,它其實是前人智慧的結晶。
方法論的構成
每個領域都有自己的方法論,就是為了解決該領域的問題。當然也有一些方法是比較通用的,比如小時候學過的科學方法,上了研究所學的研究方法,或是各種思考框架、心智圖等等,這些全部都是可以幫助我們解決問題、進行系統化思維的工具。為什麼軟體工程師普遍來說解決問題的能力比較好?除了他們的工作需要系統分析之外(有在使用),全世界的人都透過網際網路分享(軟體工程)問題的解決方法。簡單說他們的資源比其他領域的人多太多了。所以問題解決能力的公式一開始可以這樣寫:
問題解決能力=領域知識/資訊+系統化思維(邏輯推理+分析歸納+心智圖/思考框架/方法論)
通常邏輯推理與分析歸納能力到某個程度就會遇到天花板了,這和個人資質與生活型態(是否有在使用)多少有點相關。所以我們能夠不斷學習/增進自己能力的地方,主要是領域知識/資訊與思考框架/方法論。我相信自己的邏輯推理與分析歸納能力在畢業之後就沒有進步了,但我的問題解決能力理所當然越來越好,因為我一直在學習無盡的知識,方法論也不斷在進步。
解決問題的各種手段
上面的公式看起來很完美,實際卻缺少兩樣重要的東西。一個是想要解決問題的心,雖然是廢話但很重要,畢竟不是每個人看到問題都會想解決它。有時候,問題甚至是需要被「發現」的,這也是科學研究與創意思考的第一課。所以我想解決的問題就是,到底問題解決能力是什麼?第二個重要的東西是學習遷移能力(Transfer of learning)。當一個新的領域出現從來沒有人做過時,肯定也不會有相關的方法論。這時候我們只能找一個比較相近的領域,參考它的方法實驗看看,減少失敗的機率,並且建立新領域的方法論。所以為什麼近年來跨領域的人才很紅,除了跨領域合作的需求越來越多之外,這些人才通常學習遷移能力也會比較好。基於上述兩點,公式修改成:
問題解決能力=發現且願意解決問題+領域知識/資訊+系統化思維(邏輯推理+分析歸納+心智圖/思考框架/方法論)+學習遷移能力
公式一旦寫出來,缺少什麼就一目了然。下次遇到問題卻百思不得其解的時候,就可以回頭想想到底缺少了什麼。也許有的人會問,為什麼沒有把上面的溝通列上去。只要解決的問題和人有關,就會需要溝通。它是非常重要的東西,但我認為它應該屬於人際知識技術的範圍,而不是獨立的項目。畢竟有些問題不會牽扯到人啊。放進去的話,就變成有關係就沒關係,沒關係就有關係了呢。由此可見即使不是跨領域的合作,問題可能也不是單一領域的知識技術就能解決。在知識量不足的情況下,釐清問題需要那些領域知識本身也是個難題。全部的東西到最後能無限提升的只有知識技術而已,所以為什麼現在要鼓勵終生學習就是這個道理,世界不斷會有新的問題出現需要被解決。
老實說這個公式看起來很普通,好像也沒什麼大道理,寫完自己還覺得這也要花十年想(雖然沒有很認真)?可是它確實解決了我的問題,讓我能夠解釋一些觀察到的現象。包括為什麼有些人有能力做研發?為什麼我投票的時候可以相信自己選擇的候選人…等等。因為這些全部都屬於問題解決的議題,所以都可以用這個公式來解釋。當然這只是我個人心得,也許還有不完美的地方,等遇到無法解釋的狀況時,我就會知道了。