jim yeh on 六月 19th, 2014

最近在工作上重構過去別人開發的程式,它是系統目前正在運作的程式,但由於程式長達 3000 多行,維護和除錯都變得很困難。程式中因應業務邏輯的需要,用了許多 if 判斷及 for 迴圈的控制,使得程式變得很不容易閱讀。在這種情況下,同人使用了幾個招式,利用它們可以把一層層繁複的迴圈和條件判斷式剥開,把程式重構成能夠清楚表達功能 what 的意圖,有別於之前在 how 的層次中容易使人迷惑在繁複的實作細節。這幾個招式可以幫我們對系統輕易地分而治之,以下同人就分享幾個用來清楚表達程式意圖的重構招式。 Read the rest of this entry »



     
jim yeh on 五月 14th, 2014

很多人都知道系統開發的功能測試很重要,但有時候我們省略它並不是認為某個功能不需要測試,而是不知道該功能該如果測試。有時候問題的關鍵是卡在環境整合的複雜性,例如牽涉 web 的 session 或是資料庫存取的問題,就讓人很難隔離這些複雜情況。當然理論上我們可以運用 Mock 的技術來隔離它們,然而現實上,即使運用這些技術可能你可能還是無法解決無法測試的問題。這時候,你需要的通常不會是尋求其它更強大的技術,而是需要在編程核心思維上,做一些小改變,來改善功能的可測性。

最近同人就碰到一個實例,讓我體會到以泛函編程(FP)典範增進功能的可測性。其實,以前遠在美國的 Perter Ho 就曾向包括同人在內的幾位點空間的朋友,分享過相同的觀念,而同人則是藉由最近的實例而對這樣的觀念有更深刻的體驗。
Read the rest of this entry »



     
jim yeh on 四月 22nd, 2014

從〈查詢的宣告式語意〉提到的實作中,我們可以發現有關資料搜尋的一種設計抽象概念,可以用相同的模式應用在不同的資料結構上,例如從 XML 文件中搜尋特定的資料節點。同人曾經用過宣告式語意實作轉換期貨交易 Span 檔案,將 XML 資料格式轉換成某種特定格式的資料檔案,像下面這段程式碼所示,程式碼的寫法比傳統的命令式語意寫法更為精簡而直覺。

xml::XmlDocument xmlDoc(spanFile, "ISO-8859-1");

std::list<span::EnvMessage> envMsgs =
	xml::XmlTransform<span::EnvMessage>(xmlDoc.find(
	"/spanFile"))(span::WriteEnv());

std::list<span::CurMessage> curMsgs =
	xml::XmlTransform<span::CurMessage>(xmlDoc.find(
	"/spanFile/definitions/currencyDef"))(span::WriteCur());

std::list<span::ChrMessage> chrMsgs =
	xml::XmlTransform<span::ChrMessage>(xmlDoc.find(
	"/spanFile/pointInTime/clearingOrg/curConv"))(
	span::WriteChr());

std::list<span::SccMessage> sccMsgs =
	xml::XmlTransform<span::SccMessage>(xmlDoc.find(
	"/spanFile/definitions/acctTypeDef"))(span::WriteScc());

std::list<span::PbrMessage> pbrMsgs =
	xml::XmlTransform<span::PbrMessage>(xmlDoc.find(
	"/spanFile/pointInTime/clearingOrg/pbRateDef"))(
	span::WritePbr());

std::list<span::FutMessage> futMsgs =
	xml::XmlTransform<span::FutMessage>(xmlDoc.find(
	"/spanFile/pointInTime/clearingOrg/exchange/futPf/fut"))(
	span::WriteFut());

std::list<span::OptMessage> optMsg1s =
	xml::XmlTransform<span::OptMessage>(xmlDoc.find(
	"/spanFile/pointInTime/clearingOrg/exchange/"
	"oopPf/series/opt"))(
	span::WriteOpt("oopPf"));

std::list<span::OptMessage> optMsg2s =
	xml::XmlTransform<span::OptMessage>(xmlDoc.find(
	"/spanFile/pointInTime/clearingOrg/exchange/"
	"oofPf/series/opt"))(
	span::WriteOpt("oofPf"));

std::list<span::CcdMessage> ccdMsgs =
	xml::XmlTransform<span::CcdMessage>(xmlDoc.find(
	"/spanFile/pointInTime/clearingOrg/ccDef"))(
	span::WriteCcd());

std::list<span::SdjMessage> sdjMsgs =
	xml::XmlTransform<span::SdjMessage>(xmlDoc.find(
	"/spanFile/pointInTime/clearingOrg/ccDef/adjRate"))(
	span::WriteSdj());

std::list<span::PflMessage> pflMsgs =
	xml::XmlTransform<span::PflMessage>(xmlDoc.find(
	"/spanFile/pointInTime/clearingOrg/ccDef/pfLink"))(
	span::WritePfl());

