掌握 5 個基本概念,讓你寫出好 Code

我相信能建立一種心態架構,是能超越任何語言和函式庫,讓人一開始就能產生好的程式碼。這裡提出 5 點概念,記住這些原則,寫出好的程式碼將非難事。
評論
評論

原文為《Writing good code: how to reduce the cognitive load of your code》,作者為軟體開發自由工作者 Christian Maioli Mackeprang。Inside 獲授權編譯。

Bug 少、表現好、易於更改。好的程式碼影響深遠,而且大概是大家公認高效率開發者背後的重要因素之一。儘管如此,新手還是很難理解什麼是好的程式碼,大部分的相關文章會有整理很多沒有前後因果的小秘訣,但新手開發者怎麼可能全部背起來?比如說,光是這本程式領域的經典《軟體建構之道》(Code Complete),就有 960 頁這麼厚。

我相信能建立一種心態架構,是能超越任何語言和函式庫,讓人一開始就能產生好的程式碼。這裡提出 5 點概念,記住這些原則,寫出好的程式碼將非難事。

1. 避免特立獨行的程式碼

當你看到文章談到新技巧,瞬間驚為天人,一定忍不住就想用來寫些聰明的程式碼來讓你的同事眼睛一亮。

問題是,其他人其實只想把 bug 修好,然後繼續處理其他事。所謂的聰明小技巧只會讓人分心。就像我在「Applying neuroscience to software development」一文所說,當人們需要消化你寫的那段程式碼,他們腦袋裡的 stack 堆疊就會塞爆,而變得難以運作。

▲如果需要你來解釋才能懂,就不要把程式碼弄得太有個性

別用「你自己的流派」寫程式,照標準來寫就好。這些東西都已經有標準做法了,照大家習慣的方式來寫,能讓你的程式盡量好預測又好讀。

2. Divide and Conquer

複雜的程式碼通常能利用模組化技巧來整理,而且除了創造更多函式以外,還有很多方法可以達成。把一項長條件的結果放在一兩個變數內,就是取代呼叫函式 overhead 系統開銷的模組化方法之一。這樣一來還能用它們組成更大的條件式,或是在其他地方重複使用這些結果。

這個拆解問題的方法,要盡量讓每個部分保持集中,影響範圍只留在本地狀態,不要混進其他不相干的 issue,可能的話盡量避免副作用。程式語言和函式庫通常都帶有各自的 issue,把這層影響抽掉能夠讓你的程式碼專注在自己的工作上。「單一責任原則」也是在強調,專注在本地程式碼可以產生好的設計。

▲我喜歡利用變數來釐清邏輯

TDD (測試驅動開發) 除了成功實行帶來的好處以外,還強迫大家採用一些之前沒那麼熱門的準則。之前無狀態的程式碼被嫌棄又慢又沒必要(看看大部分的舊 C 或 C++ 程式),而現在大家都在談純函式(pure function)。就算你沒在用 TDD ,也該瞭解一下背後的原則。在新的規範下工作能讓你成為更堅韌的開發者。

3. 分散且可行

寫程式的時候,電腦和工具面對的困難跟程式設計師差不多,而程式愈複雜,要使用的前端處理程式和變體(Mutation)就愈多。

先不說額外建置工具的優點,它們有很高的機率會要你用像自訂模板或雜湊表格之類的複雜動態資料架構等等限定範圍的語言。整合開發環境(IDE)通常在這方面的表現都不太好,要找到相關的程式片段就會更加困難。

避免使用你的 IDE 支援度低的擴充和程式,它們帶來的衝擊,遠遠超過簡化架構或節省幾行程式這些微不足道的好處。

▲使用 ServiceLocator 也是和 IDE 整合不佳的例子之一

另一個保持 IDE 整合度的重點是避免使用 magic code。大部分的語言都會提供一些方法讓你寫出更動態的程式,但濫用這些像是魔術字串(magic string)、魔術陣列索引(magic array index)和自訂模板語言等功能,會產生一個更難連結的 codebase。

通常只有人類才看得懂的程式碼,就會讓你走上這條難以回頭的路,因為如果你的 IDE 看不懂這些程式碼,那當你想要換到更靜態的架構時,它所有的重構(refactoring)功能都沒用了。

4. 讓程式更好讀

建立一個可預期的架構。這樣一來團隊成員能更容易地找到東西,而大幅減少完成工作的時間。 當你定好整體架構,記得讓主要元素的位置保持顯眼。 比如用 MVC 就把模型(model)、視圖(view)和控制器(controller)放在各自的資料夾裡,不要藏在層層路徑下或是分散在各個不同的地方。

