← Career advice
Advice Columnist

學寫程式為何甚艱難?

學寫程式為何甚艱難?

如果你想學寫程式,在網上搜尋一下,不難找到不少「輕鬆學習XXX」、「YY天輕鬆學會Python」的教材及影片;去電腦書店逛一圈,很容易就可以找到「七天學會Java」等的書籍,這些教材其實都在推廣一個信念,也就是: 學寫程式很簡單,人人都可以學會。 筆者對此信念後半部深表認同,但是對前半部所謂「學寫程式很簡單」,卻真是不敢苟同。

筆者深信No pain, no gain的哲學,世上大部份有價值的事物,都必須努力才能達到,如果真是可以「YY天輕鬆學會編程」,那豈不是明天所有軟件工程師都要失業?學寫程式,就像練馬拉松一樣,人人皆可做到,只是必須要付出努力。將一樣要付出努力才能達成的事物,簡化成「XX天就可以輕鬆學成」,會令初學者初遇困難時,誤以為自己無甚天份,繼而失去學習動機。反而一早說明學習時會遇上的困難,才能為初學者提供正確的心理準備。就像你要去挑戰一座高峰,你找了一個曾經登上該座高峰的朋友請教,那朋友卻說:「很簡單的,不用訓練,人人也可以上去」,這可不是安慰說話,而是害人不淺。

你必須學習新語言

程式語言之所以稱為程式語言,原因是因為程式語言確是一種語言,而且皆是專為向電腦說明步驟而發明的。因此本質上與自然語言有很多不同的地方,一個經典的Programmer笑話是這樣的:

A programmer is going to the grocery store and his wife tells him, “Buy a gallon of milk, and if there are eggs, buy a dozen.” So the programmer goes, buys everything, and drives back to his house. Upon arrival, his wife angrily asks him, “Why did you get 13 gallons of milk? ” The programmer says, “There were eggs!”

妻子明顯的意思是想丈夫買一加侖牛奶,如果有雞蛋的話,就多買一打雞蛋,但丈夫卻理解成以下的程式碼。

buy(1,‘gallon’,‘milk’);

if(has(‘egg’)){

   buy(12,‘gallon’,‘milk’)

}

就創造了這個經典笑話。當然笑話的內容不足為信,但程式語言與自然語言的差距卻是確實存在,現今出現了不少學習編程遊戲,幫助沒有任何編程背景的人理解一步步來的程式思維方式,算是為減低學習編程門檻的一大進步。當然為了提起玩家之興趣,亦只包括了較為基本的程式語言語法。

當代常用的程式語言,除了基本的流程控制結構,如if-else條件判斷式、while/do-while/for loop迴圈外,還有function函數、class類別、interface接口等高級概念,這些詞語在英語都有原來的意思,在程式語言的意思與英語相似而非完全一樣,因此對初學者而言,是要從零學起,就像重學外語的基本語法一樣。再加上很多希望學習程式語言的人,未必以英語作為母語,使學習門檻更高。幸運的是,程式語言與自然語言不同,一旦學成了一種程式語言之後,要再學習其他程式語言,斷不會像學習外語一樣又要從零開始,因此精通數門程式語言,遠比精通幾門外語要簡單得多。

你必須學會抽象式思維

寫程式常常需要運用抽象思維,例如所謂的佇列(Queue)結構,對應現實生活的就是大家不論買早餐、搭地鐵、搭巴士時都會排隊的隊列,佇列在電腦世界很有用,常常用作將任務順序執行,這種佇列因此又名為任務佇列(Task Queue)。排隊是日常常見的事,但是將排隊的概念應用於電腦程式之上,正是抽象式思維(Abstract Thinking)的典型。除了愛好數學、科學的朋友之外,大多數初學者甚少以此角度思考問題,因此覺得困難也是自然不過。

又例如函數(Function),如果你將函數理解成數學的函數如f(x) = x * x一樣,也就是將一些輸入(input)x,轉換成輸出(Output),那尚算容易理解。但當你將函數作為其他函數的參數(Parameter),形成所謂的回調函數(Callback Function)的時候,就需要抽象式思維了。

function square(x){

   return x*x

}

// Callback function in use

setTimeout(function(){

   // This function is called after 1000ms

},1000)

抽象概念另一大難處,在於難以用日常生活例子類比理解,筆者在教學時常常花九牛二虎之力,讓學生理解回調函數非同步的概念,初學者直覺上不習慣以此方式思考。正因日常生活難以鍛煉抽象思維,於大多數人而言,唯一受過對抽象思維有系統訓練的地方,就是中小學的數學課(低年級科學課通常重直觀,非抽象思維),不過很多人不喜歡數學課就是了…

你必須分毫不差

