l
顯示具有 還少一本書 標籤的文章。 顯示所有文章
顯示具有 還少一本書 標籤的文章。 顯示所有文章

2021年9月8日 星期三

【還少一本書】Get Your Hands Dirty on Clean Architecture

September 08 20:30~23:34


 

前言

目前市面上Clean Architecture的書,跟日本進口壓縮機一樣,非常稀少。Teddy在2017年介紹過〈[還少一本書] Clean Architecture〉,事隔多年後,今天要介紹剛讀完的另外一本《Get Your Hands Dirty on Clean Architecture》。

這本書只有薄薄的137頁,書中探討實作Clean Architecture遇到的程式實作問題。Uncle Bob寫的《Clean Architecture: A Craftsman's Guide to Software Structure and Design》雖然多達400頁,但書中的敘述比較抽象,實作的程式碼趨近於0。導致許多人讀完《Clean Architecture》之後,在程式實作的時候形成「一個架構,各自表述」的窘境。而「在乾淨的架構上弄髒你的手」這本書,試圖彌補Uncle Bob留下的實作缺口。

接下來Teddy逐一介紹這本書的優點以及可改善之處。

***

優點--單一責任的使用案例類別

這本書的前兩章談傳統階層架構所造成的問題,以及如何透過依賴反轉來解決這些問題。作者在前兩章還沒提到程式實作,而這兩章的大部分內容在Uncle Bob的書中已經說得很清楚。Teddy覺得比較值得注意的一點是,書中第15頁提到:

The use cases are what we have called services earlier but are more fine-grained to have a single responsibility, thus avoiding the problem of broad services that we discussed earlier. (使用案例就是我們之前所說的服務,但更細粒度地具有單一職責,從而避免了我們之前討論的廣泛服務的問題。)

Clean Architecture的使用案例,有兩種常見的實作方式。第一種就是上述所說的broad service,一個service物件身上包含好多方法,每一個方法代表一個使用案例。DDD紅皮書《Implementing Domain-Driven Design》的書中範例就是典型的broad service寫法。

另一種方式就是將使用案例提升為類別,一個使用案例類別只會做一件事,也就是上述符合單一責任原則的fine-grained service。

Teddy自己是採用一個類別代表一個使用案例(fine-grained service)的做法。

***

優點--程式結構

在Uncle Bob書中由Simon Brown所寫的第34章The Missing Chapter,談四種程式碼結構的方式:package by layer、package by feature、ports and adapters、package by component。雖然這個章節畫了好幾張圖來解釋這四種方法,但Teddy覺得書中的描述還是少了一些重要的細節,導致在實作上有太多的可能性。

這個問題其實很容易釐清,講那麼多還不如給一張圖畫出程式目錄結構就搞定了。

……為什麼不給code哩?

而本書第3章則是以實際的程式結構範例重點說明package by layer與package by feature的優缺點,最後給出作者的建議方式:先package by feature再package by layer。

雖然作者沒有針對Uncle Bob原本書中的四種目錄結構方式詳細比較,但至少給了一個還算是非常具體的實作建議。

***

優點--具體的使用案例實作程式範例

本書第4章談使用案例的實作,以實際的程式碼對應到Uncle Bob書中所說的use case input、use case與use case output。本書把use case input稱為input model,並將其包裝成Command物件(可參考書中第37頁SendMoneyCommand程式碼)。

將input包裝成Command是很常見的作法,但這一點與Teddy的慣用做法不同,Teddy使用UseCaseInput類別來實作input。

Teddy在實作Clean Architecture的時候同時套用DDD與Event Storming,在Event Storming中藍色便利貼代表Command,也就是使用者對系統下的命令。有人將Event Storming的Command當成use case input,Teddy則是直接將Command用使用案例實作,而執行該Command所需的輸入參數當成use case input。所以Teddy把Command這個概念保留給使用案例,而不是使用案例的輸入參數。

儘管書中的實作方式與Teddy慣用方式有所差異,但概念上還是一致。

***

本章另外還有四個亮點:

  • 輸入參數驗證與商業邏輯驗證的差異,以及應該在哪個軟體架構階層中去做驗證。
  • 貧血模型(anemic model)和豐富模型(rich model)對於使用案例的實作有何影響?
  • 使用案例的輸出
  • 唯讀的使用案例實作

***

優點—跨層的物件映射(Mapping)

Teddy讀完Uncle Bob的《Clean Architecture》之後將其重點歸納為三個原則,細節請參考〈再談Clean Architecture三原則〉。其中有一個原則叫做〈跨層原則〉,書中關於此原則的實作著墨甚少,只提到當物件跨層傳遞的時候,會使用Mapper設計模式將物件映射成另一種型別。

實務上,也有不少開發人員反對跨層映射,覺得太麻煩,不但沒效益還產生許多類似的重複程式碼。

本書第8章詳細說明No Mapping、One-Way Mapping、Two-Way Mapping與Full Mapping(《Clean Architecture》書中建議的做法)這四種做法的優缺點。作者建議對於web controller layer採用full mapping,但在persistence layer就不建議使用,因為作者覺得開銷太大,不划算。

但這一點Teddy並不同意作者的看法,在ezKanban中,不管是web controller layer還是persistence layer,都採用Full Mapping。雖然一開始需要花時間寫mapper程式,但在後來Teddy不斷重構entity layer的過程中幫了極大的忙。不管entity layer實作如何修改,persistence layer與web controller layer幾乎完全不受到影響。

***

優點—Main Component的實作

Clean Architecture》第26章The Main Component也是有點抽象的一章,書中提到Main Component是「最髒」的元件,而且每一種系統配置都需要用一個Main Component來代表,在實作上有不少讀者不知如何具體落實這個Main Component。

Get Your Hands Dirty on Clean Architecture》第9章則是以具體的程式碼說明Main Component的實作,又彌補了一個《Clean Architecture》書中的一個實作缺口。

***

可以更好

提了這麼多優點,最後談談可以做得更好的地方。

第一點雖然Teddy把它列為缺點,但也可以說是優點。因為這本書很薄,雖然可以很快一窺Clean Architecture的實作面貌,但對於完全沒有學過Clean Architecture的鄉民而言,如果要光靠這本書就「徹底學會」Clean Architecture,恐怕有點難度。Teddy建議搭配Uncle Bob的《Clean Architecture》一起服用,一本學理論,另一本學實作,學習效果更佳。

第二點Teddy覺得比較嚴重,書的標題雖然是「Get Your Hands Dirty on Clean Architecture」,但作者在實作上滿多地方參考六角形架構(Hexagonal Architecture)並使用六角形架構的術語。例如,在第三章程式結構中使用inoutport這些六角形架構的術語,而非Clean Architecture書中採用的術語。雖說Clean Architecture與Hexagonal Architecture大同小異,但兩者所用的術語還是略有不同。所以在一本標榜Clean Architecture實作的書中採用「鄰國術語」,Teddy還是覺得略有不妥。

此外,硬是要用in、out來區分adapter,Teddy也是略有疑慮。作者提到in adapter代表由外部呼叫系統,out adapter代表有系統呼叫外部。例如,web controller是in adapter,repository或persistence adapter是out adapter,這沒問題。那麼Event Bus呢?它有時候是in,有時候是out,要把它放在那個目錄裡面?還是把接收資料的event bus adapter放在in,傳送資料的event bus adapter放在out?Teddy沒有這樣設計過,所以對於這種區分adapter的方法還需要思考一下。

第三點,書中第6章:Implementing a Persistence Adapter的實作建議Teddy不太認同。書中建議在這裡也套用單一責任原則,讓一個Persistence Adapter就只做一件事,例如將Account物件的載入、更新、建立設計成以下三個介面:LoadAccountPort、UpdateAccountStatePort、CreateAccountPort。Teddy比較建議在這裡套用DDD的Repository設計模式,讓一個Aggregate對應一個Repository來處理儲存的問題。

以上述的Account為例,若採用event sourcing來保存物件狀態,根本不會有書中建議的UpdateAccountStatePort與CreateAccountPort介面,只需要save與load這兩個介面。

最後一點,這是一本介紹Clean Architecture實作的書,程式範例理應很乾淨。但書中有部分範例卻「不太乾淨」,例如下圖書中第35頁的SendMoneyService,它應該位於Clean Architecture的Use Case層。直接在它身上貼上@Transactional似乎有跟框架產生耦合的嫌疑。



 

***

友藏內心獨白:值得一讀。

2020年2月26日 星期三

【還少一本書】Clean Agile

Feb. 26 15:00~16:54


Clean Agile

Clean Agile: Back to Basics》是Robert C. Martin(Uncle Bob)最新著作,這本書算是他老人家對於敏捷開發的歷史回顧,以及他對於敏捷開發應該長成什麼樣子的個人意見

***

第1章

第1章Introduction to Agile談到談到敏捷的歷史,從1880年代的Scientific Management(科學管理)演變到Waterfall,再到1980年代末期~1990年代早期的敏捷改革時期,Uncle Bob提到當時多個輕量級軟體開發方法的興起,到2001年17位輕量級流程愛好者在美國猶他州雪鳥滑雪聖地的聚會,誕生了敏捷方法與敏捷宣言

第1章最後提到Ron Jeffries所畫的The Circle of Life這張圖,它表達了XP的12個實務做法,《Clean Agile: Back to Basics》這本書的核心基本上是圍繞著The Circle of Life,由外而內分成三章解釋這張圖。

讀完《Clean Agile: Back to Basics》之後,Teddy覺得Uncle Bob所謂的Clean Agile底子裡其實就是XP,這很可能是因為Uncle Bob一開始接觸的敏捷方法就是XP,而且他是個TDD堅定信仰者的關係。

▲The Circle of Life,節錄自《Clean Agile: Back to Basics

***

第2章

第2章The Reason for Agile,對Uncle Bob來說,理由很簡單:「讓自己以及軟體開發這個行業變得更專業」。如果你夠專業,你就有勇氣可以拒絕長官不合理的要求,你敢說No。你軟體會變軟,你會持續改善與學習,且無懼改變。你的軟體品質會很好,QA應該找不到任何bug。客戶與開發人員各遵其職,相互合作。基本上算是一種軟體開發的大同世界XD。

***

第3~5章

接下來的三章分別介紹The Circle of Life的三個圈圈:

  • 第3章Business Practices:介紹Planning Game、Small Releases、Acceptance Tests、Whole Team這幾個實務做法。本章一開始簡短的介紹Story和Story Point,以及軟體估算的幾種方法。然後提到Velocity、小規模釋出、驗收測試以及敏捷團隊的組成。接觸過XP或Scrum的朋友讀起來應該沒什麼困難。
  • 第4章Team Practices:這一章提到Metaphor、Continuous Integration、Collective Ownership、Sustainable Pace,除了Metaphor以外其餘三個實務做法都很容易理解。Metaphor在XP剛提出的時候其實很抽象,不好解釋。但後來有了Domain-Driven  Design(領域驅動設計;DDD)之後,Metaphor就有了一個完美的解釋方式,就是DDD裡面的Ubiquitous Language(通用語言)。
  • 第5章Technical Practices:這一章提到Simple Design、Pairing、Test Driven Development、Refactoring,算是軟體開發人員比較熟悉的內容。

