谷歌大脑教AI写代码

2019-09-10 07:22藏狐
科海故事博览·下旬刊 2019年1期
关键词:程序员代码工程师

藏狐

最近在京东、阿狸、380等互联网巨头掌门人的迷之助攻下,早已被“996”工作制度压得喘不过气的程序员们集体“造反”了。有技术人员在知名代码托管平台GitHub上发起了一个名为“996.ICU”的项目,以此抵制互联网公司的超时工作,并得到了大批程序员的响应(虽然并没有什么用)。

当然,并非只有大陆是程序员的“血汗工厂”。在硅谷,以互联网为中心的“奋斗神学”也常年盛行,朝九晚五的工作者却会被当成Loser看待,天使投资人Gary Vaynerchuk还出版了一系列推崇极端工作的畅销书,比如《Crush It!》,鼓励“逐梦互联网”的年轻开发者们每天工作18个小时。扎克伯格也曾告诉他的信徒们,创办公司就像加入海豹突击队一样。2018年,就有一位Uber工程师Joseph Thomas自杀,并在遗嘱中将此归咎于公司的高压文化、长时间工作和不堪重负的心理压力。

为什么996奋斗文化不再有程序员愿意买单?它们不曾经和“下一代科技富翁”一样是互联网的光环和标签吗?问题的症结或许在于,职业程序员(负责编辑代码的软件工程师)原本是一项智力活动,它的典型形象原本是那些在车库中改变世界的开发者。但随着互联网产业的极速膨胀,它已经逐渐在向体力劳动转移了。

对此,《黑客与画家》的作者保罗·格雷厄姆,做过一个非常好的概括——“……(你)只是一个负责实现领导意志的技术工人,职责就是根据规格说明书写出代码,其实与一个挖水沟的工人是一样的,从这头挖到那头,仅此而已,从事的都是机械性的工作。”显然,只能在程序开发流程里充当一种代码工具的程序员,久而久之就会面临非常残酷的境地,那就是在劳动力市场上变得毫无议价能力:公司让他做什么就得做什么,做不完就无止境地加班,不想做就只能离开。

而对于互联网企业来讲,当核心的技术员工被强制加班而日渐损耗,他们没有时间来思考“添加/删减这个功能有没有必要”“代码是否优美”“自己的技术理想”,企业的产品体验也很难得到创新与升级。当然,推行“996机制”的目的是“合法”逼迫程序员们,主动离职的除外。对于大部分不得不通过“996”来提高生产力的公司来说,这显然是一个劳资关系的“双输”局面。

理想的模式是怎样的?或许我们可以思考一个新的可能性:那就是将大量现在必须由人类程序员完成的机械工作交给AI,让员工从枯燥而漫长的“体力劳动”中解脱出来,去从事更有价值的“智力工作”,进行有效的创造。机器和人类相互配合,重新找回日趋达到边界的开发效率,这可能吗?至少谷歌大脑的最新研究成果正在试图抵达它。

让神经网络编写“源代码”

人类软件工程师到底过着什么样真实的日子呢?顶尖互联网公司的软件工程师挣得多,大概已经是共识了。被誉为程序员求职神器的招聘网站Triplebyte统计,硅谷的高级软件工程师年薪的底薪常常可以达到14万—17万美元,折合人民币约在92万—112万元。还不包括许多额外的期权、分红、福利等。在中国,高级工程师也可以轻轻松松进入一线城市的高收入群体。而“光鲜”背后的代价就是,几乎所有的程序员都在超时工作。一位Google的工程师从上午9点一直工作到半夜以后完全是常态。而得益于湾区的高房价,他们往往还需要花费3—4个小时的通勤时间在路上。

和工作时长一样威胁程序员健康的,还有可怕的工作压力。高速的工作节奏、严苛的项目截止日期,大量积压的工作任务,在处理对公司较为关键的事物时的焦虑,这些都是高薪光环背后独有的“阴影”。许多硅谷程序员们都因此而进入漫长的“职业倦怠”期(崩溃状态)。更为残酷的是,一旦他们的工作效率出现衰退,“性价比”就会显得极为“不划算”,并早早结束自己的职业生涯(你可以管这叫优化、裁员、996,whatever)。

既然大公司的程序员和流水线工人没什么区别(严格按照设计稿和需求用代码将产品一模一样地实现出来),那么用AI將他们从超负荷的工作量中解脱出来,就是极为必须且有价值的了。谷歌大脑最新放出的论文,就能够让神经网络来完成这项高价值的工作——源代码编辑。具体是怎么实现的呢?

想要让神经网络学会“编程”,首先要让它了解人类程序员是如何完成这一工作的。谷歌大脑的解决方案就围绕理解人类编写代码的过程(例如GitHub的commit)展开,并使用深度神经网络模拟了整个编辑过程。具体的过程是这样的,研究人员收集了来自数千Python开发者的数百万次细粒度的源代码,构建了一个大型编辑序列数据集,训练出了一个模型,试图让它学会“编程”。

