“我认为过去几十年的黄金时代已经过去了,那种当一名程序员就能找到工作的日子已经过去了。编程现在更像是会读书能写字。你必须具备这样的能力。”硅谷技术布道者 Tim O'Reilly 如此评价软件行业的未来。
伟大的经济学家凯恩斯在 90 多年前曾预言:到 20 世纪末,人类将每周工作 15 个小时。但在 2021 年的今天,人们不仅没有实现每周工作 15 个小时,甚至有时候一天就要工作 15 个小时。
按照著名人类学家大卫·格雷伯(David Graeber)“垃圾工作(Bullshit Job)”理论,大多数的软件开发工作可能会被认为是“垃圾工作”。(垃圾工作指那些虽然纷纷涌现但并不一定都能为生活带来太大价值的工作。)
无论你是否同意格雷伯的说法,他确实提出了一个值得思考的观点:随着越来越多的流程自动化,大多数工作会在某个时间点过时。
据估计,目前的技术就可以将 45%的工作自动化。随着时间的推移,工作被完全自动化是非常有可能的。软件开发领域的技术更新很快,甚至当软件测试成为热门话题后,自动化工具便开始兴起,而这只是已经被自动化的众多领域之一,也就是所谓的“垃圾”的部分(迭代且耗时)。
那么,开发人员是否会被自己构建的自动化工具淘汰了呢?如果越来越多的机器可以自己编写代码,还需要人类做什么?
程序员的思维比逻辑更重要
软件开发人员的工作是构建逻辑链接、算法、程序、项目等,关键的是他们构建的是与逻辑相关的东西。随着人工智能的兴起,我们看到了范式的转变。开发人员不再设计逻辑链接,相反,他们基于这些逻辑链接训练模型。
很多开发人员已经从构建逻辑转变为建立思想。换句话说,越来越多的软件开发人员正在从事数据科学工作。
使用过 IDE 的人,肯定知道辅助软件开发可以达到怎样的惊人程度。一旦习惯了自动完成或语义代码搜索等功能,就很难离开它们了。这是软件开发自动化的第一层应用:当机器知道你要实现什么内容时,它们可以帮你完成整个过程。
第二层使用是封闭系统。比如一个社交 App 里包含很多不同但彼此相连的页面,但它仍是封闭的,因为它不能直接与其他服务发生通信。尽管开发此类 App 的技术越来越容易,但还不能说这是真正的自动化。到目前为止,如果要创建动态页面、使用变量、应用安全规则或集成数据库等,仍然需要写代码。
第三层应用是集成系统。银行的 API 就是这样的一个系统,因为它是为与其他服务通信而构建的。但目前,对 ATM 集成、通信、深度安全性和复杂的故障排除问题进行自动化几乎是不可能的。
自动化的三个应用层次。图片由作者提供,改编自 Emil Wallner 在 InfoQ 的演讲
人类做不到的很多事情,计算机做到了
人类不会认为自己会被机器人取代,这种想法同样适用于软件开发等领域。人们的理由很明确:创造力、同理心、协作或批判性思维等并不是计算机所擅长的。
通常,完成工作并不是最重要的。即使是最复杂的项目,也包含了很多可以被自动化的部分。 DeepMind 的科学家Richard S. Sutton表示:
研究人员试图利用已经掌握的领域知识,但从长远来看,唯一重要的东西是利用计算的能力。
当然,人类的潜力无疑是惊人的。例如,很长一段时间以来,研究人员认为机器永远无法识别出照片里的猫。但如今,一台机器可以一次性对数十亿张照片进行分类,并且比人类的准确性更高。虽然机器可能无法像人类一样赞叹可爱的小猫,但它在处理未定义的状态方面确实非常出色。通过机器眼睛看到的小猫照片的能力即处理未定义的状态。
除了处理未定义状态外,还有两件事情,计算机比人类做更有效率:一个是规模,另一个是研究新流形。
我们知道,计算机可以大规模地处理任务。比如,如果你要求计算机 print("I am a stupid") 200 次,它会毫无抱怨地照做,并在不到一秒的时间内完成任务。而一个人要需要几个小时才能完成。
流形是指一种通过数学的方式来指代、共享某些属性的空间子集。例如,纸是三维空间中的二维流形。如果你将纸张弄皱或将其折叠成纸飞机,它仍然是流形。
事实证明,计算机更擅长流形工作。计算机可以延伸到二十个维度或具有很多复杂的纽结和边缘,而这对人类来说很难。由于很多日常问题(例如人类语言或计算机代码)都可以表示成数学流形,因此在未来,计算机的这项功能有很大的潜力可以变成真正高效的产品。
我们正在研究第一和第二区域,但几乎没有触及第三区域。图片由作者提供,改编自 Emil Wallner 在 InfoQ 的演讲
自动化工具威胁程序员工作?
开发人员似乎已经在使用很多自动化程序,但我们只是处于软件自动化的舆论风口。迄今为止,自动化集成系统几乎是不可能的,但其他领域已经在自动化。
代码评审和调试可能很快会成为过去。DeepCode 公司正在开发一种可以自动识别错误的工具,谷歌的 DeepMind 已经可以为现有代码推荐更优的解决方案,Facebook 的 Aroma 可以自动完成小型程序。
此外,机器推断代码相似性系统(简称 MISIM)声称能够以与 Alexa 或 Siri 类似的方式(即理解人类语言)来理解计算机代码。令人兴奋的是,这样的系统可以帮助开发人员自动化完成常见且耗时的任务,例如将代码推送到云端或实现合规性流程。
目前为止,所有这些自动化在小型项目上都运作良好,但在较复杂的项目上却毫无用处。例如,错误识别软件仍会出现很多误报,并且如果项目的目标跟以前有所变化,自动完成功能就无法正常工作。
由于 MISIM 出现的时间并不长,因此大家对于这种自动化仍然缺乏关注。但这只是开始,这些工具有望在将来变得更加强大。
这些自动化的某些早期应用还包括跟踪人类活动。当然,这并不意味着它们是间谍软件。相反,我们可以通过这个方式做一些优化,比如安排员工的工作时间或为学生定制课程等。
这本身就提供了巨大的经济机会,因为学生可以更快地学习重要的东西,而工人可以在具有更高工作效率的时间里提供服务。
如果 MISIM 像它承诺的那么好,它也可以被用来重写遗留代码。例如,很多银行和政府软件都是用 COBOL 开发的,而如今很少人懂这门语言,如果将这些代码转换为新语言的代码就更容易维护。
所有这些新应用都令人感到兴奋。但这也是一把双刃剑:如果你输给了这些自动化技术会怎样?如果开发人员因为它们而被淘汰了怎么办?
研发人员应尽早参与项目
这虽然是自动化领域的两个流行词,但不管怎样,它们很重要。
如果在产品发布之前没有对软件进行测试,就可能会损害用户体验或者在发布过程中遇到安全问题。经验表明,自动化测试会覆盖测试人员想不到的情况。
越来越多的团队正在采用持续交付。当产品捆绑了大量的特性,即使只发布一个更新,比如每三个月发布一次,通常也要花上几个月的时间来修复在这个过程中出现的问题。这种工作方式不仅极大地阻碍了快速开发,还损害了用户体验。
现在有很多用于测试的自动化软件,还有用于持续交付的版本控制系统及框架。在大多数情况下,为这些自动化工具买单似乎比自己构建它们更好。毕竟,公司雇佣开发人员是用来构建新项目的,而不是执行乏味的自动化任务。
管理人员可以把自动化测试软件当作一种投资,尽可能为开发人员提供支持,让开发人员做他们真正擅长的事情。
通常,项目是由高层或与研发相近的团队创建的,然后一直向下级传递直至开发团队,开发团队的任务就是实现这个项目。
但是,并非每个项目经理都是经验丰富的软件工程师,因此开发团队可能可以实现项目的某些部分,其他部分则可能成本很高或几乎不可能实现。
这种方法在过去可能是可行的,但随着软件开发中枯燥乏味的部分被自动化,开发人员有了越来越多的机会去做一些更有创造力的事情。
这是一个让开发人员有机会尽早参与项目计划阶段的绝佳机会。他们不仅知道哪些东西可以实现、哪些东西实现不了,同时凭借他们的创造力,还可能以无法想象的先验方式为公司带来价值。
五年前,微软首席执行官 Satya Nadella 曾宣称,“所有业务都将变成软件业务”。他是对的,不仅要让开发人员升级,软件的优先级也应该被提升。
疫情让我们更清楚的知道,大部分生活和价值创造都发生在网络上。软件为王,软件的自动化程度越高,这一点就越明显。
摆脱对未知的恐惧
很久之前,不夸张地说,喜欢电脑的人被认为是不合群的孩子、书呆子、极客、不讨人喜欢的生物,以及缺乏人类感情和激情的、像僵尸一样的生物。然而随着时间的推移,越来越多的人看到了开发者的另一面。程序员现在被视为能够开发出很酷产品的聪明人。
软件的自动化程度越高,开发人员的能力就越大。从这个意义上说,由于自动化而导致开发人员失去工作的担忧是没有根据的。
十年后,甚至几个月后,开发人员可能在做一些我们现在无法想象的事情,但这并不意味着开发人员的工作消失了。相反,开发者的工作升级了。
程序员真正需要克服的恐惧不是可能会失去工作,而是摆脱对未知的恐惧。
开发者们,你们不会被时代抛弃,也不会成为敲代码的机器。相反,你们将成为领导者。