​在真正开始学 Python 前,我曾犹豫很久。犹豫不在于难度,也不在于要花的时间,它只在于:学以后拿来做什么。朋友圈里固然有铺天盖地的广告,但对于我,它们统统都只是在削足适履。

后来 edX 上开课了。我在最后时分跳上船。课程挺有难度,概念翻江倒海,辛苦但也有趣。可我总是在挂念最初的问题:学出来,用到哪里。

第一个用户

这个问题在某一时刻终于有了让我雀跃的答案。起因是在一次吃饭时我问朋友,工作里有没有啥事无聊又重复,不想做却又不得不做?朋友是证券分析师,想了想,说每年财报季都要做模型,数据要从年报上摘录,于是每次都要从 PDF 复制黏贴到 Excel,总要浪费好一段时间。

尽管那时的我连库都还没碰过,但是突然就很兴奋,一下子提起了写段脚本,帮人省下这数小时的冲动。兴奋感上来,那一餐我还硬请了客。

谁知我最开始实现的却并非这个需求。而是工作上一个更迫切的事儿。那时公司开始做视频,短时间内,大量的音频要转文字。音频多是粤语,而市场上的成熟软件,都还没做粤语支持。

在搜索过程中,我找到了 Google 云,然后惊喜地发现,它面向开发者的测试版,支持上百种的语言转换。但那时我还不是开发者,没有安装过 SDK,连 Token 都还没有申请过。

△ Google 的云平台还提供了好多奇奇怪怪的功能。大都可以免费使用。

但是问题不大。安装 SDK 就好了;成为开发者就好了;申请 Token 就好了。嗯,这里只是三言两语,但中间当然有许多波折。但尝试新东西,本来就是这样的。

搭好环境,照着官方开发文档,抄了小几十行代码,然后边改边试。终于,在数次忍住想砸电脑的冲动后,程序跑通了。

不夸张地讲,那一刻脑袋里像是在放烟花,特别高兴。效果也是立竿见影,上传录音文件,摁一下开始,等几分钟,就能完成所有的转录。尽管粤语转换还不支持标点,但已然省了一小时无聊的听录。

我于是兴致勃勃地向同事推销,然后,第二次他们多半会主动来找我。

年报摘录的事随后也完成了。不得不说,我错误估计了难度,同时也高估了自己的水平:凭我的本事,从头做根本搞不定。

天真的我。

但其实呢,根本也用不着从头写,要完成这事儿,其实只是调用几个库的事情。具体而言,是 pdfplumber 跟 openpyxl。

同样没几行的代码,输入页码,点一下开始,三张表转瞬就摘下。不过作为菜鸟我到现在还不会封装,所以帮忙还得开手动档。但我还是很高兴:因为这点小破烂真的对人有用。更高兴的是别的朋友听说后也来找我要,也用得上。

△ 数了数,真就四十行不到。

真的,这点开心和高兴,最能成为学习的内在动力。学习新东西,有时确实会难到想放弃,烦到想放弃,但只要曾有过这样的开心和高兴,那我就可以忍耐久一点。

在完成上述几项的同时,我也陆续学完了 6.00.2x,还考了个不错分数。但分数已经不重要了。那张证书也不重要。重要的是它已经向我证明:它确实对我有用。

△ 考试是真的水,动态规划的题点明了毋需用动态规划。整门课最不喜欢的地方就在这里。

编程的伙伴们

以解决问题为目标的学习,通常会很累。因为在教学环境,所有问题都有参考答案,不会还可以上论坛和助教讨论。但当开始独立求索问题,孤独几乎是必经之路。很多时候,你都身处茫茫互联网,独自大海捞针。

我有不少程序员朋友。但问题是,他们并没有义务充当我的客服;有意愿去学的朋友也不少,但很多都只是长期停留在有意愿。

所以尽管通讯录上人不少,但我找不到什么伙伴。不仅在提问时没啥合适的讨论对象,就算最后自问自答了,那些欣喜也无人分享。一段代码贴到群里通常只会导致冷场,一片寂静。

