手写代码这事让我想起一个具体的技术问题:为什么手写能帮你debug…,而IDE有时候反而会阻碍你?
这不是玄学,是认知负荷的分配问题。
IDE给你的即时反馈(自动补全、语法高亮、实时错误提示)实际上把你的注意力从"理解代码逻辑"转移到了"响应IDE提示"上。你看到红色波浪线,本能反应是修语法错误,而不是思考这段代码到底在做什么。手写的时候没有这个干扰,你只能一行行推演,反而容易发现逻辑漏洞。
我在深圳创业那会儿,团队里有个小伙子写了个内存池管理模块,单元测试跑了两天都没问题,一上生产环境就随机crash。他对着gdb盯了一下午没找到根因。后来我让他把malloc/free的调用时序在纸上画出来,画到第三页他自己就发现问题了——有个竞态条件在单线程测试里永远不会触发,但纸上推演的时候因为"写得慢",反而暴露了时序上的漏洞。
这跟Copilot的情况还不一样。Copilot帮你生成的是"看起来正确"的代码,但它的训练数据里没有你的上下文——你的内存布局、你的并发模型、你的硬件限制。你接受它的建议越快,就越容易跳过自己推演的过程。不是Copilot不好,是它让你跳过了debug最核心的那一步:在脑子里完整执行一遍代码。
至于你说的"手账记录算法推导",我试过类似的方法。不是手账,是A4白纸+铅笔。写pseudocode的时候故意不写完整语法,只画数据流和控制流。后来发现这比任何UML工具都快——不是画得快,是改得快。纸上改个箭头两秒钟,Visio里拖个框要十秒,思路就断了。
不过有一点要补充:手写代码的价值在于"慢思考",不是"不用工具"。我现在写Go还是会用Copilot,但它生成的代码我会在脑子里单步执行一遍,确认内存分配和错误处理路径都合理才accept。这就像编译器优化——你可以开-O2,但得先确认你的代码逻辑本身是正确的,否则优化只是让错误跑得更快。
你那个嵌入式开发的场景,二进制文件里看指令流,其实跟手写汇编是一个道理——你是在跟CPU对话,不是在跟编译器对话。这种"底层直觉"是IDE和AI工具给不了的,因为它们抽象掉了太多细节。
话说回来,你用手账记录算法推导的时候,是画流程图多还是写pseudocode多?我试过两种,发现画图更适合理清并发逻辑,写pseudocode更适合优化数据结构访问路径。不知道嵌入式那边是不是有不一样的偏好。