***

第6章

第6章Becoming Agile,這一章原本是最吸引Teddy的章節。如何變得敏捷?Uncle Bob又回頭偷Kent Beck的四個XP價值觀:

  • Courage
  • Communication
  • Feedback
  • Simplicity

這章還有三點Teddy覺得很有趣的部份

  • Transformation:敏捷轉型是這幾年很熱門的話題,作者認為˙(大型)組織的敏捷轉型很多都是失敗收場,因為「中間管理層」所存在的目的與敏捷精神相違背,因此他建議「產生新的組織來實施敏捷而非將現有組織轉型」。
  • Coaching:近幾年敏捷圈很流行的Coaching(敏捷教練),Uncle Bob的看法異於常人,他覺得敏捷團隊不需要,或是只有偶爾需要聘請教練。
  • Agile in the Large:Uncle Bob認為敏捷就是為了解決中小型軟體開發團隊所誕生出來的方法,所以根本沒有所謂「大規模敏捷」的問題。因為大規模團隊合作的問題在5000年前已經被解決了。

***

第7章

第7章Craftsmanship,本章不是由Uncle Bob執筆,而是「外包」給寫了《The Software Craftsman: Professionalism, Pragmatism, Pride》的作者Sandro Mancuso,寫得出乎Teddy意料之外的好。

Software Craftsmanship Manifesto(軟體工藝宣言)在2009年提出,Teddy之前一直覺得既然已經有敏捷宣言了,為什麼要畫蛇添足?是要另立山頭佔領地盤嗎?

廣義來看它可視為一種對於敏捷宣言的補充說明,身為一位軟體工程師,Software Craftsmanship Manifesto 的內容原本就是自己一直以來所重視與實踐的方向,落實敏捷不就是這樣嗎?!

還真的不是,敏捷經過這麼多年的演化,即使只將敏捷限定在軟體開發組織中,很多時候還是偏向A Name Without Quality,變成一種口號與行銷工具。所以這章重回敏捷軟體開發的初心,軟體工藝,也算是呼應了Uncle Bob在第二章所提到的專業

***

結論

這本書提到很多敏捷這個詞被提出前後的歷史故事,以及重新詮釋XP的12的實務做法與4個價值。雖然書中對於Clean Agile的看法可能與現今主流趨勢相差甚遠,但這應該是作者有意為之的結果。從正面來看,可以讚賞作者不忘初心,方得始終。從負面來可,可以批評他食古不化,沒有與時俱進。

看完《Clean Agile: Back to Basics》,Teddy立馬買了《The Software Craftsman: Professionalism, Pragmatism, Pride》,且興起把當年沒看懂的XP系列書籍拿出來再看一次的衝動。

▲年輕時購買的XP系列叢書,現在回頭讀應該比較看得懂吧XD。

***

友藏內心獨白:是初心不是粗心。

2017年11月13日 星期一

[還少一本書] Clean Architecture

November 10 21:40~23:03

螢幕截圖 2017-11-13 22.41.56

Clean Architecture: A Craftsman’s Guide to Software Structure and Design》是著名作家Robert C. Martin最新著作,顧名思義這本書的主題就是軟體架構。本書總共分成六個部分,Part I簡短說明軟體架構的定義與價值,作者針對軟體架構的目標給了以下定義:

The goal of software architecture is to minimize the human resources required to build and maintain the required system. (軟體架構的目標是最小化建構與維護所需系統的人力資源)

接著作者提到軟體架構的兩個價值:

  • 行為(Behavior):軟體架構需要支持將使用著的需求轉成可執行的軟體系統。
  • 結構(Structure):好的軟體架構要讓「軟體變軟」,也就是要具備可修改性、可維護性。

以上兩個價值哪一個比較重要?很多人,尤其是老闆、主管、專案經理或Product Owner,大多會認為前者比較重要。畢竟軟體一定「看起來可以用啊」,否則軟體架構設計得再好,功能不符合使用者所需也是白搭。但作者提出另一種看法,他覺得結構的價值大於行為的價值。舉一個最極端的例子,你有一個行為符合使用者需要但卻完全無法修改的系統,只要使用者需求改變,這個系統就完蛋了。另外一種情況是你有一個行為完全不符合使用者所需,但卻非常容易修改與維護的系統。你可以很容易的逐步修改這個系統,讓他符合使用者的需求。

有些鄉民可能會認為這根本是作者的詭辯,信不信由你,反正 Teddy是信了XD。不過不要誤會,作者不是說功能不重要,功能當然很重要。作者在書中還有更進一步闡述這個觀點,請鄉民們自行參閱。

***

Part II則是介紹三種目前主流使用的編程典範,並提出他認為的重點:

  • 結構化:規範直接流程控制(不要使用 go to)。
  • 物件導向:規範間接流程控制(透過多型)。
  • 函數編程:規範指定指令(assignment)。

***

Part III與Part IV分別介紹SOLID(Single Responsibility、Open-Closed、Liskov Substitution、Interface Segregation、Dependency Inversion)元件設計原則,這兩部分的內容與作者自己寫的另一本書《Agile Software Development: Principles, Patterns, and Practices》重疊。有經驗的鄉民可以直接從Part V開始讀起。

***

以上內容可以算是本書的鋪陳,補充一些軟體設計的觀念。從Part V開始才是本書的重點,作者從Use CasesOperationDevelopmentDeployment這幾個角度來探討軟體架構。這些觀點和〈Architectural Blueprints—The “4+1” View Model of Software Architecture〉這篇經典的論文有許多類似的見解。接著作者討論解耦(Decoupling)的幾種技巧,在此作者提出一個Teddy覺得很有趣的看法:有時候為了解耦必須付出重複性(Duplication)作為代價。例如,如果不希望商業邏輯層與資料庫層產生耦合,商業邏輯層就不能直接使用資料庫的物件,像是Record Set或是Result Set等資料庫提供的物件要被轉成DAO傳給商業邏輯層。雖然兩者之間的資料可能存在大量的重複性,但這種重複性並不是真正的重複性,只是此時看起來很像。維持這種重複性有助於隔離不同階層之間的相依性。

作者繼續討論如何劃定邊界(Boundary)的與區分Level(軟體架構的層次)方法,在此作者套用相依倒轉原則(Dependency Inversion Principle)來區分元件的邊界,Level的定義則是與I/O的距離,軟體架構中距離I/O越遠的元件/模組/階層擁有越高的Level。

然後作者提到Policy,也就是一般常說的Business Rule。這部分需要用Entity與Use Case來實作,而且最好完全隔離I/O。

綜合以上的討論,作者最終提出他的Clean Architecture,如下圖所示:

CleanArchitecture

▲Clean Architecture,圖片來源在此

嚴格講起來這個架構也不是作者所發明的,它和Hexagonal Architecture(又稱為Ports and Adapters)很像。

***

作者把資料庫、Web、框架(Framework)視為與架構核心無關的細節,放在最後Part VI介紹。看到這裡可能有許多鄉民不同意,Web本身就是一種架構,為什麼會被作者歸類為與架構核心無關的細節勒?不服氣的鄉民可以把這本書找來看,嘗試一下能不能打臉作者XD。

***

與傳統軟體架構的書籍不同,這本書從一些很基礎的設計原則開始討論,運用少數原則來展示作者所認為的軟體架構設計重點。傳統的軟體架構書籍像是《Software Architecture in Practice, 3rd》,偏向過於理論性的探討與軟體架構評量的方法介紹。另一類像是《Pattern-Oriented Software Architecture》系列,書中介紹大量的架構模式,非常具體但有時候可能會有見樹不見林的感覺,或是有一種「背了很多英文單字(架構模式)但卻無法開口講英文(無法應用這些架構模式)」的困擾。《Clean Architecture》剛好介於這兩者之間,讀完這本書,用書中介紹的方法再回頭去看原本已知的軟體架構,應該會有不同的感覺與見解。

***

友藏內心獨白:書不能只看一本。

2017年3月22日 星期三

[還少一本書] Specification By Example

March 22 09:00~10:54

屏幕截图 2017-03-15 15.39.38

 

今年因為在北科兼任的「軟體生命週期管理」課程中教BDD,加上明天晚上在C. C. Agile要分享「SBE、BDD、ATDD、TDD、DDD大亂鬥」這個題目,從農曆年後又把《Specification By Example》(以下簡稱SBE)這本書拿出來讀了一次。第二次讀這本書比較有感覺,趁著記憶猶新的時候介紹這本書的內容。

 

從封底開始看

這本書的內容在英文版的封底已經簡短提示四個重點:

  • Common process patterns:本書包含7個「process patterns」(流程模式),書中從Part 2開始用了7章的篇幅來逐一介紹這7個模式。雖然作者用「模式」這個詞彙來介紹他所提出來的7個套用SBE的流程,但書中並沒有使用大家熟知的模式格式。作者提到用模式來記錄SBE的知識還需要一段時間,所以他先把手邊有的資料用比較隨興的方式介紹。希望假以時日這些知識可以被整理成更正式一點的模式,造福像Teddy這種模式愛好者。
  • How to avoid bad practices:既然書中提到7個流程模式,自然就會提到那些不好的做法會偏離這些模式,以及如何避免誤踩雷區。
  • Fitting SBE in our process:書中介紹的7個流程模式並沒有綁定任何特定工具,讀者融會貫通之後可以自行吸納到自己的開發流程之中。例如,在Scrum、XP或Kanban中套用SBE。
  • 50+ case studies:模式之所以被稱為模式,是因為模式針對重複出現的問題提出一個通過驗證的解決方案。本書是作者訪談超過50個案例並加以研究之後所整理出的7個流程模式,書中有大量的業界實踐SBE的佐證資料。書中Part 3特別用了6章來詳細介紹6個不同的案例,值得參考。

***

7個流程模式

本書的7個流程模式為:

  • (1)Deriving scope from goals:專案的範圍要如何界定?如果沒有目標,在專案進行的過程中一下子業務說加入A這個功能產品絕對超級賣,行銷說沒有B這個功能無法跟別人競爭,老闆說A.B…Z這幾個功能優先權都是1。照單全收的情況下最後導致功能膨脹,但預計上市的時程又不能延後。開發人員只好加班趕工,想辦法讓系統「看起來可以動」先過了這一關再說。專案團隊成員爆肝也就算了,更慘的是東西好不容易做出來才發現並不是客戶心中所想要的。沒有人要對這一片混亂負責,最後又怪開發人員做太慢、bug太多。

