网安加·百家讲坛 | 刘寅:人工智能(AI)是解决软件工程问题的“银子弹”吗?

作者简介:刘寅,东南大学电子工程系本、硕,南京大学EMBA,PMP,前科大讯飞技术副总经理,曾就职于中兴通讯、摩托罗拉、趋势科技、初速度等国内、国际名企,多次负责过质量体系从0到1的搭建,DevSecOps工具链的建设及在公司内的大规模落地,日活用户超千人,践行软件质量与效能改进的体系化、线上化、自动化、数据驱动化。

自上个世纪60年代软件危机(Software Crisis)起,软件从业人员和软件用户日益意识到由于软件和软件开发维护的复杂性必将导致软件中充斥各种问题(bug),且难以发现和解决。这也常常导致软件研发的投资达不到预期的收益而失败。

在经典著作《人月神话》中,Frederick P. Brooks回顾了软件从业者为了彻底解决这一顽疾而进行的各种尝试,不幸的是,这些努力都未竟全功。在此书出版后的三十多年后,Brooks仍在反复检视业界各种新的尝试,但仍不得不哀叹“并没有一招毙敌的银子弹啊!”

时间来到21世纪20年代,OpenAI为代表的生成式人工智能崭露头角,软件工程师们惊喜或惊讶地发现,这些GPT不仅可以和你聊天胡扯,也可以根据自然语言生成代码或测试用例。

那AI有没有可能成为解决软件工程各种问题的最终解决方案呢?

人工智能现在能帮助我们做什么软件工作?

日益强大的AI现在已经能在很多编码、测试工作中帮助软件工程师,例如:

集成于IDE的代码生成(copilot):在软件代码编写时,工程师常常被分配的工作是重复性的,即在公司里已经有别的同事写过类似的代码片段了。

Copilot就像个不知疲倦的伙伴,会运用机器学习技术,根据你写的代码的上下文,自动帮助你补足甚至是生成代码。而且,更贴心的是,这些生成的代码是没有语法错误的。这大大提升了工程师编写代码的效率。

代码质量检测:在代码编写完成时,软件工程师需要自检代码的质量。之前,我们用到的类似Sonar、Coverity之类的工具是基于规则的判断,误判和漏判的概率都不低。结合机器学习的理解能力,代码静态扫描工具可以更有效地发现代码中的缺陷、漏洞和“坏味”。如果使用得当,这会大大缓解测试的压力。

自动化测试:AI已经可以根据软件需求和软件代码的理解,自动生成测试用例并执行,常见工具有Selenium和TestNG,这使得测试工程师可以更频繁、更全面地测试软件,从而提升交付软件的质量。

团队协作:运用自然语言理解技术,AI可以读懂代码,并生成相应的文档、演示材料。这无论是对工程师间的协作沟通,还是对新加入员工的培训,以及离职人员的交接都有巨大的益处。

这个列表还在持续延长,一时间,有人惊呼,AI可以按需生成软件(他们把软件简单等同于可运行的代码,这是一个常识性谬误)了,软件的所有麻烦明天就将消散了。

所以,万事大吉了吗?

以商用软件交付为例,一个典型的、忽略了商务活动的软件项目过程大致如下:

需要说明的是,这里虽然用线性的方式表述了这个过程,但在实际项目里,这些环节或步骤常常是迭代往复且有所交叠的。

软件编码和测试只是工作的一小部分。每一位有经验的项目经理或产品经理都知道,写代码和让代码在实验室的环境里跑起来,只是整个项目工作的一小部分。

有统计称,这部分在大部分项目的工作量中占比不超过40%。所以,如果AI只能在写代码、测试代码这些事上发挥作用,那么显然不能称之为“银子弹”。

软件需求收集与分析的重要性未降低。各大AI公司都有不同的演示,口齿伶俐的产品经理在一块白板前边说边画,AI便快速地生成了代码,然后部署在生产环境上,于是用户就可以使用了。

但大多数人忽视了一点,即能把软件系统要干什么描述清楚,这其实不在大多数软件用户的能力范围内,更不用说准确描述软件的系统边界以及在特殊情况下的行为模式了。

