code

顯示具有 Agile 標籤的文章。 顯示所有文章
顯示具有 Agile 標籤的文章。 顯示所有文章

2017年11月17日 星期五

Agile Software Development 9 - Agile Methods 評比

Ugly (太過極端或是因咽忘食)

1. 不做早期requirement analysis與架構設計: 先期的analysis是必要的,不要太過火就好。
2. user stories不能取代requirement spec
3. test也不能當作requirement spec: 因為test cases不夠全面,是點狀
4. 忽略或是否認系統components之間的dependency: 幾乎是不可能independent
5. Scrum Master應該要寫code
6. TDD 代替analysis - 太極端
7. manager腳色被替代 - self organizing team是個理想,完全取消manager是個幻想
8. 不考慮未來extendibility/reusability - 太短視近利


Hype (不重要的主張)

1. pair programming - 之前說過了
2. 開放辦公空間
3. self-organizing team - 理想
4. 可持續性步調 - 我認為這是重要主張,只是時常現實面達不到
5. MVP - 這也是要看客戶需求而定
6. planning poker - ?
7. cross functional team - team內還是有專家的
8. embedded customers - 通常這類人員代表性不足,也很難在開發過程中產生作用


Good (agile methods中值得採用的方法)

1. acceptance of change - 闡明"改變"是軟體開發的本質之一,接受這個本質,甚至可以變成競爭力
2.  iterative development - 應該是"short"iteration才是重點
3. code是重點 -沒錯,不要一直"討論討論討論"
4. tests是重點 - 這真的是重點!!!!!!!!!!!!!!!!!!!!!!
5. 常態性regression tests
6. velocity - 給progress一個衡量指標
7. no branch - 這邊我不確定原因為何,看來作者同意multiple branches是個危險的設定,需要找更多相關資訊。
8. product burndown chart - velocity的視覺化,這讓所有參與者知道目標快達成(落後)了沒?
9. daily meeting - 有心理學上的意義


Brilliant (軟體工程中的高明見解)

1. short iterations - 哈,看來我看法跟他一樣
2. closed-window rule - 在iteration中不能改任何requirement / spec
3. refactoring - 不斷精進
4. 所有的functionality都該有associated test - 達到quality software的基本要求
5. 伴隨第一點就是以及no branch就是Continuous Integration


Quality is Key

and is King


2017年11月16日 星期四

Agile Software Development 8 - Artifacts

Artifacts (用來support agile practices的工具)

很怪的名字。


User Story

可以使用小卡片(story cards),用來表示最不可分割的requirement。



Task card: story card的companion task。

Use case

可以說是複查精確版的user story,用來描述如何透過系統中或外的各種互動來達成某個task / business goal,是UML diagram的一種類型:



Product backlog (Scrum)

包含以下功能:



Task board

這是product backlog的具體化:


所以trello介面基本上就是一個task board

Velocity (Scrum)

這是scrum嘗試要描述project progress的指標,可以用各種想要的指標,具體化的artifacts是burndown chart:


Bullpen (XP)

大開放空間,方便溝通,資訊流通。


2017年11月10日 星期五

Agile Software Development 7 - Testing Practices

Agility achieved thru Testing

agility = speed + quality,而quality只能透過不斷的testing達成。

Code and Tests 這是agile methods核心兩物體。


所有程式都一定要有unit tests (XP)

XP這個宣言是比較嚴格,但不見得是極端的宣言。
伴隨這個宣言就是,所有unit tests要通過才能進入下一個開發 phase。

所以這邊可以使用Lean中的Waste定義:沒有通過unit tests的code基本上就是waste!
這是要極力避免的。

YOU
    SHALL
          NOT
                PASS!!!!!


Test-first Development (XP)

使用tests來取代spec,也被generalize成一種開發方法,稱為test-driven development。


最主要的優點是,等於永遠保持最新的regression tests 定義!
regression test就是過往已經測試過但是failed的tests,開發過程中,一個已經解決的bug通常有機會因為code變動又出現了,所以如果採用test-driven開發的話,基本上等於一直在測試所有過去定義過的tests,也就是可以發現是否發生了failed regression tests。

Bug是沒有測試到的部分 (XP)

