Appearance
程序员工作法
软件行业里有一本名著《人月神话》,其中提到两个非常重要的概念:
- 本质复杂度(Essential Complexity):解决一个问题时,无论怎么做都必须要做的事情
- 偶然复杂度(Accident Complexity):因为选用的做事方法不当,从而导致要做更多的事情
作为一个程序员,我们常常会面临各种忙碌和加班的情况,这主要是由于偶然复杂度导致的情况。
为了减少偶然复杂度引发的问题,10X 程序员提出四个原则,来尽量减少偶然复杂度,帮助我们提高工作效率和解决问题:
1. 以始为终
在开始一个项目或者任务时,首先明确最终目标和需求,然后根据目标来规划和执行工作。这样可以避免在后期发现需求变化或方向错误而导致的重复工作。
思考框架:
帮助我们更清晰地认识自己要做的事情,并找到正确的方向:
- Where are we? (我们现在在哪?)
- Where are we going? (我们要到哪去?)
- How can we get there? (我们如何到达那里?)
完成的定义(DoD):
以始为终,大家对"终"的定义不一样,开发中"完成"这个概念的理解可能因人而异:
PM
可能认为"完成"是指项目上线运行- 程序员可能认为"完成"是指功能代码编写完毕
采用 完成的定义(DoD,Definition of Done)
:
DoD 是一种明确的标准,用于定义什么是"完成"的状态。在指定 DoD 时,团队成员可以讨论和协商,以确保每个人对"完成" 的理解一致。这样可以减少误解和冲突,提高团队的协作效率。
扩展工作上下文
不要把自己限定在程序员的上下文里,当一个程序员安安静静地写代码。
我们总喜欢用技术去解决问题,但很多令人寝食难安的问题其实根本不是问题。我们可以是产品、用户、测试,尝试在不同的上下文里去思考问题会容易的多。
2. 任务分解
动手做一个工作之前,请先对它进行任务分解。
马斯克的任务分解案例
SpaceX 有个目标是送 100 万人上火星,这要增加一万万亿,马斯克想把人均费用降到 50 万美元,这相当于将原本需要的费用降低了 2 万倍。
分解策略:
- 增加运载能力:将火星飞船的运载能力从目前的 5 人增加到 100 人
- 提高效率:私营公司的效率更高,成本可以降到同行业的十分之一
- 可重复使用的火箭:实现可重复使用的火箭,大大降低发射成本
开发实践
测试驱动开发(TDD):一边写测试,一边调整代码,测试通过后,要回到代码上,消除代码的坏味道。
开发前:想清楚再动手
- 在理解需求后,把它拆分为几个模块,记录在一个清单上
- 针对每个模块拆分为小任务
- 每个任务完成之后,代码都是可以提交的,把任务分解到很小,才有可能做到小步提交
示例:
- 升级一次版本依赖
- 做一次变量更名
好处:
- 保证可以随时停下来,不会被任何外部因素所干扰
- 更专注地关注每个任务的细节,避免漏洞和错误的处理
- 在遇到新问题时,将问题记录在清单上,保证问题不会丢失
任务优先级管理
任务过多的情况:
- 区分任务优先级,因为时间是有限的,有限的时间内你能完成工作的上限是一定的
- 遵循 艾森豪威尔矩阵,将事情分为
重要和紧急
两个维度进行划分:
重要 | 不重要 |
---|---|
重要且紧急 | 不重要且紧急 |
重要不紧急 | 不重要不紧急 |
3. 沟通反馈
我们努力的学习各种知识,为的就是更好的理解这个世界的运作方式,而沟通反馈,就是我们与真实世界互动的最好方式。
真实世界不是以美好愿望驱动的,它有自己的运行规律。虽然我们生活在同一个世界中,但 每个人理解世界的方式确实是千差万别。
编写可维护的代码:减少团队成员对代码理解的差异
写代码的目的是与人沟通,因为我们要在一个团队里协同工作
多面对面沟通,少开会:凡是效果特别好的会议,基本都是用来做信息同步的
接近用户:了解用户需求,多听取来自真实用户的声音
尽早暴露问题:遇到问题,最好的解决方案是尽早把问题暴露出来
4. 自动化
在开发过程中,尽可能的利用自动化工具和技术来减少重复性工作和人为错误。自动化可以提高工作效率,减少手动操作带来的问题。