前面談到了模組化,過猶不及也可能發生過度模組化的情形,讓人更難找到程式碼。IDE 有時候幫得上忙,不過通常會因為有太多不相干的程式碼,你還得讓 IDE 忽略 vendor/library 資料夾,或編入指引,手動處理這些問題。這是雙輸的局面,因此盡量試著選擇符合最多需求的函式庫,減少函式庫的數量。

函式庫和工具也可能成為新開發者的阻礙,我最近就用 EcmaScript 7 (bable) 建置新專案,隨後卻發現開發的新人卡在那裡,試著弄懂這些程式碼的意思。這大大地拖累了團隊的生產力,我也能了解對新手來說這壓力有多大。不要使用太難上手的工具,除非你碰到更好的時機。

▲這是我寫的 makefile 的部分程式碼。而新人無法處理過多的新技術。

5. 讓程式更好消化

如果你終於讀到這裡,恭喜你,這可能是最重要的一段。命名在軟體開發中是公認的大哉問。建置工具大概不會在這上面有所改進了,因為電腦不會懂某個解背後的意義。 你得親自記下原因,為變數及函式取個有關聯且有包含前後文的名字會是不錯的方法。 能夠傳達用途的名字甚至還能減少所需的紀錄文件。

直接把意義加在名字前方是個好方法,以前曾經很流行,我想它逐漸消失的原因應該是太常被誤用。比如 匈牙利命名法 原本是為了附加意義,但最後常失去前後脈絡,變成只有表達類型之類的資訊。

▲流暢介面 (fluent interface) 最近常被濫用

最後就是降低迴圈的老生常談。意思是讓條件的分支(branch)愈少愈好,每多一條分支不只會增加縮排,也會影響易讀性,而且最重要的是會增加需要追蹤的項目。

結論和推薦閱讀

以上就是 5 點簡單又包羅萬象的概念,這篇文章的目的就是給你一些收納箱,可以讓你把管理程式碼的想法放進去。

在寫程式的時候,練習應用並進一步加強這些觀念。 如果你還沒開始,我也相當推薦《軟體建構之道》這本書,裡面有很多範例,並且詳細剖析了絕大部分的狀況。

 


看見社會包容力 ─ 每一簇的數位星火

過去一年,新冠肺炎讓全球進入一座大型數位轉型實驗室,小從日常飲食、上班上課,大至城鄉發展,這波加速的數位轉型,並不會隨疫情退散而消失,正因如此,影響社會各層面的「數位包容」顯得格外重要。
評論
Photo Credit:unsplash
評論

根據國際數據資訊(International Data Corporation)預估,2020 ─ 2023 年,全球與數位轉型相關的直接投資金額,每年以 15% 增速成長,2023 年將達到 6.8 兆美元,建立起強大的數位平台與生態系。在台灣無論是在深山林裡、海濱小村、城市邊緣的各個角落中有許多善用科技,結合創意與行動力量,讓不分年齡、行業的每一份子,在數位轉型的進程上不脫隊。

長年在東海岸投入偏鄉工作的師大教授須文蔚,可說是弭平城鄉落差最有創意的實踐者。他主持的宜蘭花蓮數位機會中心(下稱 DOC)、「教育部邁向數位平權推動計畫」,替鄉村裡的學童、老人家、新住民、返鄉青年,找到了夢想和方向。

弭平城鄉落差 DOC數位機會中心創意無限

談到數位包容,須文蔚強調,科技固然是必要工具,但「偏鄉機會不在於昂貴的 ICT 投資,而在於創新應用的推廣,以及人際脈絡的連結」;花蓮的宜昌國小就是很好的例子。DOC 多年來推動「小攝影師的三個大夢」計畫,向各界募集二手相機給孩子課後使用、邀請公視導演開攝影課,並攜手瑪利亞社會福利基金會舉辦公益競賽;而宜昌國小的學童在學會了攝影技能後,把海邊淨灘撿到的垃圾全程影像紀錄並以攝影展呈現,提醒各界重視環保,得到那一年公益競賽第一名。

DOC 募集了超過 600 台二手相機,為孩子辦理課程與攝影展。圖右二為須文蔚老師。Photo Credit:須文蔚老師

須文蔚笑說,別小看孩子的決心,「他們現在到夜市會自己帶容器,還叫老闆不能用塑膠袋。」偏鄉的孩子們能夠自發推廣環保理念並化為行動,最初的起心動念竟是攝影課和公益競賽。

偏鄉有自己的智慧 只是需要輔助工具與科技

「智慧在偏鄉,地方從自己的獨特條件中,都找得到可能性;他們需要的是工具,我們就從旁協助。」須文蔚說,從創意發想、熱血實踐、再加上科技的臨門一腳,讓偏鄉的成員不再單打獨鬥,彼此有了連結,成為榮耀的共同體。DOC 替偏鄉導入的科技也與時俱進,像是使用 3D 列印建模,製作具地方特色及 Logo 的商品;近期也運用網路視訊電話,號召十多名志工,每天上線陪獨居老人聊天,「一開始大家很尷尬,但一年多下來,視訊成了日常,老人家也習慣科技結合人性的陪伴。」

