桌球与敏捷
周末和同事去打桌球,突然觉得很熟悉的感觉。 仔细思考,发现它和我们每天做的软件开发是如此相似。
每一局是一个项目。 每一颗球是一个 Feature,将所有自己的球击打落袋是项目的目标。 你需要在开球后对整个局势进行考量,制定自己的清台计划,这就是 Planning。
Story
初学者通常错误地把进球当成是 Story。 其实当你思考的抽象一点,把球的移动作为 Story 来看时, 落袋只是其中的一种特殊情况。有的球太难打要考虑分几次去打,就像是将 Feature 拆成 Story。
Planning
要考虑每个球的价值和风险,价值是击落它能否让击落下一个球变得更容易;风险是你有多大把握能击落它。比如离袋口近的球价值高风险小,因为你很容易让它落袋,而且比较容易给下一颗球走位;而贴库或者扎堆的球,就比较难落袋,属高风险。在 Planning 的时候,你要规划自己大致的击打顺序和进球路线。
如果不懂计划,那通常是打进一个算一个。你通常会输得不明所以,一开始感觉自己占优势,因为你剩 2 个球的时候可能对手还剩 7 个球,但往往在你感觉胜利触手可及时,被对手一杆或两杆清台。 所以要做计划,但又不能做太详细的计划,因为你毕竟不是机器人,不能将角度,力度控制得那么完美。 你和对手的每一次击球,都会改变球的局势。每一轮击球(Sprint)结束后,根据新的局势调整后面的计划。
Sprint
每一轮击球机会是一个 Sprint。你要计划在这一轮达到什么样的目标:进球、解球或者给对手制造障碍都可以是目标。可能需要从不同的 Feature 中挑选一些 Story 来组成这个 Sprint。
Daily Scrum
在一轮击球中,如果你将球击落,你可以连续击球。这一杆一杆就像是 Daily Scrum,每一杆都要告诉对手你要将哪个球击落到哪个袋里,也要思考有什么阻碍,能否通过跳球、传球、弧线球、勾球等技术来绕过它。
重构
很多人在完全没有希望进球的时候,便乱打一杆。殊不知这是极大的浪费,相当于这个 Sprint 什么都没有做。其实你可以去给对手制造障碍,破坏对手的好球。或者把自己不好进的球移动到好的位置,就好比软件开发中的重构。
度量进度
最后说说度量,新手最常用剩余的球(Feature)数来衡量进度,这在双方都是新手时是没有问题的。 如果双方都是高手,就会更加重视每个球的价值。比如你只有一个球,贴在库边,而对手有 5 个球,全在袋口,你觉得谁更容易获胜呢?
如果你同样爱好软件开发与桌球,欢迎切磋。希望我们都能写得一手好代码,打得一手好球!