程式設計的基礎

Brecht 對石頭成的〈非資訊科班的程序員?〉的迴響中提到:

一般自修出師的程式設計師,容易出現的通病是學技巧而不學基礎,往往以致用為目標。尤其是 .NET 派的程式設計師,只要拉拉元件就可以完成工作,對於資料結構、演算法知之甚少也無所謂。

往基礎鑽進是費力而收效不見得明顯的 effort,我常以為這就是科班與否的差別所在,科班出身的人,通常這部份會較為紮實(當然也會有人混水摸魚啦,不過我們還是要對教育 or 考試抱持一定的信心)。

同人不知道 Brecht 此言是因為看過非資訊科班出身的編程者之基礎較科班出身者的來得薄弱,還是他「想當然耳」的臆測。不過,這倒和同人所觀察到的現象有所不同,我較認同石頭成文章中的結論中所提到的:

我一向不認為性別、科系,與程式設計能力有關。因為程式設計是種容易接觸與實證的知識。只要有一顆能思考的頭腦,加上一隻筆和一張紙,就可以寫程式。只要有台電腦,就可以實證。日起有功,不必妄自菲薄。

軟體開發的知識是築基於實務中的理論,在學校中所能夠學到的,總是比產業的腳步慢上許多。所以有志於程式設計工作的人,從學校畢業以後,他還是必須從實際的軟體開發過程中不斷地磨鍊其編程基礎及技巧。依同人實務所見,程式設計基礎與開發者是否科班出身沒有關係,但卻與開發者對程式設計的興趣及熱忱有關。
閱讀全文 →

分類: 生活感觸, 編程技巧, 軟體開發 | 2 則留言

軟體開發是工藝還是工程?

一般人以「軟體工程」來說明軟體專案的開發過程,但對於軟體所要解決的問題不複雜、參與開發的團隊規模不大、以及開發時程不長的軟體專案而言,軟體工程卻又太複雜了。於似乎有人認為不應該拿「軟體工程」來比喻軟體專案的開發過程。例如《软件工艺 Software Craftsmanship》這本書,提出了軟體工藝的新隱喻。而我有一位學長喲哪桑也發表了他看此書之後的心得感想。

喲哪桑認為「軟體工程」雖然可以幫助我們了解與學習軟體開發,但它卻並不等於軟體開發的本體呀。學長認為「軟體工藝」可成為一個新的隱喻、新的tag,從極致的工藝技術來比擬軟體開發。如此,關鍵將落在於重視軟體開發者的技能、經驗與才華。換句話說,他認為是人的能力左右了軟體的成敗而非工具與技術。

所以,軟體開發是工藝乎?喲哪桑也不敢驟下斷言,但他認為,可以選擇少把 process compliance 掛在嘴邊,而多談 PSP 及 TSP,回歸「以人為本」的軟體開發。而獨孤木看了學長所發表的心得,也提出他對軟體開發的看法,他則認為軟體工程的大部份理論,都是導源於開發軟體時,有很多人需要一起合作,所以需要建立共同的溝通方法與管道,以及一些共用的工作紀律。所有的軟體工程理論,其實都只是在告訴你,在人數眾多時,應該要遵循什麼樣的開發方式,才可以避免或解決他們所面臨的問題。

換言之,軟體工程的目的是提供一種開發方式,讓軟體開發的工作,能做適度的分工,同時也讓開發者之間的溝通,能夠順利進行,以避免或解決在軟體開發過程中,可能會遭遇的問題。然而,站在軟體工藝的角度而言,對於軟體規模不大、參與開發的人數不多、開發工期不長,對於技藝超群的開發者而言,根本就不需要考慮分工及與其它開發者溝通的問題。只要他能夠把客戶想要的軟體做出來,一切問題都會得到解答,是嗎?
閱讀全文 →

分類: 問題解決, 溝通, 生活感觸, 知識管理, 設計原則, 軟體開發, 閱讀 | 7 則留言

時勢造英雄

看了喲哪桑的〈世界上為什麼會有英雄〉,學長引用了一句話:"世界上為什麼會有英雄?因為有人把世界推向末日"印象中,同人曾在《溫伯格的軟體管理學》中看到過這句話,而學長則提起,在他們公司的讀書會中,由 Rice 的口中聽到這句話。。並感嘆說:

沒有末日,自然沒有英雄的必要。英雄,留到電影裡就好,在現實生活中期待英雄,其實很悲哀、很可怕的!

學長的分享,讓人直接想到:「時勢造英雄」這句話,不過我想到《易經序卦傳》有這麼一段文字:

泰者通也。物不可以終通,故受之以否。物不可以終否,故受之以同人,與人同者,物必歸焉,故受之以大有。

