你好,我是 diankao

在这里记录技术与生活

AI 不能替你坐牢:十年“不会被 AI 替代”话术考古

从 AlphaGo 到现在十年,每隔几个月就有一版新的"AI 时代真正不会被替代的能力"话术上市。把它们按时间排开看,会发现一个尴尬的规律:每版答案的寿命,大约等于一代大模型的训练周期。而把十年的名词收拢起来看,这些答案的来源其实只有四类,每一类各有自己固定的错法。这篇先按编年看死法,再按来源分型,最后处理两个更实务的问题:替代顺序到底由什么决定,以及焦虑本身养活了哪些生意。 先讲五个笑话 AI 是不能替人类坐牢的。 程序员最早笑话小画家是珍妮纺纱机冲击下的女工——程序员觉得自己是掌握 AI 的人,小画家是文科的计算机文盲。结果到 2026 年大家发现,程序员可能是最早被替代的,小画家反而靠兴趣社区里人与人的链接互相承认劳动价值,活了下来(比如米画师)。 人类的智能才进化了几十万年,人类的身体能力进化了几亿年——而当年机械时代的人认为,身体才是会被机器代替的那部分。 你老板早就在 vibe 了,只不过 agent 是你。 2026 年,公司纷纷发现人类比 AI 便宜。 前三个是攒了些年头的存货,后两个是 2026 年的最新款。它们好笑在同一个点上:嘲笑的都不是 AI,而是人类判断"什么不可替代"时用错的参照系——第四个拆掉的是"定义问题的位置可以学出来"的幻觉,第五个干脆指出连替代本身都不只关乎能力,还关乎单价。 十年速览:每代人的"安全答案"和它的死期 时代 焦虑引爆点 主流"安全答案" 被什么证伪 存活时长 2016–2017 AlphaGo 胜李世石 创造力、关爱型工作;落地版:学编程 vibe coding;黄仁勋"别学编程"(2024.2) 约 7 年(落地版) 2020–2021 GPT-3 热身 “教 AI 的人”:人工智能训练师 标注岗外包化、低薪化,模型自我训练 约 3 年 2022 SD 开源、MJ 获奖 “有灵魂的原创” 中国游戏原画外包被裁(2023) 部分存活至今 2023 ChatGPT / GPT-4 融会贯通、批判性思维、会提问 Deep Research(2025.2) 约 18 个月 2024 GPT-4o / Sora、AI 陪伴爆发 情绪价值、共情 “AI psychosis” 进入医学文献(2025) 约 18 个月 2025–2026 推理模型与 Agent 定义问题、判断力、taste 未见证伪,Gartner 已泼冷水 进行中 2025 斯坦福实锤初级岗位蒸发 “熬到资深就安全”:经验即护城河 没人证伪"资深",被拆掉的是通向资深的阶梯 进行中 2016–2017,AlphaGo。 李世石败局让公众第一次直观感受到"机器超越人类"的恐慌,围棋只是缩影。李开复在 2016 年底给出"50% 的工作将被 AI 取代",2018 年细化成著名的五秒钟准则——5 秒内能做完决策的工作就会被取代——并给出那个时代的标准答案:往"没有数据"的开放性领域走,人类剩下创造力与关爱型工作。这个判断本身没有大错,错的是它的大众落地版:“学编程就安全”。2024 年 2 月黄仁勋在迪拜放话“别再学编程了,交给 AI”,2025 年 vibe coding 兴起之后,“会写代码"从职业保险贬值为默认操作。围棋界自身的变化更微妙:十年回访显示,棋手从权威沦为"AI 的翻译者”,焦虑从"怕 AI"变成了"怕跟不上 AI"。 ...

2026年9月2日 · 3 min

删不掉的 nul:AI 编程助手在 Windows 上的一次跨平台口误

用 AI 编程助手(Claude Code、ZCode 这类 agent)在 Windows 上干活的人,迟早会在某个项目根目录捡到一个幽灵:一个 0 字节的文件,名字叫 nul。git status 里躺着个 ?? nul,资源管理器里看得见,右键删除却报"找不到该项目"。看得见,删不掉,标准的幽灵文件。 它不是病毒,不是 bug,是 AI 助手的一句跨平台口误。 口误发生在哪一句 AI 助手在 Windows 上跑命令,走的通常是 Git Bash——一个 POSIX 语义的 shell。而模型执行命令时有个职业习惯:把无关的日志和报错重定向丢弃,保持输出干净。丢弃输出的写法在两个世界长得不一样: Windows cmd: some.exe >nul (nul 是设备,输出进了黑洞) Bash: some.exe >/dev/null (/dev/null 是设备,输出进了黑洞) 模型识别到宿主是 Windows,出于好意切了 cmd 方言,写下 >nul。但实际执行这句的 shell 是 Git Bash。在 Bash 眼里,nul 不是设备,就是一个普通的文件名——重定向的目标文件不存在时 Bash 会怎么办?创建它。于是磁盘上多了这么个东西。 一句字面级别的口误:语法是 cmd 的,解释器是 Bash 的。两边单独看都没错,拼在一起就生成了一个不属于任何一方意图的文件。 为什么看得见、删不掉 nul 是 DOS 时代的设备保留名,同一家族还有 con、prn、aux、com1 到 com9、lpt1 到 lpt9。Windows 的 Win32 层在解析路径时,会把出现在文件名位置上的这些名字别名到设备对象上。所以资源管理器、del nul、以及一切走 Win32 路径的程序,操作这个名字时碰到的其实是设备,不是文件——“找不到该项目"就是这么来的:它找的确实不是那个文件。 ...

