深入理解计算机系统(序章)------谈程序员为什么要懂底层计算机结构
万丈高楼平地起,计算机系统就像程序员金字塔的地基。理解了计算机系统的构造原理,在写程序的道路上才能越走越远。道理LZ很早就懂了,可是一直没下定决心好好钻研,或许是觉得日常工作中根本用不到这些,又或许是每次拿起书看到那些复杂的底层架构,看到存储器,寄存器,CPU,总线等等这些概念就头大。总之,由于各种各样的原因,对这块的知识一直没有认真花时间去钻研。那么你可能会问,那你写这篇博客的题目不就是准备学习这方面的知识吗?是的,LZ 准备下定决心钻研了,至于原因如下:
①、经常用一些不知其所以然的技术,会感到不安
大家可以看看LZ前面写的博客,很多都是对框架的用法进行总结,至于为什么这个框架要这么实现等等而涉及的很少。原因很简单,LZ 研究框架的源码很吃力。因为源码的实现往往涉及到多方面的的知识,比如设计模式,比如JDK的一些高级特性等等。LZ 是想做一个有梦想的咸鱼,但是每次看到很多不懂的东西,就深深的体会到现实与理想落差的痛苦,所以LZ下定决心要改变这种无力感。
②、在这个数据爆炸的年代,很多系统对于项目性能的优化有很高的要求。那么如何调优成为了程序员不可避免的问题,我们知道 Java 是运行在 JVM 上的,程序的调优那就需要对 JVM 有一定的了解。LZ 本来想直接研究 JVM 的,书都找好了------《深入理解Java虚拟机:JVM高级特性与最佳实践》。但是 LZ 发现很难消化,理解起来特别困难,于是间接的将 LZ 推上了研究计算机系统的道路。
③、再就是如果你对计算机系统的构造不太了解,可能你平时写的程序都是错误的。
比如我们一直以为两个正数的和或者积一定为正,但是用二进制补码表示的正数和或者积却不一定;程序员和编译器不能用(x-y<0)来代替(x<y),因为前者会产生溢出。甚至也不能用表达式(-y<-x)来代替,因为在二进制补码表示中负数和正数的范围是不一致的。算术溢出是造成程序错误和安全漏洞的一个常见根源。
④、第四个原因,这个也是最直接的原因。不知道大家是否了解大的互联网公司面试,比如阿里巴巴,腾讯这样的公司。他们面试对于基础的东西要求的很严格,你对这些东西的了解程度将直接决定你的面试成败。
比如:讲一下JVM的结构,TCP/IP的三次握手、四次挥手,淘宝用户的数据怎么满足高并发?等等。像这些问题,如果我们不懂计算机底层知识肯定是不能过关的。
⑤、树立正确的计算机世界观
培养一种心态,即计算机的一切是可以理解的,没有超出人类的智慧。即使有些问题你现阶段没有明白,但这些问题都是可以理解的,只是你时间不够,所以先放一下,等有时间再学习它们。这种心态可以防止你滑入无助的陷阱。 有时候你的潜意识会愚弄你,把很难做成的事情当成无法做成的事情。就像《肖申克的救赎》中表现的那样,一把很小的锤子也是可以砸开监狱的墙壁逃出来的。而Red第一次看到那个锤子时,他就认定了Andy肯定逃不出来了。而实际上Andy却用19年的时间确实把墙给凿开了,虽然其间各种艰辛,但是结局却很美好。
计算机科学与其他学科相比,好的地方在于,它是人创造的,它的原理没有超出我们人类的大脑的理解范围,它为什么这样设计,每一个做法都是有理由的。而那些发明它的人,有许多现在还活着,比如晶体管的发明者,硬盘的发明者,显示器、鼠标、键盘等的发明者,有些发明者虽然已经过世,但是有丰富详尽的记录,他不是一门有可能超出人类理解范围的科学,所以我们不要担心不能理解它。
其次 我们是程序员,不是造计算机的,我们也不需要对计算机的每一个部件都了解,我们只需要了解我们所写的程序在系统中的执行过程,以及计算机系统的构造对我们的程序代码有什么限制,有什么影响即可。
好了,说了这么多,其实是想告诉大家,做一只咸鱼很简单。但是LZ是想做一只有梦想的咸鱼。如果和LZ有同样想法的人,又一直下不定决心去学习的人,我们可以一起,互相监督,互相学习交流。
《深入理解计算机系统》
如题,LZ 学习是以《深入理解计算机系统》(Computer Systems A Programmer's Perspective)这本书为基础,我们先来介绍一下作者:Randal E.Bryant:1981年在麻省理工学院获计算机科学博士学位,现任美国卡内基·梅隆大学计算机学院院长,是ACM和IEEE的双会士。
那么为什么要选择这本书呢?LZ也在网上找了很多这方面的教材,但是都不是太满意,不过当LZ看到这本书的时候却眼前一亮,从这本书的英文名字就可以看出是从程序员视角全面剖析的计算机系统,使读者深刻理解程序的行为,将所有计算机系统的相关知识融会贯通。注意是以程序员的角度来分析的,那么作为一个程序员,相对于市面上关于计算机系统的书,这个理解起来应该不会很困难。
其次这本书是以案例驱动为讲解顺序的。第一章就给我们详细的讲解了学习程序的万能入门级程序“Hello World” 在计算机是如何运行的。说实话,LZ 接触了 C 语言,C#,Java,PHP等,也都写过每种语言的 “Hello World”,但是到底在计算机中是怎么运行的,LZ 是完全不了解的。
LZ 后面打算根据自己的学习进度不定时更新《深入理解计算机系统》学习心得。
软件开发产业正在发生变化,它将不再需要更多的程序员,它需要的是高级匠师,这句话与大家共勉。