草庐IT

GPT时代的程序员生存之道

wangyuanzju 2024-04-27 原文

GPT出来后,关于AI将终结编程,代替程序员的言论就不断出现,如哈佛大学计算机教授、Google工程总监Matt Welsh宣称AI三年内将终结编程,类似的文章还有ChatGPT Will Replace Programmers Within 10 Years、GPT-4 程序员毁灭路线图ChatGPT能取代多少程序员?等,其中虽然有一些深度讨论,但更多的是口水战,也缺乏发展建议。

我做过约十年的一线编程,又做了近二十年的研发管理,希望基于这两方面的经验和视角对这个话题做一些更切实的讨论,尤其是希望能为程序员群体提供一些应对策略。

01

GPT对程序员工作内容的影响

首先我们要比较全面地了解GPT对程序员工作内容的影响。

一方面,我觉得应该对GPT的编程能力有很大的敬畏。我们可以看到很多GPT让完全不懂编程的人也能快速做出一些应用的案例,如爬取和处理数据、小游戏、浏览器插件等,甚至20,000行代码的CRM软件。我们还可以看到,借助GPT原本做某个技术栈的程序员可以很方便地跨界到另一个技术领域,比如后端工程师开发安卓上的计算器应用。我还在一个群里看到有个原来没做过游戏,完全不懂Unity的人不到一周时间做了一个非常类似羊了个羊的游戏。以往这样的切换至少得花一两天去学习才能写下第一行代码,然后接下来一两周也基本做不了啥。但现在在GPT的帮助下,程序员切换到另一个技术栈基本上可以马上开干,边干边学。

另一方面,我们也应该认识到程序员并不是像外行想象的那样只是埋头写代码,更多的时间是要去了解、理解和分析需求,程序员之间也需要交流和协作,如定义接口、数据结构、任务时间表,还需要一起完成测试,分析和修bug。所以程序员更多的时间是花在沟通和协作上。

有些人看到完全没有编程经验的人也能编程,就惊呼程序员很快就会被AI取代,又有很多人因为编程只占程序员工作的一小部分,就认为GPT对程序员的职业几乎没有任何影响。

这两种观点都是不对的。

02

GPT不会导致程序员群体的消亡

技术进步导致一个职业消亡的案例当然是有不少。大学时我选修过电影赏析课,记得有一次课上我们观赏一部描绘众多女士竞相应聘打字员职位的电影(顺便说一下, 我不记得电影的名字了,通过ChatGPT和Bing没有找到, 最后还是通过Google找到的:《罗马十一时》)。影片中,她们因为争夺这个岗位而发生激烈冲突,最终导致楼梯因超负荷而坍塌, 很多人受伤,其中还有一个不治身亡。由此可见,在几十年前打字员曾经是一个非常令人羡慕的职业。然而如今,我们再也找不到打字员了,唯一仍留存的一点点高端打字员,也就是速记员。但这几年,速记员也消失了吧。

但我认为,GPT并不会让程序员这个职业消亡,甚至程序员的数量还会进一步增加,这有两方面原因:

首先,编程只是程序员工作的一小部分,程序员是比较综合的职业。虽然就编程而言GPT可能带来5倍甚至10倍的效率提升,但人与人之间的沟通、协作和交流方面GPT能够提供的帮助并不十分显著。综合来看,GPT可能会提升程序员一两倍的工作效率,但基本不可能会出现有了GPT的帮助之后一个程序员抵现在十个的局面。

其次,软件研发的需求还会继续增长。各行各业的数字化都在加速,现在很多场景并没有软件可用,许多软件的体验和质量并不理想(典型的如政府应用和企业内部应用),需要翻新。与此同时,根据我在ChatGPT让现在的软件都土掉渣了一文所做的分析,大量的软件都需要重造。

所以我们可以看到技术会带来一两倍的效率提升,同时也可以看到大量新的软件研发需求,综合这两个因素,社会对程序员群体的数量需求很可能不会下降,甚至还会继续增加。

