learn-tech/专栏/计算机基础实战课/00开篇词练好基本功,优秀工程师成长第一步.md
2024-10-16 10:18:29 +08:00

120 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

因收到Google相关通知网站将会择期关闭。相关通知内容
00 开篇词 练好基本功,优秀工程师成长第一步
你好我是彭东网名LMOS。很高兴在极客时间和你相遇一起开启计算机基础的修炼之旅。
先来介绍一下我自己。我是 Intel 傲腾项目开发者之一,曾经为 Intel 做过内核层面的开发工作,也对 Linux、BSD、SunOS 等开源操作系统,还有 Windows 的 NT 内核很熟悉。
这十几年来我一直专注于操作系统内核研发。先后开发了LMOS基于x86_64的多进程支持SMP的操作系统和LMOSEM基于ARM32支持软实时的嵌入式操作系统还写过《深度探索嵌入式操作系统》一书。去年5月份我在极客时间上更新了《操作系统实战45讲》这个专栏和你分享了我多年来开发操作系统的方法和经验。
通过课程的互动交流,我发现很多同学因为基础知识并不扎实,所以学操作系统的时候非常吃力。而计算机的基础知识,不但对于深入理解操作系统有帮助,对我们工程师的技术提升也是一门长期收益的必修课。
打牢计算机基础有什么用?
就拿我的亲身经历来说我既做过前端、后端的工作也做过内核的开发。出现Bug和故障的时候我总能快速理清排查思路选用合适的工具、技术来分析问题高效Debug一个项目摆在我面前迅速分析出项目的痛点、难点整理出实现功能需要哪些技术框架也是驾轻就熟。
很多同事跟朋友对这样的能力心向往之,好奇我有什么“秘诀”。其实,能来回穿梭于底层与高层之间,不至于手忙脚乱,我最大的依仗就是深厚的计算机基础。
无论你是计算机初学者,还是已经工作了几年的老同学,对于“打牢基础很重要”、“基础不牢、地动山摇”这样的话,估计耳朵都要听得磨出茧子了。但到底计算机基础威力有多大呢?
举个例子就像你编写你人生的第一个程序——Hello World。这个程序非常简单同时也非常复杂简单到你只要明白调用函数“printf(“Hello World\n”);”就能在屏幕上打印出Hello World的字符难的是这个程序的背后细节尽管这个程序不过数行代码却需要芯片、编程语言、进程、内存、IO等多种基础设施的配合才能完成看似简单的功能。
当然在写Hello World程序这个起步阶段我们只要知道printf函数如何使用就行了这是因为这程序简单到只是输出Hello World就结束了不会给系统或者其它软件带来副作用。
但若是我们要开发大规模应用系统,如电商服务系统,问题就会变得复杂。比如:
这个服务应用要用什么语言来编写?-
是采用单体进程,还是用多个进程来协同工作?-
如何管理长期使用的内存空间如何避免系统IO抖动-
如何处理网络带来的各种问题,比如通信拥堵、拒绝请求,甚至掉线?
这些问题显然不是我们知道这些方面的几个接口函数就能解决的。发现没有你可以用很短的时间跑起来一个Hello World但想保障一个电商系统运转如常感觉难度上是天壤之别。工程复杂度带来的差异让我们不得不继续钻研试着“理解”计算机。
我再说一个MySQL的例子在往生产数据库中导入部分数据时会造成客户端的访问超时。你可能怀疑这是MySQL自身问题也可能怀疑是服务器系统的问题。其实两者都不是此时即使你对MySQL的各种操作都了然于胸还是对解决这类问题一头雾水。
如果你没能掌握文件系统、Cache、IO等基础的话就很难想到用iotop、iostat等工具去查看IO操作也就无从发现MySQL在导入数据时还会产生大量的日志而这些日志也需要存盘引发大量IO操作导致IO带宽爆满造成访问超时。更不用说想到可以用MySQL的innodb_flush_log_at_trx_commit来控制MySQL的log行为了。
再比方说如果你不知道操作系统与CPU、RAM等硬件的交互原理就很难理解JVM为啥要抽象出堆、虚拟机栈和本地方法栈、程序计数器、方法区之类的概念来屏蔽硬件差异更别说理解JVM、JUC中的内存管理、多线程安全的核心设计思想了。你看写不出高并发、安全可靠程序的瓶颈深究起来欠缺的竟然是底层基础知识。
除了复杂的软件工程问题,日新月异的前沿技术也离不开计算机基础的软硬件知识。
系统设计领域只有研究过对CPU提供的SIMD指令集才会联想到可以像ClickHouse一样基于向量化执行来提升计算速度在云原生方面只有熟知文件系统的系统调用和运作原理才能设计出一款优质的分布式文件系统或者设计出基于UnionFS的Docker 镜像机制让容器真正发挥优势AI领域同样如此只有透彻理解了语言与指令、内存与应用才有可能通过基础的软硬件技术配合优化存储层次最终调优加速AI框架……
总之想要成为优秀工程师就需要你深入芯片、内存、语言、应用、IO与文件等这些基础组件学习研究甚至还要钻研语言指令的运转搞懂芯片尤其是CPU的机制原理。这些基础不仅仅是对计算机本身很重要对从事计算机的任何细分行业的每个人都很重要。
计算机基础要怎么学?
也许你跟我一样,不是计算机专业科班出身,所以起步时更加步履维艰。通常被后面这几类问题困扰:不确定学什么,不知道怎么学,硬记了概念不明白技术原理,更别说学以致用了。
这些问题让我们面对内容繁多的计算机知识时不知如何下手于是开始自我怀疑总想打退堂鼓。从只会用C写个Hello World到可以用C语言自研操作系统内核我同样经历了漫长的修炼之旅。我也遇到过各种各样的问题通过不断地学习和实践才解决了诸多疑难杂症。
我希望把自己积累的大量计算机学习基础方法经验通过这门课分享给你帮你把计算机从底层到应用的关键知识点串联起来。除了学习原理概念、理顺知识点动手实践的环节也不可或缺配套的执行和调试代码我之后都会放在Gitee上方便你随堂练习。
这个专栏我是这样安排的:
历史
一个东西,从何而来,何至于此,这就是历史。学计算机基础,我们需要先学习它的历史,学习计算机是怎么一步步发展到今天这个样子的,再根据今天的状况推导出未来的发展方向。
我并不会长篇累牍地给你讲什么编年史而是重点带你了解可编程架构是怎么创造出来的、CPU从何而来、CISC和RISC又各有什么优缺点。知道了这些你就能理解为什么现在国家要提倡发展芯片产业RISC-V为何会大行其道。
芯片
万丈高楼从地起,欲盖高楼先打地基。芯片是万世之基,这是所有软件基础的开始,执行软件程序的指令,运算并处理各种数据都离不开它。
因此了解芯片的工作机制对写出优秀的应用软件非常重要。为了简单起见我选择了最火热的RISCV芯片。这个模块里我们将一起设计一个迷你RISCV处理器。哪怕未来你不从事芯片设计工作了解芯片的工作机制也对写出优秀的应用软件非常重要。
环境
学习讲究“眼到,手到,心到”,很多知识如果想牢牢掌握,就离不开动手实践。
而搭建好编译环境和执行环境就是实践的前提方便后面的学习里我们去调试程序验证理论。环境篇我们最终会跑出RISC-V平台的Hello World程序作为这一关的阶段性成果。
语言
一个合格的程序员必须要掌握多种编程语言这是开发应用软件的基础所以我选择了最常用的C语言以它为例让你理解高级语言是如何转换成低级的RISCV汇编语言的。
我不光会带你学习C语言各种类型的形成、语句与函数的关系还会给你搭建一座理解C和汇编对应关系的桥梁。汇编语言方面我会以RISC-V为例介绍其算术指令、跳转指令、原子指令和访存指令并带你学会调试这些指令加深你对指令的理解。
应用
具备了编程语言的知识基础,我们就可以开发应用了。应用往往与内存分不开,我们一起来了解应用的舞台——内存地址空间,接着会引入物理内存、虚拟内存。理解了内存,理解进程也会手到擒来。
虚拟内存跟物理内存如何映射和转换?应用堆和栈内存有什么不同?应用内存是如何动态分配的?为什么操作系统中能并行运行多个不同或者相同的应用?多个应用之间如何通信?这些重难点问题,我们一个都不会漏掉。
IO
跟软件应用直接关联的除了芯片和内存之外就是IO即输入输出系统了。无论是交互式应用、还是数据密集型应用都不得不接收各种数据的输入然后执行相应计算和处理之后产生输出。
有的应用性能不佳实时性不强更有甚者丢失数据面对这些令人头疼的问题不懂IO就无法处理。我们想要开发高性能的应用程序就不得不学习IO相关的基础知识了。因此我们会重点学习IO的操作方式、IO调度、IO缓存Cache以及Linux操作系统是如何管理IO设备的。我还会引入iotop和iostate工具带你掌握怎么用它们来攻克应用的IO性能瓶颈。
文件
很少有应用不需要储存读写文件的,特别是各种网络应用和数据库应用,一个合格的开发者必须对文件了如指掌。
想要提升应用读写数据性能做好数据加密特别是优化网络数据库应用深入了解文件和文件系统都是相当关键的。理清文件的基础知识点之后我们还会研究一个Linux文件系统实例的内部细节检验之前所学。
综合应用
经历了前面这些关卡,在综合应用篇里,我会带你了解如何从底层角度审视前端技术跟后端架构。优秀工程师通常具备超强的知识迁移能力,能够透过各种多变的技术表象,快速抓住技术的本质。这将是你未来拓展学习更多应用层技术,顺利解决日常业务里前后端性能问题的良好开端。
技术雷达
最后,我还设置了技术雷达的加餐内容,和你聊聊云计算、大数据跟智能制造。这些热门领域其实都是对基础技术的综合应用,有助于你开阔视野,给工作选择增加更多可能性。
这个加餐,我安排在正文结束之后的一个月和你见面(每周更新一节课,共五节课),这一个月是留给你吸收消化前面所学内容的时间。
总之,在你学习更多应用层技术以前,通过这门课补充前置知识很有必要。这既是所有有志于成为高手的工程师绕不开的必修内容,同样也是我多年职业生涯里,通过技术修炼沉淀而来的“学习笔记”。
在我看来一个人的自我学习能力和态度决定着技术成就不然只会陷入CRUD Boy或者API Caller的圈子里终日忙忙碌碌却依旧原地踏步。IT人就是要时刻保持学习如果要给这个保持学习的习惯加个期限那就是“终身”。