June 15, 2021
By: Kevin

作为一个程序员: 我希望我早点知道的6件事

  1. 把握基础, 信息是附带的
  2. 驾驭知识, 不要被信息淹没
  3. 回顾历史, 尊重经验, 但是更要着眼未来
  4. 形成积累
  5. 形成自己的观点, 从个人角度解决问题
  6. 无论你喝了多少鸡汤, 读了多少文章, 总还是要花时间, 去磨练和实践

计算机程序, 虽然不同于数学证明的恢弘完备, 诗歌的顿挫优美, 画作的绚烂多彩, 它们在一点上高度类似: 都是我们脑中观念的具象.

“A mathematician, like a painter or poet, is a maker of patterns. If his patterns are more permanent than theirs, it is because they are made with ideas.” —G. H. Hardy, "A Mathematician’s Apology"

一个好的程序员, 和数学家一样, 是时间和灵感结合的产物. 思考和学习的过程, 也始终是个个人探索的过程, 作为一个从业十余年的'前人', 在此我有些经验, 我真心希望能告诉15年前曾经的自己.

把握基础, 信息是附带的

学习过程依赖于现有的知识网络和学习的基础方法, 要专注于核心能力而非信息获取. 不是说信息获取不重要, 但主次一定要明确. 孔子说"吾道一以贯之", 基础是最重要的, 就像欧几里得的公理一样, 定理/推论/知识都是公理的发展和推演.

基础知识是元知识(meta-info), 如果说信息是表格里的一条条数据的话, 基础知识就是表格本身.

所有的认知(知识, 信息)都有半衰期, 但无疑基础知识的半衰期更加长久.

譬如前端, 前几年的JQuery已经不大有人提起了, angularJS/Amber/Backbone也已然式微.

沉迷于某项技术/框架搞不好是一种浪费, 因为它占据了你发展核心原则, 建立基础知识网络的时间.

核心原则有更为长久的半衰期, 知识积累的唯一用处就是帮助建立你的核心原则.

核心原则是什么呢? 在不同的阶段有不同的定义, 我的建议是根据自己的现状去思考, 每个人在不同的时间会有不同的答案, 抓住你当前认为是核心原则的就好了. 也有个常识性的判断依据:

  1. 恒久的:数学知识
  2. 长久的:Unix/Emacs/Shell/Lisp/c/socket/http/thread
  3. 普适的:英语, 写作
  4. 软技能:演讲, 表达, 共情能力

把握核心原则的另一个特征是适应变化. 在漫长的职业生涯中, 会不断遇到变化和挑战. 希望你, 年轻人, 每一次都是有备而来.

驾驭知识, 不要被信息淹没

现代社会, 信息的产出是指数级增长的, 牛顿被成为经典时代的最后一个通才, 即一个人能掌握他所在领域的全部知识.

这对于现代的任何领域的专家都是一个奢望, 学科的知识衡量可以用论文数来衡量

程序员的代码产出可以用repo的数量来衡量, 这个是github早期的一个blog, 我们看到repo的数量是指数级增长的.

https://github.blog/2013-12-23-10-million-repositories/

指数级增长的事物均不可持续, 但是我们现在远没有看到信息增长的终点;

永远不会缺乏信息, 你缺乏的是注意力和思考.

回顾历史, 尊重经验, 但是更要着眼未来

历史上最重要的事情大概率不会出现在今天的新闻上, 哪怕是仅以计算机技术短短70的历史的来说, Unix, 正则表达式, TCP/IP, Lisp, C语言哪怕是GIT, 都比WWDC2021重要很多.

学习不是为了老师的过去, 而是把握学生的未来. 学习和分享双方的视角是不一致的, 我在分享我的过去, 而你要从中学习, 并且把握自己的未来.

把有限的注意力交给哪些最值得交付的人: Alan Key, Linus Torvalds, Bob Martin, Richard Feynman, Rich Hicky.

我有我的经验(大多数时候是靠得住的), 但就像证明题一样, 你要首先读懂我的证明过程.

形成积累

我们会遗忘. 自从逃离学校以后, 上一次有人对你说得把这个背下来是什么时候的事情了?

没有记录, 真的记不得还记得什么...

我在写这个markdown的时候发现忘记了启动转html的命令"lein ring server".

  1. 写设计, 是为了梳理思路, 清晰表达, 形成共识.
  2. 写笔记, 为了帮助三天后健忘的自己.
  3. 写blog, 只为记录自己的挣扎的过程.
  4. 先记录再分享, 把一个事情讲清楚比骗自己说大概明白了要难很多.

形成自己的观点, 从个人角度解决问题

做所有人在做的事情, 是注定无法超过平庸的. (you can not beat the average by doing what everyone is doing)

不要被共识裹挟. 共识的形成并不由真知决定, 音量很多情况下起决定作用. 互联网上的技术风向尤其如此.

每年都会诞生新的词汇和风潮, 俨然就是一场大的时尚秀. 时尚会有人买单, 会辐射, 下沉, 决定未来一季的色系和风格. 技术上不是这样, 技术团队的领导者的技术选择从来都应该从自身经验出发, 可理解, 可掌控, 降低复杂度.

流行的解决方案解首要的特征是"传播特质", 一般是:

  1. 出身:要系出名门(互联网大厂方案)
  2. 故事性: 要有高质量的配图, 好的文章组织
  3. 迎合受众的偏好: 和读者的认知圈贴近, 多少得有了解, 会有参与感.

不要局限在<<十天学会高并发Spring>>, <<一篇文章讲透Mybatis>>

编程的世界无比广阔, 协议实现, 工作调度, 可视化, 硬件通讯, 高可靠性, 仿真模拟, .....

形成你自己的观点.

无论你喝了多少鸡汤, 读了多少文章, 总还是要花时间, 去磨练和实践

感谢你有耐心读到这里.

不论跟谁学习, 学习什么, 你还是你. 就算弗格森给你当教练, 场上的球也是你自己一脚一脚踢出来的. 教练只能给你经验, 给不了实践.

在某个领域做到异常出色是需要天赋的, 但天赋也仅仅是个必要条件, 异类 提出的10000小时定律: 任何领域的专家都需要10000小时的"专心致志的"事件.

优秀从来都是知难行易.

Tags: programming