怎么学编程.docx
《怎么学编程.docx》由会员分享,可在线阅读,更多相关《怎么学编程.docx(13页珍藏版)》请在冰豆网上搜索。
怎么学编程
兴趣?
工作?
竞赛?
首先找个论坛,长期的待下去,如编程十万个为什么
竞赛的初学者建议从pascal学起,基础并且结构性强,容易理解算法
如果是其他的那么c++还是掌握下吧~vb是比较人性化的编程语言。
实践就是最好的老师!
另一个需要强调的是:
编程是一种技能,就同学习外语一样,绝不可能“速成”!
在有了10年自学计算机技术的经历和近几年在高校讲授程序设计系列课程的经验之后,我一直在思索以下几个问题:
?
软件到底是怎样开发出来的?
?
编程是难还是易?
有没有能让编程功力“暴长10年”的“武功秘笈”?
?
一个有志于成为优秀软件工程师的人应该怎样学习计算机技术?
?
用什么方式才能让许多学生很快地学会特定的计算机技术,而不用重复我和其他人所走过的弯路?
思索的结果就是大家所看到的这本书。
在我自己亲身的学习与开发实践中,逐渐形成了这么一个观点:
编程其实并不难!
要编程并不需要到大学计算机系里去学很多艰深的理论,经过适当的指导与训练,一个高中生就可以参加到软件项目团队中,并写出具有相当质量水准的程序!
为什么会有那么多的人把编程视为很高深的东西?
为什么我国那么多的软件企业深感合格的程序员是如此难找?
与此同时,又有与之完全对立的情况:
每年有大批计算机及相关专业毕业生四处求职,却处处碰壁,找工作成了一件很不轻松的事情……
一边是真正合格的程序员人数很少,软件企业都在喊急缺人才,而另一边是大量的学生毕业找不着理想的工作。
这样一个怪圈为何会形成?
我想,造成这个怪圈有两个重要的原因。
一是学生学习方法与态度的问题。
由于对软件开发这一工作本身缺乏正确认识,许多学生形成了一种浮躁的功利型学习方法,表现为盲目地跟风学习各种当前流行的新技术,但大都只是三个月热度,由于欠缺毅力和不具备扎实的理论与实践基础,对这些新技术无法深入把握,浅尝辄止,“坐而论道”,讨论时可以“滔滔不绝”,一到动手则“原形毕露”。
许多人没有想过:
现在流行的“新”技术,难道就会一直“流行”下去?
曾经风光一时的Foxpro和PowerBuilder,国内曾有许多人(包括本人在内)投入大量的时间去学习与掌握,可没过几年,还有几个项目是用这两种技术开发的呢?
所以,如果要“追”新技术,也只能去学预计两到三年后社会急需的技术,这就需要学习者有超前的眼光。
但软件技术进步实在太快,很少有人能够准确预测出几年之后会流行什么。
所以,与其“临渊羡鱼”,不如“退而结网”,选择一项自己喜欢的领域,从理论到技术,扎扎实实地用两到三年时间去学好它,在学习过程中培养出“捕鱼”的本事。
有了这种自我学习的基本能力与素质,还担心出海捕不到鱼吗?
有一些学生投入相当多的时间与金钱去参加种种有着各种动听承诺的电脑培训班,指望别人能够帮助自己成为技术高手,却不知真正的高手大都是“自学成才”!
更有太多的尤其是非计算机专业的学生,盲目地去考各种认证,不管是国内的还是国外的考试,只要有证,就有大批的人去参加。
他们把应用计算机技术的能力简单地等同于一纸证书。
当前的计算机等级考试就大有成为高校中第二个“英语四六级”的可能性。
事实上,你向别人展示自己写的一个软件作品,比给别人看一堆各式各样的证书更能说明你的能力!
造成怪圈的第二个重要原因就是计算机教育问题。
目前高校中的计算机教育并不能大批量地培养出合格的软件开发者,学生在四年本科期间计算机理论学了不少,对培养编程能力却重视不够,缺乏实践的结果是理论也掌握不好,学生的计算机水平被煮成了“夹生饭”。
除了在校的大学生,社会上还有大批的软件开发爱好者,他们由于没有机会系统地学习软件开发技术,就采用自学和自我实践的方式,结合自己的工作来应用学到的计算机技术。
虽然他们没有在校生的优越条件,但其中优秀人物的真实开发能力远胜于正规高校计算机专业“科班”出身的本科生甚至是硕士生。
这种例子已经很多了。
“职业选手”不如“业余选手”!
我自己是走“野路子”出来的,走的是以实践为主导的自学之路,从亲身实践中深切感受到计算机科学本质上是一门实践性非常强的科学,不管是在校学生还是社会上的软件开发爱好者,我的建议是:
我从2002年开始接触.NET技术,并一直研究使用至今,前前后后看了近百本国内外的.NET编程书籍,并写了几万行的.NET代码。
在对.NET有了一定的了解之后,我认为.NET技术是初学者学习软件技术非常好的切入点,学习者可以一步到位,直接学习目前主流的面向对象软件开发技术,而不用按部就班,按传统的先结构化编程再面向对象编程的顺序去学习。
接着我思考的问题是:
这本书该怎么写?
著名物理学家爱因斯坦曾经表达过这样的思想:
学习时只需要掌握那些能让思维导向深入的东西,而将其他无关的知识全部抛弃。
软件技术本身有一个庞大而复杂的体系结构,不分巨细地样样都想掌握,那么只能是疲于奔命而终无所得。
为此,基于我自己的理解,在书中我将认为是最重要和最基础的东西突显出来,这些东西是必须掌握的,一旦理解并掌握它们之后,读者就掌握了“捕鱼”的方法,自己就可以进一步探索某一领域内的其他技术点了。
因此在书中不需对每个技术领域的每个技术点都“面面俱到”。
编程是有规律的,读者能不能迅速成为一名具备相当水平的程序员,关键在于对编程规律与必备知识基础的把握程度。
最重要的是要掌握原理。
在开发过程中所进行的各项具体活动与工作步骤,其背后都是有道理的,理解清楚了这些道理,在整个软件开发过程中该做什么,不该做什么,先做什么,后做什么,也就心中有数了。
编了这么多年的程序,我意识到其实学习软件开发技术的过程就是一个学会做事方法的过程。
例如,在开发软件时,要“分而治之”、“步步为营”、“先局部后整体”、“合理安排开发次序”、“养成良好的编程习惯”等,这不仅仅是程序设计的技巧,也是做好编程之外许多其他工作所需要的。
在学习与掌握软件技术这一过程中,可以锻炼一个人的许多基本素质,如思维周密、意志坚强、学习能力、创新精神等。
如果一个人能在竞争空前激烈的IT业凭借着高素质站稳脚跟,那么,可以很有把握地说,如果他转向其他行业,同样是一个优秀的人才,也会闯出自己的一番天地!
在许多计算机技术书籍中,出现了大量的技术术语,对于不熟悉这些术语的读者而言,这无疑加大了阅读的难度。
对于这些计算机术语的表述,如果强调其在理论上的科学性与严谨性,则往往不易于理解,这在很大程度上限制了这些知识的传播、普及和应用。
因此,本书对这些术语大都采用了一种通俗易懂的方式来表达,甚至使用了不少比喻手法来阐明其内涵。
这种表达方式虽易于理解,但不免在科学性和严谨性上有所不足,读者如果需要科学而精确的定义,请自行查阅相关的科技文献。
强调一下,本书是一本志在普及软件开发技术的专业书籍,与传统的工程技术专著和计算机科学理论教材不同,阅读时不要像中学学习数学一样,每个字都不放过,而应将重点放在形成对软件开发过程的直观理解和感性认识上。
对于一个具体的软件开发者而言,只有被理解了的知识才是真正有用的知识,无法理解的知识是毫无用处的。
笔者写书的主要目的是让读者能迅速地汲取书中所提供的知识,尽量做到“用大白话讲述复杂的技术”,因此在文字上追求深入浅出,但是否真的做到了这一点,还得由读者来做出评价。
知识的获取与掌握是有其客观规律的,一般而言,具体的知识易于理解,而抽象的知识则难于把握,在学习过程中,应遵循“具体→抽象→具体→……”这样一个无限循环的过程。
如果某人对一门学科所知不多,却指望他能通过理论学习迅速地把握这门学科,这就违反了人类认识世界的客观规律。
可惜的是,目前中国教育体制中普遍采用的让学生重点学习抽象理论而忽视具体实践的做法,造成了大批的学生既没学好理论,也没打好必要的实践基础。
我认为,只有建立在实践基础之上的理论学习才是真正有效的学习。
因此在整个计算机技术的学习过程中,应该把开发实践作为一条主线,由它串起所有的计算机理论。
如果把计算机技术中的各个子领域看做是一个个珍珠,开发实践就是那根把所有珍珠串成项链的丝线。
没有这根线,学习各门计算机课程得到的不过是一颗颗零散的珠子,价值有限。
编程
这是每个游戏编程FAQ里都有的问题。
这个问题每星期都会在游戏开发论坛上被问上好几次。
这是个很好的问题,但是,没人能给出简单的答案。
在某些应用程序中,总有一些计算机语言优于其他语言。
下面是几种用于编写游戏的主要编程语言的介绍及其优缺点。
希望这篇文章能帮助你做出决定。
1、C语言
如果说FORTRAN和COBOL是第一代高级编译语言,那么C语言就是它们的孙子辈。
C语言是DennisRitchie在七十年代创建的,它功能更强大且与ALGOL保持更连续的继承性,而ALGOL则是COBOL和FORTRAN的结构化继承者。
C语言被设计成一个比它的前辈更精巧、更简单的版本,它适于编写系统级的程序,比如操作系统。
在此之前,操作系统是使用汇编语言编写的,而且不可移植。
C语言是第一个使得系统级代码移植成为可能的编程语言。
C语言支持结构化编程,也就是说C的程序被编写成一些分离的函数呼叫(调用)的集合,这些呼叫是自上而下运行,而不像一个单独的集成块的代码使用GOTO语句控制流程。
因此,C程序比起集成性的FORTRAN及COBOL的“空心粉式代码”代码要简单得多。
事实上,C仍然具有GOTO语句,不过它的功能被限制了,仅当结构化方案非常复杂时才建议使用。
正由于它的系统编程根源,将C和汇编语言进行结合是相当容易的。
函数调用接口非常简单,而且汇编语言指令还能内嵌到C代码中,所以,不需要连接独立的汇编模块。
优点:
有益于编写小而快的程序。
很容易与汇编语言结合。
具有很高的标准化,因此其他平台上的各版本非常相似。
缺点:
不容易支持面向对象技术。
语法有时会非常难以理解,并造成滥用。
移植性:
C语言的核心以及ANSI函数调用都具有移植性,但仅限于流程控制、内存管理和简单的文件处理。
其他的东西都跟平台有关。
比如说,为Windows和Mac开发可移植的程序,用户界面部分就需要用到与系统相关的函数调用。
这一般意味着你必须写两次用户界面代码,不过还好有一些库可以减轻工作量。
用C语言编写的游戏:
非常非常多。
资料:
C语言的经典著作是《TheCProgrammingLanguage》,它经过多次修改,已经扩展到最初的三倍大,但它仍然是介绍C的优秀书本。
一本极好的教程是《TheWaiteGroup'sCPrimerPlus》。
2、C++
C++语言是具有面向对象特性的C语言的继承者。
面向对象编程,或称OOP是结构化编程的下一步。
OO程序由对象组成,其中的对象是数据和函数离散集合。
有许多可用的对象库存在,这使得编程简单得只需要将一些程序“建筑材料”堆在一起(至少理论上是这样)。
比如说,有很多的GUI和数据库的库实现为对象的集合。
C++总是辩论的主题,尤其是在游戏开发论坛里。
有几项C++的功能,比如虚拟函数,为函数呼叫的决策制定增加了一个额外层次,批评家很快指出C++程序将变得比相同功能的C程序来得大和慢。
C++的拥护者则认为,用C写出与虚拟函数等价的代码同样会增加开支。
这将是一个还在进行,而且不可能很快得出结论的争论。
我认为,C++的额外开支只是使用更好的语言的小付出。
同样的争论发生在六十年代高级程序语言如COBOL和FORTRAN开始取代汇编成为语言所选的时候。
批评家正确的指出使用高级语言编写的程序天生就比手写的汇编语言来得慢,而且必然如此。
而高级语言支持者认为这么点小小的性能损失是值得的,因为COBOL和FORTRAN程序更容易编写和维护。
优点:
组织大型程序时比C语言好得多。
很好的支持面向对象机制。
通用数据结构,如链表和可增长的阵列组成的库减轻了由于处理低层细节的负担。
缺点:
非常大而复杂。
与C语言一样存在语法滥用问题。
比C慢。
大多数编译器没有把整个语言正确的实现。
移植性:
比C语言好多了,但依然不是很乐观。
因为它具有与C语言相同的缺点,大多数可移植性用户界面库都使用C++对象实现。
使用C++编写的游戏:
非常非常多。
大多数的商业游戏是使用C或C++编写的。
资料:
最新版的《TheC++ProgrammingLanguage》非常好。
作为教程,有两个阵营,一个假定你知道C,另外一个假定你不知道。
到目前为止,最好的C++教程是《Who'sAfraidofC++》,如果你已经熟知C,那么试一下《TeachYourselfC++》。
3、我该学习C++或是该从C开始
我不喜欢这种说法,但它是继“我该使用哪门语言”之后最经常被问及的问题。
很不幸,不存在标准答案。
你可以自学C并使用它来写程序,从而节省一大堆的时间,不过使用这种方法有两个弊端:
你将错过那些面向对象的知识,因为它可能在你的游戏中使得数据建模更有效率的东西。
最大的商业游戏,包括第一人称射击游戏很多并没有使用C++。
但是,这些程序的作者即使使用老的C的格式,他们通常坚持使用面向对象编程技术。
如果你只想学C,至少要自学OO(面向对象)编程技术。
OO是仿真(游戏)的完美方法,如果你不学习OO,你将不得不“辛苦”的工作。
4、汇编语言
显然,汇编是第一个计算机语言。
汇编语言实际上是你计算机处理器实际运行的指令的命令形式表示法。
这意味着你将与处理器的底层打交道,比如寄存器和堆栈。
如果你要找的是类英语且有相关的自我说明的语言,这不是你想要的。
确切的说,任何你能在其他语言里做到的事情,汇编都能做,只是不那么简单—这是当然,就像说你既可以开车到某个地方,也可以走路去,只是难易之分。
话虽不错,但是新技术让东西变得更易于使用。
总的来说,汇编语言不会在游戏中单独应用。
游戏使用汇编主要是使用它那些能提高性能的零零碎碎的部分。
比如说,毁灭战士整体使用C来编写,有几段绘图程序使用汇编。
这些程序每秒钟要调用数千次,因此,尽可能的简洁将有助于提高游戏的性能。
而从C里调用汇编写的函数是相当简单的,因此同时使用两种语言不成问题。
特别注意:
语言的名字叫“汇编”。
把汇编语言翻译成真实的机器码的工具叫“汇编程序”。
把这门语言叫做“汇编程序”这种用词不当相当普遍,因此,请从这门语言的正确称呼作为起点出发。
优点:
最小、最快的语言。
汇编高手能编写出比任何其他语言能实现的快得多的程序。
你将是利用处理器最新功能的第一人,因为你能直接使用它们。
缺点:
难学、语法晦涩、坚持效率,造成大量额外代码—不适于心脏虚弱者。
移植性:
接近零。
因为这门语言是为一种单独的处理器设计的,根本没移植性可言。
如果使用了某个特殊处理器的扩展功能,你的代码甚至无法移植到其他同类型的处理器上(比如,AMD的3DNow指令是无法移植到其它奔腾系列的处理器上的)。
使用汇编编写的游戏:
我不知道有什么商业游戏是完全用汇编开发的。
不过有些游戏使用汇编完成多数对时间要求苛刻的部分。
资料:
如果你正在找一门汇编语言的文档,你主要要找芯片的文档。
网络上如Intel、AMD、Motorola等有一些关于它们的处理器的资料。
对于书籍而言,《AssemblyLanguage:
Step-By-Step》是很值得学习的。
5、Pascal语言
Pascal语言是由NicolasWirth在七十年代早期设计的,因为他对于FORTRAN和COBOL没有强制训练学生的结构化编程感到很失望,“空心粉式代码”变成了规范,而当时的语言又不反对它。
Pascal被设计来强行使用结构化编程。
最初的Pascal被严格设计成教学之用,最终,大量的拥护者促使它闯入了商业编程中。
当Borland发布IBMPC上的TurboPascal时,Pascal辉煌一时。
集成的编辑器,闪电般的编译器加上低廉的价格使之变得不可抵抗,Pascal编程了为MS-DOS编写小程序的首选语言。
然而时日不久,C编译器变得更快,并具有优秀的内置编辑器和调试器。
Pascal在1990年Windows开始流行时走到了尽头,Borland放弃了Pascal而把目光转向了为Windows编写程序的C++。
TurboPascal很快被人遗忘。
最后,在1996年,Borland发布了它的“VisualBasic杀手”—Delphi。
它是一种快速的带华丽用户界面的Pascal编译器。
由于不懈努力,它很快赢得了一大群爱好者。
基本上,Pascal比C简单。
虽然语法类似,它缺乏很多C有的简洁操作符。
这既是好事又是坏事。
虽然很难写出难以理解的“聪明”代码,它同时也使得一些低级操作,如位操作变得困难起来。
优点:
易学、平台相关的运行(Dephi)非常好。
缺点:
“世界潮流”面向对象的Pascal继承者(Modula、Oberon)尚未成功。
语言标准不被编译器开发者认同。
专利权。
移植性:
很差。
语言的功能由于平台的转变而转变,没有移植性工具包来处理平台相关的功能。
使用Pascal编写的游戏:
几个。
DirectX的Delphi组件使得游戏场所变大了。
资料:
查找跟Delphi有关的资料,请访问:
InpriseDelphipage。
6、VisualBasic
哈,BASIC。
回到八十年代的石器时代,它是程序初学者的第一个语言。
最初的BASIC形式,虽然易于学习,却是可怕的无组织化,它义无返顾的使用了GOTO充斥的“空心粉式代码”。
当回忆起BASIC的行号和GOSUB命令,没有几个人能止住眼角的泪水。
快速前进到九十年代早期,虽然不是苹果公司所希望的巨人,HyperCard仍然是一个在Windows下无法比拟的吸引人的小型编程环境。
Windows下的HyperCard克隆品如ToolBook又慢又笨又昂贵。
为了与HyperCard一决高下,微软取得了一个小巧的名为Thunder编程环境的许可权,并把它作为VisualBasci1.0发布,其用户界面在当时非常具有新意。
这门语言虽然还叫做Basic(不再是全部大写),但更加结构化了,行号也被去除。
实际上,这门语言与那些内置于TRS-80、AppleII及Atari里的旧的ROMBASIC相比,更像是带Basic风格动词的Pascal。
经过六个版本,VisualBasic变得非常漂亮。
用户界面发生了许多变化,但依然保留着“把代码关联到用户界面”的主旨。
这使得它在与即时编译结合时变成了一个快速原型的优异环境。
优点:
整洁的编辑环境。
易学、即时编译导致简单、迅速的原型。
大量可用的插件。
虽然有第三方的DirectX插件,DirectX7已准备提供VisualBasic的支持。
缺点:
程序很大,而且运行时需要几个巨大的运行时动态连接库。
虽然表单型和对话框型的程序很容易完成,要编写好的图形程序却比较难。
调用Windows的API程序非常笨拙,因为VB的数据结构没能很好的映射到C中。
有OO功能,但却不是完全的面向对象。
专利权。
移植性:
非常差。
因为VisualBasic是微软的产品,你自然就被局限在他们实现它的平台上。
也就是说,你能得到的选择是:
Windows,Windows或Widnows。
当然,有一些工具能将VB程序转变成Java。
使用VisualBasic编写的游戏:
一些。
有很多使用VB编写的共享游戏,还有一些是商业性的。
资料:
微软的VB页面有一些信息。
7、Java
Java是由Sun最初设计用于嵌入程序的可移植性“小C++”。
在网页上运行小程序的想法着实吸引了不少人的目光,于是,这门语言迅速崛起。
事实证明,Java不仅仅适于在网页上内嵌动画—它是一门极好的完全的软件编程的小语言。
“虚拟机”机制、垃圾回收以及没有指针等使它很容易实现不易崩溃且不会泄漏资源的可靠程序。
虽然不是C++的正式续篇,Java从C++中借用了大量的语法。
它丢弃了很多C++的复杂功能,从而形成一门紧凑而易学的语言。
不像C++,Java强制面向对象编程,要在Java里写非面向对象的程序就像要在Pascal里写“空心粉式代码”一样困难。
优点:
二进制码可移植到其他平台。
程序可以在网页中运行。
内含的类库非常标准且极其健壮。
自动分配合垃圾回收避免程序中资源泄漏。
网上数量巨大的代码例程。
缺点:
使用一个“虚拟机”来运行可移植的字节码而非本地机器码,程序将比真正编译器慢。
有很多技术(例如“即时”编译器)很大的提高了Java的速度,不过速度永远比不过机器码方案。
早期的功能,如AWT没经过慎重考虑,虽然被正式废除,但为了保持向后兼容不得不保留。
越高级的技术,造成处理低级的机器功能越困难,Sun为这门语言增加新的“受祝福”功能的速度实在太慢。
移植性:
最好的,但仍未达到它本应达到的水平。
低级代码具有非常高的可移植性,但是,很多UI及新功能在某些平台上不稳定。
使用Java编写的游戏:
网页上有大量小的Applet,但仅有一些是商业性的。
有几个商业游戏使用Java作为内部脚本语言。
资料:
Sun的官方Java页面有一些好的信息。
IBM也有一个非常好的Java页面。
JavaLobby是一个关于Java新闻的最好去处。
8、创作工具
上面所提及的编程语言涵盖了大多数的商业游戏。
但是也有一个例外,这个大游戏由于它的缺席而变得突出。
“神秘岛”。
没错,卖得最好的商业游戏不是使用以上任何一门语言编的,虽然有人说“神秘岛”99%是使用3D建模工具制作的,其根本的编程逻辑是在HyperCard里完成的。
多数创作工具有点像VisualBasic,只是它们工作在更高的层次上。
大多数工具使用一些拖拉式的流程图来模拟流程控制。
很多内置解释的程序语言,但是这些语言都无法像上面所说的单独的语言那样健壮。
优点:
快速原型—如果你的游戏符合工具制作的主旨,你或许能使你的游戏跑得比使用其他语言快。
在很多情况下,你可以创造一个不需要任何代码的简单游戏。
使用插件程序,如Shockware及IconAuthor播放器,你可以在网页上发布很多创作工具生成的程序。
缺点:
专利权,至于将增加什么功能,你将受到工具制造者的支配。
你必须考虑这些工具是否能满足你游戏的需要,因为有很多事情是那些创作工具无法完成的。
某些工具会产生臃肿得可怕的程序。
移植性:
因为创作工具是具有专利权的,你的移植性以他们提供的功能息息相关。
有些系统,如Director可以在几种平台上创作和运行,有些工具则在某一平台上创作,在多种平台上运行,还有的是仅能在单一平台上创作和运行。
使用创作工具编写的游戏:
“神秘岛”和其他一些同类型的探险游戏。
所有的Shockwave游戏都在网络上。
资料:
Director、HyperCard、SuperCard、IconAuthor、Authorware。
9、结论
你可能希望得到一个关于“我该使用哪种语言”这个问题的更标准的结论。
非常不幸,没有一个对所有应用程序都最佳的解决方案。
C适于快而小的程序,但不支持面向对象的编程。
C++完全支持面向对象,但是非常复杂。
VisualBasic与Delphi易学,但不可移植且有专利权。
Java有很多简洁的功能,但是慢。
创作工具可以以最快的速度产生你的程序,但是仅对某一些类型的程序起作用。
最好的方法是决定你要写什么样的游戏,并选择对你的游戏支持最好的语言。
“试用三十天”的做法成为工业标准是件好事情。