古法编程:在AI写代码的2026年,怀念那个逐行手敲的笨拙时代

0 阅读17分钟

每一行代码都是指纹,每一个bug都是勋章,每一个深夜debug都是——等等,我为什么要怀念这个???

凌晨两点,我关掉了Copilot X的自动补全,打开了VS Code的“纯净模式”。屏幕上没有了那个不断跳动的灰色建议文字,光标安静地闪烁着,像是在等待什么。

我在等待一个记忆。

然后我发现,我已经忘了 HashMap 的构造函数怎么写。

序:当代码不再是“写”出来的

2026年的春天,软件开发圈子里流传着一个恐怖故事:

某大厂面试,面试官说:“请手写一个快速排序。”

候选人愣了三秒,然后哭着说:“老师,我错了,我以后再也不用AI写作业了。”

面试官叹了口气:“兄弟,这是我今天面的第八个了。要不你写个冒泡?冒泡也行啊。”

候选人想了想,掏出手机:“让我先查一下冒泡怎么写……”

这个故事是真是假已经不重要了。重要的是,它确实可能发生

上周,我带着新来的实习生小周做一个微服务重构。我打开终端,输入了一行需求描述,AI引擎在17秒内生成了完整的服务骨架、单元测试、甚至是K8s部署文件。小周瞪大了眼睛:“前辈,以前你们真的是一行一行写代码的?”

那个“以前”,其实也不过是七八年前。

他掏出手机,对着我的屏幕拍了一张照片——不是因为代码有多精妙,而是因为我正在手动调整一个算法的边界条件,没有借助AI补全。他说要发到群里给同学看看,“传说中的古法编程”。

然后他问我:“那你们以前debug是不是也特别痛苦?”

我说:“你是没见过我师傅当年怎么debug的。”

小周眼睛亮了:“怎么de的?”

“他写了个日志,打印出‘程序运行到这里了’,然后跑一遍,看看打没打出来。”

小周沉默了三秒:“……就这?”

“就这。那时候我们管这叫‘printf大法’,是最高贵的debug艺术。我师傅的最高纪录,是在一个函数里塞了四十多个print,最后发现是数据库连接串少了个冒号。”

小周的表情像是在看一个原始人钻木取火。

我说:“你别笑。你现在的AI给你写了五百行代码,出了bug,你知道怎么修吗?”

他没说话。

一、手写代码的肉身记忆:以及那些想砸键盘的瞬间

你还记得第一次写出“Hello World”的感觉吗?

不是对AI说“写一个Python脚本打印Hello World”,而是用十个手指,一个字母一个字母地敲下 p-r-i-n-t-("-H-e-l-l-o-,-W-o-r-l-d-!-"),然后屏住呼吸按下回车。

屏幕上出现了:

SyntaxError: invalid syntax

你低头一看,少了一个括号。

这就是古法编程的入门仪式——你的第一个程序永远不会一次跑通,这是宇宙法则,比热力学第二定律还准

2018年我刚入行的时候,师傅扔给我一本《代码大全》和一台装了Ubuntu的旧ThinkPad。“先写三个月C,不许用IDE,用Vim。”

我问:“为什么不能用IDE?IDE不是更效率吗?”

师傅说:“你先学会走路,再用轮椅。”

我当时觉得他在装逼。三个月后我发现他说得对——但我还是觉得他在装逼。而且他说的轮椅,我后来用了六年,现在离了它连 System.out.println 都拼不全。

那三个月,我记住了每一个头文件。因为每次忘了include,编译器就会甩给我一屏幕的报错,像被英语老师批改的作文一样触目惊心。有一次我连续忘了三个头文件,编译器报错报了整整两屏,我当时以为自己把整个操作系统搞崩了。

每一次内存泄漏都像被针扎过一样刻进神经。有一次排查一个段错误到凌晨四点,最后发现是少写了一个 \0 结束符。

我盯着屏幕,心情很复杂。一半是“终于找到了”的狂喜,一半是“就这?就这??就少了个破斜杠零???”的想死。这两种情绪交替冲击我的大脑,最后我做出一个非常理智的决定——去楼下便利店买了一罐红牛,然后坐在马路牙子上发了十分钟呆。

