先泼盆冷水:这个问题本身问错了
我大概是2018年开始认真学编程的,第一门是 Python。为什么是 Python?因为知乎上有个高赞回答说「Python 语法简单,适合入门」,我就信了。结果装完 Python 3.6 之后,面对一个黑框框愣了十几分钟,敲了 print("hello world") 回车,然后……然后我就不知道该干嘛了。这个过程跟语言选择一毛钱关系都没有。
后来我在一个 QQ 群里问「下一步学什么」,有人说看《笨办法学Python》,有人说直接上 Django,还有人让我去刷 LeetCode。我三个都试了,最后卡在「两数之和」上,因为那时候我连 return 和 print 的区别都没搞明白——我把结果 print 出来了,函数返回 None,测试用例全红,我盯着屏幕怀疑人生。
所以说,Python 还是 JavaScript 这个问题,在你想清楚「我要做什么东西」之前,没有意义。我在三十来个新手身上反复看到同一件事:他们放弃的节点,几乎都不是「这门语言的语法太难了」,而是「我不知道我写这段代码是为了什么」。
硬要比,就摆数据,别摆感觉
如果用一句话概括:Python 让你更快写出「能跑的程序」,JavaScript 让你更快写出「别人能看见的程序」。
语法这块,Python 3.12(2023年10月发布)的错误提示确实改进了不少。你打 pritn("hi"),它现在会给你 NameError: name 'pritn' is not defined. Did you mean: 'print'? 这种带建议的提示。而 Python 更早的版本,包括我用的 3.6,只会给你一句冷冰冰的 NameError。这个改进对新手来说很重要,因为新手最容易在拼写和缩进上栽跟头,而 Python 的 IndentationError 是出了名的折磨——多一个空格少一个空格,程序就不跑。
JavaScript 那边,报错是另一种骂人方式。V8 引擎(Chrome 和 Node 都用它)现在会给你 TypeError: Cannot read properties of undefined (reading 'name'),大概 2021 年之后才改成这个格式,之前是 Cannot read property 'name' of undefined。这个报错我到现在看到还会条件反射地头疼,因为你得往回翻三四行,找到那个 undefined 的变量到底是从哪儿来的。
还有个经典的坑:在 JS 里 [] + {} 得到字符串 "[object Object]",而 {} + [] 在控制台里得到 0(因为 {} 被当成了代码块)。这俩玩意儿你 Google 一下能查到一堆解释,但新手第一次看到基本是懵的。Python 也有自己的怪癖,0.1 + 0.2 不等于 0.3,等于 0.30000000000000004,这是 IEEE 754 浮点数的问题,所有语言都一样,只是 Python 会原原本本把这串数字打给你看。
就业面的话,我没什么权威数据,只说我看到的:招聘网站上 Python 的岗位确实多,但大多挂着「数据」「算法」「后端」这些前缀,对新手门槛不算低;JavaScript 的岗位很多是前端或者全栈,能拿出一个上线的小网页,面试时比背概念有用得多。
真正卡住新手的,是看不懂报错
这是我这些年最笃定的一个观点:编程入门的分水岭,不是语法,不是算法,是你能不能读懂报错信息,并且知道下一步该去哪儿找答案。
我见过太多人一看到满屏红色就关掉编辑器。其实报错信息是有固定套路的,拿 Python 举例,一个典型报错长这样:
Traceback (most recent call last):
File "test.py", line 3, in <module>
print(name)
NameError: name 'name' is not defined
从下往上读:最后一行告诉你错误类型和原因,中间告诉你出错在哪个文件的第几行,最上面那行 Traceback 是调用栈(新手阶段基本可以忽略)。就这么一条规则,我告诉过大概十个人,有七八个人的表情是「啊?还能这么读?」。
JavaScript 也一样,Node 的报错里会有一行 at Object.<anonymous> (/path/to/file.js:5:12),最后的 5:12 就是第5行第12列。知道这个之后,找 bug 的速度能快一大半。
具体到操作,我给新手的建议是:报错的第一行和最后一行先看,中间那堆 at xxx 先跳过。然后把你复制的那段错误,原封不动贴进搜索引擎——注意,是原封不动,不要自己翻译成中文,也不要把变量名删掉。因为变量名往往就是线索,比如 undefined 和 null 引发的报错处理方式完全不同。
我试过的一个节奏,不一定适合所有人
说个我自己验证过的练习方式。我不建议「周末一口气学8小时」,那基本等于白学。我试过连续三周每天早上40分钟,效果远好于周末集中学,原因很简单,第二天早上你会记得昨天卡在哪儿,接着弄,这个过程本身就是在训练「调试肌肉」。
具体怎么练,我大概这么安排:前两周只写命令行小工具,比如把一段文字反转、算个税、读一个 txt 文件统计词频。这些练习不需要任何框架,Python 用标准的 open() 和 collections.Counter 就够了,JS 用 Node 的 fs.readFileSync() 加个正则。第三周开始碰网页,哪怕只是把本地一个 JSON 文件渲染成列表,你也能体会到「我写的东西被别人看见了」的爽感。
有一个工具我强烈推荐 VS Code,不是因为它多好,而是因为它内置了调试器。你在代码行号左边点一下打个红点,按 F5 启动调试,程序会在那一行停下来,你可以把鼠标悬停在变量上看它的值。这个功能我用了两年才知道,此前一直靠 print 和 console.log 硬扛,效率差了不是一点半点。
说点跑题的
写这篇文章的时候我翻了一下自己2019年存的代码,第一个 Python 文件叫 test1.py,里面 27 行代码有 9 行是注释掉的,全是报错之后懒得删的。当时我觉得自己特别蠢,现在看反而觉得挺有意思,因为那 9 行被注释的代码,其实记录了我当时所有的困惑。
所以如果你正在纠结第一门语言选什么,我的答案可能会让你有点扫兴:随便选一个,然后花 30 天把它用来解决一个你自己真正想解决的问题。想自动整理下载文件夹就学 Python,想给自己做个能分享的记账页就学 JavaScript。语言是工具这句话被说烂了,但它确实是真的——我见过最快的一个人,从零到能写爬虫只用了两周,因为他要抢演唱会门票,需求太迫切了。