知识体系:你与高手之间到底差在哪?
你好,我是郑晔!
对于大部分程序员来说,无论在真实工作中职务是什么,在内心里,他都更希望成为一个高手,一个能够不断精进的高手!
然而,很多人不知道自己和高手的差距在哪里,只会埋头努力,结果,常常是效率极低,进展有限。
你与高手之间的差距
我们来看一个小故事:
程序员小李已经工作了三年,在同龄人中,他已经很优秀了,能够解决工作中的大部分问题,但他从未满足过,因为在他心中,一直有一个让他不停追赶的高手:技术负责人老赵。
老赵也挺欣赏这个优秀的苗子,愿意时不时提点他一下。有一次大家在一起闲聊,小李对老赵聊起了心中的疑问:我怎么觉得你什么都知道。
老赵:我工作这么多年了,知道一些基础的东西很正常吧。
小李:不光是基础的东西,很多新东西你也知道,比如,大模型。
老赵:我们当程序员的,不能停了学习。AI 一出来,我觉得这是个好东西,就花了点时间看看。
小李:我也是在大模型一出来就花时间看了,但显然我理解的深度远远不如你。
老赵:你学习新东西怎么学?
小李:不是找各种文档,从头开始学吗?
老赵:你这么学东西会不会觉得很累?
小李:确实很累,每次学个新东西,我都要看大量文档,陷入到很多细枝末节中,花费大量的时间。
老赵:你为啥要花那么多时间看文档呢?
小李:不然我怎么学会呢?
老赵:我知道我们的差别在哪了?你看的是全量,我看的是增量。
小李:全量?增量?什么意思?
老赵:我学新东西,只看这里面对我来说哪些东西是新的。其实一个新东西出来,真正的新东西没有多少。
小李:为啥我觉得都是新东西呢?
老赵:你可能还没有建立起你的知识体系。
小李:知识体系?
老赵:对,当你建立起知识体系之后,任何新东西都会在这个体系上找到自己的位置,它和我已有的知识都能关联起来,所以,我才说我学东西都是增量。而缺少知识体系的话,任何东西都是全新的,学起来就是全量。
小李:你这么说,我有点懂了。如果新东西和我已有的知识有一些关联,确实学起来会轻松一些。
老赵:想成为一个优秀的程序员,必须要有一个良好的知识体系,否则,往后走会很难的。
从上面这个小故事,我们不难知道,在外人看来,高手知道很多东西,且上手新东西很快,但这些高手并非多么天赋异禀,他们也需要为了新东西付出极大的努力。
但同样是学习,高手往往都有强大的知识体系做支撑,学起新东西是很快的,因为他很清楚学到的东西应该放在自己的知识体系中哪个地方,而已有的知识可以帮助他更好地学习。
你现在已经知道知识体系的重要性,但接下来的问题就是:我该怎么建立起自己的知识体系?
构建知识体系
在构建自己的知识体系之前,我们首先应该知道,每个人的知识体系都是不同的,因为我们各自从事的工作方向不一,所以,我们先要对构建知识体系这件事本身有个了解。
对于程序员来说,我们要掌握的知识分成三大类:
- 基础通用的知识:这是所有程序员都需掌握的,是程序员的必备知识,比如网络、操作系统等,无论你做的是前端,还是后端,都应该有所了解。
- 专业特定的知识:这是程序员在选定职业方向后,要深入学习的该方向的知识。前端程序员需熟悉前端框架、构建工具;后端程序员要掌握各种中间件,还可以再进一步细分,Java 后端程序员还需了解 JVM。这是在选定方向立足的关键。
- 行业领域的知识:这是程序员进入到某个具体的行业需要了解的领域知识,比如,进入到安全领域,就需要了解安全领域的知识,进入到金融领域,就需要知道金融的知识。
从基础通用知识,到专业特定知识,再到行业领域知识,知识范围由广变窄,内容由浅入深,相应地,掌握相关内容的人也会人数也递减。
从我们构建知识体系的角度看,基础通用的知识是我们无论如何都应该掌握的,是从事程序员这个行业必备的基础知识;而专业特定的知识是我们在选择了一个大方向之后,必须要掌握的内容,这也是我们在一个行业立足的根本,因为我们可能会换公司,但换大方向的概率就低多了。
至于行业领域的知识,往往和我们在一个公司从事的具体工作是相关的。所以,从策略上讲,通用的知识和特定的知识是我们要先建立的基础。有了这样的认知,才是考虑如何具体地去构建知识体系。
下面就以基础通用的知识为例,看看构成程序员知识体系有哪些必需的内容。
对一个程序员来说,其最核心的能力一定是技术能力。技术能力,指的是程序员解决问题的能力,这是程序员最基础、最核心的能力,包括但不限于:
- 实现能力
- 设计能力
- 解决问题能力
- ……
其中,实现能力是程序员最基础的能力,也就是把一个软件/系统实现出来的能力。
这里要强调一点,我们不应该把实现能力理解为使用框架写代码。在 AI 已经普遍流行的今天,像单纯地使用框架这种套路性的工作,已经可以很好地由 AI 完成了。一个不是特别懂编程的人也可以用 AI 写代码了,我们和他们的区别是什么呢?
作为专职程序员,我们需要理解技术原理,掌握相关的基础知识。这样,我们才能提出和定位一些更有价值且深层次的问题。
我们先来看看基础知识。按道理说,基础知识是一个程序员必须要具备的,但实际情况是,我经常会遇到我以为常识的东西,一些人根本不知道。出现这种情况的一个重要原因就是,很多程序员并非科班出身,在基础知识上往往有所欠缺。
基础知识的欠缺也让很多程序员难以在技术路上走远。当然,我也认识很多优秀的非科班出身的程序员,他们无一例外地都通过各种途径将基础知识补齐了。
程序员的基础知识有哪些呢?
- 算法数据结构
- 计算机体系结构
- 操作系统
- 程序设计语言与编译器
- 数据库
- 网络
- 分布式系统
- ……
如果你被这个列表吓到,证明你确实有很多欠缺的东西,因为这些内容都是计算机的专业课。
当然,你并不需要真的坐到大学的课堂中去学习这些东西。作为一个专业的程序员,最强大的能力一定是自学。好在有人已经把如何自学这些内容整理出来了,你可以看看《自学计算机科学》。
相比于我当年学习这些内容之时,今天的学习资料更容易理解了。很多学习资料不仅仅是单纯地讲原理,而是动手做了实现,比如实现一个编译器。大多数程序员的自我定位是一个工程师,而非计算机科学家,只要能够跟着一些资料实现一遍,我们的理解就可以向前大幅度地迈进一步。
关于实现能力,还有一点也很关键,就是要有端到端的实现能力。很多程序员脑子里只有写代码,对于代码是如何在生产环境中运行起来的知之甚少。
在面试前端程序员的时候,我曾经问过一个问题,我写好的代码部署之后无法访问,该如何排查。结果很多人都不知道从何下手,他们对于 DNS、Web 服务器(比如 Nginx)之类的一无所知,只会在本地把程序启动起来调试代码。
今天一个普通的 Web 应用通常会有域名、负载均衡、Web 服务器、数据库、缓存、消息队列等等,最后才是我们写的前后端代码。所以,一个程序员如果不能了解从前到后这些内容,知识面确实就非常局限了。
通用知识还包括设计能力。这里的设计主要指的是软件设计,软件设计并不与具体的程序设计语言紧密相关,所以,它是一种通用的知识。
软件设计是一门应对软件长期变化的学问。很多人对于软件设计的理解属于盲人摸象,缺少结构,而学习软件设计的一个关键点就是建立起关于软件设计的知识结构:
- 程序设计语言:软件设计的实现载体。
- 编程范式:可以使用的设计元素。
- 设计原则:设计元素的组合原则。
- 设计模式:在具体场景下的设计元素组合方式。
- 设计方法:识别设计元素的方式。
其实,这些内容是我在《软件设计之美》专栏里讨论的内容,如果希望了解更多,不妨去那个专栏里学习。
至于解决问题的能力,就是发现问题解决问题的能力。这里面既包含了技术问题,也包含了非技术问题。
其实,解决技术问题是程序员特别擅长的,而非技术问题在真实的软件开发过程中常常是很大的阻碍,而这恰恰是《10x 程序员工作法》这个专栏里讨论的问题,这里就不过多赘述了。
总结时刻
这一讲,我们讨论了普通程序员和高手程序员之间的差距。一个高手看上去是知道得多,学东西快,其实背后是有一个强大的知识体系在作为支撑。有了一个强大的知识体系,新的内容只是这个知识体系上的增量,已有的知识会帮助新知识更好地融入其中。
知识体系很重要,每个人的知识体系也不尽相同,但我们可以知识分成三大类:基础通用的知识、专业特定的知识和行业领域的知识。
基础通用的知识,是所有程序员都应该掌握的,专业特定的知识是某个专业方向的程序员应该了解的知识,而行业领域的知识是某个特定领域程序员应该了解的知识。
基础通用知识是所有程序员都应该掌握的最核心的部分,包括但不限于实现能力、设计能力和解决问题能力。
其中,实现能力是最核心的,对于程序员来说,最重要的就是基础知识,本来这部分应该是常识,但由于很多程序员是非科班出身,造成的结果就是基础知识的欠缺,难以在技术的路上走远。
设计能力是《软件设计之美》专栏里讨论的内容,而解决问题的能力之中很大一部分内容则是在《10x 程序员工作法》这个专栏里讨论过了。
如果今天的内容你只能记住一件事,那请记住,想要成为高手程序员,需要构建一个强大的知识体系。
思考题
在这一讲里,我讨论了基础通用的知识包含了哪些内容。请你结合自己的实际情况,列举一下你专业特定的知识和行业领域的知识包含了哪些需要掌握的内容。
欢迎你在评论区留言,我们下节课再见~
- 快手阿修 👍(0) 💬(1)
我是一名PaaS领域面向金融行业的解决方案架构,对于我来说,各模块内容如下: 1、基础通用的知识(关于解决方案架构):市场洞察能力、POC测试引导能力、解决方案构建能力、客户沟通交流能力、项目管理及资源撬动能力、已有局点持续运营能力。 2、专业特定的知识(关于PaaS):了解微服务、分布式中间件、可观测、高可用等领域的技术演进历史、领域主流解决方案、最佳实践及自身和友商产品能力对比。 3、行业领域的知识(关于金融):以银行为例,要了解银行核心、外围、柜面系统之间的交互关系,了解核心存贷汇的交易支付流程,了解商业银行与人行清算机构关于大小额、网银、跨行转账的清算、轧差交互流程,了解人行对于各商业银行的监管要求。综合所有行业知识推导出金融机构对于技术平台以及PaaS层的能力要求,在售前拓展过程中做方案讲解时可以做到有的放矢。
2025-01-18