l

2013年8月24日 星期六

2013金門考察之旅Day2-F獅山砲陣地

August 17 13:31~14:10

離開馬山之後下午2:40左右來到獅山砲陣地,這裡一樣有坑洞可以參觀,還有軍人跳砲操表演。

螢幕快照 2013-08-17 下午1.33.30

 

進入坑洞之前在戶外有一個「涼亭」可以稍事休息,旁邊還有砲彈與武器展示。

螢幕快照 2013-08-17 下午1.33.57

 

很多砲彈。

螢幕快照 2013-08-17 下午1.40.49

 

這應該是防空砲。

螢幕快照 2013-08-17 下午1.41.07

 

一隻獅子咬著一顆砲彈,不知道是不是因為沒有畫出黑眼球,覺得這隻獅子有點怪怪的挑眉質疑

螢幕快照 2013-08-17 下午1.34.13

 

在坑洞入口一樣提供鋼盔,但是依造往例沒看過有遊客配戴。

螢幕快照 2013-08-17 下午1.37.24

 

這個坑道異常的潮濕,入口處隔了幾間房間,當初可能是軍官的寢室。

螢幕快照 2013-08-17 下午1.38.09

 

這是入口處的一個房間,當年應該是作為中山室使用。

螢幕快照 2013-08-17 下午1.50.25

螢幕快照 2013-08-17 下午1.37.34

 

這個坑道還蠻大的,可能是因為需要把火砲運到裏頭的關係。裡面的展示品雖然看起來都蠻新的,但是因為濕氣實在是太重了,有一些展示場所無法使用,暫時封閉。

螢幕快照 2013-08-17 下午1.37.45

螢幕快照 2013-08-17 下午1.37.52

 

走到坑道底部便來到砲操演戀的場地,除了中午休息時間以外,約每小時表演一次

螢幕快照 2013-08-17 下午1.38.25

 

就是這門八吋大砲,這是當年823砲戰的時候,美軍運來支援國軍的設備。據說當年八吋榴砲的砲彈曾經打到廈門車站,把大半個廈門車站給夷平了。

螢幕快照 2013-08-17 下午1.55.38

螢幕快照 2013-08-17 下午1.38.36

螢幕快照 2013-08-17 下午1.38.46

 

獅山砲陣地離大陸的確是很近。

螢幕快照 2013-08-17 下午1.38.58

 

肉眼就可以看到廈門的高樓大廈。

螢幕快照 2013-08-17 下午1.39.13

 

只有砲口露出掩體外面。

螢幕快照 2013-08-17 下午1.39.34

 

砲操表演要開始了,這些表演砲操的「阿兵哥」有好幾位是女性同胞。

螢幕快照 2013-08-17 下午1.39.57

螢幕快照 2013-08-17 下午1.40.32

螢幕快照 2013-08-17 下午2.09.13

 

跳完砲操之後開放鄉民拍照。

螢幕快照 2013-08-17 下午2.09.22

***

友藏內心獨白:第一次看到砲操的現場表演。

2013年8月23日 星期五

重新整理Composite Pattern

August 16 23:00~23:56;August 17 12:07~13:00

螢幕快照 2013-08-17 下午1.00.27

 

今天介紹Composite模式,直接看整理後的結果。

***

Name:Composite

Context:你需要在程式中處理部分-整體(part-whole)的樹狀階層式結構。

Problem:如何表達部分-整體的階層式結構?

Force:

  • 你希望對於單一元素與聚合元素一視同仁。
  • 當新型態的物件被加入到部分-整體的階層式結構中,你希望原有的物件可以儘量不要受到影響。

Solution:定義一個元件介面使其包含所有在部分-整體階層式結構中的物件之共同功能,以及用來維持部分-整體階層式結構的功能。所有屬於部分-整體階層式結構中的物件必須實作此介面並維持其遞迴的組成關係。

***

友藏內心獨白:11/23,完成率47.83%。

2013年8月22日 星期四

重新整理Template Method Pattern

August 16 19:50~21:34

螢幕快照 2013-08-16 下午9.31.55

 

今天介紹Template Method模式,這是一個規範如何妥善透過繼承以達到重複使用程式碼以及提供擴充行為的模式。雖然物件導向程式語言提供繼承的功能,但是透過繼承達到程式碼重用原本就不是一件值得鼓勵的事情,所以GoF的書中才提到「favor object composition over class inheritance」。

Template Method滿足了「Narrow Inheritance Interface Principle」。這個原則告訴鄉民們,一個物件的行為如果分散在好幾個不同的方法上面,則子類別需要覆寫父類別方法的數量要越少越好。否則子類別任意覆蓋父類別的方法,會讓程式變得很難理解。

接下來看整理後的結果。

***

Name:Template Method