在软件工程中有一句名言:Garbage in, garbage out! 这句话在AI时代仍不过时。

做过商用软件需求调研的软件人一定有过这样的痛苦经历,收到的需求是模糊的、不完整的、甚至是自相矛盾的。这倒也不一定是客户代表在故意刁难,而是很可能在实际业务场景下,各个部门用户的诉求就是这样的。这也常常导致,没有业务流程重组,甚至是组织变革,直接上软件系统很有可能导致软件达不到设计的目的。

软件的本质复杂性日益提升。几乎所有的商用软件既不是从零写起的孤立系统,既需要在之前版本上升级,也需要与其它已存在的软件系统协同工作。

所以,软件工程师需要花很多时间去了解、理解现有的软件系统,然后才能谨小慎微地实现自己的那个需求,类似于“在已有的迷宫里去增加一个小迷宫”。AI在这样复杂的环境里构建软件的能力仍需验证。

AI生产代码的一致性疑问。AI时代之前,软件研发本质上还是“大规模的手工业”,团队与团队之间,甚至是团队内部在解决类似问题时可能采用非常不同的技术思路与方案。

在书法作品里,同一个”之“字,书法家喜欢写成不同的形式以展示其艺术性。但这种个性化在软件工程里却是一个灾难。

虽然,古早的软件管理者希望通过技术标准和技术规范等方式来约束,不得不承认,软件一致性仍然一直是巨大的挑战。其征兆就是一个错误可能在不同的代码片段里用不同的方式展现出来,外在表现形式也千奇百怪。特别是,经过一段时间后,软件的可维护性必然持续降低。AI生成代码仍有某种不可预测性,所以软件一致性问题并未得到缓解。

对软件未来使用的预测仍不可知。一个好的架构师在做架构设计时都会面向当前的使用场景,且适度地考虑未来的可扩展性,但这本质上是一个基于各种考虑因素的综合妥协。即使是一流的架构师,仍不能规避短视或过度灵活的误判,一年后,甚至半年后拍大腿的场景屡见不鲜。目前看,AI在这方面也不太可能提供可靠的帮助。

同样,这个列表目前也挺长的。所以,目前AI还远不能称之为“包治百病的灵丹妙药“。

那么,我们能期待AI在哪些领域进一步提升呢?

AI应可以帮助收集与分析需求。拥有自然语言理解能力的AI不仅应可以不厌其烦地从不同层级的用户处收集需求,还应可以从大量的文档记录中了解竞品的情况、当前在用软件的问题、甚至是当前业务流的各种场景、例外情况、以及协同机制。从而,构建与持续维护软件需求的全景图。让软件工程师和客户代表既能观之全貌,也能快速了解细节,”构建从3万英尺到12英寸不同高度的视角。“ 进而彻底消除软件需求层面由于误解导致的质量问题,规避冲突的需求,减少无效需求。

AI应提升在复杂业务环境里修改软件并保持一致性的能力。简单地实现一个排序,或者用户消息处理这样的需求是容易的。

但要保持与业务环境里其它系统或本系统其它部分的一致性就不那么容易,例如,在排序问题中,对相同条目应该如何处理?要不要去重?在响应用户消息时,如何处理异常输入?这既要求AI能全局性地理解本系统的代码和周边相关系统的边界、行为,还要有能力控制使其代码输出的一致性,彻底规避其”一本正经地胡说八道“的情况。

AI应提升软件验收的能力。简单地根据需求文档和代码去设计测试用例和生成测试代码与数据是手工时代的无奈妥协。

我们期待AI还可以从客户业务流程记录、过往系统使用日志与维护日志、相关联系统的交互消息等更全面的信息出发,总结提炼出更全面的软件验收测试方案,并设计出相应的测试用例、数据与测试代码。

如果能进一步做市场与客户分析,对软件未来的使用场景进行合理的预测,进而进行相应的测试那将更有帮助。

AI应能帮助用户更好的使用软件。尽管软件项目团队通常会在软件试运行和正式上线前给目标用户做培训,也会准备相关的用户使用手册。但比较常见的是,系统上线后,服务支持人员还是要疲于奔命,回答用户的各种各样、稀奇古怪的问题。

