logo

鱼肚的博客

Don't Repeat Yourself

引子

最近突然想做一些技术方面的学习。

这种『突然』实际上是经常出现的,像突然想学学琴、突然想健身,突然学门新语言,总会有一段时间突然想要学习一些东西。

然而设想了很多很多,大多无疾而终。

于是我陷入了奇怪的循环之中。

究其原因,我猜测大概还是门槛太高的缘故。给自己设置的目标过高,能挤出的时间又太少,当发现目标越来越难以实现的时候,也就不会真的相信自己能完成目标了。

我设想的解决方案

现在我想到的解决方案就是尽可能地将难度降低,制订一个『小目标』,待其完成之后,再制订下一个『小目标』。

小目标之间,往往也会有较强的相互关联性。

当多个小目标都完成时,往往就会形成一套积累,带来一些收获。

如果能坚持下来,也会逐渐地形成一种持续学习的习惯。

方案的细化

这个方案的关键,就是『小目标』应该如何制订、怎么监督自己有没有完成『小目标』、以及如何保持自己的兴趣。

在控制风险方面,我认为主要就是两个点:

  1. 尽量控制未知的风险。比如开始一个新的项目的时候,尽量选择自己比较熟悉的技术栈。
  2. 当需要使用新的技术栈的时候,应做一个尽可能简单的项目,或重写已经存在的项目。

总结起来就是,不要使用全新的技术涉足全新的领域。

而在监督自己方面,最好的方式其实就是将自己的计划暴露在大众面前,广而告之之下,可以给自己带来一些压力。

而要保持自己的兴趣,做一些自己能用得到的东西,应该是比较有帮助的。

实际的例子

根据上面的分析,要监督自己,最好的方式就是将自己的计划公之于众。使自己接受(假想的)公众的监督。

这样的话,就需要有一个地方持续地更新自己的状态。

微博、Twitter或博客、专栏等都是可以接受的。

因为前一段时间,我用Serverless+Next.js开发了自己的博客系统,所以优先选择在博客上更新,并可通过工具自动同步到Twitter动态上。

而这些持续更新的文档,本身应该有一定的组织关联,既可以以时间线的方式查看,也可以不对整体网站造成干扰。

所以这里我就可以提炼出两个小目标:

  1. 在博客中支持『专栏』
  2. 自动同步更新博客动态到Twitter

评估下它是否符合上面的要求:

  • 不是全新的领域
  • 不是全新的技术
  • 对自己有帮助

无论是在博客中支持『专栏』、或是自动更新博客动态到Twitter,都会涉及到一些小的新技术领域。但是它难点不多,依托于已经有的博客系统,风险是很小的。虽然过程中会用到的一些技术,大概率用后即忘,但是多少也会积累一些经验。

且把它实现了的话,对我展开这个『持续学习』的计划是有帮助的。所以兴趣点比较高。

综上,这种『小目标』可视为合理的『小目标』。

反例

为了警醒自己,我这里也列一个常见的反例。

自从开始做一些前端方面的工作,总是被UglifyJS、Terser等工具的低性能所困扰。

粗略地分析下,UglifyJS、Terser等工具所做的任务,类似于编译器,涉及到复杂的计算,应可认为是CPU密集型任务。Node.js众所周知不太适合CPU密集型的任务,所以我想如果用C++、Rust、Go之类的重写它,应该能得到不错的性能提升。Rust看起来比较好,用它来重写一个吧。

所以这里有一个『小目标』:使用Rust重写terser。

评估下它是否符合要求:

  • 不是全新的领域
  • 不是全新的技术
  • 对自己有帮助

可以看到,仅有『对自己有帮助』一点,可维持兴趣。但是它对我来说是个全新的领域,也是个全新的技术,风险不可控。这种目标不够小,往往会无疾而终。

反倒的正确拆解

如上面说到的反倒,其实我对它也是有兴趣的。那有没有办法把它拆解成合理的『小目标』。

我的主要原则还是那点:『不要使用全新的技术涉足全新的领域』。

所以可将这个目标拆分成两个或更多个『小目标』。

  1. Fork terser项目,并将其代码改成Typescript。这个过程中使用熟悉的技术(TS、JS)来掌握一个全新的领域(JS代码的压缩优化),风险可控。
  2. 使用Rust语言,将上述的Typesciprt项目再重写一遍。这次是在熟悉的领域中,使用新的技术(Rust),风险可控。

综上,新一轮的『突然想做XXX』又开始了!这次我会从『开发博客专栏功能』这个『小目标』开始,逐渐地将我的想法一一实现。

相关过程会持续在我的博客中更新,欢迎(假想的)大家监督。