这是一本很实用且独具特色的书。
这是一本讲技术,更讲学习方法的书。
这是一本从头至尾贯彻“授人与鱼,不如授人与渔”宗旨的书。
2003 年暑假,笔者在 CSDN “程序人生”论坛上发表的个人自传 — —《一个普通 IT 人的十年回顾》(已收入本书配套光盘),一石激起千层浪,被许多网站转载,我个人也收到了海内外近千封电子邮件。
我是一位在没有名师指导的情况下,几乎完全靠自己在黑暗中摸索,在自学之路上艰难地跋涉过来的软件开发者。我不敢自称为“职业程序员”,只敢自称为“软件开发爱好者”。我知道自己的技术水平有限,远远达不到“高手”与“专家”的水平,但我花了 10 年时间去学习计算机技术,其中酸甜苦辣,冷暖自知。我愿意把这期间的所思和所悟,与广大读者分享,并期望能帮助更多的初学者不走或少走我所走过的弯路,迅速地迈入软件开发技术的大门,最终成为远远超过本人水平的软件技术高手。
若能达此目的,则我在这本书中所花的心血也就值得了。
我为什么写这本书
我是在大学毕业后才开始半路出家学电脑的,走了一条艰难曲折的自学之路。在写作本书的时候,刚好满 10 年。 10 年以来,我几乎就没离开过计算机,而编程更是从未间断。写过的代码到底有多少恐怕无法统计了(加起来肯定有几十万行)。出于对软件技术的强烈兴趣,我从对计算机一无所知起步,到后来考上了计算机专业的研究生,毕业之后又走上高校计算机教学岗位,感触颇多。
在有了 10 年自学计算机技术的经历和近几年在高校讲授程序设计系列课程的经验之后,我一直在思索以下几个问题:
? 软件到底是怎样开发出来的?
? 编程是难还是易?有没有能让编程功力“暴长 10 年”的“武功秘笈”?
? 一个有志于成为优秀软件工程师的人应该怎样学习计算机技术?
? 用什么方式才能让许多学生很快地学会特定的计算机技术,而不用重复我和其他人所走过的弯路?
思索的结果就是大家所看到的这本书。
在我自己亲身的学习与开发实践中,逐渐形成了这么一个观点:
编程其实并不难!
要编程并不需要到大学计算机系里去学很多艰深的理论,经过适当的指导与训练,一个高中生就可以参加到软件项目团队中,并写出具有相当质量水准的程序!
为什么会有那么多的人把编程视为很高深的东西?
为什么我国那么多的软件企业深感合格的程序员是如此难找?
与此同时,又有与之完全对立的情况:每年有大批计算机及相关专业毕业生四处求职,却处处碰壁,找工作成了一件很不轻松的事情……
一边是真正合格的程序员人数很少,软件企业都在喊急缺人才,而另一边是大量的学生毕业找不着理想的工作。这样一个怪圈为何会形成?
我想,造成这个怪圈有两个重要的原因。
一是学生学习方法与态度的问题。由于对软件开发这一工作本身缺乏正确认识,许多学生形成了一种浮躁的功利型学习方法,表现为盲目地跟风学习各种当前流行的新技术,但大都只是三个月热度,由于欠缺毅力和不具备扎实的理论与实践基础,对这些新技术无法深入把握,浅尝辄止,“坐而论道”,讨论时可以“滔滔不绝”,一到动手则“原形毕露”。许多人没有想过:现在流行的“新”技术,难道就会一直“流行”下去?曾经风光一时的 Foxpro 和 PowerBuilder ,国内曾有许多人(包括本人在内)投入大量的时间去学习与掌握,可没过几年,还有几个项目是用这两种技术开发的呢?所以,如果要“追”新技术,也只能去学预计两到三年后社会急需的技术,这就需要学习者有超前的眼光。但软件技术进步实在太快,很少有人能够准确预测出几年之后会流行什么。所以,与其“临渊羡鱼”,不如“退而结网”,选择一项自己喜欢的领域,从理论到技术,扎扎实实地用两到三年时间去学好它,在学习过程中培养出“捕鱼”的本事。有了这种自我学习的基本能力与素质,还担心出海捕不到鱼吗?
有一些学生投入相当多的时间与金钱去参加种种有着各种动听承诺的电脑培训班,指望别人能够帮助自己成为技术高手,却不知真正的高手大都是“自学成才”!
更有太多的尤其是非计算机专业的学生,盲目地去考各种认证,不管是国内的还是国外的考试,只要有证,就有大批的人去参加。他们把应用计算机技术的能力简单地等同于一纸证书。当前的计算机等级考试就大有成为高校中第二个“英语四六级”的可能性。 事实上,你向别人展示自己写的一个软件作品,比给别人看一堆各式各样的证书更能说明你的能力!
造成怪圈的第二个重要原因就是计算机教育问题。目前高校中的计算机教育并不能大批量地培养出合格的软件开发者,学生在四年本科期间计算机理论学了不少,对培养编程能力却重视不够,缺乏实践的结果是理论也掌握不好,学生的计算机水平被煮成了“夹生饭”。
除了在校的大学生,社会上还有大批的软件开发爱好者,他们由于没有机会系统地学习软件开发技术,就采用自学和自我实践的方式,结合自己的工作来应用学到的计算机技术。虽然他们没有在校生的优越条件,但其中优秀人物的真实开发能力远胜于正规高校计算机专业“科班”出身的本科生甚至是硕士生。这种例子已经很多了。
“职业选手”不如“业余选手”!
我自己是走“野路子”出来的,走的是以实践为主导的自学之路,从亲身实践中深切感受到计算机科学本质上是一门实践性非常强的科学,不管是在校学生还是社会上的软件开发爱好者,我的建议是:
实践就是最好的老师!
另一个需要强调的是:
编程是一种技能,就同学习外语一样,绝不可能“速成”!
我从 2002 年开始接触 .NET 技术,并一直研究使用至今,前前后后看了近百本国内外的 .NET 编程书籍,并写了几万行的 .NET 代码。在对 .NET 有了一定的了解之后,我认为 .NET 技术是初学者学习软件技术非常好的切入点,学习者可以一步到位,直接学习目前主流的面向对象软件开发技术,而不用按部就班,按传统的先结构化编程再面向对象编程的顺序去学习。
接着我思考的问题是:这本书该怎么写?
著名物理学家爱因斯坦曾经表达过这样的思想:
学习时只需要掌握那些能让思维导向深入的东西,而将其他无关的知识全部抛弃。
软件技术本身有一个庞大而复杂的体系结构,不分巨细地样样都想掌握,那么只能是疲于奔命而终无所得。
为此,基于我自己的理解,在书中我将认为是最重要和最基础的东西突显出来,这些东西是必须掌握的,一旦理解并掌握它们之后,读者就掌握了“捕鱼”的方法,自己就可以进一步探索某一领域内的其他技术点了。因此在书中不需对每个技术领域的每个技术点都“面面俱到”。
编程是有规律的,读者能不能迅速成为一名具备相当水平的程序员,关键在于对编程规律与必备知识基础的把握程度。
读者在阅读本书时,最重要的是要掌握原理。在开发过程中所进行的各项具体活动与工作步骤,其背后都是有道理的,理解清楚了这些道理,在整个软件开发过程中该做什么,不该做什么,先做什么,后做什么,也就心中有数了。
编了这么多年的程序,我意识到其实学习软件开发技术的过程就是一个学会做事方法的过程。例如,在开发软件时,要“分而治之”、“步步为营”、“先局部后整体”、“合理安排开发次序”、“养成良好的编程习惯”等,这不仅仅是程序设计的技巧,也是做好编程之外许多其他工作所需要的。
在学习与掌握软件技术这一过程中,可以锻炼一个人的许多基本素质,如思维周密、意志坚强、学习能力、创新精神等。如果一个人能在竞争空前激烈的 IT 业凭借着高素质站稳脚跟,那么,可以很有把握地说,如果他转向其他行业,同样是一个优秀的人才,也会闯出自己的一番天地!
在本书中,结合我个人的开发经验,精心安排了学习次序,循序渐进地引导读者迈入软件开发的大门。
在许多计算机技术书籍中,出现了大量的技术术语,对于不熟悉这些术语的读者而言,这无疑加大了阅读的难度。对于这些计算机术语的表述,如果强调其在理论上的科学性与严谨性,则往往不易于理解,这在很大程度上限制了这些知识的传播、普及和应用。因此,本书对这些术语大都采用了一种通俗易懂的方式来表达,甚至使用了不少比喻手法来阐明其内涵。这种表达方式虽易于理解,但不免在科学性和严谨性上有所不足,读者如果需要科学而精确的定义,请自行查阅相关的科技文献。强调一下,本书是一本志在普及软件开发技术的专业书籍,与传统的工程技术专著和计算机科学理论教材不同,阅读时不要像中学学习数学一样,每个字都不放过,而应将重点放在形成对软件开发过程的直观理解和感性认识上。
对于一个具体的软件开发者而言,只有被理解了的知识才是真正有用的知识,无法理解的知识是毫无用处的。笔者写书的主要目的是让读者能迅速地汲取书中所提供的知识,尽量做到 “用大白话讲述复杂的技术” ,因此在文字上追求深入浅出,但是否真的做到了这一点,还得由读者来做出评价。
知识的获取与掌握是有其客观规律的,一般而言,具体的知识易于理解,而抽象的知识则难于把握,在学习过程中,应遵循“具体 → 抽象 → 具体 → ……”这样一个无限循环的过程。
如果某人对一门学科所知不多,却指望他能通过理论学习迅速地把握这门学科,这就违反了人类认识世界的客观规律。可惜的是,目前中国教育体制中普遍采用的让学生重点学习抽象理论而忽视具体实践的做法,造成了大批的学生既没学好理论,也没打好必要的实践基础。
我认为,只有建立在实践基础之上的理论学习才是真正有效的学习。因此在整个计算机技术的学习过程中,应该把开发实践作为一条主线,由它串起所有的计算机理论。如果把计算机技术中的各个子领域看做是一个个珍珠,开发实践就是那根把所有珍珠串成项链的丝线。没有这根线,学习各门计算机课程得到的不过是一颗颗零散的珠子,价值有限。
出于这些考虑,笔者在介绍许多编程技巧的同时,也同步介绍了相关的高等数学、数据结构、操作系统、数据库理论、软件工程等计算机科学理论内容,其目的就是希望读者能了解到理论是如何应用在开发实践中的,从而有助于读者日后针对性更强地去学习这些计算机理论课程,最终成为一名优秀的软件工程师。
本书虽然介绍了大量的编程技巧,但绝不是编程技巧的简单汇编,其中涉及了计算机科学中相当广泛的知识。如果读者能够从本书中体会到计算机技术的脉络,并培养出一定的开发能力,那么我会感到非常高兴与欣慰。
学习此书,要求读者对 Windows 操作系统比较熟悉,对软件开发有着浓厚的兴趣,并不要求读者系统学习过计算机专业课程,或者有 C 、 Pascal 等丰富的程序开发经验。
怎样学习软件开发技术
.区分计算机科学与计算机技术
“科学技术”四个字往往连在一起说,但事实上“科学”与“技术”是有区别的。
计算机科学主要研究理论,而计算机技术则是这些理论在实践中的应用。打个比方:编译理论是科学,而具体的编译器,如 VBC (微软公司开发的 VB.NET 程序编译器)就是技术了;操作系统原理是理论,而 Windows 就是理论应用于实践的产品,因而归属于技术范畴。
讲到这里,读者可能明白了,计算机科学家就是指那些从事计算机理论研究的人。目前,我国高校中计算机系开设的大部分课程都属于计算机科学范畴,比如“数据库原理”、“操作系统”、“计算机图形学”、“人工智能”、“算法理论”、“数据结构”等;而另一些课程则属于技术范畴,比如“ Visual Basic 程序设计”、“ SQL Server 数据库开发”等。还有一些课程,比如“面向对象程序设计”、“软件工程实践”等往往同时涉及理论和技术,因而是“混血儿”。
“科学”与“技术”的区别,自然地将从事计算机工作的人分成了两大块:计算机科学研究者与计算机技术工程师。前者研究的是理论,是计算机科学,人数较少,他们从事的是往计算机科学大厦中添砖加瓦的工作,是新知识的发现者。一般而言,只有非常优秀的人才能进行理论研究工作。后者研究的是技术,属于工程范畴,他们关注的是如何把一个好的软件、一个好的系统实实在在地做出来,大部分人属于工程范畴。
计算机技术总体上又分为软件与硬件两大块:硬件工程师研究的是芯片、集成电路、板卡等“实实在在”、可以“摸得着”的东西;而软件工程师则编写程序,驱动各种各样的硬件完成工作。
在计算机技术中,有一个并不严格但众所周知的“软硬定律”:
任何一项由软件完成的功能,也可以用硬件实现,反之亦然。
比如 Java 虚拟机( Virtual Machine ),它原先属于软件范畴,但如果将整个虚拟机烧录到硬件芯片中,然后在它上面运行 Java 程序,那你说现在这个虚拟机是“硬件”还是“软件”?这个界限已经模糊了。
我们回到本书所介绍的 .NET , .NET 是属于软件技术范畴的。换句话说,如果你想成为一名软件工程师,就可以看这本书。
. .NET 与 Java
Java 是 20 世纪 90 年代诞生的一种面向对象的语言,它吸取了 C++ 的许多长处,其最引人注目的特性是“跨平台”。由于它很好地满足了网络时代信息系统对计算机高级语言的要求,因而在实践中得到了广泛应用。
Java 经过近 10 年的发展,目前已在企业信息系统开发领域占据了主流地位,形成了一整套完整的技术体系,取得了巨大的成功。
.NET 是微软推出的一种新的软件运行平台,它包括一整套应用范围广泛的技术,旨在迎接 Java 所带来的挑战。 .NET 给软件开发带来了很多新的技术,尤其是它的“混合语言”开发,是第一个成熟的支持多种语言混合开发方式的软件运行平台,在下一代 Windows — — LongHorn (预计 2006 年推出)的核心中将会看到这个新技术的身影。
如果读者学过 Java ,就会发现 .NET 技术与 Java 技术在许多方面实在是太像了。尤其是 C# ( .NET 下的一种编程语言,念成“ C Sharp ”,不要念成“ C 井” J ),如果给你一段代码,有的时候还真难分辨出是用 Java 还是 C# 写的。