Skip to content

Latest commit

 

History

History
164 lines (55 loc) · 8.66 KB

导读 程序员如何打好计算机领域的基础?.md

File metadata and controls

164 lines (55 loc) · 8.66 KB

在正式讨论之前,我想先问两个问题:

  • 程序员应该具备的基础知识指的是什么
  • 计算机领域的基础指的又是什么

举个例子,C 罗一脚把球踢进了对方的球门,这充分体现了物体之间的作用是相互的,所以足球运动的基础是物理学。

你觉得这句话有什么问题吗?要我说,上述的讨论脱离了 Context,翻译成中文是 “上下文”。

那什么是上下文呢?比如某场足球比赛,大家纷纷讨论 C 罗射门进球,这个话题讨论的其实是他高超的球技。

计算机领域也是一样,上下文指的是计算的背景和环境。我们说一个应用架构好,体现了程序员高超的应用开发能力。既然是应用开发能力,那么它的基础就不应该是电子和数学。程序员写程序,程序经过编译后变成应用,应用执行起来就是进程

在日常生活里,用户浏览网页时看到的是图形,用鼠标点按钮的背后是显卡和中断;用户以为自己每天使用的是应用,实则是进程;用户模糊地知道,连麦是把光电信号传输过去,而程序员明确地知道,用户通过网络协议传输了二进制数据;用户以为通过微信就可以直接把消息发给张三,但其实消息首先到达的是微信服务器。

如果你是一名程序员,会很清楚地知道以上这些 “表象” 背后的“实质”,这便是程序员的基础知识。

为什么程序员要打牢基础?

大部分工程师的基础知识掌握得并不扎实。

程序员学好基础知识,是为了更好地开发应用、开发服务。相信你也听过,大牛们常对小年轻们说,要 “打牢基础”,但是你现在可能还不知道所谓的基础有哪些,

基础知识,就好像是瓦纳大陆中构造整个世界的七种元素一样,有独自的能力,又可以互相反应。因此,学好计算机领域的基础知识,你会受到更多大厂的青睐,遇到更好的机遇,拿到含金量更高的 Offer。特别是别人在你的项目中,也会感叹这精妙的设计和扎实的内功。

那么接下来我们就具体聊聊,构成应用程序的 7 种基本元素——也就是大牛们所说的 “基础”,关于如何 “打牢”,不要急,你也能从下文中找到答案。

构成应用的 7 种基础元素

img

1. 计算机组成原理

讲述的是计算机是什么?计算是怎么回事?硬件如何为应用提供计算?作为工程师你只需要了解核心知识即可,其实计算机组成原理中涉及很多有趣的常识问题,比如能不能写一个程序判断计算机是不是开机状态?

2. 操作系统

操作系统对于我们最大的实践意义是:如何合理规划应用的生命周期以及资源使用,比如如何处理高并发、如何提升系统的稳定性、如何节约硬件成本等。具体来说学好操作系统,在写应用、服务的时候,就可以对 CPU、磁盘、内存、网络等资源进行合理规划,达到较高的利用率。所以,每个应用开发者都需要重视这块知识。

如果你想了解数据库、分布式文件系统、协程的底层实现,都可以从这门课开始了解……

3. 计算机网络

计算机网络讲的是应用之间如何进行通信、如何设计应用之间的契约,形成稳定、高效、规范的协作关系(也就是协议);并通过优化网络的性能,最终节省成本或者让用户满意。比如你:

  • 为了让页面秒开、服务秒回,做出的所有的努力;
  • 为了优化网络传输细节,去调整 TCP 的滑动窗口;
  • 为了提升网络的吞吐量、减少延迟,去开启多路复用能力;
  • 为了避免 Downtime,去调整网络的连接池和线程数;
  • 为了开发某个应用,尝试去理解一些应用层协议,比如 SSH、RTCP、HTTP2.0, MQTT 等;
  • 为了做好日常开发,去理解一些基本概念,比如 DNS、CDN、NAT、IPv4/6 等。