03

程序员个体并不安全

但这并不意味着现有的程序员的岗位都是安全的,与此相反,风险很大。

程序员的人力成本很高,而企业永远有降低成本的动力。大家可以看到去年以来无论中美即便最头部的企业很多也开始大规模裁员(大家可以看看财报中的研发费用占比就知道为什么要裁员了),中小企业则因为成本高做不起软件项目。

现在,GPT这种看似无所不能的新技术提供了降低成本的新的可能性。比如现在大多数程序员都是按照所掌握的技术栈来划分的,如Web端、服务端、iOS、安卓、算法开发和数据开发等,导致一个不大的软件都需要几个人,既然GPT让切换技术栈变得如此简单,那为什么不让一个程序员把全栈都做了?再比如既然GPT让不懂编程经验的人都可以编程,那为什么不招一些更低成本的人力稍加培训来代替现有的资深程序员?

何况现在大量的毕业生需要就业。中国现在每年1000万毕业生涌入劳动力市场,程序员又是一个相对高薪和体面的工作,肯定很多人是想干的。之前觉得至少还需要先花上几千块钱上个几个月的培训班,现在有了GPT,何妨自己试试?我们现在还没看到很多这样的群体,是因为集成GPT的IDE工具还很不成熟,一旦成熟,对程序员群体的冲击将会很快地到来。我们知道这个事情是因为现在就有不少人来学习我们的低代码,我们低代码要拿到证书需要一个月还有人来,GPT这种马上就上手的谁敢说不会更多?

刚说到的低代码也是另一个冲击。以我们的经验,高职非计算机专业的学生超过80%都能在一个月之内顺利上岗。他们的薪资远比现在的专业程序员低,一样能做开发,对很多典型应用来说开发效率还更高,那企业为什么不换一批低代码程序员来干呢。其实现在很多长尾应用已经用无代码来做了,后续能满足复杂应用开发需求的低代码技术也会快速成熟。

这几个因素叠加,还能说现有程序员的岗位还安全吗。

04

转型全栈或低代码是基础

现在一个程序员从一个技术领域开始他的职业生涯,先作为初级开发工程师,然后晋升到高级、资深和开发专家,但通常不会轻易切换技术领域。

形成现在这种按技术栈划分的程序员岗位模式主要有以下两个方面的原因:

一是进行技术领域的切换有很大的学习成本。在公司内,一到两周的培训和学习时间和两三个月的效能爬坡已经足以阻止这样的切换发生。程序员个体方面,一两千块钱的课程费足以让绝大多数人失去跨界的兴趣(我们做教育的当然知道)。这是供给侧的原因。

二是大规模软件开发需要分工,如后端以服务的形式提供共享能力,供多个前端调用和复用。即使一个程序员能做全栈开发,也会因为任务分工而仅被安排在前端或后端。这是需求侧的原因。

但从上个世纪走过来的程序员都应该非常清楚地知道软件开发过去并不是这样的。上个世纪的C/S架构下一般都是由一个程序员完成用户界面、数据处理和处理逻辑这三方面的工作,也就是当时软件开发所有的工作。这个世纪最初几年做Web也还是很多一个人做完全栈的。

所以,程序员按技术栈分工还是全栈, 都曾经大规模地出现过,未来会如何发展,取决于需求和学习成本。

先说需求,当前软件开发需求主要集中在互联网、金融以及数字化程度最高的大型企业等领域(包括为他们服务的外包公司),但这些企业对程序员的需求从近两年的情况来看已经开始下降,至少是没有太大的增长空间。增长更多地来自于大量传统行业的数字化转型,这些行业的需求很多都不算复杂,这些领域对全栈程序员的需求就会更迫切。