2026年9月1日 · 1 min

你说的 CRC 是哪个 CRC:一次上下位机联调翻车实录

前段时间组里上下位机联调。协议文档看起来挺完整:帧头、命令字、数据、帧尾带 CRC16 校验。两边各自实现、各自自测,全都通过;一联调,各种 bug 排着队来。查了好几天,最后发现元凶平平无奇:两边都实现了 CRC16,但从头到尾没人问过一句——是哪个 CRC16。 先说结论:CRC 不是"一个算法",是一个算法族。“加个 CRC 校验"这句话的规格含量,跟"加点辣"差不多——都是辣,川湘黔滇各不一样。 翻车姿势 CRC 变体没对齐时的症状,通常是这三种: 全帧校验失败。发什么错什么,怀疑链从串口时序、大小端、接地一路排查到换线换板子,通信工程师的经典受难路线。其实链路好得很,两边算的压根不是同一个数。 为联调把校验旁路。有人图快,把"校验失败"改成"打条日志继续跑”,业务先跑通了,恢复和补测永远排在下个迭代。校验从此形同虚设,比没有还危险——它给人安全感。 偶发"漏检"玄学。压力测试几百万帧,偶尔一两帧校验通过但数据是错的。于是开始研究 CRC 漏检率、查电磁干扰、上磁环。其实是两套算法在 65536 个值里随缘撞上了——不是漏检,是压根没检。 CRC 是一个算法族 CRC 除了"用哪个多项式做除法"这个自由度,除法前后还有一串参数。业界通用的描述模型叫 Rocksoft 模型,出自 Ross Williams 1993 年那篇 A Painless Guide to CRC Error Detection Algorithms,一共五个参数: width:位宽 poly:多项式 init:寄存器初值 refin / refout:输入、输出是否按位反转 xorout:结果异或值 “CRC16” 只锁定了第一个参数,剩下四个全开放。同一个多项式能配出多少种不同结果?看下表(check 是官方测试向量:9 字节 ASCII 字符串 "123456789" 的校验值): 名字 poly init refin/refout xorout check CRC-16/XMODEM 0x1021 0x0000 否/否 0x0000 0x31C3 CRC-16/CCITT-FALSE 0x1021 0xFFFF 否/否 0x0000 0x29B1 CRC-16/KERMIT 0x1021 0x0000 是/是 0x0000 0x2189 CRC-16/ARC 0x8005 0x0000 是/是 0x0000 0xBB3D CRC-16/MODBUS 0x8005 0xFFFF 是/是 0x0000 0x4B37 CRC-32/ISO-HDLC 0x04C11DB7 0xFFFFFFFF 是/是 0xFFFFFFFF 0xCBF43926 前三个共享多项式 0x1021,check 是三个毫不相干的数;中间两个只差一个 init(0x0000 与 0xFFFF),结果就分道扬镳。网上抄的 crc16.c,十份里能抄出五种参数组合,而且多半不写注释。 ...

2026年8月18日 · 1 min

Qt Creator 底下那个“控制台”是假的:一次 Windows 中文乱码排查实录

前段时间写 loghandler,需求说出来特别简单:console 里看的、调试输出里看的、实际落盘的内容,编码得一致。就这么点要求,被中文乱码折腾了好久。各种组合来回试过,才定位到元凶不是代码,而是观察工具本身:Qt Creator 底部那个长得像控制台的窗格,其实不是控制台,是 IDE 重定向、转述过的 output。 先把结论放在最前面: 那个窗格的大名是"应用程序输出"(Application Output)。Qt Creator 运行程序时不给它开控制台,而是用管道接住进程的 stdout/stderr,读出字节后由 IDE 自己解码再显示。它是转述者,不是终端。 所以 SetConsoleOutputCP() 对它完全无效——那是设置真控制台渲染解码的 API,而这条链路上压根没有"控制台渲染"这一环。 printf 的字节流会被窗格按系统本地代码页(中文 Windows 即 GBK)固定解码。源文件是 UTF-8 的话,printf 直出中文在这个窗格里必乱,怎么设置都救不回来。 更迷惑的是 qDebug 走的是另一条 Unicode 通道,在窗格里永远正常。“qDebug 好的、printf 坏的"这个组合,会把你引向一连串错误归因。 以下实测基于 Qt 5 + Qt Creator(起码大版本 5 是这样)。只要 Creator 还是"管道重定向 + 自己解码"这个架构,这个坑就大概率还在;不同版本的解码细节可能变化,所以文末的验证方法比这里的结论更重要。 症状:qDebug 正常,printf 乱码 程序里两种输出混用——qDebug 做调试,printf/fprintf 是老代码或第三方库。在 Qt Creator 里一跑:qDebug 的中文正常,printf 的中文全是 涓枃娴嬭瘯。 这类乱码不用背规律,看长相查表就能反推出"输的什么码、解的什么码”。GitHub 上这份 unicode-encoding-error-table 按外观特征收录了常见错法,涓枃娴嬭瘯 这种"古文码"就是 UTF-8 字节被按 GBK 解读——3 字节的汉字被拆成 2+1 错配,长度都对不上,看起来自然乱得不像话。反过来说,看到它就知道:输出端发的是 UTF-8,解码端在用 GBK。 ...

