AI祛魅-程序员会失业吗
今年最大的冷笑话:程序员搞出了人工智能,结果让自己第一个失业。很多人都在传播这个笑话,从菜市场大妈、键盘侠,到记者、企业家,甚至业界大佬,尤其是推销人工智能的CEO们。油管等社交媒体上,几乎天天有技术博主爆视频,一会儿说某某大模型在哪些编程测试上击败人类,一会儿说,某某工具把全栈程序员的活全干了,总之每天都是高潮。
实践体验
为了验证这些传说,我这次亲自下场,用人工智能开发了几个小项目,亲身体会一般失业的恐惧感。先让我分享一下我的使用经验。
我的第一个项目,开场惊艳,小有挫折,顺利收场。
我的第一个项目是照片脸部侦测,识别、检索和数字OCR。为了获得比较全面、合理的答案,我同时问了ChatGPT,Grok,Gemini和DeepSeek,让他们推荐方案。所有的AI都推荐了类似的几个方案,因为是快速开发,我选择了 DeepFace + FAISS;OCR的方案,我一开始根据他们的推荐,使用Tesseract。方案定下后,我又写了几行需求,发送给各个AI。大概浏览了它们产生的代码,我最终选择了Grok的代码。让我感到惊奇的是,代码不长,几乎不需要修改就能运行,并且通过了单张照片的测试。接下来又通过几个回合,让他添加了命令行参数处理,大量照片的处理,虽然有些小问题,但基本过程还是非常愉快的,愉快到让我暂时忘记了失业的恐惧。
然后我发现Tesseract的使用效果不是很好,经过反复研究,并且手工测试后,我决定使用PaddleOCR。代码部分的修改非常顺利,但是在解决 Python 包的兼容性上,所有的AI完全没有方向。DeepFace,FAISS和PaddleOCR之间,在Pytorch,tensorflow,cuda的版本上有些冲突,我不得不脱离AI,通过Google查找各种文档和论坛寻找答案。最后是一个妥协且丑陋的方案,绝对不是AI能想出来的。我放弃了在PaddleOCR里使用GPU,然后利用Pytorch的前向兼容性特点,解决了tensorflow的版本问题。题外话:tensorflow,python,DL那些丑陋的版本问题,直到今天都没有很好的解决。不是我嘲笑那些搞AI的专家,你们的编程和软件工程能力真是渣到家了。
随着添加更多的功能,整个代码量开始增加,我和AI的蜜月期仅仅维持了一个半小时,然后AI开始产生各种让我无语、血压飙升,甚至气到吐血的代码。这个过程种,我也逐渐摸索出一些和AI打交道的方法。我尽量让AI完成一个相对独立、比较小的功能;同时提供足够的上下文内容,经常把原来的代码上传,明确要求它基于现有代码进行修改,尽管这样,还是有很多问题,很多时候,我必须自己查找答案,或者直接手写代码。
第二个项目,顺利完成,但发现低质量代码。
开发一个 Word 文档转视频的工具。有了第一次的经验,我先问AI,有没有可行的方案。AI的回答冗长且缺乏重点,堪比销售话术,还主动提供了一些代码。最后根据AI的建议,我选择着这样了一条路径:Word文档使用预先定制好的PPT模板,转为PPT,然后提取PPT的Note,制作语音,最后把PPT导出为图片,配合音频文件,制作出视频和字幕文件。我把各个步骤拆成独立的模块,让AI生成代码。这个过程里发现AI在处理音频长度制作字幕时,无论怎么提示,都无法正确产生字幕时间,只能自己动手,就几行代码,而AI生成的代码有二十几行,让我无力吐槽。我知道AI完全没法处理那些新开源项目,就自己手工替换了语音模块,使用了F5-TTS来生成语音。
第三个项目,一直在各种bug之间兜圈子,最终失败。
我的第二个项目是给第一照片项目,建立一个完整的后台管理系统。因为我在Session和用户验证上的要求比较奇葩,AI产生的代码,质量非常差,有些完全不工作,需要我自己修改,然后又出现几个bug,修复这个,导致另外一个,修复另外一个,又回到第一个,最后不得不放弃,打算以后找时间重新尝试。为了简化管理和部署,我使用和第一个项目一样的开发语言Python,并使用了AI推荐的FastAPI,而我自己最熟悉的是Java的Spring Framework。所以每次AI产生的代码没法工作后,我就花大量时间去学习FastAPI,并阅读和理解它的代码。我有点后悔,应该一开始就完全基于熟悉的框架自己开发。
直接感受
很多做开发的朋友都有过和我类似的体验。但他们都是在用他们熟悉的编程语言和框架开发,没有作为新手的体验,所以我的体验更全面一点。从一开始的惊艳到后来的吐槽,这中间最大的变化,就是需求的复杂度指数级上升,代码量也飞速增长。
AI的优势
AI在处理单一需求,已知算法和需求,尤其是那些有大量代码训练的程序功能上,的确有很大优势。程序员作为人是很难熟悉所有领域需求的,AI在这块体现出巨大的实用价值。但也不是完全没有问题。首先,作为领域专家,他们非常熟悉这些代码,很多代码就是他们开发的,对于他们,AI能够为他们节省的时间非常有限。作为新手,最大的问题是,有时候AI产生的代码看起来很好,其实是一坨屎,而新手却无法快速甄别这些烂代码。一旦他们发现代码问题,他们需要花费更多的时间来理解和处理。所以我个人觉得,在这个方面,AI很有用,但是有点鸡肋。
AI的劣势
AI完全无法胜任那些复杂需求,大规模代码,复杂的项目。没有人的参与,AI根本不能做任何有用的工作。这里面有这些常见问题:
- 它产生的代码,没有连贯性。比如经常修改之前生成的代码,修改的部分逻辑可能一样,但是有些不必要的调整,比如添加了注释,修改了格式甚至变量名,这会对版本控制产生不必要的影响。
- 没有记忆,丢失了对之前代码的记忆,生成新代码和其他部分不兼容,严重的时候,就是解决一个Bug,产生另一个Bug,然后在这两个Bug直接形成了死循环,再也跳不出来。
- 发挥不稳定,有时候产生很不错的代码,一次成功;有时时候又产出非常奇怪又弱智的代码,我都很难理解,到底是训练数据引入了这些弱智的代码,还是AI自己产生的。
- 对于不太常见的需求,AI的产生的代码基本不能用,还是手工写比较靠谱,也省事省力。现在的生成式AI,严重依赖训练数据,这在代码生成方面,尤其明显。那些不常见的问题,最佳方法还是自己研究直接手写代码。
- 无法有效的表达大型项目里各个组件代码之间的关系,AI也无法很好理解这些关系,这让AI无法处理大型项目。比如一个文件包含了很多功能,被许多其他文件使用,当我要求它为某个模块,改写另一个文件里的逻辑时,它经常会移除一些被其他模块使用的功能。稍不留意,几次之后,我都不知道它啥时候去掉的。让它加回去,又可能要花费很多时间。
- 因为这些问题,导致在使用过程中,我对AI产生的代码极度的不信任,花费大量时间来阅读和测试。
- 另外,无论是大小项目,对于训练不充分的东西,它产生的代码简直是屎山,我不得不自己重写,代码量到了夸张的1比10。整体而言AI产生的代码,要比人写的冗长低效很多,AI也就拉屎,吐代码的时候比人快。
当然这些问题,也不全是AI产生,很多和人也又关系。比如:
有很多是沟通中产生的。人和人之间的沟通都有问题,何况人和机器呢。一些沟通问题是歧义造成的;一些是在一系列沟通过程中逐渐积累的,积累到一定程度,就会产出奇怪、错误的代码,而修改这些错误,可能要回溯整个流程,非常费时费力。
现在让我们回到那个话题:AI会让程序员失业吗?
短期内没有任何可能。
- 虽然 AI 在的代码生成在自动化测试和重复性任务处理方面表现出色,但它在理解复杂需求、进行创新设计和解决未知问题方面仍存在局限性。
- 软件开发不仅是编写代码,还包括需求分析、系统设计、团队协作和沟通等,这些都需要人类的创造力、判断力和沟通能力。
- AI 目前更像是一个能力有限的辅助工具,可以提高程序员的效率,根本没有能力取代他们。
长期影响,还是更多提高程序员效率,而不是替代程序员。
- 随着 AI 技术的不断发展,它可能会承担更多重复性和标准化的编程任务,从而改变程序员的部分工作内容。
- 程序员需要不断提升自己的技能,专注于更高层次的软件设计、架构和创新,以及与 AI 协同工作。
- 程序员还是码工、码农,依旧要写代码,只是不写那些重复、烂大街的代码
目前使用AI编程的个人建议
- 把大项目切成一个个独立的小项目,每个项目直接相对独立。
- 尽量一次让AI处理比较少的代码文件,总代码量不要太多。
- 需求越明确,没有歧义越好。
- 如果需要AI修改老文件,上传文件,明确告诉它基于老文件。
- 一开始告诉AI各种代码规范,隔段时间提醒一下,避免它遗忘了,产生风格不一致的代码。
- 让AI为那些常用的功能生成代码,那些少见的功能,还是自己开发比较好。
- 不要盲目相信AI产生的代码,必须复查测试。你可以让编写相应的测试代码。
- 每次替换旧文件时做备份,你不知道AI啥时候抽风。
还有一个比较尖锐的问题:没有程序员写的代码,AI能自己学会写代码码?
很多AI专家在研究这个,他们想让AI能够像人一样,自己学会编程。我在之前的某期节目里讨论过这个。我的论点是,如果AI能够自己学习编程,这意味这AI能够自主创造,再也不需要人类。AI可以编写程序,程序可以运行AI,AI再次迭代,写出更牛逼的程序,程序运行更牛逼的AI,这个循环是不是很酸爽。就目前来看,我的观点和大部分人,包括那些著名的AI领域的专家不同,我的观点是没有可能。
很多人说,AlphaGo可以通过自我博弈,学会围棋,并远远超越人类,围棋那么复杂,编程不是小菜一碟。你还是真小看了编程。围棋还是一个规则简单,胜负明确的有限,强化学习,对抗生成网络等技术能够很好的处理,但是到了编程领域,目前还有任何有效的网络模型和方法。将来,比如十年、二十年呢?我还是认为不可能。这一争论与‘如何让AI产生意识’的议题类似,难度或许更高。实现程序员自主的意识,要比实现小狗小猫的自主意思难很多吧。
编程的本质不是写出代码,而是理解世界的运作规律,然后转换成代码。这个过程是本质上就是人类认知、解构、掌握世界的过程,是人类不同于动物的根本区别。而程序员在这方面是人类中的佼佼者。很多人开玩笑,程序员是个高中生,送进培训班训练一下就能干。我要告诉你,如果真有这样的高中生,那也是个天才的高中生,完全有能力上大学。
因此,与其担忧被取代,程序员更应关注如何与AI协作,专注于创造性工作。我还是看好程序员,因此我把自己的三个孩子,都培养成了程序员。