2017-我的技术之路
2017 我的技术之路:不忘初心,夯实基础
又一年春去冬来,到了年末盘点的时候,感觉自己今年相较于前两年沉稳了些,也愈能明晰自身的不足;所以本年的主题就定为了不忘初心,夯实基础。今年年初的时候领证结婚,未立业而先成家;从南大毕业,结束了学生生涯;从零到一组建技术团队,看着新公司逐步发展壮大;加入某厂,结束三年的创业生涯,突破现有的瓶颈。三年创业,终未成猪,也是有哭有笑;虽然算不得什么慷慨激昂大事,却也有一种渡尽劫波兄弟在,相逢一笑泯恩仇的感叹。
首先来聊聊初心吧,像我这样小富即安,胸无大志的,可能也谈不上有什么初心;但是随着眼界与格局的提升,会忧虑于此生一事无成,亦担心自己浅薄而不甘平庸,反而成了痛苦的原罪。当我什么都不会的时候,心有惴惴,容易妄自菲薄;这三年的磨砺下来,只希望自己的心境圆融些,能够不卑不亢,知道自己能做什么,知道自己要做什么。很多的领域也是多奇技淫巧,像笔者这样愚钝的唯有脚踏实地,步步向前;中道而行,心无旁骛。前五年都在中小型团队,更多的承担的是团队协调的职责;在不同的业务场景、团队搭配背景下,我也慢慢地养成了自己对于团队成员的期望。而当今年自己作为校招新人进入新的团队,从零做起时,愈发体会到提升团队效能的重要意义。
从大四出来开始创业至今也有四五年的时间,笔者自觉自己的技术学习历经了三个阶段;首先是只会写基础语法,使用内建接口的阶段,而后是喜欢追逐名词,不求甚解的阶段,现在是发现自己连基础语法都不会的阶段。技术一直有所谓的术道之辨,有的开发者选择了广度,有的选择了深度,但是无论如何都需要从点到面;类比知识的金字塔,唯有地基广而实,才能保证塔尖高而稳。现在又是知识爆炸的时代,借鉴未来简史中所谓自由主义的挽歌,如果我们踟蹰不前,肯定是要被抛弃的;另一方面,现在又是繁忙的时代,极少有时间能够系统化地学习,更多的还是要碎片化学习。所谓集腋成裘,聚沙成塔,但是没有能沉淀为体系,终究也是水上浮萍,经不住时间的打磨。笔者下车伊始即致力于打造完备的知识图谱,让知识在它该在的地方,这也是笔者遨游无尽海洋的一叶方舟。越来越多的技术、工具、框架之间存在交集,特别是在微服务、分布式系统、容器编排等方面,而知识图谱不断重构地过程,在笔者看来,也是不断穿过表象看本质的淬炼。
不拘于具体的技术方向或者领域,笔者认为最为珍贵的能力之一即为解决问题的能力;从技术的角度来看,就是编码能力与工程组织(等)。很多时候我会感慨于编程的时候会有阻塞感,因为需要频繁地在各个语言之间切换,很多语法特性却是无法信手拈来;另一方面,随着各种技术方案推陈出新,我们不应该追逐新颖,但是要能够为问题寻找合适的解决方案,打造面向团队的,能够提升团队整体研发效能的工程体系。年末的时候,笔者将两千多篇笔记规整到七个仓库二十余个不同的系列中,这些笔记即是以不同的组织形式,承载不同的内容,来提升、保障笔者的编码能力与工程组织意识,确保任何时候都保持自己对于知识的掌握。笔者不可避免地会陷入到不专一、容易三心二意的困局,但是任何愿意抬头看路的程序员都会关心整个产品,他山之石,可以攻玉;也不希望现在做的事情,限制了自己的发展。
笔者为不同的系列取了不同的名字,各有寓意,也自然是有很多名不副实,不过也是表达了笔者的一种希冀。首先是 Knowledge Map - IT 知识图谱与技术路线,指明了技术之路上漫游的方向;文末附图即是最新的知识图谱,而泛前端、Web、微服务等等细节则可以前往原文查看。其次是 AwesomeList 与 Awesome CheatSheet,分别从不同的维度解决我知识编排的问题。AwesomeList 记录了笔者在日常阅读、学习与实践中发掘的优秀的资料,其按照知识图谱中定义的各个领域的知识体系分门别类地存放。笔者会不断更新其中链接,去芜存菁,去重留一,希望为同仁提供优秀的、有价值的、尽可能精简的资料索引。笔者还将自己阅读,收集的,优秀的电子书集锦到了 Awesome-CS-Books,阅读书籍永远是最为系统的学习方式,能够帮助我们缓解过于碎片化带来的技能不连贯性与片面性;本仓库以 IT CS 相关书籍为主,同时也会包含一些著名的、有价值的公开课程。Awesome CheatSheet 则是致力于解决知识易忘与速学概览的需求,其目标为语法速览, 实践备忘,从零到一,上手即用;Awesome CheatSheet 会是我 2018 年里的重点项目,也是保证我编程能力的重要依仗。对于笔者往年技术之路的记述,归档在了 Tech Road - 某熊的技术之路。
其次是编程语言相关,主要归档在了 Domain of ProgrammingLanguage - 编程语言语法基础与工程实践,存放了笔者在编程语言方面学习与实践总结而来的笔记;笔者目前首选的语言为 JavaScript / Java / Python / Rust,因此笔记也就为现代 JavaScript 开发:语法基础与工程实践, 现代 Java 开发基础, Java 工程实践与设计模式, 深入浅出 Java 并发编程, JVM 内部原理与性能调优, 现代 Python 开发:语法基础与工程实践, Rust in Action, 编程语言理论指南等几个方面。编程语言是软件开发的基石,而软件开发就是把一个复杂的问题分解为一系列简单的问题,再把一系列简单的解决方案组合成一个复杂的解决方案。笔者在 SoftwareEngineering Essentials - 软件工程基础中归档了数据结构与算法基础, 团队协同开发与软件质量保障必知必会, 设计模式与软件架构之禅等内容。
笔者今年投注精力较多的 Web 领域,最令我惊讶的就是前端每周清单系列;万事开头难,坚持不懈则是难上加难,我并非意志坚定的人,但是一年来前端每周阅读清单能持续更新,我也是蛮佩服自己的,经常会半夜加班赶稿;很多时候无暇发文,都是内容整理好了之后交与我夫人帮忙发布,所以来年大大们轻喷呀~ 而在系列文章方面,笔者整理了 现代 Web 开发基础、现代 Web 开发工程化实践、现代 Web 应用架构与性能调优、React 开发与前端工程化实战、Vue 开发与前端工程化实战等数个系列,归档在了 Web-Development-And-Engineering-Practices之中。而对于更广阔的大前端领域,笔者在 Frontend Technology Handbook - 大前端开发相关中整理了 iOS 开发基础与工程实践, Android 开发基础与工程实践, 混合式开发基础与工程实践, 深入浅出数据可视化等内容。
而在泛后端领域,笔者总结在了服务端应用程序开发与系统架构、深入浅出分布式基础架构 这两个仓库中,分别包含了服务端应用程序开发基础,深入浅出 Node.js 全栈架构,Spring Boot 5 与 Spring Cloud 微服务实践,DevOps 与 SRE 实战,信息安全与渗透测试必知必会;以及Linux 配置使用、内部原理与 Shell 编程,MySQL 内部原理与性能优化,分布式存储与 NoSQL 数据库基础,分布式容器架构与编排,云计算系统与大数据应用等内容。最后就是在数据科学、机器学习、深度学习等领域,笔者归档在了 程序猿的数据科学与机器学习实战手册,包括了 Python 机器学习基础,深度学习课程笔记,深度学习与自然语言处理实践等内容。
不同人的学习方式不一样,不过对于瓶颈期的人而言,保证自己每天能阅读/浏览 30 ~ 50 篇资讯/文章,也是比较可行且容易量化的成长方式。而撰写技术文章,不仅是对自己的积淀,帮助自己更深入地理解;也是希望能够以自己的绵薄之力跟大家一起成长,不仅能用于公司内同事的共同学习,也想着能有更多的后进英才,使整个行业蓬勃发展。笔者将今年常看的一些站点列举如下:
- 资讯聚合:HackerNews、Reddit、Google+、推酷、TechMeme、V2EX、DZone、掘金
- 技术书籍:Gitbook、SafariBooksOnline
- 技术博客:Medium、开发者头条、CSDN、freeCodeCamp Guide
- 技术问答:StackOverflow、SegmentFault
- 开源社区:Github、OSChina、coding.net
- 期刊订阅:MyBridge、InfoQ 架构师、CSDN 程序员杂志、码农周刊、高可用架构系列、ThoughtWorks 技术雷达
- 在线学习:Coursera、edX、Udacity、MIT 公开课、MOOC 学院、慕课网
- 在线编程:LeetCode、Project Euler、CodingGame、Kaggle、Topcoder、牛客网、HackerRank、JS Fight
- 大厂风范:MSDN、Google 开发者 、云栖社区、IBM DeveloperWorks、Facebook AI Research 、Facebook、airbnb
此外,笔者今年还尝试分享自己工作生活中编写的小工具,或者模式化的解决方案。fractal-components 存放了笔者以 Pure CSS / Vanilla JS / React / Vue / RN / D3 不同的形式/框架积攒的组件,webpack-app-template、iReactPack、iVuePack、webpack-app-template 则是前端项目组织方式的沉淀。Modern-JavaScript-SwissGear 中则集锦了 observer-x 变量响应式监控、decorator-x 现代实体类注解与 Swagger API 文档生成、declarative-validator 校验、x-fetch 网络请求等模块。
2018 年在保证自己每天开心地做好本职工作之余,希望完成思虑(拖延)多年的 Java 并发编程与 JVM 实战系列、熟悉并且实践 Rust、真正地能将机器学习与深度学习用起来。虽然 Rust 尚未投入到生产环境中,但是笔者认为其是非常不错且合适的 JavaScript 技术栈的互补;其编译为 WebAssembly 的能力以及作为 Node.js 原生插件,都能够弥补 JavaScript 在性能上的不足。对于 Rust 的学习与使用也并非朝夕之事,还是需要较长时间的了解与实践才能用好。今年前端框架之战逐渐平静,期待明年的编译元年,为前端带来更多的可能。
今年的很多时间还要来筹备婚礼,12.30 携妻手踏入婚姻的殿堂,工作繁忙之后很多的文案整理与发布也都是她帮我处理的,每天回家之后才能进行些内容写作,或者维护些项目代码。感谢尾尾,感谢川哥,谢谢一年来很多前辈同仁的提携与指导,支持与鼓励;谢谢每一位阅读我的文章,批评、指正、认可我的人,谢谢你们给予我前进的动力。山高水远,来年再见~
(各领域更多内容查看 Knowledge Map - IT 知识图谱与技术路线)