Odd-e CSD Course Day 2
首先在第二天中其實談的更多的是在於 Test-Driven 的部分,而第一天談的偏向如何寫出一個好的 A-TDD 案例
但在第二天開始,就不太會照固定的 Topic 進行講述,而且讓團隊成員就像一個真實的 Team 一樣, Daily meeting 、 Work with pair programing、 Choice task 等等
但我一樣將在過程中學習到相關的內容,分別整理到以下四個 Topic
Continuous Integration and CI Systems
在提到 Continuous integration 與 CI Systems 時,更多時候提的是
如何 Continuous integration
何時 Continuous integration
誰做 Continuous integration
而不是在提如何建構一個高效的 Jenkins pipeline 、如何設定 C# for Jenkins Building
在談如何 Continuous integration 時,其實一併就將其它要點做說明了。
簡單來說Continuous integration 其實代表的是團隊對於品質與交付的承諾
比如:團隊會頻繁的做 Check in 、每個小時都做一次、每個人都可以做。
如何思考團隊成員一起做到 Continuous integration 才是首要的任務
在這個例子中提到了 Google 的 Repository 只有一個,
也就代表著每個人都可以做 Git commit、push 、pull。但這當中也需要思考的是,我們是不是也要一個 Repository 就好? 一個 Repository 放置所有的 Project 其實意味著,這些 Project 之間的相依性很重。也許就需要一個 Repository 來綜觀全覽,但現實中不一定如此
在這裡 Terry 跟大家提了一下,他們目前發佈新版本到 Production 環境上,包含測試完成只需要約六分鐘
Using your IDE
在這個環節中,我只能說 Resharper 真的蠻好用的…看到團隊成員用熱鍵 Move class 、 Inline variable 超快的…但我自已平常實在沒什麼用到,只有少少的重構時能用個 Rename 之類的
不過在這個環節中…在練習 Test-Driven KATA 時,專案居然被我玩壞了 (好險靠夥伴快速的又修復了)
Test-Driven Development
這當中 我們用了 buzzbus 題目做為 Kata 來練習 Test-Driven
也因為自已習慣使然,在寫 Just enough code 、Just enough test case 時,還是會想的太多太難
在這一課收獲我想是最多的,一個是 Just enough test case ,如何寫出下一個剛好的測試案例而不前進太多步是很難的。例如: 以 buzzbus 為例,當上一個 test case 為 inputNumber5 時,我下一個寫出的是 inputNumber15 ,這就超過太多了 ( 比較好的是寫 inputNumber6 ) 。
此外一個剛好的測試是可以在短時間寫完的,比如說五分鐘內就可以完成
當然在中間練習 Kata 的過程中,我們會在每一次寫的同時提到是否要重構
在重構的同時,我們也會移除原本一些重複到的測試案例,不僅僅是重構Product Code
而重構其實隱含著,在添加新的測試案例之前進行重構,可以讓你更容易的加入新的測試案例
from: Odd-e CSD course
中午吃飯時我問了 Terry ,我以為在寫測試只需要寫個大概就好,但事實上是你的心裡會先有一個預期的設計,透過測試去驗證你的設計、明白預期中的設計與實際上的落差有多少,也就是說我們透過 Testing to Learn 。而最有趣的是,在每一次寫測試往預期中的設計前進時,你的 Product code 會越來越泛化 。這是什麼意思呢?
Terry 解釋的很明白,一開始在寫測試時要記得 just enough 。 如果能寫 hard code 就寫 hard code ,當 hard code 不行時就寫個 variable 變數,再不行時就寫個 If 再往下時可能是個 for loop
當往預期目標前進時,就會發現測試案例與Product Code會越來越往泛化前進
以程式來說就像這樣 : Harcode –> int num –> if (num) –> for in numbers –> List<T>
而這當中我也問了一下,如何拿捏泛化的程度? 事實上跟目前 Business 也有關係,如果現在只要 A B 功能就行了,那麼就不用想到 C D E ,但如果你做到了 A B C 很有可能就要考慮 D E 情境了
但如果一開始就做完了泛化,意思是目前只要 A B 的功能,但你直接做完了 A B C D E
很有可能在之後的 C D E 情境發生時,你認為這個已經是好的設計,而不會去寫測試。
當需求變更時也就不能受到保護了。
所以透過 Test-Driven 事實上是更好的認識自已、從自我中學習的一種方法
此外,有經驗跟沒經驗的工程師的差別在於,有經驗的工程師會用測試去驗證預期的缺陷與差距,而沒有經驗的工程師通常就會認為這就是最好或是預期中的設計了。
事實上,從來沒有完美的設計,只有當下最好的設計
Testing Mistake
下午我與小夥伴在寫 Acceptance 的測試案例時,因為在討論 Function 是否應該回傳處理結果,引發 Terry 與我們做了一下討論。原因是他發現到我們是在討論 Class 的內容,而不是由最快最簡單的 Controller 來進行我們的測試案例撰寫。測試也是類似的想法,可以先由較簡單的 E2E 測試開始,再往 Unit Test 前進 。 記得一個要點 Just Enough Design and Testing
from: Odd-e CSD course
此外,Terry 也建議我們在討論 Function 是否應該回傳處理結果時,可以考慮 CQRS 方式來進行
將處理的Function 定義為 Command 而回傳結果這類的為 Query ,這裡其實有點 Pure function 的味道存在,因為不論 Query 執行多少次,都不會影響到 Command 裡的執行邏輯。但如果合併在一起時,很有可能 Function 就會因為要處理狀態,而改變了執行邏輯
回顧
在今天回顧的時候有提到幾個蠻有趣的東西
1. Task 衝突演變成關係衝突,原因是當 Task 沒有做好充分溝通時,比如相依性這件事團隊沒有好好的討論與解決,很有可能下一次就演變成關係衝突。一但變成了關係衝突,夥伴之間的合作就很難繼續下去了!
2. 在第一天中其實有介紹了 Working agreement ,Stanly 提到這其實是一種 Guideline , Guideline 的意思是參考用,不一定要遵守。不像 Rule 這是必需要遵守的而且有可能會有懲罰
在 Working agreement 中,團隊成員是可以自行調整內容的,當然這也需要經過每一個成員投票來決定
3. 最後 Terry 提了一個 Feature not User Story 的問題。問題是這樣的 : 為什麼 Cucumber 以前的擴展名是 .story 後來改成了 .feature 。 至於答案是什麼就留待看倌們先找找了 XD
對課程有興趣的同學,可以到以下網站找到相關的資訊
Odd-e CSD Course Day 2的更多相关文章
- [LeetCode] Odd Even Linked List 奇偶链表
Given a singly linked list, group all odd nodes together followed by the even nodes. Please note her ...
- Odd Even Linked List
Given a singly linked list, group all odd nodes together followed by the even nodes. Please note her ...
- LeetCode 328. Odd Even Linked List
Given a singly linked list, group all odd nodes together followed by the even nodes. Please note her ...
- tr:even 与tr:odd
:even匹配所有索引值为偶数的元素,从 0 开始计数查找表格的1.3.5...行(即索引值0.2.4...)<table> <tr><td>Header 1< ...
- Leetcode Odd Even Linked List
Given a singly linked list, group all odd nodes together followed by the even nodes. Please note her ...
- CSS3伪类选择器:nth-child()(nth-child(odd)/nth-child(even))
nth-child(odd):奇数 nth-child(even):偶数 使用时,如果是精确到数字时,切记是从同一级别的元素开始计算,而不是指定某个类才开始计算. 比如: <li>< ...
- [CareerCup] 5.6 Swap Odd and Even Bits 交换奇偶位
5.6 Write a program to swap odd and even bits in an integer with as few instructions as possible (e. ...
- [Educational Codeforces Round 16]C. Magic Odd Square
[Educational Codeforces Round 16]C. Magic Odd Square 试题描述 Find an n × n matrix with different number ...
- 328. Odd Even Linked List——多利用fake_head
Given a singly linked list, group all odd nodes together followed by the even nodes. Please note her ...
- 越狱Season 1-Episode 12:Odd Man Out
Season 1-Episode 12:Odd Man Out -Sorry to keep you waiting. 抱歉让你等了半天 -Oh, it's, uh, not a problem. 嗯 ...
随机推荐
- Java课程之团队开发(团队介绍)
一.介绍团队和团队成员 团队名称:凯域软创 团队成员介绍:张某某,崔某某,焦某某,陈某 二.关于团队作品 1.作品名称:课程表 2.你的创意解决了用户的什么需求:查看课程信息的需求 3.你有什么招数用 ...
- Red and Black---POJ - 1979
There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A ...
- 2019PHP面试题最全面归纳总结
1.请选择以下代码运行的结果: <?php if ('1e3' == '1000') echo 'LOL'; ?> A 无任何输出结果 B LOL C 不执行且报错 解析:1e3 ...
- lucene 结合数据库做搜索
package jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedSta ...
- C++的结构体指针传参
typedef struct node{int n;node *left;}*tnode; 传参的时候注意用** void init(node **nn);int main(){tnode nna;i ...
- JavaEE开发之Spring中的条件注解、组合注解与元注解
上篇博客我们详细的聊了<JavaEE开发之Spring中的多线程编程以及任务定时器详解>,本篇博客我们就来聊聊条件注解@Conditional以及组合条件.条件注解说简单点就是根据特定的条 ...
- Dora.Interception,为.NET Core度身打造的AOP框架 [5]:轻松地实现与其他AOP框架的整合
这里所谓的与第三方AOP框架的整合不是说改变Dora.Interception现有的编程,而是恰好相反,即在不改变现有编程模式下采用第三方AOP框架或者自行实现的拦截机制.虽然我们默认提供基于IL E ...
- Java两种方法实现循环报数
问题描述: 十个猴子围成一圈选大王,依次1-3 循环报数,报到3 的猴子被淘汰,直到最后一只猴子成为大王.问,哪只猴子最后能成为大王? 方法一:Java链表 public class TestAll ...
- [Swift]LeetCode457. 环形数组循环 | Circular Array Loop
You are given an array of positive and negative integers. If a number n at an index is positive, the ...
- [Swift]LeetCode894. 所有可能的满二叉树 | All Possible Full Binary Trees
A full binary tree is a binary tree where each node has exactly 0 or 2 children. Return a list of al ...