《10x程序员工作法》思维导图

以终为始

重点

  • DoD,确定好完成的定义,减少团队内部的理解不一致。

  • 用户故事,细化出有价值的需求。

  • 持续集成,通过尽早集成,减少改动量,降低集成的难度。

  • 精益创业,减少过度开发不确定性产品带来的浪费。

  • 迭代 0,在项目开始之前,做好一些基础准备。

思维转变

  • 任何事物都要经过两次创造:

    • 头脑中的创造,也就是智力上的或者第一次创造(Mental/First Creation)

    • 付诸实践,也就是实际的构建或第二次创造(Physical/Second Creation)

  • 在更大的上下文内发现自己的“终”

  • 通过推演,找到通往“终”的路径

  • 用可度量的“数字”定义自己的“终”

实战指南

  • 遇到事情,倒着想

  • 在做任何事之前,先定义完成的标准

  • 在做任何需求或任务之前,先定好验收标准

  • 尽早提交代码去集成

  • 默认所有需求都不做,直到弄清楚为什么要做这件事

  • 扩大自己工作的上下文,别把自己局限在一个“程序员”的角色上

  • 在动手做一件事之前,先推演一番

  • 问一下自己,我的工作是不是可以用数字衡量

  • 设计你的迭代 0 清单,给自己的项目做体检

任务分解

重点

  • 测试金字塔

    • 行业中测试组合的最佳实践

    • 多写单元测试是关键

  • 测试驱动开发

    • 测试驱动开发的节奏

      • 红——绿——重构

      • 重构是测试驱动开发区别于测试先行的关键

    • 测试驱动设计

    • 编写可测的代码

  • 艾森豪威尔矩阵(Eisenhower Matrix)

    • 将事情按照重要和紧急进行划分

    • 重要且紧急的事情要立即做

    • 重要但不紧急的事情应该是我们重点投入精力的地方

    • 紧急但不重要的事情,可以委托别人做

    • 不重要不紧急的事情,尽量少做

  • 最小可行产品

    • “刚刚好”满足客户需求的产品

    • 在实践中,要用最小的代价找到一条可行的路径

实战指南

  • 动手做一个工作之前,请先对它进行任务分解

  • 多写单元测试

  • 我们应该编写可测的代码

  • 将任务拆小,越小越好

  • 按照完整实现一个需求的顺序去安排分解出来的任务

  • 要想写好测试,就要写简单的测试

  • 想要管理好需求,先把需求拆小

  • 尽量做最重要的事

  • 做好产品开发,最可行的方式是采用 MVP

评判标准

  • 尽量不写 static 方法

  • 主分支开发模型是一种更好的开发分支模型

  • 好的用户故事应该符合 INVEST 原则

  • 估算是一个加深对需求理解的过程,好的估算是以任务分解为基础的

  • 好的测试应该符合 A-TRIP

改善

  • 分而治之,是人类解决问题的基本手段

  • 软件变更成本,它会随着时间和开发阶段逐步增加

  • 测试框架把自动化测试作为一种最佳实践引入到开发过程中
    使得测试动作可以通过标准化的手段固定下来

  • 极限编程之所以叫“极限”,它背后的理念就是把好的实践推向极限

  • 大师级程序员的工作秘笈是任务分解,分解到可以进行的微操作

  • 按照完整实现一个需求的顺序安排开发任务

额外

  • 对不了解技术的任务,先要去了解技术,然后再做任务分解

  • 通过一次技术 Spike ,学习新技术

  • 丢弃掉在 Spike 过程中开发的原型代码

  • 分清目标与现状,用目标作为方向,指导现状的改变

  • 多个功能并行开发可以考虑使用 Feature Toggle

  • 在遗留系统上做改造可以考虑使用 Branch by Abstraction

任务分解

重点

  • 看板

    • 一种来自精益生产的可视化实践

    • 按阶段将任务放置其中

    • 可以帮助我们发现问题

  • 持续集成

    • 做好持续集成的关键是,快速反馈

    • 本地检查通过之后再提交

    • 找到有效的反馈方式,比如:CI 监视器

    • 持续集成的纪律

    • 只有 CI 服务器处于绿色的状态才能提交代码

    • CI 服务器一旦检查出错,要立即修复

  • 回顾会议

    • 软件团队复盘的一种实践

    • 枚举关注点,选出重点,深入讨论,列出行动项,找到负责人

  • 5 个为什么

    • 又一个来自丰田的实践

    • 沿着一条主线追问多个问题

