tabnine试用体验

tabnine 已经推出大半年了,网上资料很少,中文网站更是只限于翻译其广告大吹“AI辅助写代码神器”,也没有个正经使用报告。于是我写这篇文章分享一下实际使用的体验。

安装体验

从官网上的指南来看,tabnine 安装非常容易。我试了sublime和vim的配置,基本按照说明无痛安装,装好也不用配置,做到了开箱即用。只是vim的安装指南有些坑:tabnine的vim插件实际上是通过YCM改的,官方指南漏掉了需要运行YCM install.py 编译core的过程。

开箱即用的tabnine只有基于AI的补全功能,如果需要基于语义的补全功能,还需要安装第三方 language server。不同语言有不同的 language server,c++默认使用的是 cquery。在OS X下可以用homebrew一键安装。但到了一台老版本的cent os下就比较麻烦了,包管理器没有相关资源。

值得一提的是,在这台老版本的centos 上,tabnine 无法被执行。这是因为 tabnine 是闭源软件,软件包中提供的是二进制文件,兼容性比较差。好消息是这个问题只存在部分linux系统上,Windows/OS X 这类标准的系统没有问题。

使用体验

第一感觉:没广告中那么智能。广告 gif 中可以看到,tabnine可以识别if-else语义自动针对if中的yes不缺else中的no。甚至还可以识别函数头注释中的自然语言,为函数头定义代码给出建议。实际体验中,并没有感受到这种智能,可能这些功能是付费内容,也可能只针对特定语言。不过对比同样是开箱即用状态下的YCM,确实补全建议要有意义一些。我的YCM开启了基于语义的自动补全,在开箱即用的状态下,补全建议很多但相关性很差,摸不清它补全的逻辑。而同样开箱状态下的额tabnine,建议就精简但是有意义很多。当然这里的“有意义”不等于有用,只是能够感觉到tabnine是能感知到上下文的。总体来说,我的测试中,tabnine提供的建议相对更有帮助一些,但仅限于矮子里面拔将军,对于实际工程效率的提升可以说还是比较有限的,没有广告gif中用的飞起的感觉。注意,本测试是开箱即用的情况下,对c/c++所做的测试。

半年后更新体验:经过一段时间,发现tabnine确实如广告那样智能,它真的知道你在做什么!比如你在一个分支 print success 并 return true,然后写完 else 这个词后它真的会提示你 print failed 及 return false。另外它不仅学习你的代码,还有强大的 github 库作为支撑。有时候忘记 c++ 模板库的用法,大概写一个开头 tabnine 就会替你补完——不仅省了打字时间,还省了查小本本的时间。

云服务和隐私保护

reddit上对tabnine的隐私保护问题质疑比较多。tabnine 提供了云服务(截止本文写作时间,tabnine cloud 还处于公测版),需要把用户代码上传到它的云上进行加速解析。尽管作者把自己的云说的很值得信任(用了SSL啦、处理完就删除信息啦),但大家还是担心自己的代码会在过程中泄漏。实际上使用 tabnine 时完全可以不使用它的云服务。它的云主要是为了加速,提供更好的延迟体验。如果不使用云,这些处理将会在本地完成,比较消耗本地资源,但这个过程不需要联网(除了liscence 验证需要网络)。

价格

tabnine可以无限期免费体验,但索引的工程大小不能超过400K。同时作为一个商业软件,tabnine提供了49\$个人版、企业版99\$ 。收费版同样有工程大小的限制,目前是 100MB。收费版这个限制主要是因为索引超过100MB 的内容对内存的消耗非常大,延迟也会很高。纵观tabnine的历史,通过作者不断改进技术,相信收费版的这个限制会慢慢改善。

这个索引大小还有两点想分享。首先,这个索引大小是所有的源代码文件,不包含二进制文件。而且可以配置索引包含或不包含哪些目录,所以100MB估计可以cover大部分工程。另外值得一提的就是,这个限制不是一个硬性限制,而是类似一个滑动窗口的大小。比如我可以在一个超过400K的工程中使用免费版的400K的额度,只不过给我提示补全的建议是基于400K的代码数据,而不是整个工程的数据。这400K的窗口会随着编辑文件进行滑动,从而始终保证能够给出补全建议。

可能的使用场景

整个体验下来,感觉tabnine的补全提示还是不够智能,但是比较惊喜的是它能感知到上下文。我虽然不能用它通过注释的自然语言直接转换成可用的代码,但是它可以利用我输入的只言片语联想到源文件中出现过的代码片段。也就是说,tabnine很适合做一些模板感很强、重复性很强的代码编写,类似写 setter/getter以及写 HTTP 页面的感觉。对于一些没有明显重复模式、实验性很强的代码,比如编写算法、试探API,tabnine 可能就没什么用武之地了。