關於學習軟體開發的三個迷思

軟體開發這項工作的本質是什麼?

Laurence Chen
Jan 10, 2022
programming misconception

客戶問我,「你幫本公司做的專案裡,客製化軟體開發的部分,日後要怎麼維護呢?」

我:「貴公司有兩百多位的員工,疑似也有一些有餘裕的人手,如果你可以遴選幾個人出來,讓我訓練 100 個小時左右。日後,一些基本的功能,比方說,加一兩個欄位等,他們應該可以自己修改。」

客戶露出不可置信的表情:「咦,寫程式這件事是可以訓練的嗎?你講得彷彿每個人都可以學會。我自己學過,我的同班同學後來有學會、有學好的,往往就是那少數幾個。」

我:「學任何有一點門檻的東西,都會有所謂的資質。有的人天生就是學得快、有的人反之。為了要提高訓練的成功率,請你選擇那些在工作上需要使用 Excel ,而且最好是使用 Excel 用得出神入化的員工。我來訓練這種學員的話,自然是勝多敗少。」

上述的對話,在我的客戶的對話裡,常常不斷地發生。這些對話,讓我發現一般人、甚至是專業的軟體開發人員,常常有下列三個關於學習寫程式的迷思 (misconception):

1. 學寫程式非常的困難、要非比尋常的資質才能學會
2. 會寫程式的人都非常聰明
3. 要成為優秀的軟體開發人員,必須是電機資訊本科系畢業。

在探討上述三個迷思之前,我要先來探討,「軟體開發」的本質是怎樣子的一件事。軟體開發工作,是對真實世界的資訊加以建模,並且利用電腦來加以處理。根據上述的定義,如果先不探討後半句:『並且利用電腦來加以處理』,那會計、法律,也跟軟體開發有許多相似之處。

舉個例子:像一般人每天使用軟體,都會用到的輸入密碼/登入的功能。這個「驗証使用者密碼」的軟體模組,它的基本假設就是:使用同一組帳號,同一組密碼的,就是同一個人。是同一個人的話,系統就准許它看影片。然而,實際上常發生的事情是:同一個家庭的兄弟姊妹共用 netflix 帳號,換言之,每一次地成功登入,是否是同一個使用者一事,往往也 …。法律也有類似的概念:雙方簽名、到戶政登記,就算是結婚。結完了婚,就有一系列的權利與義務。至於,是否真心相愛、是否…。往往就是上法院訴訟,才會再展開討論。會計也有類似的現象:公司收購時,就會產生所謂商譽的價格。置於商譽如何估價,這個估價是否合理,也是視會計方法而定,與真實世界要是脫節的話,就…。凡是用來對真實世界建模的系統,總是會有系統與真實世界交會之處,遇到模型無法 100% 反映現實的問題。

另一方面,就算加入探討後半句「利用電腦來加以處理」的話,還是與法律、會計有異曲同工之妙。比方說,現代的會計師,很多都會利用 Excel 或是財務會計軟體,來自動化產生報表,這也是利用機器來做自動化。律師寫完訴狀,送到法院,過了一段時間,法院就會通知開庭。法律的系統就像一台很慢的電腦,依然是照著規則系統來運作。

接著,回到三個迷思:
1. 學寫程式非常的困難。
並不特別困難,但是,它需要使用正確的學習方式才容易學會,它需要大量在電腦前的練習與肌肉記憶。

此處,我要特別強調『大量練習』與『肌肉記憶』。在我學習寫程式的那個年代,我從 C++ 開始學,一開始學沒有多久,就要處理 Makefile 。Makefile 裡是使用 tab 字元來做分隔子。這個設計也不特別有道理,就是路徑依賴。但是,幾乎每個夠老的程式設計師都記得這一條規則。(可能都在這一條規則上,撞得鼻青臉腫過。) 軟體開發在人類歷史上存在的時間,並沒有很久,還是一門相對新的技藝,工具不停地快速演進中,所以快速發展出來的工具,往往會有不為初學者設計的成分、不甚合理的成分,這就造成了它的學習障礙。

2. 會寫程式的人都非常聰明
針對這個迷思,我會反問:「是聰明,所以學得會?還是學會了,所以顯得聰明?」

人類要感知世界,會利用視覺、聽覺、嗅覺等知覺。然而,視覺看不到的,不代表我們一定看不到,我們可以利用紅外線夜視鏡取得夜視能力。同樣的道理,人類要思考,我們也會利用所謂「思考的工具」來拓展我們思考能力的極限。常用的思考的工具主要可以分成三類:
- 圖像思考
- 符號思考
- 互動思考

符號思考的工具,比方說,數學公式、人類的語言、化學符號。圖像思考的工具,比方說,各式的表格、X-Y 軸的圖、等高線圖、透視圖。互動思考的工具的特色在於,你可以與它互動。程式語言本身,就可以視為是一種互動思考的工具,因為你可以把「想法」寫成程式,讓電腦去執行,執行完了,看結果,再回頭來思考,自己的想法是否正確。

我所看過的例子多半是:當一個軟體開發人員,經過經年累月,大量開發軟體的練習之後,思考的速度變得相當快。

3. 要成為優秀的軟體開發人員,必須是電機資訊本科系畢業。
未必。我們可以先探討學校教了什麼、與要成為優秀的開發人員需要什麼。

首先,電機資訊本科系的教授本人,未必是優秀的軟體開發人員。要成為大學教授,以台灣的現況來講,特別重要的是研究能力、發表論文、博士學位。這三者與軟體開發,都是不同的事。再者,以我本人為例,我大學的教授,他們個個學有專精,但是,專精的項目常常是類比電子電路設計、天線設計、數位電子電路設計、軟體驗証理論、密碼學等等。

另一個層面則是,好的軟體之所以可以設計出來,往往需要軟體開發人員,對於問題本身堅持不懈地去探討。軟體是給「人」使用的,「人」、「使用者情境」、「對資訊做建模」才是最重要的問題。而學校教育強調的是「電腦怎麼運作」與「抽象的理論」,反而沒有對最重要的問題做足夠的探討。

在職場上,我看過不少使用 Excel ,用得出神入化,被身邊同事佩服不已的優秀同仁。我一時興起,詢問他們,是否有興趣學習軟體開發時,他們也一樣問我:「你真的認為我學得會嗎?」我的答覆一律是:「我認為,你已經會了…」

--

--

Laurence Chen

IT 顧問、講者、作家。喜歡快速迭代 (fast iteration) 與提高產出。 著作:「從錯誤到創新」 https://leanpub.com/errors_to_innovation/ 網站:https://replware.dev/