l

2019年3月22日 星期五

往外看一層

March 22 22:27~23:45


「這個我用不到」效應

幾年前有一次到某公司教【Design Patterns這樣學就會了–入門實作班】,課程結束後邀請我去的主管覺得還滿有幫助的,但他發現部門內一位小組長上課時興趣缺缺,於是主管主動詢問小組長對於課程的看法。

小組長告訴主管:「我工作上所需要的東西Microsoft .Net Framework都有了,不需要自己設計新東西,Design Patterns對我工作上沒什麼幫助。」

這位小組長說的也有他的道理,如果目前工作上用不到,學習的動機也就減低。顧好目前工作最重要,以後的事以後再說。他會出席這個課程,是因為主管要求,並不是因為他自己覺得有需要。

***

Teddy的VB經驗

N年前Teddy五專畢業後,在當兵前有三個月空檔,經過朋友介紹接了一個用VB 3.0寫Windows應用程式的案子。當時Teddy沒學過VB,擔心無法勝任。但朋友一再保證,VB非常、非常、非常簡單,一定沒問題。基於打工賺點小錢外加人情因素,於是就大膽接下這個案子。

做專案之後才發現朋友沒有欺騙Teddy,VB真的非常、非常、非常簡單。突然覺得自己好棒棒,英明神武,一下子就學會視窗程式開發,可以用VB打天下。

寫了一陣子之後,遇到第一個瓶頸:「為什麼別人的系統畫面(UI)那麼好看?我的卻那麼普通?」

原來VB有很多OCX元件,可以用拖拉方式讓自己的系統畫面變得非常「有質感」。從專案預算中花了一點小錢,買了幾個OCX元件。突破畫面關卡之後,再次覺得自己好棒棒,可以做出這麼有質感的視窗應用程式。

又過了一陣子,發現第二個瓶頸:「為什麼別人的視窗程式可以做出半透明與最小化之後縮到工具列的效果,而我卻只能作出標準的視窗?」

到處找書、看雜誌,終於發現原來這些效果要呼叫Windows API才作得到。知道這點之後好像發現新大陸一樣,透過Windows API可以做的事情太多了,功力大增。再次覺得自己好棒棒,可以做出這麼酷炫的視窗應用程式。VB + Windows API萬歲!

後來案子完成沒多久Teddy就去當兵了。

***

因緣際會之下,在當兵的兩年期間,第二年一整年都在部隊中寫VB程式。這時候沒遇到什麼技術上的問題,累積了更多VB開發經驗。

退伍之後上班,原本Teddy應徵這份工作是要用Java開發e-learning(網路教學)系統,但因為神秘的原因公司接了一個連鎖洗衣店門市系統的案子,結果又變成Teddy用VB練功的機會。

從VB 3.0用到VB 6.0,寫得程式越多,心情越不美麗。因為VB不是真正的物件導向語言(object-oriented language),只能算是object-based language。VB有Class,但卻不支援實作繼承。此時遭遇第三個瓶頸:「為什麼別人用C++/Java都可以開發真正的物件導向系統,而我只能用VB這種不物件導向的語言來寫程式?整個氣勢都弱掉了,一點都不酷啊。」

有一天讀到GoF的《Design Patterns》,被書中這兩句話震撼到:

  • Programming to an interface, not an implementation
  • Favor object composition over class inheritance

啊!原來實作繼承要少用,那麼VB沒有實作繼承這件事,好像就沒有那麼嚴重了。寫了好幾年的VB程式,居然此時才發現,VB其實是有「介面繼承(與Java的Interface類似)」的功能。透過介面繼承,你可以「programming to an interface」,也可以做多型(polymorphism)。

知道這點再度發現新大陸,後來用VB開發的新系統,物件導向程度到了前所未有的境界,自詡為VB OO之神…精病XD。

又過了一陣子,寫程式寫到手好痠。不是因為打字太多、太快,而是因為手動測試真的太累人。此時遇到第四個瓶頸:「有沒有什麼方法可以取代人工方式驗證程式的正確性,讓我的手不要那麼累啊?」

剛好這時候JUnit問市,原來這世界上還有一種東西叫做「自動化單元測試」。當時沒有免費的VB Unit可以使用,上網花了一點小錢買了一個付費版本。Teddy的第一個工作上實際使用的自動化單元測試,就貢獻給VB了。

從此之後,又發現另一個新大陸,哇,原來自動化單元測試可以節省這麼多手動測試以及debug的時間啊。傑克,真的是太神奇了。

***

往外看風景更美

學習與能力增強,是一種累積層次的過程。學會一樣工具或技術,自然很高興、有成就感。但如果就此自滿而停滯,你所能解決問題的範圍(context或scope)就會受限於這個工具或技術所設定的邊界。一直到有一天,你發現這項工具已經不能解決你的問題,這時候才想要找新的方法,很可能會緩不濟急,或拉長解決問題的時間。

Teddy的VB學習過程就到自動化單元測試為止嗎?當然不是,隨著公司人員增加,管理團隊、溝通的問題逐漸浮現。如何讓一群人一起有效合作開發軟體?這已經跳脫程式語言的層次,要往 外太空 更外層探詢答案。於是來到軟體開發流程、專案管理、需求探索、軟體架構這個世界繼續拓荒。

還有沒有更外層,當然有,繼續往外拓展,遇到公司經營、客戶滿意、產品獲利等問題。

很多時候,問題的答案不在你以為的「這一層」。往外看,視野更好,答案也呼之欲出。

***

友藏內心獨白:就連地獄都有18層了。

沒有留言:

張貼留言