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都实现。

新年快乐!

Posthaven to Hugo

前不久博客刚刚从wordpress迁移到Posthaven,在使用了两个月之后,还是从Posthaven流失了。

Posthaven的问题

起初没太注意文章的url,有一次写完发布之后,发现url居然是文章标题的拼音。对于英文内容来说,这样的url没问题,但是对中文来说,这样一大串不知所云的url,简直是个灾难。有个办法可以解决,就是发布的时候把期望的url作为文章标题,等发布之后再来把标题更新成中文。

Posthaven的页面引入了twitter和facebook的js,由于一些众所周知的原因,会导致博客无法顺利的打开。如果要去掉的话,需要修改主题。但是Posthaven的主题是用的liquid模版。修改的话有一定的门槛,至少要学会liquid。

类似的还有不少小问题,这些问题都有一些奇技淫巧可以解决。但是作为用户有没有必要这样折腾呢?如果还是要自己操心,那为什么不选择wordpress这些?

另外,Posthaven所标榜的“Last forever”或许只是个不切实际的幻想。一方面公司并不能保证永久运行下去。另一方面,万一哪天posthaven被屏蔽了,也就完蛋了。

需求很简单

我只需要一个minimal viable product:

  • 能够支持markdown,如果能原生支持org-mode最好了。如果不行的话,支持html也凑合,emacs可以很方便的把org-mode转成html。

  • 能够支持代码高亮,码农必备。

  • 不让用户操心,不需要做太多的定制,拿来就可以开始写。如果需要少量的折腾,那我至少希望这个折腾是值得的,经验是有其他的用武之地的。

  • 提供稳定的服务,页面打开速度有保证。

一直有个想法,既然这些都不能很好的满足需求,那为何不自己造个轮子?现在web framework都已经非常成熟了,实现起来应该也不会太难。org-mode的问题可以用scala写个parser解决。但是,自己造轮子要占用大量的时间。现阶段的时间这么紧张,把宝贵的时间花在这上面是不是值得?

那除了wordpress,还有什么选择?Jekyll, Hexo, Hugo。Jekyll的编译速度太慢,Hexo是nodejs的框架,学习成本略高,而且hexo的主题洋溢着一种qq空间的感觉。那就只有Hugo了。

Hugo也不完美

Hugo, Jekyll和Hexo这类博客最大的优点在于生成的是静态页面,如果博客部署的机器跪了,重新换台机器部署一下就行了,迁移起来非常方便。Hugo可以在本地渲染,而且支持live reload,写完保存文件在浏览器里就可以看到了。这一点是之前从未有过的体验。

虽然基本体验OK,但是Hugo也存在不少问题。

如果某篇文章太长,不希望在首页全部展示的时候,WordPress和Posthaven都支持插入Read More标签,这样在首页就可以只展示标签之前的部分。Hugo对于这个功能的支持,在markdown格式里面是完美的,如果用org-mode或者html,就比较令人蛋疼了。对于org-mode,文档里面写的是要用 #more ,但实际上还是要用markdown的方法。对于html,我是压根儿就没找到支持的方法。

Hugo的文档比较奇怪,给人的感觉是放着一些通俗易懂的说法不用,而是故意用了一些看起来更高深的词汇,但是对用户来说不够友好。比如taxomony,slug这些概念。

虽然Hugo支持org-mode,但是支持的并不够完善。很多标准的org-mode写法,都不能用。比如需要直接输出html,却不能用org-mode的 #+BEGIN_HTML#+END_HTML 。代码高亮需要使用hugo的short code,在org-mode里面一个简单的 #+BEGIN_SRC 不就可以搞定了么。

目前来看,hugo已经是能用的唯一方案了。就这样吧,后面如果实在忍不了的话,还是得自己造轮子。

业余摄影师的Olympus M.Zuiko 7-14mm F2.8 Pro使用体验

