2010年7月3日 星期六

寫出爛程式的懷習慣

繼上次的 寫出好程式的好習慣後,也不得不寫一下我看到常見的壞習慣。

1 複製,貼上

複製,貼上是每位工程師每天至少做100遍上事情,但如果該習慣拿來寫程式,那就非常不妙。

記得大學時交作業,班上有一堆的同學把我的程式 copy 過去,改一改變數名稱,換一換行號,讓助教看不出來是出自同一個人的手筆後,就魚目混珠地交完作業。如此速成的習慣也發現在許多 programmer 上。

很多人只是想要儘快地完成功能,可以準時下班,因此當需求一來,就連想到哪裡有類似已實作過的地方,就快速地複製其程式(甚至一模一樣的程式)。結果,相同的程式就像病毒地以不可思意的速度擴散到任意的地方。這樣違反了 Don’t repeat yourself (DRY) 準則,類似的程式當然有類似的邏輯,這些邏輯一旦因需求變更而必須修改時,修改者會發現程式改不完,而且擔心是否有沒有改到的地方。

這樣的困擾會不斷地發生,而且通常會發生在「很有效率」的人。我之前也被稱為「程式快手」,也是這樣來的。後來,才知道是被同事取笑,「程式快手」,複製 bug 也很快。

現在這類的人,我的同事取為「程式貼貼師」。

2 把範例當唯一方法

首先,微軟的 MSDN 網站上有大量的範例,網路上也有為數不少的 sample。這些範例都是用來說明該類別\方法的使用方式,但未必適合使用在正式商業用途。例如Entity Framework 的連線方式,通常範例,如ObjectContext.SaveChanges 方法,使用

var context = new XXXModel();
// 使用 context 作一些 entity 的操作
context.SaveChanges();

只使用預設建構子來建立連線?不必使用多個不同權限等級的帳號連線到資料庫,就符合資料庫的安全設計嗎?當然不是。

為了讓資料庫更安全,我們通常會使用不同的帳號,存取不同的資料表/預存程序/View,當然需要不同的連線字串。範例只是為了示範如何使用該類別或方式的使用方式,並不會在每個範例上都符合安全設計的原則。

因此,範例請把它當範例吧。不要拿過來只會照抄,通常不會恰巧地符合您的商業需求的。

3 沒有功勞,也有苦勞

這是心態問題了。這樣的人通常會表現工作的很辛苦,如果工作不如預期,就無法怪到他的身上。這一招通常有效,而且有效得長官也認為責任不在該員身上。

4 只(想)會一種技術

存取資料庫的方式,只會使用 SqlCommand 的方式。新出來的 TableAdapter,Enterprise Library 中的 DAABLINQ to SQLADO.NET Entity Framework 一律不碰。這樣的人不在少數,原因呢?新技術不斷地推出,誰學得完呢?反正土法煉鋼,總有一天能完成,加上「沒有功能也有苦勞」原則,就能以不變應萬變了。

5 只會寫程式

程式除了需要開發之外,其餘有更多的東西需要了解,才能成為一名好的開發/設計人員。諸如 Queue、Cache、IIS、Remote desktop、NLB、Cluster 等數也數不完的東西,都並不與程式直接相關。因此,我也見過太多人並不想了解間接相關的IT知識。

因此,網頁工程師不懂如何部署程式到 IIS,也不了解Application Pool 如何回收/身份識別如何設定等光怪陸離的事情也多見不怪了。

最經典的,我見過一名十多年經驗的系統分析師,其系統分析書以Word 來製作,但其排版方法與 PE2 時代無異。

6 只想當上班族

發現了嗎?前5個原因,都是「上班族症候群」的結果。上班族來上班,只為了取得薪水。太傷腦筋的事,無論如何都會推掉。因此,再怎樣簡單的道理,「上班族」也不願想透。

結論

其實,大部份的人都只是「上班族」,對於真正想要作出一番事業的人,無法避免地一定會與「上班族」接觸。因此,事業心重的人,也必須善待這些上班族。

如何與上班族共處呢?我也正在實習中。

4 則留言:

晴樹 提到...

很多技術人員喜歡嘗鮮,什麼新技術都碰一下,但是最後那種技術並未普及,因此要找維護人員也非常不容易。這種決策失誤,要由誰來承擔?

舉個例子,2007年微軟推出的SilverLight 1.0,如果當時決策公司系統採用該技術,那後果如何?

我接觸過上百間公司的IT部門,他們對新技術不願意貿然投入、採取觀望保守的態度,其實也是站在公司立場考量。引進的成本、技術支援、維護的成本、市場上相關技術的人才提供是否充沛等。


我絕對贊成您說的,不要墨守舊法,但是要不要使用新技術,什麼情況下才要使用,如何拿捏是種藝術。

秉程 提到...

是啊!您說的很好。新的技術未必能在市場上佔一席之地,市場上多的是曇花一現的產品及技術,未必值得採用。

主要仍是心態問題。若沒有動力學新技術,反而以「新技術未必有將來」作為藉口推托,這樣的心態是我所反對的。

新技術未必要採用,但值得以評估的心態去了解「為什麼它會產出」,「它解決了什麼事」。

是否採用,那又是之後的事。

匿名 提到...

讓我想起來vista
剛推出來的時候說XP要被淘汰了
現在出了WIN7企業使用VISTA的反而變成孤兒
現在的2008使用VISTA當核心又推出一堆服務不支援xp 2003
但是不穩定誰敢用?

匿名 提到...

我也是個程式設計師
但是卻與作者有著不同的看法

1.在複製程式之前,程式設計師必需先考量該段程式是否可以解決這一次所遇到的問題,需不需要針對目前的環境來進行修改與補強,這是很理所當然,也一定要作的事情。「很有效率」的人應該不只是只會貼程式,而是會逐步匯總經驗,蒐集程式,並針對之前缺失之處來進行修正,以便建立屬於自己的函式庫,提升未來的開發效率。我不覺得貼程式不好,而是需要其他更為細微的處理。

2.就企業來說,穩定性與功能性是考量版本更新的因素之一,但新的程式語法不是,它只是讓眾多的程式開發人員在開發應用程式時,能夠更有效率的方法之一,但絕對不是唯一的方法。所以,我也不覺得要刻意已經執行多時,功能完善的應用程式非得要用新程式來重寫過,卻只為了要套用新的語法上去。

3.對於程式設計師來說,本來就應該只針對程式開發的部分來進行鑽研深究。可是在台灣現在一個人要當多個人用的環境而言,確實有些強求。多知道些知識沒有不好,只是在允許的環境下,我還是希望可以分工,否則程式設計師會淪為四不像。我昨天去天瓏書局看了一下最近的ASP.NET 4.0的書,大部分的還是以初步入門者為讀者來撰寫的書籍。坦白講,我不意外。因為就像你所說,程式設計師要學會其他跟程式開發有關,系統面的東西,那有時間針對程式開發的技術來進行深究?而懂這些技術的作者所撰寫的進階書籍,又有多少讀者要看,會買書?所以現在對於台灣作者的書,我很少著墨了。

學習需要熱情,工作不是唯一。

Share with Facebook