很多職業都要求高度的精確性(Precision):醫生用藥必須準確,否則病人就有性命之虞;土木工程師需要準確計算建築承托力,否則建築物就會成為危樓。編寫程式也是一樣,一個標點符號的錯誤,就足以令整個程式錯誤,甚至停止運行,而且回報的錯誤更常常令人摸不著頭腦。 大家一定對以下的經典畫面,不會感到陌生。

當大家自己學習軟件開發時,錯誤就更加常見。曾經學習過JavaScript作網頁開發的人,都一定見過以下的錯誤:

驟看之下,該錯誤就如不知所云,只是告訴你Uncaught ReferenceError: people is not defined,其實這個錯誤的真正原因,在於上邊定義的是person而不是people,因此當瀏覽器嘗試運行時,只是發覺people未定義,因此就直接回報people is not defined的錯誤。

電腦不是人類,不能準確指出:「你把person寫成了people」的錯誤,只能夠重覆告訴開發者people is not defined。正因電腦並不真正「理解」(縱是當今最先進的人工智能,也難以稱為真正理解)人類背後行事目的,因此無法準確回報一個常人能夠即時理解的錯誤。要成為程式開發者,就需要將相關的錯誤訊息(如people is not defined),聯想到常見的錯誤(串錯了變數名字)。因此可以說,程式開發本質需要分毫不差,任何最微細的錯誤,都不能夠出現。 然而相對於電腦的分毫不差,人類可謂天生就常常犯錯,除非經過後天大量訓練,否則難以習慣。

你必須持續練習

有留意筆者之前文章的讀者,都知道筆者常常强調軟件工藝的重要性。要學成一門工藝,必須要持續練習,才可以精益求精。 正如學會廿六個英文字母不等如成為莎士比亞一樣,學會程式語言的基本語法,也當然不是學習軟件開發的終點。單元測試(Unit-Testing)、設計模式(Design Pattern)、程式碼結構(Code Organization)等,都是需要多寫多想,才能融會貫通。

筆者在軟件工程師成長手冊一文中,提過開發者有五個層次: 初學者(Novice)、進階初學者(Advanced Beginner)、能勝任者(Competent)、熟練者(Proficient)、專家(Expert)。要算是達到職業水平,起碼要到達第三層次能勝任者的級數。也就是對本身工作所使用的技術棧(Technology Stack)有一定瞭解,以及懂得發掘新技術,同時有能力學習新技術。而科技發展日新月異,技術推陳出新,程式開發亦自然如是,要能夠掌握新的技術,也一定需要持續學習。對絕大多數初學者而言,學習程式最難跨過的障礙,正是缺乏足夠時間去持續練習。因此這個因素簡單易明,卻也是癥結所在。

你必須有創造式思維

由普羅大眾角度看來,編程是一個只與電腦、數字打交道的職業,其實創造思維(Creative Thinking)在編程中,也是不可或缺。編程的本質,就是由無到有,創造(Create)一個能夠解決問題的程式。天底下沒有兩個程式設計師會寫出一樣的程式碼,就正如不會有兩個寫出一樣文章的作家。

編程果真需要創造思維嗎?其實對一個專業程式設計師之日常工作而言,從沒有兩個問題是完全一樣,因為如果該問題已經解決過一次,就再沒有解決的必要(除了教學用途外),這也是著名的DRY原則(Don’t Repeat yourself)。例如為物件排序(Sorting),也許你會認為方法只有一兩種,但光是維基百科的Sorting Algorithm條目,就有超過二十種不同算法,而且每個方法,也有各種優劣之分。

為物件排序如此目標明確的問題,都可以有超過二十種算法,真正現實世界之系統,例如會計系統、倉存系統、客戶資料管理系統,就更可謂有無限種解決方法。程式設計時要選擇最佳最有效率的方法,就如一個畫家創作時選擇最美的表達方法,都必須有創造思維在其中,只是編程稍為限制,程式碼必須正確才能運作,筆者認為,這實是一種基於邏輯之創意(Logic-based creativity)。也正因如此,學習編程,也代表必須學習如何運用創造思維。

總結

一口氣講了學寫程式之困難所在,絕不是為了使各位正在學習編程的人卻步,而是正正因為學習編程的中途,會有不少障礙攔路,早早準備,就如攀登高山前充份準備一樣,才是合適的學習心態。

 

Keep reading

Related career advice

【職場心理學】上司話你唔夠狠,下屬話你唔撐佢哋——做中層,你係人肉避雷針
Advice Columnist

【職場心理學】上司話你唔夠狠,下屬話你唔撐佢哋——做中層,你係人肉避雷針

