本章背景:你是能力很强的程序员,并且正在发挥技术特长,运用速成原型法帮助人们探索新的产品创意。
尽早生成可工作的软件,可以令产品设计变成交互式协作过程。高效的反馈环有利于快速识别潜在的不良设计,并对此提出解决方案,以免日后在更关键的阶段浪费大量时间和精力。
不要花费过长时间去讨论子系统(书中实际例子为推荐系统)的完美实现方式,而应该先集中精力寻找“最简单可行的方法”。
第一次发布的真正目的是创建一个可用的系统,以便提高后续的变更速度,并由此开始探索项目创意的过程。
完全不犯错误是不可能的,但最关键的是你对这些问题作何反应。
如果拖得越久,问题是不是越难解决?如果答案是否定的,那么这个问题是可以暂缓的。让出时间给更核心的问题。
每当发现自己的软件有瑕疵时,你可能想要停下手中的工作,立即去修复。但是在项目的探索阶段,你得去平衡软件缺陷带来的损失和修复这一缺陷的时间成本。
尽早探知客户头脑中的想法,早问总比晚问好。所谓“学之乃知,不问不识”,多问问总不会有坏处!
力求缩小自己的工作范围。
谨记原型并非生产系统。
将技术思想可视化,方便与客户进行探讨并收集反馈。
在原型阶段结束之前,应该至少会有一个始料未及的重大问题浮出水面。
本章背景:工作变得复杂起来。你需要逐步扩展现有系统,同时需要为很多活跃客户提供支持。你发现理想丰满而现实骨感:一方面,你想按照自认为正确的想法进行工作;另一方面,客户不断给你施压,要求你尽快交付新的特性。
你将了解到,在逐步扩展代码库的过程中,哪些出乎意料的问题会从天而降。
不存在所谓的“独立特性”
这些赶出来的工作会在以后出问题时反过头来咬你一口。
对数据库模式所做的任何修改都应该考虑到数据的一致性。不管新特性在代码层面上多么独立,在数据层面上仍有可能存在隐藏的依赖关系。这就意味着,为了支持某一特性而在代码库的某一部分进行的模式升级,可能会使一些看起来毫无关系的其他特性崩溃。(书中的例子是,为数据库新增了一列,但对于老数据,这一列的值是null,由此导致了异常。)
避免不必要的实时数据同步。
本章背景:你对草率决策的代价,尤其是在整合外部代码的过程中仓促决策所带来的损失,有了更深的理解。你从过去的错误中学到很多,并开始关注业务、客户服务及技术工作三者之间的复杂关系。
如果不将服务集成考虑清楚,会对决策产生不良影响。
应该多做一些调查,看看有没有其他人也在以你的这种方式使用该服务。也许很难找到这样的人,这本身就该给你敲响警钟,让你停下来思考一下为什么没有人这样用。
“五个为什么”游戏:一般用于发掘问题的根本原因。做法是通过反复问“为什么”来提示问题的大背景。由于大部分问题的根本原因不止一个,因此为了从不同角度发掘原因,可以根据需要,不断重复询问(追问)。
过期的第三方库仍然可用(只要代码库及其基础设施中没有引入不兼容的变更)。但Web服务(接口)是一种完全不同的依赖。
现场测试非常重要。
如果再遇到服务依赖变更,我们除了要进行代码复查,查找过期的模拟对象,一定还要定期运行小规模的自动化测试来审查服务本身。
在开放的互联网环境中,你需要担心的不只是自己集成的服务。有时,会有人不请自来地把你和他们自己集成到一起。(比如爬虫,攻击等等)
为发现的所有问题都添加回归测试,无论问题有多小。
务必检查测试配置中的模拟对象,以免测试结果让你错误地认为模拟的API客户端仍能正常工作。
异常报告系统最好能把相似问题合成一个报告。
背景:你已经成为了经验相当丰富的开发人员,并且有能力教别人如何看待编程和解决问题。你现在已经开始指导新入行的朋友了。
现实中的原始数据一般都是一团乱麻,所以在使用样本数据前对它进行处理,这再自然不过了。
欲解复杂问题,先知简单情况。
背景:你在通往大师的道路上继续前行。你可以指出公司遗留系统的弱点,并设计合适的组件进行替换,既使商业效果得到优化,又使工作流程更加友好。
在数据源混乱的系统中,一般最好保留一定的灵活性,不要在模型的物理层强加太多结构。
事件溯源模式(更多参考)将独立事件建模为不变的数据。这些数据代表不变的事实。通过遍历事件序列并计算结果,可以看到系统当前的状态。
康威定律:设计系统的组织,其产生的设计和架构等价于组织间的沟通结构。如果你的系统设计或者架构不支持,那么你就无法成功建立一个有效的组织;作为系统架构师,一定要深入领会康威定律,设计系统架构之前,先看清组织结构,也要看组织文化(民主合作式,集权式,丛林法则式,人才密度),再根据情况调整系统架构或者组织架构。(更多架构和康威定律的论述参看这里)
背景:你对整个软件行业都已经足够熟悉。无论组织的哪个层级出现问题,你都能发现并修复。你的核心竞争力仍然是软件开发,但足够丰富的经验使你能很好地与各个层级的人员进行交流。
帕累托法则:很多情况下,20%的投入就会有80%的产出。
突破工作过程中的一个瓶颈,很自然地会让人看到另一个瓶颈。这是进步的标志。
未上线的代码不是资产,而是存货。而且,这些存货还容易腐坏,并具有持有成本。
若想跟上进度,要么放慢发布节奏,并且减少开发工作,要么加速反馈环。我认为将三者结合可以达到最佳效果。
“玫瑰、花蕾和荆棘”的形式总结:“玫瑰”代表发生的好事,“花蕾”代表大有希望的事,而“荆棘”代表遇到的痛点。
海盗指标(更多参考):(AARRR metrics, AARRR分别代表Acquisition、Activation、Retention、Revenue和Referral,即获取、激活、留存、收入和推荐),这些指标对任何公司都至关重要。
要足够了解周围每个人都在做什么,以便了解自己的工作是否符合大局。比如,每周让一位开发人员抽出一天时间解决客户支持团队认为值得处理的“小问题”。每周轮换,让所有开发人员都有机会处理客户的问题,从中获得经验。
本章的案例问题及解决方式值得反复研读。
在不久的将来,“程序员是用技术解决人类社会常见问题的人”这一观点可能成为行业标准。
程序设计中最有趣的一直是解决问题、沟通等“以人为本”的方面;代码只是我能找到的解决问题最有力的工具而已。
站在足够高的层次与计算机交流,只需要关注如何解决问题,而不是纠结于代码编写中的细枝末节。
如果你想保持头脑清醒、不忘记问题背景,就需要一遍又一遍地问:“等等,我想解决什么问题来着?”