学习成本方面,正如之前的例子所示,借助GPT,现在从一个技术领域切换到另一个技术领域的中断时间接近于零。虽然在切换到另一个技术领域的前期,与那个领域的熟练程序员相比,效率和质量还是会存在一定差异,但一个人能够负责全栈工作所带来的成本降低也是非常显著的。

还要考虑低代码开发的因素,低代码平台天然就具备全栈开发能力,低代码程序员天然就是全栈程序员。

综合来看,我们大概率可以预测,在典型的应用开发领域,现有按技术领域划分的程序员岗位模式将会有很大比例转向全栈程序员模式。现有的程序员应该积极地跨界学习,争取早日成为具备全栈开发能力的程序员(包括低代码程序员)。

05

全栈非终点

但转型全栈并不是对程序员群体最大和最后的冲击。大家可能会想,原来我有十个程序员,前端两个、iOS两个、安卓两个、服务端四个,现在这十个程序员都变成了全栈程序员,可能因为效率有所提升,所以只需要八个,但大多数人的工作还保得住。甚至还会乐观地去想,因为现在每个人都能做全栈,比之前只能做单一技术栈时的待遇应该会好一些。

如果这么想的话,我觉得大概率又是错的。较早转型成为全栈程序员的人应该会享有一段红利期,但从长远看全栈并非终点。

这是因为技术的发展马上会极大地降低程序员职业的入门门槛,一个GPT,一个低代码,GPT和低代码还会迅速结合在一起,在微软PowerApps平台上我们已经看到了这样的结合,其他低代码平台(如OutSystems和我们的)也会很快实现类似的结合。

大家不要听有些专家说的低代码没什么新东西,GPT也不是什么技术革命。我们不用去关心底层是不是有什么技术革命,我们只需要观察有没有出现学习和使用体验和以前差别很大的开发工具,低代码和GPT绝对符合这个标准。

简单地做个计算就可以大致看到AI对程序员的影响。假设现在一位优秀程序员的工作40%是编程,60%是其他,假设这位程序员编程的效率是那种培训班或高职院校培养的初级程序员的10倍(确实会有这么多),其他工作的效率是2倍,那么综合来说是5.2倍(0.6 * 2 + 0.4 * 10),所以优秀程序员可以拿到初级程序员5倍的薪酬。有了对话式AI编程,这位优秀的程序员的工作中编程的部分会降到20%,其他工作会增加到80%。假设优秀程序员的编程效率仍然远高于初级程序员,但很可能不会有10倍这么多了,假设会降到3倍,其他工作的效率仍然是2倍,那么综合来讲优秀程序员和初级程序员的效率差异就变成只有2.2倍了(0.8 * 2 + 0.2 * 3)。

打个比方。现在的编程是手工劳动,专家和初级之间的差异就如同精英选手和普通人比赛跑马拉松,绝对是数倍的差异(普通人甚至需要两天才能走完),后续的编程会变成半自动的劳动,就如同骑自行车,这时精英选手和普通人之间还是会有差异,但没有长跑这么大了。

现有程序员群体总体来说能够享受较高的薪酬,并不是因为创造了巨大的商业价值(反之,研发始终是成本中心),而是由供需关系和技术门槛决定的,而这两方面的因素都在快速发生变化,程序员群体的整体就业状况也会随之发生巨大变化,只掌握单一技术栈的程序员当然最危险,全栈也不是就能高枕无忧。

06

转型为复合型人才是出路

那现有的程序员何去何从,当然是有去处的,而且因为现有程序员群体很多拥有很好的教育背景和基础素质,能力强,当然还是会有很多机会,但需要进一步拓展新技能。

第一步是之前说的转型为全栈程序员,这不但可以增加更多职场机会,更大的价值在于可以更好地理解业务。后端程序员转型全栈可以更好地培养交互、需求和用户体验方面的经验,而前端程序员转型全栈可以更好地培养对业务核心流程、领域设计等方面的经验。

