查看完整版本 : 平常人都能掌握的 Programming 原則

teckyio 2019-2-4 03:27 PM

平常人都能掌握的 Programming 原則

文章出處:[url=https://tecky.io/zh_Hant/blog/%E5%B9%B3%E5%B8%B8%E4%BA%BA%E9%83%BD%E8%83%BD%E6%8E%8C%E6%8F%A1%E7%9A%84Programming%20%E5%8E%9F%E5%89%87]https://tecky.io/zh_Hant/blog/%E5%B9%B3%E5%B8%B8%E4%BA%BA%E9%83%BD%E8%83%BD%E6%8E%8C%E6%8F%A1%E7%9A%84Programming%20%E5%8E%9F%E5%89%87[/url]

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

[url=https://asset-cdn.tecky.io/2019/01/29/5c500ed029b27visual_studio_code.png][img]https://i.>>><<</540/https://asset-cdn.tecky.io/2019/01/29/5c500ed029b27visual_studio_code.png[/img][/url]

軟件工程原則有許多,一些編程界奉若聖經的名作例如Pragmatic Programmer ([url=https://www.bookdepository.com/The-Pragmatic-Programmer-Andrew-Hunt/9780201616224]https://www.bookdepository.com/The-Pragmatic-Programmer-Andrew-Hunt/9780201616224[/url]) 或是Clean Coder ([url=https://www.bookdepository.com/The-Clean-Coder-Robert-C.-Martin/9780137081073]https://www.bookdepository.com/The-Clean-Coder-Robert-C.-Martin/9780137081073[/url]) 都舉了許多有用的例子,然而由於這些書籍以軟件工程師為讀者,對本身無編程根底的大眾,太抽象複雜。

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

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

單一資訊來源

單一資訊來源(Single Source of Truth)乍聽好像很複雜,其實原理很簡單。也就是資料應該遵從以下原則:
[indent]所有資料,應以一個特定來源為準,目的在於避免重覆數據。其餘所有數值,都應由該單一資訊來源所計算或讀取。[/indent]
舉一簡單例子,假設公司的產品A需要一份季度用戶報告,該季度用戶報告[b][u]不應該[/u][/b]需要額外儲存,而應該用每月數據、每週數據甚至乎每日數據所計算,使用Microsoft Excel的話,也就是每日數據應該存在一張Sheet之內,而季度數據則是利用每日數據,再用Formula計算而成。如此的話,縱然收集的數據不一定百分百準確,季度報戶與每日數據卻是始終一致。任何更改必然導致兩邊同時更改,大大減少錯誤的可能性。

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

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

緊跟慣例

緊跟慣例算是另一個易學難精的工程原則。所謂緊跟慣例,其實就是以下的原理:
[indent]不論是資料的內容、格式、命名等,都需要制定一個慣例(Convention),以後的資料都要跟據慣例去儲存。[/indent]
其中一個經常被忽略的慣例,就是檔案的命名。平常大家改名的時候,往往會使用一些很短的命字,例如report.doc、upload file.img等名字,此類名字簡單是簡單,但是名字太短,太無代表性,當檔案一多,就變得無所適從。因此,檔案名除了解釋該檔案的用途之外,最好還有附加的資訊,例如時間、部門、負責人等。試比較以下兩個命名,那一個比較有代表性,比較不易重覆呢?
Tecky_Academy_20190129_report.doc# vsreport.doc上面的名字較長,資訊也遠比下面的命名要多。而日期20190129令檔案名變得[b][u]唯一[/u][/b](unique),因此不可能出現重檔名的問題。
要更進一步,大家可以考慮製定一套編碼,編碼裏面就已經包含了大多數需要的資訊。例如以下的檔名,就包含了公司、日期、版本、用途等資訊。
Tecky_Academy_2019_01_29_v1_sales_report.doc慣例當然不只檔名,所有行、列都應該有自己的命名原則,使後來者能輕易就能學會使用。

分而治之

分而治之概念上很簡單,實行卻不容易。分而治之的原理就如下:
[indent]嘗試解決大的問題,如果問題太大改變不了,就將問題拆小,再嘗試解決,還是解決不了,就再重覆拆細,直至問題足夠簡單,就能解決了。[/indent]
[url=https://asset-cdn.tecky.io/2019/01/29/5c500ecf16b28divide_and_conquer.jpg][img]https://i.>>><<</540/https://asset-cdn.tecky.io/2019/01/29/5c500ecf16b28divide_and_conquer.jpg[/img][/url]

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

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

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

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

簡潔為上

簡潔的重要性,相信大家都能夠理解,目的在於將我們的資料以最簡單的方法表達,以避免徒增不必要的複雜性。喬布斯曾有一名言
[indent]Simplicity is the ultimate sophistication[/indent]
大家儲存資料、管理數據時,應時時追求將數據以簡單的方法表達。如果無須使用Microsoft Excel本身功能的話,使用.csv 檔案(Comma Separated file)比使用.xls要好,因為使用普通的檔案編輯器亦能閱讀,無需試算表軟件。減低了不必要的依賴性(Dependency)。

[url=https://asset-cdn.tecky.io/2019/01/29/5c500ecf9ce8fsimplicity.jpg][img]https://i.>>><<</540/https://asset-cdn.tecky.io/2019/01/29/5c500ecf9ce8fsimplicity.jpg[/img][/url]

後話

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

QQL0102 2019-2-4 08:24 PM

[quote]原帖由 [i]teckyio[/i] 於 2019-2-4 03:27 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=494422666&ptid=28016030][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
文章出處:[url=https://tecky.io/zh_Hant/blog/%E5%B9%B3%E5%B8%B8%E4%BA%BA%E9%83%BD%E8%83%BD%E6%8E%8C%E6%8F%A1%E7%9A%84Programming%20%E5%8E%9F%E5%89%87]https://tecky.io/zh_Hant/blog/%E5%B9%B3%E5%B8%B8%E4%BA%BA%E9%83%BD%E8%83%BD%E6%8E%8C%E6%8F%A1%E7%9A%84Programming%20%E5%8E%9F%E5%89%87[/url]

大家會定時整理自己電腦中的文件嗎?大家看軟件工程師工作時,往往會發現他們的檔案總是井井有條,資料有條不紊地排列。難 ... [/quote]

好實用的原則,唔單止電腦上用到,我覺得其它事情都用到的。多謝分享。

form5 2019-2-5 12:08 AM

呢類原則假如冇用 code 去解释 ,就好似 背武林秘笈,齊吹吾抹嘴,好似頭頭是道,實則內容空泛,浪费別人時間

[[i] 本帖最後由 form5 於 2019-2-5 12:12 AM 編輯 [/i]]

111x111=12321 2019-2-5 05:26 AM

我察覺到空泛唔係問題(哲學都好空泛, "可能"是人生智慧), 但內容好似唔對頭,
譬如好似初哥奶野後的忠告, 次點作重點, 講過龍, 隨時遇一普遍問題便此路不通.:smile_40:

alee001 2019-2-5 11:08 AM

從事創作嘅人係唔會受以上項目束縛...:lol

Hungk1h0 2019-2-7 10:52 PM

睇完覺得好似明但又唔明咁
頁: [1]
查看完整版本: 平常人都能掌握的 Programming 原則