冬日里的一次 Yak Shaving

花火田丁 花火田丁 2019-12-21 06:13:43 +0000

题图来自于NextDay


最近在迁移一个博客,静态页面框架选择了 如何用 GitHub 搭建个人博客 中提到的 Jekyll,页面很快就生成好了,那么剩下的问题就是博客里的文章了。

由于有一部分文章原先发在第三方网站,也就几十篇,复制粘贴搬运一下,工作量不小,但也能接受。当我按下 Ctrl+A 然后 Ctrl+C 的时候,才突然意识到文中贴图该怎么办,存下来再上传,想想就脑壳疼。

所以说程序员是这世上最懒的人,我决定把这个“脏活累活”交给计算机去做。大概想了一下,从网页上把文章爬下来,然后转成 Jekyll 所需的 Markdown 格式(参见 每个人都应该去学的语法 ),想想应该工作量不大。

但通常,「想想应该工作量不大」这个念头的出现暗藏玄机🤦‍♀️, 果不其然,开启了 Yak Shaving 模式,我真是太喜欢这个词了,请允许我再次贴一下它的出处(参见 造轮子还是用轮子):

何为 yak shaving ?

要去买个水管,得开车出去;但路上要交过桥费;为了避免交过桥费,得去跟邻居借张通行卡;但邻居是不会把卡借给我的,因为前些时候跟他家借的枕头还没还给他;但枕头里的棉絮掉了不少,你得找些替代品填充回去,才敢还给人家;哪里找填充物?去动物园撸 yak (牦牛)身上的毛。所以,为了去买水管,得先去动物园撸 yak 毛。

Yak 1:爬网页

原本以为可以在一个 URL 里全部爬完,结果分了几十个 URL。然后又因为要保留原始格式及图片链接,爬取的内容是文章的 HTML 代码。

Yak 2:处理 CSV 文件

爬下来的数据保存为 CSV 文件,而 CSV 默认对于 HTML 代码中的双引号是会转义的,如果用平常的方法读取会报错,于是需要另外写一个读取的方法。

Yak 3:CSV To HTML

处理完成之后呢,将 CSV 中每一行按照标题、日期存为一个个的 HTML 文件,然后又发现 HTML 代码中有一些不需要保留的标签,需要过滤掉。

Yak 4:HTML To Markdown

这一步倒出乎意料算是顺利,因为在 GitHub 上找到了造好的轮子,只是出现一点点小插曲,加入 Jekyll 需要的标签的时候,误加了几个 Tab,导致 Markdown 读取出错,修改后重新生成即可。

Yak 5:给 Markdown 分类

在静态博客中,文章分了几个大类,每个类别都需要归到不同的文件夹,于是又写了段把 Markdown 根据文件名中标签分到不同文件夹的代码。

至此,「想想工作量不大」的迁移工作才算是做完了。原本以为就是简单的三步,爬——存——转,但事实往往是,中间会出现各种各样事先未能预见的问题,不解决就会卡住后面的进程,只能硬着头皮逐个击破,即便出现了没碰到的问题,也要找到方法把它给解决掉,每当此时我总是会非常感恩自己不撞南墙不回头的“耐性”(˶‾᷄ ⁻̫ ‾᷅˵)

写这样一段代码前后耗费了我几乎半天的时间,有人会说,按这进度,手工复制粘贴也做完了吧?的确有可能,如果手速足够快的话。但复制粘贴就只是复制粘贴,除此之外,再无其他,下次再遇到,还是复制粘贴,永无止境的复制粘贴。

这次花了不太划算的时间去做了一件看上去并没有太大意义的事,事实真的是这样吗?代码只需要稍许修改就可以另作他用,其他第三方网站,只需修改爬取那段的代码,「CSV 转 HTML 」 以及「HTML 转 Markdown」都可以复用。所以即便这次也许从时间上“输”给了「复制粘贴」,中间的几次 Yak 也的确让人抓狂,但我一点儿都不后悔,为什么呢?