但全栈程序员并非终点,还需要以软件开发能力为基础,往管理、架构、业务、营销、技术型产品等方向发展,成为复合型高端人才。

往管理和架构发展是最典型的想法,但这两条路提供的机会并不多,管理大概只有10-15%的机会,架构的机会就更少了,大概只有5-10%,而且研发的管理和架构职能还经常重叠,所以这两条路加起来不会超过20%的机会。

最主要的路径是往业务发展,成为既能做业务分析和产品设计,又能做开发工作的人才,成为绝大多数不算特别复杂的软件项目的骨干。各行各业的数字化对这类软件项目的需求会是最普遍的,市场上有行业和业务经验的业务分析师(BA)远比程序员稀缺。从典型项目的人员配比看,这个途径应该可以提供30-40%的机会。

2B行业的程序员也可以往营销端发展。程序员最了解自己的产品和技术,所以往往能成为很好的售前和解决方案架构师,在华为这样的转型非常普遍。但很多程序员比较排斥转营销,不愿意好好学习怎么做营销,不知道怎么面向非技术背景的客户人员沟通,这样的心态需要改变。这条路也可以提供15-20%的机会。

此外,云计算、大数据、中间件等技术型产品的研发很可能还是需要最优秀的程序员才能做的很好。也愿意花很大的成本招最优秀的程序员,如果一定想一直做程序员的话也得要找这样的雇主。

07

小结

总结一下,虽然GPT技术大概率不会导致程序员群体的消亡和萎缩,但仍会对现有程序员的岗位带来巨大冲击。现有的程序员首先应该发展为开发能力全面的全栈程序员(包括低代码),并继续拓展编程之外的能力,往业务、营销、管理、架构、技术型产品等方向发展。其中往业务发展,成为既懂业务又能做研发的复合型人才很可能是最主要的发展途径。

将来只是做开发的纯程序员大部分都会以初级为主,要往高级职位发展,很可能都需要拓展程序员之外的技能,纯程序员可能会变成薪资待遇很普通的职业。将来也很可能出现一种情况是大量的人都有软件开发能力,但不以此为生。

这就是我关于GPT对程序员职业影响的分析,虽然面对GPT这样突破性的新技术,预测它的影响非常难,但还是希望更多的程序员能够看到,因为程序员们真的是要好好想想了。

有关GPT时代的程序员生存之道的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  3. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  4. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  5. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  6. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  7. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  8. ruby - 检查是否通过 require 执行或导入了 Ruby 程序 - 2

    如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby​​文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否

  9. ruby-on-rails - 如何在 Gem 中获取 Rails 应用程序的根目录 - 2

    是否可以在应用程序中包含的gem代码中知道应用程序的Rails文件系统根目录?这是gem来源的示例:moduleMyGemdefself.included(base)putsRails.root#returnnilendendActionController::Base.send:include,MyGem谢谢,抱歉我的英语不好 最佳答案 我发现解决类似问题的解决方案是使用railtie初始化程序包含我的模块。所以,在你的/lib/mygem/railtie.rbmoduleMyGemclassRailtie使用此代码,您的模块将在

  10. 程序员如何提高代码能力? - 2

    前言作为一名程序员,自己的本质工作就是做程序开发,那么程序开发的时候最直接的体现就是代码,检验一个程序员技术水平的一个核心环节就是开发时候的代码能力。众所周知,程序开发的水平提升是一个循序渐进的过程,每一位程序员都是从“菜鸟”变成“大神”的,所以程序员在程序开发过程中的代码能力也是根据平时开发中的业务实践来积累和提升的。提高代码能力核心要素程序员要想提高自身代码能力,尤其是新晋程序员的代码能力有很大的提升空间的时候,需要针对性的去提高自己的代码能力。提高代码能力其实有几个比较关键的点,只要把握住这些方面,就能很好的、快速的提高自己的一部分代码能力。1、多去阅读开源项目,如有机会可以亲自参与开源

随机推荐