Head count凍結,上司call你入房話:「你自己諗辦法。」 下屬問你年加幾多,你知道答案,但唔敢講。高層宣布新政策,問有冇問題,你笑住話「冇」,但你心裡清楚返去個部門一定炸鍋。績效review,你要寫低屬下嘅不足,但寫嗰陣你係唔舒服嘅,因為佢哋真係有盡力。開完會,上司叫你「帶領好個team嘅方向」,但連你自己都唔知方向係邊。 你夾喺中間,上唔到、落唔得。 高層嫌你執行力唔夠;下屬覺得你唔夠幫佢哋發聲;HR話你要做好榜樣;另一半問你點解又係咁夜返屋企。某一日,你喺東鐵線車廂裡,有個陌生人跟你對眼笑咗一下——你差啲想喊。 有時喺輔導工作中,我遇到嘅中層 manager,坐低嘅第一句往往係:「我唔知自己係咪做錯咗啲乜。」 你以為係你管理技巧唔好?唔係嘅。喺心理學入面,呢個叫「情緒勞動」(Emotional Labor)——即係持續壓抑或管理自己嘅真實情緒,去配合組織對你嘅形象要求(Hochschild, 1983)。做中層嘅人,每日都要演一場無劇本嘅戲:對上管理期望、對下管理情緒、對外管理形象——而你自己嘅感受,係冇位置擺嘅。 長期嘅情緒勞動,係職場 burnout 最常見、又最容易被忽視嘅根源之一。 就好似一架升降機嘅緩衝彈簧——佢嘅功能係吸收衝擊、保護兩邊。但如果長期超重、冇保養,彈簧遲早會斷。 緩衝係你份工嘅一部分,但唔代表你要用自己嘅身心做消耗品。 有一個有用嘅覺察練習:每個星期,寫低三件「唔係我份工、但我一直係咁做緊」嘅事。唔係叫你即刻唔做,而係讓自己知道——你嘅邊界喺邊,你係幾時開始一點一點失去自己嘅。 覺察,係改變嘅第一步。 做中層嘅你,好少被讚,好少有人問你「你點呀」。 今日,我想問你:你點呀? 唔使答得好好聽。只係停一停,不加批判地承認:「係,我最近好攰。」 呢份誠實,係你對自己最大嘅善意。你唔係一個齒輪,你係一個人。 參考資料Hochschild, A. R. (1983). The managed heart: Commercialization of human feeling. University of California Press.Kahn, R. L., et al. (1964). Organizational stress: Studies in role conflict and ambiguity. Wiley.

升職加薪後,為何很多人反而更焦慮?
Advice Columnist

升職加薪後,為何很多人反而更焦慮?

上月專欄談到,在裁員、縮編及經濟不確定性下,職場人士需要建立「財務韌性」,讓自己即使面對收入中斷,仍然保有生活與選擇的空間。 但有趣的是,最近接觸不少客戶時,我發現另一個現象:有些人明明升了職、加了薪,甚至晉升管理層,焦慮感卻沒有減少,反而愈來愈重。 按常理推算,收入增加應該帶來更多安全感,為何現實往往相反?問題很多時不在收入,而在生活模式。 收入增加了,壓力卻沒有減少 曾有一位四十多歲的管理層客戶,十年間薪酬幾乎翻倍,由月入四萬元增至接近八萬元。表面看來事業發展理想,但當我們一起檢視財務狀況時,卻發現他的壓力比十年前更大。 原因很簡單。收入增加後,他換了更大的住宅,供款增加;子女升讀國際學校,教育開支上升;家庭旅遊、保險及生活消費亦同步提高。結果雖然收入增加了一倍,但每月可自由運用的現金流卻沒有明顯改善。 更重要的是,他開始不敢轉工。因為一旦收入出現空檔,整個家庭開支結構都可能受到影響。這種情況在中產及管理層人士之間其實相當普遍。 高收入,不等於高安全感 近年有一個財務規劃概念稱為「生活膨脹」(Lifestyle Inflation),意思是當收入增加時,支出亦同步上升,結果財務自由度未有真正改善。 從職涯管理角度來看,這亦是一種風險。不少人以為職場安全感來自更高薪酬或更高職位,但真正的安全感,很多時來自保留選擇權。 當你有能力拒絕不適合的工作、可以接受短暫轉型期、甚至有空間進修或探索新的職涯方向時,你才真正掌握主動權。相反,如果每月開支已完全依賴當前收入水平,即使職位再高,也可能陷入「不能停、不能轉、不能錯」的壓力循環。 那麼,升職加薪後應如何避免陷入這種情況?我認為有三個值得思考的方向。 第一,讓收入增長快於生活成本增長。 每次加薪後,未必要即時提升所有生活開支。把部分新增收入轉化為儲蓄、投資或退休規劃資產,長遠往往比單純增加消費更有價值。 第二,建立與收入無關的資產。 無論是投資組合、強積金、自願性供款,甚至其他長期資產,本質上都是將今天的工作收入轉化成未來的選擇權。 第三,定期檢視自己的「財務自由度」。 問自己一個簡單問題:如果今天失去工作,現有資源足夠支撐多久?答案未必需要非常充裕,但至少應讓自己擁有重新規劃下一步的時間。 職場發展當然重要,但我認為衡量成功不應只看職位高低或薪酬數字。真正值得追求的,或許不是賺得更多,而是在收入增加的同時,仍然保留選擇人生的能力。因為高薪不一定等於自由,而能夠掌握選擇權的人,往往才擁有真正的安全感。

