“所有的代码,终将成为遗留代码。”(All code is legacy code.)这是一个常见的编程格言。尽管不容易承认,但大多数开发者都意识到其道理。换句话说,代码一旦交付,就成了未来的“遗留问题”,无论我们多么希望它能始终保持“现代化”。
如果所有代码终将成为遗留代码,那么所有程序员迟早都要成为“维护者”。在编程职业生涯中,许多开发者或是亲自维护过几十年前的代码,或是管理那些专注于维护老旧系统的团队。虽然网上总是流行关于新兴技术的讨论,但实际上,有大量默默无闻的技术人员正在修复老旧系统的问题,确保这些旧代码在新环境中继续运行。
代码回溯中的“最糟糕的程序员”很多程序员自嘲道“六个月前的自己,是见过最差的程序员”。在维护老旧代码时,许多代码显得难以理解:那些深层嵌套的 if 语句,层层叠加的布尔条件,硬编码的数值——一切都让人无从下手。这些代码不仅难以维护,还极易出错,甚至让人怀疑它们能否正常工作。
然而,对于维护人员来说,无法简单地“重写”旧代码,而是要在已有代码的基础上修复错误、添加功能。渐渐地,许多开发者意识到,虽然这些代码有诸多缺陷,它们依旧在许多系统中稳定运行。或许在这些代码被写就之时,开发者们确实已经用上了他们所知的“最佳实践”。
“站在巨人的肩膀上”在开发技术飞速发展的今天,“面向对象编程”“模块化设计”“依赖注入”等现代编程范式已经广泛应用。Martin Fowler、Uncle Bob、Kent Beck 等软件工程师总结的设计原则,如 SOLID 原则、测试驱动开发(TDD)等,为当代编程带来了深远影响。现在看来理所当然的设计方法,其实是数十年开发实践中逐渐总结和完善出来的。
例如,面向对象编程在早期时是一项创新,但也充满了冗余的继承结构和多层嵌套。直到近十几年来,开发者们才逐渐意识到“组合优于继承”等原则。随着行业经验的积累,实践中的设计模式也越来越清晰。
面对“旧时代的技术债”许多维护人员对老旧代码充满抱怨,觉得“这些代码简直一团糟”。每次需要在这些代码中实现新功能时,旧代码的“低质量”似乎格外明显,有时甚至产生将其重写的冲动。然而,逐渐地,不少开发者意识到,尽管这些代码没有现代代码的“优雅结构”,它们依旧坚挺地运行在客户的机器上。
这或许就是对“代码质量”的另一种理解:那些看似混乱的代码,因为不断地在现实中被修复、增强,已经达到了一种“工作即优质”的状态。这些年积累的修复、改进和测试,使这些老旧代码在实际应用中达到了“正确运行”的标准。
未来的“遗留代码”尽管今天的程序员尽力遵循当代的最佳实践来编写代码,但不难想象,未来某一天,这些看似“精心设计”的代码也会被后辈们嘲笑和质疑。现代化的框架、工具和标准也许会被更新的技术取代,未来的程序员或许会发现今天的代码同样“古怪且不可思议”。
编程是一项持续进化的职业,每一代程序员都在探索、创新,并最终为下一代提供借鉴。面对那些古老的遗留代码,更应怀着一份理解和敬意,毕竟它们在几十年里,为软件行业和无数企业作出了不可或缺的贡献。
结语或许“最糟糕的程序员”就是当下的我们——不仅是过去的程序员,还是现在的每一位开发者。代码终将成为遗留代码。今天自以为是的“最佳实践”或许会在未来被质疑,或被更优秀的技术所取代。无论何时,真正的优质代码就是在需要时能够正常运行的代码,哪怕它结构混乱、难以维护。
编程是一种“在过去与未来之间寻求平衡”的艺术。程序员的责任并非追求完美的代码,而是在现实需求下创造“能够正常工作的代码”。