Context:透過繼承的方式可以達到到讓子類別重複使用父類別的程式碼,同時允許子類別覆寫父類別的方法以提供差異化的行為。

Problem:要如何表達擁有共同結構與行為,但卻有著些微行為差異的物件們?

Force:

  • 為了提供差異行為,如果讓子類別任意覆寫父類別的方法,則:
    • 父類別與子類別以及不同的子類別之間可能會存在重複程式碼。
    • 繼承架構所形成的程式碼將會不容易被理解。
  • 雖然將共同不變的行為定義在父類別之中可以達到重複使用程式碼的目的,若未加以特別區隔則子類別還是可能在有意或無意的情況下覆寫定義在父類別中的共同行為。

Solution:在父類別中定義一個範本方法(template method)用以規範共用的行為。Template method將其執行過程委託給數個hook method來完成,子類別可藉由覆寫這些hook method來達到提供不同行為的目的。可將宣告成靜態template method以避免子類別將其覆蓋。

***

友藏內心獨白:10/23,完成率43.48%。

2013年8月21日 星期三

系統管理團隊結合Kanban與Scrum的經驗

August 20 11:40~14:00

image

(影像節錄自此)

 

最近幾天部落格上面都是設計模式的文章,今天換個口味,回頭談一下敏捷開發。Teddy前一陣子印了幾十篇論文(請參考《沒事多讀paper,多讀paper沒事》),今天介紹其中一篇文章,篇標題為《Combining Kanban and Scrum- lessons from a team of sysadmins》,發表於2012 Agile Conference。

作者Katarzyna Terlecka在2010年的時候協助一個五人的系統管理團隊導入Scrum,其中包含兩位Windows平台管理者,以及三位Linux平台管理者。這兩群人彼此都不知道彼此的工作內容,除了因為原本處裡的工作所需的知識就不一樣以外,還有一些安全性的考慮,導致彼此之間的工作無法互相支援。這五人管理團隊負責支援分散在三個地點的約1,700位使用者,並且要負責管理1,000平方公尺的電信實驗室。他們還需要管理分散在兩個不同地點的四個伺服器機房裡面的約100台不同的伺服器。

***

開始嘗試Scrum

作者一開始被要求幫這個團隊導入Scrum,因為系統管理團隊的工作比較動態,因此他們採用了為期一周的sprint。掙扎五個sprint之後,作者發現Scrum在這個團隊中運作得並不順利。例如,sprint planning meeting幾乎是一場無止境的戰鬥。可能是因為團隊所遇到的工作項目太小(可能只需要幾分鐘的系統設定)且突發性的工作的比例不少,因此要他們做sprint規劃,即使是一周的sprint,都很困難。

***

開始嘗試Kanban

後來作者請團隊改嘗試Kanban,由於Kanban關注的是團隊的工作流程(flow)是否順暢,拿掉了固定開發週期(iteration或是sprint)的要求,因此乍看之下應該比較適合系統管理團隊的需要。

經過五天的嘗試之後,團隊還是一團混亂。雖然之前五周的Scrum經驗並不順利,但是團隊覺得他們還是需要某種程度的計畫、評量、Product Owner的關注、一個類似ScrumMaster的角色來協助改善開發流程與排除阻礙、以及了解進度。

***

混在一起做撒尿牛丸

經過這兩次不同的經驗,團隊討論後決定要擷取Scrum與Kanban的部分方法,找出一個適合他們這種系統管理團隊的開發方式。以下是團隊的作法:

  • Definition of Done(DoD):針對一些工作項目定義完成的條件。
  • Product Backlog:維持Scrum的Product Backlog,裡面的內容與優先順序交由Product Owner決定。
  • 實體工作工作看板:團隊的實體看板如下圖所示(節錄自該論文)。

螢幕快照 2013-08-20 下午2.07.23

 

  • 角色:文章提到了Product Owner與Kate(類似ScrumMaster)這兩個角色,沒有提到Team,不過看起來在角色方面應該是維持Scrum的作法。
  • 事件
    • 每周一次:依據主題不同分兩次舉辦,但是作者沒有解釋這個會議是要做什麼挑眉質疑。會不會是product backlog refinement workshop?
      • Technical grooming meeting
      • Customer-oriented grooming meeting
    • 每兩周一次:自省會議,基本上兩周舉辦一次,但也可能提早。
      • Retrospective meeting
    • Review meeting:由Product Owner發起,只要有功能完成便可舉辦。頻率不定,但最長不超過兩周。
    • Daily planning meeting:結合Sprint Planning與Daily Scrum的半小時會議,決定今天要做什麼以及檢視之前完成的工作。

***