但就和做算法题一样,这件事本身就是寻找问题的解。问题是问:那个群体在哪里?解答则是:努力混进去。

我问过身边一些程序员,但人家要不是系友群,要不是同事群,我真要混进去也奇怪。有个在脸书的哥们说在力扣上刷完三题就拉我,但后来我写超一百道了,也没有拉我。

△ 虽然吧,绝大部分都是简单题。老脸一红。

那就换条思路。我开始在知乎和公众号来回跑,关注了好些号,进了好些粉丝群,又退了好多群,取关了好些号。

因为没有什么合适的。要么就是群里大部分人仍在问:学习什么语言好?推荐有什么书?要么就是问的人多,答的人少,群聊慢慢变得死寂。

但俗话说得好,瞎猫总能碰上死耗子。只要敢群发表白,那总有不长眼的。终于,误打误撞着加到了个群,大家都在分享,群主也有努力运营。

后来总结原因,可能是当初吸引我的那篇文章就挺硬核,讲的是网络通信原理,能看得下去并拉到底的,多少都会懂一些。

我很喜欢那个群里的氛围。尽管群里的老哥多数都是用 Java 或 C,聊的也是业界才会碰上的东西,像是高并发或者低耦合,但在群里能讨论问题。

印象挺深的两次,一次是问为什么微信群名里禁用大于(>)、小于(<)还有斜杠(/),一句话就给我点明白了,可能是在前端这能引发跳转(</>);再一次是在 Python 里将负数开三次方根开出虚数,以我高中的数学水平,完全莫名其妙,后来经群友循循善诱,终于弄清是复平面和极坐标问题。

△ 这是群友当时用 MATLAB 给我画的图,我很感动。

是,这些问题的答案网上一定会有,因为以我的水平,根本就问不出能够超纲的问题。但是,有人肯同你实时讨论,就没有那么孤独。

我终于找到了一些伙伴。

心态崩了是正常操作

然而,再怎样强调伙伴的价值,我都希望能够自己亲手解决问题。我不会想要总是烦人;我不会想要总把讨论变成单方面的提问;我总是想要自己搞明白。

于是那就牵涉到一个十分严肃的话题:心态。因为编程这件事,就是一直搞你心态,一直一直搞你心态。

每个程序员都有过 bug 改到痛不欲生的夜晚。而我作为菜鸟,该踩的坑,一个不落。比如不区分深拷贝和浅拷贝;比如在循环列表的同时作修改。后者曾卡了整整我一周末,到周一终于搞明白了,愤而把签名改作「Never matate a list while iterating over it!!!」好几天。

△ 后来我才发现,其实我是学过的。但是光上课听过没用啊,有的真是吃过亏才知道痛。

这些,都是必经之路。你唯有一边揉着自己的黑眼圈,一边反复和自己说:淡定、淡定。

但人也真是很奇妙,尽管有时会困扰到茶饭不思、会在半梦半醒中仍想题,你也不都是烦躁的。在烦躁的同时是沉迷,而在想明白的那一刻,真的,一切都是值得的。

因为菜得可以,所以这种从痛苦到喜悦的转换,我经历过许多次。从二分、贪心,到递归、动态规划,都既让我痛苦,也让我快乐。有句歌词叫 If the high was worth the pain,我的感受与之相近。

这种快乐,来自拨云见日。是当历经辛苦以后,算法背后的秩序与美,终于呈现在眼前。

像是递归,不断在缩小问题,又每步都在逼进问题的解;像是二分,不断分割空间,然后迅速丢弃。

而它们与生活也密切相关。像是经典的图论问题「旅行商难题」,本身就源自生活。像是动态规划中的背包问题,完全可以用来治选择犹豫症。因为那本质就是在求解满足约束条件时的最大效用。

△ 在做旅行规划时,你就会碰上旅行商问题,这是可以不用头疼,而用算法求解的。尽管未必是最优解。

纪伯伦说,我们的生活本身就是在寻找美,其他都是形形色色的等待。而王安石则说:世之奇伟瑰怪非常之观,常在于险远,而人之所罕至焉。

攀登绝不仅是因为山在那里,而是因为无限风光在险峰。
 

