迈向更高层次智能化的生成式软件开发 彭鑫复旦大学 彭鑫 复旦大学计算机科学技术学院教授、副院长 中国计算机学会(CCF)软件工程专委会副主任 《JournalofSoftware:EvolutionandProcess》联合主编(Co-Editor),ACMTOSEM等期刊编委。主要研究方向包括软件智能化开发、云原生与智能化运维、泛在计算软件系统、智能网联汽车基础软件等。研究工作多次获得IEEETransactionsonSoftwareEngineering年度最佳论文奖等奖项。 大模型冲击波 前哈Ma到那产品 佛大学计算机科学教授、谷歌工程主管 ttWelsh预测:生成式AI将在3年内终结编程,时候软件开发团队中只有两类人会保留,即 经理和代码评审人员 码农们的焦虑 说了这么多年程序员要被AI取代,狼终于来了 研究者们的焦虑 一大波SOTA纷纷被ChatGPT轻松超越很多研究课题似乎没必要做了 冷静思考 类比:20年前所研究的软件复用和软件产品线 通过代码复制粘贴和API调用广泛实现局部复用并不难,难的是通过需求和设计规划实现系统性的定制化产品开发(例如软件产品线所宣称的那样) 与之相似,利用ChatGPT在软件开发过程中广泛实现局部的智能化辅助支持 (例如代码片段生成和技术问答)并不困难,难点在于如何利用它们实现端到端、系统性的生成式开发 重温经典软件开发的根本性(Essence)困难和偶然性 FrederickP.Brooks.NoSilverBulletEssenceandAccidentsofSoftwareEngineering.Computer,Vol.20(4),April1987. (Accident)困难:根本性的困难在于对于构成抽象软件实体的复杂概念结构的构思 (主要是需求和设计),而产生这种抽象软件实体的编程语言表示只是偶然性的困难。 思考1:规模和复杂性会从人机两方面形成限制 •随着规模的增大,人脑可能已经无法掌控整个代码生成过程 •大模型本身对于 复杂系统开发过程的全局掌握能力可能有限,经常顾此失彼 •人工代码审核的 需要使得人的理解和判断力可能成为瓶颈 思考2:大模型缺少抽象思维能力同时精确性不足 •大模型善于基于平面化的上下文以及提示信息产生相关内容,但对于大范围的抽象设计决策可能缺少相应的掌握和应用能力 •大模型概率性的本质与软件功能逻辑的精确性之间存在冲突 关于大模型软件开发能力的几点思考 一点思考 详见CodeWisdom公众号(23年4月) 思考3:软件开发存在大量难以捕捉的“暗知识” 思考4:大模型对复杂系统的长期维护支持不足 •企业软件系统一般都有着很长的生存周期,其中的软件维护和演化过程中蕴含着很多软件工程问题和挑战 •大模型对于复杂软件系统需求、设计及实现的全局理解及相应的维护支持能力可能不足 •软件开发中的很多需求和设计知识并不存在明确的文字记载,它们可能存在于脑海中、白板上或讨论中 •此外,这类知识高度的抽象性甚至模糊性也使得大模型难以学习和应用这些知识 迈向更高层次智能化开发之路 几点认识 •软件设计是一道迈不过去的槛 •当前大模型在软件设计能力上还比较弱 •维护型任务是对大模型的一大考验 一些建议 •在数字化、知识化积累的基础上迈向更高层次的智能化开发 •建立面向软件维护的代码数字孪生及开发知识共享平台 •探索适合软件设计知识学习的大模型增强方法 几点认识和建议 详见CodeWisdom公众号(23年12月) 基于ChatGPT的生成式应用开发(专家实践) 分十次交互得到完整实现 ①创建游戏框架 ②使用GUI替换控制台 ③在GUI上显示一个L形方块 ④移动方块并且进行碰撞检测 ⑤旋转方块 ⑥落下方块并且创建一个新的方块 ⑦检测游戏结束 ⑧增加整行消除功能 ⑨加入所有类型的方块 ⑩增加计分能力 实践经验 •整个过程几乎没有人工参与编写代码,生成的代码绝大多数都是正确的 •看起来懂设计,不仅是简单堆砌代码实现功能,在恰当提示下代码质量一流 •从整个过程可以看到很好的由外而内,从宏观到微观的设计思想 •能较好地记住编程上下文,但是也会犯错 •具备自动化编写测试的能力,质量不比人类写的差 •由于俄罗斯方块是一个在通用领域很常见的问题,本文的测试不具备在专有业务领域的代表性,在专有业务领域是否可以达 到相同的水准需要更为仔细地评估 张刚.ChatGPT结对编程实录:提升生产力,还是被代替?https://mp.weixin.qq.com/s/sUMt9oyASUU0eO9jlCurEw 基于ChatGPT的生成式应用开发(新手实践) 新手(未开发过俄罗斯方块游戏的研究生)按照不同的思路尝试了三次 第1次试验:逐类实现 依赖ChatGPT进行分解,然后逐类实现,得到一个完全静止的面板,无法实现游戏功能 第2次试验:逐特性实现 按照自己的理解进行特性分解,实现了一个简易的俄罗斯方块游戏,功能简单且错误多 第3次:按专家思路 按照张刚的思路,取得了较好的效果 详见CodeWisdom公众号(24年3月) 学生总结:ChatGPT生成代码的能力是有目共睹的,但如何更好地使用ChatGPT,也紧密取决于使用者本身对于开发项目的理解和开发设计规划。在对项目有合理规划,并且对项目整体进行细粒度feature的拆解,甚至按照合理的顺序去逐步实现的情况下, ChatGPT能够发挥出更强的能力。 张刚反馈:演化才是本质。这个实验表明,逐层递进的演进式设计方案更容易得到结果,在俄罗斯方块这个规模的应用尤其明显。合理的演化路径,会提升达成目标的效率。 大模型加速软件开发人员的分化 遇到什么问题不懂或者代码不会写的时候随时求助大模型,所得到的代码偶尔直接能用或者稍加修改之后就可以使用 自动生成代码的比例已经能达到了80%-90%,如果努力去做 100%的代码自动生成 并不是不可能,只是这是个性价比的问题。 普通程序员超级个体 将大模型助手用于软件开发各个环节,按需获得代码推荐和开发知识,获得20%-30%左右的开发效率提升 掌握了很强的分析和设计能力的专家型开发者能够在大模型的帮助下成为以一当十的超级程序员和全栈工程师 大模型使得过去的职业技能中90%的价值变为0,但也会让剩下的10%的价值被放大1000倍(KentBeck) 更高层次智能化的生成式开发 目标:通过更好的工具环境(如IDE)降低超级个体的门槛,使得更多的开发人员能达到或接近超级个体的水平 现状:已有大量研究和实践探索通过模型微调、检索增强、提示工程、多Agent机制等手段探索接近真实项目开发要求的代码生成能力评测以及项目和代码库级别的代码生成技术等 两大挑战软件设计的鸿沟 软件维护的冰山 软件设计的鸿沟 逐步精化:软件开发是一个逐步精化的过程,从初识需求开始不断通过what/how转换逐步细化解决方案,直至得到最终的代码实现 结构化思维:以分解加抽象的基本思想为指导、以模块化设计为手段应对软件的复杂性并以及长期演化所需要的可扩展性/可维护性 只有良好的模块化设计才能确保开发人员能够理解所产生的代码并做好审核确认 只有良好的模块化设计才能确保演化过程中软件修改尽量局部化并控制其影响范围 软件设计还需要确保系统满足性能、可靠性等多方面的非功能性质量要求 那么大模型卓越的代码生成能力是否能让我们从需求出发、跳过设计直达软件开发的最终产物—代码呢?也许不行 大模型的软件设计能力 大模型到目前为止很大程度上还是一种黑盒的存在,我们无法准确知晓其各方面的实际能力,但是从多个方面的侧面揣摩看答案应该是“比较弱” 软件需求和设计中存在的大量难以捕捉的“暗知识”难以被学习 平面化的代码学习方式使大模型难以学习到抽象的软件设计知识 从当前实践探索看,大模型扮演的更多仍是原子任务编码的角色 探索适合软件设计知识学习的大模型增强方法:一种可能的解决途径是在折叠和层次化的软件开发数据上进行大模型训练或增强 软件维护的冰山 产品特性运行稳定性 软件维护阶段的成本占到整个软件开发成本的60%-70%甚至更多 市场占有率 故障定界定位 客户满意度 既有代码的维护面临问题定位难、影响面难以确定等方面的困难 即使是新代码也要考虑如何嵌入复杂的软 性能瓶颈诊断 件架构及代码上下文之中并考虑其影响 代码修改决策 架构看护 回归测试 挑战:如何在快速迭代、持续演化的软件开发过程中实现效率提升和可信保障 从数字化、知识化到高度的智能化开发 代码数据所提供的信息是平面化的(缺少软件抽象),仅反映最终结果(缺少决策过程),不足以支撑大模型获得更高层次上的软件智能化开发能力 软件开发的数字化积累 •数字化:软件开发制品及其开发过程的结构化和数字化描述 •例如,代码数字地图(过程间调用与控制流图等)、过程追溯(如缺陷/特 性-代码提交-测试)、软件成分与供应链依赖等 软件开发的知识化积累 •知识化:需求、设计、实现、测试和部署等方面知识积累和描述 •例如,领域通用组件库及其功能和特性描述、代码相关的设计决策及其原理解释、缺陷修复和特性开发等任务相关的原理讨论 一种可行思路是在软件开发的数字化和知识化积累的基础上,利用大模型强大的记忆、理解和关联能力加强智能化开发能力,实现效率提升和可信保障 大模型强大的知识利用能力可能会强化研发数字化和各类文档知识的价值 基于大模型的软件系统数字孪生 软件系统数字孪生 •复杂软件系统设计实现与部署运行方式的数字化抽象表示 •作用:特征定位、变更影响分析、风险预测、故障定位、问题诊断、架构看护等 复杂系统数字孪生 •真实世界复杂系统的数字化和可视化模型 •作用:运行监控与可视化分析、异常检测与问题定位、模拟仿真与优化决策 •例子:机场数字孪生、工厂数字孪生 MBSE:一切皆建模,代码自动生成 敏捷开发:代码胜过文档,迭代中完善 来源:https://cloud.tencent.com/developer/article/1866397 可能的折中:在现有开发模式和流程基础上加强数字化和知识化积累,利用大模型的记忆、理解和关联能力实现知识增强的代码数字孪生 总结与思考 •现状总结 普通开发者通过使用大模型获得局部效率提升,专家级开发者在大模型的加持下成为超级个体 迈向更高层次智能化开发水平的两大挑战:软件设计的鸿沟、软件维护的冰山 •发展方向 有希望的方向:在特定领域开发中实现大模型与特定领域语言(DSL)的结合 项目级软件生成式开发:软件开发知识的共享和利用、上下文知识的按需抽取和抽象、设计感知(开发框架与设计决策等)的软件代码生成 软件维护的智能化支持:利用大模型的记忆、理解和关联能力实现知识增强的代码数字孪生,让大模型的知识吸收与释放能力成为软件开发知识积累的新动能 THANKS 感谢大家观看