鉴于我们班同学中有对学习编程有极大兴趣的人,我想有必要将我在大学中的学习经验写下来,供大家参考。(本文是专业性文章)
一。看清形势
首先我要说干什么事情一定不能犯方向性的错误。我有必要回顾一下软件开发的三个大的阶段。八十年代,主要的操作系统是 Unix, DOS ,程序语言主要是 C , 开发方法是面向过程的自顶向下,逐步细化,我们在大学中学C语言时用的Turbo C 2.0 就是主要的开发工具。到了九十年代,操作系统成了Windows,程序语言是C++,开发方法是面向对象,开发工具有Microsoft的VC++, Borland 的 BC++。而我们现在所处的时代是 Web service 的时代,操作系统已经是Microsoft的 .Net和Sun的J2EE ,程序语言已经是 Microsoft 的 C# 和 Sun 的
Java ,开发方法是面向组件,工具是 Visual Studio .Net ,Jbuilder。
程序开发的主流绝对不在中国,是在美国,作为不是优势产业的软件我们没有办法,只能跟着别人走。而全球的领先技术是掌握在像 Microsoft 和 Sun 这样的大公司手中的。跟着微软走已经成为软件业的一条至理名言。微软实在太强大了,历史上有多少公司都被它给搞跨了,比如 Borland, Netscape 。我们没有选择的余地,想想微软的 Windows 一流行,有谁还去用 DOS 下的软件,一大批 DOS 高手还不是去啃跟天书一样的《programming windows》,
《inside vc++》。
二。语言选择
我们首先认清了形势。下来我讲我们的选择。对于初学者,光去学 C 语言是远远不够的。这只能让你对程序语言有一个大概的了解,比如什么是变量,什么是函数。依我的经验在初步有所了解之后应马上去学习C++,这可是一个比较艰辛的过程。可以看一下清华的《C++语言程序设计》,这是一本入门教材。这时的学习是单纯语言的学习,不涉及任何实际的开发,比如 windows程序开发,初学者开始最好不要去碰 windows.
在你比较熟悉 C++ 之后最好去学一下数据结构,我推荐一本经典的教材《数据结构 C++语言描述》,这本书我至少看过三遍。看这本书有三方面的收获,一是进一步熟悉 C++ ,二是学习了数据结构,三是了解了面向对象的设计方法。
在这之后就可以去看 windows 编程了,对没有做过 window 编程的人,这种学习可能让你马上想放弃,因为 windows 编程实在太复杂了。一个很简单的 Hello World 窗口有近一百行的程序,而且让人看不大明白。我不太推荐绕过学 win32 api 去直接学 mfc,这会让你吃尽苦头。大家最好是去先从《programming windows》(北大出版社有相应的译本,不过挺贵的,上下册160元)开始吧,这里你可以学习到 windows 程序的内部机理,像消息循环,资源,窗口。
正是由于直接用 api 开发太麻烦了,所以就有了 mfc ,不过这东西好像更繁了,我现在不大用这东西了。
这里真正有价值的是 win32 的 api ,这对你以后的编程学习有很大的好处,比如对 mfc机理的了解。说到底操作系统就是一大堆系统调用的集合,在 windows 下就是 win32 api 。后来我看 win32 汇编方面的书时,其实也就是在调用 win32 api 。
在学 windows 的同时应该继续学习 C++ ,C++是一个大的课题,包括很多的东西,我现在在看 C++标准库方面的书,用的书是侯捷译的《C++标准程序库》和他的《STL源码剖析》。在学数据结构时想那么多的 ADT 和算法是不是都要自己去写呢,我接触过 STL 后就没有这种担心了,STL 里提供了你所能用到的几乎所有的东西,而且是程序大师帮你写的。C++之父的经典著作《C++程序设计语言》中已经将STL视为标准C++的一个部分了。这时大家可以看一下潘爱民翻的《C++ Primer》,绝对经典。
有了好的 C++ 基础后,就可以去学一下业内主流的语言 Java 和 C# ,其实学习它们很简单,都是衍生于 C++ ,语法基本一样,只是它们是纯面向对象的语言,添加了对于组件的支持。Java 可以用《Java编程思想》这本书,侯捷翻的,很不错。 C# 书就多了,我用的是清华翻的那套,《beginning C#》,《advanced C#》。为什么要学这两种语言,因为微软和Sun 都把未来压在分布式计算之上。未来的程序是运行在网络空间之中的,Java 的流行就揭示了这种趋势。
三。专业课程
下来我讲讲计算机的一些专业课程的学习,很多人认为只要学学语言就够了,不需要学专业课程,随着学习的深入,我渐渐体会到这种想法是不对的。像《操作系统》,《计算机组成原理》,《编译原理》,这样的课程,你学的时候不觉得,但在编程中的一些东西你如果明白原理的话,就能深入理解。比如编程时按行访问数组和按列访问执行的时间就不同,这涉及到了《操作系统》中的虚拟内存的原理,《applicated operating system concepts》里有这个经典的例子。
操作系统方面的书很多,大家学习过之后应该看一下《操作系统,设计与实现》这本书,它的好处是结合一个小型的教学用的操作系统 Minix 来讲,可以结合源代码来学习,Linux对初学者有点太专业了,其实 Minix 也是类 Unix 的,当初 Linux 本人就是看了这本书才决定自己写 Linux。
我再推荐一本《程序语言,设计与实现》,这本书可以让你对语言中的各种元素有深入的理解,比如变量在计算机内如何实现,程序执行中内存怎样分配。
四。方向选择
计算机科学是一个大的学科,很多的分支学科,计算机图形学,人工智能,实时控制,分布式计算,我们也不可能有那么多的时间去学习它的方方面面。可以捡自己有兴趣的地方深入学习,我选的就是计算机游戏来学习。《Windows 游戏编程大师》是入门的教材,主要讲DirectX 。游戏编程是一个大杂烩的方向,涉及计算机图形学,人工智能,数据结构。
计算机科学也有一些普及性的书,比如《编码的秘密》,《计算机信息处理》,这些书虽然不是专业性的书,但能让人对计算机科学产生浓厚的兴趣,蛮有意思的。
五。开发实践
计算机编程绝对是需要实践的东西,你想整天看看书成为高手,这是不可能的。你必须去做。学习教材时书上有很多的例子,你可以运行它,作一些适当的修改,有些书的例子是非常经典的,比如《数据结构 C++ 语言描述》的源代码,SGI的STL源代码,这些东西网上都能下载到。
开始做程序不要想着自己去做一个OFFICE,这是不可能的,给自己选一个小的题目,有实用价值的。比如我经常打印一些程序的源代码,因为一个一个文件去打印很麻烦,就自己用C# 写了一个文件合并的程序 Multi2One ,功能很简单,就是可以把几百个文件合并成一个文件,但它对我特别有用。省了我大量的时间,做出来之后也挺有成就感的,我整整在宿舍座了九个小时才写出来。
也可以找一些志同道合的同学一起开发,我就经常和计算机系的一个同学,还有软件学院的一个同学一起做些东西,大家在一起可以培养团队精神,相互交流,资源共享。
六。常用工具
C#:Visual Studio .Net
Java: Sun Java 2 SDK
C++:Dev C++
Win32asm:Masm32v7