丰富的线上&线下活动,深入探索云世界
做任务,得社区积分和周边
最真实的开发者用云体验
让每位学生受益于普惠算力
让创作激发创新
资深技术专家手把手带教
遇见技术追梦人
技术交流,直击现场
海量开发者使用工具、手册,免费下载
极速、全面、稳定、安全的开源镜像
开发手册、白皮书、案例集等实战精华
为开发者定制的Chrome浏览器插件
AI代码助手(AICodingAssistant)是一种利用人工智能帮助开发人员更快、更准确地编写代码的软件工具。它可以通过根据提示生成代码或在你实时编写代码时建议自动完成代码来实现此目的。以下是AI代码助手可以做的一些事情:
作为一名技术沉浸者,对于这种能够帮助提升开发效率的助手,是喜闻乐见的。
在实际的开发实践工作中,比较了很多的AI编程助手,几乎都体验过了。
以下是曾体验过的列表:
对于IDE的支持上,所有的AI助手,目前都能够做到基本流行的工具流畅支持,在开发语言的适配上,大家也能够大同小异。
对于我个人来讲,更多的比较是助手的实际提效能力、成本代价、影响、是否易用等等一些重要因素。
从成本代价方面看,收费、免费,是影响个人开发者是否能够持续使用的很大的因素。
从提效能力看,对于我个人来讲,其实更多的使用的是代码补全、代码纠错、代码生成、单元测试生成功能,现在有了更多让我惊喜的功能,比如异常处理、API文档查询、各种自由对话查询能力。这些方面去看,就看工具本身的功能的多寡、优劣性。
在长期的实践后,目前安装了几款智能编码辅助助手,Aixcoder、BitoAI,还有刚开放没多久的助手,我们将要全面开测的工具,通义灵码。
BitoAI,拥有前边讲的AI代码助手能干的事情的众多功能。个人版免费。相对来讲功能比较强大、全面,比较其他的产品来讲,最重要的是不卡,比如Codeium,能卡顿到死,太难受了。
通义灵码,一发布,我就感受到了惊喜,国产产品,相当棒的体验,现在是我的主力使用。下面全面开测,一一来说明通义灵码带来的惊喜吧!!
通义灵码,经过海量优秀开源代码数据训练,可根据当前代码文件及跨文件的上下文,为你生成行级/函数级代码、单元测试、代码注释等。沉浸式编码心流,秒级生成速度,让开发人员更专注在技术设计,高质高效地完成编码工作。基于海量研发文档、产品文档、通用研发知识、阿里云的云服务文档和SDK/OpenAPI文档等进行问答训练,为开发人员答疑解惑,助开发人员轻松解决研发问题。支持Java、Python、Go、JavaScript、TypeScript、C/C++等主流语言,同时兼容VisualStudioCode、JetBrainsIDEs等主流编程工具,提供高效、流畅、舒心的智能编码体验。
官方说明产品功能如下:
帮你写:行级/函数级代码生成和续写,根据上下文自动预测和生成建议代码
帮你写:单元测试生成,根据JUnit、Mockito、SpringTest等框架自动生成单元测试
帮你写:描述生成代码,自然语言描述你想要的功能,自动生成代码及注释
帮你写:代码注释生成,一键为你生成方法注释及行间注释
帮你读:代码解释,帮你理解Java、Python、Go、C/C++、TS/JS等30多种主流编程语言
帮你解:一键开启调试问题智能排查,自动查找解决方案
下面,我将从下述维度展开来进行全面测试:
相信通过我的全方位测评,用户能够对通义灵码智能编码辅助助手有足够强的了解了。
体验通义灵码在视觉交互、快捷键操作与原生IDE的融合情况
本次原生IDE工具,采用常见的开发IDE工具:IntelijIDEA、Goland、VisualStudioCode来进行融合测试
版本是截止文档编写日期2023/11/17,为最新版本
安装跟其他IDE插件一样方式,直接在市场内搜索即可
因为我已经安装完毕,因此上边不再是安装按钮。
不愧是国产的优秀插件,中英文详细的功能介绍,以及非常明细的功能动图展示,真的非常认真。
通义灵码,安装后首先会建立文件的索引,之后在每一个方法的上部生成一个小小的图标。如下图所示包含:解释代码、生成单元测试、生成代码注释,快捷功能入口
当然也可以在代码内,选中后使用快捷指令,后续在功能使用维度测评中,详细展示。
上图,展示了通义灵码安装后,我们可以在IDE的功能区找到相应的配置。
搜索功能非常实用,能够查询各种API
同样的,在IDE工具设置页面,其他设置内,仍有通义灵码自定义配置。
配置项分为代码补全设置、辅助功能两类
代码补全设置,包括开启本地模型服务(默认没有开启),可以设置补全长度的方式以及候选项条数;云端大模型对于自动触发补全长度、手动触发补全长度的设置
辅助功能,包含文档默认打开方式配置、异常信息辅助解决配置、方法级快捷操作配置(上边图示,方法上的图标即是该功能)
通义灵码与IDE融合,非常优雅的方式,完成所有的功能的灵活配置。
在插件安装后,存在异常,但不影响正常使用。可能IDE版本过新,是EAP版本,适配程度没有那么高。还是希望能够有更多的力量投入进来,版本迭代。如果开源,个人踊跃报名参与进来。
新增回话,会完全重置会话,且无任何引导性提示,这块不大友好,希望能改进一下
同样的IDE版本,为文档编写时最新版本
在VSCode里边,同样直接可以在插件市场搜索:通义灵码,快速安装。
与IDEA中,相比,功能基本一致,搜索功能没有,配置与IDE紧密贴合方式实现,实现比较优雅的集成
问题同样是新会话的重置,比较突兀
在Goland插件市场中直接搜索安装即可,与其他的IDE安装方式一样,简单、优雅。
整体的配置也大同小异,不再赘述。
目前应该没有配置快捷键的地方,需要进一步优化吧。毕竟很大程度会与一些快捷键冲突。
对于通义灵码整体的交互,目前看,中规中矩。跟目前所有的助手的设计是一样的。
当然,相对来讲,通义灵码的快捷键、图标设计、页面设计满足国人的使用爱好。
本次功能使用场景,尽量全方位的开测。细数当前比较流行的开发语言,分别选择Java、Golang、Python作为待测语言(相对来说比较综合、流行,前端技术栈我就不测试了,相信有很多小伙伴已经测试前端情况了)来进行全方位的测评展示。包括:代码智能生成、研发领域问答、灵码独有的阿里专属的文档能力
实际Java开发中,对于后端接口的开发,首先从Controller层开始。
本次测试项目为公司内部生产实际项目,其中组件,使用了knife4j(集成swagger)作为接口文档平台
通义灵码助手,能够读取上下文,快速建议代码续写,也非常符合实际开发中代码情况,也是正确的。
实际手写代码如下图所示:
司内的开发规范是上图写法,但,通义灵码的续写,采用了Api注解源码的默认使用写法,与实际多少还有点偏差,这块可能有优化的可能性。
进到类内,继续进行代码编写
一般不会在实际开发中,对Controller中添加main方法。上文已经添加了@Api注解,同时类名也是Controller后缀,如果能够更加匹配实际可能预测代码就更好了,目前其他的助手在这方面差不多效果。这块可以说是一个很大提升的优化点。
整体服务端接口响应对象为统一封装的对象,Result
此时对于方法的预测比较恰到好处,但是不够完全,还需要进一步的修改,这样的预测,代码生成效果不大,可能有很大的进步空间
简单写了一个测试的方法,在其中使用注释,续写预测代码,差强人意
基本上来说,续写代码的能力,能够实现一定的功能,但是可以有更大的进步空间,希望阿里云官方能不断优化
与Java类似,Golang在Web开发中,同样差不多的框架套路。
本次,测试项目同样为生产在用项目,用的是Gin作为框架。
首先,路由添加,
快速预测代码生成,相对来讲起码写的符合实际的场景
采用实际的一个方法内,进行测试,代码预测,语法是正确的,但是e.ERROR_NOT_FOUND,是没有上下文的,这块有点异常
Golang语言在代码续写部分,能力差不太多
python代码同样可以续写预测
发现一个共同问题,那就是选择其他预测选项,使用快捷键Alt+,没啥反应
如下图所示,同样在类内,添加一个私有方法,代码成功快速响应预测。但是实际效果,不是很理想
换一下常规的算法描述,看看自然语言代码生成预测效果
效果还是可以的,比较理想的效果
如上图所示,代码预测存在一定的偏离
相对来讲,Java的代码,个人感觉是相对更贴合实际
服务实现方法代码:
单元测试生成代码如下:
支持使用Mockito库、SpringTest库生成单元测试
存在问题
使用生产项目里的一个方法进行单元测试生成测试
原方法如下:
funcAssertQuantityStatistics(ctx*gin.Context){data,err:=pm_center.AssertQuantityStatistics()iferr!=nil{gogin.SendErrResp(ctx,err,"")return}res:=new(response.PmCenterAlmAssertQuantityResp)res.Result=datagogin.SendData(ctx,res)}生成单元测试代码如下:
//TestAssertQuantityStatisticsteststheAssertQuantityStatisticsfunctionfuncTestAssertQuantityStatistics(t*testing.T){//Testcase1quantity1:=5expected1:=trueresult1:=AssertQuantityStatistics(quantity1,expected1)ifresult1!=expected1{t.Errorf("AssertQuantityStatisticsfailedforquantity1,expected:%v,got:%v",expected1,result1)}//Testcase2quantity2:=-3expected2:=falseresult2:=AssertQuantityStatistics(quantity2,expected2)ifresult2!=expected2{t.Errorf("AssertQuantityStatisticsfailedforquantity2,expected:%v,got:%v",expected2,result2)}//Testcase3quantity3:=10expected3:=trueresult3:=AssertQuantityStatistics(quantity3,expected3)ifresult3!=expected3{t.Errorf("AssertQuantityStatisticsfailedforquantity3,expected:%v,got:%v",expected3,result3)}}如果对当前生成结果不满意,可以重新生成
同时也会对生成代码作出简单地解释
相对于Java、Golang来说,Python的单元测试生成是比较粗糙的。
后期可以有很大的优化空间
方法注释生成
原方法代码如下:
@ApiOperation("需求详情分页方法")@PostMapping("/test")publicResult
/***查询电力需求分页结果**@paramdto电力查询分页DTO,包含查询条件和分页信息*@return电力需求分页结果,包含查询到的电力需求详情列表和分页信息*/publicResult
属性字段注释生成
原代码如下:
privateLongprojectId;代码注释生成代码如下:
//私有的Long类型项目IDprivateLongprojectId;单行注释生成
returnpowerProjectApi.queryPowerRequirementPage(dto);生成注释如下图所示:
支持多种形式的注释生成,支持中文、英文、更详细、更精简
更详细的注释,看上述明显存在问题
func(m*AlmProjectsModel)AssertQuantityStatistics()(*po_pm_center.PmAssertQuantityPo,error){sql:=fmt.Sprintf(sqlAssertQuantityStatistics)vardatapo_pm_center.PmAssertQuantityPoerr:=db.Pool.Get(&data,sql)iferr!=nil{log.Error("AssertQuantityStatisticsfailed:",sql,err)returnnil,err}return&data,nil}代码注释生成代码如下:
//AssertQuantityStatistics断言数量统计func(m*AlmProjectsModel)AssertQuantityStatistics()(*po_pm_center.PmAssertQuantityPo,error){//代码功能实现}原代码如下:
err:=db.Pool.Select(&data,sql)代码注释生成代码如下:
err:=db.Pool.Select(&data,sql)//从数据库中选择数据到data变量中Python原代码如下:
代码行解释
BaseDataDictionaryEntitydicUser=baseDataDictionaryService.getOne(Wrappers.
中文精简
这个Java函数使用了lambda表达式,调用baseDataDictionaryService的getOne方法,查询类型为ProjectEditorEnum.EDITOR.getKey()且代码为userCode的BaseDataDictionaryEntity对象,并将结果赋值给dicUser变量。中文详细
这个Java函数使用了lambda表达式,调用baseDataDictionaryService的getOne方法,查询类型为ProjectEditorEnum.EDITOR.getKey()且代码为userCode的BaseDataDictionaryEntity对象,并将结果赋值给dicUser变量。lambdaQuery()方法返回一个CriteriaBuilder对象,通过调用eq方法来设置查询条件,eq方法使用给定的字段和值作为参数,返回一个CriteriaQuery对象。最后,getOne方法使用CriteriaQuery对象作为参数,返回符合条件的第一个BaseDataDictionaryEntity对象。英文
ThisJavafunctionuseslambdaexpressiontocallthegetOnemethodofbaseDataDictionaryService,queryingtheBaseDataDictionaryEntityobjectwithtypeasProjectEditorEnum.EDITOR.getKey()andcodeasuserCode,andassignstheresulttothedicUservariable.ThelambdaQuerymethodreturnsaCriteriaBuilderobject,andtheeqmethodiscalledontheCriteriaBuilderobjecttosetthequerycondition,withthespecifiedfieldandvalueasparameters.TheCriteriaQueryobjectisreturned.Finally,thegetOnemethodiscalledusingtheCriteriaQueryobjectasaparameter,andreturnsthefirstBaseDataDictionaryEntityobjectthatmeetsthecondition对于复杂的代码,是有很好的辅助功能
方法代码解释
方法原代码:
该函数用于验证用户是否对项目具有权限。首先根据项目ID获取项目信息,如果项目为空,则返回false。然后判断用户代码是否为项目负责人、业务负责人或注册人,如果是,则返回true。接下来,获取项目团队用户列表,判断用户的角色是否在指定的角色列表中,并且用户的代码是否与列表中的用户代码相同,如果是,则返回true。如果项目没有父级ID或者项目层级为1,则返回false。最后,如果用户没有权限且项目有父级ID,则递归调用该函数进行权限验证。对于代码方法简要的描述,还是比较精准、易懂
方法名代码解释
同样采用上边的测试方法
代码解释如下:
这个Java函数是一个私有函数,它接受一个Long类型的projectId和一个String类型的userCode作为参数。函数的返回类型是boolean。它用于查找某个用户是否对指定的项目有权限如果想要简单地明白方法的目的,生成的内容还是有用的。但是相对来讲是简单地,上下文结合的差了点
func(m*AlmProjectsModel)AssertQuantityStatistics()(*po_pm_center.PmAssertQuantityPo,error){sql:=fmt.Sprintf(sqlAssertQuantityStatistics)vardatapo_pm_center.PmAssertQuantityPoerr:=db.Pool.Get(&data,sql)iferr!=nil{log.Error("AssertQuantityStatisticsfailed:",sql,err)returnnil,err}return&data,nil}Golang的代码相对Java来讲,对于可读性来讲,是不同的。
代码精简解释如下:
这个go函数是一个方法,它从数据库中获取特定的SQL查询结果,并将其赋值给一个结构体变量。如果获取数据失败,函数会返回错误。如果成功,函数将返回结构体指针和nil。代码详细解释如下:
这个go函数是一个方法,它被一个名为"AlmProjectsModel"的结构体定义时作为一个成员函数定义。此函数的目的是对某个特定的数据库查询进行断言,以确保数据库中的某些统计数据的正确性。函数内部首先使用fmt.Sprintf函数将一个带有占位符的SQL查询字符串转换为具体的查询语句。然后,使用一个名为"data"的变量来存储查询结果。如果存储数据时出现错误,函数会记录错误并返回nil和错误信息。如果存储成功,函数将返回"data"的指针和nil。英文解释如下:
ThegivenGofunctionisamethodofthe"AlmProjectsModel"struct.Itspurposeistoperformanassertiononaspecificdatabasequeryinordertoensurethecorrectnessofsomestatisticaldatainthedatabase.Insidethefunction,itfirstuses"fmt.Sprintf"toconvertaSQLquerystringwithplaceholdersintoanactualquery.Then,itusesavariable"data"tostorethequeryresults.Ifanerroroccurswhilestoringthedata,thefunctionlogstheerrorandreturnsnilandtheerrorinformation.Ifthestorageissuccessful,itreturnsthepointertothe"data"andnil.其他代码解释
除了方法代码解释、代码行代码解释,尝试了整个文件的解释,结果报错了,在IDEA中是没有报错的
响应:
调用异常:code=503,request_id=440c2503-24b6-42a9-9c03-8d144a356a50Python方法代码解释
Thefunctionisusedtodeterminewhethertheflashsaletaskcanstillrun.Itfirstgetsthebuy_timebycallingthebuytime_get()function,andthenreadsthecontinue_timefromtheconfigurationfile,whichrepresentstheallowedrunningtime.Next,itcalculatesthestop_time,whichistheallowedendingtimefortherunningtask.Ifthecurrenttimeisgreaterthanthestop_time,itsetstherunning_flagtoFalseandlogsamessagetoindicatethatthetaskhasended,meaningthattheflashsaletaskcannolongercontinue.中规中矩的解释,还是不错的
其他代码解释
调用异常:code=503,request_id=b2479168-36c9-4747-b211-3e52696d11d3异常报错智能排查Java简单异常测试
0为除数,虽然直接写,大家都不会出现这个问题。但是逻辑复杂之后,有可能会出现这个异常
publicstaticvoidmain(String[]args){inti=1;intj=0;System.out.println(i/j);}运行结果如下:
点击Lingma图标,展示结果:
稍复杂的调用异常
publicstaticvoidmain(String[]args){inti=1;intj=0;//System.out.println(i/j);print(null);}privatestaticvoidprint(FileVOfile){System.out.println(file.getFileName());}运行结果如下:
结果区显示为:
简单异常
packagemainfuncmain(){a:=1b:=0println(a/b)}运行结果显示如下:
在golang语言使用中,通义灵码的异常反馈是没有的
if__name__=='__main__':a=1b=0a/b运行结果显示如下:
可见python在通义灵码助手实践中,是没有侵入功能的
希望官方应该尽量明确功能支持点
对于一些随机的一些问题咨询,是有不错的响应的
咨询Java语言问题
技术问题
不管是代码编写还是技术咨询,都能够快速响应,还是不错的
在Golang的实际问答中,响应快速,真的比较惊喜
对于问答响应同样非常迅速,代码内容也相对来讲,可用。但是,对于包的导入,是在代码里有缺失的
搜索问答区,对于阿里官方的一些SDK支持,比较完善
经过功能使用维度体验、产品设计维度体验,我们基本上从各种情况下体验了实际的助手功能。
内容生成维度测评,从生成长度、生成正确性、生成代码优良率、补全智能程度、上下文感知能力方面总结情况
已经用了太久的代码助手辅助开发,那份效率的提升,是必然的。现在使用效率提升上,更是大大的加强。
对于代码生成这块,可能相对来讲通义灵码感觉准确率差点。通义灵码,在智能问答、单元测试生成、代码解释,起到了非常大的帮助。
现在仍然在安装的软件有三款,在前文已经描述了。Aixcoder、Bito、通义灵码,评价五星满分
下表总结了我的综合对于通义灵码的暂时评估结果(1:非常不满意,2:不满意,3:中立,4:满意,5:非常满意)。
通义灵码是一款功能强大、设计优秀、交互友好、内容高质、效率提升的智能编码辅助工具。它能够帮助开发者在不同的场景和用例下,提高编码的效率和质量,激发编码的创意,解决编码的难题。它还能够支持阿里云的资源SDK/OpenAPI和帮助文档,为阿里云的开发者提供更好的服务。我对这款产品非常满意,也期待它的进一步改进和完善。