你的濃湯好喝嗎?

這篇文章其實是半年前寫的,那時還沒開始用 blog,所以沒地方發表。最近整理檔案,才又看到這篇文章,就當作來新公司一年的回顧吧。

我之前上班的公司算是一個 startup,整個系統韌體是我和另外一個同學架起來的。就如同一般小公司一樣,我們一開始的目標當然就是把系統建起來,只要東西能動,其他都不在考慮範圍之內,像是 design documents, design pattern, refactoring…等一些屬於軟體工程範疇的東西,我們都沒有太注意,唯一有考慮的只有拿 JAVA 的 code conventions 來當做我們自己的 coding convention,其他的就是靠之前在大學時的訓練了。過了兩三年後,系統慢慢穩定了,公司也逐漸多了一些新的程式員,這時我才有時間看一些書,利用一些額外的時間儘量把程式修改的簡單明暸。我在那公司六年的時間,系統總共大修過三次。最近的這一次是改用 c++ 整個重寫,這期間我看了幾本我早該讀過的 c++ 經典書籍,對我助益頗大,而且重點是我第一次真正體會到物件導向應用在韌體開發時所展現的彈性,這對於一個小規模的韌體團隊去面對海量的硬體規格時有相當大的助益。可惜的是,這次重寫還沒完成的時候,其中三個主要成員有兩個就已經離職,包括我在內。我覺得這幾次大修讓我體會很多寫韌體時必須注意的問題,這其中我最大的感想就是,一個系統必須不斷不斷的被重新檢視,在可允許的範圍把系統不斷的修改得更好用、更堅固。而如果有一天整個系統的核心架構必須被改變以因應新的需求的時候,那也只能這樣做。很多人會選擇在原來的系統上東修西改,可是這樣不但工程師寫起來很痛苦,而且只是把事情更複雜化,將來除非整個產品作廢,否則總有一天你會面臨沒有辦法 patch 原有系統的時候,到時你還是必須一層一層的把東西剝開,而花費的精力絕對是原來的數倍。

不管是我前一份工作,或是我在學校期間接的案子,我的角色一直都是原始系統的設計者,中間當然也有需要去看別人的程式,但多半只是因為要使用別人寫好的函式庫,只要搞懂怎麼移植到我們自己的系統上就好,不太需要從根本上去了解原始程式設計的想法,像是 Linux 上的Ext2/3 原始碼就是其中一個例子。一直到我加入我現在的公司後,我才真正有機會去 trace 一個別人寫的系統,從檔案、函式和變數的命名習慣開始,一點一點去揣摩原作者的用意,然後再進一步到理解系統的框架和流程,直到最後可以在腦海中模擬程式跑起來時是怎麼樣的一個狀況。當然,完整的系統不是一個人可以完全搞懂的,所以我只能儘量熟悉我自己的這個模組,搞清楚它是怎麼和別的模組互動的。我至少花了半年以上的時間才勉強把其中的精髓抓住,但這個過程極其痛苦,主要原因倒不是因為系統設計理念很複雜,而是整個系統在實作的過程中沒有依據一些軟體工程的原則,導致我有一半以上的時間是浪費在搞懂一些莫名奇妙的程式碼上。我敢說如果能把系統好好的整理一下,在不更改原始設計理念的情況下把系統的門面重新修訂,對一個有經驗的韌體工程師而言,大概一個月就可以上手,而且對系統的認識也會比現在清楚許多。不過這個建議在一般企業裡面應該永遠都不會被採用,不過那就是另外一個話題了。

為什麼東西會這麼亂?故事是這樣的。

原作者是一群英國佬,我們公司把他們買下來後,交給外州的一個辦公室去根據這個系統來開發一個衍生的產品。本來聽起來是一個簡單的 case,可是沒想到花了兩年都搞不定,所以後來索性把整個辦公室給砍了,然後把這個案子轉到台灣的分公司。台灣分公司派一個 team 來美國六個月接手相關開發內容,沒想到這個 team 的成員因為不滿意管理階層的某些做法,全班人馬完成交接回到台灣後便集體辭職,所以後來只好再轉到馬來西亞的分公司。但是因為那個分公司的韌體部門才剛剛組建,有太多的問題他們沒辦法解決,於是後來迫於無奈,最後整個案子只好再轉回美國的總部,把大部分人力從其他專案抽來支援。可是如果總部的韌體部門自己人手也不夠怎麼辦?只好從外面找人了。於是我就是在這個時期加入的,同一時間加入的工程師少說也有十個人,所以你從這個過程應該可以感受到這個系統會長得怎麼樣。我覺得這些原始碼好像一鍋濃湯,每個負責的人嚐了一口之後發現味道不對,就往裡面加一些自己的調味料,英式的、美式的、台式的、東南亞的,什麼都有,每個人都希望加入自己的這個調味料後客人就會滿意的接受,可是卻都不在乎這個湯裡面究竟已經加了什麼東西,也不關心這鍋湯在加了這麼多的調味料之後到底還能不能喝,似乎只要這個湯看來是黃色的,我們就可以說它是玉米濃湯,而如果是紅色的,我們就可以說它是蕃茄湯…這就是為什麼事情會是今天這個局面…

廣告

About Weicheng Chu

創業中,微碧愛普科技 (www.weibyapp.com) 已婚, 有一對雙胞胎兒子, 現居住在美國加州、台灣台中
本篇發表於 軟體工程, 心情記事 並標籤為 , , , 。將永久鏈結加入書籤。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s