最近AI界的大新闻有点多,属于多到每天很努力都追不上,每天都忙着体验各种新产品或申请试用新产品。各种自媒体肯定也不会放过这个机会,AI取代程序员的文章是年年有,今天特别多。那么AI到底会不会取代程序员的工作呢?先说结论:不会!而且随着AI技术的发展,对程序员的需求会越来越旺盛。但是那些不学习不进步的程序员注定会被淘汰。
很多人对程序员的工作有个误解,以为就是整天敲代码,打字速度决定产出。别笑,这是事实。比如这张图就很符合广大群众的日常想象。双手不离键盘,满屏的魔法字符...
事实上,大多数程序员的一天都是在摸鱼中度过。如果你看到他眉飞色舞全神贯注的用双手在键盘上敲击,那一定不是在工作。有人一定会问,程序员不写程序,那每天工作都在忙什么?为什么公司要养那么多程序员?
事实上绝大多数公司认为程序员写代码是不需要时间的,就是打字,属于8小时之外随手就可以做掉的工作,公司不为这部分工作量付费。对于一个正常公司的程序员,每天的主要工作主要是:
- 线上问题排查,这个第一优先级。再稳定的系统隔三岔五也会出问题。解决完问题之后还要相互甩锅。
- 跟产品经理撕逼,这个东西要不要做,做成什么样,到底有多紧急。
- 横向撕B,这个功能需要XX部门配合修改,给YY部门的接口需要调整,运维需要升级集群部署...反过来,你又不是我领导,凭什么要我们配合你改?改出问题来怎么办?你们自己在ZZ模块里处理一下就好了。
- 攀登屎山。代码重构?看了看deadline,算了还是打个补丁吧。但是在拉新屎之前,你得在屎山里找到一个能下脚的地方。不然就变成我只改了一行代码系统就崩溃了。
- 公司内耗。日报周报月报,述职考核,价值观学习...
扣掉以上所有工作,剩下的时间才是程序员写代码的时间。以我在国内外一线大厂和小作坊创业团队的经历,团队越小有效工作时间越高,这部分的工作时间实际占比大约为10%到20%。而且相比敲击键盘输入代码,系统设计,代码调试,思考理解占用了至少80%的时间,真正用于编码的时间每天最多最多不超过30分钟。
那么今天AI的编程水平到底到了一个什么程度,能不能让一个外行轻松的上手工作并完成任务?网上有很多例子,但是这些例子的作者大多是编程老鸟,剩下的也多少对编程有所了解。因为真正的让AI生成的程序跑起来还是需要有一定的编程知识。
我们以一个计算24点的程序为例。提问为:写一个python函数计算24点,函数声明为def f24(nums),nums为4个数字。
def f24(nums):
# 生成所有4个数字的排列组合
permutations = list(itertools.permutations(nums))
# 尝试所有排列组合中的所有运算符顺序
for p in permutations:
for op1 in ["+", "-", "*", "/"]:
for op2 in ["+", "-", "*", "/"]:
for op3 in ["+", "-", "*", "/"]:
# 带括号的运算式
formula = "({0}{1}{2}){3}({4}{5}{6}){7}{8}".format(
p[0], op1, p[1], op2, p[2], op3, p[3], op4, p[4]
)
# 计算运算式结果
try:
result = eval(formula)
except ZeroDivisionError:
continue
if result == 24:
return formula
return None
这段代码看上去没问题,用暴力穷举的方法解决24点问题。而且知道使用调用itertools.permutations来生成排列组合,此外还很贴心的考虑了除0错误。但是这段代码是跑不起来的!第一眼就能看到一个问题,"formula = ({0}...."那行的op4是什么鬼?再给他一点提示,告诉AI:op4没有定义,请修复。
第二次输出如下。还很贴心的指出:修正之后,op4
这一变量已经不再需要,因为我们只需要生成三个运算符变量op1
、op2
和op3
,分别对应于三个数字之间的运算符。希望这样的修改可以解决之前的问题。
import itertools
def f24(nums):
# 生成所有4个数字的排列组合
permutations = list(itertools.permutations(nums))
# 尝试所有排列组合中的所有运算符顺序
for p in permutations:
for op1 in ["+", "-", "*", "/"]:
for op2 in ["+", "-", "*", "/"]:
for op3 in ["+", "-", "*", "/"]:
# 带括号的运算式
formula = "({0}{1}{2}){3}({4}{5}{6})".format(
p[0], op1, p[1], op2, p[2], op3, p[3]
)
# 计算运算式结果
try:
result = eval(formula)
except ZeroDivisionError:
continue
if result == 24:
return formula
return None
不仅修复了op4未定义的错误,还顺手加了之前忘记的import itertools。试了几组测试数据结果都OK。但是在这里调用eval计算表达式有点作弊了,我们希望自己解析实现。
提问:eval函数能自己实现吗
回答:
是的,eval 函数可以使用 Python 代码的字符串来自行实现。通常建议尽可能避免使用 eval 函数,因为它会执行任何传递给它的代码,包括恶意代码。如果在代码中使用 eval 函数时不小心传递了不受信任的代码,则可能会导致安全漏洞。
为了在自己的代码中实现 eval 函数的基本行为,可以使用 exec 函数来执行字符串。以下是使用 exec 实现 eval 的示例代码:
...
这里的回答和代码实际不是我想要的,我要的是用逆波兰表达式解析表达式字符串计算来替换eval。所以重新提问:我想用逆波兰表达式来替换eval函数。具体输出略去,不仅像模像样的生成的一个生成逆波兰表达式的函数,还给了我详细的解释,懒得看了,就当他是对的。那么我们就重新写一遍24点函数吧。提问:好的。请用上面生成的函数帮我重新生成一遍计算24点的代码。
...
代码生成好了,本地执行,卒!遂弃坑,因为问题太多了,有时间定位问题并不断调教AI得出正确结果的时间,估计已经能自己写好几个实现版本了。
结论是AI并不具有逻辑推理能力和真正的编程领域相关知识,而是从他庞大的知识储备里根据你的提问拼凑出最有可能的响应,并且根据对话不断进行调整。
对于一个小白来说,用AI确实能得到一段功能实现个七七八八的代码,如果再努力查查资料加本地调试,可以得到一个能用的代码。但是工程上的实现与学校交作业不同,除了结果正确外还要考虑效率,错误处理,历史版本的兼容性,可扩展性,框架的整合,代码规范...而现在所有的AI编程平台本质都是一个加强版的编程培训班学员,背诵了大量的案例,需要的时候根据需求咣直接扔一坨出来,给点反馈就改改,再改改,最终还是需要你下场手把手的交。
但是现有AI的最大优点就是博闻强记,它翻越了大山大海见过你几辈子都没见过的代码和文档,通过不断训练掌握了对代码的八股文式解读技巧。对于高手来说,这就是一把屠龙刀,可以利用它极大的提高工作效率,AI可以高效的帮你完成以下任务:
- 已有代码的解读
- 需求明确的情况下帮你快速生成代码
- 编程过程中给出提示,不用死记硬背长长的函数名和参数格式。
- 帮助生成注释
- 快速学习了解新的知识点
- 无从下手的时候快速生成引导
- 处理大量简单重复工作
使用AI的过程也是一个学习的过程,对于新手来说在这个过程中可以快速的摸清相关知识的脉络,循序渐进,建立自己的知识储备库。如果一直是一个小白水平,则无法向AI给出高质量的提示得到所需要的答案,也无法根据AI的答案做进一步的修改。
其实从编程这项工作产生以来,AI技术就不断的推动着这个行业的进步,随着门槛的降低并不是程序员的工作被取代,而是这个行业的不断扩大和从业人员需求量的上升。从广义的角度来说,用计算机替代人工的工作都应该属于AI,编程从诞生的第一天起就不断的追求抽象和泛化,目的就是减少重复工作量,推广最佳实践,规划代码,降低学习门槛。到今天各种框架和开源类库都是这个目标的产物,也正是有这些技术的支持,程序员的就业市场才得以蓬勃发展。
试想一下如今还停留在汇编语言,编程只可能是一项高门槛的工作,整个行业只会服务与少量高端需求。正是技术门槛的不断降低,大量传统企业开始数字化转型和改造,带动了整个行业的发展也带来了巨大的就业机会。
所以AI淘汰程序员就是个谬论,就像工业革命革了就手工业者的命,但是机器大生产也带来了新的岗位。所以不断学习,不断进步,拥抱AI,让AI成为自身生产力的一部分才是每个从业者需要去做的。
未来AI就如外骨骼一样,是我们大脑算力的外部延伸。