除了这段代码可以复用,更多的是因为,经常写这种小工具,让我竟有了一种“无所不能”的错觉,倒不是真的可以强大到解决一切问题,而是意识到,通过技术手段去解决问题已经成为很自然的举动,就像是条件反射一样。就像是某童鞋说我说过最🐂的一句话就是「类似这种的 APP 你有没有看到过?没有的话我就自己写一个」

碰到麻烦的事儿,写一段代码吧

懒癌犯了,写一段代码吧

这个功能还没人写过?写一段代码吧

这个问题很有意思,写一段代码吧

在程序员的世界里,没有代码不能解决的问题,如果不行,就再来一段。

写代码是一件会上瘾的事儿,尤其是当你发现工作生活中很多问题可以用代码去解决的时候,就会把写代码这件事儿变得像呼吸一样自然。而且写代码有一种自发的激励机制,看到自己写的代码运行起来,达到预期的效果,从此以后更是信心满满了呢。而当你写得越多,就会变得越高效,越高效就会去追求更高级的代码,形成一种良性循环。

不止是写代码,学习其他技能都是同理,你需要持续给自己正向的反馈,才能让自己充满乐趣地继续前行,所以「快乐学习」这件事真的是存在的,自发的想要去学会某种技能。但「持续给自己正向反馈」这件事并没有那么容易,还是拿写代码为例吧,最近刚好看到好几篇讲编程学习的文章,似乎都在强调编程思维的重要性,而不是跑上来先是灌输一通语法要义。就像是学习一门外语,我始终觉得先说起来先看懂,远比先掌握语法来得更有效,只有当你实际运用起来了,才会有兴趣或者有机会去了解语法这类的理论知识。就像是「心法」和「招式」,如果招式一窍不通,跑上来就练习心法,大概也会不知所云吧。

但最终能力的提升当然还是要依赖「心法」,就比如你想成为一个高级程序员,就必须熟悉底层逻辑,比如作为 Java 程序员,如果你对 JVM 一无所知,那很多棘手的问题都会毫无头绪。但这些的前提是,你“想”成为一个高级程序员,也就是说,此前的磨练没有让你丧失学习的兴趣以及动力。

我想,如果让我开一门课讲 Java,大概不会遵循这种我们都习以为常的目录形式:

  1. Java基础语法

  2. Java 对象与类

  3. Java 基本数据类型

  4. Java 变量类型

  5. Java 循环结构

  6. Java 条件语句

  7. ……


我大概会,一跑上来,不管三七二十一,先让你写一个小工具,可以搜索引擎,可以请教他人,只要你写出来并跑出结果,然后我们再来谈语法和运行机制什么的,如果你是 Java 初学者,会觉得有意思吗?还是觉得简直是不可能完成的任务,我是来学习 Java 的,除了 Java 这四个字母外,我一无所知,要怎么去用一个完全不知道怎么写的语言来写一个小工具,是什么神操作?!

掰手指算了下,除了学校里正儿八经学过的 C 语言,其他的语言 Java、JavaScript、Python,Perl,Dart,NodeJs,还真的都是这样的神操作过来的。但这样的学习方式也存在一个很危险的问题,就是当你熟悉了招式,即,可以用这门语言实际去实现一些功能的时候,相当于踏入了一个小小的舒适圈,这时候如果不及时提醒自己去修炼一下心法,去了解程序运行的机制和底层逻辑,很可能就在「只追求招式」的路上越走越远,毕竟这是一条相对容易的路,那么就真的只能停留在“码农”的层次,很难踏入「资深」的级别。

找到一种适合自己的可持续的学习方式,本身也是一个漫长的适应和学习的过程。(对,这又是一篇骗你们去学编程的文( ̀⌄ ́)

魔都又开始下雨了,天气又变得阴冷了,感冒多发季节,大家要保重身体啊。

旧文参考:

如何用 GitHub 搭建个人博客

造轮子还是用轮子

每个人都应该去学的语法

找到适合自己的「Hello, World」

往前一小步


撒欢吧
谈理想
聊人生
讲故事
相对论
花火田丁
微信号:huahuoding
花火田丁
不折腾不人生