文章摘要
在软件开发中,平衡速度与质量是关键。作者分享了自己在小团队中长期维护软件的经验,强调并非所有代码都需要完美无缺。例如,在24小时游戏开发中,追求代码优雅是浪费时间;而在开发心脏起搏器等关键设备时,代码质量至关重要。作者认为,应根据项目需求灵活调整代码标准,避免过度追求完美或过于草率。
文章总结
文章标题:如何快速构建软件
作者:Evan Hahn
发布时间:2025年7月8日
更新日期:2025年7月9日
文章主要探讨了在时间和质量的双重约束下,如何快速构建高质量的软件。作者分享了自己在小团队中长期维护软件的经验,并提出了几个关键策略。
主要内容总结:
“代码应该有多好?”
作者指出,代码的质量应根据项目的需求来调整。例如,在24小时游戏开发比赛中,代码的整洁性并不重要;而在开发心脏起搏器等关键设备时,代码必须非常严谨。作者的个人经验是,大多数项目应追求“8分”的质量,即在保证代码功能的前提下,允许存在一些小问题,但要在规定时间内完成。草稿阶段的重要性
作者提倡在开发初期快速实现一个“草稿”版本,即使这个版本存在很多问题(如未处理的错误、重复代码、硬编码数据等)。草稿阶段的代码虽然粗糙,但能帮助开发者快速理解问题,并发现未知的挑战。随后,开发者可以逐步优化这个草稿,最终形成高质量的代码。尝试改变需求
作者建议在可能的情况下,通过简化需求来加快开发速度。例如,合并多个界面、忽略某些边缘情况、或只支持部分功能。此外,作者还提到,有时可以通过逐步改变团队文化来减缓开发节奏,避免过度紧张。避免代码中的分心
现代开发环境中充满了各种干扰(如手机通知、同事消息、会议等)。作者建议通过设置定时器或结对编程来保持专注,避免在代码中“迷失方向”。小步快跑
作者强调,小而专注的代码变更通常比大范围的修改更有效。小变更更容易编写、审查和回滚,同时减少了引入新错误的风险。作者还建议将大任务拆分为多个小步骤,逐步完成。有用的技能
作者列举了几个在快速开发中非常有用的技能,包括:- 阅读代码:这是最重要的技能之一,帮助开发者更好地理解代码和调试问题。
- 数据建模:合理的数据模型设计可以避免许多错误。
- 脚本编写:使用Bash或Python编写脚本可以加速日常任务。
- 调试工具:使用调试器比基于
print()的调试更高效。 - 适时休息:遇到难题时,短暂休息往往能带来新的思路。
- 纯函数和不可变数据:函数式编程风格可以减少错误和复杂性。
- LLM(大语言模型):尽管存在局限性,LLM可以在某些开发环节中加速工作。
总结:
作者总结了快速构建软件的几大要点: - 根据项目需求调整代码质量。 - 从草稿开始,逐步优化。 - 尝试简化需求。 - 保持专注,避免分心。 - 小步快跑,逐步完成大任务。 - 掌握并练习有用的开发技能。
这些经验虽然看似简单,但都是作者在长期开发实践中逐步积累的。作者鼓励读者分享自己的经验和技巧,以共同进步。
参考链接: - “Throw away your first draft of your code” - “Best Simple System for Now” - “YAGNI”
评论总结
主要观点总结:
快速原型与长期维护的平衡
- 支持快速原型:多位评论者认为,快速构建原型有助于探索问题空间,避免过早陷入生产级别的细节。例如,KronisLV提到“Build One to Throw Away”的方法,认为现代框架(如Ruby on Rails、Django等)也支持这种快速开发模式。
- 引用:“The initial rough draft almost reminds me of the old ‘Build One to Throw Away’ approach.”
- 引用:“I usually start top-down, sketching the API surface or UI scaffold before diving into real logic.”
- 长期维护的重要性:也有评论者强调,快速开发可能会忽略长期维护的需求,如数据模型、测试和文档等。gbuk2013指出,开发速度会随时间、项目和团队规模下降,因此需要在短期内牺牲一些速度来保证长期的可维护性。
- 引用:“Some omissions during initial development may have a very long tail of negative impact.”
- 引用:“Get the data model right before you go live, and everything is so simple.”
- 支持快速原型:多位评论者认为,快速构建原型有助于探索问题空间,避免过早陷入生产级别的细节。例如,KronisLV提到“Build One to Throw Away”的方法,认为现代框架(如Ruby on Rails、Django等)也支持这种快速开发模式。
工具与技术的选择
- 熟悉工具的重要性:多位评论者建议选择熟悉的工具,而不是追求看似更合适的新技术。kukkeliskuu提到,Django在大多数情况下都能满足需求,即使项目初期看似“太重”。
- 引用:“Learn one tool well. It is often better to use a tool that you know really well than something that on the surface seems to be more appropriate for the problem.”
- 引用:“Always choose extremely boring technology. Just use python/Django/Postgres for everything.”
- 测试与构建速度:jillesvangurp强调快速构建和高效测试的重要性,建议通过并发测试、减少数据库清理等方式优化测试速度。
- 引用:“I run integration tests concurrently. My CPUs max out when I run my tests.”
- 引用:“Get a decent laptop and pay for fast CI hardware.”
- 熟悉工具的重要性:多位评论者建议选择熟悉的工具,而不是追求看似更合适的新技术。kukkeliskuu提到,Django在大多数情况下都能满足需求,即使项目初期看似“太重”。
代码质量与可维护性
- 代码质量与原型开发的矛盾:部分评论者认为,即使在原型开发阶段,也应尽量保持代码质量。whstl提到,他会在第一次尝试时就尽量写出“好”的代码,尽管这并不意味着要写大量测试。
- 引用:“I actually try to build it ‘well’ in the first pass, even for prototyping.”
- 引用:“It shouldn’t take more time to do this, though: if you’re making more classes to make it testable, you’re already messing it up.”
- 代码重构与债务:paffdragon指出,业务方通常只关注快速结果,而忽视了代码债务的积累,直到它变得难以处理。
- 引用:“Business mostly wants the result fast and does not understand tradeoffs in code until the debt hits the size of a mountain.”
- 代码质量与原型开发的矛盾:部分评论者认为,即使在原型开发阶段,也应尽量保持代码质量。whstl提到,他会在第一次尝试时就尽量写出“好”的代码,尽管这并不意味着要写大量测试。
团队规模与开发方法
- 小团队的优势:marginalia_nu认为,小团队可以更灵活地采用快速开发方法,因为每个人对项目有全面的理解,修复bug也相对容易。
- 引用:“Done correctly it will have you running circles around larger operations.”
- 引用:“Bugs are almost always easy to fix later for a small team or solo dev operation.”
- 大团队的挑战:在大团队中,代码理解和架构复杂性会增加,修复错误的成本也更高,因此更应注重每一步的正确性。
- 引用:“In larger development projects, fixing bugs and especially architectural mistakes is exponentially more expensive.”
- 小团队的优势:marginalia_nu认为,小团队可以更灵活地采用快速开发方法,因为每个人对项目有全面的理解,修复bug也相对容易。
数据与测试的重要性
- 真实数据的价值:hamdouni建议使用真实数据进行测试,以揭示合成数据可能忽略的问题。
- 引用:“It helps reveal unknowns in the problem space that synthetic data might miss.”
- 测试的优化:jillesvangurp详细讨论了如何通过并发测试、减少数据库清理等方式优化测试速度。
- 引用:“I run integration tests concurrently. My CPUs max out when I run my tests.”
- 真实数据的价值:hamdouni建议使用真实数据进行测试,以揭示合成数据可能忽略的问题。
总结:
评论者们围绕快速原型开发、工具选择、代码质量、团队规模和测试优化等话题展开了讨论。支持快速原型的观点认为这有助于探索问题空间,而反对者则强调长期维护的重要性。工具选择上,熟悉的技术往往比新工具更有效。代码质量在原型开发阶段也应得到一定关注,尤其是在大团队中。测试优化和真实数据的使用也被认为是提高开发效率和质量的关键。