应该如何学软件

《软件调试》第2版第2卷就要出版了,虽然在正文中已经写了近百万言,但我还是想在前言中再写一些话送给我的读者们。

首先我想说,软件是信息时代里的主角,它已经对人类社会产生了巨大的影响,而且正在产生更大的影响,如果你在做软件方面的工作,那么你应该感觉很幸运,如果你在学习软件,那么你选择了前景无限广阔的方向,一定要坚持。

如何把软件学好呢?这是个比较大的话题,我愿把我的亲身经历分享给大家。

虽然我在读高中时就编写过基本的BASIC程序,但是那时根本没有对程序和软件建立起什么概念。1992年,我进入大学后,开始比较系统的学习计算机的硬件和软件。还记得学习的第一门计算机课是Fortran语言,学的也是云里雾里。而后陆续学习了C语言、数据结构和微机原理。

微机原理有两门课,一门讲8051单片机,比较偏硬件。另一门讲8086汇编语言编程,比较偏软件了。教“8086汇编语言”的老师30多岁的年龄,个头很高,说话不多,今天,我已经记不起他在课堂上讲过的任何技术内容,但却清晰的记得他使用了一种很独特的教学方法。与其他老师费劲地讲解每个知识点不同,他只是给大家留了一个大作业,让大家自己用汇编语言写个程序,自己决定程序的功能和界面。留了这个作业后,几乎就没有见到过这位老师。一到他的课,就是到机房里上机,闷头写程序,各写各的。

课堂上的那点时间不够用,所以大家都经常在课外时间做这个作业。当时的计算机资源还比较宝贵。系里的机房常常人满为患。于是有时要到计算机中心去上机,上机不是免费的,需要花钱购买机时,当时流行用饭票来支付。

就在那个学期,一个同班同学提议合伙买一台PC,我很感兴趣,一边写信回家申请,一边先用开学时带的钱入了股。于是我和另外三位同学四人合伙,一起买了一台PC,硬件配置是386 DX/40,1.2M + 1.44M软驱,4M内存,210M硬盘,TVGA显卡,.28彩色显示器,安装的操作系统是DOS和Windows 3.1。我们是在华山路上的一家经营办公用品的店里购买的组装机,一共花了6505元人民币,又花了100多元的出租车费,把主机和CRT显示器运回到闵行校区。翻开久未打开过的大学时代日记,我们购买那台PC的时间是1994年11月11日,是星期五。日记中还夹着父亲当年为我汇款时用的汇款专用信封的附言部分,上面写着8个字:学习正用,买也值得。

现在回想起来,我真正的编程经历是从有了那台PC开始的。每次轮到我上机的时候,我都是写代码和调试,从来不打游戏,也不做其它事情。为了更好利用上机时间,我常常先把代码写到本子上,上机时快速录入进电脑,然后编译、运行看结果,再调试。当时我就喜欢用调试器,单步跟踪程序的每一行代码。现在清楚记得的一个细节是,为了在DOS下能显示出更好看的界面,我在DOS程序里用汇编语言中的软中断指令调用Video BIOS的服务,把系统的显示模式从文本模式改为图形模式。当我单步执行切换图形模式的指令时,CRT显示器上会出现五颜六色的光斑和各种诡异的画面……

因为投入的时间很多,我的“8086汇编语言“程序越写越大,功能越来越多,不仅有图形化的下拉菜单,炫耀技术的TSR(内存驻留)功能,而且还可以驱动PC喇叭播放”两只老虎“的音乐。有了比较扎实的汇编语言基础后,我又继续用C语言编写Windows程序。

回顾我学习软件的亲身经历,如果要我分享经验的话,那么我的第一条经验就是多写代码,多调试。我一直觉得我是个不聪明的人,如果说我把软件技术学的还可以的话,那么我靠的就是这条经验:几乎每一天都写代码,几乎每一天都调试,坚持了二十多年,已经成为了习惯。

既然你已经选择了这本书,那么你多半是同意我的“调试方法论”的。那么接下的问题就是如何能比较快的学会调试技术。下面我简要介绍一下《软件调试》的写作历程和阅读方法。

 2002年,我在泰为科技工作时,有一天晚上加班赶进度,在紧急时刻却出现了一个诡异的BUG,当时的程序是为Nokia手机编写的,不太好调试,同事们一遇到BUG,主要用print。但我还是喜欢在模拟器中用调试器来调试。对于那天晚上的问题,print方法很不奏效,我用调试方法抽丝剥茧,一步步排查,终于找到了问题的根源。问题解决了后,大家都笑逐颜开,一起加班的好朋友刘伟力很感慨地说:“断点真神奇!“他的这句话让我萌生了写一本调试之书的念头,目的是我把我喜欢的调试方法传播给更多人。

2003年5月,我加入到英特尔工作,办公地点在浦东外高桥保税区,离市区比较远,每天乘坐班车上下班,几乎从不加班,这给了我比较充足的时间来研究调试,并把研究的结果写成书稿。

用了大约5年时间,推翻重来几次,我的书稿终于完工了,因为篇幅过大,删除了近200页后提交给了博文视点,书名就定为《软件调试》。2008年5月,100多万字的《软件调试》问世了,一共1006页。一位欧洲同行发现了后,发帖说:“中国出了一本1000页的调试之书“。

