论文部分内容阅读
最近在京东、阿狸、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