以上慘劇每天都在發生,這當然是大家想要避免的。所以專案的範圍必須從目標作為出發點,思考這個專案到底要給客戶和公司帶來什麼好處,採用「以終為始」的思考方式,對於達成專案目標沒有直接貢獻的功能應該加以排除,以免做白工。

  • (2)Specifying collaboratively:目標確定之後專案的規格要由誰來定?剛學Scrum的朋友可能會說:「需求是Product Owner負責的啊」需求是由PO排定優先順序這是沒錯,但並不是說所有需求都是PO一個人寫出來的。從敏捷開發的角度來看,需求是團隊一起討論出來的,這當然包含團隊與stakeholder的互動。SBE更加強調這一點,因此提出協作制定需求規格的建議。
  • (3)Illustrating using examples:規格不管是由一個人或是團隊討論而得出,不同的人對於相同規格總是有不同的解讀,這是因為語言與文字存在著模糊性。例如,雖然法律以及大法官對於警察臨檢有著明文規定與解釋令,但不同人對於「警察是否可要求穿拖鞋到小七買飲料的歐吉桑出示身分證」這件事卻很可能有著截然不同的見解。如果可以搭配案例(example)來輔助說明規格,如此不但可以減少對於規格的誤解,這些案例還可以做為日後相同事件發生時的檢驗標準(驗收測試)

屏幕截图 2017-03-22 10.25.40

 

  • (4)Refining the specification:理解與梳理規格是一個迭代的過程,隨著案例一個、一個出現,專案團隊與stakeholder對於規格越來越清楚,因此需要回頭整理原先的規格。
  • (5)Automating validating without changing specifications:等到規格與例子都整理得差不多了之後,就可以開始自動化。這個自動化的過程對應到Cucumber工具就是撰寫step definition,Teddy在BDD系列文章中已經舉過很多次例子。第5條流程模式的重點是:「自動化驗證而無須修改規格」,要做到這一點剛開始並不是很容易,實際做法可參考〈BDD(19)幫開發票功能加上使用者介面的三種方法〉。
  • (6)Validating frequently:既然已經把對於規格的驗收條件給自動化了,就必須要經常驗證這些條件,以確定系統進度與確保系統品質。
  • (7)Evolving a documentation system:最後,這些可自動執行與驗證的規格、例子與程式介面便成為系統的活文件(living documentation)。因為文件內容是由stakeholder與專案團隊共同討論,而且文件與程式碼隨時保持同步,因此是具備實際參考價值的活文件,而不像很多專案文件與程式已經不同步,變成沒有參考價值的死文件。

▼以上7個流程模式可以用下圖表示

屏幕截图 2017-03-22 09.50.59

***

讀中文版還是英文版?

經過Teddy這一番解釋,鄉民們先在腦袋裡面建立起這本書的概念圖,然後再去讀這本書應該比較容易看得懂。這本書有出正體中文版,Teddy也買了一本,內容翻譯的不錯。但是,Teddy對於正體中文版有一點覺得非常、非常的傻眼,那就是:「Specification By Example為什麼要翻譯成『Spec.實例化』?」把一個完整的名詞拆成兩半,前面用英文後面用中文讀起來真的不太習慣,讀正體中文版的時候每看到一次「Spec.實例化」就好像撞到一次牆一樣,思緒就被中斷一次。為什麼不用「實例化規格」、「規格實例化」或是直接用SBE都好。因為這個名詞貫穿整本書,用了「Spec.實例化」這個翻譯真的讓Teddy每看到一次心中就碎念一次啊。

***

友藏內心獨白:這是介紹SBE還是介紹Pattern啊。

2017年1月12日 星期四

[還少一本書] 你的早晨是什麼?

Jan. 11 17:40~18:00; 20:30~21:28

屏幕截图 2017-01-11 17.38.54

 

最近這兩個多月都處在頹廢狀態,今天要介紹的這本書是頹廢時期唯一讀完的一本書,書名叫做《你的早晨是什麼?一個插畫家的日常見聞》。這本書由Kay所推薦,因為他覺得Teddy和書中作者有三個相似之處:

  • 都是台北艋舺人。
  • 都是在家工作者。
  • 都出過書。

有了這些共同點,對於作者在書中所描述的故事,Teddy理應很有共鳴。

***

這是一本讀來很輕鬆的書,作者描述自己生活中的一些小故事,包括他在淡水河左岸的山中生活兒時老萬華(艋舺)點點滴滴的回憶旅行中所發生的趣事懷孕期以及小孩誕生後對於生活的影響,最後則是身為一位插畫家,關於創作的一些心得

舉一則作者在書中提到的故事—作者住在八里的半山腰,住家附近多是工廠和「福地」(墓地)。有一次夏天夜晚作者在浴室洗澡,剛脫光衣服的當下居然在地板角落發現一條小蛇,而且是毒蛇。當作者請男友過來趕蛇的時候,蛇已經跑走了。

隔天作者室友居然說他殺了一條龜殼花。在洗臉的當下小蛇對著他吐信,室友情急之下反射性地拿起蓮蓬頭用熱水沖小蛇。受不了熱水淘淘不絕的攻勢,不久後小蛇就一命嗚呼。

這就是作者「住在山哩,夏天會遇見的一兩件事」

***

Teddy特別喜歡這本書「明滅城居」這個章節,敘述作者兒時生長於老萬華的記憶。以下引用書中的一段話:

台北舊城裡,

將要消逝的風景、聲音,

未來或許也會有新的、不同的

生活方式在這裡展開。

這個章節提到龍山寺萬華大拜拜寶斗里大廟小宮矮房子萬華夜市鹹粥紅燒肉蚵仔煎剉冰紅豆湯圓愛玉冰(補充一個作者沒提到的仙草),這些文字立刻在Teddy腦中產生相對應的影像,彷彿回到屬於自己特有版本的童年。很有即視感,外加一點點對於歲月如梭的感嘆。

你非常有可能不住萬華,甚至不是台北人,但你一定有一段專屬自己的回憶。讀讀這本書,也許平常單調無奇的生活,加上一點感情,也可以是值得一再緬懷的記憶。

***

友藏內心獨白:人生一輩子,留下的只有回憶。

2016年8月17日 星期三

[還少一本書] Domain-Driven Design Reference

August 15 16:30~18:30

螢幕截圖 2016-08-15 17.15.53

 

合法免費電子版可下載

前幾天在〈[還少一本書] Domain-Driven Design Distilled〉介紹一本不到150頁的Domain-Driven Design(領域驅動設計)書籍,今天介紹這本《Domain-Driven Design Reference: Definitions and Pattern Summaries》(簡稱《DDDR》)更加袖珍,本文只有72頁。

這本書的作者就是領域驅動設計的發明人,撰寫《Domain-Driven Design: Tackling Complexity in the Heart of Software》(簡稱《DDD》)的Eric Evans。在《DDD》出版10年之後,Eric Evans整理書中重要的pattern的定義,寫成今天要介紹的這本《DDDR》。

在介紹這本書之前先說明一下,這本書有作者Eric Evans提供的免費PDF/Word版本可在此下載

