2018 过去了

又到了一年一度年终总结的时候。

技能树

Scala

2018 年最大的进步,莫过于点亮 Scala 这个技能了。

Kafka 分布式消息队列有一些非常厉害的特性,一直以来都想看看 Kafka 的源码,了解其实现原理,但是因为对 Scala 一窍不通,最终还是放弃了。Scala 是属于 Java 阵营的,作为一名 C++阵营的程序员,始终有点排斥 Scala。2018 年初,工作上需要使用 spark,又多了一个学习 scala 的理由,那就干脆就好好学一下吧。虽然我没有任何的 Java 基础,但是学习 Scala 基本上没有什么障碍。反而很愉快的发现,因为有 Haskell 的基础,很多概念一点就通。

Scala 最吸引我的地方,在于它很好的结合了函数式编程和实际应用场景。在函数式编程上,Haskell 一定是最牛逼的。但是作为一门偏向学术派的语言,很难找到实际应用场景。在 Haskell 中是完全写不出 imperative 范式的程序的,入门的门槛非常高,导致 Haskell 的用户很少,可以用凤毛麟角来形容。Scala 则完全不同,既能支持 Functional 范式也能支持 Imperative 范式。这决定了它的用户要比 Haskell 多的多,也就意味着一定能在实际业务中使用。

Haskell 之所以难以掌握,就是因为学了也没有地方用,过一段时间就忘了。没有实际应用,也很难理解 Functional Programming 的好处。更有深远意义的是,Scala 让我在学习 Functional Programming 上花的时间有了回报。

写 Scala 代码是种非常愉悦的体验,以至于我宁愿少写点 C++多写点 Scala。使用 Emacs 编辑器,安装 Ensime 插件,就可以非常完美地实现代码跳转,文档查询,代码自动补全等等这些功能。作为 Emacs 的老用户,我从未有过这样完美的体验。之所以能实现这么完美的功能,都是因为 Java 的功劳,所依赖的 jar 包都在本地,相关的类、函数、接口都一清二楚。

对于 Scala,不同的人写出的代码是可以完全不一样的。不仅仅是指风格上的不同,而是范式上的不同。当把一些非常繁琐的逻辑,使用 functional programming 的范式表达出来的时候,内心是非常骄傲的。这也是 Scala 愉悦体验的一部分。

对于具体的技术而言,生命周期一定是有限的。现在热门的技术很可能过几年就消亡了,比如 Flash。眼下解决某些问题非常完美的解决方案,在几年后可能就无法应对新的挑战,比如 Mysql 在分布式场景下的困境。但是, 更高维度的科学和技术,一定会对整个产业持续地产生深远的影响 。比如算法,无论硬件多么发达,在面临更复杂的问题时,必然存在性能上的瓶颈,为了提高效率,不得不设计更高效的算法。Functional Programming 也在此列。在这些方向上投资,我觉得是更有价值的。

如何学习?

2018 年总结出几个关于“如何学习”的经验。

自顶向下优于自底向上 。对于某个具体的问题,之前的习惯是直接搜答案。因为同样的问题可能很多人都遇到过,搜下解决方案,可能是最快的方法。今年发现效果其实并不好,反思之前的经历,这反而是弊大于利的做法。

  • 某个具体的点,可能知道答案了,但是缺乏体系的认识。

  • 虽然解决了眼下的问题,但是下次遇到其他有关的问题,依然束手无策。

  • 知道怎么做,但是不知道为什么。

  • 具体的点解决的越多,自己越是迷惑。

  • 搜到的这些答案也不一定正确。

这种从具体的点出发,进而掌握全部的方法,我把它称作“自底向上”。与之相反的则是“自顶向下”。对于一个特定的问题,先去仔细阅读一遍官方文档,把概念理清楚,搞明白“是什么”和“为什么”。然后再来考虑如何解决具体的问题,而不是直接搜答案。虽然看起来会非常的缓慢,但就我个人经验来说,总体效率上,这绝对比自底向上的方法快得多。开始阶段花的时间是 n 倍的,但是花这些时间所获得的知识,在解决其他的问题上是有巨大的帮助的。甚至,原来认为是问题的,都变成“显而易见”了。

借助于“自顶向下”的方法,我甚至搞明白了很多困扰已久的问题。所以我强烈推荐这种方法。

成长和进步,一定是痛苦的 。是的,就这么简单的道理,2018 年才真正明白。成长的路上,一定会面临重重困难,如果一直抱着“学习使人快乐”这样的想法,那一定是不能坚持下去的。但是给自己 no pain no gain 的心理暗示之后,反而心态更加坦然。有人说,你看我就没遇到什么困难,机器学习都学会了。我想说的是,“学会”和“知道名词和概念”,是完全不同的两码事。不经历那些痛苦,没有一路上披荆斩棘,没有日日夜夜的奋斗,没有怀疑自我怀疑人生,很难说“学会了”。意识到这一点之后,在重重困难面前更容易坚持下去了。

