只要一日自诩工程师,就没有办法放弃学习。本文不算是技术文,只是介绍一些个人的学习方法和经验。如果很多点你已经做到并且做好,一笑了之便可。
阅读书籍
对于工程师来说,从书籍得来的知识是必不可少的。现在很多年轻的程序员会从网络博客来学习技术,但博客内容大多缺乏体系(主要说总结性质的博客内容),不系统。很多博主为了掩饰自己的未知,遇到不知道的关键点就一笔带过,进而导致缺失。即使原作者非常努力,内容上没有缺失,你能从中获取的也只是别人总结好的知识,没有自己的主动思考,这中间便缺少过程式的沉淀,一味地满足于背诵别人总结好的知识,最后也只不过沦为他人的复读机而已。
对于工程师来说,书籍依然是最重要的知识获取媒介。即使只是通过目录概览,也能获取某个领域的大致蓝图。
目前大部分优秀的技术书籍依然以英文为主,能够读懂英文技术书籍是工程师的硬实力。英语阅读能力怎么训练呢?如果不是为了应试,可以尝试逼迫自己去翻译一些英文文档/文章来进行专门训练。举个例子,为了学习 Go,笔者曾经和社区的小伙伴合作翻译过 《The Go Programming Language》 [1] ,后来为了深入学习 es,参与了社区的 《es 权威指南》 [2] 的翻译和校对工作。如果某篇技术文档你从生理上很厌恶它,但是又觉得内容不得不学习的话,那你就逼迫自己去翻译它。千字以内的文档,周末抽一个下午就可以搞定。这里已经说是逼迫了,自然可以想见这个过程并不像打游戏那么轻松愉快,但只要熬过了这个阶段,阅读技术相关的英文文档可以显着提升速度。
具备一定的英语能力之后,接下来就是从什么渠道去获取内容。如果对电子书不排斥的话,目前比较经济的选择是申请一个国内的 ACM 会员,并且用该会员去注册 oreily 在线书店 [3] 。一年大概 20 美元,可以及时地阅读到大部分出版社的技术出版物。因为现在出版社的网站大多还支持 early preview,所以你甚至可以在书籍还没有上市之前就预先学习内容,第一时间获取整个业界的一线情报,能够帮助你站在时代的潮头。等两年后同事拿到翻译生涩的中文版的时候,你已经可以从容地 diss 他在信息源上落后了自己整整两年。(当然,如果你有兴趣,国内的出版社一般在英文新书出版的时候会招募翻译志愿者,如果你对一个领域特别感兴趣,关注出版社的这些招募消息也可以去参与。这里要指出,不要对做翻译这件事情抱太高期望,重在提升自己的能力。想赚钱的话就算了。)
如果喜欢一边阅读一边在页边写写画画,电子书还是稍微困难点,当然这个问题你也可以用 ipad pro + apple pencil 来解决。但有些人比较喜欢实体书捧在手上的实感,国外有些书甚至是个人出版物,例如笔者之前购入的《timeless law of software development》,这些书在互联网上正盗均无,只能考虑通过海淘渠道入手。前些年淘宝的海淘服务也可以用来淘书,书籍大多比较重,运费不菲。有些老书运费可能会到书费的一半让人格外肉疼。又因为国内对出版物管制比较严格,所以为了避险,这两年这些海淘服务商基本上都不帮忙代购出版物了。对于个人用户来说,也就只剩下了直邮和转运两种选择。直邮虽然比较便宜,但是万国联盟的 EMS 一走到中国可能就上了牛车,速度慢到突破极限。基本脑子稍微正常的都会选择转运。除了速度之外,有些出版社的书籍是只在美帝本土销售的,不支持 global delivery。
走转运的话,需要办一张 visa 或者 mastercard 的多币种信用卡,这样才能在海外网站进行支付 。
上面这些问题都解决了以后,书籍的获取就不再是问题。
信息源
虽然文章开头对于传统的书籍大赞特赞,但书籍的缺点也是显而易见的。在技术领域,这个缺点就尤为明显:时效问题。如果我们所学习的是相对比较老的领域知识,那只要读书基本上就够了。
但技术的发展日新月异,如果你想要成为知晓领域内所有新技术的那个人。你还是需要关注一些书籍以外的新闻源,下面是一些例子:
Github Trending
Github Trending 代表的是一种风向,一般一个项目能上 trending 的话,可能是作者自己去 hacker news、reddit 做了宣传,也可能是被某个业界大佬带了流量。因为现在 Github 上的国人越来越多,很多国人学习技术比较显着的诉求其实只是面试(汗,一旦什么 xx interview/xx road to 架构师之类的仓库开了就会吸引一大批国人点星,近两年 trending 的质量有下跌趋势。
不过最近 Github Trending 增加了按照 Spoken Language 筛选功能,所以你可以过滤特定的语言,相对比之前还是好多了。
Github 的 trending 一般按照语言区分,如果你想要成为某门语言的专家,那这种语言每天世界各地的人又造了什么新轮子上榜了总还是需要知道的。星星特别多的 Repo 去读读源代码也是一种乐趣。
除了按照时间和星星来进行聚合,Github 上也有人开了各种 awesome-xxx 的总结页,这种仓库对于学习语言或者特定领域的技术来说也是很实用的。如果你恰巧又发现了领域的空白,拿自己的业余时间去造个轮子,也可以提 PR 进行收录。因为 awesome-xxx 大多是个人项目,因此作者一般还是比较友好的。不过现在 awesome-xxx 的项目越来越多,就有人会想去做一些 awesome 仓库的汇总。然后这些 awesome 的汇总又越来越多,就会有人继续向上进行汇总。所以就陆续有了 awesome-xxx,awesome-awesome,awesome-awesome-awesome。。。真是工程师们的黑色幽默。
follow 优秀的工程师
在世界各地有很多杰出的工程师,每天每月每年活跃在 Github 上。我们总是希望自己能在技术上做到一直精进,同时随着年龄和工龄的增长又会时不时陷入迷茫,这时候去看看同龄的优秀工程师,年纪更大的优秀工程师在这个时间段在写什么代码,在写什么博客,可能对于解决自己特定时期的迷茫有益。或许就发现了一个新的领域值得自己去奉献青春。
在起步阶段你可能不知道该从哪里去找这些优秀的工程师,也有几个源头,如果你阅读到了精辟的代码,觉得作者水平拔群,那么马上去 Github 找到这个项目,并 follow 作者就是一个比较好的选择。如果你在某个地方听人说起了一个传奇的程序员,比如 geohot?那么在 Github 就赶紧 follow 他。如果你发现自己 follow 的人又 follow 了别人,那么也可以对这些延伸关系链上的人进行考察,如果很对自己胃口的话,同样可以考虑。
在 follow 了足够的人之后,你的 Github 首页就能看到这些人每天的动作了。又是一个新的新闻源。
reddit 相关社区
很多火起来的语言、技术领域社区在国内其实都有点分裂,大家都想要占个山头当大佬。而每个社区也都零零碎碎地汇集了一些好的内容。但因为谁也不服谁,国内的社区生态被人为地割裂了。我们没有办法在同一个社区获取或者搜索到所有我们想要知道的技术文章、问题、思考、总结。所以我建议还是去关注国外的社区吧。
reddit 是一个不错的选择。当然,因为敏感词的关系,这个社区本身是被强了的。这里需要考察到你的越墙技能。
reddit 的 rust 社区 [4] 。
The Morning Paper
除了工程以外,在某个领域做得稍深之后,我们就需要去关注更前沿的理论部分了。作为一个工作了的码农,想要研习理论需要去阅读一些每年新发表的论文。在学校里读过一点论文的基本都知道,再好的文章因为一些荒唐的理由,都会带有大量的废话。
The Morning Paper 是一个国外某企业的 CTO(CTO 还天天读论文,神奇)创建的个人 blog,其中会帮助我们去解读很多新论文,省去了我们去阅读大量废话以及对于工业界人来说不那么重要的公式的时间。只当了解的话,是个非常不错的渠道。
技术会议和公开课
除了阅读文字,阅览视频和与人面对面交流在有些时候也是必不可少的。有些自己冥思苦想而不得解的问题,在牛人的点播下片刻茅塞顿开。这也是所谓听君一席话胜读十年书的充分体现。比我们工作时间长,且经常总结的人经常能够给后入行的人带来广阔的视野和冲击性的理论,这些是文字所不能带给我们的。
当然,在技术会议上听分享也要保持自己的头脑清醒,不要被那些天花乱坠的概念所吓退。有些人的分享很功利,其实只是一些旧概念的包装。而这些人出现在现场的目的也可能重在宣传自己方便跳槽,不要被骗了。在听主题的时候稍微有一些选择性,尽量避开这种天花乱坠的忽悠选手。
除了技术会议,ytb 上有很多优秀的公开课。从现在往前推十年的话,很多人抱怨因为经济、家庭原因,没有机会出国深造,接受世界一流大学的计算机教育。而公开课的出现已经使财务、距离对我们的限制消失了。在学校里学习的时候,一门课程也就 36-48 个课时,外加上思考、作业的时间,就算是 72-96 个小时。对于已经工作的社畜来说,一个月的周末有 8 天,稍微努努力,基本上一个月就可以学完一门公开课了。这既可以弥补你学生时代的遗憾,同时也可以填补某些人嘴里所谓的虚无缥缈的“基础不行”。吊打某些自视甚高的老油条。国外的计算机课程往往会随着工业界的发展而随时更新,例如早期 Sony 的 Playstation 3 上市后,便有学校的体系架构课专门讲解 IBM Cell 处理器的架构设计,前年或更早的时候,已经有学校向学生讲解 Intel i7 处理器中的一些更现代的设计理念。这可比一些工作十年但从来不关注新技术的人所告诉你的结论强太多了。
多做开源
有些同学,在阅读了大量的代码、设计方法论之后,可能依然在工作时陷入焦虑。为什么我们在企业内维护的代码都是一坨屎,为什么我每天写的东西就是在屎山上堆屎?
大多数公司的软件生命周期其实很短,开源界没有靠谱的解决方案时,为了解决一些临时问题,企业倾向于以最小资源获取最大收益,即使是纯技术项目,我们在做的也都是一些丑陋的临时解决方案。甚至有些 MVP 版本产品的代码能活过一个星期就不错了。有些企业的内部技术工具虽然从性质上可以开源,但为什么开不了?还不是因为历史包袱重,代码写的屎。有些时候不是工程师不追求优秀的代码,工期紧张的情况下写着写着就变形了。
好在业余时间是属于我们自己的,我们可以用最严格的标准来要求自己编写自己的开源项目。并且以产品的方式来对这些项目进行运营,这不仅能提升我们的技术能力,同时也会给我们带来更多的机会。如果自己的开源项目成功的话,同时可以给自己带来更大的业界影响力,何乐而不为?
多做总结
在有了足够的信息获取渠道,和个人能力提升手段之后,还应该多进行总结。对于工作 3 年以上的工程师,总结并不只是为了面试。一个人的工作内容一定会随着时间的推进而不断变化,工作领域也可能在跳槽之后发生变化,怎么让自己的历史积累不成为时代的眼泪?就是要做总结。
比较好的总结手段有:
建立自己的测试代码库
这一点我认为做的最好的是, learn [5] ,这是一个韩国裔的工程师。如果从大学开始就建立这样的习惯的,在技术上走过的所有的路都可以清晰可见。
如果自己的总结能够让别人看上去也赏心悦目,那还是比较成功的。即使做不到这种程度,我们建立自己的代码库之后,想要搜索一些拿来演示的代码片段也会方便不少。
建立自己的 blog
博客是个人思考的轨迹,我们的工作并不是简单的完成任务。在完成任务的同时应提炼自己的方法论,逐渐形成自己看待技术问题,看待业务,看待公司,看待业界乃至看待整个世界的观点。独立思考是一个人最重要的品质。
从进入滴滴开始,我写个人 blog 也大概有 4 年有余,即使初始只能写一些简单的内容,到现在我已经可以从任意我想要的角度切入进行较为完备的分析和观点总结。
对于工程师来说,除了代码能力之外,文字能力也是需要进行训练的。能够把事情做好,还要能在必要的时候,通过文章来把自己的工作宣传出去。建立自己的个人品牌。
建立自己的笔记库
除了完整的博客输出,有一些零散的知识不好组织,便可以放在自己的笔记里,这些可以是别人的分享的备份,也可能只是记录一些简单的命令。记录笔记是很好的习惯,因为一个人不可能永远记得所有工具的使用方法。必要的时候通过查阅笔记快速地回忆起来就已经足够了。
锻炼演技
因为工程师工作 80% 的时间都是在和技术、代码打交道,所以也比较容易忽视一些软技能的训练,这里不说一些敏感的内容,只说说口才。据我观察,大多数的工程师其实并没有意识到这是一个问题。即使在纯技术人员交流的场合也会发现有些人的表达能力着实一般,其它技术人员理解起来都费劲,何况去和非技术人员交流。
人这一辈子,最重要的是能把路越走越宽。对于工程师来说,能够锻炼软技能的场合其实不是很多,但也不代表完全没有。即使没有也可以自己创造机会,例如组内、组间、部门内的技术分享都是不错的机会。
更大规模的技术分享可能因为主办方“势力眼”,在你级别不高或者影响力不大的时候,不提供给你这样的机会,但是作为一个向上的人,迟早会有走到这一步的一天。你所要做的是提前做好准备,在那一天到来的时候,在聚光灯下旁征博引,谈笑风生。
祝大家都能成为更好的自己!