对2018的展望

之前写过一篇《我的2015技术学习流水账》,最近两年因为读研的缘故导致职场的空白期,所以就不做总结(关于读研所学的总结可以参考之前的文章《北美CS求学找工指南》),而是展望一下即将到来的2018年。本文提到的资料书籍都可在《高分编程佳作推荐》中找到,都是高分好书。


1.两条战线

如果从实习的那年算起,2018年将是进入职场的第十个年头。从二十二岁入行到已经三十有二,可谓感慨良多。为此,分两条主线进行展望,这也是从入行一直尝试不断推进的两条线。

一是每天的日常工作,不求多快升职,但毕竟工作是生活的保障,至少要保住饭碗才有机会做自己的研究。所以,职场上最基本的原则就是争取达到组内中上技术/业务水平。同时了解客户,并为团队做贡献。从进入一个新团队时你什么都不懂,有很多要学的,最后离开时你却是团队里有价值的一员,如果在每个团队你都能做到这样,你的能力就会不断提升。

二就是个人能力的进修,因为时间、能力有限,所以一直都游走于工程与学术之间,寻找一个适合自己的平衡点。这是一条很长的路,想从根本上提升个人能力,可能短时间内看不到明显的改变,但是三五年,甚至八年十年后可能就会看到质变。


2.日常工作

最近从《重构》和编程工具的书得到了一些感悟:编程的最大敌人是重复,对付重复的最好方法是概念的抽象和工具的自动化。所以,今年想进一步提高自己对编程抽象的理解以及工具的使用。但与此同时,还要了解一些“业务”——AWS服务。

2.1 业务:AWS服务

AWS的顶级服务已经多得快数不过来了,更不用说更多的内部服务。感兴趣的可以看一下之前的整理《AWS核心服务概览》,因为都没有开源,所以只能介绍得比较浅显。为了对目前所在组的系统架构有更好的理解,需要花一些时间去学习,目前尤其对VPC和SWF毕竟感兴趣。当然,还有最主要的Elasticsearch,要了解内部的运行机制以及常见问题的解决,才能更轻松的oncall。之前看了大部头《Elasticsearch: The Definitive Guide》的许多章,但没有及时做总结,一定要补上。

2.2 技术:Python、OOD、遗留代码

最近半年,不知不觉地工作语言从Java变成了Python,所以新的一年以Python为主,但不能流于表面,深入学习Python的元编程等高级特性。平时读了一些书,例如之前提到的可以说是最经典的两本《Fluent Python》和《Python Cookbook》。尤其是第一本,彷佛找到了十年前读《Thinking in Java》的快感。可没想到很快从一个Python小白,变成了很多时候周围人中最熟悉Python的一个。现学现用,马上就派上了用场,所以就更加有深入学习的动力。目前尤其对Python的OOD、以及Python和Ruby中的元编程感兴趣。

同时还有一点非常感兴趣的是面向对象编程的设计方法与正确性验证。目前重读了《Clean Code》和《Refactor》等经典著作后,对如何设计正确而简洁的函数有一些感觉和见解,但对对象一直没有形成很好的认识。目前有一些不错的资料,除了同样经典的《Design Pattern》,还有更古老的《Object-Oriented Software Construction》,非常新的《Elegant Objects》两卷。准备换一大块时间探索一下,OOD/OOP这个老瓶里还有什么新酒可以品尝。毕竟目前面向对象还是主流,学明白了后平时工作里应该是非常受用的。

此外,最近注意力转移到了遗留代码的开发方法论,包括重构和《Working Effectively with Legacy Code》都是很好的资料。为什么要关注遗留代码呢?因为回首整个生涯,参与过的全新的项目和系统开发屈指可数(大概五六个?),时间上满打满算加起来大概有两年,剩余的五六年都是在维护所谓的遗留代码。包括现在也是,在现有代码库的基础上加新功能、改Bug。所以要在遗留代码上写出优雅简洁的代码,还不破坏原有功能是一件挺难的事儿。

2.3 工具:新利器的使用

在引入新工具前,先要梳理好目前的工作流程,每一步都涉及到哪些命令和步骤,然后再想法通过一些有趣的工具自动化或简单化。目前在Amazon的工作主要可以分成日常开发和oncall两大块,第一块的流程分为任务管理、设计、编码、测试、Review、打包上线、线上验证回滚等,第二块则由常用命令、常见问题处理等组成。