儘管在偏鄉已有豐碩成果,但須文蔚坦言,數位包容仍有許多困境必須克服,例如科技的導入涉及跨部會的整合,遠距醫療、電子支付,都待進一步解套。「高齡的月琴阿嬤十多年前就來跟我們學電腦,一路在社區工作上陪伴我們成長。兩年前,她身體不適,請村長載她到市區看病,一個多小時的車程說說笑笑,沒想到抵達醫院不久就過世。」須文蔚說,偏鄉往返醫院的成本極高,遠距醫療若能普及,早期治療與預防,這樣的悲劇或許可以減少。

瑞穗 DOC 最認真的資深學員月琴阿媽能用滑鼠畫出美麗的蝴蝶。Photo Credit:須文蔚老師

面對疫情 餐飲小商家需要數位包容的保護傘

數位包容的範圍並不限於偏鄉,即使在城市中心,也可能面臨不平等與差距。過去兩個月,全台三級警戒,首當其衝的小型餐飲店家。相較大型業者,它們更缺乏資源來因應突如其來的疫情衝擊,例如原料採購成本提高,就使得小商家更顯弱勢。為弭平差距,透過共同採購、成本分攤、借重數位平台的雲端廚房,或許可成為選項之一。

中央廚房連線全台 19 個衛星廚房 Just Kitchen 提高美食製作及遞送效率

Just Kitchen 便是台灣首家雲端廚房業者,創始成員均來自台灣,憑藉代理國際餐飲品牌的經驗,將原本的中央廚房改裝,結合 AI、大數據、銷售分析,成立了雲端虛擬廚房,於去(2020)年 3 月開始推廣。Just Kitchen 行銷長 John 指出,所謂雲端廚房,就是純粹製作外送餐點,透過流程簡化及共同採購等各項優勢,打造更有競爭力的商業模式。

科技部門及大數據部門 餐飲商家進入市場 快速無痛且精準

除了經營自有代理品牌如 Fridays 的外送餐點,Just Kitchen 也與傳統業者如鬍鬚張、大三元攜手,替品牌設計適合外送的菜單,協助轉型擴大客源;未來更不排除與小型業者合作。營運長 Kent 指出,Just Kitchen 內部成立了科技部門及大數據部門,前者協助餐飲業者快速上線、有效執行營運 SOP 如庫存及管銷等;後者則分析人口特性、手機使用習慣、不同族群的喜好,以便更精準觸及客戶群。

以滷肉飯商家為例,在疫情衝擊下必須從原本的內用模式,快速無痛轉型至外送,即可借重雲端廚房。「我們替品牌業者全新設計外送菜單、採購食材、烹調製作、上架宣傳,再分潤給品牌夥伴。」Kent 指出,雲端廚房可協助既有品牌快速轉型、也能降低新品牌進入市場的門檻,還能將地方美食向外推廣到不同區域。

虛擬廚房界成長最快速的 Just Kitchen ,創始成員左至右分別是:策略長劉揚、營運長吳得暉、執行長陳星豪、行銷長游竣文、資訊長林效誠。Photo Credit:Just Kitchen

台灣美食揚名國際 寄望雲端廚房

日本的壽司、義大利的 Pizza、泰國的 Patai,都是不分國界朗朗上口的美食;台灣目前除了珍珠奶茶,尚未出現國際級的代表性美食。Just Kitchen 行銷長 John 指出,台灣的美食如此多元,卻不具備足以匹配的全球知名度,相當可惜;因此 正在計畫將牛肉麵、滷肉飯等推向國際。Just Kitchen 在台灣及香港的雲端廚房已經上線,未來還有美國、菲律賓、新加坡即將開站;有朝一日,台灣的一個小小店家,或許也能藉由像 Just Kitchen 這樣的平台,揚名全世界!

不遺漏任何人的數位包容島

不論是 DOC 運用科技推動資訊教育、地方創生、農村商機、文化紀錄,抑或是 Just Kitchen 雲端廚房為微小企業帶來的新希望,都與聯合國亞太經濟社會委員會(ESCAP)在今年三月提出的疫情報告《因應新冠疫情:不遺漏任何國家》,相互呼應聯合國數位政府永續目標 — Leave no one behind,檢視最脆弱的社會部門,並透過加強區域合作來改善。

以台灣的科技產業強項,再結合多年來政府與民間攜手在數位包容工作上的創意與經驗,相信並期待種種在台灣「Leave no one behind」的嘗試與成果,成為台灣貢獻國際社會的有力切入點,當在地的數位包容經驗走向國際,台灣也更能被世界看見。

行政院科技會報辦公室 廣告