站在用户的角度,新的软件系统就是令人费解,让人充满挫折感。即使一个本来应该很简单的财务报销系统,普通用户就是不知道该如何填写,导致每每被财务人员无情地打回。

具备自然语言理解能力的AI理所当然地被期望成为软件用户的私人助理,帮助用户正确使用软件、解决用户问题、提升用户满意度。

结语

”AI来了,软件工程师要全员下岗了。“ 这个事短期看还不会发生,因为软件工程面临问题的复杂性、可变性、难以预测性等特点还是没有改变的,还是需要受过专业训练的工程师持续努力。

但仅从写代码这个工作讲,其难度门槛已经在持续降低了,事实上这在AI时代之前,也是在降低的。

所以,正面地看,AI在重塑软件工程,软件工程师将不得不持续拥抱AI。被AI武装的软件工程师将更高效、更有全局观、更有客户视角,从而能更敏捷地构建与维护软件,满足客户持续且多变的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/150828.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【研赛A题成品论文】24华为杯数学建模研赛A题成品论文+可运行代码丨免费分享

2024华为杯研究生数学建模竞赛A题精品成品论文已出! A题 风电场有功功率优化分配 一、问题分析 A题是一道工程建模与优化类问题,其目的是根据题目所给的附件数据资料分析风机主轴及塔架疲劳损伤程度,以及建立优化模型求解最优有功功率分配…

「JVS更新日志」智能BI、低代码、逻辑引擎9.25功能更新说明

项目介绍 JVS是企业级数字化服务构建的基础脚手架,主要解决企业信息化项目交付难、实施效率低、开发成本高的问题,采用微服务配置化的方式,提供了 低代码数据分析物联网的核心能力产品,并构建了协同办公、企业常用的管理工具等&am…

【C++掌中宝】用最少的话让你全方位理解内联函数

文章目录 引言1. 什么是内联函数2. 工作原理3. 内联函数的编程风格4. 使用限制5. 内联函数与宏的比较6. 优缺点7. 何时使用内联函数8. 补充9. 总结结语 引言 在C编程中,函数的调用开销是程序运行效率的一个重要影响因素。为了解决频繁调用函数时的性能问题&#xf…

人工智能助力阿尔茨海默症治疗:微软与上海精神卫生中心的新研究

最近,微软研究院与上海市精神卫生中心合作,基于微软 Azure OpenAI 服务中的多模态大模型,开发了一种名为“忆我”(ReMe)的个性化认知训练框架。这一创新项目旨在通过数字化手段扩展自动化认知训练的范围,为…

如何瞬间建造一个百亿商品的网上商城?借助API,无需逐个上传商品数据,自动对接电商平台百亿商品数据

在快速发展的电商时代,构建一个拥有百亿级商品数据的网上商城曾是许多企业遥不可及的梦想。然而,随着技术的不断进步,特别是电商平台API接口的广泛应用,这一梦想正逐渐变为现实。本文将详细介绍如何通过调用电商平台API接口&#…

用AI绘画年入百万?揭秘高效起始号与现变路径...

part.1 AI绘画的优势 AI绘画的魅力在于其高效和灵活 无论你是通过Midjourney还是Stable Diffusion,只需输入简单的提示词,再加上一些额外的控制调整,AI绘画就能快速生成各种创意内容。角色IP设计、游戏原画、3D场景甚至是天马行空的创意都…

扫雷老年版2.0无猜模式

扫雷老年版2.0无猜模式 打破记录5秒,到达4秒。

Skywalking告警配置

背景 skywalking 9.7.0,地址:Backend setup | Apache SkyWalking helm:skywalking-helm:4.5.0,地址:skywalking-helm/chart/skywalking/values.yaml at v4.5.0 首先来说一下为什么使用skywalking告警? …

Java转换流

