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. 嗯 ...
随机推荐
- EXCLE 导入 或 导出
首先要引用 NPOI.dll (可在网上下载!)//导入public void OnSubmit() { string path = Server.MapPat ...
- window7环境下ZooKeeper的安装及运行
简介 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提 ...
- 4.23 Linux(3)
2019-4-23 19:03:53 买的服务器第三天感觉超爽!! 发现学习Linux超爽,有种操作的快感!!!!!是Windows比不了的!! 阿里巴巴镜像源 : https://opsx.alib ...
- C# CSV 文件转换成DataTable
{ DataTable dt = new DataTable(); FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess ...
- codeforces_A. Salem and Sticks_数组/暴力
A. Salem and Sticks time limit per test 1 second memory limit per test 256 megabytes input standard ...
- Android简单计时器
本文利用ContextMenu(上下文菜单),Chronometer实现简单计数器. Main.xml: <?xml version="1.0" encoding=" ...
- Mesos源码分析(12): Mesos-Slave接收到RunTask消息
在前文Mesos源码分析(8): Mesos-Slave的初始化中,Mesos-Slave接收到RunTaskMessage消息,会调用Slave::runTask. void Slave::ru ...
- spring的定时器
一:基于xml配置的方式 1:编写普通的pojo 类 package com.aflyun.web.task; import org.springframework.stereotype.Compon ...
- Xapian的内存索引
关键字:xapian.内存索引 xapian除了提供用于生产环境的磁盘索引,也提供了内存索引(InMemoryDatabase).内存索引.我们可以通过观察内存索引的设计,来了解xapian的设计思路 ...
- C#使用Windows Service
前言:Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新 ...