《世界是数字的》翻译自 D is for Digital,作者是大牛Brian Kernighan。本书由图灵引进,2013年6月中文版出版。恰逢图灵社区在6月23日纪念图灵诞辰101周年,以10元的优惠价格拿下电子版。以下为个人阅读记录。

Sunday -- 前言

通过Brian Kernighan 写的《中文版序》来了解一下本书的意图与主要内容。

如今,计算机、通信系统,以及由它们支撑的数字产品已经无所不在了!笔记本电脑、手机和互联网,这些都是显而易见的。更多的则是我们平常看不见的,比如那些栖身于电子设备、汽车、火车、飞机、电力系统、医疗设备中的计算机。偶尔,透过某些提示,你会得知世界上有无数系统正在悄悄收集、分享你的个人信息,这些信息甚至会被用在违背你意愿的地方。

《世界是数字的》简明扼要但又深入全面地解释了计算机和通信系统背后的秘密,旨在让没有技术背景的读者更好地理解自己生活的这个数字世界。这本书解释了如今计算和通信的运作方式,包括硬件、软件、互联网,还有万维网,同时还探讨了新技术引发的社会、政治和法律问题,让你明白现实当中的一些难题和迫不得已的折中。

我相信,了解这些技术常识对于任何人都非常重要,无论你是什么背景。非常高兴这本书由李松峰和徐建刚翻译成中文出版,希望中国读者能够喜欢。

姑且认为本书适合大一、大二学生阅读,继续往下看。

译者序中主要介绍了普林斯顿大学的 NB 和 Brian Kernighan 的 NB 之处。

致读者

这本书涵盖了三个核心技术领域:硬件软件通信。整本书都围绕这三个主题展开。

这些主题与数据密不可分。

可通过本书网站kernighan.com获取更多信息。

Monday -- 硬件

PC vs MAC

PC的普及其价格是一个因素。另外:

使用某种东西的人越多,对其中每个人来说这种东西也就越有用,两者之间基本成正比关系。

对选择 Mac 的人来说:

他们自认为 Mac 在可靠性、质量和美学设计上更胜一筹, 还有人强调“到手就能用”,甚至还包含几分对PC 的恐惧和厌恶。这些因素让他们愿意付出更多的钱。

在争论中思考这两种计算机的差别与共同之处。

逻辑构造

冯·诺依曼体系结构:CPU 提供运算和控制功能,内存和磁盘用于存储数据,键盘、鼠标和显示器用于连接操 作人员。

然后分别讲了总线、CPU、内存、外存、集成电路

摩尔定律

20 世纪计算机科学的伟大发现之一是,现在的数字计算机、最初的 PC 以及再往前体积更大、计算能力更弱的老式计算机器,它们在逻辑或者功能上的特性是完全一样的。如果我们不考虑速度、存储容量这些因素,这些计算机可以做完全一样的计算。

比特、字节与信息表示

  • 计算机是数字处理器 它们存储和处理离散的信息,这些信息表现为不连续的块,具有不连续的值,基本上就是一个个数值。而与之相对的模拟信息,则是平滑变化的值。
  • 计算机用比特表示信息 计算机内部使用二进制,而不是十进制。
  • 较大的信息以比特组表示 数值、字母、单词、姓名、声音、照片、电影,以及处理这些信息的程序所包含的指令,都是用比特组来表示的。

深入了解 CPU

分布式计算 图灵机 图灵测试

Tuesday -- 软件

事实表明,只要软件不可靠不耐用,我们就一定会遇到麻烦。而随着人们对软件越来越依赖,潜在的麻烦也只会越来越大。

算法。算法就是一系列精确、无歧义的步骤,可以执行某种任务,然后停止。算法描述了不依赖于任何实现的计算过程。这些步骤由定义明确的基本操作或原始操作构成。算法有很多,这里只介绍了基本的搜索和排序算法。

复杂性。算法的复杂性是对算法要执行的工作量的抽象描述。度量的依据是基本操作(如检测数据项、比较数据项),而表述的是计算次数与数据项数的关系。算法的复杂性可以分为几个层次,就介绍的几种算法而言,既有对数级算法(数据量加倍,计算次数只加一)也有线性算法(计算次数与数据量成正比,最常见也最容易表达), 还有指数级算法(数据量加一,计算次数加倍)。复杂性度量的是最坏情况(实际的问题很可能要简单得多),而且描述的是一种渐近性质(只有数据量很大的时候才适用)。

