
在写这篇文章前,看到一条消息,即阿里巴巴集团董事会主席兼首席执行官张勇(逍遥子)发布全员信《唯有自我变革,才能开创未来》,启动新一轮公司治理变革。而这是24年来最重要的一次组织变革,阿里集团成立了云智能集团,而且是董事会主席兼CEO张勇兼任云智能集团CEO,说明云智能集团的重要性,也显示阿里要在大语言模型(LLM)上发力。
在之前,华为公司走在前面,本公众号也有几次报道(如 函数级代码生成模型PanGu-Coder、智能编程助手CodeArts Snap等),咱们国人的希望可能要寄托在华为的身上。我也了解到腾讯内部、几家大银行和头部券商等软件研发团队也都在抓紧调研chatGPT在软件研发中的应用场景等,以及 上周GitHub 宣布推出 Copilot X 计划。
这一切都切切实实预示着:软件工程3.0 的到来。
在写完《GPT-4 开启 “软件工程3.0” 全新时代》这篇文章之后的一周内,我进一步加强调研和实验,也认真研究了微软研究院的、长达154页的论文 Sparks of Artificial General Intelligence: Early experiments with GPT-4,更感受到GPT-4蕴藏的神奇力量,即具有一定的推理、规划、问题解决、抽象思考、理解复杂性、快速学习、通过经验学习等能力,而且这种能力具有良好的普遍性,跨越了广泛的领域(包括抽象、理解、视觉、编码、数学、医学、法律、对人类动机和情感的理解),而且在广泛的任务中,其表现达到或超过了人类水平。所以,今天连开发GPT-4的OpenAI团队都说,他们都无法估量GPT-4的能力,因为它具有涌现能力,即涌现出一些连设计人员当初都没有想象到的能力,所以给了我们足够的想象空间,更何况还有全球的人在帮它,帮它如何做得更好。
回到主题,一年前我写了一篇文章《直击灵魂:软件研发的第一性原理与10倍效能》,其实这里的10倍只是代名词,如文章所指出 “用好了第一性原理出发,就能达到 “10倍效能”,其实不一定能达到10倍效能,“10倍效能”只是一个代名词(思维方式),是指高效能,可能是2倍、3倍......” ,对能否达到10倍是不确定的,但进入“软件工程3.0”,如果我们用好了GPT-4一类的大语言模型(LLM),确实能达到10倍效能,甚至是几十倍的效能。
为什么此时信心十足呢?因为前面说的GPT-4的神奇力量,可以成为我们的得力助手,帮助我们大力提升软件研发效能。
1. 需求定义。通过使用ChatGPT的自然语言处理功能,产品经理可以轻松理解和解释客户的需求和要求,包括用户画像。

2. 软件设计。GPT-4可以帮助我们设计、细化产品的功能、UI设计等,我们还可以借助GPT-4 API和可视化工具集成(如MidJourney等),可以创建交互式和沉浸式虚拟现实环境,使我们在现实环境中测试和探索不同的设计想法,为软件产品设计产生新的和创新的设计想法,详见:Sparks of Artificial General Intelligence: Early experiments with GPT-4。
3. 编程工作。我们可以从一个想法开始,循循善诱,引导GPT-4生成代码、优化代码、生成相应的测试代码,最终完成一个软件开发,能让软件跑起来,详见:编程实录:我只是提要求,ChatGPT写代码,这就完成了游戏开发。GPT-4 可以处理广泛的编码任务,从编码挑战到真实世界的应用程序,从低级汇编到高级框架,从简单的数据结构到复杂的程序(如游戏等)。在代码自动生成上,LLM的能力已经很强了。
GitHub Copilot可以解释自然语言提示,如注释和方法名称,并将其转化为众多编程语言的编码建议。但Copilot X 聊天超越了代码建议,深度嵌入IDE中,分析代码、错误信息,并提供代码块用途的详细解释,生成单元测试,并建议错误修复。开发人员还可以访问由OpenAI的GPT-4提供的GitHub拉动请求的AI生成描述的技术预览,GitHub Copilot会根据代码变化自动填充描述,可以提醒开发者在拉动请求中测试覆盖率不足。
GPT-4 可以推理代码的执行、模拟指令的效果,并用自然语言解释结果;因为GPT-4可以理解代码,从而能执行伪代码,进行代码的验证。而且GPT-4 能够通过对人类反馈和编译器/终端错误的响应来改进其代码。