效果显示,在给定编辑序列的情况下,模型能知道后面该怎样继续“写代码”。这就和语言模型一样,给定一小段话,模型就能接着用自然语言“编下去”。比如给出两个编辑序列(History A和History B)。经过两次编辑后,两个序列都有了相同的编码状态(State 2),但History A正在给foo函数添加一个额外的参数,History B正在从foo函数中移除第二个参数。通过对原始状态和编辑序列(Edits 1 & 2)的观察,研究人员发现,神经网络“预测代码”并知道后面怎么“编下去”,是完全可行的。

那么接下来的问题是,如何让机器将预测结果以合理而优雅的方式呈现出来呢?研究人员为“机器程序员”考虑了两种表征方式:显式表征和隐式表征。显式表征由一个两阶段的 LSTM 网络实现,第一阶段能够编码每一个状态序列,第二阶段会将前面已观察到的编辑序列解码出来,因此,实例化序列中每一次编辑的状态结果都会被 “照猫画虎”地将代码呈现出来。

而为了不让“AI程序员”的作品“反类犬”,还需要带入隐式表征,这就要求,采用的隐式模型不仅能够对隐式表征进行操作,还能更好地捕捉到编辑内容和编辑上下文之间的关系序列,进而更好地学习策略。

谷歌人员参考了Transformer的位置编码与Multi-head Attention(MHA),改造了一个强大的隐式注意力模型,编码器会将初始状态和所有已知编辑编码为隐藏向量,解码器会将其解码为每一个编辑的位置以及给定位置的编辑内容。结果显示,改造后的隐式模型——双向注意力模型,能够在真实数据中实现高准确率、精准置信度和较好的可扩展性。它与显式模型的协同工作几乎可以解决所有任务,甚至是那些涉及元字符和具有较长替换序列的任务,这使机器洞察人类工程师的编程意图、并在将来写出“神似人类”的代码成为可能。

简单来说这项研究的独特之处就在于,谷歌大脑用一个神经网络来学习优秀人类工程师的编程经验,不仅仅只是简单地把需求套进去得到一堆结构和功能相似的“静态”代码,而是去理解工程师的意图、决策等,并将其应用到自己的编码过程中去。显然,对于一线程序员和科技公司来说,这确实是个福音。因为他们总是需要去处理那些高度重复性、做不完的需求,而一个人的有效工作时间和精力总是有限的,机器的加入将直接降低程序员的工作量和疲劳感。但这并不是急着乐观的时候,就目前的研究现状来看,距离“AI程序员”上岗还有很长一段路要走。

程序员的“解放之路”很长

一个又一个地完成开发任务,显然是乏味的。做不完只能加班,从这个角度看,程序员(以及高级工程师)们的生活,和养鸡场的母鸡,并没有什么本质区别,反正每天都必须完成N个蛋的生产指标。

不幸的是,“下蛋”只能由母鸡完成,而“编程”这件事,目前也只能由人类来完成。原因也很简单,“AI程序员”还只存在于设想和研究阶段。

首先,机器编写代码的能力还远远不够,真实效果有待验证。代码其实是个“动词”,它代表一种“动态”过程,需要很强的泛化能力才能完成。优秀的开发者往往会根据新需求、新的网络环境、bug的修复、最新的运营活动、公司的战略意图等各种不断变化的因素来构建代码,某种程度上这也是区分普通程序员与牛逼程序员之间的重要标志。而让机器根据过去的代码序列来动态判断和预测即将发生的编辑内容,目前的性能完全不足以支撑实际应用。

另外,即使性能达到了,机器也只能完成相对简单的任务,也就是那些流水线上的机械工作。如果想要开发出比较复杂和创新性的产品,那么优秀的程序员以及高强度的工作还是不可避免的。更关键的是,机器开发的成本也并不低。比如在谷歌大脑的这篇研究中,显式模型的资源消耗就很大,而且随着数据量的增加,它的成本也在指数级提升。比如长度为100的插入序列比真实数据集中的序列小10倍,但在运行时方面已经存在一个数量级的差异。

换句话说,如果雇佣一个程序员就能搞定,企业为什么要花更多的钱和更高的风险去使用AI呢?也许现在思考这个问题还言之过早,但现实已经很明显,未来程序员想要获得工作机会,是否愿意996已经不是决定因素了,而是因为人比机器更便宜。由此,我们从谷歌向程序员这样的“高精尖”工种发起冲击的研究动作背后,似乎可以感受到一丝不同寻常的味道。

互联网公司到底怎么了

在这场 “反对996”的全球风波背后,重点或许不在于“996”是否合情合理合法,而是直面一个问题,互联网公司们到底都怎么了?我们来做一道简单论证题。已知:很长一段时间内,程序员的高工作强度是由“高薪水+高预期+技术理想”共同买单的;高薪水源自于互联网公司的高估值;高预期(股票、期权、分红、理想)等由互联网上市、融资等商业模式的完成来实现兑付。那么,在无法坐实估值的大资本环境下,互联网企业回归正常的估值空间,程序员的劳动“薪资”应该如何兑付?