后来我渐渐明白,手写代码的过程,本质上是一种认知雕刻——或者说,是一种反复社死

因为你必须亲自写下每一个字符,所以你会犯各种离谱的错误。比如把 == 写成 =,比如在JavaScript里把 === 写成 ==然后被隐式转换坑到怀疑人生,比如在Python里缩进不对整个程序直接炸掉。

这些错误,AI永远不会犯。所以AI永远不会知道,当你终于找到那个该死的缩进错误时,那种“原来我是个白痴”的顿悟,有多么刻骨铭心。

二、“慢”的价值:bug是代码的皱纹,也是程序的幽默感

AI写代码很快,这一点毋庸置疑。

2026年的今天,一个中等复杂度的业务模块,AI可以在45秒内完成初版。代码风格整洁,注释规范,甚至还会贴心地加上错误处理和日志埋点。

但它不会犯那些“人类的错误”。

你不会在AI生成的代码里看到这样的注释:

// TODO: 我知道这段代码很烂,但项目明天上线,我下周重构,我发誓
// (六个月后)
// TODO: 我知道这段代码很烂,但我发誓下下周重构
// (又六个月后)
// 好吧,这段代码会永远烂下去了,对不起,后人
// (又一年后)
// TODO: 重构?不存在的,这代码已经成精了,动一下整个系统都得炸
// 谁要是看到这条注释还敢改,我敬你是条汉子

你不会在AI生成的代码里看到变量名叫 temptemp2temp3temp_finaltemp_final_realtemp_final_real_for_real_this_timetemp_final_real_for_real_this_time_FINAL

你不会在AI生成的代码里看到一个功能用三种不同的风格实现,因为三个不同的人在三个不同时期改过它,而且每个人都觉得前一个人的代码是屎,每个人都觉得自己的代码是重构的艺术,然后三个月后自己再看自己的代码也觉得是屎。

我2019年维护过一个系统,里面有一段代码是这样的:

// 老张写的,老张说这段代码很关键,不要动
// 后来老张离职了,小李改了这段代码,系统崩了
// 小李把代码改回去了,加了一行注释:“老张对不起,我不该动你的代码”
// 后来小王又改了,又崩了
// 小王也把代码改回去了,加了一行注释:“老张是神”
// 后来老张回来做了一次技术分享,看到这段注释,沉默了很久
// 他说:“其实这段代码我当时也是抄的Stack Overflow,我也不知道为什么能跑”
// 现在这段代码已经七年没人动过了,像一个被供起来的神像
// 注释里全是香火钱

这段代码的功能是什么?没有人知道。它到底在做什么?没有人知道。能不能删掉?没有人敢试。每次有人提议重构这个模块,会议室里就会出现一种诡异的沉默,然后话题会自然地转向“要不我们先聊聊今年的团建去哪儿”。

这就是古法编程的遗产——代码里不仅有逻辑,还有一部办公室政治史,一部人类迷惑行为大赏

AI永远不会给你这种东西。AI给你的只有干净、整洁、无聊的代码。像一间刚装修好的样板间,你住进去之后连外卖都不敢点,怕弄脏了地板。

三、失去“手感”的一代:以及一个社死现场

2025年的一项行业调查显示,从业三年以下的程序员中,超过60%从未独立写过超过500行的纯手工代码。

这意味着什么?

这意味着,如果你在面试里让他们手写一个链表反转,他们会打开手机备忘录,开始写prompt:“写一个JavaScript函数,反转链表,要考虑到边界条件,最好有注释……”

然后他们会意识到,面试官正看着他们。

然后他们会把手机放下,露出一个尴尬而不失礼貌的微笑。

这不是段子。我朋友去年面试一个候选人,对方简历上写着“三年经验,精通数据结构”。我朋友说:“那你手写一个二叉树的中序遍历吧。”

候选人想了十分钟,写了一个 while 循环套 while 循环,里面还嵌套了一个 switch 语句,一共四十多行,看起来像是把代码搅拌机打碎了之后重新拼起来的。中间还用了一个 goto——在JavaScript里用 goto,我都不知道他怎么办到的。

我朋友说:“你确定这是中序遍历?”

候选人说:“我确定这是遍历,中是中不中我不敢保证。”

