發表文章

目前顯示的是有「software engineer discipline」標籤的文章

來至通達人的回響

我在一個多月前, 寫了一篇帶新人的感想 , 讓程式碼像閱讀故事一樣容易 今天收到同達人的回響, 他針對我的論點, 衍伸許多深入的想法與精闢的論點 Code是寫給誰看的? 1/4 專業的Programmer Code是寫給誰看的? 2/4 關於課程安排 Code是寫給誰看的? 3/4 關於團隊合作 Code是寫給誰看的? 4/4 關於程式原理 很感動, 也讓我想了許多自己學習程式設計的過程, 認識我的朋友都大概知道我的背景是機械, 而不是資訊科學, 也不是資訊工程, 也就是說, 我並沒有受過完整的軟體設計, 與軟體工程等教育訓練, 我開始回想, 我是從那時候開始注重我的程式設計風格? 我最遠可以追溯到我念高二開始學習Basic那段日子, 從高二開始, 學校安排一個學期的Basic課程, 每週大約兩個小時, 老師先講解Basic程式設計語言的原理, 然後開始出一些簡單的作業讓大家回去練習, 當時的作業其實很簡單, 大部分都是邏輯訓練, 例如如何利用迴圈列印出像保齡球排列的圖型, 或是做一些檔案的I/O處理, Input/Output , 看似很簡單, 其實卻殿定我往後的基礎, 當年要教作業可是很有成就感, 因為能正確將老師的題目做出來的沒幾個, 但是我可是每道題目都是自己寫, 並上機將結果列印出來, 就在有一天要交作業的前一天, 我看到一位同學(楊松岳)也將作業列印出來, 並很認真在看老師還沒教的Basic章節, 我跟他哈啦一下, 並交流一下心得, 他告訴我, 他已經將整本的Basic K完了, 我當時很驚訝, 他說Basic實在很好玩, 所以他一口氣就將Basic的教科書 K完了, 我問了他幾個問題, 他總能很快回答我, 他告訴我他新的發現--DOS, 他發現Basic只是Basic, 最好玩還要了解DOS的原理, 我當時頗為震撼, 班上還有這一號人物, 而且他的成績並不是很出色, 但是玩電腦確相當有一套, 我們開始分享自己寫的code並互相討論是否還有更好的程式寫法, 他看了我的code總能指出這樣寫太沒效率了, 為什麼回圈一定要從0開始, 有些狀況從Maximum開始也不錯, 我想那應該是我最早的Code被Review的經驗, 所以我從那時候開始寫code就有被檢視的心理準備, 就像畫家畫一幅畫要接受大眾評論一樣. 當我踏入職場, 礙於所學非資訊, 礙於三...

解Bug的經驗分享

圖片
經過4天的奮鬥, 總算把解封包演算法的Bug解決, 分享一下長久一來我的解Bug經驗, 雖然我還稱不上什麼武林高手, 但是這些經驗幫我渡過不少難關, 應該頗具有參考價值 當Bug出現的時候, 先使用Bug資料庫, 或是Issue Tracking軟體新增一個Bug. 我記得剛開始寫程式的那幾年, 遇到Bug, 第一件事就是先跳進去Source code 看問題到底出現在那裡? 但是往往Bug還沒解完, 其它事接踵而來, 開會,等等的中斷, 當思緒已經快想出問題的解法, 確因為"中斷"造成下次再接下去解Bug的時候又要重來. 所以先在Bug資料庫新增一個Bug, 看似很簡單, 但是這個習慣確是我工作兩三年後才養成的習慣. 勤寫Bug Comment 將心中對於Bug會發生的所有可能性記下來, 當思緒打結的時候, 將目前的進度與結果做個記錄. 這些記錄寫在資料庫中所建立的Bug是最好的. 以我解Bug的經驗, 每當遇到很棘手的Bug, 心中總是千頭萬緒, 不知從何下手, 在這思考的過程中, 沒有將思考的結果寫下來, 最後很容易陷入"思考的迷宮" , 思緒一直在繞圈圈, 走也走不出來, 但是有做記錄, 雖然會花一點時間, 但是確可以review自己的思路, 很快就可以找到出路. 善用Log message 例如 Java 的log4j , Object-C的NSLog. 如果是寫底層的device driver也是有對應的log utility. 使用Log也要有一些技巧性, 我的經驗是, 先將source code好好看過一次, 然後在可疑處下Log, 然後從console看Log是否按照自己所設計的邏輯顯示出來. 如果是Fat client程式 而且沒有具備通信功能, IDE的source level debugger就夠用了, 但是目前的程式幾乎都具備有通訊功能, source level dugger在解決realtime的訊息就略顯不足. 使用第三方工具驗證 當解Bug陷入膠著, 通常我會找其它功能正常的工具來驗證, 這種情況在寫DLL, Library或是framework常遇到, 例如我在解通訊程式的封包問題, 我可以先找已經可以正常工作的第三方軟體, 觀察正常的封包到底是長什麼樣子, 不過 這有點像是在做逆...

