跳到主要内容

白话计算机科学

· 阅读需 4 分钟
Software Engineer

学了这么多年的计算机,我在想,要是有个不懂计算机的人想了解计算机科学的内幕,我该怎么回答呢?我简单整理了一下,于是,就有了这篇文章。

计算机的出现源于战争的需要,因为在研制先进武器的过程中,需要大量的科学计算。为了帮助人们计算大量复杂且繁琐的科学计算工作,人们发明并改进了计算机。

计算机的工作原理简单的说,就是从输入中取得数据,计算之后再输出。最常见的输入设备是键盘,最常见的输出设备是显示器,你看计算器就是这样的。如果你想长久地保存一些数据,那就得放到磁盘之类的存储设备上了。现代计算机的硬件架构都是基于冯·诺依曼体系结构的(这货很牛逼,但总有一天会过时的),包括运算器、控制器、存储器、输入设备和输出设备这五类。

可是使用这样一个裸机会带来很多问题。首先,一次只能运行一批处理程序,如果有程序正在用(哪怕它目前没有任何计算任务),其他程序就必须等,效率低下;其次,这些硬件资源的管理成本很高,写程序的人只关心计算结果,并不想陷入到硬件细节中去,否则会消耗大量的精力。

于是,(现代)操作系统就诞生了。它是硬件层面上的第一层软件,它把计算机的所有硬件资源都管理了起来,屏蔽掉了底层的使用细节,并且给使用计算机的人以简洁的接口,同时,它还支持同时运行多个程序且互不影响,大大提高了计算机的利用率。

虽然有了操作系统,计算机更方便使用了,但是,人们写程序还是很不舒服的。因为计算机只认识二进制的数据,而这种由0和1组合起来的代码并不适合人类阅读和使用(就像这样0101000101010101101010001010),人类更喜欢使用自己的语言(if 明天是个好天气 then 我就晒被子)。

于是,编程语言就出现了。什么汇编、C、Java,乱七八糟的编程语言一箩筐。每种语言都有它擅长的地方和不擅长的地方,比如C语言就非常适合系统级编程,而Javascript则是Web页面的不二之选。有了编程语言,人们写起程序就溜的飞起了。

这下,人们写程序方便了,但是计算机可懵逼了。它不认识乱七八糟的字母,它只认识数字。于是,编译器闪亮登场。它能够将人类可读的高级编程语言翻译成机器可执行的代码。简而言之,它就是个翻译,从一种语言翻译成另一种语言。

这下终于好了,我写一个{if 到早上7点了 then 打开窗帘},计算机就能读懂我的代码,并且自动执行了。当然这个程序很简单,但假如我想统计学校里所有学生的成绩并排序,该怎么办呢?

在解决这个问题之前,我们需要稍微深入地理解一下计算机。我们写软件,写程序,实际上就是通过计算机这么一个工具帮助我们解决问题。计算机擅长处理数据,而如何高效地让计算机处理这些数据,则是我们的问题。于是,算法来了,它实际上就是一些适合用计算机来实现的解决问题的办法。不同的算法的性能差别很大,比如同样给1万个学生的成绩排序,有的排序算法1秒之内就能给出结果,有的可能需要好几分钟。同时,算法的特性极大地受到数据结构的影响,如何选择数据结构有时候直接能决定一个问题是否能够解决。

除了数据的处理之外,计算机的另一个重要的问题就是数据的存储。结构化的存储能够帮助我们快速准确地找到想要的数据,而数据库数据仓库是解决这个问题的利刃。相对于文件存储来说,数据库提供了更强大的数据存储和检索功能;而数据仓库则更适合对大量数据进行分析,提取一些更有价值的信息。

有了数据,我们能做很多事情,基于海量的数据和先进的处理方式,我们迎来了大数据人工智能的时代。这些都是现下的热门,也是未来的发展趋势之一。

为了搞定这些数据,软件的设计也相应地要解决很多很复杂的问题,要考虑功能、性能、扩展性、可维护性、安全性等等。所以,人们总结并发明了不少编程的设计方法,比如面向对象编程(以及使用该方式总结出来的经验设计模式),软件系统架构等等。

以上说的都还是单机的软件,如果把多台计算机连接起来,会发生什么呢?boom!这就是我们今天的互联网移动互联网。它们的出现得益于计算机网络的研究和发展。计算机网络解决的问题就是计算机与计算机之间如何通讯的问题,它的重要性相当于人类赖以交流沟通的语言。

当计算机和计算机借由网络连接起来协同工作时,就像几个人组成一个小组一样,可以做更多更强大的事情。而分布式系统解决的就是多台计算机协同工作时要面临的问题,比如数据一致性、安全性、容错机制等等。我们所说的云计算,很多实际上背后就是分布式系统。云计算的一个重要的用途是资源整合,它可以把多台计算机的资源整合成一个资源池,你可以把它看成一个超级计算机,拥有N多的CPU和N多的内存,你需要多少,它就给你分配多少。这样,当你想发布一个软件的时候,不需要再自己买服务器,直接管云计算服务提供商买就行了,不仅成本更低(租用办公室的钱都省了),而且扩容更加方便。可能未来某天,我们的终端仅仅需要输入和输出设备就够了,所有的数据和计算任务都交给“云”来搞定。

以上就是计算机科学的一个简单的概览。其实还有一些内容我没有说,比如计算机图形图像语音识别等等,它们同样为我们的生活带来了许许多多的便利。

我想,生活在这个时代是幸运的,能从事IT方面的工作也是令人兴奋的一件事。