多少程序员看到这个标题会有一种:“哦干!说得对!”的感觉。
一个程序员不一定会修电脑、修路由、选电脑配置、破解密码、修图、使用大智慧。……嗯,最后一个例子是真实故事:有个同学搭一个大叔的便车,车上大叔问:“你是学软件的?那能不能教我怎么用大智慧炒股?” 超级汗颜啦。
这一章的目的就是让你知道什么是编程,以及为什么程!序!员!不!是!修!电!脑!的!!
一、硬件与操作系统
操作系统负责指挥电脑硬件,并提供接口给编程人员使用。这句话可能有点艰涩难懂,但是先不要急,先记着。
计算机在安装操作系统之前只是一堆硬件,它们有些可以提供高速的计算能力,比如说CUP, 有些可以提供高速的数据传输能力,比如说内存。我们可以称它们为硬件“资源”。“资源”这个词是第一个在这系列文章中出现的高频词,我用来泛指一切可以被另外一个东西使用的东西。不要在意这拗口的句子了。嗯,一台电脑就是一堆的硬件资源,它们并不知道怎么相互配合来创造这么一个五彩缤纷的计算机世界,它们需要一个统一的控制者,这个控制者就是操作系统。
操作系统怎么控制这些冷冰冰的硬件呢?基本原理我也不清楚- -, 大学老师没教哇…… 不过大概是这样的:实际上不是操作系统控制硬件,是硬件告诉操作系统怎么控制它们。每个硬件研发完成之后都必须由它们的研发者编写一套驱动程序,这套驱动程序就是负责告诉操作系统怎么“驱动”这个硬件的。“操作系统大人,电一电我这里我就会亮哦!”大概是这样,嗯。(才怪啦!)
总之呢,有了操作系统,一堆硬件就相互配合地跑起来了,计算机有了生命的气息。
二、操作系统与软件
我刚开始接触编程的时候,就想过为什么有人会说不同的操作系统有所不同——因为在我当时看来,它们可以做的事情完全一样啊,因为我当时所能做的就是用c++打出一句:hello world....(确实是每个操作系统都可以做到啊!)
随着接触的东西多了起来之后,我终于搞明白了,编程就是使用操作系统提供的接口完成一系列的操作。这个说法并不严谨,仅在当前阶段这么记住就好。“接口”也是一个高频词,我用来泛指一切将具体实现隐藏在背后而仅提供简单的方式供使用者使用的东西。比如说,耳机插孔,只需要将插头插进去就可以听到音乐了,使用者完全不需要知道这个插孔后面是怎样复杂的一个所在。操作系统也是这样,提供了很多简单的方法让开发者完成不同的任务而开发者不用另外去了解这个任务具体是怎么实现的,作为开发者,只需要使用程序语言告诉操作系统:
“喂,去给我读取这个文件。”
操作系统就会听话地将这个文件找出来并读取呈现给你。具体操作系统是怎么找到这个文件怎么读取的,由不同因素决定。比如说,如果这个文件放在硬盘上,那么操作系统可能就会在硬盘上面地毯式搜索这个文件,具体怎么在硬盘上面找呢,硬盘驱动程序早就告诉给操作系统了。
那么不同操作系统的不同之处在哪呢?这个答案在我第一次学带界面的软件编程的时候顿悟出来了。要调出一个窗口,往往只需要几句简单的代码,其他工作都由操作系统包办了。所以你才会看到windows的窗口都是一个样,苹果电脑OS X的窗口是另外一个样。如果你觉得windows的窗口太丑要改得跟OS X的窗口一样的话,很抱歉,你可能很难做到(我也没试过)。为什么?因为操作系统只提供接口,具体实现是封闭起来的,窗口就是长那个样,你没办法修改。
所以编程就是这样的一个流程:使用提供的接口(不一定来自操作系统),完成一系列的操作。真所谓在有限的舞台上创造无限的可能啊……
三、分层
我们来重温一下用程序读取文件的例子,大概是下面这样子(从左往右从上往下看):
稍微抽象一下,可以将这个操作分为三层:应用程序最上面,中间是操作系统,最底层是硬件。分层结构是一个非常常用的概念。通过分层,可以将不相关的细节隐藏起来,使用者完全不需要知道这些细节,只需要知道要做什么,能做什么就行了。
所以到这里你们能够了解为什么程序员不会修电脑了吧了吧了吧了吧!操作系统把硬件相关的事情都包揽了,大部分硬件相关的知识点程序员不需要理解啊。
使用分层结构可以将事情简化。想象你是一个公司的老总,你肯定不会所有事情都亲历亲为,很多时候你只需要好好思考然后吩咐下属去帮你完成任务就行了。就别管下属怎么忙得焦头烂额了。不仅是软件跟操作系统之间存在分层结构,软件内部也经常存在分层,一层叠一层,从简单原始的操作进化到高级的操作。分层结构可以使软件变得更加容易管理,同时也防止了重复劳动:怎么让硬盘转起来这种事在一个地方写好就行了,以后就能重复拿来用了。软件开发中会有很多的类似或者重复操作,如何最大化地减少重复劳动,是在编写程序的时候每时每刻都要注意的一个点。程序员都是在很勤劳地想着偷懒的事情的人。
本章完,下一章讲什么是编程语言,也就是如何跟操作系统沟通交流谈人生。
重点词汇:
资源
接口
分层结构