2026年8月17日 · 2 min

鉴定一下网络热门盲文图形专利:计算机图形学下岗再就业

盲文给人的印象通常是"摸书"。但数学课的几何图、地理课的地图、报表里的柱状图,视障者也一样要用,只是得先在纸上做成凸点,再拿手指去读。这类东西有个专门的叫法:触觉图形(tactile graphics)。 前两天做写字机 like 项目的时候,看到某公司的盲文产品,打开页面发现是巨大写字机 + 大力出奇迹舵机。给我整笑了。但一看价格,和写字机一个级别,超级便宜,又感觉肃然起敬,颇有中国人的"工程智慧"感。 故而翻他们专利,看到他们做这个方向的申请,2024 年提交的。2024 年那份的引证文献里,正好引了一篇 2016 年的旧专利。两件放一起读,不禁让人再次感叹工程智慧。褒义地来说,上古现成的图像算法换个领域又做了一遍,在小众领域照顾到了残障人士(当然,如果你非要觉得这意思是水专利,随你!);另一件则真从"用手摸"这个角度重新想了问题。两件专利差了 8 年,中间计算机图形学的水平,确实从"小学生 scratch 水平"升级到了"当代图形学入门教材"。尤其是结合他们产品的思路来看,感觉非常有产品可行性,上古 CV 在工业界还是有希望的。失业的 CV 朋友们,别哭了,去看看工业界吧。 2016 年那份:一次"领域平移" 先看旧的那件。CN105844679B《复杂盲文点阵图形绘制和内嵌文字输入的方法及装置》,一家科技公司加一所高校联合申请,2016 年 4 月递交,2018 年 11 月授权,审批走了两年半。 说明书里的背景数据倒是值得一提。按中国残联 2012 年的一份文件,截至 2010 年底全国盲人有 1263 万。可每年出版的盲文出版物只有 140 种左右,还基本都是纯文字。配图不是没有,是要靠出版人员一个点一个点"戳"出来,改一处就得整幅重画。就冲这个背景,这份专利想解决的问题是真存在的。 专利的做法是在普通画布上铺一层"盲文点阵背景格",然后声称能翻译三类内容:曲线、位图、文字。我照着说明书把三类都拆开看了。 贝塞尔曲线。记下起止点加一串"拐点",代进方程,参数 t 步进 0.001,算出 1001 个点,落在哪个格就在哪个格打点。翻译成图形学的说法,就是对参数曲线均匀采样再取整落格,最基础的光栅化,教材课后题那种。细节上有几个地方对不上号。背景写"很多画图工具最多只能绘制二阶贝塞尔曲线",这话在 2016 年就不成立,三次贝塞尔是设计软件和 SVG 几十年的标配。把控制点叫"拐点"也不对,说明书自己都写了曲线"一般不会经过"P1、P2——控制点本来就不在曲线上,跟拐点是两回事。采样点固定在 1001 个,跟曲线长短没关系,落点间距完全不受控。 位图转换。转灰度、裁白边,把 n×n 个像素的平均灰度按比例对应到一个格,低于固定阈值就画点。说白了就是盒式滤波降采样加固定阈值二值化,等于"缩略图转棋盘格"。抖动算法(Floyd–Steinberg、Bayer)和 Otsu 自适应阈值,这些上世纪就成熟的东西一个都没用。摘要里那句"以提取特征点的方式呈现"也经不起琢磨:均值池化恰恰不提取任何特征。审查员引证的那篇基于 Canny 算子的盲用图形论文,做的才是特征提取。摘要把均值池化写成"提取特征点",这属于专利文案的基本操作。 内嵌文字。把字符在 63 个盲文字符里的序数算出来,再和一组十六进制数做按位与,定出 6 个点位。可盲文编码本来就是把低位 6 个比特当点位用的,Unicode 盲文区从 U+2800 起就是这么设计的,这份专利用的内码也是同一套。按位与那一步,无非是把字体渲染里现成的一张查找表,重新描述成了算法步骤。看着像算了一通,其实查表而已。 曲线和位图两条我按专利步骤重演了一遍(图为本文演示,非专利附图): ...

2026年8月17日 · 1 min

第一篇文章:博客上线

博客开张。这篇文章用于验证主站与博客园同步链路。 正文用 Markdown 书写;syndicate: cnblogs 表示这篇文章要自动同步到博客园,删掉这行则只在主站发布。

2026年8月17日 · 1 min