我朋友沉默了三十秒,说:“你的幽默感通过了,但代码没有。”

——后来这个人还是被录用了,因为他确实很有幽默感。但被分配到了文档组。据说他现在是公司最受欢迎的文档工程师,因为他写的文档像段子合集,大家遇到问题都愿意先翻他的文档,哪怕找不到答案,也能笑一笑缓解焦虑。

四、古法编程的现代意义:不拒绝工具,但拒绝被工具“驯化”

我并不是在鼓吹回到纸带打孔的时代,也不是要年轻人扔掉AI去手写汇编。

我前几天看到一个帖子,标题是《2026年了,还有程序员不会手写二分查找?》。底下最高赞的评论是:“我会手写prompt让AI写二分查找,这算会还是不会?”

这条评论有三千多个赞,下面吵了四百多楼。有人说“算会,这叫元能力”,有人说“算个屁,这叫外包”。

我觉得两边的观点都没错,但两边都跑偏了。问题不是“用不用AI”,而是“离开AI你还有多少”。

我给你们讲个真事。

我同事老王的儿子,今年大三,计算机专业。上个月他们有个课程作业,用C++写一个简单的图书管理系统。他儿子打开Cursor,对着AI说:“帮我写一个图书管理系统,用C++,要有借书还书功能,命令行界面就行。”

AI哐哐哐生成了六百多行代码。他儿子编译运行,发现还书功能有个bug——还了一本书之后,库存数量不减反增,越还越多。

他儿子对着AI说:“还书功能有bug,修一下。”

AI改了一版,这次库存数量倒是减了,但不管还哪本书,减的都是第一本书的库存。

他儿子又让AI修。AI又改了一版,这次库存数量对了,但还完书之后,借书记录没了——不是那本书的借书记录没了,是所有借书记录都没了。

他儿子折腾了两个小时,换了十几种说法,AI每次都能修好一个bug,然后创造出两个新的。最后他儿子崩溃了,给老王打电话:“爸,这个AI是不是有病?”

老王说:“你打开代码自己看看啊。”

他儿子说:“六百多行C++,我看不懂啊。”

老王当时正在公司开会,听到这句话,当着全组人的面沉默了十秒钟。

后来老王周末飞到他儿子的城市,父子俩坐在宿舍里,一行一行看那六百多行代码。老王指着屏幕说:“你看这个逻辑,AI用了一个全局变量来记录当前借书数量,但是在还书的函数里,它又定义了一个同名的局部变量,所以每次还书改的都是局部变量,全局变量根本没动。”

他儿子恍然大悟:“哦——所以不是AI有病,是我不会看代码。”

老王说:“对。”

这就是区别。

用AI写代码,你可以不会读代码。用AI修bug,你可以不会debug。用AI做项目,你甚至可以不懂编程。

但问题是——当AI给你制造了一个它自己都修不好的bug时,你要么学会读代码,要么等死

而学会读代码的唯一方式,就是你亲手写过足够多的代码。写过垃圾代码,写过能跑的代码,写过跑着跑着崩了的代码,写过崩了你死活找不到bug最后发现是少了个斜杠零的代码。

这些经历,AI给不了你。它们只能靠你自己,一行一行地,亲手敲出来。

五、致那个笨拙的自己:以及那些不堪回首的代码

前几天,我翻出了2019年的一个旧硬盘。里面有一个我大四时写的Java聊天室程序,用的是当时已经过时的Swing。代码丑陋得令人发指:

  • 命名随意:abcx1x2x3……我怀疑我当时在练盲打而不是写代码,而且练的还是乱序盲打
  • 异常处理就是 e.printStackTrace(),相当于出事了就大喊一声“出事了”然后什么都不做,连“谁来管管”都懒得喊
  • 没有设计模式,没有单元测试,main方法里塞了三百多行,看起来像是把整个程序揉成一团塞进了垃圾桶,还踩了两脚
  • 最离谱的是,里面有一段注释写着:“这段代码我也不知道为什么能跑,但它确实能跑,所以不要动。求求了,不要动。”

我看了很久。

我看到自己为了搞懂多线程,手写了七八个版本,每一个版本都在不同的地方死锁。最后一个版本我加了一个 Thread.sleep(1000),死锁消失了。我当时以为自己解决了问题,高兴得在宿舍里转了三圈,还发了一条朋友圈:“终于搞定了多线程,我太强了。”