這段話是說明了易經 64 卦的順序,泰卦後面接否卦,否卦之後則是同人卦,然後接著是大有卦。而《漢宋易學解》則做下列解釋:

每逢危急存亡之時,必有同人出,故否後繫同人。

換句話說,萬物不可能永遠亨通或是閉塞,而危難之時,將會有仁人志士轉危為安,使萬物歸順而成就功業。多年前,有一位主管曾提醒我,我取同人的筆名,其實是很辛苦的,因為同人是在逆境中求生存,所以註定會比別人遇到更多的困難。
閱讀全文 →

分類: 問題解決, 專案團隊, 易經思維, 生活感觸, 閱讀 | 發佈留言

工作時間與知識分享

喲哪桑說:

優秀的工作者,不論是管理職,還是技術職,其工作時數都很長。 因為,這不只是工作時間的問題,而是工作態度的問題。

石頭成針對喲哪桑學長的這個觀點,認為不能把管理者工作認同和管理者工作績效混為一談,提到了:

一個無法讓下屬準時收工的管理者是抱著什麼心態在執行「管理工作」。是否只是為了滿足自己的權力與控制欲望?所以我說管理者要用下屬做 reflection ,透過下屬反觀自己是否「做好管理工作」。

當然,如果下屬也能從工作中得到認同,並願意延長工作時數也沒什麼不好。但那是下屬的事。管理者要學會把自己的感覺和下屬的感覺分開考量。

同人也為此主題,寫了一篇〈核心價值觀與工作態度〉,提出工作者可以選擇適合自己的工作環境,然後從工作中創造出個人的價值與意義,並不需要迎合對自己生命無意義的價值觀,消極地藉由超時工作才能讓經營者肯定我們的表現,因而為此付出青春而追悔莫及。

但同人的文章並非否定工作態度的意義,工作態度當然很重要,但一旦經營者或管理者把它當成批判工作者的工具時,它就不具任何意義了。用自己的核心價值觀來看待他人的世界,怎麼看都不對,經營者或管理者應該學會用更理性、更客觀的角度來看問題,才不會對工作者造成無謂的偏見。

我的文章得到哈米尼斯的迴響,他提道:

面對自己的人生(包含工作),我們應該秉持的態度問題,我們可以選擇工作=賣時間的觀念,但同時也可以選擇把工作當成是一種事業的態度來經營。這兩者所會產生的能量是很不同的,也如同您所提到的,超時工作是一種選擇,沒有對錯,但是如果我們可以透過這種行為進而拿到自己想要的東西,也許這種想法就會產生另外的價值也不一定。

這期的Career談到了Me世代、也談到了21世紀新人才的競爭力。
要發展什麼能力、要用何種態度面對,其實就像公司的核心價值一樣,是取決於「經營者」的。

當個人的角色重新定位成「一人公司」的時候,其實問題不也是一樣的嗎?
當許多人在怨嘆環境不好、競爭規則的改變;也不妨想想你曾經建立過自己的核心價值嗎?

哈米尼斯說的沒錯,成功要有決心、要付出代價,可是在努力之前,請先問一問自己,我們是否確認了目標、認清了方向,培養「以終為始」的習慣參考史蒂芬.柯維著(2005),《與成功有約》中的第二個習慣。。「努力會有結果,但不見得會有好結果」,如果沒有在努力前,先弄清楚方向,我們將會誤入歧途,白費工夫,就算我們的努力,可以得到再多卻不見得會有絲毫的意義,因為那將不是我們人生真正需要的東西。

同人一再強調,身處知識經濟時代,競爭力的來源並不在勞力與資源,而是資訊與知識。windlove 說的好:"台灣陷在製造業的思維太久了,花個一段時間想出一個更有效率的方法,才是真的解決之道。不然,人一天在多也只有24小時,不是嗎??",所以,工作時間拉長或許表面上,在勞力與資源的運用上會很有效率,但卻會造成邊際效應遞減及心理層面因素而造成工作上的捨本逐末,因而降低效能。其實,還有一個更嚴重的問題,那就是一個忙碌的工作團隊,將會形成不利創新的企業文化,造成知識分享的障礙並且管理者會付出相當高的代理成本。
閱讀全文 →

分類: 專案團隊, 生活感觸, 知識管理, 策略, 系統思考, 組織 | 發佈留言

軟體敏捷開發方法之反覆週期

石頭成提出他對敏捷開發方法反覆週期的看法,以站在實務經驗來看,他認為兩週為一個反覆期、兩個月為一個釋出期的週期太長了,不足以擁抱改變,他認為要做到以「工作天」為反覆週期,才是「敏捷的反覆式開發過程」。

石頭成的看法讓我想到點空間的一段討論,大家探討eXtreme的中文字面意義。致力於 OOSIG 的 Open Design 理念請參見《UML精華第三版》之譯者序。的光正兄提到:

