天天念叨的「计算机基础」就只是计算机网络和操作系统吗?

天天念叨的「计算机基础」就只是计算机网络和操作系统吗?

来源:业余码农

最近许多读者加我,问我应该怎样自学或者怎么准备面试。一般这个时候,我都会掏出已经被说烂的套话。

先掌握好计算机基础的理论知识,然后培养数据结构和算法思想,提升自己的编程能力,同时加强自己的实战经验。

瞧这话说的,简直滴水不漏。不过发现没有,问了很多大神,基本上的学习建议都是这么几个方面。

说来说去也不过是计算机基础算法与数据结构以及项目经历。想必这不用说大多数人也知道,不然也不会选择自学或者转行了。

算法与数据结构反映的是实际的编程能力,项目经历反映的是解决问题的思维和经验,这二者的重要性不言而喻,但是计算机基础知识真的有那么重要吗?或者说系统化的计算机理论对编程而言,真的是十分必要的吗?

这个问题大概没有一个有确定解,甚至许多技术大牛都会在这个问题上争执不下。主要的争执可能就是在于是计算机基础重要,还是项目经历重要的问题上。

不过,我觉得这其中最主要的问题是,计算机基础到底是指哪些知识,到底学到哪个地步才算是计算机基础扎实呢?

相信很多人大概张口就能回答出像计算机网络操作系统这些方向,毕竟这两个方向已经能够覆盖如今招聘求职中八成的面试题了。

但是这两个方向,或者说这两门课就能代表计算机基础吗?我并不完全赞同。

为了弄清这个问题,我又去翻了下大学计算机学院的课程,发现计算机专业的学生大学四年基本上学的全是计算机基础相关的课程。

稍微总结了一下,计算机网络和操作系统实际上仅仅只是计算机基础理论中的两门课而已,更不用说现在网上所流传的各种高频面试题中的理论知识点了,这些都无法代表完整的计算机基础。

计算机科学并不是纯软件的学科,相较于软件工程专业,更多的方向还是落在了计算机本身上。这就意味着计算机科学实际上是软硬兼施的科学。因而计算机基础也不只是软件工程层面的基础。

接下来我就按照理论的基础程度,从底向上的来说说计算机基础到底是哪些东西。

1 计算机科学理论

计算机科学应该不算是一门基础学科吧,更像是一门高度交叉的应用学科。而与其联系最为紧密的,我认为是数学。

毕竟伟大的计算机之父图灵,本质上也是一个数学家。强悍的数学能力基本上是牛逼的技术大佬们的共性。所以我说在计算机科学中,最基础的不过于数学,应该没人反驳吧。

工科学生基本上大学都会接触到数学五大课,数值积分、线性代数、数理统计、复变函数和常微分方程。在这几门课程之上,还引申出像密码学、拓扑学、图论、逻辑学等更深入专业的学科。

计算机科学理论介绍的是计算机系统形成的最基本的数理原理,从80年前图灵提出的可计算理论,到现在各种计算理论以及数值计算理论,这些都算得上是「计算机基础」

只不过,越是基础的东西越是脱离实际。咱们的目标也并不是当一个计算机科学家,而只是一个「计算机相关从业者」。对于绝大多数程序员来说,可能都接触不到复杂的计算理论,以及计算机演化过程中基础的数理推导。

但是,没错,但是来了。我们可以不去了解前沿科学,但是很有必要了解基础的数理思想。为什么常听说「那些数学好的人想必编程也会很厉害」,「男生在编程上比女生有优势」,这其实都是从侧面验证了数理思维对于编程的影响。

再想深入一点,事实上数理思维最为直观的反映就是逻辑能力。在我看来,编程并不是一件自我自由度很高的事情,反而可以说是处处受到制约。

我们需要去遵守语法的组合逻辑,遵循语言的编码规范,按照已制订好的协议标准,使用成熟的调用接口。这就意味着程序中一行行的字符和字母之间的组合方式,存在着严密的逻辑标准。

由数理思维所培养出的逻辑能力是写出一行好代码的前提。当然了,说是这么说,还不是照样有文科生跨专业学编程的,并且实力还不弱。

所以呀,这部分的基础虽然在计算机科学中是基础,但是却是决定广大程序员的天花板,是编程能力的上限。

那高数没学好,岂不是完了。这倒也未必,大部分人估计应该都触碰不到自己的技术天花板,在一个高度长期停滞不前的时候,往往都会选择转岗换领域了,而不是重新花精力来学数学和计算理论。

并且,成绩也并不能代表什么。我记得我大一时候微积分才考了个63,但是我感觉我逻辑能力也还行。

说到这,突然想起来许多大厂在面试的时候,也会出一些数学方面的题来考察候选人的逻辑思维。重点不在于题目的解,而是在于思考问题的回路以及解决问题的思维。大概这也的确是一种能够在大海中捞出出类拔萃的人才的一种方式吧。

2 计算机系统结构

如果说上面的科学理论是基础的话,那么计算机的系统结构就算是基础应用了。所谓的基础应用,是指理论不再是为了解决虚无缥缈的问题了,而是解决实际存在的应用问题。比如电路理论,又比如存储技术等。

从表面上来看,计算机系统结构就是偏硬件层面的那些东西,比方说指令系统存储系统计算机组成原理等等这些关乎系统架构的知识。

这个方面的知识其实代码还有点远,甚至不需要会写代码。但是却与你敲的代码息息相关,因为计算机的系统结构就决定着代码的运行过程

