平常人都能掌握的Programming 原則

 Gordon Lau 劉偉中

Gordon Lau 劉偉中

2019-01-29

大家會定時整理自己電腦中的文件嗎?大家看軟件工程師工作時,往往會發現他們的檔案總是井井有條,資料有條不紊地排列。難道學習軟件工程能使人變得 整齊?原因其實在於軟件工程師經常需要處理大量檔案及資料,因此發展出一套完整的工程原則(Engineering Practice),久而久之,就掌握了資料管理 的要訣。而如果平常人也掌握了這些工程原則,在日常電腦使用,其實也有不少好處。

visual_studio_code.png

軟件工程原則有許多,一些編程界奉若聖經的名作例如Pragmatic Programmer 或是Clean Coder 都舉了許多有用的例子,然而由於這些書籍以軟件工程師為讀者,對本身無編程根底的大眾,太抽象複雜。

因此,本文將會由以下四個工程原則開始,方便大家理解:

  1. 單一資訊來源 (Single Source of Truth)
  2. 緊跟慣例 (Stick to Convention)
  3. 分而治之 (Divide and Conquer)
  4. 簡潔為上 (Keep it simple stupid)

單一資訊來源

單一資訊來源(Single Source of Truth)乍聽好像很複雜,其實原理很簡單。也就是資料應該遵從以下原則:

所有資料,應以一個特定來源為準,目的在於避免重覆數據。其餘所有數值,都應由該單一資訊來源所計算或讀取。

舉一簡單例子,假設公司的產品A需要一份季度用戶報告,該季度用戶報告不應該需要額外儲存,而應該用每月數據、每週數據甚至乎每日數據所計算,使用Microsoft Excel的話,也就是每日數據應該存在一張Sheet之內,而季度數據則是利用每日數據,再用Formula計算而成。如此的話,縱然收集的數據不一定百分百準確,季度報戶與每日數據卻是始終一致。任何更改必然導致兩邊同時更改,大大減少錯誤的可能性。

另一個經典的單一資訊來源的例子,就是大家常用的Google Login或Facebook Login。此類Login可稱為Single Sign On(SSO)。在使用SSO之前,大家需要使用許多個不同的用戶名及密碼,變相需要同時管理大量的密碼,有時忘了密碼還要重置,使用了SSO之後,大家只要使用一個Google Account,就可以在很多不同的網站登入,省卻了麻煩的用戶管理。近來開始流行的密碼管理員(Password manager)也是同一原理,將所有密碼都存放到密碼管理員 之中,使用時只需要輸入密碼管理員本身的密碼,就能夠讀取不同的密碼了。LastPassKeepass都是密碼管理員的例子。

單一資訊來源與另一原則不重覆累贅(Don't Repeat yourself)相類似,為了令本文亦符合此原則,不贅。

緊跟慣例

緊跟慣例算是另一個易學難精的工程原則。所謂緊跟慣例,其實就是以下的原理:

不論是資料的內容、格式、命名等,都需要制定一個慣例(Convention),以後的資料都要跟據慣例去儲存。

其中一個經常被忽略的慣例,就是檔案的命名。平常大家改名的時候,往往會使用一些很短的命字,例如report.docupload file.img等名字,此 類名字簡單是簡單,但是名字太短,太無代表性,當檔案一多,就變得無所適從。因此,檔案名除了解釋該檔案的用途之外,最好還有附加的資訊,例如時間 、部門、負責人等。試比較以下兩個命名,那一個比較有代表性,比較不易重覆呢?

Tecky_Academy_20190129_report.doc
# vs
report.doc

上面的名字較長,資訊也遠比下面的命名要多。而日期20190129令檔案名變得唯一(unique),因此不可能出現重檔名的問題。 要更進一步,大家可以考慮製定一套編碼,編碼裏面就已經包含了大多數需要的資訊。例如以下的檔名,就包含了公司、日期、版本、用途等資訊。

Tecky_Academy_2019_01_29_v1_sales_report.doc

慣例當然不只檔名,所有行、列都應該有自己的命名原則,使後來者能輕易就能學會使用。

分而治之

分而治之概念上很簡單,實行卻不容易。分而治之的原理就如下:

嘗試解決大的問題,如果問題太大改變不了,就將問題拆小,再嘗試解決,還是解決不了,就再重覆拆細,直至問題足夠簡單,就能解決了。

divide_and_conquer.jpg

Source:https://www.tutorialspoint.com/data_structures_algorithms/divide_and_conquer.htm

例子就是如果數據太多,就應該將數據拆小至數個部份,直至能夠解決為止。分而治之的好處,在於很多時候當數量多到了一個地步,就會出現了數量少 時不會撞見的問題,例如將一個程式放到高負載的情況,就可能出現競爭狀態(Race Condition),此類問題,都是量少時不會遇到,將數據拆小,自然就 減少了此類問題。

除了拆小數據,將一個複雜問題按步驟拆開也是分而治之的例子,例如要使用Google Cloud Vision API作圖像辨識好像很困難,將整個問題拆為以下數步驟,整個問題就非常清晰:

  1. 建立一個簡單用戶界面的網頁,讓用戶可以選擇上載檔案
  2. 到Google Cloud Platform申請帳戶,啟用Cloud Vision API
  3. 生成使用Cloud Vision API的Access key
  4. 在網頁的Javascript裏讀取上載之檔案,然後發出一個HTTP請求至Google
  5. 得到從Google的HTTP答覆,將結果顯示於網站之中

每一個步驟可以組成整個軟件,而每一個步驟要做的事都很明確,因此將整個問題拆小,就將難度降低了。

簡潔為上

簡潔的重要性,相信大家都能夠理解,目的在於將我們的資料以最簡單的方法表達,以避免徒增不必要的複雜 性。喬布斯曾有一名言

Simplicity is the ultimate sophistication

大家儲存資料、管理數據時,應時時追求將數據以簡單的方法表達。如果無須使用Microsoft Excel本身功能 的話,使用.csv 檔案(Comma Separated file)比使用.xls要好,因為使用普通的檔案編輯器亦能閱讀,無需 試算表軟件。減低了不必要的依賴性(Dependency)。

simplicity.jpg

Source

後話

其實細心觀察,大概大家已經察覺到簡潔乃是大部份原則的基本信念,將事物搞得愈來愈複雜,絕不是軟件工程師 的目的。每一個工程原則出現,都是為了令事情變得更簡單、更易管理,如能夠時時活用此等原則,管理資料就無須煩惱 了。

留言

延伸閱讀

專家級新手

從「同朕check下」談中文科技詞彙

如何對治思維籠統

Online Course不能承受之輕

好Programmer是怎樣煉成的?