这个专栏是对10X程序员工作法的一个总结。
为什么我们会加班加点?做出来的东西与要求不符?
《人月神话》 提到了两个非常重要的概念:本质复杂度和偶然复杂度
本质复杂度:无论如何都要做的事情
偶然复杂度:因为做事方法不对,导致要做的事情
接下来我们从这几个方面来进行梳理
一个有效的工作思考框架
如何将精力放到本质时间复杂度上,减少偶然复杂度的消耗
请回答三个问题:
1.我是什么水平
2.我要到达什么水平
3.我怎么样达到这个目标
这三个问题帮我们确定
1.现状
2.目标
3.实现
当一个产品要交代给我开发一个功能特性时,通常要问这几个问题
为什么要做这个特性,他会给用户带来什么价值?(以终为始)
什么样的用户会用到它,在什么场景下面使用,他们又会怎样使用它?(任务分解 需要将大目标切分成小的目标 所以会关心具体的使用场景)
达成这个目的是否有其他手段?是不是一定要开发一个系统?
(沟通反馈 向产品经理了解 我确实了解了这个需求)
这个特性上线之后,怎么衡量他的有效性?
(我需要了解这个产品做出来确实能够达到目标)
我们做的方案通常是一个自动化的方案,但是我们需要了解没有自动化之前是怎么做的,所以会关心是不是还有其他的现成的替代方案
四个原则是明白为什么要提出问题? 怎么问问题,可以遵循以下四个原则
1.以终为始(确定好真实的目标)
2.任务分解(找到实施路径)
3.沟通反馈(解决与人打交道的时候的问题)
4.自动化(解决机器打交道时候的问题)
现在在哪 | 要到哪里去 | 怎么去 |
你很清楚 | 以终为始 | 任务分解 |
沟通反馈 | ||
自动化 |
1.以终为始
1.你如何让你的努力不白费?
-以终为始:一种结果导向的思考模式
如果让你设置一个功能-登录功能
你可能会想 不就是用户名密码嘛,然后就开始设计,但是我的需求是设计一个打车软件,用手机号和验证码进行登录,这就是缺乏以终为始的思维习惯
如果真的是想找个好工作,那你就应该了解工作的要求是什么,怎样才能掌握工作要求的技能
任何事物都要经过两次创造:一次是在头脑中的创造
然后才是付诸实践,也就是实际的构建或第二次创造
在动手做事之前,我们要在第一次创造上多下一些功夫,将相关各方的“集体想象”统一起来。以建筑为例,就是先在图纸上构思各种细节。对应到做软件,我们也可以做很多事,比如:
1.要给用户看产品的样子,可以用原型工具把它做出来,而不是非得把完整功能开发出来;
2.要呈现服务接口的样子,可以用模拟服务器搭出一个服务,而不用等后端全部开发完毕;
3.要让程序员知道要开发产品的细节,可以在任务上描述出软件各种场景给出的各种行为。
那么我们怎么进行以终为始的运用呢?
在团队内部,我一直坚持“以终为始”,让大家在执行任务之前,先倒着想想再动手规划,这样规划出来的工作更能瞄准真正的目标。举一个之前做产品的例子,当年在创业的时候,我们打算做一个物联网开发平台,但具体应该做成什么样子呢?有了“以终为始”的思维,我们考虑的是别人会怎么用我们的平台。我们设计的方式是,用户到我们的网站,阅读相关文档,然后参考文档一步一步照着做。这其中的一个关键点是:文档,特别是《起步走》的文档,这是用户接触我们这个平台的第一步,决定了他对我们产品的第一印象。
所以,我们决定从写《起步走》这个文档开始,这个文档描绘了用户怎样一步一步使用我们的开发平台,完成第一个“Hello World”级别的应用。请注意,这个时候,我们一行代码都没有写。写好了这个《起步走》文档,团队的所有人对于我们的平台要做成什么样子,已经有了一个比较初步的认识。更重要的是,我们可以拿着这个文档,去和外部的人讨论这个尚未出世的平台。
“以终为始”的方式,不仅仅可以帮我们规划工作,还可以帮我们发现工作中的问题。
有一次,要将现有的系统改造成支持多租户的系统。也就是说,别的商家可以到我们的平台上发起申请,拥有和我们现有平台一样的能力。功能来了,各个团队将任务分解,然后就各忙各的去了。但我有着习惯性的不安,总担心丢点什么,于是催着项目经理梳理一下上线流程。是的,上线流程,虽然我们的代码还没开发完,但是本着“以终为始”的态度,我们就假设各个部分已经开发好了,来想一想上线应该怎么做。果不其然,一梳理上线流程&#x