从2019年10月开始,用了9个月,到今天,终于连拖带拉地学完了Python基础语法和爬虫基础2门小课。虽然自我感觉已经挺用功的了,但如果真如读书那会通过考试来考核的话,估计只能勉强及格。毕竟岁月不饶人,体力和精力上已经有点无法同时应付工作、疫情和如此硬的知识学习。
不过回想当初学习的初心,其实也不是为了去做码农。除了想挑战一下自己,希望继续保持折腾的状态以外,也有点功利的目的,就是锻炼一下逻辑思维,从思维的角度,剖析问题的实质,找到底层普世的方法论。从这个初心角度来看,又可以给自己打90分。
在写完12页的最后一关的笔记,在爬虫课程的最后一个部分,收到了风变内容大拿吴枫写的一封信。看这封信的时候,内心还起了点小波澜。信的标题是《逢山开路与不甘庸碌》。
P.S. 在复制这封信到出来的时候,发现了他的头像(与助教确认过)。哈哈,真有趣。
我也附上自己这一路写下的笔记短视频,为这9个月做一个阶段性小结。(点击以下蓝色字,有好听的民谣。)
9个月的学习成果(可见部分)
最后,对于这9个月以来,陪伴我从“山脚-山腰-山顶”的6位助教,表示感谢。谢谢你们不懈的“温馨(cui ming)”学习提醒,不厌其烦地及时回复我的疑问。(我知道我的有些问题,可能让人产生这样的疑惑,'怎么会有人问这么简单的问题?')
最最后,感谢一下过去9个月的自己。在2020年这个无比魔幻的年份,在保护好自己、完成好各项工作和任务的情况下,坚持学完这些“硬核”知识,持续精进。这9个月的努力也是对“逢山开路、不甘庸碌”的一个诠释吧。
正如爬虫的进阶还有很长的路要走。也许未必会继续走下去,但我想这个劲头我一定会保持下去的。期待更好的下一个9个月。 2020.7.18
逢山开路与不甘庸碌
关于爬虫的故事到此就将告一段落。说出来你可能很难相信,我非常珍惜这段时间和你的相处,这时候,竟有一些些难过。
你可能觉得:吴枫是个遥不可及的人物,我和他素未谋面,从不相识。学习他设计的关卡,和读一本写好的书没区别,和看一个拍好的视频没区别,都是一个“表演者”自顾自地不断输出信息,他不关心也不清楚我在做什么。我和吴枫的交流始终是单向,学习的路上我始终都是孤独。不,事情不是这样。一直以来,你的一颦一笑我都尽收眼底。
我是从未与你相逢,但我知道你在首次用爬虫拿到数据的欣喜,我知道你初次接触BeautifulSoup时候的困惑,我知道你自己写出一个小网页时候的惊叹,我知道你接触协程时的不解……这是因为,你在每一个夜晚写的每一行代码,每一个凌晨敲的每一行Enter,都是数据。这数据,通过网络传递到我眼前,演化、勾勒出一个或皱眉头或展笑颜的你,就仿佛有画面一样。这画面,我一直都在看。
你明白我的文字,我明白你的付出。这段时间累着了,向你道声“辛苦”。这段时间有所收获,向你道声“恭喜”。
最后,我为你留有一封短短的信,讲讲这门课背后的事。
一直以来,我都相信:
每一门学科,都有它的独特气质在里面,它对人影响深远。如果你要做教育,单纯地把知识讲透不够,需要把那种东西表达出来。
古人说“传道授业解惑”中的“传道”,讲的是这样一回事。那么,在“爬虫”这里,有什么是与众不同的?在设计这门课的时候,我咨询过很多身边写爬虫很厉害的前辈:你们平时怎么写爬虫?写爬虫时候,最重要的是什么?他们给了许多种不同的说法,但这些说法都指向同一个答案:
确认目标-分析过程-先面向过程一行行实现代码-代码封装。在这,最重要的是确认目标,最难的是分析过程。
写代码,不过是水到渠成的事。在这个过程里,你会遇到很多困难。但是没关系,遇到困难就去学习,就去查文档,总能够找到解决方案。在编程的世界,几乎没什么是不可能。
正是听到了他们这样的答复,我把关卡设计成了现在的模样:处处都是确认目标-分析过程-代码实现(有时还有代码封装)。这个过程中,我们会遇到困难。那么,我们去学习新的知识,去查文档。而每遇一新知识,我们必要弄个明白它是什么,它应如何使用,实操去使用。为了大家更好地完成最难的“分析过程”,我们提出了爬虫四步:获取数据-解析数据-提取数据-存储数据。最后,还给了一个颇为壮观的流程图,囊盖爬虫工作的全程。
我想,这正是爬虫的这16个关卡所期望表达的东西:
没什么目标是你不可凭努力与智慧实现,没什么困难你不可凭努力与智慧逾越。逢山开路,遇水架桥,不甘庸碌渡一生的人心怀梦想,梦想即目标。
目标即可被分析过程,分析清楚即可被实现。在这个过程中,或许会遇到困难。没关系,困难都能找到解决方案。逢山开路,遇水架桥。
或许你觉着我在讲一个鸡汤的事。不是,我在讲理论,我在讲已发生在你身上的经历。
说是理论,最近一些年,除了技术之外,我浸心于一门叫做“认知心理学”的学科。它所研究的,是人的认知过程。读起来,实在是有趣极了。在这本书里,让我印象最深的一章节,叫做“问题解决”:
讨论的是人是如何解决问题的。最后,得出的一个关键结论是,人类最有效地解决问题方式,是“目标-手段分析法”。
确认目标,一层一层地分解,大问题变一组小问题,每一个小问题都有实现的手段,然后去做就好。事情仿佛就是这样简单。但事情不是这样简单。
我不知道你是否还记得第4关的样子。那时,你刚刚学会BeautifulSoup,你接到一个需求:爬取周杰伦的歌曲信息。你确认目标-分析过程-然后代码实现。突然,事情的结果却在预期之外——没拿到想要的数据。你并不会因此而感到慌张,为什么?因为我们的每一步过程,都是非常清晰地推理得来。我们能很容易定位到问题——一步步反推回去就好。是提取错了吗?检查,不是。是解析错了吗?检查,不是。那定是获取数据错了。我们去重新分析过程:去学习新的知识——XHR,去查文档——解析json数据。同理,当我们所做的事情不及预期,我们可以检查是执行错了吗?不是,那是手段错了吗?如果还不是,那就需要思考,是不是目标制定有问题。
同样的事情发生在我的身上。当我在写这个爬虫关卡,我会思考一个目标:我把这些关卡做到什么程度,你会满意?然后是分析手段:每一个关卡,应该教什么内容,才能最终实现这个目标。
继续分析手段:每一个关卡,应该怎么教,才能教好我想教的内容……一层层拆解,环环相扣,没有一个信息多余,没有一个信息欠缺,最终它们构成你眼前的这副模样。如果你告诉我哪里学得不好,那么我将会反推上述是哪一步做得不好,再将它修正掉。这就是我今日工作的方式。我相信最终,我和我的团队能设计出这个世界上最好的教育解决方案。
坚持这样思考,我相信在你的生活里,一切事物都可以是明确而可实现的。即便出了问题,也能清晰地溯源。你逢山开路,你从不慌张。以上,就是我想要告诉你所有的事情。
在最后,理论上来说一封书信的末尾应是落款。但我不肯落款自己的名姓——因为风变编程发展至今,已经远不是我一个人就能完成所有的工作。你所见的这些关卡,背后有许许多多的人在为它工作,我怎忍独自贪功。你不需要记住他们的名姓,但告诉你他们的名姓却是我的责任。就像是电影的谢幕,下为这份落款名单(略过)。
以上,期待与你再相逢!