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. 嗯 ...
随机推荐
- web移动端开发技巧
一.meta的使用 1.<meta name="viewport" content="width=device-width,initial-scale=1.0, m ...
- 关于实体类getset方法首字母小写问题
实体类:private Date cDateTime;private String cNickname; public Date getcDateTime() { return cDateTime;} ...
- 【RL-TCPnet网络教程】第6章 RL-TCPnet底层驱动说明
第6章 RL-TCPnet底层驱动说明 本章节为大家讲解RL-TCPnet的底层驱动,主要是STM32自带MAC的驱动实现和PHY的驱动实现. 6.1 初学者重要提示 6.2 KEI ...
- Hello,Thread
创建线程的三种方法,线程的生命周期,sleep,yield,join,wait 和notify,线程组,守护线程,线程的优先级 ◆ 如何创建线程 ◆ Java 中创建线程的方法有三种: 继承 Thre ...
- [Java]LeetCode116. 填充同一层的兄弟节点 | Populating Next Right Pointers in Each Node
Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...
- [Swift]LeetCode628. 三个数的最大乘积 | Maximum Product of Three Numbers
Given an integer array, find three numbers whose product is maximum and output the maximum product. ...
- [Swift]LeetCode861. 翻转矩阵后的得分 | Score After Flipping Matrix
We have a two dimensional matrix A where each value is 0 or 1. A move consists of choosing any row o ...
- [Swift]LeetCode923.三数之和的多种可能 | 3Sum With Multiplicity
Given an integer array A, and an integer target, return the number of tuples i, j, k such that i &l ...
- [Swift]LeetCode948. 令牌放置 | Bag of Tokens
You have an initial power P, an initial score of 0 points, and a bag of tokens. Each token can be us ...
- 像素数据YUV简介与觉存储格式介绍
主要学习链接:博客园.51CTO 前言 照例是先废话几句,下面的内容都是在学习时从网上找来的,并非我原创,我之所以要写这篇笔记是因为网的内容都很分散,找的时候要从各个地方看,很不方便,所以就自己总结了 ...