文/一个带过几十个新人入门的mentor
每年都有大量的人通过网上的教程写下人生中第一个Hello World。打开搜索引擎,搜”Python入门”,照着教程一步步装好环境,敲下print(“Hello, World!”),运行,看到那行字出现在屏幕上。
然后呢?
大部分人到这里就停了。他们把教程关掉,该干嘛干嘛去了。过了几天偶尔想起来,又觉得”哦我学过编程”,但真要他写个什么东西,连怎么打开编辑器都忘了。
我见过太多这样的人了。每年技术社区的活动上,都有很多人跟我说:”我其实之前学过一点,但后来就没继续了。”
为什么?为什么那个让你兴奋了一瞬间的Hello World,没能把你拽进编程的大门?
你只是”敲”了一遍,不是”学”了一遍
很多人在写Hello World的时候,只是机械地把教程上的代码复制了一遍,或者照着敲了一遍。看到输出,觉得”我成功了”,然后关掉。
他们不知道每一行代码为什么这么写。那个print是什么?括号和引号为什么这样搭配?文件为什么要保存成.py?运行的时候背后发生了什么?
如果你只是照着敲,那跟你用笔抄一遍古诗没有任何区别。你能背下来一首诗不代表你懂诗。你能运行一个Hello World不代表你会编程。
真正有效的学习是:敲完之后,盯着那几行代码发一会儿呆。 问自己几个问题:如果我把Hello改成我的名字会怎样?如果我把括号去掉会报什么错?如果我不保存直接运行会怎样?
然后动手试。改了之后运行,看到不同的结果或者报错,你就在”理解”的路上前进了一小步。
你从来没有”故意搞破坏”过
我带过一个实习生,他学得很认真,教程一步一步跟,代码敲得一丝不苟,从不出错。但一旦遇到任何教程里没写到的场景,他就完全蒙了。
有一次他写一个小脚本,运行的时候报了一个KeyError,他盯着屏幕看了十分钟,问我:”这个错误是什么意思?我照着教程写的,教程里没有这个错。”
我说:”你之前有没有故意把代码改错过?”
他摇头。
我让他把教程里的代码改几个地方——把字典的key改成一个不存在的,把列表索引改成超出范围的,把函数参数少传一个。每一次改完运行,他都看到一个之前没见过的错误。我让他把每个错误信息抄下来,查清楚意思,记在笔记本上。
几天之后,他跟我说:”原来报错没有那么可怕,大多数报错信息就是告诉你’这里少了什么’或者’那里多了什么’。”
从那以后,他再遇到新问题,第一反应不是”教程里没有写”,而是”我哪里可能搞错了”。
这个转变很重要。编程世界里,你遇到的99%的问题都不是”新问题”,而是”你还没见过的老问题”。而第一次见一个错误信息的最佳时机,是你故意制造它的时候,而不是在生产环境里突然撞上的时候。
你还没学会”怎么问问题”
很多人学不会编程,不是因为不够聪明,而是因为不会提问。
他们遇到问题之后,会在群里发一句:”这个怎么弄?”然后等别人把完整的代码发给他。或者更糟——直接把报错信息截图发出来,说”帮我看看”,但截图的框只截了报错最后一行,前面几十行的调用栈全被裁掉了。
真正学编程的人,提问的方式是不同的。他们会在提问之前先自己搜一下,把问题描述清楚:我做了什么操作、期待的结果是什么、实际的结果是什么、我尝试过哪些方法。
我在技术社区里回答过几百个问题,有一个明显的规律:那些提问质量高的人,往往自学能力也强。他们不需要别人喂代码,只需要别人指个方向,自己就能顺着找到答案。而那些”帮我写完”的人,即使你把代码全给他,他下次依然不会写。
你一直在找”最好的教程”,而不是”开始写东西”
还有一个常见的坑:永远在准备,永远在学,但永远不实践。
我看过一个人,硬盘里存了十几个G的编程教程——视频的、PDF的、电子书的、在线课程的。他花了大量时间研究”Python哪个框架最好””前端学Vue还是React””要不要先学算法”。他所有的精力都消耗在”选择”和”比较”上,真正动手写代码的时间加起来不到一个小时。
如果你是这样的人,我建议你立刻停下来。把你硬盘里的所有教程关掉,把浏览器里那些”十大编程语言排行榜”的页面关掉。然后打开你的编辑器,新建一个文件,开始写一个最简单的程序——不是Hello World,而是你能想到的任何东西。
哪怕是一个计算器——输入两个数字,输出它们的和。或者是一个待办事项列表——添加、删除、查看。或者是一个能把你电脑里所有文件名字打印出来的脚本。
是什么不重要。重要的是:你在”做”了。
编程不是看会的,是写会的。你写一百行烂代码,胜过看一百页好教程。因为那一百行烂代码会报错、会跑不通、会别扭,然后你被迫去查、去改、去理解。这个过程才是真正的学习。而看教程,只让你产生”我懂了”的幻觉。
你害怕写出”烂代码”
最后一个问题:很多人写了几行代码之后,去网上看别人写的,觉得自己差太远了,就放弃了。
“别人写的多优雅啊,我怎么写得这么丑。”
“别人的代码只有十行,我的怎么要五十行。”
“别人的思路好清晰,我的像一团乱麻。”
我告诉你一件事:那些你看到的”优雅代码”,绝大多数都是写完之后反复重构了十几遍的。第一版照样乱七八糟。
编程能力从来不是”一次写对”的能力。是”写完,觉得烂,然后一点点改好”的能力。
你写第一个小项目,代码丑、命名乱、逻辑绕,这太正常了。每个程序员都经历过这个阶段。区别只是有些人允许自己”烂着”,然后通过迭代慢慢变好。而有些人看到自己的烂代码就受不了,直接放弃。
所以,给你的Hello World找个下文
如果你现在正站在Hello World的门口,不知道该往哪走——我给你的建议很简单:
关掉这个文章,写一个比Hello World多三行代码的小东西。随便是什么,只要是你自己想出来的就行。
让它出错。看报错信息。自己试着解决。实在解决不了,去搜索,去问人,把问题描述清楚。解决了之后,再加三行新东西。
不要求完美,不求一次成功。就每天写一点,让代码慢慢长起来。
一个月后你回头看,你的Hello World早就被甩在后面了。你惊讶地发现:原来我可以写出一个能用的东西,原来那些报错信息没有我想象的那么可怕,原来我并不是”学不会编程”的那类人。
你从来就不是。你只是还没找到一个正确的开始方式。
而那个方式,就藏在你的下一行代码里。不是屏幕上的那个Hello World,是你接下来主动想去写的任何东西。
去写吧。