编程。算法是抽象的,而程序是具体的。程序是让计算机完成一个任务的所有步骤的具体描述。程序必须考虑内存和时间的限制、数值的大小和精度,以及偏激和恶意用户。

编程语言。编程语言是表达所有计算步骤的记号库,人们可以籍此轻松写出代码来, 而且代码可以被翻译成计算机最终可以执行的二进制形式。翻译方式有很多种,但最 常见的是使用编译器,有时候还要用汇编器,把用C 等语言编写的程序转换成二进制形式,以便在计算机上运行。不同的处理器有不同的指令集和指令形式,因此编译器也会有相应的差异。解释器和虚拟机是模拟真正或假想计算机的程序,可以面向它们编译并运行代码。JavaScript 程序就是面向解释器编译运行的。

。编写一个在真正计算机上运行的程序要牵扯很多细节,涉及很多常用操作。库以及类似的机制可以提供预制的组件,供程序员在编程时使用。有了库,程序员就可以在既有工作成果基础上开展新工作。今天的编程工作通常都是组织既有组件与编写原创代码并重。组件可能是库函数(比如JavaScript程序中用到的那些函数),也可能是像Google Maps一样的大型系统,或者是其他Web服务。然而,从底层来看,它们都是由程序员使用我们介绍过的语言或没介绍过的类似语言指令编写的。

接口。接口或者API(应用程序编程接口)是提供服务的软件与使用该服务的软件之间的一种约定。库和组件通过API提供服务。操作系统通过自身的系统调用接口让硬件看起来更有章可循,而且可以编程控制。

抽象和虚拟化。使用软件可以隐藏实现的细节或者把实现伪装成其他东西,比如虚拟内存、虚拟机和解释器。

Bug。计算机不懂宽容,因此容易犯错的程序员必须写出某种程度上没有错误的程序来。所有大型程序都有 bug,也就是说有时候会不听使唤。某些bug仅仅只是惹人讨厌,比如设计得不好,并不像真正的错误那么严重。(“这不是bug,而是一个功能” 是程序员中流行的说法。)而有些 bug 只有在极端情况下或者罕见的情境中才会出现, 往往很难再现,更不用说修复了。但有些bug确实严重,甚至会威胁到人身安全。

根据经验,因为程序是基于既有组件构建的,而原有bug都会消灭掉,至少从原理上讲,新程序中的错误应该越来越少。然而,与这些进步因素相对的是随着计算机和语言的发展,系统承载的需求将越来越多样,市场和消费者呼唤新功能带来的压力也会越来越大,于是无法避免的隐患也会层出不穷。总之,bug将成为我们心中永远的痛。

Wednesday -- 通信

网络中立(net neutrality)问题

百度百科

网络中立(Network Neutrality), 是指在法律允许范围内,所有互联网用户都可以按自己的选择访问网络内容、运行应用程序、接入设备、选择服务提供商。这一原则要求平等对待所有互联网内容和访问,防止运营商从商业利益出发控制传输数据的优先级,保证网络数据传输的“中立性”。 有关网络中立的立法目前在美国国会已经成为议员们争论的热点问题,各网络服务提供者和权利人都力争在新法中更多地体现自己的利益。

带宽是最基本的一个特性,它描述的是系统传输数据的速度。

等待延迟衡量的是特定信息块通过系统所需要的时间,用卡车满载硬盘穿越整个国家,带宽显然是巨大的,但延迟也是极高的。

抖动,即延迟的可变性,对某些通信系统(特别是语音通信),同样也很重要。

信程指的是某种技术能够在多大地理范围内实现联网。有些网络的范围不过数米,有些网络则可以覆盖全球。

数据、信息和隐私

关注隐私搜索社交网络数据挖掘

总结

  • 本书不适合计算机专业人员阅读
  • 本书用大量篇幅介绍了信息安全与加密,隐私泄露与保护,专利与政府政策,具有参考意义

注:本文参加 “@图灵教育年末10本好书相赠活动”,for 《JavaScript高级程序设计(第3版)》