题图来自于NextDay
最近在迁移一个博客,静态页面框架选择了 如何用 GitHub 搭建个人博客 中提到的 Jekyll,页面很快就生成好了,那么剩下的问题就是博客里的文章了。
由于有一部分文章原先发在第三方网站,也就几十篇,复制粘贴搬运一下,工作量不小,但也能接受。当我按下 Ctrl+A 然后 Ctrl+C 的时候,才突然意识到文中贴图该怎么办,存下来再上传,想想就脑壳疼。
所以说程序员是这世上最懒的人,我决定把这个“脏活累活”交给计算机去做。大概想了一下,从网页上把文章爬下来,然后转成 Jekyll 所需的 Markdown 格式(参见 每个人都应该去学的语法 ),想想应该工作量不大。
但通常,「想想应该工作量不大」这个念头的出现暗藏玄机🤦♀️, 果不其然,开启了 Yak Shaving 模式,我真是太喜欢这个词了,请允许我再次贴一下它的出处(参见 造轮子还是用轮子):
何为 yak shaving ?
要去买个水管,得开车出去;但路上要交过桥费;为了避免交过桥费,得去跟邻居借张通行卡;但邻居是不会把卡借给我的,因为前些时候跟他家借的枕头还没还给他;但枕头里的棉絮掉了不少,你得找些替代品填充回去,才敢还给人家;哪里找填充物?去动物园撸 yak (牦牛)身上的毛。所以,为了去买水管,得先去动物园撸 yak 毛。
原本以为可以在一个 URL 里全部爬完,结果分了几十个 URL。然后又因为要保留原始格式及图片链接,爬取的内容是文章的 HTML 代码。
爬下来的数据保存为 CSV 文件,而 CSV 默认对于 HTML 代码中的双引号是会转义的,如果用平常的方法读取会报错,于是需要另外写一个读取的方法。
处理完成之后呢,将 CSV 中每一行按照标题、日期存为一个个的 HTML 文件,然后又发现 HTML 代码中有一些不需要保留的标签,需要过滤掉。
这一步倒出乎意料算是顺利,因为在 GitHub 上找到了造好的轮子,只是出现一点点小插曲,加入 Jekyll 需要的标签的时候,误加了几个 Tab,导致 Markdown 读取出错,修改后重新生成即可。
在静态博客中,文章分了几个大类,每个类别都需要归到不同的文件夹,于是又写了段把 Markdown 根据文件名中标签分到不同文件夹的代码。
至此,「想想工作量不大」的迁移工作才算是做完了。原本以为就是简单的三步,爬——存——转,但事实往往是,中间会出现各种各样事先未能预见的问题,不解决就会卡住后面的进程,只能硬着头皮逐个击破,即便出现了没碰到的问题,也要找到方法把它给解决掉,每当此时我总是会非常感恩自己不撞南墙不回头的“耐性”(˶‾᷄ ⁻̫ ‾᷅˵)
写这样一段代码前后耗费了我几乎半天的时间,有人会说,按这进度,手工复制粘贴也做完了吧?的确有可能,如果手速足够快的话。但复制粘贴就只是复制粘贴,除此之外,再无其他,下次再遇到,还是复制粘贴,永无止境的复制粘贴。
这次花了不太划算的时间去做了一件看上去并没有太大意义的事,事实真的是这样吗?代码只需要稍许修改就可以另作他用,其他第三方网站,只需修改爬取那段的代码,「CSV 转 HTML 」 以及「HTML 转 Markdown」都可以复用。所以即便这次也许从时间上“输”给了「复制粘贴」,中间的几次 Yak 也的确让人抓狂,但我一点儿都不后悔,为什么呢?
除了这段代码可以复用,更多的是因为,经常写这种小工具,让我竟有了一种“无所不能”的错觉,倒不是真的可以强大到解决一切问题,而是意识到,通过技术手段去解决问题已经成为很自然的举动,就像是条件反射一样。就像是某童鞋说我说过最🐂的一句话就是「类似这种的 APP 你有没有看到过?没有的话我就自己写一个」
碰到麻烦的事儿,写一段代码吧
懒癌犯了,写一段代码吧
这个功能还没人写过?写一段代码吧
这个问题很有意思,写一段代码吧
在程序员的世界里,没有代码不能解决的问题,如果不行,就再来一段。
写代码是一件会上瘾的事儿,尤其是当你发现工作生活中很多问题可以用代码去解决的时候,就会把写代码这件事儿变得像呼吸一样自然。而且写代码有一种自发的激励机制,看到自己写的代码运行起来,达到预期的效果,从此以后更是信心满满了呢。而当你写得越多,就会变得越高效,越高效就会去追求更高级的代码,形成一种良性循环。
不止是写代码,学习其他技能都是同理,你需要持续给自己正向的反馈,才能让自己充满乐趣地继续前行,所以「快乐学习」这件事真的是存在的,自发的想要去学会某种技能。但「持续给自己正向反馈」这件事并没有那么容易,还是拿写代码为例吧,最近刚好看到好几篇讲编程学习的文章,似乎都在强调编程思维的重要性,而不是跑上来先是灌输一通语法要义。就像是学习一门外语,我始终觉得先说起来先看懂,远比先掌握语法来得更有效,只有当你实际运用起来了,才会有兴趣或者有机会去了解语法这类的理论知识。就像是「心法」和「招式」,如果招式一窍不通,跑上来就练习心法,大概也会不知所云吧。
但最终能力的提升当然还是要依赖「心法」,就比如你想成为一个高级程序员,就必须熟悉底层逻辑,比如作为 Java 程序员,如果你对 JVM 一无所知,那很多棘手的问题都会毫无头绪。但这些的前提是,你“想”成为一个高级程序员,也就是说,此前的磨练没有让你丧失学习的兴趣以及动力。
我想,如果让我开一门课讲 Java,大概不会遵循这种我们都习以为常的目录形式:
Java基础语法
Java 对象与类
Java 基本数据类型
Java 变量类型
Java 循环结构
Java 条件语句
……
我大概会,一跑上来,不管三七二十一,先让你写一个小工具,可以搜索引擎,可以请教他人,只要你写出来并跑出结果,然后我们再来谈语法和运行机制什么的,如果你是 Java 初学者,会觉得有意思吗?还是觉得简直是不可能完成的任务,我是来学习 Java 的,除了 Java 这四个字母外,我一无所知,要怎么去用一个完全不知道怎么写的语言来写一个小工具,是什么神操作?!
掰手指算了下,除了学校里正儿八经学过的 C 语言,其他的语言 Java、JavaScript、Python,Perl,Dart,NodeJs,还真的都是这样的神操作过来的。但这样的学习方式也存在一个很危险的问题,就是当你熟悉了招式,即,可以用这门语言实际去实现一些功能的时候,相当于踏入了一个小小的舒适圈,这时候如果不及时提醒自己去修炼一下心法,去了解程序运行的机制和底层逻辑,很可能就在「只追求招式」的路上越走越远,毕竟这是一条相对容易的路,那么就真的只能停留在“码农”的层次,很难踏入「资深」的级别。
找到一种适合自己的可持续的学习方式,本身也是一个漫长的适应和学习的过程。(对,这又是一篇骗你们去学编程的文( ̀⌄ ́)
魔都又开始下雨了,天气又变得阴冷了,感冒多发季节,大家要保重身体啊。
旧文参考:
发送给作者