4. 测试工作。基于细化的功能,chatGPT可以帮助逐步生成测试用例、用不同的设计方法完善测试用例,详见:又一次被震惊:从生成和细化需求到应用各种方法设计测试用例。测试上还有更多应用,可以开展TDD(以前程序员不乐意写测试),现在却能轻松完成,而且还有更多应用场景:chatGPT在软件测试中七大应用方式。
让我们更为惊奇的事,GPT-4 会使用工具、做渗透测试。在不给 few-shot 示例的情况下,GPT-4自行决定工具的使用,而且研究者测试了使用 GPT-4 黑掉本地网络上的一台计算机的任务,在没有任何信息的情况下,它能够制定并执行一个计划,在这个计划中,它扫描网络中的设备,识别目标主机,运行一个尝试普通密码的可执行文件,并获得对机器的根访问权。
5. 沟通和协调。Copilot X计划将“为文档查询提供人工智能生成的答案”功能扩展到任何组织的存储库和内部文档,允许开发人员通过类似ChatGPT的界面询问有关文档、成语代码或专有软件的问题,并立即得到答复、提供个性化的回应,这一切都将极大提升团队的沟通和协调效能。
6. 借助有技巧的对话,可以突破GPT-4的一些限制。GPT-4主要限制之一是该体系结构不允许「内部对话」或「临时记录」,这超出其内部表征,使它不能够执行多步计算或存储中间结果。但我们可以通过使用不同的提示来弥补这种限制。例如微软研究院举了一个例子,通过更改提示,来让他通过中间推理生成答案,这类似于利用 CoT 的思路来帮助模型进行内隐的思考。

Stop,我不能说得太多了,我要留一点想象空间给你,甚至要留几个问题给你思考:
GPT-4 这类多模态语言模型会给软件研发带来怎样的影响?
它会重新定义软件开发的新范式吗?
会影响程序人员的职业发展吗?
如果你想了解更多细节、想得到上面问题的答案,就来K+talk。

HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候
Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功
如果names为nil,则以下中断。我怎样才能让这个map只有在它不是nil时才执行?self.topics=names.split(",").mapdo|n|Topic.where(name:n.strip).first_or_create!end 最佳答案 其他几个选项:选项1(在其上执行map时检查split的结果):names_list=names.try(:split,",")self.topics=names_list.mapdo|n|Topic.where(name:n.strip).first_or_create!e
我刚刚安装了带有RVM的Ruby2.2.0,并尝试使用它得到了这个:$rvmuse2.2.0--defaultUsing/Users/brandon/.rvm/gems/ruby-2.2.0dyld:Librarynotloaded:/usr/local/lib/libgmp.10.dylibReferencedfrom:/Users/brandon/.rvm/rubies/ruby-2.2.0/bin/rubyReason:Incompatiblelibraryversion:rubyrequiresversion13.0.0orlater,butlibgmp.10.dylibpro
我正在运行Ubuntu11.10并像这样安装Ruby1.9:$sudoapt-getinstallruby1.9rubygems一切都运行良好,但ri似乎有空文档。ri告诉我文档是空的,我必须安装它们。我执行此操作是因为我读到它会有所帮助:$rdoc--all--ri现在,当我尝试打开任何文档时:$riArrayNothingknownaboutArray我搜索的其他所有内容都是一样的。 最佳答案 这个呢?apt-getinstallri1.8编辑或者试试这个:(非rvm)geminstallrdocrdoc-datardoc-da
什么是测试格式验证的最佳方法让我们说一个用户名,使用字母数字的正则表达式,但不是纯数字?我一直在我的模型中使用以下验证validates:username,:format=>{:with=>/^[a-z0-9]+[-a-z0-9]*[a-z0-9]+$/i}数字用户名(例如“342”)通过了验证,这是我不想要的。 最佳答案 您想“向前看”一封信:/\A(?=.*[a-z])[a-z\d]+\Z/i 关于ruby-on-rails-Rails格式验证——字母数字,但不是纯数字,我们在Sta
我已经通过提供MagickWand.h的路径尝试了一切,我安装了命令工具。谁能帮帮我?$geminstallrmagick-v2.13.1Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingrmagick:ERROR:Failedtobuildgemnativeextension./Users/ghazanfarali/.rvm/rubies/ruby-1.8.7-p357/bin/rubyextconf.rbcheckingforRubyversion>=1.8.5...yescheckingfor/
我要下载http://foobar.com/song.mp3作为song.mp3,而不是让Chrome在其native中打开它浏览器中的播放器。我怎样才能做到这一点? 最佳答案 您只需要确保发送这些header:Content-Disposition:attachment;filename=song.mp3;Content-Type:application/octet-streamContent-Transfer-Encoding:binarysend_file方法为您完成:get'/:file'do|file|file=File.
我发现ruby加载路径是一个数组,很多项目都是这样使用的:$:.unshift(File.expand_path("../../lib",__FILE__))可以将本地文件添加到ruby路径数组的前面,方便我们require或者load。所以,我希望知道为什么我们不使用push将文件添加到数组的末尾? 最佳答案 假设您有一个“date.rb”文件(为什么不呢)并且您想要加载这个文件,而不是标准库日期。如果您使用追加,当您调用require'date'时您的文件将永远不会被加载,因为它位于数组的末尾并且标准日期会在之前找到。因此,如果
我正在使用macos,我想使用ruby驱动程序连接到sqlserver。我想使用tiny_tds,但它给出了缺少free_tds的错误,但它已经安装了。怎么能过这个?~brewinstallfreetdsWarning:freetds-0.91.112alreadyinstalled~sudogeminstalltiny_tdsBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtiny_tds:ERROR:Failedtobuildgemnativeextension.完整日志如下:/System