程式設計師的尊嚴

昨天晚上, 仔仔的一個朋友打電話給我, 問我如果他想成為一個程式設計師, 除了寫程式的修為之外, 還有什麼必須要注意的. 這位朋友原本是在Mac 平台下一個相當強的美工人員, 有多強呢? 他一張圖的價碼大約是我半個月的薪水! 大約半年前仔仔打電話給我, 說要介紹個朋友給我認識, 於是就這麼認識他了. 當時他因為對美工繪圖開始感到無力感, 據他所說, 是沒辦法讓自己再進步了! 而甚迷Palm的他在偶然的機會中, 認識一位專門寫Palm應用程式的hacker, 從此對程式設計產生興趣, 於是便毅然決然的轉業. 他先花了半年的時間參加台大資工的進學班, 學習C/C++ 語言, 半年到了, 他應徵上一家作資料庫backend 的公司.

這樣的問題, 對我來說真是大哉問, 在和他閒聊之中, 我一直在想著到底有什麼是很重要的? 我電話中沒有回答他, 因為我也不甚了了. 但是掛了電話後, 一邊寫著Java的我就回憶起了一個想法: 程式設計師的尊嚴!

那也是往事了(怎麼最近老想起往事?) , 當時我剛開始接case時, 大概第二個還是第三個吧! 我被assign到另外一個前輩底下, 作一些比較核心的規畫. 當時因為時間很敢, 於是程式也寫的亂亂的. 有次這位前輩到淡水拜訪朋友, 順便到我這邊看一下我的進度, 當他看到我的程式碼時, 他問道 “這程式有些亂, 你必須要花時間改一改” , 我告訴他, 時間來不及, 我只能專注在能不能跑跟有沒有問題, 或許不會有空去琢磨這些枝微末節的事情. 平常風趣的他扳起了臉孔, 嚴肅的說 “你不能喪失一個工程師的尊嚴啊!”, 當時我只覺得他小題大作, 商業的東西, 賺錢的東西, 幹嘛去計較這些呢? 能run 就運氣好了.

接著我又想起了只是前陣子發生的事情. 當時我要研擬一個solution, 把現有已經完成80% 的某專案, 加入一個我早先寫好的module, 並且趁這個機會去research一下embeded module的模式跟規格. 當時我找了負責這個案子的核心工程師, 請他吃頓飯, 順便跟他請教目前的class/module狀況, 以便我能夠套用整體系統的資源, 並且能更緊密的結合. 讓我感到很訝異的是, 這位工程師雖然程式寫作的速度跟技巧都不算公司的頂級, 但是他寫的東西井然有序, 在沒有cvs 管理下, 光看註解和source, 就可以看出整個研發過程所碰到的問題. 並且他替每個source附上一個流程圖和更新沿革, 看他的程式碼雖然會找到很多不是這麼合適的寫法, 但是整體來說, 他寫的東西我相當好應用. 我相當佩服他的認真與專注, 衷心的請問他怎麼在時間緊迫跟產品壓力下依然如此的遵守規格. 他只說了 “這是工程師的本分, 不是嗎? “

於是對這位朋友, 現在我有答案了! 答案就是, 維護自己身為程式設計師的尊嚴!

尊嚴不是指面子或是什麼的, 而是指身為某個身份而讓自己為這種身份感到自豪與驕傲的特質. 守住這種特質, 就守住了自己的本分, 自然而然的, 就會在本職上受到他人的尊敬.

於是我想到自己, 想到同事們, 想到大家, 真是替自己感到羞愧! 原來, 我根本還是個不成熟的工程師啊! 貪快亂寫, 試誤除錯, 缺乏註解和文件, 圖方便模仿別人的source code….etc, 真是汗顏!

技術迷信

最近的周邊有很多出人意料狀況出現, 第一個是某學弟堅持要用ASP 寫出一整套的EC平台, 雄心壯志的要包含Payment 機制, 包含後端金流跟物流的管銷. 他找上我詢問關於RAS 上的API 實作跟資料交換的安全性問題. 我先是很簡單的就我所知道的部份跟他作了解釋, 然後順便問了一句, 為什麼選用ASP 呢?

他說, 因為在ASP 上, 什麼需求元件都有solution了啊!

我心中一陣酸楚, 這不就是幾年前的我嗎? 接著又是一陣冷汗, 這會不會是幾年後的我看現在的自己呢?

現在也才慢慢感受到, 這個行業中, 技術迷信是一件很恐怖的事情. 科班出身的人, 在學校學了整整四年(或以上)的C/C++ , 熟悉OOP , 也熟悉了資料結構和演算法. 但是這樣子的人才真的可以適其所用嗎? 其實很難! 有個很淺白的例子, 有次作某新聞社的案子, 他們需要有能夠failover電訊傳遞系統, 也就是說, 必須有兩台server, 其中一台待命中, 當主要機器資料無法傳遞進來時, 主機器會給副機器一個signle, 讓副機器用另外一種方式去抓取資料; 當主機器復原時, 副機器要有辦法停掉讓主機器繼續運作. 熟悉網路的人, 幾乎都會選用兩方作socket通訊的方法, 而科班出身的人, 不但會選用socket, 還會規畫protocol, 寫white paper ,然後搬出RFC 的sample code 開始硬底子寫FSM 的server端, 寫select的client端….這些種種都看起來正確, 結果一個很資深的工程師的意見是

“直接用Perl的libwww走80 port溝通就好了….”

多麼直覺的解法! 我相信一定有很多人會嗤之以鼻, 不過這位資深工程師可不是不懂這個喔, 他可是有底子有能力的人. 為什麼一個有底子有能力的人會作這種的決定呢? 有次我私底下問他, 他說工程師不能流於技術迷信, 選擇好工具去做適合的事情才是工程師的正途.

這只是一個例子, 卻可以涵蓋很多部份. 最近各大ASP 公司都在走purejava的路, 動輒JavaBeans , Application Server等等, 但是深究來看, 拿這些東西作的事情都不是Java或Beans 的主要用途, 反而是給這些工具作不適當的應用, 換句話說, 好比拿著菜刀剪指甲一樣.

同樣的情形也發生在backend 的選用上, 有人知道Oracle好, 就一味的認為只要用到資料庫, 就是用Oracle, 但是太多的例子根本不需要資料庫, 或者用其他功能較少卻更快速的東西就能完成. 這樣的狀況層出不窮, 多不勝舉.

技術迷信不單只是白做許多不需要做的工, 白花許多不該花的時間而已, 更可怕的是在IT產業的發展偏執! 用不適當的工具可能會產生更多危險跟效能上的低落,進而影響到同事間或是同業間的競爭力.

所以, 我只能說, 選擇適合的工具做適合的事情, 會是身為IT工程師的必備能力. 解MIME用C/C++ ? 作multithread 用Perl? 作Data Mining 用Java? 寫EC平台用ASP ? 這些都會成為笑話….

多方瞭解各種工具, 才不會成為技術迷信的鐵齒工程師….