本文是一篇迟到了大概3年的评测。刚入手7-14的时候,其实很想写一篇评测,但是总觉得自己都没怎么用过,也没拍出什么拿得出手的照片,没有资格来评论。现在3年过去了,我已经花了足够的时间去使用这枚镜头,可以称得上是重度用户了吧,那么今天就来谈一谈。

看镜头评测的读者最关心的是什么?从我的角度而言,应该是“如果我买了这枚镜头,能拍出什么样的照片?”。但是大多数都没有讲到这个读者真正想看的地方,仅仅是简单地阐述镜头的各项性能指标。要么就是各个光圈拍一张照片再放大看细节,为了寻找镜头的sweet spot。同时样片拍得也非常烂,让人怀疑这帮做评测的人到底会不会拍照。

Talk is cheap, show me the photo! 所以在这里,我尽量少说废话,多贴照片。

为什么选择7-14

刚开始接触摄影的时候,用的是RX100这款相机。一直沉迷于500px上的风光建筑类照片,但是RX100镜头广角端的等效焦距只有28mm,对风光题材实在无能为力,因此觉得必须入一个超广角了。

当时对各个厂家的系统都不太熟悉,只认得价格。我记得当时A7应该是刚发布没多久,机身的价格就已经非常感人,而且好像也没有什么牛逼的超广角。对比一圈下来,发现m43系统的价格非常适合我这种穷光蛋。刚好赶上了奥林巴斯7-14mm超广角镜头发布,看了很多的新闻和评测,都对这颗镜头赞赏有加。所以就和E-M5 Mark II一起入手了。

现在来看m43算是一个非常非常小众的选择了。再加上松下和徕卡适马成立了L卡口联盟,看起来好像松下老大哥要离M43远去了,只剩奥巴在坚守,m43要灭亡的声音也越来越响。但是,同时也有很多专业摄影师从full frame转到了M43阵营。

画质

作为业余摄影师,照片只是发发Flickr和instagram,对画质的要求不是非常严格。但是最基本的追求还是有的。从照片来看,7-14已经远远超出我的预期,让我拍到了很多非常满意的作品。

↑ 深圳湾大桥的暮光。f/8.0的光圈,星芒很好看。

万里长征的第一步

之前的博客是自己搭建wordpress,大概维护了有六七年的时间,不过从14年开始基本不怎么写博客了。前段时间上去看,忽然发现被挂马了,点击链接有一定几率会跳转到一些垃圾网站。也尝试过去解决问题,但是主机都已经沦陷了,再怎么清理可能还是会有后门,因此干脆点把主机删掉了。

博客还是要继续。那就再搭一个wordpress吧,反正也轻车熟路了。买个阿里云的主机,再走个备案流程,这样国内也可以顺畅的访问了,看起来是个不错的方案。于是一边备案,一边搞wordpress。找主题,修改css,装乱七八糟的插件。备案的流程也有点麻烦。在这个过程中,兴趣被一点一点的被磨掉了。就是不想写东西。

博客,最重要的是内容,应该先考虑写什么怎么写的问题。wordpress让我分心的东西太多,精力无法集中在写博客这件事上。所以,即便有那么多的插件那么多的主题,也不想选择wordpress了。一个偶然的机会,看到了Sam Altman的博客,是托管在posthaven这个平台的。详细了解了一下发现正是我想要的,5$一个月,永久保存博客,承诺公司不会被出售。就这个了!只需要考虑一件事,那就是写,世界清净了很多。

为什么不选择公众号?在公众号上写东西,有两个非常强烈的感受。一是写出来的东西都不属于我,二是公众号只是微信体系内的一个应用,写出来的东西只是给微信用户看的。我想要的是一个独立的博客。还有另外一个原因,公众号文章里的图片,被压缩之后的质量实在太低了。而且不管作者上传的图片有多小,都再来压缩一次。如果说为了节省带宽考虑,我可以理解。但是为什么不把缩小图片的权利交给作者呢?尽管微信的压缩算法很牛逼,但这种不考虑作者感受的做法还是让人难以接受,尤其是对于喜欢摄影的我来说。