以下是作者在文章中提到的一些經驗:

  • Product Owner:在以前的工作模式中,客戶(公司員工)一有問題通常是直接找系統管理人員處理,系統管理團隊並沒有人扮演PO的角色。這樣子會導致工作進度不透明,每個人都好像是一個小PO一樣。後來團隊協調出一個人來扮演PO的角色,所有客戶的需求一定要透過PO來處理,讓團隊成員可以不被中斷的完成工作。團隊花了一些時間讓客戶習慣這種改變,一旦習慣之後團隊的進度變得非常透明。
  • 規劃:每天都花一點點時間做規劃,因此每一天就好像一個很小的sprint一樣。
  • 救火的工作:很多瑣碎但卻很緊急的救火工作還是一個問題,因此團隊指派一個「消防隊員」(firefighter)的角色,針對緊急且簡短便可處理完畢的工作,客戶可以寄信到一個指定的電子郵件信箱,消防隊員將會負責處理這些工作。如果消防隊員發現客戶寄過來的工作太大,他會把這個工作交給PO來處理。
  • 持續改善:日常的工作已經多到快把團隊成員給淹沒了,很難有時間來進行什麼持續改善。他們的做法是將所有持續改善的想法先放在Product Backlog的最下方,每隔一段時間他們檢視這些改善項目,並挑選合適的改向項目出來執行。
  • 進度:作者提到Kanban有一個很大的問題就是團隊感受不到整體的進度,Teddy也曾經聽過,有人因為這個原因,從Kanban又改回Scrum。作者提到他們定期聚在一起檢視完成的工作項目,PO則是要確保Product Backlog保持最新的狀態。團隊則是藉由觀看完成的工作項目來了解進度。說實話關於這一點作者說明的不是很清楚,就算沒有混和Scrum的作法,團隊還是可以藉由觀看完成的工作項目來了解進度。
  • 多個執行緒:一開始的時候Teddy有提到,這個團隊包含Windows與Linux的系統管理人員,而他們兩者的工作是無法互相幫忙。團隊在工作看板上把待辦事項分成Windows與Linux兩種,用以解決這個問題。
  • 沒有Deadline:由於Kanban去除了固定長度開發周期的限制,因此並沒有像Scrum一樣,有一種工作必須在sprint完成的壓力。因此,有可能有些工作會一直拖下去。雖然Kanban可以藉由觀察與縮短lead time(交期)來避免這個問題,但對於剛導入Kanban的團隊,工作沒有deadline的確是可能造成一些困擾。文章中提到的作法是,針對關鍵的工作或是已經太久沒有完成的工作,團隊可以指定完工期限。不過作者並沒有提到,指定完工期限但是工作還是沒完成那該怎麼辦挑眉質疑
  • 不再需要評估:因為系統管理的工作經常都很難評估,因此之前採用Scrum的時候,團隊在sprint planning meeting經常為了評估而吵翻天。現在團隊不再評估工作項目,PO單純計算完成的工作項目來得知團隊的速度(velocity)。

***

以上經驗,提供給鄉民們參考。

***

友藏內心獨白:各取所需變成Scrumban?

2013年8月20日 星期二

重新整理Abstract Factory Pattern

August 16 15:38~16:30

螢幕快照 2013-08-16 下午4.28.15

 

今天介紹Abstract Factory,基本上Abstract Factory就是在一個介面中定義了好幾個Factory Method,用此來產生一群型態不同但卻相關的物件。請直接來看整理後的結果。

***

Name:Abstract Factory

Context:你想要用Factory Method來產生一群型別各不相同的相關物件,例如在圖形介面框架中,產生Window、Button、Check Box、List、Text等型別各不相同但卻一起使用的相關物件。

Problem:如何產生物件?

Force:

  • 每一種所要產生的物件型別通常有著一種以上的實作方式。
  • 不同實作方式的相關物件,無法放在一起使用,否則會造成系統錯誤或是傳達不清楚的語意。

Solution:定義一個AbstractFactory介面在其中包含了若干個Factory Method用以產生一群不同型別的相關物件。針對不同的實作方式,實作不同Concreate AbstractFactory,以便透過它傳回一組語意相容的具體產品類別。

***

友藏內心獨白:9/23,完成率39.13%。

2013年8月19日 星期一

重新整理Factory Method Pattern

August 16 11:00~13:47

螢幕快照 2013-08-16 下午12.11.11

***

今天介紹一個看起來很簡單但是仔細一想又有點小複雜的模式:Factory Method。依據GoF書中的定義,Factory Method將產生類別的工作交由子類別來達成。因此「標準」的Factory Method在Creator類別身上會有一個Template Method(下圖中的operation),在這個Template Method裡面呼叫Factory Method來產生產品物件。實際產生的產品物件由ConcreteCreator(Creator類別的子類別)藉由覆寫Factory Method來決定。

