开发软件有时感觉就像一场公开表演。互联网奖励的是发布会、截图和更新日志中的要点。因此,当一名开发者在某个项目上投入了一整天,却没有任何可见的成果时,直觉往往会认为这一天被浪费了。美食博客平台(Food Blog Platform)最新的开发日志证明了事实恰恰相反。没有新的食谱可以展示,没有重新设计的卡片,也没有供用户点击的新按钮。有的只是被拆解、检查并重新组合得比以前更好的代码。

这就是让长期项目保持生命力的“隐形工作”。

功能赢得荣耀;重构维持运转

当你维护一个美食博客平台时,表面看起来很简单。用户发布食谱、上传照片并按类别浏览。然而在底层,你正在处理图像流水线、食材与步骤之间的数据库关系、搜索索引以及缓存层。随着时间的推移,临时修复方案会不断堆积。一个被复制到三个不同文件中的辅助函数;一个在只有十篇帖子时运行良好,但在达到一千篇时却慢如蜗牛的数据库查询;最初井然有序的 CSS,在经历了五次紧急补丁后变成了一个迷宫。

重构意味着正面应对这些混乱。它可能意味着合并重复的逻辑,使食谱编辑表单和管理后台使用相同的验证层,而不是维护两个并行的版本。它可能意味着简化图像处理方式,使压缩程序只运行一次,而不是每次页面重新加载时都运行。或者它可能涉及重构代码库,以便日后添加新的内容类型时,无需在六个无关的目录中四处搜寻。

这些都不会出现在用户界面上。访问网站的用户不会看到写着“查询已优化”或“组件已解耦”的横幅。但当网站加载速度变快时,他们会感受到这一点。当一个新功能在需求提出三天后而非三周后出现时,他们会注意到。开发者今天并没有增加新功能。他们只是扫清了障碍,以便后续添加功能时无需与代码库“搏斗”。

整洁的代码是对未来失败的投资

每个持续超过一个月的项目都会积累摩擦。你构建了一个快速原型来测试想法。然后用户真的来了。接着你需要身份验证层,然后是审核队列,然后是移动端布局。每一次新增功能都是直接“嫁接”到现有的结构上的。如果没有定期的维护,架构就会变得像一栋房子,每个新房间都是由一个从未见过设计蓝图的不同的人设计的。

技术债并非纪律的失败。它是为了交付真实产品而进行权衡时的自然副产品。危险不在于你的代码不完美,而在于让它保持不完美的时间太长,以至于修改一个变量就会破坏三个无关的功能。你发现自己不敢碰搜索栏,因为上次尝试时,标签系统崩溃了。你推迟添加饮食计划小部件,因为你知道数据库模式已经变成了一个需要数小时才能解开的乱麻。

花一天时间进行重构,就像是在利息压垮你之前偿还债务。它能防止小问题演变成大问题。当美食博客平台最终添加下一个重大功能时,开发者将不必在脆弱的代码周围小心翼翼地绕行。他们将编写新逻辑,将其接入整洁的接口,然后继续前进。这就是投资回报。

小步前进,真实学习

关于软件开发有一种神话,认为进步表现为天才般的突破和一夜之间重写一切的马拉松式编程。大多数在职开发者会告诉你,那只是幻想。真正的进步看起来像是周二下午的一个 diff:三个函数变短了,一个冗余依赖被移除了,一个令人困惑的变量名被修改了,以便下一个读者能真正理解它的作用。

美食博客平台的开发日志完美地捕捉到了这种节奏。构建软件关乎于微小且持续的改进。你从每一个挑战中学习。也许今天的挑战是理解为什么某个特定模块会变得如此依赖另一个模块。也许是意识到两周前采取的捷径已经开始消耗比它节省的更多的成本。每一次提交都让项目变得更好,即使那次提交删除的内容比创建的内容更多。

这种方法也能保护你的积极性。大规模重写既令人精疲力竭又充满风险。它们在解决旧问题的同时,也会引入新的 Bug。增量重构,已完成