Advertisement

应该如何学软件

阅读量:

《软件调试》第2版第2卷即将出版, 尽管在正文部分已经完成了近百万字的撰写工作, 然而, 在前言部分我还想向我的读者们献上一些话.

我想说的是:软件作为信息时代的主角,在其发展过程中对人类社会的影响已具深远意义,并正朝着一个更高的目标迈进。无论是从事软件相关工作还是学习这一领域的人士都能感受到这项事业的巨大魅力因此都应当全身心投入其中

如何才能更好地掌握软件学习的方法呢?作为一个涉及面较广的话题来说吧——这是一个综合性较强的话题

虽然我在高中时期曾编写过简单的BASIC程序,在那个阶段我对程序和软件的概念还非常模糊。1992年入学后, 我开始系统地学习计算机硬件与软件.记得最初接触计算机课程时所学的是FORTRAN语言,当时学起来感到相当吃力.后来又依次学习了C语言、数据结构以及微机原理

微机原理课程由两门课程组成:一门着重于8051单片机硬件部分的学习;另一门则深入探讨8086汇编语言编程技术。教授《8086汇编语言》的老师是一位年过花甲的老学者,在学术界有着深厚的造诣。他的上课风格独树一帜:平易近人但少言寡语,在课堂上很少涉及具体的技术细节。今天是我第一次旁听他的课程时所记:他布置了一个特别有意思的作业——让大家利用所学知识自行设计一个汇编程序,并在课后自行完成开发工作。这种以项目为导向的教学方法让同学们印象深刻

这样的教学方式与传统灌输式教学存在显著差异:传统的课堂讲解往往侧重于理论知识的系统传授;而他鼓励学生主动思考并解决实际问题,在这种模式下培养出来的学生往往更具创新能力和实践能力

由于课堂内外的时间安排较为紧张,在课余时间完成作业成为许多同学的日常安排。当时计算机资源的配置相对有限,在系部机房常显拥挤。因此,在某些情况下需要前往校内计算机中心进行上机操作。每次上机都需要支付费用,并且当时普遍使用饭票作为支付手段。

就在那个学期,一个同班同学提议合伙买一台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个字:学习正用,买也值得。

回想起来,我深刻的编程体验始于那台个人电脑。每次轮到我上机时,在键盘上敲击代码与调试程序是我唯一的选择,在此期间从不做游戏或其它活动以求集中精力高效利用时间。为了提高效率我会先将代码记在笔记本上然后快速输入电脑中随后编译运行观察结果再进行调试这种习惯让我对程序运行机制有着深入的理解。其中最让我难忘的一次经历是在DOS环境下实现图形界面显示效果的过程当时为了优化屏幕显示效果我在DOS程序中使用汇编语言中的软中断指令调用Video BIOS服务将系统的显示模式从纯文本切换到了支持图形界面的状态当我逐步执行切换图形模式指令时CRT显示器突然亮起了 ANSI码光标并开始播放一段令人困惑的画面

由于投入的时间十分充足,在过去的一年里,“8086汇编语言”的学习与实践让我收获颇丰——我的这一领域专业软件开发能力得到了显著提升,并逐渐向纵深方向发展。不仅集成了一个图形化的下拉菜单界面,在技术实力上也彰显出显著优势——软件中还特别设置了TSR(内存驻留)功能模块,并能控制音响设备播放《两只老虎》这首经典曲目。凭借坚实的8086汇编语言功底后盾支持,在此基础上我开始学习并熟练掌握C语言开发Window应用程序。

回想我在学习软件过程中的切身体会,在分享这些经验时的第一条要点就是大量编写代码并积极调试程序。我一直对自己觉得自己不够聪明(尽管如此),但如果要说我能掌握一定的软件技术能力的话,则归功于这条原则:几乎每天都在编写代码,并且几乎每天都在面对各种问题进行调试与解决;这一坚持持续了近二十年之久,并最终演变成了一种习惯

一旦你选定此书作为学习材料,并认同其理论基础,则核心问题在于如何快速掌握这一技术体系的应用。最后我会简单阐述《软件调试》一书是如何形成以及适合怎样的读者群体。

2002年,在泰为科技工作期间的一个夜晚,我因赶进度不得不加班加点调试程序。然而就在紧急时刻出现了一个令人困惑的问题——程序运行异常且难以排查。这段经历促使我专注于专为Nokia手机开发的特定调试技术而非传统的打印输出方法。在那次关键任务中发现使用模拟器中的调试工具远比依靠打印更加有效率与直观。最终成功解决问题后同事们纷纷拍手称快并由衷赞叹道:“断点调试技术真是妙不可言!”这番话让我萌生了撰写一本关于断点调试技巧书籍的想法旨在将这一便捷的技术分享给更多开发者

自2003年5月以来,在英特尔工作期间,我的办公地点位于浦东外高桥保税区。由于与市区有一定距离, 每天搭乘公交通勤, 这种安排让我能够集中精力进行研究和开发工作, 并将相关成果整理成书稿

耗时五年多时, 我反复修订数次, 最终完成初稿. 因篇幅过长, 删减近两百页方投向出版机构. 最终确定名为《软件调试》. 2008年5月, 总计约百万字始具雏形, 《软件调试》一书共计1千零六页. 有位来自欧洲的读者发现后表示:'中国出了一本千页的调试之书'.

在规划撰写第二卷的过程中 我希望将大量 previously accumulated 的调试实践经验凝练成系统的理论知识 但这并非易事 因为篇幅限制迫使我在内容选择上不得不进行精确筛选

筛选标准首要考量自然就是其实用价值 特别是以下两个方面

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

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

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

