← 返回職場資訊
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)。也正因如此,學習編程,也代表必須學習如何運用創造思維。

總結

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

 

GetLinks Recruitment

GetLinks Recruitment

GetLinks Recruitment 是一家全方位的人材招募公司。 自2015年以來,我們已經為亞洲超過20,000位人才找到了完美的匹配, 我們的 使命是為求職者和僱主提供一個高效 的 連接平台。 GetLinks Recruitment 迅速成為不少 公司值得信賴的合作夥伴,在全球多個地點設有辦事處,提供一個真正全球化的專業人士和企業網路。

繼續閱讀

相關職場資訊

【職場求生術】遇上「扮工」專家?教你4招對付成日扮忙嘅同事
Advice Columnist

【職場求生術】遇上「扮工」專家?教你4招對付成日扮忙嘅同事

喺香港職場,大家一定遇過呢種同事:日日將「好忙啊」、「真係做唔切」掛喺嘴邊,一有新 Task 就即刻卸膊。最令人眼火爆嘅係,佢哋硬係鍾意喺 Weekend 或者半夜三更覆 Email,特登 CC 晒畀班 Management 睇,營造一個「搏命為公司」嘅假象,但實際上工作產出少之又少。 面對呢種「扮工」專家,身為同事嘅你難免會覺得委屈,甚至因為佢推卸責任而增加咗自己嘅 Workload。今次為你準備咗以下 4 招應對策略,教你點樣優雅地應對,唔使硬食死貓! 1. 劃清界線,拒絕無了期「接身後事」 2. 白紙黑字,留低溝通紀錄 3. 唔好做觀眾,冷處理「非辦公時間」嘅表演 4. 專注自己,相信管理層嘅眼光 職場上最重要係保護自己嘅 Mental Health。與其為咗「扮工」同事激心,不如將精力放喺提升自己嘅實力上!

老細每粒鐘要你「報更」?4招教你對付 Micro-management 控制狂上司!
Advice Columnist

老細每粒鐘要你「報更」?4招教你對付 Micro-management 控制狂上司!

返工最怕遇到啲咩?唔係無窮無盡嘅 OT,而係遇到一個 Micro-management(微管理)嘅老細!每日每分每秒都 mon 住你,不停問:「你而家做緊咩?」、「份report搞成點?」,最誇張嘅甚至要你每日 mark 實一張 Time sheet,每個鐘「報更」匯報自己做過啲乜。 面對呢種令人窒息嘅工作環境,與其日日喺位度反白眼兼懷疑人生,不如試下用以下 4 招「反客為主」,拆解老細嘅不安感! 1. 主動出擊:先發制人,塞爆佢個 Inbox 控制狂上司之所以不停問,往往係因為佢缺乏安全感,覺得一切唔喺佢掌握之內。既然佢咁想知,你就不如主動匯報! 2. 善用工具:透明化你嘅工作日程 老細要你每個鐘寫 Time sheet?與其嘥時間填表,不如主動提議用更有效率嘅方法。 3. 向上管理:委婉反映「報更」嘅時間成本 好多老細未必意識到,不停要求員工匯報,其實係會拖慢工作進度。你要搵個適當嘅時機(例如 One-on-one meeting),平心靜氣咁同佢傾下。 4. 建立信任:用實力證明你係「靠得住」 講到尾,Micromanagement 嘅核心問題係「信任」。要老細放手,首先你要證明自己值得被信任。 🌟 終極絕招:三十六計,走為上計! 如果你試過晒以上方法,交足貨又主動溝通,但老細依然故我,將控制慾無限放大,搞到你精神緊張、壓力爆煲……咁證明呢間公司嘅文化根本唔適合你。 與其留喺度受氣,不如及早轉身!全港咁多好老闆,總有一個懂得欣賞你嘅獨立工作能力!唔好等啦,即刻為自己嘅 career 搵條新出路!

【IT事務所】數位經濟與平台經濟:差異與對企業的深遠影響
Advice Columnist

【IT事務所】數位經濟與平台經濟:差異與對企業的深遠影響

