瞎聊:避免手握锤子看啥都是钉子

12/Jan/2022 · 1 minute read

前两天在给 TechParty 设计和制作新的官网,选型了上线了作为网站设计和托管的平台。最后的一个大活就是如何将 TechParty 原来的 218 篇博客文章迁移到新的官网上,一站式管理。比较遗憾的是,上线了的博客系统并没有提供编程接口用于迁移已有博客,所以唯一的方式就是自行想办法将所有文章逐一拷贝到他们的富文本编辑器中。

TechParty 旧的博客系统是用的 Jekyll,一种主要使用 markdown 作为协作语言的静态博客站点生成工具,而上线了只支持富文本编辑器,也不支持 markdown,所以大体思路就是直接拷贝 Jekyll 生成好的 TechParty 博客的网页内容到上线了的编辑器中。但是问题是,这里面可是有 218 篇文章呢!不是一个小的工作量,所以作为程序员,第一反应就是尝试能不能将这个过程自动化?

尝试 python + selenium

第一个尝试的方案就是基于 Python + Selenium 的方式来实现整个过程的自动化。整个方案花了一下午大概4个小时的时间,包括解决 pip 依赖安装的问题、如何模拟鼠标长按选中博客文章正文的操作、如何模拟复制、如何模拟人工在上线了编辑器里点击和编辑等,最终整个方案因为无法完美模拟人工点击上线了的各个编辑框(为了进入编辑态,非编辑态时,页面上的各个控件显示为普通的文本)而失败……

人肉复制粘贴

第二天早上,痛定思痛,觉得自动化的路子虽然看起来比较聪明,但是实际上还有一些缺点或者未知问题:

在决定是否改用人工方式之前,我算了道简单的数学题:

很有意思,当我想的是我需要完成 218 篇文章的搬迁的时候,我主观上觉得这是一个人肉操作难以短时间内完成的任务,至少可能要一整天都在干这个事情,除非用程序来自动完成。但是通过分解和评估,事实上不管是3个多小时还是2个小时,我都觉得这时间是要比写代码和调试程序的时间短的,而且结果可控的多:我很确定这是一个纯粹的时间问题,只要无脑操作,一定时间后,这个事情一定会完成,不用担心过程还有没有大的问题。

最终结果:人肉操作完成,用时 2 个小时出头

因为我希望这个事情无论如何,都要尽快完成,所以我用最笨也是最确定的方法:人肉复制粘贴。从 9:45 左右开始,到 12:05 左右完成,中间也处理少量的比如上线了网页崩溃必须刷新之类的问题,如果是继续用原来的脚本的方式,想必这类问题因为还要修改和调试代码会让我抓狂,但是人是最灵活的,所以我人肉操作的话都是顺便的事。尽管顺利完成,但是过程其实很痛苦:特别枯燥乏味,重复的操作多了之后,特别容易犯困。我是一边听着比较嗨的音乐一边抖腿才坚持弄完的。

最后的感悟

这个事情其实很琐碎,但是对我自己挺大感触,记录一下:

  1. 不要拿着锤子看啥都是钉子,你可能需要一把起子:作为程序员,可能习惯于用专业的视角来处理生活中的事情,什么都想要以编程的形式来解决,但是适用性是有前提的:针对问题的程序有很大的复用的价值,比如事情是重复执行的,或者,这个方案可以移植到其他类似的事情上,否则,最笨的方法反而更有效,所以不要排斥那些看起来太笨不够酷的方法,可能它们反倒是最有效的;
  2. 失败也可以有所得,只是可能性价比低:失败了的方案只是一种探索,可以发掘未知,比如我第一次知道了 selenium 的 action chains 可以用来模拟鼠标和键盘操作,这种发现和经验是可以复用的,长期来看可能是有价值的,只是当下对完成任务没有什么帮助
  3. 量化分析,帮助自己绕开情感陷阱:如果一开始我能够直接计算一下人肉操作的时间成本的话,我很可能就不会去尝试其他方案了,因为显然这种本方法确定性高,我早点完成它,我就早点可以投入到其他有价值的事情上,我可以做时间的主人,而不是把时间当成赌注,赌自动化的方案能成功,并且一切顺利;
  4. 把令人畏惧的大目标拆成给我信心的小目标:人肉复制的过程中,我刻意不去关注目前剩余的总的文章数量,这是为了避免给自己造成压力,只专注于眼下某一块的任务就好,告诉自己,只要慢慢完成每一个块就好了。所以往往我们盯着一个很大的目标的时候,我们很容易泄气,但是如果把它拆解成一个个比较小的我们有信心完成的小目标时,我们反倒容易保持专注,最终完成。

我个人最喜欢的两个感悟就是 1 和 3。