然而,就算知道山顶处有美,过程中怀着怎样的心态,仍旧复杂难明。是烦闷焦躁还是沉迷其中,是一道很重要的选择题,也是一个很关键的岔路口。

送你一些材料

我在入门的前后的心理波动,大致如同上述。有点虚头巴脑,但很重要。因为学习材料大把,而摸清自己的需求所在,应付孤独,调整心态,才是真正的难题。

是比「我二十八了学编程晚不晚」重要得多的问题,因为能用上,就不晚;也是比「学哪门语言才好」重要得多的问题,因为用以编程的语言,归根结底都是逻辑。是选择、循环和跳转。

当然,这里还是建议亲从 Python 学起,因为真的容易上手。

最后补充一些材料吧。

一、引我入门的两门课,edX 平台上的 6.00.1x 和 6.00.2x。前者叫 Introduction to Computer Science and Programming Using Python,后者叫 Introduction to Computational Thinking and Data Science。

两者都是 MIT 给本科生开设的入门课,英文授课,有字幕,有讲义,可以不花钱。英文有困难,但相比于真正要理解的抽象概念例如递归,英文又显得不算很难。

△ 课程上完后,我仍时常回头翻看。有的概念当时不理解,事后慢慢才理解,递归就是这样。

这两门课,我无法用言语表达喜爱,只想说,结课后我很不舍。两位教授充满魅力,举重若轻,虽然演示时常常笔误,但是情人眼里出西施,那些错误,反而让我觉得真实到可爱。
 

前一门课把基础概念讲到透,后一门课,上了大作业。都是很有趣的题。一道是设计扫地机器人的行走算法,一道是模拟病人身上病毒的自我复制,并加入了抗药性模拟。很好玩,做完后我又自己修改条件玩了好久。

△ 这是学上手后自己模拟马尔科夫过程,用以验证书里读到的结论。

但老实说,挺难的。不过,根据我的切身体会,倘若努力思考、努力完成,那在实践中,基本就能理解「面向对象编程」是怎么一回事了。这个概念,其实也是新手的难关之一。
 

二、PythonTutor。这是在编码过程中我打开最多的网页。没啥别的功能,就是把计算机如何一步步执行你的代码给可视化。你可能很难想象这会带来多少帮助。曾经的我也很难想象。

三、Google。Google 太好用。因为整个互联网,都遍布着前人的足迹。搜着搜着,你就会发现自己其实并没有遇上什么新问题。答案都已经在那里。在 Github/StackOverflow/W3school/Geeksforgeeks 等等等等散布,而它们又都被 Google 的爬虫索引到了一起。

四、YouTube。同样好用到哭。这里拿点更好玩儿的来举例。记得有次看些奇怪东西看到「三相点」和「超临界流体」,在 YouTube 上顺手一搜,真的看到碗一边在结冰一边在沸腾的水。超临界流体也有,那是物质在特定温度和压强下的奇妙状态,难以形容。这里安利给你 Neils Red 频道。

△ 这碗水在结冰的同时也在沸腾。

五、两本足以激发兴趣的书。Algorithms to live byCode。前者尤不推荐译本,那根本不是在翻译,而是在加密。例如居然把 The Zen of Python 给翻成「蛇宗三字经」,机翻都不至于这样(顺便安利一手 deepl.com)。但这两本书本身都异常有趣,有趣到让人念念不忘,一直回响。

△ 另一本的中文名叫《编码:隐匿在计算机软硬件背后的语言》。

材料实在是数之不尽。操作系统、网络原理、数据库、数据结构、算法,每门课的材料都数不尽。入门以后,你会形成自己的判断力。

我还是觉得,只要弄清楚目的,找到伙伴,磨练好心态,那么,编程这件事算不上难。在诸多学习中,它其实最接近游戏,反馈最即时,最容易知道自己哪里犯错,也最容易感到快乐——在你第一次独立写出一段程序的时候。关于这点,我在力扣上看到很多。

好啦,这世上的无聊事已经足够多,所以假若有幸,你也能在此找到热情,那么,请千万不要错过。

2
1