iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 30
0
自我挑戰組

再戰軟體工程系列 第 29

『逃不了就面對,打不贏就加入』 -- 論持續集成交付與自動化

前言

以前唸書時,跟幾位化工所的朋友特別要好。當時曾經問過他們,所謂的『化學系』跟『化工系』難道不是一樣的東西嗎?得到的回答是:『化學注重的是化學本身,化工重視的是化學工業生產過程中,從原料到成品中間的所有製作的工程。』那時的我有聽沒有懂,因為在我的世界裡,『資訊工程』就是寫程式,頂多學學演算法或DSP等數學理論,什麼工程不工程的,我可是一點概念都沒有。

出社會,待了幾間老外開的軟體公司,這才知道,所謂的『軟體』,跟『軟體工程』根本就是兩回事,寫了好的軟體,在現代的資訊業界根本就是基本功中的基本功,把軟體生產的『工程』做好,那才是學問。然而跟幾位同在業界的同學聊天,才知道,在台灣的業界,雖然能做世界頂尖軟體的公司很多,但是能夠做到流暢的『軟體工程』的卻是少之又少。要不,就是自以為自己流暢,然後靠著基層員工加班賣肝,創造出一波又一波的經濟奇蹟,aka國民生產毛額。重點這些勞工還蠻自願的...

不過關於勞工自願過勞這件事,不是本文重點。那是完全另外的故事了...

醒醒吧,你的肝根本不值錢

我想說的是,你是否在日復一日夜復一夜的加班賣肝過程中,抱怨為什麼明明外面的世界已經有很多方便的工具,先進的技術,老闆和主管卻依舊強迫我用20年前的技術與程式風格硬刻,不准我求新求變?答案很簡單:『They don't care!』雖然殘酷卻很真實。沒別的,既然20年前那一套幫助公司成長茁壯到今天的地位,那他有什麼理由非變不可?你的心情和肝指數,根本就不是公司的營業目標。培養出聰明又方便工作的環境,對主管的KPI一點幫助都沒有,反正每年每年資工系畢業宅男多如過江之鯽,你的肝根本就不值錢!

做好自動化,遠離肝硬化

於是,不要再死腦筋了,我不是說好的軟體工程不重要,而是你不要再傻傻的坐著等公司哪一天頓悟後開始推動了。記住,好的持續集成與自動化,不是為了公司著想(雖然公司也會因此得益),而是為了拯救你的肝(還有腦神經)!

痛苦的事,就讓他提早發生

好,我們知道要為了自己做好持續集成與自動化了,那我要從哪裡開始?Well, ...
這個問題你要問你自己
怎麼說呢?首先你得先想想,在你的日常生活中,什麼事讓你感到最痛苦,痛苦的事,就讓他提早發生。舉個例吧!這是我見過的實際案例。

在筆者曾經待過的某個團隊裡,用的是git flow管理分枝,用了一段時間,同事發現奇怪,每次在feature branch上都運行得好好的,為什麼每次一回到develop,光是merge就讓人頭痛!就有人質疑了:『是不是因為git不好用啊?』嘖...

『哇哩咧,你才不好用,你全家都不好用!』

了解後才知道,該團隊每次開出去的branch都有至少一個月的壽命,長壽者甚至可以活超過半年!天啊!那當然不好用啊!所以我們後來就規定,feature branch壽命最多不可以超過一週,太長壽的branch就代表任務的粒度太大,必須得拆成更小的任務。目的就是要讓痛苦的merge過程『頻繁、小規模』地發生。如此一來,每次的主線更動程度,才能控制在可預期範圍內,把風險降至最小,痛苦指數降到最低。

越具風險的事,就要越常做

再舉個例子。
舉個例子示意圖

在正式環境部署,向來都是張力高並且有風險的。尤其是當你這次的升版有大幅度的修改的時候。怎麼辦?請注意,現在是21世紀,我們還是要盡量用21世紀的思維來思考。還記得我們git flow的故事嗎?一樣地,這種有風險的事,就是要頻繁地做。怎麼做?

想個辦法把過版的流程整理成幾個腳本,然後每次過版都只執行這些腳本,並且嚴格禁止在正式環境上做任何手動操作,然後提高過版的頻率,讓版本與版本之間的功能差距縮小。『那多危險?萬一腳本錯了怎麼辦?風險豈不更高?』非也,非也。正是因為腳本錯了就會造成很大的風險,才要每次都用同一套腳本去執行。

試想,你自己的名字你從小到大寫過這麼多次,還會寫錯嗎?OK也許會,但總是比起每次都寫不同的名字還要熟練許多吧?也就是說,每次執行正式環境過版時,那個腳本早就已經被驗證過幾百次了,正確性肯定比手打指令來得高多了。也許還是可能會有打錯指令的時候,但是你想,『是打一行永遠固定的指令容易錯,還是打10~15行每次都不太一樣的指令容易錯?』不然,你看當初唐伯虎怎麼靠著那幅臨時畫的『春樹秋霜圖』騙過寧皇?還不是就靠著畫過幾百次的熟練度?
畫過幾百次,熟得很示意圖
更何況,既然是腳本,那一定也可以執行檢查的指令吧?腳本可是不會累也不會帶感情的,他也不會因為跟你有私交就幫你掩蓋新版程式無法啟動的事實,一旦執行後有任何錯誤,看你是要叫他停下來還是要回朔,任你決定嚕!腳本你寫的嘛。至於腳本能不能越來越精進與安全...

這,就要看你『持續改善』的功力了...

吾道一以貫之

由此可知收個知心的徒弟多重要。你看,曾子就很瞭他的老師,夫子一講,他馬上就懂了:『夫子之道,忠恕而已矣。』前面講這麼多屁話,舉了例子,也講了理論,其實重點只有一個:『越是痛苦的事,就讓他提早、頻繁地發生。』原因很簡單,人會出錯,人會累,也會害怕。

為什麼害怕?因為未知。對於大幅度的變動,以及不熟悉的事物。人多多少少會感到害怕,這是很正常的。於是,即便現在有敏捷開發、DevOps、CI/CD等技術與討論,其實萬變不離其宗,就是希望在軟體生產的『工程』中,透過頻繁、小幅度的更動,降低風險,提高可控制度,甚至在有變化來臨時,提早掌握時機,轉變方向,消極者減少損失,積極者提高利潤。

不做,不會怎樣;做了,很不一樣!


上一篇
『珍惜生命,遠離波動拳』 -- 從壞習慣談程式可讀性
下一篇
終於完成了 -- 寫在完賽後
系列文
再戰軟體工程30

尚未有邦友留言

立即登入留言