论计算机基础学科的重要性

​ 

论计算机基础学科的重要性_第1张图片

【图:欧几里得,希腊化时代的数学家,被称为“几何学之父”。】

 

作为一名软件工程师,计算机基础学科到底要不要学?最近蛮有感触的一个问题。我这里说的计算机基础学科主要指的是计算机操作系统(进程管理,内存管理,文件系统),TCP/IP协议,编译原理,计算机组成原理,计算机体系结构,数据结构与算法,设计模式等等。我经常在公司跟新同学说基础学科的重要性,但能理解的很少,很多同学更乐意去学一门新语言,去学一个工具和装下docker玩玩。

 

我个人认为,新技术,新语言和应用相关的东西要学,基础学科也同样要学,两者并不矛盾。反而,两者是互相促进,学基础是为了应用,应用的过程中也更能理解基础的重要。但我觉得很多新同学对基础学科的重视度远远不够,我认为学习基础学科有以下三个好处:

第一:指数级地提高学习质量和效率

第二:让你遇到问题时更加自信和坚定

第三:学到很多优雅的设计和解决问题的方法

 

第一:学习基础学科可以指数级地提高学习质量和效率

举个例子,我在大学的时候,把Steven的《unix环境编程》和《tcp/ip协议三卷本》都翻了个遍,说真的,疑惑很多,很多时候是硬着头皮啃下来的。当时看到系统调用 int dup2(int oldfd, int newfd) 的描述后一头雾水。把一个文件描述符oldfd复制给另一个描述符newfd?那这个跟int myfd = oldfd的区别是什么?是不是等价于int newfd = open(oldfd对应的文件)?一直到我去学习linux的文件系统后,知道了每个进程维护着自己打开的文件描述符表,而内核维护着open file table 和 v-node table。open file table的entry存储的是文件的动态属性,比如文件偏移位置等;v-node table的entry存储的是文件的静态属性,比如文件大小,文件类型等等。我才知道,dup2()函数是让一个newfd跟oldfd一起指向(或者叫引用)着相同的文件,它们都可以操作这个文件,并且这个文件的状态,锁等都是共享的。了解了这个之后我才真正理解dup2这个系统调用,也让我更深入理解子进程继承父进程的文件描述符的情况以及重定向。


论计算机基础学科的重要性_第2张图片

【图:进程文件描述符表,open file table 和 v-node table的关系】

 

再举个例子,我在大学的时候其实就去翻过编译原理的龙书,当时看简直就像天书,翻不下去只能作罢(后遗症就是接下来几年都不太敢去翻这本书)。后来几年我在刷了不少算法题,看了不少系统底层,指令集以及在搞机器学习时恶补了不少数学基础后再来看这本书时,感觉已经可以很愉悦地阅读了。现在新技术层出不穷,如果没有学好基础学科,使用低效的手段去不断跟进新技术,估计很快就撑不住了。但是如果你掌握好基础学科,你就会发现很多东西其实是基础知识的新组合和新应用而已。也许这就是所谓的万变不离其宗吧。

 

第二:学习基础学科可以让你遇到问题时更加自信和坚定

之前公司Android项目组曾经遇到一个问题,某台手机的4G网络访问不了公司的应用但访问其它应用正常,但使用wifi也可以正常访问公司的应用和其它应用。Android项目组负责人搞了好久没搞定,无比纠结中,然后公司的技术骨干们也在帮忙搞(因为那台手机是公司大boss的呀)也一直没结果(大boss一直在追问原因,而且要明确的原因,不要猜的)。我了解情况后,安装sshdroid,root那台手机,装了一个arm abi的tcpdum上去抓包。发现没有抓到任何包后检查手机操作系统的路由,也没有发现路由有什么问题,nslookup了一下公司域名,发现使用默认的域名服务器解析不了,换了个域名服务器就解析ok了,再确认了下那个域名服务器的位置是上海的。最后问了下大boss的4G卡是哪的?果然是上海那边的卡。问题最终确认,但是问题确认后基本大家哦了一声就散了,最多就问问我arm abi的tcpdump哪来的,tcpdump怎么使用。我在想,如果他们学好了计算机组成原理和计算机体系结构,就应该不会犯把x86的tcpdump往arm架构的Android机上放的错误;如果他们学好了网络,就应该知道域名解析的原理和知道使用什么命令查询域名解析;如果他们学好了网络,去了解过无线网络和基站,也应该知道无线网络跟IP网络是不一样的。

 

我还记得一个场景,一位后端同学在定位php程序内存泄漏无果后开始烦躁,并开始怀疑php有bug。他跑过来失望地跟我说unset了那个变量但依然内存泄漏。我笑了笑,很坚定地跟他说不可能,再回去检查下。看着我这么坚定和自信,他又回去认真检查了一遍,然后后终于发现是逻辑错误,unset错变量了!最近一个小例子是跟别的公司联调http协议的接口,别的公司给的是java的例子并且已经验证可以跑通。公司一位同学改写成项目语言php后跑不通后开始怀疑是不是只能有java语言才能调用他们的接口。我依然过去很坚定和自信地跟他说不可能,然后让他抓包定位,最后他自己发现自己的http header发错了(捂脸)。

 

第三:学习基础学科可以学到很多优雅的设计和解决问题的方法

很多底层设计都是史书级别的。比如说linux操作系统,如果你好好研究和体会,去了解进程管理,文件系统和内存管理,本身就可以学到很多优雅的设计和解决问题的方法。进程是如何管理资源的?目录是怎么实现的?文件是怎么存储在磁盘上的?虚拟内存到物理内存的转换是怎样的?再比如tcp/ip协议,一个复杂的系统,如果你好好研究就会发现里边有很多很经典的算法,比如说为什么是三次握手?tcp怎么保证可靠?怎么优化交互模式的传输?怎么优化网络阻塞?再比如编译器的实现和原理,里边也包含了很多很经典的工具和方法。也许你研究完编译器的实现后,下次你设计配置系统时也可以定义自己的一套配置语言来实现;当你想处理字符和文本时,你的工具箱里边也会多了一套工具。

 

说了这么多,只是想让新同学们重视基础学科,如果之前拉下了就赶紧补起来吧,什么时候补都不迟,就怕你不补。因为学习计算机基础学科可以指数级地提高学习质量和效率,给予你自信和坚定以及学到很多优雅的设计和解决问题的方法。

更多最新文章,请扫描下边二维码,关注公众号:学习者说

论计算机基础学科的重要性_第3张图片

你可能感兴趣的:(论计算机基础学科的重要性)