jim yeh on 九月 6th, 2014

在民主社會,人民評價選舉的候選人,這是很正常的。但有一種特別的論調,它是把什麼人出來競選,當做社會是否公義的象徵,就好像《動物農莊》裡的那群豬所說的:動物皆平等,但有些動物比其它動物更平等。

幾天前,同人在臉書看到有人說連勝文可以出來代表國民黨競選台北市長,是社會不公不義的象徵。但這個觀點是充滿了邏輯繆誤,因為假如它成立,那也就代表社會公義的象徵是連勝文不能出來競選台北市長。但這違反了平等自由主義的正義觀點,這才叫做真正的不公不義呢! Read the rest of this entry »



     
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 »