平台有了,接下来就看自己了,但愿能维持一个比较高的产量。不然又要回来打自己的脸了。

谈程序员的学习(二)

今天的主题是“专注”。

张无忌掉下悬崖之后,山谷里只有一本九阳真经,所以他也没得选择,只能把精力放在这上面。但是我们所处的世界不同于那个山谷,充满了各种“诱惑”,这段时间我对“九阳神功”确实比较关注,但是过几天我又听别人说“降龙十八掌”也很厉害,想尝试下。怎么办?

我们一般都认为,像张无忌在山谷里那样集中精力只做一件事情,效果一定是最好的。在短时间内,确实需要保持专注。比如一小时,一天,一周。如果不能集中精力在一件事情上,就会导致大脑频繁地进行“上下文切换”。今天我想学学scala的fastparse,但是又想写写博客,另外还想再继续看sedgewick的算法。最终结果是哪一件都做不好。

但是在长的时间范围上,反而不能太专注。从我的个人经验来看,学习效率最高的时候,往往是最开始接触一项技术的时候。因为面对的是一个全新的领域,自己会在好奇心的驱使下去学习,而不是自己逼着自己前进。

刚接触Haskell的时候,很多functional programming的概念都是第一次听说,就像是打开了通往新世界的大门,学习的欲望是非常强烈的。但是后来持续了两个月之后,慢慢地放弃了。起初看Learn you a haskell for great good这本书的时候,基本的概念还比较容易理解,但是越往后难度越大,再往后基本看不懂了。过了两年之后,看到了陈天的一些文章,重新燃起了对Haskell的热情。再去看Learn you a haskell for great good,原来看不懂的地方居然全明白了,有种大彻大悟的感觉。

在其他的领域上,也有过几次非常类似的经历。仔细想想,真的是自己的智商不够用吗?不,本质的问题不是Haskell太难,而是在第一次学习Haskell的后期,已经失去了对Haskell的热情,只是逼着自己去看书而已。第二次之所以能“大彻大悟”,完全是自己的兴趣使然。

不妨思考一下,养猪场的种猪,为什么每天都能保持高昂的战斗力?因为每天来的母猪都不同。适当的新鲜感,才能让自己持续输出高额的伤害。

“专注”的前提是自己有比较强烈的兴趣。在张无忌所处的环境下,中了寒毒,不练九阳神功就要挂了,保持专注当然是好的。对于我们现代人来说,如果已经不是发自内心地想继续下去的话,要么激励自己,重新点燃兴趣。要么就尽快的pivot,把精力放在其他更感兴趣的事情上。

谈程序员的学习(一)

程序员的学习,总是会带着功利性。要考虑某项技术能否为自己带来实际的好处,比如对目前的工作是否有益,掌握新的技术是否利于自己的加薪升职,是不是符合现在的技术潮流。作为一个“理性人”来说,时间当然要花在刀刃上,有这样的想法没毛病。

大概7年前,看到有人这样说:“工作上可能根本不会写Haskell代码,但这不代表它没有价值。Haskell会为你打开一个全新的世界,颠覆你对编程的认知。学过Haskell可以让你对其他语言的使用也更加娴熟,写出完全不一样的程序。具体的好处呢,这个东西我没法跟你描述,就好像没法向色盲描述红色和绿色一样,只有你自己体验才知道”。这样的描述激发了我的好奇心,然后就入坑Haskell,但是到现在也没能掌握,没体验到上面说的这些好处。

Haskell的书籍不算多,入门的最好的一本是Learn You a Haskell For Great Good,讲实战的是Real World Haskell。这么多年了,我连这两本书都没能看完。思考了下,原因是这样的,对Haskell特别感兴趣的时候,书看的特别快。但是看不了多久,便开始思考“理性人”的问题了:这玩意儿学完究竟有啥用?只要一开始考虑这个问题,就离放弃不远了。所以花了7年的时间,我都入不了Haskell的门。

最近偶然看到倚天屠龙记里面的一段情节,对我有很大的启发。