现在我知道,我只是把问题推迟了一秒。那多出来的一秒,刚好够死锁还没来得及发生,程序就已经执行完了。这相当于你说“我解决了失眠问题”,然后你的解决方案是“我只睡一秒”。

但当时的我不知道啊。当时的我,是真的觉得自己很强。

那些笨拙的手写代码,是我编程路上的年轮。每一圈都记录着那个曾经什么都不懂的自己,如何一步一步地理解这个世界——以及如何用最离谱的方式解决自己制造的问题,然后在两年后回头看时,恨不得穿越回去扇自己两巴掌。

AI可以写出比我更优雅的代码,但它永远无法写出我的代码。

因为它没有熬过那些凌晨三点的debug,没有在一个 i++++i 的问题上纠结过两个小时(最后发现其实根本不影响结果),没有因为一段代码被同事骂“这写的什么玩意儿”而在工位上自闭了整整一个下午,然后在回家的地铁上还在想“他说得对,那确实是屎”。

更关键的是,AI永远不会在代码里写这种注释:

// 2020-08-15: 这个地方我改了三遍了,每次改完都会出新的bug
// 我现在怀疑这段代码有自我意识,它在进化
// 我已经不敢改了,就这样吧
// 如果有人读到这段注释,请记住,我曾经努力过
// 2021-03-22: 妈的我又改了一次,还是崩了
// 2022-01-17: 我在知乎上看到有人遇到同样的问题,下面有人回复说“建议重构”
// 2022-01-17: 那个回复被我点了反对
// 2024-11-09: 三年了,我还是没改好
// 这段代码现在运行得很稳定,只要没有人动它
// 我已经接受它了,就像接受自己的发际线一样

尾声:保持“手写”的权利,以及一个善意的提醒

2026年的今天,我依然保持着一个习惯:每个周末,关掉AI补全,关掉网络,用两个小时手写一段代码。

不是因为这样更高效——显然不高效。我这两个小时写的东西,AI三十秒就能生成,而且比我写得好。

不是因为这样更优雅——显然不优雅。我写的代码,变量名还是习惯用 temp,注释还是写得像在跟未来的自己吵架。

是因为这样更好笑。

你永远不知道自己在手写代码的时候会犯什么离谱的错误。有一次我写了一个函数,跑起来发现结果永远是0。我检查了三遍逻辑,没问题。检查了五遍,还是没问题。

最后我发现,我把 return result 写在了循环里面。所以每次循环都return了,只计算了第一个元素。

这个bug找了我四十分钟。找到的那一刻,我一个人对着屏幕笑了五分钟,笑到猫都从椅子上跳下去了,用看智障的眼神看着我。

还有一次,我把 >< 搞反了,导致排序结果是倒序的。我调了两个小时,一直以为是算法写错了,最后发现是判断条件写反了。那一刻我对着屏幕说:“我不是在写降序,我是在写升序,只是我比较叛逆。”

这种快乐,AI给不了你。

所以,给所有还在读这篇文章的程序员一个建议:

不管你用多先进的AI,不管你有多依赖自动补全,请保持一个习惯——偶尔,亲手写一段代码。不需要多复杂,不需要多重要。写一个算法题,写一个小工具,写一个你自己用的脚本。哪怕只是写一个打印九九乘法表的程序,也行。

不是为了复古,不是为了装逼,而是为了——

让你在未来的某一天,可以对着刚入行的实习生说:

“你知道吗,以前我们写代码,连自动补全都是奢侈品。我们要背API,要背函数名,要背参数顺序。那时候的Stack Overflow还是真的有人在回答问题,而不是AI在回答AI的问题。”

“我们用的IDE,连报错都要等编译之后才知道。编译一次要等好几分钟,够你去接杯水、上个厕所、刷五分钟手机,然后回来发现编译失败了。”

“我们debug,全靠print。遇到复杂bug的时候,整个控制台都是我们的输出,像一面彩色打印的忏悔墙。”

然后看着他们震惊的表情,露出一个神秘的微笑。

那一刻,你就是活化石。

而活化石,永远不缺流量。