在當今快速變遷的科技時代,「數位經濟」(Digital Economy)與「平台經濟」(Platform Economy)是兩個常被交替使用的名詞。然而,兩者在經濟學定義與商業運作邏輯上具有顯著的差異。對於企業而言,理解這些差異不僅是理論上的探討,更是擬定未來發展策略、因應市場挑戰的關鍵。 一、 數位經濟與平台經濟的差異 要釐清兩者的差異,我們可以從「宏觀」的經濟型態與「微觀」的商業模式來進行深入探討。 數位經濟是一個廣泛的總體經濟概念,涵蓋了所有依賴數位科技、數據化資訊與網際網路作為關鍵生產要素的經濟活動。它不僅包括純粹的網路產業,也包含了傳統產業的數位化轉型。只要是運用數位科技來提升效率、創造價值的商業行為與經濟體系,都屬於數位經濟的範疇。例如,一家傳統銀行開發了手機應用程式,讓客戶可以在線上完成轉帳與理財,這種利用數位技術提升營運效率的行為,便是數位經濟的典型展現。 相對而言,平台經濟是數位經濟中一個極具顛覆性的特定商業模式。平台本身通常不直接生產商品或提供實體服務,而是作為一個「中介載體」,利用數位基礎設施來媒合雙邊或多邊市場。在價值創造方式上,數位經濟關注技術如何提升生產力,而平台經濟的核心則在於「降低交易成本」與「創造連結」。延續前述的金融例子,如果一家企業建立的是一個P2P網路借貸平台(如LendingClub),它本身不擁有放貸資金,而是純粹媒合有閒置資金的投資人與需要借款的消費者,這就是平台經濟的運作邏輯。 平台經濟最顯著的特徵是「網路效應」(Network Effects)。在這種模式下,平台的價值會隨著使用者數量的增加而呈指數型成長。以叫車服務平台Uber為例,當平台上的司機越多,乘客的等待時間就越短;乘客體驗變好後,會吸引更多乘客使用,進而又吸引更多司機加入以獲取更高收入。這種跨邊網路效應在一般的數位經濟企業中並不一定存在,卻是平台企業爆發性成長的關鍵引擎。 此外,平台經濟徹底顛覆了傳統的所有權概念,轉向「資產輕量化」與「使用權」的共享。傳統的跨國連鎖飯店如希爾頓(Hilton)或萬豪(Marriott)需要耗費鉅資購買土地、興建飯店並雇用大量員工;然而,Airbnb作為全球最大的住宿提供者,本身卻不擁有一間客房。平台企業藉由調動社會上的閒置資源,以極低的邊際成本進行擴張,這是傳統數位轉型企業難以企及的優勢。 二、 平台經濟對企業的影響 平台經濟的崛起,徹底改變了傳統企業的競爭環境、成本結構與消費者期望。其對企業的影響呈現出強烈的雙面性,既帶來了前所未有的全球化機遇,也伴隨著嚴峻的生存與依賴挑戰。 商業模式的重塑與創新 : 平台經濟迫使傳統企業從「線性價值鏈」(即生產、行銷、銷售給終端消費者)轉型為「生態系統」思維。企業不再只是單純地銷售產品,而是轉向提供服務、體驗,甚至自己轉型為平台。例如,全球知名的農業機械製造商約翰迪爾(John Deere)不再只是一間賣牽引機的公司。他們將設備連上網路,建立了一個農業數據平台,讓農夫、種子供應商與軟體開發者可以在平台上共享天氣、土壤與作物數據,成功從傳統硬體製造商轉型為平台生態系的管理者。 降低市場進入門檻與全球化擴張 : 對於新創公司與中小企業而言,平台經濟大幅降低了接觸消費者的門檻。過去,一個在地工匠或獨立設計師若要將產品賣到國外,需要耗費巨資建立實體通路、尋找代理商或建置昂貴的跨國電商網站。如今,透過如Pinkoi、Etsy或Amazon等大型平台,企業可以「隨插即用」這些現成的數位基礎設施與全球金流、物流系統,迅速將商品賣給全世界的用戶。這種便利性讓企業能將資源集中在產品創新與服務優化上。 競爭加劇與「贏者全拿」效應 : 平台經濟高度依賴數據與網路效應,這極易導致「強者恆強」的局面。當一個平台累積了龐大的用戶基數與數據後,其演算法會變得更精準,進一步形成跨越不過的護城河。例如在搜尋引擎領域的Google,或是社群媒體領域的Meta,因為其龐大的網路效應,後進者幾乎無法撼動其地位。這種「贏者全拿」(Winner-takes-all)或寡占的動態,意味著傳統企業若無法加入主流平台生態圈,或在其中找到無可取代的利基市場,將面臨被邊緣化的巨大風險。 高度的平台依賴風險 : 水能載舟,亦能覆舟。當企業過度依賴單一大型平台時,會喪失對定價、客戶數據以及品牌體驗的控制權。例如,許多餐飲業者高度依賴Foodpanda或UberEats等外送平台來獲取訂單,這不僅意味著必須支付高昂的抽成費用,更代表著他們無法掌握顧客的真實聯絡方式與消費輪廓。同樣地,許多依賴Facebook粉絲專頁獲取流量的新聞媒體與電商,只要平台演算法稍作修改,其觸及率與營收便可能面臨雪崩式的下滑。這種高度的依賴風險,是當代企業在擁抱平台時必須謹慎管理的課題。 數據成為核心競爭資產 : 在平台生態中,數據是最有價值的戰略武器。平台企業透過掌握雙邊用戶的行為數據,能進行極度精準的行銷與產品優化。這種資訊不對稱有時會對依賴平台的企業造成威脅。以Amazon為例,平台上累積了無數第三方賣家的銷售數據;當Amazon發現某款商品極度熱銷時,便可能利用這些數據推出自家的「Amazon Basics」自有品牌產品,以更低的價格與更好的搜尋排名與原本的賣家競爭。因此,傳統企業在利用平台的同時,也必須設法建立自己收集第一手數據(First-party data)的渠道,以維持長期的競爭力。 三、 結論 數位經濟為我們勾勒了技術賦能的廣闊藍圖,而平台經濟則是這幅藍圖中最具爆發力與顛覆性的引擎。透過豐富的實際案例可以看出,面對平台經濟的浪潮,現代企業不能僅僅停留在「將現有業務數位化」的階段。企業必須深入理解多邊市場的運作邏輯與網路效應的威力,思考如何巧妙地融入現有的平台生態系,妥善管理依賴風險,甚至在特定的利基領域中構建屬於自己的微型平台,方能在這場沒有邊界的競爭中立於不敗之地。