書中曾經提到一個隱喻:「將收音機的聲音轉到最大」。換言之,隨時隨地穿插Testing、Coding、Analysis、Design,甚至不再有Iteration,或者將Iteration的期間減至最小。

在Waterfall年代,我們分成R->A->D->C四個Iteration做事,慢慢地,我們用Incremental的方式將專案切成更多的Iteration。切到最細,就是XP的Daily Build、Continuous Integration。就Waterfall與XP來說,兩者恰好位於光譜的兩個極端,
這也是XP之所以eXtreme的原因。

完整的光譜應該是Waterfall->RUP->XP。

或許Waterfall的問題大家早就心知肚明,況且RUP正好是XP的「先行者」,炮火就往那裡打了。

當然,光譜還是有可能繼續往右走,MDA + AOP 或許是 Candidate。

不過,關於敏捷開發方法反覆週期,我最欣賞後來 Peter Ho 大哥提出的重要觀點,他提到:

Iteration 的真諦在於 Timed-box 而非 Decomposition,重點在於 produce business values,意近「commitment」,乃制衡 Agility 與 Discipline 不可或缺之器。(或云 Risk Control)

所以我認為,開發之反覆期及交付期的「長短」並不是關鍵所在,而是在「承諾」的時間之內,交付可運作的系統。因此,開發者必須在有限的時間內開發出能為需求者創造出企業價值的軟體,而那些現在無法確定及過於枝微末節而繁瑣的部分,應等到確定之後及較晚期的反覆期再來完成。至於系統那些部分可以創造企業價值,又那些部分比較起來,優先順序不高,應擺在後面的反覆期,則是開發者與需求者溝通後的共識。
閱讀全文 →

分類: 專案團隊, 專案規劃, 設計原則 | 1 則留言

核心價值觀與工作態度

記得在 EMBA 策略管理課程中,林維熊教授在第一堂課就跟我們討論核心價值觀的問題。他問我們一個問題,經營者決定企業的策略目標關鍵在那裡?經過學長姐們熱烈的討論後,大家得到一個結論:

企業的策略目標取決於經營者心中的核心價值觀。

由於經營者選擇不同的核心價值觀,讓他看到的世界也有所不同;有些經營者認為成本是最重要的,這樣可以取得價格優勢,於是乎在這樣的經營觀點下,企業活動的價值在於不斷地投注資源來獲取規模經濟的好處;然而,也有一些經營者認為創新才能獲取競爭優勢,藉著差異化的手法來提昇附加價值及品質優勢才是永續經營之道,在這樣的經營觀點下,企業活動的價值並不在於企業生產了多少產品,而是創造了多少知識,而這些知識將會成為使企業立於不敗之地之立基。

其實,選擇沒有所謂對錯問題,而只是有所不同。林教授告訴我們,他非常不認同某位經營者用小便顏色來衡量員工的工作態度,因為在「為達目的,不擇手段」的管理心態下,經營者不可能會去真心地關懷員工,員工也沒有必要為經營者「躹躬盡瘁,死而後已」。那麼經營者與員工的關係就會是一種因利益而結合的相互利用關係,而不是基於為共同目標而建立的相互信任的夥伴關係。所以,林教授認為那位經營者的這種心態,其實是非常不健康的。

同人在看了喲哪桑學長的〈工作時間的問題,是工作態度的問題〉後,讓我想起了以上策略管理所學內容。其實,同人認為學長只說對了一半: 閱讀全文 →

分類: 生活感觸, 知識管理, 策略, 管理, 組織 | 5 則留言

以知識為核心的生產要素

喲哪桑提出了〈落後指標與領先指標〉,強調融合了領先指標與落後指標的重要性,帶給我一些對工作績效的後續想法。同時,正巧同人近日也經歷了一段有關超時工作的所見所聞,正好想藉這個同步事件來談談個人對工作上的一些體會,且聽我慢慢道來。
閱讀全文 →

分類: 心理, 生活感觸, 知識管理, 管理, 系統思考, 組織 | 發佈留言

羅馬不是一天造成的

本文係投稿於 CNet / ZDNet Taiwan 的文章初稿,未經 CNet 編輯,其內容可能會略有差異。

同人最近在向新同事介紹專案的軟體架構,說明架構的組成、運作過程及程式實作等觀點,希望讓新加入的成員對專案的技術面向有比較全面及完整的認識。在我簡報完畢後,新同事對這個用最新的設計觀念及最新的技術所建構出來的軟體架構充滿新鮮感,她問我:「這個架構都是你一個人設計的嗎?」,我回答說:「是呀」。當她用充滿敬佩的眼光看著我時,我告訴他:「但是這些都不是一天就設計出來的呀,成熟的架構其實是要靠時間來累積呀,所以架構的驗證很重要」。