bug在test-driven development (TDD)眼中,重新定義成沒有被test cover的部分,所以要fix bug跟開發一個新的function一樣,先寫test!!!!

這其實是相當先進的觀念,我覺得能徹底執行一定很棒。

Root-cause Analysis (XP / Scrum)

這好像沒啥好說的,基本上fix bug本來就該知道root cause不是?

Automating User Acceptance Tests (UAT)

這其實就是automated tests,不過是以UAT 為出發點來寫test cases。這樣也能確保regression tests不會重啟問題。

另一個比較有趣的:可以出版UAT score給team知道,讓大家知道目前版本對過去automated UAT測試的狀態。


Agile Software Development 6 - Scrum Release Practices

Frequent Release Policy

這是agile的中心思想,而且這是執行spring / short iteration的必然結果。有時候甚至一天可以有好幾個release。


Continuous Integration

不間斷地透過testing把所有人的code保持整合(integrated / merged) 狀態。
好處:
1. 越小變動,越好整合
2. team每次整合都能學到東西
3. 早期發現問題可以小成本更動
4. 重複的模組可以早期消除

Small release / incremental deployment

這是上面兩個policy貫徹後的結果。


at most 10-min build

這是要讓 continuous integration 更順暢的方法,要不然每次build非常久的話,很難貫徹incremental integration/deployment。


Agile Software Development 5 - XP Development Practices

爭議的Pair programming

兩個人坐在一起programming:
1. 明確說出自己的邏輯
2. 兩個人互相砥礪 (監視 XD)
3. 腦力激盪

爭議在於這樣是否浪費人力?是否有提高生產力?
結果一些研究證明,pair programming並沒有較好的生產力。


Single code base (不要有任何branch)

這在現今的工作環境應該很少見了,我想好壞處都有,可能case by case吧。

Share Code (XP)

agile practices不建議讓code expertise只落在一個人身上,最好整個team都能了解。
這個變成禍福與共,以及減低人員流動造成的斷層風險。

Optimization Last

這個common sense。


Simplest Design and Refactor Often

這當然也是大家追求的目標


Incremental Design

這個容易被誤解,他主要精神應該是“不要太快抽象化(abstraction)”,例如太快決定要用什麼design pattern,因為design pattern就是一個高階抽象思考的代表。為什麼不要太快抽象化?因為有個“優先採用最簡單設計”為前提的思考,然後看program如何演變再來打造,這也隱含了deliver first, refactor later的概念。

不過批評者認為花時間做abstraction thinking才是一個好的programmer該有的特色,而且前期花的時間不會白費,當然deliver 時間會稍微晚一點 (相比於上段所描述)。


System Metaphor

用metaphor來思考系統設計? 有點怪。


Refactoring

也是老生常談了。


2017年11月8日 星期三

Agile Software Development 4 - Meeting Practices

Daily meeting (XP / Scrum)

每天早上15分鐘的站立會議,所有重要roles都必須要參加,主要focuses:

1. 描述昨日進度與今日規劃
2. 發現阻礙

每天描述進度是一個心理學技巧,讓人不至於說空話打混,因為每天都有人記得你昨天說了什麼,也能夠檢視。此外公開承諾會有心理壓力,可以克服拖延症。


Sprint Beginning meeting (Scrum)

Scrum sprint在開始之前會有最多一個整天的會議,上半天是讓product owner + team member  討論出"product backlog",分出product features的輕重緩急。
下半天是team內針對product features決定tasks,並且分出輕重緩急,產出"sprint backlog"。

Sprint End meeting (Scrum)

這稱為retrospective meeting,所謂對內的檢討大會,參與者當然就是所有的team members。主要討論這個sprint做對了或是做錯了什麼事。

最多三小時。

Review meeting

這是對外的成果檢討會。


簡單來說,各種會議主要就是幫助sprint推動往更好的方向。

2017年11月7日 星期二

Agile Software Development 3 - Roles

Agile最醒目的特徵就是redefine manager!!!

傳統經理人工作

1. 設定工作目標
2. 設定交期
3. 分派任務
4. 與高層溝通
5. 與客戶溝通
6. 檢驗客戶需求
7. 檢驗工作成果
8. 強制交期
9. 輔導訓練
10. 規定方法與規範


