软件工程循环中的人类与智能体

2
分类佳文共赏
作者Kief Morris
来源跳转
发表时间

内容

人类是否应该避免软件开发过程并让机器人生成代码,还是我们需要开发人员参与到每一行代码的检查中?我认为答案是关注将想法转化为结果的目标。我们人类的正确位置是建立和管理工作循环,而不是让代理人自己处理或过度控制他们产生的内容。让我们称之为“在循环中”。

作为软件创作者,我们通过将想法转化为可工作的软件并随着我们学习和演化想法而迭代来构建结果。这是“为什么循环”。直到人工智能大起义,我们人类将运行这个循环,因为我们是那些想要它产生的内容的人。

构建软件的过程是“如何循环”。如何循环涉及创建、选择和使用中间产物,如代码、测试、工具和基础设施。它也可能涉及文档,如技术设计和ADR。我们习惯于看到这些作为交付物,但中间产物实际上只是达到目的的手段。

软件交付反馈循环:一个上面的“为什么”循环连接到一个下面的“如何”循环。为什么循环迭代想法和可工作的软件。如何循环迭代中间产物,如规范、代码和测试。

图 1:为什么循环迭代想法和软件,如何循环迭代构建软件

实际上,如何循环包含多个循环。最外层的如何循环指定并交付可工作的软件给为什么循环。最内层的循环生成和测试代码。中间的循环将更高级别的工作分解为更小的任务,让下层的循环来实现,然后验证结果。

多个“如何”循环支持“为什么”循环。一个外层循环迭代特性。一个中间循环迭代故事。一个内层循环迭代代码。

图 2:如何循环有多个内层循环,工作在更小的实现增量上

这些循环可能遵循设计审查和测试阶段的实践。它们可能通过应用架构方法和设计模式,如微服务或CUPID来构建系统。像中间产物一样,这些实践和模式都是实现我们真正关心的结果的手段。

但也许我们不关心实现目标的手段?也许我们可以让LLMs自己处理如何循环?

人类外循环

许多人已经发现了让人类专注于为什么循环,而让代理人处理如何循环的乐趣。这是“ vibe coding”的常见定义。一些Spec Driven Development(SDD)的解释也是如此,人类投资于写出我们想要的结果,但不 dictate如何LLM应该实现它。

人类外循环:一个上面的“为什么”循环,人类在顶部。循环迭代想法和可工作的软件。这与一个下面的“如何”循环连接起来,机器人迭代中间产物,如代码。

图 3:人类运行为什么循环,代理人运行如何循环

人类外循环的吸引力在于为什么循环才是我们真正关心的。软件开发是一个混乱的领域,注定会陷入过度工程化的过程和应对技术债务。并且,到目前为止,每个新LLM模型都更擅长从用户提示中生成可工作的软件。如果你不满意它生成的内容,告诉LLM,它会给你另一个迭代。

如果LLMs可以不受我们的控制生成和修改代码,我们是否关心代码是否“干净”?不管变量名是否清晰地表达其目的,只要LLM可以理解它就行。也许我们甚至不需要关心软件是用什么语言编写的?

我们关心的是外部质量,而不是内部质量本身。外部质量是我们作为软件用户或其他利益相关者的体验。功能性质量是必须的,系统必须正确工作。对于生产软件,我们还关心非功能性、运营质量。我们的系统不应该崩溃,它应该运行快速,我们不希望它将敏感数据发布到社交媒体网站上。我们不希望在云托管上产生巨大的账单,而且在许多领域,我们需要通过审计。

我们关心内部质量,只有当它影响外部结果时。人类编码者曾经在代码库中爬行,添加功能和修复bug,他们可以更快、更可靠地在干净的代码库中完成。然而,LLMs是否关心开发者体验?

理论上,我们的LLM代理可以生成一个极度复杂的“意大利面”代码库,测试和修复它通过运行 ad-hoc shell 命令,最终产生一个正确、符合规范、性能高的系统。我们只需让我们的群体像拉尔夫·威格姆一样工作,运行在浮在海洋中抽取能量的数据中心,最终我们会得到结果。

在现实中,干净设计、结构良好的代码库在外部重要性上优于混乱的代码库。当LLMs可以更快地理解和修改代码时,他们工作得更快,螺旋得更少。我们确实关心构建我们需要的系统的时间和成本。

人类在循环中