寫通訊程式/Driver的痛苦

圖片
最近在寫一隻iPhone的小程式, 有網路通訊功能, 一開始都很順利, 心中頗為得意, 但是昨天卻踢到了鐵板, 解出來的封包有時候是對的, 有時候卻是錯的, 這時候只好去Trace底層的封包資料結構, 上圖就是, 你看的出這是什麼東東嗎? 說真的經過5~6小時的奮鬥, 我到10分鐘前才掌握出其中資料結構所代表的意義, 也許你會說, 怎麼沒有定義封包格式文件? 這是一個OpenSource的Library ,source code就是文件:-), 所以只好一個byte一個byte把它Dump出來與程式的解碼演算法比對, 以逆向工程來解讀封包的資料結構. 我以為遠離Driver工程師後就不用再去做這樣的事, 但是顯然只要不脫離寫程式的工作, 這種問題隨時會出現. 只好認命一點吧!

您還在使用研發記錄簿嗎?

一篇關於研發記錄簿的想法 , 讓我想起多年前進入一家做衛星接收器的一家公司的工作經驗, 我進入的第一天, 人事主管就給我一本研發記錄簿, 並跟我說明老闆每週都會抽檢, 而且離職的時候要交還歸檔, 在我離職的時候, 裡面確實記錄不少我所開發的軟體所遇到的問題與解法, 甚至還包含一個Windows Device Driver的原理與如何編譯的筆記, 過沒多久, 遇到以前的同事, 他告訴我, 公司的一些Device Driver後來改外包了, 因為後面的人還是接不起來, 我突然想起那本研發記錄簿, 裡面我可是很忠實的記錄Driver的開發流程, 怎麼會接不起來? 但是我很懷疑公司是如何處置我的研發記錄, 是不是鎖到某個櫃子永不見天日了? 寫到這裏, 又想到另一個親身經驗, 前年突然接到一通電話, 問我有沒有興趣接USB Scanner的Driver開發, 一問之下, 原來是以前同公司的老同事, 當年待的那家公司早已改組改做DRAM模組, 但是還有一小組在接Scanner的ODM , 我想起當初那家公司可是有過ISO 9000/9001的公司, 而且公司有一個很大的文管中心, 所有研發記錄, 與Source Code最後都要歸檔到文管中心, 如果有這些資料要開發新的Driver並不難, 所以問題是出在那裡? 人才很多, 我並不認為找不到人做, 如果經驗是有透過某種形式儲存, 要傳承並不難, 知識管理系統雖然有, 但是那些知識卻像一灘死水一樣, 無法重複使用, 例如Source Code有歸檔, 但是確無法Build, 原因出在工程師只將Source Code燒在光碟片交出去, 但是卻沒有記錄要用那個版本的compiler來build ? 或是要再安裝Third party library才能成功Compile, 其實這樣的潛在問題每一家公司都有, 沒有爆出問題, 是因為都有相對的"人"在處理, 但是人員的離職, 交接的不完全, 問題就慢慢出來了. 解決之道? 其實我覺得可以借鏡OpenSource的開發模式, 其實我認為OpenSource 雖然組織很鬆散, 可是卻沒有知識流失, 或是知識斷層的問題, 你會發現OpenSource的團隊分享文化, 其實間接的解決這種問題, 而且OpenSource的成員分散在各地, 於是更能善用Issue ...

永別了! Randy Pausch

圖片
Link from CMU Randy Pausch's information

讓程式碼像閱讀故事一樣容易

這是我昨天在Review一位公司新來的Programmer所下的註解, Well, 套一句以前一位美國同事Erik的話, 他寫出來的code像是 spaghetti 一樣, 我將他的程式重新寫一遍, 然後讓他比對我的程式和他的程式不一樣的地方, 讓他了解寫出來的code不僅要自己看得懂,別人也要可以看的懂--> 這是一件很重要的事 , 他告訴我學校的教授沒有教這些知識, 原來教授自己也不怎麼寫程式 , 剛好最近看完了 蘭迪.鮑許教授的最後的演講 , 其中有談到蘭迪所主導的一個計畫 Alice , 透過3D的動畫設計程式來學習程式設計 Alice is an innovative 3D programming environment that makes it easy to create an animation for telling a story, playing an interactive game, or a video to share on the web. Alice is a freely available teaching tool designed to be a student's first exposure to object-oriented programming. It allows students to learn fundamental programming concepts in the context of creating animated movies and simple video games. In Alice, 3-D objects (e.g., people, animals, and vehicles) populate a virtual world and students create a program to animate the objects. In Alice's interactive interface, students drag and drop graphic tiles to create a program, where the instructions correspond to standard st...