Strict Scrum的3種腳色

scrum的最大貢獻是在管理方法的改變上,完全廢除了manager的腳色。

1. self-organizing team
(a) cross functional: members有專業交集,不會有一人獨占某個專業或是事項
(b) 心理學研究較好組合 5~9人
(c) 對某特定sprint (iteration)規劃目標與實作
(d) team自己分配工作
(e) 能嘗試任何方法,只要方向朝向結果
(f) sprint結束後,向product owner展示工作成果

可以看到team已經分擔了傳統經理人不少的工作,其中又有"core members/participants" 以及 "fellow travelers"兩種投入程度不一的腳色,主導者主要應該是core members,而fellow travelers可以在被諮詢時發表意見,但不參與主導腳色。

2. product owner


比較像是project manager的腳色

3. scrum master

這個比較像是manager的腳色,主要目的是確保Scrum被正確的推動:

關於scrum master不參與開發(真的寫code)是蠻有爭議的,不見得每個scrum implementation都會採用這種認知。


這邊要特別講一下什麼是impediments,就是任何讓team開發速度慢下來的事物,包括:
1. 硬體資源不足 (SSD?!?!?)
2. requirements不清楚
3. 軟體資源不足 / 測試資源不足
4. 高層干預
5. 官僚制度


Other Roles

1. expert-users: Crsytal提出一個腳色為真的user但是對整個產品或是project能提供專業意見者。

2. Customers: XP提出customer是一個重要的腳色,這其實跟exper-users差不多。主要就是在開發團隊中要有一個user/customer的腳色提供意見。

3. developers: 這好像不用多說吧

4. trackers (XP,Scrum):tracker在追蹤一個重要的指標稱為"velocity",定義為理想的task完成時間 / 實際task的完成時間。此外還包括velocity改變, 加班時數, failed tests比例,這些都是tracker用來評估project進度的重要指標。

5. coach: 這個其實就是Scrum master,包含以下責任:









2017年10月28日 星期六

Agile Software Development 2 - Agile Principles

Waterfall (1970, Royce) :

就是五十年後我們仍然最常用的model。




這是很理想性的,甚至只能是教育性的,主要問題:
(a) coding phase來的太晚,software只關乎coding成果,結果真的實作卻是放在如此後面的流程
(b) requirements一旦決定之後,基本上進入program design之後就不能改變
(c) 現實中的維護maintenance phase沒考慮到,但實際上佔了軟體工程成本的70% (?)


Agile view on Requirements

對requirement的agile 方面的批評是
1. requirement實務上是常改變(changing)的,太早固定只是自以為是
2. requirement文件基本上是個浪費(waste)

XP: 蒐集requirements是一個經常性的動態活動,而非產出一個靜態固定的文件

Scrum: 沒有前期的analysis / design phase,而是一直處於不斷的sprints cycle來蒐集requirements

Lean: 看不懂!


總之,agilist 認為requirement gathering phase不該太長,也不該是靜態性的結束。(不過要注意很多自認apply agile methods的人,過分低估前期的requirements gathering,造成工程上的大災難)。


Common Agile Principles (只是參考,不該形成教條)

1. 顧客為主:XP希望引入顧客成為team member (embedded customer),但實務上很難找到這樣的顧客,而且顧客有可能代表性不足。Scrum: 定義product owner來取代傳統manager,這是體制內的角色,比起embedded customer來說較為權責相符。

2. Accept Change: 這對應到OOP中的extendibility,但是實務上不一定能簡單做到。

3. self-organized team: 這仍是對manager角色的弱化,manager主要功能在agilist眼中:
  • 鼓勵進度
  • 幫忙找出問題
  • 移除障礙
  • 對困境提供協助
  • 鼓舞成員,抵消負面批評
  • 授權team member能直接面對客戶

4. 可持續步伐:不要壓榨才能長久

5. 只做出使用者要的feature,不要做自己想像的: 降低複雜度,也省非常多錢 (亂做一堆features會使得cost非線性成長)

Toyota的車廠管理衍生出Lean management,以下是幾種可能的"software waste":