今天,计算机网络已经成为应用提供价值最重要的一环。

自从人们可以上网浏览图片后,逐渐吸引了大量人去冲浪。从互联网起步,到今天几十亿个网站,全球 40 亿网民数量,也就经历了短短几十年。我们的生活被外卖、电商、社交、游戏、娱乐、短视频、金融、电影改变,而这些服务都离不开网络。

对于我这样的 80 后,刚好完整地感受了这种变化。Web 1.0 时代,我还在浏览门户网站;Web 2.0 时代,我们已经将实体关系搬到了网络上;到了 Web 3.0 时代,计算机技术开始通过网络调度人和设备,为实体分配任务,比如滴滴调度专车司机、美团调度外卖配送员。

有人说这是互联网下半场的表现,而事实上虚拟现实、智能硬件、自动驾驶的时代,都还没有到来,行业发展仍需要大量的优质人才。

学完计算机组成原理、操作系统、计算机网络这 3 部分知识,你所学的基础就形成了一个完整的闭环。此时你对硬件、软件的理解,对性能、缓存的理解,都会更进一步。这些看似独立的知识实则相辅相成,比如:

  • 学习网络知识能够让你更深入地看到操作系统的 I/O 和线程模型;
  • 学习操作系统会看到对网络的监控、故障排查、端口、CPU 和内存的使用;
  • ……

因此,弄清知识之间的内在联系,更有助于形成合力构建自己的知识体系,帮助你成为优秀的工程师、架构师。

4. 算法和数据结构

算法和数据结构是两种科学,但是又彼此相互关联。算法是一个计算过程,数据结构是数据的组织方式。无论是计算过程还是数据的组织,我们都需要一个优化的方式——这就是算法和数据结构讨论的问题。

一个问题,有很多种解决方案,那么你想不想知道最优解是什么?虽然在给定资源的条件下,只要资源没有耗尽,问题得到解决,让用户满意,就不需要最优方案——比如最低的延迟、最少的计算时间、最大的空间利用率。

但是用户的满意有尽头吗?答案必然是没有。

5. 图形学

图形学讨论的是应用和人之间的交互桥梁。有同学会问,那我不开发带图形的应用,只开发后端服务,还需要学习图形学吗?

我只能说,如果你对未来的世界,比如电影、VR、AR、虚拟世界、自动驾驶等充满好奇和期待, 可以尝试学一下这门课。特别是想学 AI 的同学,要知道,深度学习把数据看作图片,让 AI 下棋,你以为它在思考,其实它只是从很多图形中找到概率特征。

6. 编程技巧

编程不是算法,编程是语言。语言研究的是怎么表达得更清楚。中国自古有信、达、雅的说法,编程也是这样。算法是解决某个实际问题的计算步骤,研究如何让这个计算步骤以最小的代价实现。而编程研究的是怎么用程序表达,阅读起来更方便、维护起来更简单,代码本身就像注释一样清楚。

这是 7 种元素中,最重要,也是最难的一门科学。其他 6 种元素(基础知识),工程师往往学到一定程度,够用就行,而编程的技艺则需要一直深入学习、不断探索。

7. 编译原理

在没有学习这门课程前,想深入任何一门计算机语言的底层,都会有相当大的难度。编译原理讲述的是程序语言如何被实现、源代码又如何被编译成应用。比如你想了解 JVM、V8 等引擎;想了解 Go/C++ 的编译器,从编译原理学起是不错的选择。

当然,对于应用开发者而言,编译原理提供的最大价值,就是用元编程技术设计自己的领域专有语言,从语言层面降低研发成本、提高交付效率。长此以往,还会发现系统有一些额外的能力是你之前没有想到的。比如 C++ 之父看到有个年轻人用自己设计的 C++ 模板在编译阶段计算圆周率,这就是他万万没有想到的额外能力,这种能力被称为模板元编程

总结

7 种元素是组成应用的 7 种基本科学。但不得不说,学习这 7 种元素还是非常耗时耗力的,需要非常有耐心,循序渐进,反复多遍去学习。