阐述Windows平台的发展历程及其关键技术(第1至4章),重点分析其进程与线程机制、核心组件及其运行流程。旨在帮助读者全面理解Windows系统的运行原理与设计架构,并在此基础上形成对其整体功能的认知框架——即全局观与技术基础

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

本研究着重从Windows系统中具有独特特色的几个关键领域进行了深入探讨,并具体涉及以下四个具有代表性的调用机制:包括APC、DPC、LPC以及RPC等机制(见第五章)。其中一种专门针对解决应用程序兼容问题而设计的机制(第六章),一度被期待但实际表现不尽如人意的技术——.NET技术(第七章),以及展现与时代发展相匹配的技术特点的技术体系——呈现出与时代发展相匹配的技术特点 Linux子系统(第八章)。

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

我始终钟爱Windows系统的主要原因之一在于其全面而强大的开发工具包。本文的目的就在于系统地梳理Windows平台下的各类调试资源,并从不同维度进行深入阐述。首先从用户空间开始, 介绍了支持应用程序开发所需的必要模型及其相关API (如第9章所述), 同时详细阐述了其在用户态下的流程与步骤 (如第10章所述)。随后深入探讨了程序运行中可能出现的问题, 包括应错误现象及常见蓝屏问题 (如第13章所述)。接着深入分析了全局性的错误报告机制、高效的日志记录方法以及用于追踪系统事件的追踪工具 (如第14至16章所述), 特别是对那些与硬件故障相关的WHEA报告进行了重点说明 (如第17章所述)。最后重点介绍了当前非常成熟且具特色的内核式调试引擎及其验证机制 (如第18至19章所述)。

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

这篇文档详细阐述了Windows平台开发工具中的调试支持功能。内容系统性地分为五个章节进行讲解:首先阐述编译器在编译期的检核流程(第20章),接着深入探讨运行期时的检视步骤(第21章)。随后重点解析栈结构及其函数调用机制(第22章),继而全面解读堆内存管理与调试支持(第23章)。最后专门针对异常处理代码展开分析,并详细描述其编译阶段的操作流程(第24章)。此外,在第25章中对调试符号的作用及应用方法也进行了深入说明。

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

调试器无疑是最强大的软件征服工具。本文首先概述了调试器的发展历程及其工作原理(第26章),随后分别介绍了Windows平台上的主流调试工具:Visual Studio内置的VsDebug系列工具(见第27章)、VS Code提供的 debug 扩展(第28章),以及广为人知的WinDBG工具(第30章)。

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

  • 在第5篇中新增了开发阶段常用的VsDebug调试器,并对具有一定难度的功能进行了深入介绍,包括硬件断点、追踪点以及多线程调试等内容。
  • 在第5篇中新增了一章专门介绍近年来流行的VS Code开发环境,并重点阐述了"调试扩展"系统的组织架构及其运行机制。
  • 新增了"老雷点评"专栏,内容涵盖技术背景分析、写作过程解析以及个人感悟分享等几个方面。
  • 为了帮助读者更好地实践所学知识,在文末特别增设了"亲自动手"环节。
  • 为了便于携带阅读,全书被精心划分上下两册:上册包含前三篇及前20章内容;下册则包含后两篇及后16章内容。

理想的学习方式是参考书中的指导来练习编写和调试代码,并通过实践加深理解和积累实际操作经验。配套网站上官网提供了源码库下载,并附带预编译的可执行文件供学习使用。

在过去的余 invalidate 余年来 硬件与软件领域已发生了翻天覆地的变化。就硬件性能而言 最为显著的两个方面是存储容量与计算能力的提升。例如 从最初的4兆内存容量到如今的8千兆存储空间 显示出了惊人的增长幅度 同时 外部存储容量也经历了翻番的过程 从原先的210兆扩大至现在的1.24 tera(其中1 tera等于1024 giga)。在处理器方面 现代计算机已实现了质的飞跃 由单核芯片发展为拥有八核心配置的高性能处理器 运算频率则从最初的4千万提升至现在的18亿赫兹

软件领域的发展也十分显著,在体积上也有明显的变化。首先来看规模的增长情况:回想过去的时候,在一台仅仅只有1.44MB存储空间的老式软盘上运行DOS操作系统的工作文件时,并非是一件罕见的事情;此外,在那个年代里人们还可以携带许多常用的工具文件存储在同一个软盘中使用方便快捷。然而如今随便一个普通的软件程序都可能包含几十MB甚至上百MB的数据量;而这种体积上的突飞猛涨直接导致系统复杂度急剧上升;而系统的复杂性进一步加剧使得系统中的缺陷逐渐增多;最终演变成大量存在于生产环境中的未修复问题;随着质量的重要性不断提升,“质量保证工程师”的角色逐渐凸显;随着质量保证工程师这一职位逐渐凸显出来并得到了广泛认可;这也促使许多公司纷纷成立了专门的质量保障部门或者建立了严格的质量控制流程来应对日益严峻的质量挑战。

随着专业调试工程师数量显著增加并逐渐普及,软件调试技术正逐渐引起更多关注,逐步向公开化方向发展

展望未来的发展趋势,在人工智能与大数据等传统技术和新兴技术将不断融合的过程中,在云计算与物联网等创新技术和应用将不断涌现的情况下,在系统规模和技术复杂度将持续提升的同时,在对系统的调试与维护能力提出了更高的要求

诚挚祝愿本书的读者们能在代码王国中熟练驾驭调试之剑, 畅游无阻。

张银奎(Raymond Zhang)

于上海格蠹轩

2020年6月21日星期日

全部评论 (0)

还没有任何评论哟~