【IT事務所】駕馭未知的浪潮:企業在持續進化的 AI 時代下的道德標準與管治之道
Advice Columnist

【IT事務所】駕馭未知的浪潮:企業在持續進化的 AI 時代下的道德標準與管治之道

在數位經濟與人工智能技術高速發展的今天,企業正面臨一場前所未有的技術變革。隨著大型語言模型與自主智能體(Agentic AI)的持續進化,企業在享受自動化與生產力提升的同時,也無可避免地遭遇了複雜的道德與管治(Governance)難題。若缺乏完善的監管框架,AI 的失控不僅可能引發公關危機與合規風險,更可能損害企業的長期競爭力。因此,深入理解並建立具備韌性的 AI 管治機制,已成為現代企業不可迴避的戰略核心。 企業在引入 AI 時首當其衝的挑戰便是算法偏見與歧視。AI 模型的輸出品質高度依賴於其訓練數據,若歷史數據本身潛藏社會偏見,AI 系統便會不加思索地放大並延續這些不公。以人力資本管理為例,曾有跨國企業開發 AI 簡歷篩選系統以加速招聘流程,卻發現系統因過去十年的技術職位多由男性擔任,進而「學會」對包含女性特徵詞彙的簡歷給予較低評分。這種情況若發生在銀行或保險業的信貸審批上,將對特定族群造成系統性歧視,進而引發嚴重的合規風險與潛在的金融爭議。 另一個不容忽視的難題是深度學習模型的「黑箱」特質與透明度不足。即使是系統開發者,往往也難以確切解釋 AI 是如何推導出特定結論的。在醫療健康診斷、保險理賠評估或金融爭議處理等需要高度問責與精確性的領域中,這項缺陷尤為致命。若 AI 系統拒絕了客戶的理賠申請或作出了不利的決策,企業卻無法向大眾與監管機構提供清晰的邏輯解釋,這將嚴重摧毀消費者信任。因此,「可解釋性 AI」(Explainable AI)的發展與應用,對於推動技術落地至關重要。此外,在日常營運中,員工若在未經授權的情況下使用面向公眾的生成式 AI 工具,極易在不知不覺中輸入企業機密或客戶的敏感數據,這凸顯了防範數據隱私與商業機密外洩的迫切性。 面對上述挑戰,企業必須摒棄僵化的政策,轉而建立一套動態且跨部門的 AI 管治框架。AI 的應用早已超越單一資訊科技部門的範疇,企業應籌組涵蓋技術、法務、合規、人力資源及業務代表的專責委員會,共同制定符合企業核心價值觀的 AI 使用政策。同時,企業必須實施分級風險評估機制,針對不同應用場景採取差異化管理。例如,用於撰寫一般行銷文案的低風險系統可採常規監管;但涉及客戶信用評分、自動化醫療決策等高風險領域,則必須強制進行嚴格的「偏見審計」,並確保人類在決策流程中保留最終決定權。 在技術部署與企業文化層面,企業應積極引入私有化與企業級的 AI 解決方案,透過安全的隔離環境處理敏感數據,從根本上阻絕資料外洩的風險。然而,技術的防護仍需配合持續的內部審查與教育訓練。由於 AI 模型會隨著時間推移產生「數據漂移」(Data Drift)導致預測失準,企業必須定期對系統進行回溯測試。更重要的是,管治不僅是限制,更是賦能。企業應致力培養全體員工的數位素養,教導他們識別輸入敏感資訊的風險,並學會批判性地評估 AI 生成的結果,而非盲目信賴。 總結而言,在數位轉型的浪潮中,AI 的管治與道德標準絕非阻礙創新的絆腳石,而是企業實現永續發展(Sustainability)的堅實護城河。一間能夠負責任地運用 AI、嚴格保障數據隱私並確保算法公平性的企業,將能在未來競爭激烈的市場中贏得深厚的社會信任與品牌價值。唯有將「道德設計(Ethics by Design)」的理念深深植根於 AI 應用的每一個環節,企業方能在這場持續進化的技術革命中穩健前行。

學寫程式為何甚艱難? | CPJobs Career Advice