這本書副標題已經說明了它的目的:定義與模式摘要(Definitions and Pattern Summaries
。書中用1~2頁的篇幅介紹一個pattern,一共介紹40幾個pattern,方便想要快速瀏覽每一個pattern內容的讀者。

▼Bounded Context模式,節錄自《DDDR》。

擷取

***

小缺點

既然這本書作者提供了電子檔,內容Teddy就不多加說明。今天想談兩點,首先這本書的pattern有一個美中不足的地方,就是格式不統一

▼例如從書中目錄來看,感覺第一章介紹了六個pattern。

擷取

 

▼但翻到內文,比較一下下面Refactoring Toward Deeper Insight和上面Bounded Context模式的內容,格式明顯不同。Bounded Context模式的Therefore:之後的內容屬於解決方案(Solution),這是參考Alexander的格式。但是Refactoring Toward Deeper Insight並沒有這個段落,到底這是一個pattern還是只是用來交代一個概念的章節就不是很清楚。

擷取

***

模式語言(Pattern Language)

▼下圖節錄自書中的「領域驅動設計建構模組之模式語言」(A Pattern Langauge for Building Blocks of a DDD),書中有幾張類似這樣的圖描述不同的DDD主題。這種圖稱為模式語言(Pattern Language)

擷取

 

接下來要談如何讀一個模式語言。根據發明模式語言的建築師Alexander的說法,一個模式語言會有一個起點,從上圖來說就是Domain-Driven Design模式。這個起點定義了這個語言的「整體的感覺」,起點之下的第一層模式讓這個起點更加完整。Domain-Driven Design模式之下有ServicesEntitiesValue ObjectsLanguage ArchitectureSmart UI這五個模式。也就是說Domain-Driven Design的建構模組(building block)由這五個模式所組成,而Domain-Driven Design模式成為這五個模式的情境(context)。

EntitiesValue Objects之下還有其他模式,像是RepositoriesAggregatesFactories,閱讀的方法同上。RepositoriesAggregatesFactories這三個模式讓EntitiesValue Objects模式更加完整,而EntitiesValue Objects模式則是這三個模式所存在的context。

上圖的模式語言和Alexander的模式語言有兩點不同:

  • 模式與模式之間的有方向箭頭代表兩個模式的上下關係,在Alexander所畫的圖中箭頭是並沒有標示關係名稱,而Eric Evans所畫的圖有。標示關係名稱的圖看起來很像UML class diagram。
  • Domain-Driven Design模式和Smart UI模式中間的線沒有方向性而且還打個叉,用以表示這兩個模式彼此是互斥的。模式彼此之間互斥關係似乎在Alexander的模式語言中沒有看他這樣用過。

***

友藏內心獨白:看圖說故事比較容易記憶。

2016年8月9日 星期二

[還少一本書] Domain-Driven Design Distilled

August 09 07:30~09:37

螢幕截圖 2016-08-09 09.21.53

 

上禮拜五因為要買《Building Microservices》這本書特別跑去天瓏書局逛了一下,在書架上看到《Domain-Driven Design Distilled》(DDDD)這本新書。家中已經有三本DDD(Domain-Driven Design)的書,每本都厚達4~5百頁,買回家之後擺在書架上幾乎沒看。這本不到150頁的《Domain-Driven Design Distilled》看起來容易讀多了,當然要買回家。

原本以為這本書會和它的其它三本「前輩」一樣淪落到擺在書架上的命運,沒想到因為《Building Microservices》提到DDD的具體應用情境,讓Teddy在上週末讀完《Building Microservices》之後在昨天緊接著把《Domain-Driven Design Distilled》看了八成。今天擠不出什麼料就來介紹這本書好了。

***

在開始介紹之前先來一段「無責聲明」,以下所說純屬Teddy目前對於DDD的理解,其中可能包含誤解,大家姑且當做看戲聽聽就好。

聽過物件導向分析設計(OOAD)的鄉民們應該知道,開發軟體的流程可視為一種塑模(Modeling)的過程。問題經過分析之後得到domain model,接著進入設計階段產出design model,再進入實作階段產生implementation model。

Domain-driven design,顧名思義就是以上述的「domain model」為主的一種設計。但DDD和OOAD不一樣的地方之一是DDD希望同一份domain model既是開發人員與領域專家溝通的共通語言,也可以直接對應到程式碼。

一個系統有可能涵蓋數個不同的(sub)domain model,例如進銷存系統就包含了進貨、銷貨、會計、庫存管理、客戶關係管理等領域。用傳統的分析方法,可能會嘗試建立一個很大的domain model來一致性的表達不同(sub)domain之中的概念,以利於團隊成員溝通。但是這麼做其實很困難,因為人的腦袋要一口氣理解為數眾多的概念以及它們之間的關係,其實非常困難。此外,有些概念可能同時出現在不同的(sub)domain但卻有不同的意義。例如,「退貨」對於銷貨領域和會計領域的意義與做法就很可能不一樣。

DDD提出Bounded Context這個概念(這其實是一個pattern,DDD發明者Eric Evans把DDD用pattern的格式來表達),以上面進銷存系統為例,如果把進貨、銷貨、會計、庫存管理、客戶關係管理視為不同的Bounded Context(界限環境、界限上下文),則它們所屬的domain model只需考慮在該Bounded Context的情況即可。

***

▼這個想法其實很簡單,在〈什麼是Pattern(9):Pattern的胚胎期〉中曾經討論過。如下圖所示,假設大圓圈內的每個黑色員點代表一個概念(concept)或domain object,如果把一整個軟體系統視為一個「大世界」,則在做分析設計的時候所要考慮的概念與關係就變得很複雜。

Image (38)

 

▼如下圖所示,如果可以找出Bounded Context(兩個小圓圈代表兩個Bounded Context),則每一個Bounded Context所要關注的domain model就相對簡單許多。

Image (39)

 

每一個Bounded Context裡面的domain model就成為DDD的另外一個重要pattern的骨幹—Ubiquitous Language(通用語言)。Bounded Context和Ubiquitous Langauge在《Domain-Driven Design Distilled》書中將其比喻為國家和語言。例如法國說法語、英國說英語、德國說德語。每個國家好比一個Bounded Context,該國的語言在這個國家界限之內是通用語言(Ubiquitous Langauge),大家都可以理解這種語言。但是離開這個國家之後,原本的Ubiquitous Langauge在另一個國家就沒有意義(例如在法國人聽不懂德語是正常狀況)。請注意,DDD所說的Ubiquitous Langauge並不是全世界通行(整個專案規模通行)的共通語言,而只是通行於某個特定Bounded Context的「國語」

***

看到這裡鄉民們可能會說,哪又怎樣?這不就是一種模組化的概念嗎?嗯,廣義來講是這樣沒錯,但故事還沒結束。透過Bounded Context把大問題切成小問題之後(由上而下的設計概念),最後每個小問題解完還是要合併成整體才可以發揮作用。每一個Bounded Context之間的關係必須被探討與管理,才可以讓它們一起合做成為一個整體。DDD透過Context Mapping來表達這個關係。兩個Bounded Context對映關係有很多種,包含PartnershipShared KernelCustomer-SupplierConformistAnticorruption LayerOpen Host ServicePublished LanguageSeparate WaysBig Ball of Mud。這些關係都可以視為一個pattern。

DDD還談到domain model要如何設計。DDD把domain model的元素分成EntityAggregateValue ObjectService等。在《Domain-Driven Design Distilled》書中還提到Domain Event的溝通方式,透過Domain Event可以讓其他人知道某個domain object狀態改變並因此做出回應。

***

透過《Domain-Driven Design Distilled》這本書可以快速理解DDD的重要概念,之後再去讀《Domain-Driven Design》或《Implementing Domain-Driven Design》應該會容易許多。

***

友藏內心獨白:看到pattern就好辦了。

2016年6月13日 星期一

[還少一本書] 學問—100種提問力創造200倍企業力

June 11 16:41~19:37

螢幕截圖 2016-06-11 18.15.11

 

昨天把《學問—100種提問力創造200倍企業力》這本書的前五章看完。這本書的中文書名取的很 奇怪,可以算是「標題黨」的最佳範例之一。這是一本介紹焦點討論法(Focused Conversation,又稱為ORID)的書,整本書350幾頁分成兩個部分。第一部分1~5章只有87頁,介紹焦點討論法。後面超過2/3的篇幅舉了100個實際應用焦點討論法的例子。由書的內容安排便可知道,這個方法本身不難,著重於方法的實際應用。

焦點討論法是一種透過四個層次的引導性對話,省思團隊成員的經驗以獲取團體真正的想法、感受或需求的一種方法。這四個層次包含:

  • 客觀性層次(The Objective Level)「客觀」代表在心智以外,去除感覺和意見的外在可直接觀察到的事實。在這個層次討論的問題主要與感官有關,包含看到、聽到、聞到、摸到、嚐到什麼。例如:「這個演講你記得哪些關鍵字?這個sprint我們完成什麼?沒完成什麼?上次會議的結論是什麼?這個sprint你聽到什麼對話讓你印象深刻?」

先討論客觀性問題可以確定團體中的每個人接下來所要討論的都是相同的事實或資料,等於建立起討論的基準線。此外,客觀性的問題很容易回答,先討論這類問題可以讓與會者暖暖身,卸下討論的心防,開口說話。

  • 反映性層次(The Reflective Level):Reflective是反映、反射、反思的意思,這個層次的問題要讓與會者和討論主體建立起個人的關聯,從與會者個人過去的經驗來回答自己對於客觀性事實所引發的感受(喜歡、憤怒、興奮、害怕)、心情、回憶或聯想。這類問題主要的目的是要分享隱藏在內心的感覺或情緒。

這類的問題有:「哪些課程內容讓你感到開心?哪些內容你聽了想睡覺?哪些內容你聽了會覺得擔心?這個sprint什麼事情讓你感到振奮?什麼事情讓你感到悲傷?Sprint review結束時你的心情如何? 對於未成完的工作你有什麼感受?」

  • 詮釋性層次(The Interpretive Level):基於前兩個層次的討論,在這個層次中與會者進行深度探討,對於事實與反映賦與其意義重要性價值觀可能性等。

這類的問題有:「課程的重點是什麼?課程與我們現有的哪些工作項目相關?它如何挑戰我們現行的規定?哪些做法讓我們順利完成這個sprint的工作?我們從沒完成的工做中學到了什麼?」

  • 決定性層次(The Decisional Level):讓這次對話與未來產生關聯,與會者透過形成決議來結束本次討論。討論的結果可能是短期或長期的決定、行動或承諾。例如:「課程內容對誰的工作最有幫助?我們能做什麼把課程內容實際應用於工作上?我們的下一步是什麼?誰來負責這些行動?你會建議如何處理sprint未完成的工作?」。

***

第一次接觸到焦點討論法應該可以追朔到有一次在某公司參加Scrum團隊的自省會議(retrospective meeting),團隊的ScrumMaster從網站找了一種進行自省會議的方法。ScrumMaster依據ORID四個層次依次提出問題並請團隊成員在便利貼上寫下看法,最後在獲得改善結論之後完成該次自省會議。

在那次會議中,ScrumMaster並沒有使用ORID這個名稱,只是依據從網站中所找到的自省會議流程照做一次。當時Teddy的感覺是:「為什麼要這麼麻煩問四個層次的問題呢?」Teddy發現幾個現象:

  • 可能是ScrumMaster並沒有非常了解這個方法,導致所發問的問題感覺起來彼此之間沒有什麼關聯性,只是「為了問問題而問問題。」
  • 因為問了四個層次的問題,整個自省會議的時間拉得比較長。
  • 更慘的是,由於團隊成員剛開始接觸Scrum才幾個月的時間,最後討論出來的改善計畫也是讓人頗為啼笑皆非。

這1~2年ORID方法在台灣的敏捷圈變得特別流行,陸陸續續又在不同的場合中體驗過幾次,也聽Erica轉述過,但Teddy除了看到熱鬧的招式(形式)以外一直沒有體驗到讓人驚豔的特質(quality),甚至連它要解決什麼問題都有點疑惑了。昨天讀了《學問—100種提問力創造200倍企業力》之後,有種比較清楚的感覺。

  • 這個方法原先被使用於「藝術形態的對話」,讓一群學生用來討論梵谷的「星夜(Starry Night)」,後來才被拓展於各種不同主題的對話。了解這個方法的起源,比較能夠想像它的原始情境,這一點很重要。
  • 傳統的對話強調「主張」,發言者強力推銷自己的看法以尋求別人的支持。另一種對話的方式則為「探詢」,採取開放不設限的態度,尋求更有創意的看法或可行的替代方案。好的對話應該要平衡主張與探詢
  • 學習的關鍵,是組織內的個人與團體不斷將經歷轉化成深刻的理解,以及個人風格上的蛻變(p. 40)。這一點可以應用焦點討論法來促成團隊的省思,也可提升團隊自組織的能力。
  • 焦點討論法並不是要用來教導什麼特定的知識,它只是一個對話的過程,討論的答案沒有對錯。它唯一可能的失敗,就是討論結束後團隊並不知道自己真正的想法。
  • 焦點討論法有四個層次,分別有四個前置條件必須成立,這個方法才可成功的被應用:
    • 所要討論的東西必須是外顯且可被觀察的「事物」,要看得到、模得到、聽得到。
    • 反映性層次的感受與外在可觀察的資料一樣真實。因為有些人傾向避免透露自己內心的真實感受,認為這是個人私密的情感。在這種情況下這個方法就會失效。
    • 詮釋性層次的意義來自於每個人深思自己生命中的真實生活經驗,而非來自於特殊際遇之下的經驗或深奧的文學(學術)作品。
    • 整個對話的目的是希望能夠改變未來,沒有行動的討論僅止於內省的自我觀照,只是紙上談兵。
  • 焦點討論法是一種引導式的討論,雖然參與討論的團隊才是活動的主人,但引導者的表現也會極大的影響討論的結果或效用。

***

根據Erica前一陣子去上完焦點討論法課程的經驗,課程的很多時間都在設計問題上面。的確,要扮演好引導者的角色,問對問題是很重要的第一步,另外臨場反應的能力也很重要。可想而知這都需要不斷地練習、觀察與從經驗中反思。

這本書非常容易閱讀,對於焦點討論法有興趣的朋友值得細細品味一番。

***

友藏內心獨白:怎麼又出現一種Doing ORID VS Being ORID的對比感。

2016年3月29日 星期二

[還少一本書] 讀書力(下)

March 27 12:59~13:55

擷取

▲側標(書背)很重要

這一集節錄書中第一章的名言佳句:

  • 讀書讀得越多,越容易成為獨行俠,因為經常讀書的人擁有自己的世界。
  • 思考的行為必須透過語言。一個人想事情時,原則上也是以語言思考。語言的詞彙少,思考難免粗糙雜亂。思考,必須要豐富的語言支撐。
  • 讀書當然是為了磨練知性與感情;在這同時,讀書也是為了讓一群優秀的人長住自己心中。讀書的主要目的,不光是取得資訊。
  • 持續而廣泛地閱讀不同類別的書籍是極為重要的工作。有人說,只要看書櫃就能了解一個人。
  • 擁有自己的書櫃令人感到快樂,感覺上彷彿可以用雙手掌握自己愈來越寬廣的世界。
  • 時間原本如砂一般,逝去之後便會毫無形跡、消失無蹤,然而時間會紮紮實實地凝聚、存留在書裡。這份安定感,實在令人感到喜悅。
  • 我的信念是不該借書來讀而該買書來讀,其實原因就在側標(書背)。好不容易才把書讀完,要是那本書不見了,就很難回想當時的經驗,甚至連讀過那本書的事情都很難回想起來。
  • 靈感是指腦中突然湧入一陣靈氣和創意。無意間看到書的時候,會恰好想起什麼。這和刻意尋找的動作不同,這是書的側標帶來的靈感。
  • 排列書本的目的不只是整理,所以按照一般分類排列未必最好。我反而比較喜歡考慮內在的關聯,排列不同類的書籍。
  • 把書和書連在一起思考的習慣,能夠大幅提升讀書力。讀書範圍越廣,越容易定位書籍的內容,進而顯著地提升讀書力。
  • 「原來不只我有這種經驗」的感覺,能為自己的生命注入勇氣。
  • 重要的不是體驗本身,而是自己能否確實掌握體驗的意義,能否活用自己的經驗。加深體驗的意義,讓體驗成為經驗。讀書有助於累積這種經驗,看到優秀的作者闡述和自己相同的經驗或意見,才能放心地肯定自己。
  • 在某段期間持續閱讀一本書,讓讀書與生活重疊,這就是讓讀書本身成為體驗的要訣。
  • 爽快地選定單一答案當然很輕鬆,但是思考也可能會因而停滯。不讓思考停止,反覆咀嚼,才能積蓄力量。
  • 小孩的閱讀和大人的閱讀之間差別很大。小孩的閱讀是讀了一次就了解,閱讀的時候不必忍受不了解的感覺,讀書力也不會逐日提升。就像進行重量訓練時總是只用六、七分力,再怎麼訓練肌耐力也不會增強。……不要因為「看不懂所以很無聊」就不看了,重要的是懂得積蓄不了解的感覺

***

Teddy自己也經常在寫部落格沒有靈感的時候求助於書櫃與側標,很能體會《讀書力》書中所描述的情境。好書值得多次閱讀,隨著自己成長,每次閱讀都可能有不同的體驗。如果只為了收集資訊,快速把書讀完之後馬上拿去網拍換現金,就太可惜了。

***

友藏內心獨白:你的心中住了哪些作者呢?

2016年3月28日 星期一

[還少一本書] 讀書力(上)

March 27 11:05~12:14

螢幕截圖 2016-03-27 12.13.49

 

政大書城台大店在3月20日吹熄燈號,結束營業前一周剛好到台大附近吃飯,順道繞過去才知道現場在正舉辦庫存書35折優惠。由於價格實在太便宜,抱持著貪小便宜的心態,Teddy和Kay一不小心就買了29本書,一共才2905,平均一本100元。雖然其中有不少是庫存舊書,但花點時間還是可以發現不少意外驚喜。

今天介紹的這本《讀書力》就是當時無意間看到的一本不到200頁的小書,回家讀了之後發現寫得很棒。作者齋藤孝(日本人)在書中提到他自己對於為什麼要讀書的看法,並提出如何讀書的建議。喜歡讀書的朋友看了這本書會有「心有戚戚焉」的感覺,不常讀書的朋友看了之後也可以學習作者介紹的讀書方法,並且體會作者所提到的讀書樂趣。

書中有許多很有趣的觀點,一集寫不完,分兩次介紹。

***

作者對於如何培養「讀書力」提出在四年內閱讀150本書的建議,等於一年讀37.5本,一個月要讀3.125本。而且這150本可不是什麼漫畫、推理小說之類的書,而是100本文庫書和50本新書。文庫書(不包含推理小說或純娛樂的書)和新書是日本書版社的一種書系名稱,Teddy也不懂,所以先記住閱讀書籍的數量就好XD。

有些鄉民們可能會覺得:「我又不夠聰明,怎麼可能讀那麼多書?」作者認為,讀書並非靠「智商」,而是靠以往閱讀的累積。持續就是力量,就好像長跑或健行,只要每天練習,慢慢增加距離,就算不是運動健將也能夠培養出足夠的耐力。

***

為什麼要讀書?作者認為讀書是形塑自我的最佳方法,可以協助個人逐步建構出自己的價值觀與世界觀。書中有一句話:「自我形成的問題是無法逃避的。不必透過讀書達成嚴肅的自我形成、只要高興就好的風潮,使得有些人錯失自我形成的過程,轉而求助於極端的危險宗教團體。」這種狀況,不要說在日本,在台灣,而且是資訊、IT、醫療產業,也有類似的狀況啊。不然哪來那麼多橫空出世的詐神、大師,靠著造神運動與招攬信眾為自己銀行帳戶培養即戰力呢。

讀書還可以讓人體會安靜獨處的成長時間,書中提到「一個人安靜地面對自己的時間,也是自我形成階段當中不可或缺的」。軟體設計有open-closed principle(開放-封閉原則),人也應該如此,平衡與他人交流以及自我獨處的時間。純粹追求場子熱鬧就好,或是搞自閉,都不是健康的做法。

書中接著提到,讀書其實也不是真的「自己一個人獨處」,而是與寫書的人一起,共度屬於兩人的時光。「人必須和優秀的人對話,才能達到整體的成長,問題是未必每個人身邊都有優秀的人。不過只要有書,就能聆聽優秀的人說話,即使那些人已經不在世上也無妨礙」。

***

看到這裡鄉民們可能會想:「難道多讀書就不會被騙嗎?很多被騙的人不也是知識份子?」這裡有兩個可以討論的地方,首先,多讀書不表示「一定」不會被騙,但至少可以提高自我判斷的能力。對自己多一點信心,就少一點「被造神」的機率。其次,知識份子不代表「具備讀書力」,他們可能跟Teddy一樣,只是具備某種專業,例如資訊、法律、醫療,僅此而已。

***

友藏內心獨白:以作者的標準來看,Teddy讀書量遠遠不及格啊。

2015年12月10日 星期四

[還少一本書] 激發員工潛力的薩提爾教練模式

Dec. 09 11:43~12:58

螢幕截圖 2015-12-09 12.47.47

 

身為一位敏捷開發培訓講師與導入顧問,無時不刻都在尋找更有效的方法以協助客戶。尋找的範圍當然不限於軟體領域,舉凡建築、人機互動、製造生產、心理學等學科,到哲學、佛法、道德經等比較抽象的人文思想,全部服用。不管黑貓白貓,只要能抓老鼠的就是好貓。

有一陣子朋友跟Teddy推薦可以藉用「教練」與「引導」的方法來協助團隊實踐敏捷開發並培養團隊成員自己主動解決問題的能力。聽了之後覺得很有趣,買了幾本書來看,發現這類的書幾乎都有以下幾點共同模式(pattern):

  • 人是有智慧的生物,願意且有能力自我成長。
  • 只要透過適當的「對話」與「引導」協助,讓對方發現自己的盲點,對方就可以藉由改變自己的行為模式來解決問題。
  • 大徹大悟之後,績效大大提升,功德圓滿。

書中一定都會提供很多故事告訴讀者應用這些方法所能帶來的好處,讀了這些書之後Teddy心中一直有一個疑惑:「這不科學啊XD!嗯嗯,應該說怎麼書上的說法和自己的體驗差那麼多。

***

Teddy覺得教練或引導的方式,和禪宗讓人「頓悟」的目的很像,做的好應該是真的可以改變人的行為。所以說到頭還是自己經驗還不足,使出這些方法常常遇到對方的反應是:

  • 你不要拐彎抹角的跟我囉嗦這麼多,你想說什麼就直說,不要耍這些手段想讓我自己說出你要我說的話。
  • 我就是什麼都不知道才需要你的協助,你還一直問我問題是什麼意思?不是說好「投降輸一半嗎?」我承認自己是白癡這樣還不行嗎!
  • 防禦性回答。每次回答問題之前都在「揣摩上意」,而不是真心地表達自己的想法。
  • 當下好像真的有所發現,表現出大徹大悟的樣子,行為也短暫地改變了,但過一陣子之後又打回原形。跟減肥一樣,短暫服藥之後有效果,一但停藥自己又不保持良好的飲食與運動習慣,很快就復胖了。

前一陣子Yves在Facebook上推薦了《激發員工潛力的薩提爾教練模式》這本書,讀了之後發覺這本書有幾個優點:

  • 只有250幾頁,很快就可以讀完。
  • 是台灣人寫的書,文章讀起來感覺比翻譯的書要容易有共鳴。
  • 書中談到作者在跟台灣公司的高階主管介紹顧問方法的時候,經常被打槍(覺得這一套行不通)或是對方會說「自己老早就已經是這樣做了」。這點Teddy頗有感觸,因為自己在介紹敏捷開發的時候也有相同的經驗,所以覺得這本書「真實感」比較強一些。
  • 另外書中提到主管應該扮演三種角色:
    • 主管:以權力服人,要合法的範圍內適當使用組織所賦予的權力,例如核定薪資、考何、用人、開除等。
    • 老師:以能力服人,透過有效的溝通,指導員工解決問題並傳承經驗。
    • 教練:以德服人,將目標放在幫助員工改變模式,而不是只解決問題。

針對不同類型的員工與不同的專案特性,主管要適當的切換這三種角色。例如,教練的角色通常需要花費很長的時間來幫助員工,所以可能剛開始只能先從想要培養的員工開始著手,而不是「一視同仁」無論是誰都慢慢引導。至於新進員工可能需要多一點「老師」的協助,好讓他可以具備工作上所需的知識與能力。至於那些打死不改的員工,也要適時發揮主管的魄力,該砍人的人時候也不能太過猶豫。

***

書中用了很多對話的例子來說明薩提爾教練模式如何運作,當然故事結尾不免還是落入經過教練的引導之後「公主與王子從此過著幸福快樂的日子」的美好結局。能不能做到就要靠讀者自己的努力,無論如何這本書提供了一個可以快速理解教練方法與技巧的參考,有興趣的鄉民請自行服用。

***

友藏內心獨白:有時候當頭棒喝也是必要的一種手段。

2015年9月7日 星期一

[還少一本書] 史上最強哲學入門 :從釋迦牟尼、孔孟到禪宗,啟悟自我內心的13位東方哲人

Sep. 01 17:49~18:40

螢幕截圖 2015-09-01 18.36.41

 

前幾天買了一本書:《史上最強哲學入門 :從釋迦牟尼、孔孟到禪宗,啟悟自我內心的13位東方哲人》,讀了之後覺得「我的媽呀,怎麼有一本寫的這麼棒的書!」,解答了Teddy內心的許多疑問。

這本書首先提到印度哲學的思想「梵我合一」,接著提到釋迦牟尼的「無我」,龍樹的「」,解釋「心經」對於空的看法。接著提到中國的孔子、墨子、孟子、荀子、韓非子、老子(解釋一小段老子的道德經)、莊子。最後解釋「」的含意。

原本Teddy對於佛教的「無我」、「空」的思想很有興趣,但沒有機緣遇到大師開悟,也沒找到合適的書籍,所以一直不明白其中的道理。無意間在網路上查到這本書,發現書中有解釋這些觀念,雖然這本書的書名讓人看起來覺得很誇張:「什麼史上最強,這一定是吹牛嘛!」讀了之後發現還真的是非常強的一本書啊。

***

這本書有很多東西可以談,今天先談書中一開始提到的一個觀念:「東方哲學和西方哲學有何不同?」書中認為:

  • 西方哲學是以「無知」為前提,追求真理的過程就是不斷質疑、反駁前人的哲學。
  • 東方哲學是以「全知」為前提,偉大的哲學家已經悟出真理,後人只能解釋這些真理。

從敏捷開發的角度來看,以「無知」為前提的西方哲學很類似Linda Rising所說的「agile mindset」,而以「全知」為前提的東方哲學則是「fixed mindset」。從字面上鄉民們應該就可以猜出來,agile mindset比fixed mindset要好。

Teddy跟一位朋友介紹這本書,提到以上這些概念。朋友問了一個問題,讓Teddy一時間不知如何回答。

朋友:如果東方哲學是fixed mindset,那為什麼要讀這本介紹東方哲學的書?

嗯…對啊,很好的問題,為什麼要去學習fixed mindset?這一切的一切,都要從建築師Alexander講起。Teddy讀了Alexander的書之後,聽到一種講法,說他的觀念和老子的道德經很像。有一陣子Teddy嘗試去讀道德經,但能力不足看不出個所以然來。後來Teddy偶然發現,電影「達摩祖師傳」的很多片段,和Alexander的觀念很像,於是引起對於禪的興趣。既然Alexander的想法影響了很多做敏捷開發的大師,如果可以了解禪、道德經的精隨,想必對於Alexander的理論,應該會有不同層次的見解吧。

但這些以東方哲學為出發點的思維,如果真的是fixed mindset,怎麼又會影響一群人搞出agile mindset?想必其中案情並不單純。Teddy目前也沒有頭緒,只是覺得東方哲學對於「個人心靈平靜」有很大的助益。對於做人處理,乃至於敏捷開發的實踐者而言,「在各種情況之下保持心平氣和」的這種能力也是很重要的修行啊。

***

這是一本很有趣的書,推薦給對於哲學入門有興趣的鄉民們。

***

友藏內心獨白:人生就是不斷地修練啊。

2015年5月26日 星期二

[還少一本書] SCRUM:用一半的時間做兩倍的事

May 22 16:05~18:00

螢幕截圖 2015-05-22 16.55.47

▲才剛要寫本篇Eiffel小朋友就跑過來「壓書」。不知道 Jeff Sutherland 會不會覺得頭有點重重的 挑眉質疑

***

前幾天收到天下文化出版社贈送的這本《SCRUM:用一半的時間做兩倍的事》,正所謂無功不受祿,道義上幫忙打個廣告。收到的書沒有印上「贈閱」印章,感覺好很多。光這一點就要給天下文化出版社一個讚很棒

話說2014年10月一位老同學送給Teddy這本書的英文版,不過Teddy到現在還沒看完(遮臉)。收到中文版就偷懶一下,分享讀完中文版的感想。

***

這本書的作者Jeff Sutherland是Scrum的兩位發明者之一(另一位是Ken Schwaber),沖著這一點就應該買一本回家收藏。但請注意這本書並不是介紹Scrum的入門書,而是一本「宣揚Scrum」或是「行銷Scrum」的書。書中提到1990年代作者開始設計Scrum的許多背景原因,包含:為什麼瀑布式(waterfall)開發不管用、Scrum為什麼要叫Scrum、Scrum受到哪些大野耐一所發明的「豐田生產系統」所影響、設計Scrum三種角色(Product Owner、ScrumMaster、Developer)的動機、自組織(self-organizing)團隊的靈感、為什麼要組成5~9人的跨職能(cross-functional )與多能工(multi-skills)團隊、Scrum著眼於改變制度以便於改變人的理由等。對於想要了解Scrum歷史故事的人,書中有許多有趣且有用的資訊。

書中還提了很多Scrum的「神勇事蹟」,包含Scrum如何拯救FBI的「哨兵專案」免於失敗,許多團隊如何在作者的指導之下,在短時間提升好幾倍的生產力。讀完這些故事鄉民們心中一定會覺得:「在專案中沒有採用Scrum我真是它XX的對不起國家,對不起天地父母」。回公司趕快也來Scrum一下(疑!?)。

Teddy覺得不同讀者群看到這本書可能有不同的感受:

  • 老闆或是高階主管:看到書中這麼多的成功案例,而Scrum的確也在全世界很多地方流行,老闆可能會動心改變現有做法。書中提到:「不改變,就等死」,還有各種戲劇性提升效率的好處,換成是Teddy當老闆也會動心啊。
  • Scrum推廣者:書中提到發明Scrum的背景,還有很多成功案例。推廣Scrum的時候有這麼多故事可以講,可以增加許多說服力。參考作者的寶貴經驗,也可以反思自己在推廣Scrum的時候是否有什麼可以持續改善的地方。
  • Scrum團隊成員:正在實施Scrum的人,如果可以了解Scrum框架設計的背景與原因,長期而言對於從「Doing Agile」變成「Being Agile」,從「守」到「破」甚至演化到「離」的層次,都有幫助
  • 鄉民:就…看看熱鬧,了解一下這個在國外已經非常流行的敏捷方法,當成增廣見聞,閒聊時的題材也是不錯。

***

好話講完接著要說缺點:

  • 作者過於強調「Scrum可以在短時間大幅增加生產力」這個觀點,實際導入之後可能會大失所望,甚至成為老闆責怪團隊或是宣告Scrum失敗的理由。依據Teddy的經驗,導入Scrum之後應該會亂個3~6個月,此時生產力很可能會下降,而非上昇。但作者卻有辦法在一個月之內提升一倍的生產力,真的很神奇。Teddy想到一種可能性,就是第一個sprint把案子搞砸,這樣第二個sprint就可以獲得大幅成長(這是什麼心態…Orz)。
  • 書中很多成功案例並沒有描述作者克服問題的細節。就好像有些電影,一開始先告訴你大魔王有多麼可惡,喪盡天良、壞事作絕(點出問題)。後來受苦受難的鄉民們努力尋找傳說中有能力可以打敗大魔王的「救世主」。在上天的安排之下,果然大夥找到在鄉下養牛的救世主,而救世主最後也不負眾望,戲劇性地擊潰大魔王,拯救無數的鄉民。在這本書裡面,Scrum扮演救世主的角色,只要Scrum一出現大魔王就潰不成軍。看完故事的你如果也想當救世主,大概只能找作者(尤達大師?)當顧問,否則很難了解原力(force)的奧妙,無法重現奇蹟。
  • 這本書中文版翻譯的很好,讀起來很順暢。但在第298頁有一個小缺點,把「Certified Scrum Master」翻譯成「敏捷專案管理師」,Teddy認為這個翻譯會誤導讀者。Scrum團隊強調自我管理,為什麼需要「敏捷專案管理師」來管理?書中把 ScrumMaster 翻譯成「Scrum 大師」,所以 Certified ScrumMaster 應該翻譯成「認證Scrum大師」會比較好。

***

敏捷開發談的是靈活、適應性,是讓企業與組織如何在變化的環境中保持成功而生產力的提升,應該是把事情做對、做好之後的自然結果。讀這本書的時候把重點放在作者設計Scrum的原因,多體會敏捷開發精神,先少關注「神奇海螺式的產能提升」,比較不會不小心走火入魔。

***

友藏內心獨白:修練絕世武功本來就要小心一點。

2015年4月17日 星期五

[還少一本書] Executable Specifications with Scrum

April 01 09:20~10:38

螢幕截圖 2015-04-01 09.36.12

 

這幾天利用一些時間把《Executable Specifications with Scrum: A Practical Guide to Agile Requirements Discovery 》這本只有160多頁的「小書」很用力的重讀一次。一年多前第一次讀這本書,覺得這本書根本是掛羊頭賣狗肉,名不符實,書中提到「Executable Specifications」的地方好少,都在講一些對於熟悉Scrum的人早已知道的事情,例如story的寫法、用planning poker做估算、與stakeholder合作一起產生需求、product backlog管理與梳理、用taskboard追蹤進度等。從73頁開始才提到直接與「executable specifications」相關的內容,而且這些內容很淺顯,感覺沒有搔到癢處。

這次重讀卻有另外一種全然不同的感受,覺得這本書寫的很好,把敏捷開發(Scrum)與需求有關的主題描述的很清楚,有一種打通任督二脈的感覺。怎麼會有這麼大的反差勒?

當初會買這本書是因為這幾年對於「specification by example」與「BDD/ATDD」這個主題一直有興趣,一看到書名「Executable Specifications with Scrum」就被吸引了。但Teddy覺得這本書的副標題「A Practical Guide to Agile Requirements Discovery」當做書名會比較好,因為書中的重點並非著重在「executable specifications」的技術面(程式與工具),而是告訴讀者在Scrum的框架之下,如何落實「executable specifications」這個實務做法。否則讀書的時候一直在找「executable specifications」的程式範例與工具介紹,會有一點小失望啊。看了這本書在Amazon上的讀者評分,只有區區的2.5顆星,這可能是原因之一。

螢幕截圖 2015-03-31 21.19.31

***

這本書的重點可以用書中的這兩張圖來介紹,首先看到Figure 6.10,整個Scrum的需求管理流程,從梳理product backlog開始,將大的需求透過rank(區分等級、排優先順序)、illustrate(詳細說明)、size(估算規模)、split(切割)這四個步驟逐步拆分成小而明確的用戶故事。在Scrum框架中,grooming又稱為product backlog refinement,佔用每個sprint的5%~10%的時間。

螢幕截圖 2015-04-01 09.46.40

 

接著參考Figure 6.9,在grooming活動中,Scrum團隊與stakeholder針對每一個user story共同訂出幾個用來表達重要需求的「key scenario」,從這裡開始就慢慢浮出「executable specifications」的味道。每一個「key scenario」在specification workshop(參考Figure 6.10)會被展開成更詳細與具體的scenario,然後透過工具寫成自動化驗收測試案例。

螢幕截圖 2015-04-01 09.46.54

***

回到Figure 6.10,在sprint planning開始之前的specification workshop並沒有出現在標準的Scrum框架之中。作者建議在這個活動中將「key scenario」展開,以便做為sprint planning中,每一個story的驗收條件。

接下來的事情就很簡單,選擇一個團隊喜歡的工具,像是Fit/Fitness或是Cucumber/JBehave/SpecFlow,將這些scenario翻譯成可執行的自動化驗收測試。

***

Teddy自己的經驗,有些團隊嘗試在grooming就列出story的所有scenario,導致團隊成員經常有grooming的時間不夠用與整個流程太繁瑣的抱怨。針對這個問題,這本書的建議就是Figure 6.9與6.10提到的方法,用兩階段的方式將scenario逐步列出來。書中並且建議每一個story指派一位開發人員當做這個story的「分析師」,負責完成詳細scenario的撰寫

聽起來不錯,但是仔細一想整個流程變的越來越複雜,而且書中建議specification workshop不要超過2小時,如果無法完成所有的scenario,被指派為「分析師」的開發人員要找時間把工作做完。因為完成每一個story的scenario成為「Definition of Ready(DoR)」的一部分,所以sprint planning相對來說就可以進行的比較順利(因為story的驗收條件已經先定義好了)。

耶,聽起來有點up-front design的味道,是嗎?是啊。隨著團隊落實的敏捷實務做法越多(Definition of Done越來越完整),的確會有一些之前沒被強調的工作慢慢冒出來。但大體精神還是秉持著iterative與incremental的做法,一次做一點、成長一點。雖然看起來好像多花了時間在up-front design,但得到的好處卻是讓團隊每個sprint結束之後的產出物更接近「可以立即交付給使用者」的這個目標。因為需求的正確性在開發流程的早期已經被提出探討,而且可以被重複地自動驗證,所以「理論上」開發完成的軟體功能應該和使用者的期待不會落差太大。

***

「Executable specifications」串起了軟體開發的價值鏈上下游,要真正落實需要花費一番功夫,不是用自動化測試工具寫寫驗收測試就好了。一路上雖然艱苦,但最後的果實卻很甜美,值得投資。

***

友藏內心獨白:光會使用工具無法發揮全部的戰鬥力啊。

2015年3月16日 星期一

[還少一本書] 行為的藝術:52個非受迫性行為偏誤

March 07 10:55~11:50

螢幕截圖 2015-03-07 11.53.38

 

今天要介紹《思考的藝術:52個非受迫性思考錯誤》的作者所寫的另一本類似的書《行為的藝術:52個非受迫性行為偏誤》。這本書和前一本其實很像,就當做作者又整理出52個不同的小故事,來提醒大家避開不該做的行為

哪些行為是應該要避免的呢?舉幾的文章中的例子:

  • 胡說八道可以掩蓋無知。如果表達不清楚,那就是說話者不知道自己要說什麼。…世界是複雜的,人們必須花費許多心思才能理解一個觀點。在你有這樣的頓悟之前,最好奉行馬克吐溫的話:「如果無話可說,就閉上嘴巴。」簡潔,是漫漫長路的終點,而不是起點。
  • 試著與最少的訊息共存,才能做出更好的決定。不需要知道的事,即便知道了,還是沒有價值。
  • 當人對一件事投入大量精力時,就會誇大其價值。例如,你相信必須取得 PMP證照  MBA學位,但它真的值得推崇嗎?那個追求多年的女人,難道她真的好過另一個巴著你的女孩?
  • 內省並不可靠。當我們注視內心時,自己卻已在虛構某些事情。反思、內省大部份都是捏造出來的東西,太相信自己和相信自己太久,覺醒時會更殘酷。因此,你越是相信某樣東西,越是應該以更批判的角度來看待它。一個聰明人不需要教條,讓自己成為自己的異教徒吧!
  • 聘用一個能力比你更強的人,否則你的公司很快就會滿是輸家
  • 為什麼我們對愚昧無感?我們不會因為一個理論被證明是錯的而揚棄它,只會在有更好的選擇出現時才放棄它
  • 未完成的任務會不停折磨我們,直到我們清楚知道如何和它們相處。
  • 我們資訊充足,但所知甚少。想要了解世界,沒有什麼比的上書。

***

亞里斯德說:「智者的目標不是獲得幸福,而是要避免不幸。」希望鄉民們讀完這本書之後,可以邁開成為智者的第一步 XD。

***

友藏內心獨白:人類還真容易被騙啊。

2015年3月2日 星期一

[還少一本書] 思考的藝術:52個非受迫性思考錯誤

Feb. 25 10:26~11:17

螢幕截圖 2015-02-25 10.34.53

 

農曆年前利用睡前與通勤的時間,讀完《思考的藝術:52個非受迫性思考錯誤》這本書。這本書用52篇各三頁左右的小短文,解釋日常生活中人們無意中就被「唬弄」的思考錯誤。文章採取說故事的形式,讓讀者從一個個小故事裡面,看出作者想要表達的52種思考盲點。例如,在「泳將身材的錯覺」這一篇,作者提到一個想要藉由運動來減重的人,在選擇運動種類的時候,想起游泳選手每個都擁有完美的好身材,於是他決定苦練泳技。經過一段時間的魔鬼訓練之後,他突然恍然大悟,發覺游泳選手之所以有傲人的完美身材,並不是因為他們進行了大量訓練,而是他們原本就擁有好身材。也就是說,他們的體格是某種「篩選標準」,並非他們運動後的「結果」

作者提出「只要我們將篩選標準與結果兩者倒果為因相互錯置,我們就陷入了『泳將身材的錯覺』」。很多廣告就是利用這種思考錯誤而大行其道,例如找原本皮膚就很好的美女來廣告保養品,或是找阿雞師廣告食譜。另外像是「哈佛大學真的是一所好學校嗎?」是因為全天下頂尖的學生進了哈佛大學,還是這所學校的教學品質真的很棒,答案並不是那麼確定。還有「讀MBA(或是念碩士)真的可以增加收入嗎?」還是大家又犯了倒因為果的思考錯誤呢?

***

這本書雖然讀來輕鬆,但讀完之後卻讓人心驚膽跳:「哇,原來平時我們的思考居然有這麼多錯誤的盲點,而我們卻渾然不知啊。」

最後引用書末引自愛默生的一段話作為結尾:

在群體裡,容易依照別人的想法過活;在孤獨裡,容易依照自己的想法過活。可是,唯有在群體裡還能夠保持著特立獨行,才值得我們注意。

***

友藏內心獨白:大隱隱於市?

2015年1月22日 星期四

[還少一本書] 點子就要秀出來

Jan. 20 11:42~12:20

螢幕截圖 2015-01-20 12.19.49

 

最近讀了Erica推薦的《點子就要秀出來》這本書,此書作者之前寫過另一本《點子都是偷來的:10個沒人告訴過你的創意撇步》,也很有趣,下次有機會再介紹。今天截錄Teddy覺得書中寫得很好的句子,也推薦鄉民們買一本回家閱讀。

  • (不需要自我推銷)做到出類拔萃,別人就不會對你視而不見
  • 透過大方分享點子與知識,它們往往能贏得有一天會派上用場的觀眾。
  • 我們可以不要再問其他人能為我們做什麼,開始問自己能夠為其他人做什麼。
  • 日本禪僧鈴木俊隆說:「初學者的心,面向無限可能;老手的心則飽受羈絆。」
  • 如果你的作品沒有放上網路,就是不存在……如果你希望人們了解你的工作,了解你所在乎的事物,你就得分享。
  • 創作即是日常事物的總集,是一段過程,不是一樣東西。
  • 持續把過程公諸於世,你就可以與顧客建立一種關係,讓他們看到產品背後的靈魂人物。
  • 分享是出於慷慨大方——因為你覺得分享的內容可能會幫助、或取悅螢幕另一端的某人。
  • 要發掘璞玉,所需要的就是一雙清澈的眼睛、一個開放的心靈,以及願意在其他人不願意或不能到達的地方搜尋靈感。
  • 刪掉自我介紹中的所有形容詞…不要裝可愛,不要吹牛,陳述事實就好。
  • 不要浪費時間閱讀那些教你如何吸引更多追蹤者的文章 ,不要浪費時間在網路上追蹤某個人,只是因為你認為這對你有幫助。不要跟你不想聊天的人聊天,不要談你不想談的東西。
  • 很多人浪費時間和精力,試圖要建立人脈,而不是精進自己的能力,其實有所專長是唯一讓你擁有影響力或人脈的方法
  • 真正的風險在於不求變。

***

這本書213頁,很容易閱讀,推薦給頻率相同的鄉民們。

***

友藏內心獨白:讚。

2014年9月24日 星期三

[還少一本書] 絕不是靠運氣:創造事業與人生的雙贏

Sep. 10 08:38~09:55

螢幕截圖 2014-09-10 23.28.47

 

絕不是靠運氣:創造事業與人生的雙贏》(It’s Not Luck)的劇情延續上一本《目標:簡單有效的常識管理》,原本的主角廠長「羅哥」,因為成功套用限制理論拯救工廠,因而被優尼公司(UniCo)拔擢成為集團的執行副總,負責管理好幾間工廠。

優尼公司原本採用多角化經營的策略,旗下有不同領域的工廠。但在某次董事會後,公司策略轉變,要求賣掉非核心的事業體以求套現。而這個要被賣掉的非核心事業體,正是主角羅哥所負責的部門。羅哥無法扭轉董事會的決定,只能再度想辦法讓事業體的子公司在被賣掉之前,可以在短時間內大幅提高獲利,以避免出售之後子公司被解體的命運。

《絕不是靠運氣》還是繼續沿用限制理論來協助子公司,但書中增加了衝突圖未來圖等新的工具,希望能夠化衝突為雙贏。假設兩造雙方產生衝突,衝突圖的概念是先找出雙方共同目標,然後寫出雙方各自為了達成這個共同目標所採取的策略。最後,基於這項策略,雙方各自做了什麼會造成衝突的決定,然後試圖找出一個雙方都可接受的方法,來解決衝突。

螢幕截圖 2014-09-10 09.01.39

書中第14頁的衝突圖例子。

 

這本書比前一本的581頁要薄很多,只有364頁。以下節錄書中幾句Teddy覺得寫的很有道理的話。

  • 比批評更惱人的就是建設性的批評(p. 41)。
    • 如果是單純的謾罵不理對方也就算了,但是一針見血有道理的批評,卻讓人又痛又無法忽視。
  • 決定緩衝存量的因素有兩個:預期的消耗量,及預期的補貨時間。(p. 57)。
  • …我們只需要清楚地陳述負面的因果,而不提出解答…如果是我提出建議,他頂多會把我的建議當成具侮辱性的、不公平的要求(p. 79)。
    • 在解決衝突的時候,嘗試列出發生衝突的負面因素,並建立起產生這些因素的因果關係。讓衝突雙方經過溝通自行找出可能的解決方案。
  • 這套技巧(衝突圖)主張你不應該試圖找出妥協,它主張要檢視箭頭後(衝突點)的假設,以化解衝突(p. 109)。
  • 在我的公司中,我希望產品毛利不是接受訂單與否的必要條件之一。接受訂單與否,該考慮的只有訂單對整體產量及整體有效產出的影響(p. 207)。
  • 從供應商的角度來看,產品就是實質的產品,這個觀點只能容許有限的改善。若以市場的觀點來看,你就會發覺,對產品的看法寬廣許多,包含了相關的服務、財務條件、保證等等。產品包含了整套交易(p. 216)。
  • 真正決定市場眼中的產品價值,不是我們如何生產,而是買家能從使用產品中得到的好處(p. 217)。

***

這本書比較有趣的新觀念就是建構衝突圖,以及如何從衝突圖之中找出雙方都可以接受的雙贏方案。看起來好像很簡單,但是必須要有相當的練習經驗,才有可能應用自如。

***

友藏內心獨白:一次處理三家公司,還真忙啊。

2014年9月23日 星期二

[還少一本書] 目標:簡單有效的常識管理

Sep. 09 21:41~23:15

螢幕截圖 2014-09-09 21.48.59

 

又有一陣子沒有推薦 毒物 讀物給鄉民們,這次要分四次介紹「高德拉特」(Eliyahu M. Goldratt)的四本書,今天先介紹《目標:簡單有效的常識管理》(The Goal: A Process of Ongoing Improvement)。

高德拉特是一位以色列物理學家,他提出了限制理論(Theory of Constraints, TOC),期望用少數簡單的假設,來解釋複雜且廣泛的產業現象。為了解釋限制理論,他寫了四本小說(沒錯,小說),用說故事的方式讓鄉民們容易理解艱深的理論。

「天下文化」出本了這四本書的中文版,並將其歸類在「企管財經」類。原本Teddy很少讀這類的書,但在研究看板方法與精實開發的時候,發現許多人都提到限制理論與《The Goal: A Process of Ongoing Improvement》這本書,所以就乾脆把這四本全部買回來讀一次。讀完之後還蠻有趣的,覺得對看板方法的理解,又更深入一些。

這本書描述身為廠長的主角「羅哥」,管理一間虧損累累且即將倒閉工廠的故事。原本一籌莫展的羅哥,經由物理學教授「鐘納」的指點,套用了限制理論(書中翻譯成「制約法」),在短短的三個月內讓工廠奇蹟似地起死回生的故事(服用TOC的效果美好的有點像童話故事不要告訴別人)。

這本書的內容有581頁,以下節錄書中幾句Teddy覺得寫的很有道理的話。

  • 唯有透過推論的過程,我們才能真正地學習;直接把最後的結論擺在我們眼前,不是好的學習方式(p. 9)。
    • 這一點Teddy非常認同,在教學的時候,Teddy也是儘量用發問題的方式,讓學員們先思考與推論一下可能的答案。Teddy常說:「下課之後我不會跟你們回家,也不會到你們公司上班。希望大家上完課能培養自行餵食(自我解決問題)的能力。」
  • 除非你知道目標是什麼,否則你就無法了解生產力的真正意義。在你了解生產力的真正意義之前,你只不過是在玩一堆數字遊戲和文字遊戲罷了(p. 50)。
    • 很多人會覺得,員工很忙,在公司加班到很晚,就是好員工,就是有生產力的員工。錯!這些看起來很忙的員工,可能只是在產生更多的庫存而已,並非是真的有生產力。
  • 公司是否夠賺錢的三個重要指標:淨利、投資報酬率和現金流量(p. 75)。
  • 這套衡量指標一方面能充分表達出賺錢這個目標,另一方面也能讓你發展出工廠的基本營運規則。這套方法共有三個衡量指標,就是有效產出(throughput)、存貨(inventory)和營運費用(operational expense)(p. 92-93)。
    • 有效產出的定義很重要,書中的有效產出是指透過銷售所賣出的東西,而不是工廠生產出來的東西。如果生產一大堆東西卻賣不出去,一點用也沒有,這不是有效產出。
  • 表達目標的方式是:增加有效產出,但同時減少存貨和營運費用(p. 104)。
    • 以上目標對於軟體開發同樣適用,從敏捷開發的角度來看,採用value-driven的開發方式就是增加有效產出的手段,採用iteration開發方式與限制WIP則是減少存貨。至於減少營運費用,則是從重視品質,讓團隊成員立志成為專業的開發人員(請參考《Clean Code》與《Clean Coder》這兩本書)著手。
  • 有效產出是我們收進來的錢,存貨是目前積壓在系統中的錢,而營運費用則是為了讓有效產出能夠發生,我們必須付出去的錢(p. 114)。任何我們花掉的錢都是營運費用,任何我們可以藉銷售而回收的投資都算存貨(p. 118)。
    • 公司存在的目的就是獲利。從錢的角度來訂定指標,容易看出很多問題。
  • 每個人時時刻刻都在工作的工廠,是非常沒有效率的工廠(p. 132)。
    • 鄉民們的專案,是否也存在著上述的現象啊,每個人「看起來」都很忙,不過可能有很大一部分是在「瞎忙」。
  • 每個工廠都並存著兩個現象。一個現象就是所謂的「依存關係」(dependent events)…一個事件(例如作業程序)或一系列的事件必須等待其他事件發生之後,才能發生,也就是必須有賴前一個事件發生之後,接下來的事件才會依序發生(p. 138)。…當這些相關事件都和另外一個叫「統計波動」(statistical fluctuations)的現象結合起來時,事情就變大了(p. 139)。
    • 不管是專案管理還是軟體開發,相依性一直是造成系統複雜度的主因。
  • 我們不能單獨衡量某個資源的產能。真正的產能完全要看它在工廠流程中的位置而定(p. 220)。
    • 和精實開發強調關注全域(系統性思考)而非局部最佳化有異曲同工之妙。
  • 瓶頸不一定很壞,或很好,瓶頸只是你們所面對的現象罷了。…找到瓶頸在哪裡之後,你們必須利用瓶頸來控制通過系統和進入市場的流量罷了(p. 223)。
    • 瓶頸是一種限制,有限制不一定是壞處,要看組織如何利用這個限制。利用的好,可能只要付出有限資源,便可獲得極大的利益。

***

這本書還有很多有趣的內容,上面的引用已經夠多了,建議鄉民們買一本回家看。最後,把書中關限制理論的五步驟聚焦法列出來讓鄉民參考:

  1. 找出系統的瓶頸。
  2. 決定如何利用瓶頸。
  3. 根據上述的決定,調整其他的一切。
  4. 把系統的瓶頸鬆綁。
  5. 假如步驟4打破了原有的瓶頸,那麼就回到步驟1。

***

友藏內心獨白:中文書名的副標題沒有反應出原文書中的A Process of Ongoing Improvement這個重點啊。

2013年9月6日 星期五

[還少一本書] The Clean Coder

Sept. 05 17:25~18:45

螢幕快照 2013-09-05 下午6.44.26

 

離上次感冒痊癒才不過一個禮拜,前幾天又再度感冒。腦袋空空的只好在家裡讀一些不花腦筋的書。把出版社贈送的《The Clean Coder》中文版拿出來看,剛剛把書看完,順便寫一篇blog介紹一下。

這本書只有200頁多一點點,比起400多頁的《Clean Code》足足少了一半。本書一言以蔽之,就是作者Bob大叔提醒後輩們要如何做一位「專業人士」的經驗之談。書中很多建議做法都跟目前主流的敏捷開發方法互相呼應,也有少數幾項建議讀了可能會讓人吃驚,因為跟大家普遍的認知有所出入。

***

挑幾項Teddy覺得比較有意思的內容跟鄉民們分享。首先介紹作者認為專案軟體開發人員至少必須精通的事項:

  • Design patterns:可以描述GoF的23個設計模式,必且對於POSA書中所介紹的許多模式都有實務上的使用經驗。在這裡置入性行銷一下,要學design pattern有課程可以教你,請參考「第五梯次Design Patterns這樣學就會了熱戀
  • Design principles:SOLID原則,也就是Single responsibility principle、Open-closed principle、Liskov substitution principle、Interface segregation principle、Dependency inversion principle。
  • Methods:XP、Scrum、Lean、Kanban、Waterfall、Structured Analysis、Structured Design。 要學Scrum一樣有課程可以教你,請參考「第七梯次Scrum敏捷方法實作班熱戀
  • Disciplines:TDD、Object-Oriented Design、Structured Programming、Continuous Integration、Pair Programming。
  • Artifacts:UML、DFD、Structure Chart、Petri Net、State Transition Diagram and Table、Flow Chart、Decision Table。

鄉民們可以自行盤點一下,看看自己離Bob大叔心目中的「專業軟體開發人員」還差多少東西要學。

另外Bob大叔還建議:

  • 行就是行,不行就是不行,不要說「試看看」。
  • 要幫助他人,遇到問題時也要主動請別人幫忙,這樣才是專業人士的態度。
  • 心中覺得焦慮的時候不要寫程式。
  • 不開沒有意義的會議。
  • 要採用pair programming、TDD、CI、collective ownership些這敏捷實務做法。
  • 要利用機會多作練習,養成練習的習慣。

***

接下來談兩點Teddy覺得很有趣且可能跟一般人認知有差距的建議。

每周工作40 + 20小時

疑,敏捷開發不是說每周工作40小時嗎,怎麼Bob大叔要我們加班20小時?根據書中的說法,每周還是「替老闆工作」40小時,但後面的20小時是為自己工作。也就是每周要安排20小時作為提升職業能力,例如看書、練習、學新技術或程式語言、參C. C. Agile聚會、看搞笑談軟工部落格等挑眉質疑

Teddy覺得這個建議非常的棒,因為以前Teddy建議鄉民們每周工作40小時,但是並沒有提到自我學習的時間。很多鄉民還真的是非常聽話,每周「只」工作40小時,如果公司沒有安排任何的教育訓練,則員工們的工作技能就成長得很慢,甚至停滯不前。Bob大叔認為雇主並沒有義務要讓你(員工)的履歷表變得更好看,如果遇到好的老闆那真的很幸運,但是專業人員應該要投資時間在自己的職業發展上面,不能光是靠別人來「餵食」。

 

不要進入Flow Zone

中文版的書把「flow zone」翻譯成「流態區」,也有些人用「神馳」來稱呼這種狀態。之前有朋友跟Teddy討論過這個問題,因為有些書上建議開發人員應該不要被中斷,以便於進入「神馳狀態」。在這種狀態之下,生產效率極高,但只要工作環境無法讓人保持專心,就無法進入神馳狀態。所以有些人反對敏捷開發的工作環境,認為應該為開發人員配置專屬的私人辦公室以防被打擾。

相信所有的程式設計師都經歷過「神馳狀態」,享受著雙手不斷敲擊鍵盤的那種快感。但是Bob大叔卻建議大家:「不要進入flow zone」。因為在此狀態下只是處於一種「淺層冥想」,開發人員並沒有顧及全域,很可能會作出一些日後不得不打掉重練的程式

Bob大叔極力提倡pair programming,因為在此情況下雙方都不會進入flow zone(除非有人睡著了挑眉質疑)。

***

這本書很容易閱讀,對於有志成為專業開發人員的鄉民們,可以一窺大師的做事態度。

***

友藏內心獨白:有看有保佑。