但是不得不说这方向上的课程真的非常枯燥,虽说不像数学理论那么抽象,可以用一些具体的东西来描述,但是依然很难去想象在这么一个精密的机器里,只通过几个电平和脉冲就可以完全超越人脑的复杂计算。

可能有些同学会问了,就算不知道计算机是怎么运作的,但是好像也不影响写代码啊。写代码掌握好语法,然后照着规范写不就得了。

是的,的确是。我想外面那么多的培训班应该也都是这么想的吧。编程不就是掌握语言语法,再熟练的使用几个流行的框架,调调别人写好的轮子,大概也足以应付许多业务场景了。

但是一直这样下去,你会发现系统的性能很快到达瓶颈,随着系统越来越庞大,会经常出现莫名其妙的崩溃异常。

慢慢的你发现,代码看起来没问题,但是换个环境,换台设备就不正常了。这个时候,你不懂计算机的运行原理,不知道代码是怎样变成电信号在众多电子元器件中流过,只能去翻那本厚厚的编程语言从入门到精通,最终也没法找到优化的思路。

还觉得计算机组成原理,编译原理,计算机体系结构课对编程没啥吗?常说的一句老话,透过现象看本质,那编程的本质是什么?我理解大概就是借助处理器和各种计算单元,去处理位于各种粒度存储单元中的数据。 就算是I/O操作说到底也是数据流的转换罢了。

这也是为什么说编程语言不是最重要的的主要原因之一吧。因为只要能理解计算机底层的运行原理,换个编程语言,也不过是换汤不换药。

说了这么多,我自己感觉好像说的也挺虚无缥缈的。因为这部分基础太过于庞杂,说实话我也并没有很深入的了解过,但是我知道它的作用还是非常大的。

如果你要问我该去怎么学这部分的知识,我的建议是看计算机组成原理编译原理操作系统计算机系统结构Linux系统内核之类的书,应该差不多了。

3 计算机软件基础

这就是大家喜闻乐见的软件基础啦。这部分的内容直接与编程挂钩,决定着你的代码能力。主流的几个方向可以分为软件工程设计模式数据库算法与数据结构以及计算机网络

首先是软件工程,顾名思义,就是软件开发的工程技术或者能力。妥妥的工科,自然也就离不开工程建设之类的那些东西。包括软件过程模型啊,开发方法啊,流程管理模型啊,风险评估啊之类的东西。

看起来像是项目经历或者产品经理干的活,那你说你要不要学。为了以后跟产品经理更加流畅的交(si)流(bi),不懂一点软件工程的东西吵架的时候都接不上话。 啊不对,是交流沟通的时候。

不仅如此,软件工程的基础能让程序员更好的从局部到整体的去看自己所写的代码,从而可以从整个软件的层面考虑系统优化。

设计模式就可以看作是许多具体的面向对象的编程思想。现在随便做一个小项目,都会设计到基本的一些设计模式,比如说单例模式工厂模式观察者模式等。设计模式实际上就是工程中比较重复出现的程序设计问题,给出通用的固定式的解决方案。从而在架构的层面让程序的可复用性、可扩展性以及可维护性更高

数据库的作用显而易见了吧,毕竟程序的本质上实际上就是数据的流动。而对于一般的开发岗位而言,或多或少都会涉及到数据库的各种操作。因此常见数据库的使用,基本的数据库原理,都是应该掌握的技术点。

这里就包括关系型和非关系型数据库的区别,常用的SQL语句,MySQL索引类型,SQL优化思路以及数据库高并发方案等等之类的问题。

算法和数据结构应该就不用多说吧,这应该是编程中基础的基础了。如果对数据结构和基础算法都没有一个基本的了解的话,可以说是没办法写出合理的代码的。这部分基础的巩固说难也难,说不难也不难。因为数据结构其实就是那么几种,看个几篇文章基本就能搞懂了。而常用的算法思想也不多,虽然算法题难起来会非常难,但是只要多刷题,面试中八成的题还是都能过搞得定的

计算机网络同样也是软件开发基础中的一大块内容。不过老实话,比较重要的知识点都是围绕TCP/IP开展的。计网的应用场景非常多,也有许多成熟的实例,并且还有各式各样的工具能够帮助去理解网络的建立过程。

这些东西一起构成计算机的软件基础,直接决定着你的编程能力。

4 总结

一不小心,就啰嗦了这么多。不过说起来,好像现在互联网大厂所看重的计算机基础,都主要是计算机网络操作系统数据结构和算法了吧。这就导致为了应付面试,好像看点这些方面的高频题就都能混过去。

因此,这里所说的计算机基础,更多的是一个软件开发工程师自身应该具备的基础素质,而不仅仅是为了应付面试才去掌握的知识点。

当然,背背面试题你可能也能进大厂,但是我相信,如果你想要在技术这条路上走得更远,到头来还是需要重新来理解我上面所说的这些基础的。

所以,如果你是一个刚入学或者刚准备转专业学CS的同学,我建议你从最基础的计算机科学理论开始慢慢去理解计算机的系统结构,然后在通过不断的实践来丰富自己的计算机软件基础。这样就能形成比较系统的计算机基础知识体系。

而如果时间不多,没有太多精力从计算机底层的理论开始,那么我建议可以先把操作系统计算机网络等理论理解了,然后再通过多编程多实战来积累项目经验,提升编程能力,然后在从具体的应用点扩展到计算机结构体系,弄清楚最基础的底层机制,慢慢形成自己的系统理论基础。

当然,仅供参考。拜了个白。

我还会在以下平台发布内容

GitHub 知乎