超爽感觉
写程序的时候最爽的感觉可能就是一切顺利了:
- 每段代码一写出来就立即可以工作。
- 自己心里对于新代码的工作能力极为自信。
- 不会被 bug 或者一个问题卡住,而是不断向前进展,即使遇到问题也可以在很短时间搞定
在我们有这些感觉的时候,往往也是生产力最高的时候,而且结果一般也非常好。反之,我们代码磕磕绊绊的时候、被一个问题卡住动弹不得的时候、对代码没有任何自信的时候,一般实际的结果也确实糟糕。
尽管我们经常会期待学习新的技术会带来更多这样的流畅时刻,所以不断投入精力和时间去学习新的技术,但新技术却常常带来更多的麻烦和困惑,看起来并非这种 flow (流状态、请参考 flow)的可靠来源。
而糅合了 git、测试驱动的编程节奏感往往能带来这种超爽的感觉!
一段节奏
这是我自己记录一段的编程节奏:
- 已经决定特性
auth-svc
的开发,我打开 SourceTree 软件,按下 git-flow 按钮,开始一个新的特性分支 auth-svc。
- 打开 intelliJ IDEA 和项目,编程工作开始。
- 立即打开一个终端窗口,在里面运行
lein midje :autotest
,让自动测试开始运行。如果项目已经处于良好健康状况,应该很快看到all tests passed
的绿灯。
- 新建一个测试单元,或者在现成的测试单元中开始写 midje 测试用例。在 clojure 下和 midje 下,这一般非常容易,每个测试用例一般就 1-2 行代码。一般我的节奏是写 4-5 个最简单的测试用例。
- 把测试用例中假设会实现的函数制造出一个空实现。
- 按下
save all files
按钮,这时 idea 下的终端窗口会出现测试失败的红灯。
- 仔细检查所有的错误都如同预期,而且所有的测试都会失败。
- 将这些失败的测试 commit 进 git,commit message 一般是“完成测试代码写作”。
- 鉴于我已经完成了些东西,我会起身喝口水聊聊天什么的,或者简单走动下,预防颈椎病。
- 重新坐下开始实现真正的代码,让测试通过。每次完成一段代码,存盘后终端上应该会告诉我又有一个新的测试用例通过了。因为我的测试很少而且很小——往往仅仅完成一个功能的一个部分:
- 如果功能还没实现,我不会处理错误输入。(我也还没写错误检查用例)
- 如果这个实现就是在检查错误,我会将为每个要检查的错误写至少一个测试用例。
- 全部测试通过后,又可以看到令人心情愉悦的
all tests passed
的绿灯了! - 把成功的实现 commit 进 git,然后再起身转一圈去。
- 重复上面的循环,直到这个特性全部实现。
- 大大地休息一下。
- 回来开始补充文档,顺手重构一下刚刚完成的代码。
- 将新的改动 commit 回 git。
- 在 sourceTree 里再次按下 git-flow 按钮结束这个特性。
要点
你未必使用同样的技术栈,但你仍然可以拥有同样的编程节奏感!这种 flow 的配方是:
- 依赖于 git,并且频繁 commit。极大提高安全感。你不会担心在代码里做实验,毕竟它比 ctrl-z 要可靠得多。我一般每完成5-20行代码就 commit 一次。(当然这是代码密度极高的 clojure 程序,如果是 Java 估计要 x4 或者 x5 了)
- 写小的测试,先写。这里的测试驱动目的其实倒不是质量,也是提高完成感。相当于给自己先设置了一个小关卡。
- 不要试图一次写出完备的测试。这样实现时心理压力会太大。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。