写代码没那么难
只要我说我会写点程序,对方十有八九会接一句"那你数学一定很好"或者"那我肯定学不会"。这两种反应我都理解,但都不对。写了这些年,我的结论越来越清晰:写代码难的从来不是代码本身,而是"把问题想清楚"。代码只是把想清楚的东西记下来的一种方式而已。这篇文章把我听过的那些劝退说法,一条条拆开回答。
一、那些劝退人的说法,逐条回答
下面这些说法我都听别人说过,也有一两条是我自己当年劝退自己的理由。逐条拆:
if、for、while、return、print,翻来覆去就那几十个。用两周就形成肌肉记忆了。真正有用的不是"认识英文",而是遇到报错能把那行字复制去搜。这个能力跟英语水平关系不大,跟搜索习惯关系很大。二、真正难的是哪一步
很多人以为难在"敲代码"。我实际干下来,时间分布是这样的:
"想清楚要做什么"之所以最难,是因为它没得抄。网上能搜到"怎么写循环",但搜不到"你这件事到底该不该这么拆"。这一步只能靠对问题本身的理解,而理解来自真实场景里的反复接触——这也就是为什么我一直认为,行业经验比代码能力更稀缺。
而"调试"占掉三成,恰恰说明一件事:写不对是常态,不是异常。新手最容易有的误解,是以为"高手都是一次写对的"。真实情况是,所有人都在反复试错,区别只在于试错的速度和找线索的能力,而不是"谁第一次就对了"。
三、一个最小可用的开始
如果现在让你从零开始,我会让你按这个顺序走。核心原则是:每一步都小到能在十分钟内做完并看到结果。
- 选一个真实但你不在乎后果的小任务。比如把一堆截图按日期重命名。别拿工作上的要紧事练手,有压力反而学不动。
- 先只处理一个样本。不要一上来就写循环。先让程序正确地处理"一个"文件、一行数据,把这一件事做对,比让一堆东西一起错有价值。
- 每一步都打印出来看。新手最怕的"程序没反应",八成是因为它其实在正常工作,只是什么都没显示给你看。让程序在每一步都说句话,问题会自己暴露。
- 确认单次逻辑对了,再套循环。这一步几乎是免费的——循环只是把已经跑通的逻辑重复一遍。所以千万别反过来:先写循环再找逻辑的错,那是自找麻烦。
- 每次只改一处,改完立刻跑一次。一次改三处,跑出来不对,你不知道是哪一处导致的。慢就是快。
四、我自己的三个阶段
回头看,我的学习过程大概经历了三个阶段,每个阶段的关键动作完全不同:
- 第一阶段:抄,然后改。照着现成的示例一字不差地敲一遍,跑通;然后把里面的数据换成我自己的,再跑一遍;再改一个参数,看结果怎么变。这个阶段的目标不是"理解",是"建立手感"——知道程序大概长什么样、改一个字会发生什么。
- 第二阶段:拆别人的例子。找到一个能解决类似问题的现成例子,把它拆成几块,一块块删掉看还跑不跑得起来。删掉哪块它就不工作了,那块就是关键。这个动作比读十篇文章都能建立"因果感"。
- 第三阶段:从自己的麻烦出发。不再照着现成的题目练,而是每天遇到重复劳动的时候问自己一句"这个能不能写成脚本"。这个阶段之后,学习就从"我要学编程"变成"我要解决这个问题"。而后者是能持续下去的。
绝大多数人卡在第一阶段就放弃了,原因通常是方向错了:他们以为要先把所有语法学完才能动手,于是一直停在"学"的状态,迟迟等不到"做出来"的那一刻。而那个"做出来"的瞬间,才是真正让人留下来的东西。
五、报错其实是好事
新手看到满屏报错会慌,我的感觉正好相反:报错说明程序在告诉你它卡在哪了。真正让人头疼的是"没报错,但结果就是不对"——那种情况才需要一步步自己排查。
读报错我有一套固定动作:
- 先看最后一行。绝大多数语言的报错,最关键的信息在最后一行——错误的类型和简短说明。
- 再往上找第一处提到我自己代码的地方。报错里往上有大段是底层调用,对你没用。找到第一个出现你文件名的行,那通常就是肇事点。
- 看行号,去那一行看。不要凭印象猜位置,直接跳过去看那一行的实际内容。
- 把那句话复制去搜。十次里有八次,别人早就踩过同一个坑,而且答案就在第一条结果里。
还有一条我想早点知道的事:报错信息里的每一句话都是有意义的,不是随机乱码。刚开始看不懂很正常,但"觉得它在胡说"是不对的。看不懂的时候,把整段贴去搜,比盯着它发呆强一万倍。
所以,难的是什么
写代码这件事,我现在的描述是这样:它不难在语法,不难在数学,也不难在英语,它难在"把一件模糊的事,拆成机器能执行的明确步骤"。
而这个能力不只在编程里有。把一件事交代清楚、把流程写明白、把复杂任务拆成清单——这些日常能力就是它的本体。所以与其说"学写代码",不如说是在练一种把事情说清楚的功夫。代码只是这种功夫的副产品。
别把它想成一场考试。它更像搭积木:先让一块站住,再往上面加。真正要想清楚的是搭什么,而不是积木怎么摆。