实战指南

  • 通过沟通反馈,不断升级自己的编解码能力

  • 用业务的语言写代码

  • 多面对面沟通,少开会

  • 多尝试用可视化的方式进行沟通

  • 做好持续集成的关键在于,快速反馈

  • 定期复盘,找准问题根因,不断改善

  • 多走近用户

  • 事情往前做,有问题尽早暴露

  • 多输出,让知识更有结构

思路

  • 用信息论理解沟通反馈

  • 写代码的进阶路径编写可以运行的代码

    • 编写符合代码规范的代码

    • 编写人可以理解的代码

    • 用业务语言写代码

  • 会议是一种重量级的沟通方式

    • 减少参会人数

    • 找人面对面沟通

  • 聆听用户声音

    • 能做自己用户,做自己的用户

    • 能接近用户,接近用户

    • 没有用户,创造用户

  • Fail Fast

    • 一种编写代码的原则

    • 出现问题尽早报错

  • 金字塔原理

    • 从中心论点,到分论点,再到论据

额外

  • 持续集成是一条主线,可以将诸多实践贯穿起来

    • 从持续集成到稳定的开发分支,到频繁提交,足够小的任务,到任务分解

    • 从持续集成到可检查

    • 到测试防护网

    • 到测试覆盖率

    • 到单元测试

    • 到可测试代码

    • 到软件设计

  • 安全性检查,是回顾会议的前提条件

  • 在信息获取上,国内外程序员差别不大,开拓视野,改善工作习惯,是国内程序员亟需提高的

自动化

重点

  • 持续交付

    • 将生产部署纳入了开发的考量

    • 持续交付的基础设施通常包含持续集成环境、测试环境、预生产环境和生产环境

    • 构建流水线保证到了下游的交付物一定是通过上游验证的

    • 随着 Docker 的诞生,交付由发布包变成了 Docker 镜像

  • DevOps

    • 将开发和运维结合到一起

    • 环境配置工具上的进步,让基础设施即代码成了行业共识

  • 验收测试

    • 站在业务的角度编写

    • BDD 是一种编写验收测试的方式

    • Given…When…Then… 的描述给了一个描述业务的统一方式

    • 写好验收测试,需要构建测试模型

  • SOLID 原则

    • 设计模式背后的道理

    • 单一职责原则(Single responsibility principle,SRP)

    • 开放封闭原则(Open–closed principle,OCP)

    • Liskov 替换原则(Liskov substitution principle,LSP)

    • 接口隔离原则(Interface segregation principle,ISP)

    • 依赖倒置原则(Dependency inversion principle,DIP)

    • 用好单一职责原则,前提条件是看待问题颗粒度要小

  • DDD

    • 它将思考的起点拉到了业务上

    • DDD 分为战略设计和战术设计

  • 微服务

    • 做好微服务的前提是划分好限界上下文

    • 微服务的第一步,不要划分微服务

实战指南

  • 请谨慎地将工作自动化

  • 将你的工作过程自动化

  • 有体系地学习运维知识

  • 将部署纳入开发的考量

  • 将验收测试自动化

  • 把函数写短

  • 构建好你的领域模型

  • 用简单技术解决问题,直到问题变复杂

  • 学习领域驱动设计

改善

  • 程序员的三大美德

    • 懒惰(Laziness)

    • 急躁(Impatience)

    • 懒惰(hubris)

  • 小心 NIH 综合症(Not Invented Here Syndrome)

  • 写好构建脚本,做好项目自动化

  • 参照 Java 知识体系,学习运维知识

  • 软件设计最基础的原则是“高内聚、低耦合”

  • 分层架构是一种设计上的分解

  • 不同业务量的系统本质上不是一个系统

  • 采用简单技术解决问题,直到问题变复杂

额外

  • 持续集成的延伸

    • 持续集成完成系统集成

    • 持续交付完成可部署上线

    • “持续验证”完成产品想法验证

  • AB 测试,用一个软件的多个版本验证想法

  • Selenium 用以完成浏览器的自动化

  • 熟练使用快捷键

推荐书

总结自:《10x程序员工作法》