std::list<span::ItsMessage> itsMsgs =
	xml::XmlTransform<span::ItsMessage>(xmlDoc.find(
	"/spanFile/pointInTime/clearingOrg/interSpreads/dSpread"))(
	span::WriteIts());

writeMsgLines(envMsgs);
writeMsgLines(curMsgs);
writeMsgLines(chrMsgs);
writeMsgLines(sccMsgs);
writeMsgLines(pbrMsgs);
writeMsgLines(futMsgs);
writeMsgLines(optMsg1s);
writeMsgLines(optMsg2s);
writeMsgLines(ccdMsgs);
writeMsgLines(sdjMsgs);
writeMsgLines(pflMsgs);
writeMsgLines(itsMsgs);

上面這段程式碼明白地表達 XML 格式轉換的意圖 Read the rest of this entry »



     
jim yeh on 三月 18th, 2014

上週三陪小星寫功課的時候,聽到了春雷響。從天空傳來一聲巨響並夾雜著閃光,小星說:「打雷了」,本來同人並沒有在意這個雷響,但隨即想到這是開春後的第一聲雷響,是一年當中重要的事件,於是我先在臉書的動態消息中記下春雷響的時間,等到隔天有時間再打出甲午年春雷響的時盤

從春雷的時盤來看,命宮室女座代表今年台灣的運勢,大體上與細部的調整與節制有關,而非大方向長遠的規劃。而水星落入五宮中,會合六宮宮頭,代表主要的調整和節制在於投資及產業方面,以符合社會趨勢並改造更合理的環境。水星與落入二宮的火星呈現和諧的三合相位,代表經濟活動會因為投資和產業的調節而發展迅速,人們漸漸會感受到有一股潛在力量使經濟漸趨好轉。

不過,水星和三宮會合的土星呈現不和諧的四分相,代表媒體傳播過時及負面的訊息造成資訊扭曲與失真,對投資及產業環境的改善有不利的影響。 Read the rest of this entry »



     
jim yeh on 一月 28th, 2014

寫完〈訊息拆解組合的宣告式語意〉(原篇名:簡化設計的延遲運算-其一)之後,到現在同人才接著寫下第二篇系列文章。其實會隔那麼久才再動筆是有原因的,本來第二篇打算要寫剖析命令列的宣告式語意,不過同人覺得我原先的設計還不夠好,於是就暫時先把它擱置下來。結果一擱就擱了好久,慢慢地也讓我覺得沒有必要重新實作命令剖析列的宣告式語意,因為畢竟會使用到的機會並不多。其實命令列剖析的宣告式語意和前一篇文章的設計原理應該是一致的,因此同人後來決定要跳過它。剛好近看到有朋友討論相關的議題,激發我完成系列文章的動力,這一篇所要探討的主題正是有關於查詢的宣告式語意。 Read the rest of this entry »



     
jim yeh on 一月 15th, 2014

前一陣子,同人參與開發的專案有新需求要以業務單位關聯執行單位的地理區域。有別於一般人習慣的資料驅動編程(Data Driven Programming)的方式,同人採用領域驅動設計(Domain Driven Design)的方式,來設計並實作符合這項需求的功能。在過程中,我發現我分析出來的領域模型可以擴大它的應用範圍成為管轄區域的分析樣式。這個樣式適用於管理單位負責管轄區域內的管理,並指派執行單位來處理業務的執行。這個分析樣式讓人更深切地體認 Accountability 的分析樣式,同人想透過這篇文章分享我的心得與感想。 Read the rest of this entry »



     
jim yeh on 一月 7th, 2014

上個月敏捷聚會舉行了一場 Lean Coffee,讓大家體驗共同決定想要探討的敏捷開發的主題並且參與對話。在討論的過程中,大家談到一個在敏捷開發過程中常見的困擾,那就是 scrum 的敏捷方法需要跨功能團隊,但當團隊成員並非具備跨領域的技能時該怎麼辦呢?大家針對這個問題談到如何讓成員學習成長的解決方法。

Jack Yen 表示他會向團隊成員傳達主動學習成長的觀念,建議成員多利用空閒時間充實技能,而不要成為團隊的累贅。不過他說大部分的工程師在技術或專業上多半不會有太大的問題,比較麻煩的是專案的經驗和領域知識,這部分還是要在實務上多磨鍊才會慢慢熟悉。新科 PMP 志豪老哥也提到要讓成員 OJT(on job training)來邊做邊學。David Ko 則是補充他的經驗,他會表達每一位成員都要懂每一種技能的觀念;然而當成員真的碰到技能上的問題時,應該要引導成員去學習,不過必須要讓成員自己親自動手。