过去10年互联网企业的奇迹般增长,都是在这样的“一夜实现创富梦”的故事下完成的。在普遍不盈利甚至找不到赚钱方式的,就能拿到大笔资金,以期“以小博大”。在行业繁荣之际,包括生产力核心的程序员们,都对于“奋斗文化”保持着一定程度的沉默,甚至默认这是合理的。

但现实是,互联网的产业链和商业规则已经大变样了。互联网企业的估值再也不是“赌博游戏”,而开始与传统实体拉平(效率优势不再),甚至由于长期的泡沫显得略有些贵了(高薪酬的低性价比)。在新的故事背景下, 随着企业IPO/融资而快速实现“财务自由”的神话开始变得遥遥无期,劳动者自然会强调现货兑付。这也是为什么,关于“996机制”的讨论总是围绕“有无加班费”展开。

有网友调侃,“996的工资构成是10%的人民币和90%的福气”。以前这叫“硅谷梦”,现在却显得有点搞笑。时代变了,一方面传统互联网企业“靠流量变现”的增长模式再也走不下去了,资本玩法已经到了穷途末路(主要是没钱了)。互联网企业想要生存下去,不能再靠便宜的价格(因为补贴不起),而是依靠创新,依靠健康的盈利模式,依靠低劳动力价格的成本优势。但是,一个极尽可能“压榨”程序员剩余价值的企业,一个员工无法有充足的时间思考、优化的工作环境,真的能诞生出创新产品吗?答案显然是否定的。

另一方面,无论员工或政府,都在“强迫”科技公司打消“以压榨换效率”的想法。新一代的员工希望能够开放自由地工作,而非像騾马一样常年忍受高强度的工作,以此换来的高薪酬被认为是不值得的。而不少政府也开始介入,英国就打算设立新的监管机构,来逐步结束科技公司的“自我监管”时代,保障高技术员工的权益。“人力成本空间”日渐缩小,将主意打到机器身上就非常地顺理成章、喜闻乐见了。

程序员的职业未来会怎样? 当然,有一部分“斯德哥尔摩”程序员可能会因此感到紧张。毕竟机器较之人类,在忍耐和生产效率上,是有过之而无不及。别说996了,只要舍得掏电费,这可是007(早0点到晚0点一周7天)模式都能干的“编程怪物”。

先别急着恐慌,担心以后连“996”的机会都没了,引入AI对于大部分程序员来说,更真实的场景可能是这样的:首先,大部分机械的工作都会在机器的帮助下更高效率地完成。互联网企业要通过越来越多的运营活动实现营收,程序员的任务也会越来越流程化,而AI可以比较高效地完成基础源代码开发,替代这部分机械劳动,缓解开发者的工作压力。

同时,软件工程师的职位重心开始向创造力和兴趣转移。过去的产业膨胀器,很多人选择从事变成工作只不过是为了一份高的薪水和光环,经过几个月的培训就能上岗,但对于钻研技术、产品创新毫无兴趣。未来,这种经过短期培训就能上手的低技能程序员岗位都会被机器替代,而高技能、高创造性的工程师的价值,则会史无前例地提高,自然也就不必每天在电脑前枯坐十几个小时。这样,程序员这个职业本身的“新陈代谢”也会减慢, 职业生命随之延长。

在很长一段时间内,快速的技术更新和高强度的工作压力,使得互联网企业更愿意招收那些年轻的开发者。但他们的职业生涯很快就会到达瓶颈,开发速度开始慢下来(尽管实务经验也在增长),但由于机械工作只会越来越多,就会被更年轻的劳动者所取代,进而被公司“优化”掉。

如果把那些损耗型、体力型的工作统统丢给机器去做,显然程序员们的价值就不再是产出代码的“生产工具”,考核标准也不再是能否忠实有效地完成了KPI,而是“自由意志”和创造思维的体现。从这个角度看,AI消融的是那些非创造性的工作壁垒,对于早已疲惫不堪的程序员群体来说,对技术的期待应该会远远大于被技术淘汰的恐惧。因为唯有如此,才能从胡萝卜加大棒的“骡子”命运中逃离出来,去追寻工作和生活的乐趣与价值。

用一句老话来说,工作也好,生活也好,让我们给岁月以文明,而不是给文明以岁月。

猜你喜欢
程序员代码工程师
为了让妈妈看懂地图,一位“野生程序员”做了个小程序
环保工程师:生来为了“拯救地球”
2020年程序员依然很吃香
我想做一名桥梁工程师
程序员之子
神秘的代码
一周机构净增(减)仓股前20名
重要股东二级市场增、减持明细
加班
近期连续上涨7天以上的股