书有必要看两遍 。成年人时间都有限,拿到书希望一遍看完就行了。简单的书,完全没问题,但是对于 fp in scala 这种虐心的书,一遍看完非常不现实。过程中非常容易陷入细节,而忽略了全局。起初可能是一两个问题无法解决,偶尔跳过也还好。但是问题越积越多,对于我这种有“完美主义”心态的人,后面的挫败感就非常强烈,这时候基本就会放弃了。更为致命的是,因为只着眼于细节,甚至都无法理解作者的意图,这些问题和整本书要解决的问题有什么关系?

后来我“妥协”了。问题解决不了没关系,就放在那里,继续看。先把作者的意图搞明白,为什么这里会有这样的问题?这一章的核心内容是什么?有了“全局观”之后,再看第二遍,解决那些绊脚石问题。效果比之前好太多,最起码的,终于可以看到书的最后一页了,这在之前简直就是不可能完成的任务。

今年看了几本非技术类的书。

原则。 这本书是 2018 年比较热门的书籍了,作者是桥水基金的 Ray Dalio。他在书中总结了很多关于生活和工作的原则,这些原则都能给人以指引。但是对我来说,最受益的并不是书里的原则,而是授人以鱼不如授人以渔。它教会我一定要记录自己的“原则”,每个人的经历都不一样,只有自己最了解所面临的问题,也只有自己能给出最好的解决方法。

另外今年看了几本创业方面的书,创业维艰四步创业法。 本来是想对创业这件事再有个更进一步的了解,但是读完创业维艰,感觉基本就是被劝退了。当然这也是好事,作者起码把真实的一面表现出来了,而不是忽悠大家都去创业。

稀缺。 2018 年上半年时间非常的紧张,每天都像打仗一样度过,所以就思考,我为什么会这么忙?刚好看到这本书,那就来读一下,看有没有破局的办法。全书看完,只记住一点:稀缺会让人的智力下降,产生“管窥”心态。这个可以很好的解释,为什么工作越忙越容易出 bug。但是其他的详细内容已经记不清了,最后也没有给出具体的解决方法。

之前基本不看这类“畅销”书籍,因为总觉得这些书标榜的东西,是无法通过看书学会的。总不能说把四步创业法看完了,我就可以创业了吧?后来想想还是“兼听则明”,花一点时间看看也无妨。事实证明,帮助还是有的。另外需要特别注意的是,这类书的作者都有个非常牛逼的技巧,就是把一句非常简单的道理,前前后后重复说很多次,废话特别多,本来一页纸可以讲完的,非要弄成一个章节。所以在看这种书的时候,千万不要一字一句的仔细看,大体看一遍就行了。比如,对于原则这本书,我的建议是只看第二部分结尾和第三部分开头,这里有完整的原则列表。对于那些特别感兴趣的原则,可以翻到对应章节细读。第一部分是作者的自传,这部分基本没有废话,可以好好看看。

摄影

2018 年对于摄影的认识发生了根本的变化。之前的我喜欢拍摄 cityscape 题材,总觉得这些才能体现摄影师的“能力”。一次偶然的机会看到几年前随手拍的工位的照片,桌面上乱七八糟,没有任何构图,光线也非常差。这张照片在当时我的眼里,一定是一张废片。但是今天看来,确实非常有价值的。过去的时光已经不在,看到这张照片,便回想起来当时的种种经历。

什么样的照片是有价值的?体现“能力”的城市风光照,不一定是有价值的。这样的照片今天可以拍,明天也可以拍,甚至若干年之后拍的更好,因为城市在不断的发展,风景必然会越来越好。风光照也未必能体现能力。可能运气好,碰到了好的天气,也可能时间上比较自由。

摄影的价值在于捕捉以后不可复现的瞬间。 我们去到国外旅游,随随便便拍的街道照片都会觉得非常好,因为这些地方是完全陌生的场景,以后再次回来拍摄的机会也非常少,所以这些照片更加珍贵。女儿一天天长大,每天都会有新的变化,把她的成长记录下来,这是非常有价值的。对于我们自己,“岁月是把猪饲料”,每天都在变老,把当下自己的状态记录下来,也是有价值的。

新的开始

终于赶在春节回家之前把这篇博客写完,这大概是我有史以来写的最认真的一篇年度总结。对于 2019 年,内心其实有非常多的期待,但是我就不在这里立 flag 了。以免到2020年才能把2018年底许的2019年愿望实现。总之,2019年是一个全新的开始,希望在2019年能把心里的这些flag都实现。

新年快乐!