Coding Dojo 初體驗(Android Code Club)
這其實是一份偽心得、真推坑文
上週三(5/29)在天瓏書局參加了由Android開發讀書會的Andy主持的coding dojo活動,不僅好玩,也獲得了很大的收穫,所以想說來記錄一下心得感想,推坑更多的人一起來玩XD
什麼是coding dojo?
根據維基百科,「dojo」其實源自於日文的「道場」,是一個學習者間互相較量與修煉技能的地方,「coding dojo」自然可以被想成是工程師們彼此學習coding相關技能的場所。
Coding dōjō: a space and associated technique for groups to practice computer programming skills
為什麼好玩?
身為一個工程師,最喜歡的就是解決問題與克服挑戰了XD,這次coding dojo的活動目標是針對PokerHands這個功能需求,寫出所有的測試案例,並且要讓這些test case全數通過!(詳情可以上Github的repo查看commit紀錄,知道我們到底做了什麼事情)
舉個栗子:
- 假設我們拿到了一個字串為
D8
,我們在測試的結果必須能夠驗證這個字串代表的是「花色=方塊、數字=8」。 - 假設我們拿到了一個字串為
S10,SJ,SQ,SK,SA
,我們在測試的結果必須能夠驗證這個字串代表的是牌組「同花順」。
活動的方式很有趣。現場會有一台裝載Android Studio的電腦,這台電腦會將螢幕畫面投射到投影幕上,而參加者們會一個接一個的排隊,以輪流接力的方式寫code完成最終目標。每輪到一個人,他就只有7分鐘的時間,必須以現有的程式碼,嘗試通過一個又一個的測試案例,當時間用完,就得將當下的程式碼commit(但需要確保是可以compile的),並交給下一個人接手。
這是一個TDD(Test Driven Development)的遊戲:)每一個7分鐘的回合開始時,參加者必須針對需求寫出測試案例,並且實際執行,當然一開始的測試案例一定會failed,這實再使用現成的程式碼進行修改與重構,讓測試案例得以通過,並且再開始完成下一個測試案例。
好玩的地方在於,這也是一個Live coding的遊戲:)現場會有10幾雙眼睛盯著你的每一個動作(這已經不只是pair-programming了…也不只是triple、quadro的等級,暫且稱為多pair-programming,簡稱多P-programming XD),而且每執行一個動作前都必須透過麥克風交代自己要做什麼,可能還在台下的時候已經知道該做什麼,但是到台上的時候會因為壓力而腦袋一片空白什麼都忘了XD,這可是一個令人心跳加速、比刺激1995還要刺激(?)的遊戲呀~
有什麼收穫?
因為「多P-Programming」的關係,你在現場可以看到每個程序員是怎麼寫程式的,包含語法的使用方式、錯誤的處理方式、以及IDE的使用方式。以下分享我當天用到的,以及學習到的一些招式:
IDE
- IDE輔助gen-code:
挑一個合適的時機,按下「control+return」可以Generate你想要的code。
偵錯是IDE的天職,有時候你可以故意犯錯,讓IDE來幫你改正。要新增一個class時,你可以先寫出名稱(當然現在是不存在的),再按下「option+return」,IDE會問你要不要新增這個class。
- 複製的藝術
單行重複複製(學到新招式超爽der):當你想複製某一行的程式碼時,把游標移動到那一行,然後一直按「command+D」就行了。
多行複製:這招可以將對齊好的程式碼複製,使用「option+游標」來圈選出你想複製的區域,然後按「command+C」複製,再到別的地方按「command+V」貼上。
- Test case的function命名
在Kotlin檔案中(.kt)你可以使用句子來當成測試案例的方法名稱。
- 在Android Studio中commit code(學到新招式超爽der+1)
一直以來我都是在Sourcetree上commit code,這次也學到Android Studio其實也內建了強大功能,包括可以在commit code時幫忙Reformat、Rearrange code與Optimize imports(移除沒有用到的import),真的非常方便。
Kotlin黑魔法般的語法糖(學到新招式超爽der+2)
因為這次的題目是撲克牌,所以會需要判斷手上五張撲克牌的牌型。這次學到了幾個Kotlin內建的運算語法糖(實在是太震撼啦),相較於使用迴圈來刻判斷的邏輯,使用語法糖會讓你的人生簡單許多。以下列出幾個例子:
- 判斷牌組為同花
使用Iterable.all()
來進行花色(suit)的判斷,集合內的所有元素都會跑一遍判斷式,當所有判斷式皆滿足時會return true。這樣就好了,爽!
cards.all {
it.suit == cards[0].suit
}
- 判斷牌組為Two-Pair、三條
使用Iterable.groupBy()
來進行集合分群,這邊牌組類型的判斷與花色無關,所以我們以撲克牌的數字來進行分群。
val cardGroups: Map<Int, List<Card>> = cards.groupBy {
it.number
}
Two-Pair與三條的狀況大概會像是{5,5,6,8,8}或是{2,5,8,8,8},例如{5,5,6,8,8}在groupBy()
後會拆成
{
5:{5,5},
6:{6},
8:{8,8}
}
所以我們只要確定cardGroups.size
的結果會是3就好惹。
if (cardGroups.size == 3) {
...
}
我們再使用Iterable.any()
,這個方法會判斷集合中的元素,只要有一個元素符合判斷式,就會return true。就這麼簡單,爽!
cardGroups.any {
val group = it.value
group.size == 2
}
(group.size == 2
就是Two-Pair,group.size == 3
就是三條)
- 判斷牌組為葫蘆、鐵支
邏輯和Two-Pair、三條差不多,只差在需要判斷
cardGroups.size == 2
然後判斷
cardGroups.any {
val group = it.value
group.size == 4 // 4:鐵支 3:葫蘆
}
這樣就好惹~~
結語
當然因為時間的關係,這個遊戲還沒結束,所以之後還會有part2~
在這個活動中因為可以觀摩到每個人是怎麼寫code,所以可以快速地學習到各種招式。而且因為參加者在寫code前必須先描述自己接下來要做的動作,也可以學習到不同的人是如何思考與解決問題。
然後這也是一個高度與測試結合的coding練習,如果你還不會寫測試,你一定更得來玩,測試是軟體工程的重要技能,學會測試不但可以讓產品擁有更高的穩定性,也可以讓你更了解架構應該要如何設計,進而產出更高品質的程式碼。
最後,在這邊還可以認識許許多多資深的前輩,來台北這幾年在讀書會這邊我也認識了相當多的老師與貴人(例如Cuber、Andy、YANBIN HUNG等人)。「選擇比努力更重要」,比起自己花十倍的時間後還在旁門走道中掙扎,要是有人帶領你走到正確的路上,你會走得更好更快。
Coding dojo真的是個很棒的活動,推薦給你。
如果你也有興趣的話,歡迎下次也一起來玩:)
補充一下活動時間
如果命運的輪盤沒有出錯,Android開發讀書會每週三都會在天瓏書局舉辦Android code club的活動(由Andy主持)。歡迎來這邊聊聊天、認識新朋友,或是把一些不知道該如何解決的問題帶過來提問。沒意外的話每個月的最後一次Android code club會開啟coding dojo這個副本,至於最新的活動消息,請多多關注Android Developer開發讀書會哦。
P.S.
對了這次已經是第五次的coding dojo,前幾次的活動內容也可以在Github上找到哦~~~