超爽感觉

写程序的时候最爽的感觉可能就是一切顺利了:

  1. 每段代码一写出来就立即可以工作。
  2. 自己心里对于新代码的工作能力极为自信。
  3. 不会被 bug 或者一个问题卡住,而是不断向前进展,即使遇到问题也可以在很短时间搞定

在我们有这些感觉的时候,往往也是生产力最高的时候,而且结果一般也非常好。反之,我们代码磕磕绊绊的时候、被一个问题卡住动弹不得的时候、对代码没有任何自信的时候,一般实际的结果也确实糟糕。

尽管我们经常会期待学习新的技术会带来更多这样的流畅时刻,所以不断投入精力和时间去学习新的技术,但新技术却常常带来更多的麻烦和困惑,看起来并非这种 flow (流状态、请参考 flow)的可靠来源。

而糅合了 git、测试驱动的编程节奏感往往能带来这种超爽的感觉!

一段节奏

这是我自己记录一段的编程节奏:

  1. 已经决定特性 auth-svc 的开发,我打开 SourceTree 软件,按下 git-flow 按钮,开始一个新的特性分支 auth-svc。
    图片描述
  2. 打开 intelliJ IDEA 和项目,编程工作开始。
  3. 立即打开一个终端窗口,在里面运行 lein midje :autotest,让自动测试开始运行。如果项目已经处于良好健康状况,应该很快看到 all tests passed 的绿灯。
    图片描述
  4. 新建一个测试单元,或者在现成的测试单元中开始写 midje 测试用例。在 clojure 下和 midje 下,这一般非常容易,每个测试用例一般就 1-2 行代码。一般我的节奏是写 4-5 个最简单的测试用例。
  5. 把测试用例中假设会实现的函数制造出一个空实现。
  6. 按下 save all files 按钮,这时 idea 下的终端窗口会出现测试失败的红灯。
    图片描述
  7. 仔细检查所有的错误都如同预期,而且所有的测试都会失败。
  8. 将这些失败的测试 commit 进 git,commit message 一般是“完成测试代码写作”。
  9. 鉴于我已经完成了些东西,我会起身喝口水聊聊天什么的,或者简单走动下,预防颈椎病。
  10. 重新坐下开始实现真正的代码,让测试通过。每次完成一段代码,存盘后终端上应该会告诉我又有一个新的测试用例通过了。因为我的测试很少而且很小——往往仅仅完成一个功能的一个部分:

    • 如果功能还没实现,我不会处理错误输入。(我也还没写错误检查用例)
    • 如果这个实现就是在检查错误,我会将为每个要检查的错误写至少一个测试用例。
  11. 全部测试通过后,又可以看到令人心情愉悦的 all tests passed 的绿灯了!
  12. 把成功的实现 commit 进 git,然后再起身转一圈去。
  13. 重复上面的循环,直到这个特性全部实现。
  14. 大大地休息一下。
  15. 回来开始补充文档,顺手重构一下刚刚完成的代码。
  16. 将新的改动 commit 回 git。
  17. 在 sourceTree 里再次按下 git-flow 按钮结束这个特性。

要点

你未必使用同样的技术栈,但你仍然可以拥有同样的编程节奏感!这种 flow 的配方是:

  • 依赖于 git,并且频繁 commit。极大提高安全感。你不会担心在代码里做实验,毕竟它比 ctrl-z 要可靠得多。我一般每完成5-20行代码就 commit 一次。(当然这是代码密度极高的 clojure 程序,如果是 Java 估计要 x4 或者 x5 了)
  • 写小的测试,先写。这里的测试驱动目的其实倒不是质量,也是提高完成感。相当于给自己先设置了一个小关卡。
  • 不要试图一次写出完备的测试。这样实现时心理压力会太大。

robertluo
738 声望21 粉丝