2018年11月,《软件调试》第二版的第一卷出版,与第一版刚好间隔了10年。第二版的第一卷交稿后,我便开始规划第二卷。第二卷的主题是《Windows平台调试》。虽然加入英特尔后,也时常做一些Linux方面的工作,但是对我来说,Windows是“主场“,是我最熟悉的平台,我的编程之路从Windows开始,毕业之后的最初十年里也主要是在Windows平台上工作。因此,当我规划第二卷时,想写的内容很多。但考虑到篇幅限制,我不得不反复筛选。筛选的最重要原则是”实用性“,特别是如下两个指标:

  • 对读者理论知识的帮助有多大?
  • 对读者实战能力的帮助有多大?

经过多次调整,最后确定的第二卷内容由如下五篇组成,共30章。

第一篇:大局观(1-4章)

介绍Windows平台的发展历史(第1章),进程和线程(第2章),架构和关键部件(第3章),以及启动过程(第4章)。目的是把我对Windows的总体认识分享读者,让读者对Windows平台建立起一个总的认识,也就是大局观。

第二篇:探微(5-8章)

选择了Windows系统中非常有特色的几个方面进行深入剖析,分别是特殊的调用过程,包括APC、DPC、LPC和RPC(第5章),用于解决应用程序兼容问题的垫片机制(第6章),曾被给予厚望,实际让人失望的.Net技术(第7章),以及具有时代特征的Linux子系统(第8章)。

第三篇:操作系统的调试支持(9-19章)

我一直喜爱Windows系统的一个主要原因就是它的调试设施特别丰富。本篇的目标就是从不同角度呈现Windows平台上的各种调试设施,先从用户空间讲起,介绍支持应用程序调试的调试模型和调试API(第9章)以及用户态调试的工作过程(第10章),异常处理机制(第11章)以及处置未处理异常的方法和过程(第12章)。然后过渡到内核空间,介绍应错误和蓝屏(第13章)。再介绍全局性的错误报告(第14章)、日志(第15章)、事件追踪(第16章)和旨在记录硬件错误的WHEA(第17章)。而后介绍非常强大而且有特色的内核调试引擎(第18章)和验证机制(第19章)。

第四篇:开发工具的调试支持(20-25章)

这一篇介绍Windows平台上的开发工具的调试支持,先介绍编译器的编译期检查(第20章)和运行期检查(第21章),再深度解析栈的结构和函数调用的细节(第22章),然后解析堆的结构和调试支持(第23章),异常处理代码的编译过程(第24章),以及调试符号(第25章)。

第五篇:调试器(26-30章)

调试器无疑是征服软件世界的最有力武器。本篇先概览调试器的发展历史和工作模型(第26章),然后再分别介绍Windows平台上的常用调试器,包括老牌的集成在Visual Studio环境中的VsDebug(第27章)、新兴的VS Code调试扩展(第28章),以及著名的WinDBG(第30章)。

对于熟悉第一版的读者,第二版本的变化主要有:

  • 新增了第一篇和第二篇,目的是让大家不仅要熟悉调试设施,也要对“战斗”的环境和调试目标有比较深的认识。
  • 在第5篇中新增了开发阶段常用的VsDebug调试器,详细介绍了有一定难度的功能,比如硬件断点,追踪点,多线程调试等。
  • 在第5篇中新增了一章介绍近几年流行的VS Code开发环境,特别介绍了“调试扩展”的结构和工作原理。
  • 新增了“老雷点评”,有的是评论技术背景,有的是介绍写作过程,有的是分享作者的感悟。
  • 新增了“亲自动手”板块,目的是鼓励读者多动手实践。
  • 为了便于携带和阅读,装订为上下两册,上册包含前三篇和前20章,下册包含后两篇和后16章。

阅读本书的最好方法是根据书中的提示,调试各种代码,多动手,多实践。本书的配套网站上(http://advdbg.org)有本书示例程序的源代码和编译好的二进制文件。

在过去的20多年中,计算机硬件和软件的变化可谓翻天覆地。从硬件的角度看变化最大的有两个指标:一个是空间,一个是速度。以我94年的第一台PC和我写作本序言使用的笔记本电脑为例,内存空间从4M变为8G,外存空间从210M变为1.24T(1T机械硬盘加240G固态硬盘),CPU的个数从1个变为8个(4核加超线程),主频从40M变为1.8G。

软件方面变化也很大,首先是体量变大,想当年用1张1.44M的软盘就可以做一张DOS操作系统的工作盘,里面还可以放上很多常用的工具。今天,随随便便的一个软件就是几十M甚至上百兆的安装程序。软件体量的迅猛增长带来的结果是软件的复杂度飞升。复杂度飞升导致的结果是软件的瑕疵增多,测试团队难以发现所有的BUG,于是越来越多的软件都是带着BUG发布。产品期瑕疵的增多,催生了一个新的角色,那就是调试工程师,他们的主要工作便是调试客户报告的产品期问题。今天,很多公司都有专门的调试团队,虽然名字不尽相同,但是大同小异。相对于开发阶段的调试,产品期调试的难度显然更大,对调试者的技术水平要求也更高。

随着专业调试工程师的出现和增多,软件调试技术正在受到越来越多的重视,正在由隐学转变为显学。我相信,很快会有大学开设专门的软件调试课程。

展望软件的未来,旧有的技术将进一步融合,新的技术继续涌现,软件的规模和复杂度持续增大,对软件调试技术的需求也越来越多。

衷心祝愿本书的读者们能使用调试之剑在软件世界中自由驰骋,游刃有余。

张银奎(Raymond Zhang)

于上海格蠹轩

2020年6月21日星期日

你可能感兴趣的:(编程语言)