转换流 是字符流和字节流之间的桥梁 转换输出流:OutputSteamWriter 转换输入流:InputStreamReader InputStreamReader输入流 package myio;import java.io.*;public class inputsteamread {public static void main(String[] args) throws IOException {InputStreamReader…

基于SSM的家政服务网站【附源码】

基于SSM的家政服务网站(源码L文说明文档) 目录 4 系统设计 4.1 系统概述 4.2 系统结构 4.3. 数据库设计 4.3.1 数据库实体 4.3.2 数据库设计表 4.4 数据表 第5章 系统详细设计 5.1管理员功能模块 5.2用户功能模块 5.3前…

利用低代码快速搭建电商小程序之商品列表页

目标: 搭建商城的一个商品列表页面(先做静态页) 开发环境: 访问白码低代码平台:https://www.bnocode.com/ 白码的新自定义页功能(使用vue框架) 前期准备: 需要先准备商品数据表…

LeaferJS 动画、状态、过渡、游戏框架

LeaferJS 现阶段依然专注于绘图、交互和图形编辑场景。我们引入游戏场景,只是希望让 LeaferJS 被更多有需要的人看到,以充分发挥它的价值 LeaferJS 为你带来了全新的游戏、动画、状态和过渡功能,助你实现那些年少时的游戏梦想。我们引入了丰富…

读论文《OmniGen: Unified Image Generation》

OmniGen演示了在单一框架内执行各种图像生成任务的能力。此外,它还具有推理能力和语境学习能力。 论文地址:2409.11340v1 (arxiv.org) 项目地址:GitHub - VectorSpaceLab/OmniGen 项目目前还不完整,论文展现的通用性十分强大&am…

【云安全】云原生安全攻防

一、云原生安全 1、云原生介绍 云原生指构建和运行应用以充分利用通过云交付模式交付的分布式计算。云原生应用旨在充分利用云平台特有的可扩展性、弹性和灵活性优势。根据云原生计算基金会 (CNCF)的定义,云原生技术可帮助企业在公有云、私有云和混合云上构建和运行…

认知杂谈82《跳出信息茧房,持续精进》

内容摘要: 互联网时代,信息丰富,但便捷性削弱了我们的好奇心。互联网是双刃剑,快速获取知识的同时,也让我们陷入“信息茧房”,限制视野。 好奇心减少,部分原因是互联网的“懒惰效应”&#xff0…

ProcessOn为什么导出有水印!!!(利用SVG转PNG)

processon-svg2png ProcessOn 一个非常好用的思维导图网站,但是为什么导出有水印!!!。 功能 支持按钮拖拽支持将流程图svg 转成 png下载支持修改自定义文字下载svg(开发中) 安装/使用方法 安装并使用…

亚马逊跨境电商测评补单系统防关联全攻略

在跨境电商领域,尤其是亚马逊、速卖通等平台上,测评补单已成为提升产品曝光度和销量的重要手段。然而,但多账号操作带来的关联风险始终是卖家们需要面对的一大问题。为了维护平台的公平秩序,这些各电商平台实施了严格的用户管理制…

Mysql梳理10——使用SQL99实现7中JOIN操作

10 使用SQL99实现7中JOIN操作 10.1 使用SQL99实现7中JOIN操作 本案例的数据库文件分享: 通过百度网盘分享的文件:atguigudb.sql 链接:https://pan.baidu.com/s/1iEAJIl0ne3Y07kHd8diMag?pwd2233 提取码:2233 # 正中图 SEL…

线性跟踪微分器TD详细测试(Simulink 算法框图+CODESYS ST+博途SCL完整源代码)

1、ADRC线性跟踪微分器 ADRC线性跟踪微分器(ST+SCL语言)_adrc算法在博途编程中scl语言-CSDN博客文章浏览阅读784次。本文介绍了ADRC线性跟踪微分器的算法和源代码,包括在SMART PLC和H5U平台上的实现。文章提供了ST和SCL语言的详细代码,并讨论了跟踪微分器在自动控制中的作用…

【C++掌中宝】C++ 中的空指针救世主——nullptr

文章目录 1. 什么是 NULL?2. NULL 在 C 和 C 中的区别3. C11 引入 nullptr 的原因4. nullptr 与 NULL 的区别5. nullptr 的应用场景6. 模拟 nullptr 的实现7. 总结结语 1. 什么是 NULL? 在 C 和 C 编程中,NULL 常用于表示空指针,…