从软件工程到知识工程
暂时不用担心 AI 取代程序员
软件工程不仅仅是编写代码,写代码在软件开发中只占很小的比例。
软件工程困难的部分:问题解决、需求分析、系统设计、测试和维护等方面。
软件是载体,并不是真正的产品,真正的产品是包含在其中的知识。
软件只是知识的可执行形式。
软件开发的核心是知识的获取与学习,而不是产生代码。
有效编码的前提是,所需的知识已经被有效地获取了。
知识先存在于大脑中,然后才能体现在软件里。
如果所有的知识都已经被掌握,那么编码也不会花费太多的气力。
否则,开发过程就会迅速地转化为如何寻找并掌握正确的知识。
高水平的程序员,敲代码前 80% 的代码都已经在头脑中构思好了,写代码不是软件开发的核心部分。
但编码的确是一个琐碎且繁杂的活动,它甚至掩盖了我们工作中最有价值的部分:获取、学习并传递知识。
将软件开发的过程看作知识管理的过程,强调知识作为核心产品,并不是什么新的观念。极限编程等敏捷软件开发方法就是源自这种理念的实践。
LLM 将使软件工程师能够更多地专注于复杂问题的解决和创新,专注于更有价值的部分。也就是知识的获取与传递。
关注点从如何构造软件,变成了如何提取组织知识,让知识变成 LLM 能够理解的形式。
因此,提示词工程(Prompting Engineering)的关键并不在提示词,而在如何组织其中的知识。
因而**知识工程(Knowledge Engineering)**是一个更合理的名字。
如何开挂
对个人而言,从自己编码变成指导 LLM 编码。
降低了编码技能要求。
提高了对知识总结、知识传递、任务分解等技能的要求。
传奇程序员 Kent Beck 所言:LLM 让我 90% 的技能无用了,却让 10% 的技能放大了 1000 倍。
对团队而言,大量的知识可以通过 LLM 得到有效的沉淀。
需要我们有能力将现有研发流程重新梳理为知识管理的过程,从中捕获关键知识,并通过 LLM 加以沉淀。
外挂使用说明
需要掌握如何从知识管理的角度理解软件开发。
在软件开发的不同阶段中,提取核心知识及关键载体,将它们表示成易于 LLM 理解的形式。
其中编码阶段的知识提取和传递,将是个人与 LLM 合作的核心技能。
需求分解与传递的过程,这是整个开发流程中最关键的一部分知识,LLM 可以发挥非常重要的作用。
Kent Beck 的一些传奇
测试驱动开发(Test-Driven Development, TDD):
Kent Beck 是测试驱动开发的先驱和最著名的倡导者之一。TDD是一种软件开发方法,在这种方法中,开发人员先编写一个失败的自动化测试案例,然后编写代码使得这个测试能够通过,最后重构代码以满足设计原则。TDD已经成为现代敏捷开发实践中的一个基石。敏捷开发和极限编程(Extreme Programming, XP):
Kent Beck 是极限编程的创建者,这是一种以敏捷软件开发为中心的方法论。XP倡导频繁的发布、简单的设计、对话式工作和代码共有等原则,强调团队协作、编程效率和客户反馈。重构(Refactoring):
尽管重构这一概念并非Kent Beck提出,但他对于重构的普及有着深远的影响。他与Martin Fowler共同撰写了《重构:改善既有代码的设计》一书,该书被广泛认为是现代软件重构技术的白皮书,深受开发者喜爱。JUnit:
Kent Beck 和 Erich Gamma 共同创建了 JUnit,这是一个流行的Java测试框架,对测试驱动开发的普及和实践有着巨大影响。JUnit也启发了其他语言的单元测试框架,如Python的PyUnit和C#的NUnit。Smalltalk开发:
在他早期的职业生涯中,Kent Beck 对Smalltalk编程语言做出了贡献,这种语言对面向对象编程和敏捷开发都有深刻的影响。书籍和文章:
Kent Beck 是多部著名编程书籍的作者,包括《极限编程解释》(Explained: Extreme Programming)、《测试驱动开发:实战和模式》等。这些书籍影响了无数的程序员和软件工程师。