後來,我想到一句話:「羅馬不是一天造成的」,可以用來描寫我在發展軟體架構上的感想;不過,最近考古學家發現,羅馬很有可能是一天造成的,我想那麼高的工作效率,除了帝王專制的力量之外,古羅馬人大概掌握了我們所不知道的關鍵能力。然而,開發軟體與建造城市終究不一樣,在軟體設計的領域上,獨裁政體會阻礙創新思考,掌握關鍵的技能也是無法速成的,因此,成熟的架構其實也不是一蹴可幾的呀。
閱讀全文 →

分類: CNet/ZDNet, 專案團隊, 生活感觸, 設計原則 | 7 則留言

軟體設計之不跟陌生人打交道

同人曾為一個軟體專案設計及建構服務導向架構。為了在軟體開發過程中,便於開發及測試,所以在架構上的設計上,在前端程式呼叫 Services 方面,是透過組態設定來決定直接連接後端的應用系統或間接透過如 Web Services 的遠端程序呼叫調用後端應用系統[ref]前端程式直接連接後端應用系統是為了開發階段測試方便,而正式上線後為了軟體配置考量則需要透過間接遠端程序呼叫調用後端應用系統。[/ref],透過組態設定的好處是不會因為軟體運作環境的不同配置而更動程式,並且可以巧妙地隔開各元件的相互耦合而達到獨立測試的好處,開發者也可以更專注在其專業領域上來開發系統。

這樣的架構可以做到為維護而設計,可是,這樣設計不可避免地會面臨到一個問題:物件要怎麼做到遠端傳送呢?對於每個領域物件,我們不希望另外寫 Value Objects/DTOs,我們希望用簡單樸實的 POJOs,有關領域物件的傳送,一個可能的做法便是:先將領域物件序列化成 Xml 格式,再傳送到遠端的目的地後再將 Xml 格式反序列化成領域物件。依據這樣的設計思路,我們找到了 XStream 這個 framework,它實作了各種 Java 物件的 Converters,可以把任何 Java 物件序列化成 Xml 格式及將 Xml 格式反序列化回 Java 物件,而且,它的 Xml 物件格式非常的簡單且直覺,對於複雜的物件,它甚至還提供自訂 Converter 的機制讓開發者能自定處理複雜物件的序列化/反序列化。

我遇到過最複雜的領域物件,使得 XStream 無法以預設的 Converters 來序列化/反序列化,應該就非 POI 的 HSSFWorkbook 莫屬了,那是一個 Excel 的 workbook 物件,我的解法是利用 XStream 的自訂 Converters 機制,在序列化時將 HSSFWorkbook 物件轉成檔案串列流,反序列化則將檔案串列流轉成 Excel 的 workbook 物件。

不過,最近同事跑來找我求助,他發現在配置軟體系統的時候有錯誤發生,應用程式伺服器日誌顯示有物件無法從前端傳回來。從發生問題的程式片斷來研判,我猜測大概是 XStream 反序列化某個物件的時候出問題,為了確認問題所在,我寫了測試程式來確認它,結果不出所料,看起來那個物件太複雜了,應該要為它再寫 Converter 嗎?

慢著,這樣做好像不是有效的解決問題之道。因為,那個物件明明是只有後端程式才會用到的控制程式,為什麼需要傳到前端呢?程式這樣寫,其實是違反了 GRASP 的設計理念-不跟陌生人打交道的設計原則[ref]參考趙光正譯(2002),《UML與樣式徹底研究》,臺灣培生教育出版股份有限公司。[/ref]:

將責任委派給前端程式的直接對象,讓這個直接對象與後端的間接對象協同運作,這樣前端程式就無需知道後端的間接對象的存在。

閱讀全文 →

分類: 分析設計建模, 易經思維, 設計原則, 軟體開發 | 發佈留言

我看「管理者的工作時數」

同人最近看了喲哪桑學長分享聽演演的心得,他提到星通資訊葉茂林認為衡量RD部門主管績效的五項指標是:

  1. Employee Turnover。這同時也是所有部門主管的共同指標。
  2. Average Working Hour。
  3. RD Productivity。Productivity = Difficulty / Designer Man-Month。
  4. Quality。Quality 則以 outsider’s test 為主要資料。
  5. Schedule。但 Schedule 須納入 Difficulty 來綜合考慮。

五項指標中,其中管理者平均工作時數引起許多人的熱烈迴響,然而除了這項指標之外,我還是覺得用這五項衡量指標來看研發部門主管的管理績效似乎缺少了什麼,不過,在討論之前,我想還是先看大家是怎麼說的吧。
閱讀全文 →

分類: 專案管理, 知識管理, 策略, 管理, 系統思考, 組織, 軟體開發, 閱讀 | 3 則留言