内容提要
本文探讨软件工程中技术问题与工程问题的区别,强调工程问题涉及真实需求、限制和环境,需权衡取舍。引用Brooks《无银弹》观点,指出软件复杂性、遵从性、易变性和不可见性等本质问题无法简单解决,LLM编程未消除这些挑战。作者呼吁区分娱乐与职责,重视长期维护和优秀设计,而非仅追求技术炫技。
延伸解读
工程问题与技术问题的区别
文章通过具体例子说明,技术问题关注实现细节,如Go语言中带缓冲channel的阻塞行为;而工程问题则涉及真实需求、限制和环境,如内存占用、服务器配置等。这种区分有助于避免过度设计或简化,确保技术选型符合实际场景。
软件本质的四个难点
Brooks指出软件具有复杂性、遵从性、易变性和不可见性,这些本质属性导致软件开发没有银弹。复杂性源于软件各部分难以相同,遵从性要求软件适应外部接口,易变性意味着软件需持续变更,不可见性使设计难以可视化。这些难点无法通过技术手段消除,只能通过优秀设计和管理来应对。
LLM编程的局限
文章认为LLM编程并未解决软件工程的根本问题。虽然LLM能快速生成代码,但软件的需求分析、架构设计等核心工作仍需人工思考。LLM生成的代码可能缺乏最佳实践,且当设计者不理解软件结构时,维护和变更会变得困难。因此,LLM只是工具,不能替代工程师的职责。
娱乐与职责的平衡
作者区分了编程作为娱乐和作为职业的不同。个人项目中的技术探索和重复造轮子可以带来乐趣,但在实际工程中,应优先考虑现有方案和团队能力,避免过早优化。理解工程问题与技术问题的区别,有助于工程师之间有效沟通,并在职业中做出合理决策。
Q&A
什么是工程问题?它与技术问题有什么区别?
工程问题涉及真实软件需求、限制和外部环境,需要权衡取舍;技术问题更接近科学原则和事实,只关乎设计和实现。例如,使用带缓冲的channel是技术细节,而根据服务器内存和并发数决定用带缓冲的channel控制并发数就是工程问题。
Brooks在《没有银弹》中提到的软件工程的四个本质问题是什么?
Brooks认为软件工程的本质问题(自发性问题)有四个:复杂性、遵从性、易变性和不可见性。复杂性指软件没有两个部分相同,难以整体把握;遵从性指软件必须遵从已存在的接口;易变性指软件变更频繁且寿命长;不可见性指软件难以用图形表示整体结构。
为什么说LLM编程没有解决软件工程的本质问题?
LLM编程没有消除软件的复杂性、遵从性、易变性和不可见性。复杂性只是不再被vibe-coders关心;易变性依然存在,但改变起来并不容易;遵从性和不可见性也依然存在。LLM只是帮助表达概念,但需求分析和设计仍是瓶颈。
在软件工程中,为什么选择Java可能是合理的?
选择Java可能合理,因为会Java的人多,招人容易,遇到问题容易找到解决方案,生态成熟,JVM稳定。但代价是JVM启动慢、语法啰嗦、内存占用大,高并发不如Go。如果服务长期运行、业务以增删改查为主,Java是合理选择。
Brooks认为哪些方法有可能解决软件工程的本质问题?
Brooks认为可能解决本质问题的方法包括:不重复造轮子(购买或复用已有软件)、需求精进和快速原型、增量开发,以及培育优秀设计师。其中,优秀设计师是最重要的。
为什么说“谁都写得出来,但不是谁都写得下去”?
这句话强调编写代码容易,但长期维护软件很难。例如,React写起来不难,但维护一个代码库十三年需要统筹开源贡献、团队沟通和用户反馈。好的软件需要长期维护,这要求工程师持续应对复杂性、遵从性、易变性和不可见性。
作者认为软件工程师的娱乐与职责有什么区别?
娱乐指为了乐趣而编写软件,如周末vibe code或重复造轮子,这些创造的价值可能为零。职责指在真实工程中,需要区分工程问题和技术问题,避免过度工程或极端简化,重视长期维护和优秀设计,而不是追求技术炫技。