一些开发者认为,唯一的方法是通过密切参与最低层次的如何循环来维持内部质量。通常,当代理人螺旋在某个破碎的代码片段时,人类开发者可以在几秒钟内理解并修复它。人类经验和判断在许多情况下仍然超过LLMs。

人类在循环中:一个单独的“为什么+如何”循环,人类在顶部,机器人在底部。循环迭代想法、中间产物如代码和测试,以及可工作的软件。

图 4:人类运行为什么循环和如何循环

当人们谈论“人类在循环中”时,他们通常指的是人类作为内层循环中代码生成的门槛,例如手动检查LLM生成的每一行代码。

当我们坚持过度参与过程时,我们会成为瓶颈。代理人可以比人类更快地生成代码,而人类可以手动检查。关于开发者与AI的生产力报告显示出混合结果,这可能至少部分是因为人类花费更多时间指定和审查代码,而不是通过LLMs生成它。

我们需要采用经典的“左移”思维。曾经,我们编写所有代码,交付给QA团队进行测试,然后尝试修复足够的bug来发布版本。然后我们发现,当开发者在工作时编写和运行测试时,我们可以立即发现和修复问题,这使整个过程更快、更可靠。

对人类有效的方法也可以对代理有效。代理可以生成更好的代码,当它们可以评估自己产生的代码质量时,而不是依赖我们来检查它们。我们需要指导它们,我们需要提供关于实现最佳方法的指导。

人类在循环中

而不是亲自检查代理产生的内容,我们可以让它们变得更好地产生内容。控制不同层次的循环内部的规范、质量检查和工作流程指导的集合是代理的马具。 Harness Engineering(马具工程)是人类在循环中的实践,即建立和维护这些马具的方法。

人类在循环中:一个上面的“为什么”循环连接到一个下面的“如何”循环,人类在顶部,机器人在底部。为什么循环迭代想法和可工作的软件。机器人坐在下面的“如何”循环底部,迭代中间产物,如规范和代码。

图 5:人类定义如何循环,代理运行它

类似于在循环中的概念也被描述为“中间循环”,包括The Future of Software Development Retreat(软件开发未来的会议)的参与者。中间循环指的是将人类注意力转移到比编码循环更高级别的循环。

在循环和在循环之间的区别在于,当我们不满意代理产生的内容,包括中间产物时,我们会做什么。 “在循环中”的方式是修复产物,是否直接编辑它,还是告诉代理进行我们想要的更正。 “在循环中”的方式是改变产生产物的马具,使它产生我们想要的结果。

我们不断改进我们获得的结果的质量是通过不断改进马具。然后我们可以再往上走。

代理飞轮

下一个层次是人类指示代理来管理和改进马具,而不是手动进行。

飞轮:一个上面的“为什么”循环连接到一个下面的“如何”循环,人类和机器人在顶部。为什么循环迭代想法和可工作的软件。如何循环迭代中间产物,如规范。

图 6:人类指示代理建立和改进如何循环

代理飞轮

下一个层次是人类指示代理来管理和改进飞轮,而不是通过手动方式。

飞轮:上层的“为什么”循环与下层的“如何”循环通过人类和机器人连接。 “为什么”循环迭代一个想法和工作软件。 “如何”循环迭代中间产物,如规范。

图 6:人类指示代理建造和改进“如何”循环

我们通过向代理提供评估循环性能所需的信息来建造飞轮。一个好的起点是已经包含在飞轮中的测试和评估。随着我们向飞轮提供更丰富的信号,飞轮变得越来越强大。添加测量性能和验证失败场景的管道阶段。向飞轮提供生产运营数据、用户旅程日志和商业结果,以扩大代理可以分析的范围和深度。

对于工作流程的每个步骤,我们让代理评审结果并为飞轮推荐改进。范围包括改进上游工作流程的任何部分,以改善这些结果。我们现在有一个代理飞轮,它为改进自身生成了建议。

我们从考虑建议开始,要求代理实施具体的更改。我们也可以让代理将建议添加到产品背包中,以便我们可以优先排序和安排它们,让代理在自动流程中应用和测试。

随着我们增强信心,代理可以为其建议分配评分,包括风险、成本和收益。我们可能会决定将具有特定评分的建议自动批准并应用。

在某个时候,这可能会看起来像人类从循环中消失了,老式的编码方式。我怀疑这将是标准类型的工作,随着改进循环达到递减收益。通过工程飞轮,我们不会仅仅获得一次性的“足够”的解决方案,我们会获得持续改进自身的健壮、甚至抗碎系统。

评论

(0)
未配置登录方式
暂无评论