大家的討論圍繞在團隊如何提供學習成長的機會;假如團隊成員每一個人都能在各方面領域有夠水準的表現,那麼團隊必然會有高效能的產出。不過同人在過去的軟體專案開發經驗中體驗到,讓成員學習成長是一條艱辛且漫長的路,領導者必須有耐心提供更多的時間和空間來促進成員的學習成長,否則很容易適得其反。這讓同人想到從另一種觀點去思考跨領域團隊的問題,我認為也許不是期待成員具備跨領域的技能,而是運用限制理論的觀點來突破團隊效能的瓶頸。 Read the rest of this entry »



     
jim yeh on 十二月 21st, 2013

前一陣子正值人馬座新月之際,在台灣最引人注目的事件就是多元成家草案。這個議題引發激烈論辯,甚至讓正反方支持者在 11/30 走上街頭,捍衛各自理念。人馬座新月和多元成家到底有著什麼樣的關連,而從這個重大的事件中,我們又可以從星象中看到什麼啟示呢?

從星盤中我們看到冥王星會合命宮在魔羯座,象徵事情的發展基本上有顛覆傳統組織結構的傾向。 Read the rest of this entry »



     
jim yeh on 十月 7th, 2013

上週馬英九總統表示,不再對王金平暫保黨籍的假處分提出抗告,這是否意味著因九月份的司法關說事件而造成的政治僵局可解?馬宣布的時間點正值日月會合的天平座新月,我們可以從天平座新月的時盤看到台灣目前政治僵局的後續發展。

命宮天蠍,代表台灣這個月整體運勢有很多不能說的秘密和禁忌,金星落一宮刑火星在十宮,代表執政者主動採取和解的行動,但火星的凶相位代表欠缺周詳的思考,只是一廂情願以為紛爭就能解決,但其實和諧表相的背後,隱藏著暗潮洶湧的算計。火星在獅子座表現開放坦誠的態度是敵不過金星在天蠍座象徵表裡不一的詭計,金星刑四宮海王星,顯示國會仍舊脫離不了密室妥協和拖延混亂。由此可知,就星盤上的吉凶而言,國民黨不再抗告並不是明智之舉。

Read the rest of this entry »



     
jim yeh on 九月 18th, 2013

國會議長介入民進黨立法委員司法個案,遭國民黨撤銷黨藉處分,而喪失立委及國會議長資格。多數的人對這件事傾向同情王金平院長,責怪馬英九總統不該對他進行政治追殺,而不問立法院長關說司法個案的是非對錯。看起來人們似乎是可以容忍立法院長介入司法個案,卻覺得總統對立法院長關說的處置太粗糙草率,認為這是不擇手段的政治鬥爭。然而我們真的可以漠視司法關說對社會的影響嗎?也許在講求人情事故的台灣社會而言,關說似乎是很正常的。但如果你想要司法獨立、社會的公平正義能夠伸張,我們應該容忍司法關說嗎?這篇文章同人想以易理看司法關說。

看到政論節目有政治觀察者表示,關說只是闖紅燈的錯誤,馬總統不應該把這種小過錯當成殺人罪來處理,而不合乎比例原則。這句話聽來好像有一點道理,但卻忽略了司法關說的可怕,並不是關說內容的問題,而是在於關說會造成政治及法律風氣敗壞的結構和模式。當我們認為這次司法關說沒有關係,下次別人就會用盡一切關係再來司法關說,形成司法沒有關說的人吃虧的賽局,沒背景和關係的人就只好自認活該倒楣,這時候我們的司法將會變得萬刼不復。

有些人覺得司法關說並非緊要的問題,而是改善經濟、致力民生,為了不緊急重要的問題而大動干戈造成社會動盪不安,這樣是做是不值得的。但仔細想想,國會議長干預司法個案,如果我們漠視並且姑息它,那麼我們的行為和信念就會加強它的負面效應,而形成難以撼動的集體意識,而我們將會承受這集體意識的苦果,因為漠視而且縱容它的人是我們自己。司法關說讓司法沒有獨立,也會影響行政和立法的效能,因為人們不依法行事,而是講關係、走後門、或是秘室協商的政治分贓,反而對經濟及民生有結構性的不利影響。民生和經濟就會難以發展,可能不是政策不好,而是一直空轉內耗,而根本的原因很可能是無法打破政治人物介入司法關說的共犯結構

因此,如果我們只是把司法關說看成一個事件,而不是認清造成這個事件的結構,那麼我們就不能看穿問題的本質。我們要用智慧看清楚,事件發展至今到底是怎麼回事,而不是只是憑個人好惡去評斷誰對誰錯,而迷惑於表相受到誤導。《易經文言傳》告訴我們問題的惡化都是累積而來的,預防事情的惡化需要防微杜漸的智慧 Read the rest of this entry »