(a) 就是產能過剩,做出沒人要的東西
(b) 庫存太多,做了不賣浪費時間浪費錢,打擊士氣
(c) 做一堆對產出產品無用的步驟
(d) 技能或經驗不足所以花一堆時間在蒐集資訊
(e) 沒被找出的bug costs money!
(f) 等待相關人士給予意見
(g) 不同framework之間的協調時間

極簡者 / 短視者 觀點: minimum viable product / 不需要中間產物 (文件 圖片等)。但這也招致了不少software engineering從業者的批評,本課程認為這些觀點過於極端,不是好的software engineering。

6. iteration時間縮短但是更多,iteration過程中要freeze requirement

傳統的development iteration的模式是先建立infrastructure,然後一層層往上疊起,但這就讓usable product/code 能出現的時間往後延長了不少:


agilists preferred的方式是快速但partial functional的release:


不過這門課老師覺得可以採用dual development,首先對risk最高的底層infrastructure花全力去完成 (比一般agile iteration更長),之後才進入agile iteration。


7. 所有tests未通過前,不要implement new features
這個被列為最重要的agile教條之一,但是實務上我覺得要怎麼推動是一個問題,如果tests都是類似unit tests,那應該是比較容易推動。

8. use cases / scenarios 來描述requirements
好處是這讓測試的規格確定,同樣老師批評:




Lean specific principles

Lean的waste觀點:


這是一個不錯的negative impact checklist,可以實際用來檢視專案是否有浪費的情況。

Lean的learning觀點 (這是積極採取行動,透過資訊蒐集):


1. test給我們關於code的更多資訊
2. 嘗試各種solution會比寫文件或是花時間規畫能得到更多的資訊

以上五點其實就是讓我們盡量在開發時獲得資訊最大化的方法,agilist也希望能delay decision making,直到更明確information獲得之後,所以他們不喜歡大量的事前planning,但是要小心可能造成拖延症! 這個拿捏可能跟經驗有關



Crystal specific principles

Crystal方法主要focus在"focus" XD

1. 不要讓developer multitasking,避免分心
2. 不要中斷developer的開發連續流程,至少保持兩小時不打擾
3. team需要明確知道goal是什麼,只focus在goal

4. 人本尊重 (鼓勵發表意見的安全感,不受嘲弄)


XP specific principles

1. 人本尊重

  • 安全感
  • 成就感
  • 歸屬感
  • 成長性
  • 親密感(?!)



Lean / Scrum specific principles

天下武功,為快不破。要對要建立在快速information gathering
每個iteration中,盡快給出end product,獲得feedback,進入下一個iteration。

Scrum specific principles

user stories (requirements)認為是可以獨立存在的,不依賴其他的user stories。
這就是所謂的feature independence。

不過這還是case by case。


2017年10月18日 星期三

Agile Software Development 1 - 概觀

Agile Manifesto

agile原始方法論一開始是幾個software consultants提出,他們當初的12原則如下:


這在2000年初提出來的,現在看來真的很先進的工作理念,因為隱含著尊重個體,顧客為主,擁抱變化,以及持續改進等四大軟體工作管理模式,現在當然稀鬆平常(但是真的implement的台灣公司很少),當初應該是創舉。


Agile Methods

1. XP: 主要貢獻是把標準軟體製造重點從documentation / SOP 轉換到software以及programmer本身,也就是software才是真正衡量成就的標準,而不是完美的UML 或是符合CMMI (稱為process-oriented methods)。

2.  Lean: 借鏡Toyota管理車廠方式,引用到software engineering來,主要focus在如何消除浪費,其中浪費包括無意義的documentation,要把焦點放在如何deliver software到客戶手中。

3. Crystal:嘗試結合agile與傳統process-oriented methods。

4. Scrum: 這是本課程重點,也是近年agilist的主要信念,這其實不一定專門應用在軟體開發上。通常近年來我們說到"agile",事實上幾乎都是指"Scrum",是一種project management的principle。


Agile Values (vision)

1. 縮減manager權力,不該由manager去assign tasks! 這statement很神奇,期待後面的解說。
2. 邊做邊設計,而非一開始花一堆時間設計和架構
3. 縮短的iteration驗證
4. 只做對顧客馬上有用的事 (Lean屏除waste的概念)
5. 專注在品質上,利用充分測試達成