賀再就職滿一年與工作回顧
算一算,我到目前公司就職的時間滿一年了。回顧我那常態性失業的歷史,待滿一年真是可喜可賀。我原本以為那些與我同時期報到的同事會待得比我久,沒想到他們反而都比我早離職換公司,就我一個還留著。我待過三間軟體開發公司,雖然內部文化不同,但軟體開發人員的流動率都是那麼地快。至於我本人,大概是因為我太懶,也不指望軟體業有什麼前景。反正去那都一樣,既然這間公司不資遣我,我便懶得換環境了。
在這一年中,我負責了大約七項工作,以及一些零零碎碎的小工作,使用了七種程式語言。如果在一間大公司大團隊中,這種情況或許並不奇怪;但若只是我一個人負責,這種經驗應屬罕見。各程式語言的比重分配如下所列,0.5件的項目表示在一個項目中混合了兩種程式語言。
- C 語言 : 1.5 件.
- Vala : 1 件,混合 C 語言。
- Java : 1 件,使用 spring framework.
- Python : 2.5 件
- PHP : 1.5 件,開發 WebAP。
- JavaScript : 1.5 件,開發 WebAP。
- Ruby : 1 件,使用 Ruby on Rails 。
開發經驗未傳承
這些工作都是我獨力完成,公司內沒有其他人參與;換言之,其他人並未在工作過程中得到在 Linux 平台使用 C, Python, Ruby, Vala 等工具開發軟體的經驗。
使用 Java, PHP 完成的項目也就罷了,相關人手很好找。使用 C, Python, Ruby, Vala 等工具開發的項目,要找人接手就很難了。雖然我曾提議透過結對編程(pair programming)的工作方式,讓其他人從中學會那些開發工具的使用知識,但公司人手不足,始終做不到。人員流動率高也是原因之一。日後若要換人接手這些工作項目,顯然很困難。
或許有人會質疑,為何不採用單一開發工具,例如全部用 Java 來實作這些工作。但在 Linux 平台上,想要用 Java 開發工具吃下所有項目是不切實際的想法。因為有許多軟體或硬體設備,在 Linux 平台上只提供了 C/C++ 語言的 SDK ,而沒有 Java 的 SDK ;並不像 Windows 平台,幾乎所有軟硬體設備都會備妥多種語言用的 SDK 。用 C 語言包下所有項目倒還可能,但精通 C 語言與 Unix 系統程式設計觀念的程序員難以養成,也形成了一個進入障礙。
例如我負責的其中一個工作項目,原本是外包給協力廠商進行的。由於該工作項目操作的硬體設備只提供了 C 語言的 SDK ,所以外包商也只能用 C 語言去寫。但他們的開發團隊過去的經驗只有 C#/.Net ,並不熟悉 C 語言與 Linux 系統程式設計觀念。於是他們投入了兩個人力與半年工作時間之後,得到了一個完全不能用的結果。最後這個工作才移交給我,由我一個人重新設計與撰寫程式,花了兩個月時間完成。《人月神話》說最好的程序員和最差的程序員之間的工作表現比率約 5:1。這個項目是12個人月比上2個人月,顯然很接近。
再說,公司內還有其他人在做其他不同項目;光我一個人就使用了七種不同技術項目。以公司規模來看,這種情況顯示整個開發團隊要掌握的技術項目太多了。公司很清楚這種情形不能持續下去,有意收縮技術範領域,並就此詢問過我的意見。我的看法是放棄桌面應用軟體,聚焦於 Linux 系統程式以及 Web AP 兩個領域。就我個人的經驗來說,這兩個領域是共通的,都是「伺服端的程式開發工作」。
Linux 系統程式開發組
綜合我這一年的工作經驗,我認為從事 Linux 系統程式開發的程序員,至少要掌握三種程式語言。第一重要的是 C 語言,作為 Linux 的母語,它的重要性毋需多提。
第二重要的則是 Python 。在以往,第二重要的語言或許是 Perl 。但近幾年來,Python 程式碼的普及率早已經超過 Perl 了。在 Linux 桌面應用程式中,使用 Python 開發的軟體數量僅次於 C 語言。除了普及率外,還有兩個選擇 Python 的理由。其一、Python 比 Perl 易學與易讀。其二、Python 易於結合 C 語言的函數庫。我先前負責的一個工作項目,就是用 Python 的 ctypes 結合合作廠商的 C 語言函數庫,進行開發工作。
不論是開發應用軟體或是取代 Shell Script,Python 都是比 Perl 更理想的選擇。但我前陣子參加 ICOS 2010 研討會時,我發覺國內使用 Python 的程序員比我預期地少很多,實在令我感到意外。
第三重要的則有兩個候選人,一個是大家熟悉的 Java ,另一個是新興的 Vala (請參閱 Vala 程式語言入門)。
雖然 Linux 環境中,比較新的軟體項目與特殊的硬體設備通常不支援 Java ,但常見的軟硬體項目還是找得到可用的 Java packages 。而且國內很容易招雇 Java 程序員。Java 在開發純業務性軟體時,有豐富的資源支持。但愈接近系統層次的軟體項目,它的優勢就愈少。
另一個候選的 Vala 則有異軍突起之勢。它採用 C# 的語法,擁有 Java 的優點,卻沒有 Java 的缺點。我實際採用 Vala 完成了一個工作項目。在過程中我發覺比起 Java ,Vala 在 Linux 系統程式開發的領域中具有更大的優勢:一、更易於結合 C 語言函數庫;二、更快的效能,因為它執行的就是 C 語言編譯出的二進位碼,而不是透過 JVM 解譯的 byte code。
Web AP 開發組
考慮到國內的情況,JavaScrip 與 PHP 幾乎是必要掌握的程式語言。更細分的話,JavaScript 是共同項目;而服務端除了 PHP 以外, Ruby on Rails 也應予以重視。
JavaScript 的使用者非常多,甚至有人說它是全世界最多程序員會用的程式語言。不幸的是,它也是最容易被誤解的程式語言。有許多聲稱會寫 JavaScript 的程序員,學得都是錯誤觀念,需要重新認識JavaScript。
PHP 除了是熱門的 Web 服務端開發工具,也是好的 script 語言。在很長的一段時間裡,我個人就是用 PHP 取代 Shell Script; PHP 在這方面的表現並不比 Python 與 Perl 差。在一個以開發 Web AP 為主要工作的團隊中,他們完全可以 PHP 替代 Python 、 Perl 或 Shell Script。
日起有功
不論你用什麼程式語言,都必須學好作業系統概論以及至少一種作業系統的實作內容,例如 Linux。把《POSIX Programmer's Guide》瀏覽一遍也是不錯的功課。因為我幹過這種事了;附帶把另一本綠皮的《POSIX.4 Programmer's Guide》也看過一遍了。
軟體開發沒有銀彈(至少目前還沒有)。但不論你用什麼子彈,你都要紮實地練好射擊技術才打得中目標。
樂多舊回應