# notebook **Repository Path**: tomgs/notebook ## Basic Information - **Project Name**: notebook - **Description**: 学习笔记记录 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2020-08-07 - **Last Updated**: 2025-10-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 学习笔记记录 构成应用的 7 种基础元素 ![2021419-104354.png](.img/CioPOWB87oeACgMQAAC_jD-PExg613.png) 先推荐三本:《编译原理》龙书是最简单的了、《现代操作系统》、《计算机网络-自顶向下方法》 1. 计算机组成原理 讲述的是计算机是什么?计算是怎么回事?硬件如何为应用提供计算?作为工程师你只需要了解核心知识即可。 2. 操作系统 操作系统对于我们最大的实践意义是:如何合理规划应用的生命周期以及资源使用,比如如何处理高并发、如何提升系统的稳定性、如何节约硬件成本等。具体来说学好操作系统,在写应用、服务的时候,就可以对 CPU、磁盘、内存、网络等资源进行合理规划,达到较高的利用率。所以,每个应用开发者都需要重视这块知识。 3. 计算机网络 讲的是应用之间如何进行通信、如何设计应用之间的契约,形成稳定、高效、规范的协作关系(也就是协议);并通过优化网络的性能,最终节省成本或者让用户满意。 学完计算机组成原理、操作系统、计算机网络这 3 部分知识,你所学的基础就形成了一个完整的闭环。此时你对硬件、软件的理解,对性能、缓存的理解,都会更进一步。这些看似独立的知识实则相辅相成,比如: 学习网络知识能够让你更深入地看到操作系统的 I/O 和线程模型; 学习操作系统会看到对网络的监控、故障排查、端口、CPU 和内存的使用; …… 因此,弄清知识之间的内在联系,更有助于形成合力构建自己的知识体系,帮助你成为优秀的工程师、架构师。 4. 算法和数据结构 算法和数据结构是两种科学,但是又彼此相互关联。算法是一个计算过程,数据结构是数据的组织方式。无论是计算过程还是数据的组织,我们都需要一个优化的方式——这就是算法和数据结构讨论的问题。 一个问题,有很多种解决方案,那么你想不想知道最优解是什么?虽然在给定资源的条件下,只要资源没有耗尽,问题得到解决,让用户满意,就不需要最优方案——比如最低的延迟、最少的计算时间、最大的空间利用率。 5. 图形学 图形学讨论的是应用和人之间的交互桥梁。有同学会问,那我不开发带图形的应用,只开发后端服务,还需要学习图形学吗? 我只能说,如果你对未来的世界,比如电影、VR、AR、虚拟世界、自动驾驶等充满好奇和期待, 可以尝试学一下这门课。特别是想学 AI 的同学,要知道,深度学习把数据看作图片,让 AI 下棋,你以为它在思考,其实它只是从很多图形中找到概率特征。 6. 编程技巧 编程不是算法,编程是语言。语言研究的是怎么表达得更清楚。中国自古有信、达、雅的说法,编程也是这样。算法是解决某个实际问题的计算步骤,研究如何让这个计算步骤以最小的代价实现。而编程研究的是怎么用程序表达,阅读起来更方便、维护起来更简单,代码本身就像注释一样清楚。 这是 7 种元素中,最重要,也是最难的一门科学。其他 6 种元素(基础知识),工程师往往学到一定程度,够用就行,而编程的技艺则需要一直深入学习、不断探索。 7. 编译原理 在没有学习这门课程前,想深入任何一门计算机语言的底层,都会有相当大的难度。编译原理讲述的是程序语言如何被实现、源代码又如何被编译成应用。比如你想了解 JVM、V8 等引擎;想了解 Go/C++ 的编译器,从编译原理学起是不错的选择。 当然,对于应用开发者而言,编译原理提供的最大价值,就是用元编程技术设计自己的领域专有语言,从语言层面降低研发成本、提高交付效率。长此以往,还会发现系统有一些额外的能力是你之前没有想到的。比如 C++ 之父看到有个年轻人用自己设计的 C++ 模板在编译阶段计算圆周率,这就是他万万没有想到的额外能力,这种能力被称为模板元编程。 路漫漫其修远兮...