转眼又是一年,2018年也要离我们远去。最近半年没有怎么更新博客,落笔有些生疏,但其实一直都零星地写一些。只不过写作时间碎片化,导致好多文章半途而废。趁着这年底最后的几天,赶紧好好总结一下这充实的一年。以下是前几年的总结,记录着自己成长的轨迹:
2018年最令人欣慰的一点就是有很多深入学习编程理论的机会,而且在学习之后还能在工作实践中检验自己的理解。
在最近半年做的一个项目里,有两次比较大的设计,借此重新熟悉了一下设计的流程。尽管软件工程理论上都八九不离十,但每个公司因为文化、行业等不同,在具体设计时会有些许不同的设计流程、技术选择倾向、文档模版等。所以,最好自己应该有一套独立于不同公司的设计方式,根据不同公司的需要进行裁剪和补充。从分析问题到详细的设计,形成自己的知识体系和行为习惯。
同时还有一个深刻的感受就是:在架构设计甚至不那么详细的“详细”设计之后,如何能保质保量的完成。毕竟最终支撑一切的还是代码,说一千道一万,落笔处见真章。下面就说说在具体编码中对面向对象方面理论的一点感悟。
我的文章:《软件开发的复杂度分析》
面向对象大家都再熟悉不过,可是读过《Elegant Objects》后却发现自己以前就是典型的用过程式思维来指导写面向对象语言的代码。虽然一些原则和思想都了解,比如内聚耦合,比如SOLID原则,可就是有一层窗户纸始终无法捅破。另外就是TDD理念的理解,如何选择和完成第一个测试来触发整个TDD的Cycle,从而驱动开发的完成。以及如何确定测试的粒度、范围等等。
经历过另外几本好书的洗礼,以及不断地实践,感觉自己在OO方面的设计和动手能力都有了很大提高。但离真正悟透还很远,甚至可能像有的大师级人物说的,写了一辈子也始终写不好代码。这可能真不是大师们的谦虚,因为写好代码不是一件小事。
我的文章:《优雅的对象》,《设计模式沉思录》
今年的一大收获就是发现了《Engines of Logic》这本好书。阅读过程中,最令我惊奇的一点就是计算与逻辑的统一。以前对此习以为常,但了解之后发现数理逻辑真的不一般。虽然一本书不可能囊括如此大的主题,但这本书可以很好地作为导引,由此展开对数理逻辑、哥德尔、图灵机、冯诺依曼模型的学习。
读研时一直有个遗憾,就是没有选修上编译原理课,因为本来本科时就没有学好。没想到研究生毕业再次工作后有机会接触到,还是一个SQL解释执行的好项目。于是借着这个宝贵的机会,翻出了陪我不远万里漂洋过海过来的龙书影印版。可能因为有了更多的经验和阅历,这次阅读基础的词法语法解析部分时,尽管龙书的风格比较偏教科书,但依然读得非常流畅。当然厚厚的龙书没法一口气读完,期待读懂后面高级部分的那一天。
对编译原理算是表面上的重温了一下,很快就直接过渡到后端数据库引擎的实现。翻看了不少资料,包括一些名校的课件,最终确定了logical planning和physical planning这种比较标准的架构,这里简单说一下给感兴趣的同学参考,具体可以了解之后自行查找资料深入了解:
今年读过《Practical Vim》后,对Vim的设计哲学有了更深的认识,也更加喜爱了。现在写Python直接远程服务器上原生Vim加各种插件,Java时因为还是离不开强大的Intellij IDEA,所以还是本地IDE里开发为主,但是IDE里的编辑器都使用Vim插件。同时Chrome这种日常工具也尽可能Vim化了,安装了cVim插件。于是使用鼠标的时间越来越少,效率越来越高。
我的文章:《Vim终极指南-所见即所得》,《Python+Vim:天作之合》
Tmux本身只是一个在远端服务器为你保留Session,以防你意外掉线离开时,你运行的耗时命令不会意外终止。而且命令的输出也保存在Session里。但真正惊艳的是它之上的Terminator,可以定制你想要的Tmux窗口布局。因为Tmux也像Vim一样,可以分屏。Terminator可以定制这个布局,同时指定各个子窗口里要执行哪些初始命令,而且传入参数动态地组装到这些命令里。当你像往日一样打开终端,启动Terminator并带上几个参数。然后屏幕上就像有人在变魔术一样,几秒钟后一个酷炫的自定义工作区就自动初始化好了。
与往年一样,今年继续使用Markdown写所有文章。铁打的Markdown语法,流水的编辑工具。今年发现了Linux平台上非常优雅的Typora编辑器,写文章时让人心情舒畅。后来写作时间碎片化,于是开始发掘iPad的潜能。发现了iOS上同样漂亮的Bear笔记App,于是连上了键盘(可惜不能用HHKB,不过貌似能搜到一些解决方案),敲敲打打。如果需要写大量代码,当然还是要开电脑。但如果只是少量示例代码用在文章里,那在线的repl类网站就足够了。
这样iPad就成了一个利用碎片时间的生产力工具。而本文就是得益于这套工具,才得以在2018的尾巴上得以按时完工。关于看书做笔记,个人体会最深、最深恶痛绝的一点就是掌握不好何时该放下书做笔记,过于频繁会导致阅读不断被打断,而过少就会像本博客一样,积压了大量搁置的文章草稿。不管是实体书还是切换到PDF,希望iPad这套生产力工具能让我们更快地在专心阅读与快速记录之间切换,清理库存,发布出更多的好文章。
几个月前剁手入了HHKB键盘,为了能够带到公司去并且不影响同事,就买了更贵但是比较安静的Type-S版。于是就开始了每天在公司Happy Hacking的日子。手感确实很不错,但是因为也没用过其他机械键盘,所以也不能过多评论。
除了键盘,这里要着重介绍的一个好东西是配套软件——Karabiner Elements。因为HHKB非常小巧,没有Fn键,没有数字区,甚至没有方向键!这可能是最让人受不了的一点,而Fn键的缺失则是要了重度IDE用户的命,尤其是Intellij IDEA。而且HHKB也没有提供编程接口,让用户自己修改按键的绑定。这时Karabiner在软件层面提供的绑定就成了大家的救星。而里面可能是最重要的一个绑定方面就是SpaceFn,起源于论坛里网友的聪明才智。简单说来,就是长按空格键代替Fn,同时Fn+HJKL代替方向键,而且与Vim的方向键一致。从此就在HHKB + SpaceFn + Intellij IDEA Vim插件+ Chrome cVim插件中,度过开心的一天又一天。
最近才了解到Java在Oracle的管理下并没有凋零,而是继续发展,甚至焕发了青春,今年秋天顺利发布了Java 11。十三年前,抱着买的第一本影印书《Thinking in Java》硬啃。来来回回看了三遍,虽然不知道有些很刁钻的知识除了考试拿高分外有什么用,比如两个Integer用==比较结果是什么。后来公司转C#后离职继续做Java,一直到现在,完全不用Java的时间加起来不超过一年。可以说整个职业生涯最要感谢的就是这门语言,虽然很多新语言让它光芒不在,可它的确是最正确的选择和投资。
最近,专注Java 8中Lambda的口碑不错的In Action系列出了新版,书名改为《Modern Java in Action》。书中就Java 8 - 11的新语言特性做了详细的介绍,干货满满。对于老Java程序员来说可以说是一本梦寐以求的书,因为它跳过初级甚至中级的知识点而直奔新Java的精华。
我的文章:《那些年我错过的Java》
Haskell早闻大名,学习之后觉得确实名副其实。最深的感受就是函数竟然可以这样玩!于是一发不可收拾,一直深入到Haskell背后的Category Theory范畴论。虽然理解不深,但还是很震撼地发现:编程的抽象层次竟可以如此之高!相比之下,我们日常写的代码的抽象之低,编写时的不用心,真心惭愧……
我的文章:《Haskell带你玩转函数》
如果说《Modern Java in Action》依旧无法让你对现在的Java有很大改观,但你依然离不开JVM生态圈的话,那么也许Kotlin会让你对JVM重拾信心。曾经花时间学习过Scala,语言这东西稍微了解就能感觉出是不是跟自己气味相投,而Scala就是让我喜欢不起来的一门语言。Kotlin,一门非常实用,有些弥补Java的特性让你大呼:这太有用了!比如instanceof判断后自动转换类型,比如巧妙地向已有的类甚至JDK加入新方法,给你一种Java也有Monkey Patch的错觉。还有更多惊喜就不一一列举,勤快的同学可以自己去试试,《Kotlin in Action》评价也非常好。嫌麻烦的同学就等着本博客的后续更新吧。
下半年每天通勤两小时,于是在公交上看了一些技术书籍,以及更多的“闲书”,主要以科普类书籍为主,涵盖了数学、物理、天文,三个个人最感兴趣的主题。同时,还为了看懂旷世奇书GEB,看了一点音乐理论的书籍。
我以为我读的都是没用的闲书,直到我在《Hacker and Painter》里看到了引用了一段哥白尼的语录时,那种与作者心有灵犀的感觉很让人难忘。通过欣赏大自然的美来提升自己的审美,对编码以及做其他事都大有裨益的。比如,大自然的简洁优雅、对称和递归的美、模式与规律的可循、无处不在的平衡与守恒等等,无一不影响你对任何事的看法和做法。
我的文章:《当我通勤时我该读什么》
作为技术人员可能很容易陷入鄙视链,下层的鄙视上层设计如空中楼阁,而上层又鄙视下层写代码没有技术含量还总是出bug。最近真心觉得:设计与实现是同样重要的,顶层的思想和设计固然重要,但没详尽到可以直接翻译成某种语言代码的话,就没资格说编码无足轻重。所以,也许最幸福的事就是做一个不太大的设计,然后自己亲力亲为,在设计与编码中不断学习成长。
我们很容易在没有思考清楚前,陷入了无尽的细节中而返工。刚入行时是这样的,现在也如此。“问题=答案”,但这也不是说要一直空想,凡事都讲究一个度。所以,如何分析问题,分析到什么程度,是一个学问。很多人推荐的书:《How to Solve it: Modern Heuristics》,以及《Are your lights on?》。
科学家通过物理实验或者思想实验,来验证自己的理论。任何人提出想法,都需要来自现实世界的反馈。如何尽早地得到反馈从而知道自己的想法对不对就尤为重要。设计时通过详细设计和原型系统来验证,在实践的初期得到更多反馈来修订设计。编码也是一样,通过TDD尽早得到反馈,从而驱动开发和重构。
编程只是一个表达我们思想的手段,重要的是做一个创造者。不管是通过代码、文章或其他任何形式,只要是Maker,就能享受到创造的快乐。