译者序
一次和上小学的儿子Vita闲聊,我随口问道:“你的笔记本电脑内存是多大的来着?”他不假思索地回答:“好像是512 GB的吧。”我迟疑了一下,原来对他来说,“内存”指的是磁盘的存储容量,而不是RAM。
Vita学习编程有几年了,论算法他可能比我上中学的时候懂得还多,但有时依然会搞不清这种看似很基础的概念,但仔细一想也不怪他。实际上,生活中很多人会把手机的存储容量称为“内存”,甚至有时连厂商自己也会这么说,其中一个原因是普通用户在使用手机、笔记本电脑等设备时,根本不需要关注RAM,因为操作系统已经把它管理得妥妥的。相对地,磁盘存储容量肯定更吸引用户的关注,毕竟当你存太多视频的时候,系统就会毫不犹豫地“报警”。
随着技术的发展,使用计算机设备的门槛越来越低,普通用户也不再需要关心那些底层的东西。对大部分人来说,操作系统是预先装在电脑里,一开机就可以使用的,而应用程序则在安装之后双击就可以运行,至于驱动程序,很多用户甚至从未听说过这个词。但回想30年前,在我上小学第一次接触计算机的时候,用的还是DOS操作系统,玩个游戏还得额外启动DOS4GW才能获得完整的4 GB内存寻址能力,甚至连鼠标也要先手工加载驱动程序才能使用,即便到了Windows 95的时代,在“即插即用”技术普及之前,手工安装驱动程序以及解决各种设备冲突依然是家常便饭。Vita听了之后表示:“这么麻烦还怎么愉快地用电脑呢?”我回答说:“有句话说得好——哪有什么岁月静好,只是有人负重前行。那些脏活累活并没有凭空消失,只是操作系统默默地帮你处理掉了而已,作为一个计算机科学爱好者,了解这些‘看不见’的东西也是很有必要的。”
除了操作系统和硬件设备,在软件开发层面,程序员也越来越不需要关心底层原理了。特别是很多学编程的孩子,对一些重要的底层原理缺乏理解,当然这和教育机构在教学过程中没有将这些原理渗透给他们有一定的关系。Vita曾经在用Scratch编写一个自动生成迷宫的程序时遇到两个问题:一是Scratch中没有多维数组;二是Scratch中没有函数局部变量,在函数递归调用时变量的值会被覆盖。其实这两个问题本质上都是他对高级编程语言提供的特性过于依赖,而对其底层原理不够了解所导致的。对于问题一,如果知道多维数组在内存中也是连续存放的,就不难想到可以把一维数组映射成多维数组来使用;对于问题二,如果知道局部变量在底层都是用栈来存放的,就不难想到可以用数组手工模拟一个栈来实现递归调用中的变量值的暂存和恢复了。
通过这个例子,Vita切身体会到了解底层原理对解决编程问题所带来的帮助。不仅仅是孩子,很多学习编程的成年人以及职业程序员或许也碰到过类似的情境。如果对程序运行的底层原理有深入的理解,这些问题就可以迎刃而解,而能不能快速妥当地解决这些问题,往往能够体现出程序员专业水平的高低——正如本书作者所说,只有理解程序的工作原理,才能真正提高技术水平。
很荣幸能够成为《程序是怎样跑起来的》第3版的译者。这是一本畅销多年的经典作品,自2015年引进出版以来广受读者好评。在这本书中,作者以深入浅出的方式梳理了程序员应当关心却经常忽视的基础知识。在这次的第3版中,作者在对原有内容进行修订的基础上,还增加了机器学习和Python的相关章节,既适合计算机科学爱好者和新手程序员入门学习,也适合有一定经验的程序员用来巩固基础,查漏补缺。希望各位读者都能通过阅读本书有所收获。
周自恒
2022年6月于上海