Skip to main content

平常人都能掌握的Programming 原則

· 7 min read
Gordon Lau
Software Engineer & Programming Instructor

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

Visual Studio Code

軟件工程原則有許多,一些編程界奉若聖經的名作例如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)也是同一原理,將所有密碼都存放到密碼管理員 之中,使用時只需要輸入密碼管理員本身的密碼,就能夠讀取不同的密碼了。LastPass及Keepass都是密碼管理員的例子。

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

緊跟慣例​

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

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

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

Tecky_Academy_20190129_report.doc
# vs
report.doc

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

Tecky_Academy_2019_01_29_v1_sales_report.doc

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

分而治之​

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

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

Divide and Conquer

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

Source

後話​

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