作为一个前端菜鸟,最近我在做作业的过程中,发现自己总是容易钻牛角尖,陷入一个无限抠细节的死循环。导致的问题是,原本计划两天完成的内容,实际上花了两倍甚至以上的时间。在向公司的前辈请教之后,发现自己在Tasking方面的能力有欠缺,于是自己花了点时间去了解Tasking的相关知识,在此做个记录。
什么是Tasking
Tasking可以理解为任务拆分。当我们拿到一个大的任务的时候,往往需要把大的复杂的任务分解成小的易完成任务。
任务拆分在我们的日常生活中其实很常见,比如说,如果我让你做一盘葱油拌面,没有做过的人很容易觉得无从下手。但是,如果我告诉你,先切葱段,再调酱汁,然后煎葱油,最后把葱油、酱汁一起拌到面里,这个过程变得可以理解并且易于实行了。
在这个例子里,我们就是把一个大的做葱油拌面的任务分解成了切葱段、调酱汁、煎葱油、拌面四个子任务。我们通过完成这四个子任务,就可以实现做葱油拌面的目标。
Tasking的价值
那么,我们为什么需要分解任务呢?
- 理解父任务:就像上文提到的葱油拌面的例子,通过任务拆分,从来没有做过葱油拌面的人也可以理解这整个流程。
- 定位难点:分解之前我们其实不知道难点具体在哪个步骤,而分解之后我们就能定位到更加细化的子任务中,然后对该子任务进行进一步的分解,直到难点被分解到一个实现起来没有困难的粒度。例如,煎葱油这个步骤我们可以进一步分解成放油、热油和放葱。
- 估计完成时间:我们如果对葱油拌面进行一个估点,因为任务颗粒度太大,我们只能给出一个大概的时间,比如半小时。然而,如果我们按照子任务进行估点,我们可以得到2 + 1 + 5 + 2,一共10分钟的预计时长。
- 复盘时定位问题:假设我们分解后估点的结果是10分钟,而我们实际上用了15分钟,我们通过对比实现每个子任务的实际时长和预计时长,可以发现我们多出来的五分钟是消耗在哪个子任务,从而去发现问题。
如何做Tasking
既然tasking是一件如此有价值的事,那么我们应该如何实践它呢?Tasking主要有两种形式,一种面向价值,一种面向过程,在工作中我们提倡以面向价值的方式去tasking。还是以做菜为例,我们来看看面向价值和面向过程的区别,以及为什么在工作中提倡使用面向价值的方式。
如果你是一个厨师,你的客人给你1000块钱,让你在半个小时内做出10个菜,你会怎么做?
如果以面向过程的方式进行tasking的话,分解后的任务很有可能是洗菜,配菜,炒菜,上菜。那么如果在15分钟的时候,你的客人突然有事要提前买单走人,按照分解后的任务,你可能还在配菜。那么,你的客人很有可能拒绝买单,因为他没有吃到一个菜,也就是说他等了预计时间一半的时间,但却没有看到预计结果一半的价值。
而一个面向价值的厨师的tasking应该是先做西红柿炒鸡蛋,再做小炒肉片,然后一个一个菜接下去。这样到15分钟的时候,他大概率完成了预计订单的一半,也就是已经上了五个菜。这个时候客人在一半的时间里看到了一半的价值,他至少会支付他看到的那些价值。
类比到软件开发领域,我们在软件开发的过程中,有可能会遇到各种各样的变动,面向价值的Tasking能够让我们更加从容的面对这些变动。
面向价值的Tasking在软件开发中的应用
以开发一个TodoMvc为例,面向价值和面向过程的tasking都是怎样的呢?
面向过程:
- HTML
- CSS
- JS
a. 添加一个todo
b. 删除一个todo
c. 完成一个todo
...
面向价值:
- input框 + 添加功能
- 完成功能
- 删除功能
···
最后才是css
可以发现,面向过程的tasking将对客户来说最没有价值的部分放在了最前面来做,等画出了一个静态页面之后才去添加功能。而在画出静态页面的过程中,这个工具是完全无法使用的。面向价值的tasking是按照功能进行划分的,当我们完成前两个功能之后,其实这个工具已经可以投入使用了。此时,如果有两家公司同时在做这一个产品,面向价值的开发可以让这个公司比另一个公司占据先入市场的优势,并且后续的开发工作可以根据市场的反馈进行调整。而第一家公司等到投入市场的时候,沉没成本已经很高了。
本文只不负责任的讨论了本人对tasking的理解,但实际上,这件事情说起来容易做起来难。任务拆分需要拆分者本身对任务就有一定的熟悉度和理解,能拆葱油拌面不一定拆得了冬阴功汤,拆分的路上如果荆棘太多,不如还是搭一下别人的便车。