列清楚了自己的工作流程,就着手用工具改进,让每一天都能轻松一些。说到工具就不得不去*nix里去寻宝了。最近对命令行工具非常着迷,接触到了一些非常棒但之前却不了解的工具,彷佛发现了一个“不为人知”的大宝藏。比如Bash里之前没用过的小命令、用Zsh配合各种插件替代Bash、Tmux和Tmuxinator对命令窗口的初始化和自动布局、Vim各种好玩的插件以及Tmux与Vim的完美结合。


3.个人进修

3.1 分布式系统

入行以来就一直专注于后端分布式系统的开发,从简单的B/S应用到SOA再到各种中间件的开发。念研究生时选修了分布式系统的课程,但没想到异常的难,没有学好,所以今年想花时间好好整理一下,从时钟同步、通信等基础设施,到复杂的分布式算法,尤其是如何设计和证明分布式算法的正确性,以及工程实现上的一些实用技巧。目前手头有一本《Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems》非常适合深入学习。

3.2 函数式编程

研究生时选过一门《Principle of Programming Language》的课,用的Standard ML,非常有趣也非常难。之前读过一点SICP,所以准备重读一下,顺带学习编程语言的设计实现。长期的话,编译原理是必须要学的,这也是研究生时的遗憾,没有选上编译器的课程。

3.3 算法与数学

算法照之前计划的,就是啃透CLRS《算法导论》,包括习题。因为CLRS也是研究生时算法课的主要教材,老师的引领自然地对自学有巨大的帮助。不然纯靠自己理解,真是没有信心啃完这部上千页的算法巨著。之前已经开始重读计划,但因为工作原因搁置了,期待各种准备知识就绪后继续一直读下去。

数学则是另一个老生常谈的话题,一直止步于前。但就在几个月前有了一些进展,开始读一些数学的入门书籍,主要方向是想趁着还有精力,把微积分、线性代数、概率论等基础又对编程有帮助的分支学一下。最终目的是想提高一下科学素养,之后深入某一热门的前沿领域,例如机器学习、人工智能等等。


4.总结改进

4.1 写文章

2017年忙于找工作和适应新工作的生活,也因为惰性和写作状态不好,所以文章写得不过。另外个人一个老毛病就是看书比较细、比较慢,喜欢在书上做旁注,导致最终的读书笔记经常搁置无法及时完成。过后想要补上时,又没有了当时的状态和上下文。打开了个人的文件夹看了一下欠下的“债”,在此列一下(题目拟定),很多已经开了头但没有写完,回头一一补上:

  • 一篇Vim的《Vim:所思即所得》:介绍Vim核心思想,目前已快写完了
  • 一篇Python的:介绍Python不同于其他编程语言的特性
  • 一篇Elasticsearch的:主要深入理解内部的数据管理和搜索机制
  • 一篇OOD的《面向对象沉思录》:重新思考OOD的利与弊
  • 一篇DevOps的《DevOps文化》:介绍开发与运维的结合
  • 一篇CleanCode的《编程这件小事》:整理编码中最细节的东西
  • 一篇编程美学的:从顶层架构到底层理论支撑,思考如何欣赏代码中的美
  • 至少一篇工具的《情迷自动化》:介绍新接触到的Zsh、Tmux等工具
  • 至少一篇数学的《程序员的数学修养》:主要介绍数学的研究方法,与编程的关系

现在再思考一下如何改进。一个改进方法就是周末集中看一本书,立刻写好文章,但这样可能会导致书看得不够细,思考不到位。可以先尝试一下,有更好的办法再去尝鲜。

4.2 代码库

因为最近疏远了Java,所以“宏伟”的Java代码库整理计划就搁浅了,转而开始思考Python代码库的整理。但因为Python本身的库非常齐全、抽象层次高,所以与其整理基础的,还不如做出一些有用的东西开源到GitHub上,所以今年争取能用Python写出一点有用、并且可以开源的东西。

4.3 职业生涯规划

如果打算长期工作在一线的话,整个职业生涯可能长达几十年。在这漫长的时间里,会出现一个又一个瓶颈,一些瓶颈也许能被打破(参见《如何突破编程学习的瓶颈期》),但有时也许会困在哪里难以自拔。所以程序员也是需要一些规划和心理指导的,我们或许可以从《Clean Coder》和《Coders at Work: Reflections on the Craft of Programming》大师口中得到一些领悟,照亮前进的方向。

4.4 编程的本质…

编程的本质是语言?数学?计算?《SICP》开篇的回答很震撼人心,是Have fun,有趣、快乐,不免让人回想自己入行时的初心。编程能挣钱、是一门手艺,但更重要的是给漫长的人生带来一点快乐,不是吗?

相关文章
相关标签/搜索