螢幕快照 2013-08-16 下午1.29.15

 

在《Visual Basic Design Patterns: VB 6.0 and VB.NET》和《Head First Design Patterns》介紹了一個與Factory Method類似的模式叫做Simple Factory。Simple Factory也是一種Factory Method,也是將產生物件的過程寫在一個method裡面。主要的差別在於Simple Factory並沒有像「標準」的Factory Method一樣,要求產生產品物件的責任一定要交給子類來達成。如果把產生類別的這個method用static來實作,則這種作法又稱為Static Factory。

***

Factory Method、Simple Factory、Static Factory,哇哩勒,這麼多意思相近名稱又不同的模式,看到快暈倒。在《POSA 4》這本書裡面,把上述三種模式全部都歸類在Factory Method裡面,但是將Factory Method區分為三種不同的類型:

  • Simple Factory Method:Simple Factory
  • Polymorphic Factory Method:GoF書中「標準」的Factory Method。
  • Class Factory Method:Static Factory

背景資訊介紹完畢,接下來看整理後的結果。

***

Name:Factory Method

Context:許多物件導向程式語言提供我們用new表示式來產生物件,但並非所有的物件都可以簡單地透過new來產生。

Problem:如何產生一個物件?

Force:

  • 你有一群繼承自相同介面的產品物件,
    • 你想要將產生哪一個具體產品物件的責任交由子類別來決定,可能是因為在編譯期間你並不知道要產生哪一個具體類別,又或者是你想要提供子類別產生具體產品類別的彈性。
    • 你允許客戶端傳入參數來選擇所要產生的具體類別。
  • 物件產生之後尚須經過經過適當的設定步驟才可以傳回給客戶端使用,如果可以將產生物件的過程從客戶端抽離出來,則可以避免客戶端產生重複的程式碼。

Solution:將產生物件的詳細步驟封裝在一個factory method裡面,讓客戶端程式透過這個factory method來得到新的物件。

***

友藏內心獨白:8/23,完成率34.78%。

2013年8月18日 星期日

2013金門考察之旅Day2-E馬山

August 11 21:22~22:16

離開瓊林之後來到位於金門最北端的馬山,這裡離對岸的角嶼、大小嶝只有2公里左右,是金門本島距離對岸最接近的地點,有「天下第一哨」之稱。這個景點有馬山播音站馬山觀測站,不過馬山播音站沒有開放參觀,只能參觀馬山觀測站。

螢幕快照 2013-08-11 下午9.24.08

 

看這個地形,好像也是挖山而成的坑道。

螢幕快照 2013-08-11 下午9.30.06

 

馬山三面環海,附近的景色與地形很漂亮。

螢幕快照 2013-08-11 下午9.24.30

螢幕快照 2013-08-11 下午9.26.56

 

往裡走會先看到馬山播音站,這裡曾經有48個巨型喇叭向著對岸廣播。鄧麗君來到金門的時候曾經在這裡向對岸的大陸同胞播音。

螢幕快照 2013-08-11 下午9.24.40

 

繼續往裡走看到還我河山四個大字,應該是要不回來了挑眉質疑

螢幕快照 2013-08-11 下午9.25.01

 

來到馬山觀測站,據說這是一個全長174公尺的戰備坑道。

螢幕快照 2013-08-11 下午9.25.11

 

往裡走首先看到阿兵哥拿著槍站衛兵的照片,看了很有fu。

螢幕快照 2013-08-11 下午9.25.21

 

現在的坑道應該是有整修過,感覺還蠻乾淨的。

螢幕快照 2013-08-11 下午9.25.29

 

到了坑道底部有一個觀測所,可以看到對岸。

螢幕快照 2013-08-11 下午9.25.55

螢幕快照 2013-08-11 下午9.26.04

螢幕快照 2013-08-11 下午9.26.17

 

牆上貼有一些以前的照片,這一張是老蔣總統巡視部隊的照片。

螢幕快照 2013-08-11 下午9.26.23

***

準備離開馬山,離開前到拍幾張附近的照片。旁邊的海灘好美,但不知為什麼都沒有人在這裡玩水。

螢幕快照 2013-08-11 下午9.28.15

螢幕快照 2013-08-11 下午9.28.02

 

看幾張全景圖。

螢幕快照 2013-08-11 下午9.29.19

螢幕快照 2013-08-11 下午9.28.30

螢幕快照 2013-08-11 下午9.28.57

 

這裡還是有國軍駐守,不然哪一天對岸的同胞真的過來拜訪我們,沒有人接待也是說不過去的挑眉質疑

螢幕快照 2013-08-11 下午9.27.21

***

友藏內心獨白:從這裡游到角嶼、大小嶝應該比游到廈門要輕鬆很多吧。