找回密码
 立即注册
搜索
查看: 12950|回复: 38

给软件开发初学者

[复制链接]

340

主题

3478

回帖

5028

积分

网站编辑

积分
5028
发表于 2005-8-11 22:09:44 | 显示全部楼层 |阅读模式
在论坛上呆久了,发现很大一部分有关开发的帖子都是有关心怀梦想,立志成为一个软件英雄或者响当当的黑客人物;或者是狂热的游戏玩家,突然想迈入游戏开发的殿堂,自己打造一个完美的游戏;或者被以前IT行业的“钱”途无量所吸引,为了经济因素希望成为一个程序员的,而寻求进入软件开发领域之门的求助帖子。
    这些诸如“你好,我想做程序员,应该怎么做?”,“初学C++,请问看什么书好”,“请高手帮我看看这个程序”,“我想转行,请高手指点”……的帖子占了各大软件开发论坛帖子总量的很大一部分,而且内容是长年不变,重复来重复去 :P
    自从做了epubcn的C++板块的版主,经常收到不相识网友的消息或Email,基本上还是问这些问题。看到这些帖子和Email,不禁想起自己刚刚迈入软件开发的领域,茫茫然不知何去何从,兴奋而又彷徨不安的过去,这样的经历一次又一次,在不同的地点、不同的时间仍然在不断的重复。今天终于坐下来,写下一点文字,希望能够对彷徨的朋友们有点帮助。


确认你真的要迈入软件开发领域
    软件开发是一项纯智力活动(现在人们都意识到长时间超负荷的连续写程序并不会提高软件生产率,反而会对软件品质造成很大负面影响,所以尽管很多程序员仍然长时间加班,但这种现象正在逐步减少并最终会消失,所以体力要求并不会比其他行业高),如果你不是一个智力高于平均水平的人,说实话,软件开发并不适合你,你基本不可能在软件开发领域取得很高的成就和地位,而且不久就会因为年龄的增长而被淘汰。
    如果你以那些开发出共享软件的软件英雄和著名黑客为榜样,立志也要成为他们的一员,像武侠小说中的大侠一样仗剑江湖。我要先给你泼上大大一盆冷水,把你从幻想拉到现实中来。首先,现在的软件其复杂度和规模都远远超过以前,想一个人独力完成一个规模稍大的软件,基本没有可能(虽然还是有些特例,but trust me,那些仅仅是特例,请不要把自己想像成独一无二的超人、幸运儿);其次,无论是软件英雄还是仗剑江湖的顶尖黑客,他们的软件开发功底和智力都远远超过软件行业从业者的平均水平,没有多年的积累和坚韧超常人的毅力,是不可能,换句话说,想成为他们的一员,可以,但请首先成为一个合格的软件开发人员。
    如果你是因为传说中程序员的所谓“高薪”,对自己现在从事的工作不满意,而萌生转行的念头,我劝你还是再慎重考虑一下。程序员的待遇一般来说,是要比平均水平高一些,但远远谈不上高薪,而且以现在程序员的工作量来算,其实同样的付出,程序员所得到的能和平均水平看齐就不错了,程序员的竞争和淘汰也是异常残酷的。技术的更新速度更是其他行业所罕见,每个程序员都要不停的跑步跟上,不使自己落伍,所以在这个层面上来说,没有谁可以停下来休息,唯一能够积累下来的就是你的经验,但经验中能够为你的竞争力增添筹码的并不多。
    说了这么多,并不是我故意贬低,而是希望告诉你我所知道的软件开发行业的真实情况,基于此请再慎重考虑你是不是真的要迈入软件开发领域。



检验一下你是否适合当个程序员
    在我看来,要做一个合格的程序员,你需要具备下面几个条件:
1.  强烈的好奇心和求知欲

2.  追求完美的精神

3.  良好的逻辑分析能力

    其他方面的条件几乎所有类似的帖子都有提及:如果你不是准备单打独斗,那么团队合作能力必不可少;英语我就懒得说了,没有基本的阅读英文资料的能力,我劝你还是打消做个程序员的想法,没有为什么;数学能力也是必不可少的,如果不是做算法,高中水平的数学能力就足够了,但一定要成绩很好才行。
    那么为什么我要强调上面列的三点呢?
    具有强烈的好奇心和求知欲,能够让你跟上技术发展的步伐,仅仅靠危机感和责任感,你对技术的学习会有很强的功利性质,导致你的技术体系不能构成一个完整自包容的整体,而且很难对技术有高层次的认识和掌握。
    我认识的一个资深系统设计师跟我说过:做软件,“做出来”和“做的好”完全是两个概念,所要求的投入和技术水平是天壤之别。现在国内很多程序员仅仅把软件开发当作养家糊口的谋生手段,国内计划经济时代凑合、马马虎虎干活的思想也渗透到了软件业,很多程序员仅仅是把功能做出来,根本不会去考虑提高重用性、可维护性,也不会去考虑提高稳定性、运行速度,甚至连代码也是乱七八糟,基本的编码规范都不遵守(在我看来,这样的人不配“程序员”这个称号),在我们大声谴责国内软件业环境不好,拉项目靠关系,没有质量保证体系,老板不重视程序员,疯狂剥削程序员的时候,我们是不是该问问自己,你是不是只把眼睛盯着别人?
    现在各种软件开发包应有尽有,包罗万象,编程工具也异常强大方便,对于国内占主流的MIS系统来说,要完成一个功能实在不是很难的事情,但是如果把系统做为一个整体,则大多数都是运行缓慢、占用资源过大、兼容性差、可维护性差、不稳定的系统,你可曾尝试过开发一个优秀的系统,如果有,你就会发现开发优秀软件是多么困难,对技术的要求是多么高,而你在努力做到完美的过程中水平的提升是多么快。没有追求完美的精神,无论外部环境如何好,你也是不会开发出优秀软件的,等待你的是无休止的修改和维护~,你的技术水平也永远停留在简单的编码阶段,最终只有被迫转行。




好了,我真的适合当个程序员,那我该如何开始?
    首先选择一门编程语言和操作系统平台。
    操作系统平台国内比较流行的基本有Windows、Linux(Unix)、Mac OS。一般来说大家都选择的是Windows平台,因为此平台是国内处于垄断地位的操作系统,而且有很多优秀的开发工具可供选择,缺点就是Windows平台的开放性不高,往底层探究比较困难(但我对于言必称底层的观点比较反感,不是所有搞开发的都要对底层非常了解,做出用户满意的系统才是我们追求的根本,玩些底层的trick只是一种自我满足罢了。当然我们需要有一些掌握底层技术的高手,但这个是个人选择的问题),而且用惯Windows的程序员在配置、脚本等方面比较弱。Linux是开源平台,当然从理论上你可以操纵Linux的一切,但是有几个人能够达到这一水平?刚刚开始学习开发的程序员,在Linux上也仅仅能够开发一些应用软件罢了。Linux下的开发工具不够人性化,但这种情况正在逐步得到缓解,Eclipse就是非常出色的开发平台。在Linux下开发,你可以得到大量优秀的源代码,并且一切都是透明的(只要你想),但你必须学习很多命令行指令,掌握各种系统和参数配置以及脚本方面的知识。
    编程语言的选择更是令人头痛,我涉猎不多,对于有些语言,我无法给出任何建议,只好等这方面的高手来给大家补充了。我仅仅对C++和Java进行一些说明,当然这个也仅仅是基于个人体会,绝对不是权威观点 :P
    C++仍然是目前占主流的开发语言(详细的可以阅读TCPL中的相关论述),而且一种语言的发展或消亡都是一个渐进的过程,在可以预见的将来,C++仍然是一门举足轻重的开发语言,但其所针对的领域和方向可能会有所调整,我认为最主要的变化是C++会逐步从商业MIS系统市场上退出。选择C++的理由是关于C++的优秀开发书籍和开发工具最多,相关的资源也异常丰富,待对于一般应用程序的开发掌握之后,无需过渡,就可以深入学习各种技术,因为现阶段讲述系统底层奥秘和高级技术的书籍,基本都是选用C\C++做为示例语言。加上微软精心打造的开发平台Visual Studio或Borland的C++ Builder系列,学习起来更是如虎添翼。但C++现在的缺点也是比较明显的,我最深的感触就是对于XP和Agile Development的支持不好。
    Java简化了C++的语法,学习起来比较容易(但随着Java的日益普及和发展,是否能够继续保持这一优势,我不敢断言),Eclipse是非常优秀的Java开发平台,支持XP的整个过程:设计、测试、编码、重构……现阶段敏捷软件开发的主要语言就是Java。而且Java的跨平台特性更是非常大的优势。
    实际上,选择哪门语言都没有关系,根据你的发展规划和目前身边的环境选择就可以,没有必要跟风,其后的坚持才是难点。
    好,假设你选择了C++做为开发语言,在Windows平台上开发,那么我给你如下的学习建议(其他的选择请各位积极补充……):
    C++语言的学习当然是基础,这个阶段由于没有任何在特定平台上的开发经验,我们只能按照书中的例子一个一个输入运行,暂时告别熟悉的图形界面,回到古老的DOS了。参考书的选择是这个阶段很多朋友关心的,Stan Lippman的《Essential C++》和《C++ Primer》是我优先推荐的,而《Essential C++》因为篇幅较小,讲解内容适当,而且对C++ STL的运用有不少描述,显得相当实用,我认为最适合初学者使用。无论选择了那本书做为入门教材,都应该逐个例子逐个例子的消化,不要贪快,但同时要对重点内容有所侧重。我们学习任何东西都是为了解决实际问题,所以请把重点放在我们实际中最常用的部分,而不要过多的追究一些细节和艰深晦涩的不常用技术。
    此刻我们会碰到很多过后看来非常简单幼稚的问题,比如为什么编译出错,为什么按照书中的例子输进去却无法通过编译,找不到头文件等等,大体上这是因为刚刚接触程序开发,对程序理解还很初级,以及对于所使用的开发环境不够了解,特定编译器对标准C++的支持程度不一导致。请多阅读关于所使用开发环境的各种文档,以及查阅帮助文档。以我最经常使用的Visual C++配合MSDN来说,当出现一个我不能理解的编译错误时,按F4键编辑器就会自动跳到当前错误地点,下面的输出窗口也会给出错误代码(比如C××××),把错误代码记下,打开MSDN,在索引一栏输入错误代码,就能够查到详细的关于此错误的说明,当然,是英文的(不要问你不会英文怎么办,这是基本要求)。现在的开发工具查错排错非常方便。当然,有时很多错误原因并不是编译器所提示的地方,而是往前或往后一些地方,长期的编程经验可以提高查错速度。此时也请多练习练习Debug技术。
    此阶段只要能够掌握C++的基本语言要素,对结构化程序设计和基于对象的设计有一定理解,能够完成一些简单的小程序就可以结束了,毕竟DOS程序现在很难勾起我们学习的欲望了 :P 在此之后可以视自己的情况决定是否学习数据结构,数据结构是程序员的必修课,不可或缺,地位非常重要,即使你现在希望马上进入图形界面程序开发的世界,这一课我也提醒你记着早点补上。
    终于可以迈入图形世界,我们要从SDK编程开始,不要担心,这不会花费你太长时间,但却是对Windows程序运行机制进行深入了解的好时机,在此的努力都不会白费(trust me),此时的参考书没有什么好考虑的,基础的有Charles Petzold的《Windows程序设计》,进阶的有《Windows核心编程》。请从《Windows程序设计》开始,Charles Petzold的书通俗易懂,学习起来非常轻松,而且对你的语言要求不高,只要懂C就可以了。
    此时容易碰到的问题大多与项目设置有关,如果使用Visual C++,请按Alt+F7调出项目设置对话框仔细检查,并阅读相关文档,熟悉各项配置的意义。
    此阶段请重点掌握Windows SDK程序的编写方法,Windows程序的运行机制和Windows消息机制,和常用的Windows API。我们还可以更进一步:尝试用前一阶段学到的C++知识对过程化的SDK程序进行初步的改造,将我们敲入计算机的程序变得可重用,按照自己对基于对象思想和面向对象思想的理解来重新编写例子程序。
    OK,现在你已经初步入门了,掌握了C++的基本用法,对面向对象有了一点模糊而自以为是的认识,也能够写出Windows程序了,虽然还有点简单,还有点丑陋,不过,总归是图形界面啊。开始有点感觉了,是吗? :P 别急着往前冲,停一停,将C++和Windows SDK的基础打牢,贪多嚼不烂吗。此时有很多经典书籍等待你去掌握,也有几乎无限的题材供你练习,请尽量多阅读接触下面的资源:
•  《C++ Primer》

•  《Windows核心编程》

•  《应用程序调试技术》

•  面向对象开发设计方面的书籍

•  MSDN的Platform SDK部分,Periodicals部分(包含了大量有价值C++、SDK方面的技术文章)

•  CodeProject里相关的源代码是很好的补充学习资料

    现在继续往前走吧,利用SDK开发毕竟有时太过于费时费力,还是使用更高级的应用程序开发框架的好,主要的有MFC和VCL,关于这些框架谁好谁坏的争论我已经听烦了,一句话,能帮助我们完成任务就行,它们无非都是工具,你自己随便选择吧。不过选择好之后,你应该明白,对于你的工具,了解越深,越能发挥它的威力。如果你选择了MFC,我建议学习下面的书籍:
•  《深入浅出MFC》:关于此书毋庸多说,尽管有人不停的贬低,但它的地位是无可置疑的,而且也是对我最有帮助的书籍之一。

•  《MFC程序设计》

•  《Visual C++技术内幕》

    然后就停止找书吧,网上开发站点的数不胜数的源代码就是最好的老师了……



学习过程中碰到问题我该怎么办?
    我始终认为学习软件开发过程中遇到的问题只有自己尽最大的努力去解决,才能收到最大的成效,对于那些动不动就把问题发到网上指望高手帮你解决的做法我非常不赞同,因为这样你并不能从中学到多少。我建议的做法是,首先尝试自己独力解决问题,花几个小时解决一个问题,是很正常的,不要几分钟解决不了就放弃了;实在无法解决的时候,请尝试尽量减小涉及范围,将问题归结一下,初步形成自己的结论;然后利用搜索引擎或者开发论坛中的搜索功能来搜索是否有对于自己问题的解答;实在没有的时候,再发帖子求助。请了解一点:你遇到的问题都是别人遇到过的,网上肯定有现成的解决方法(因为你还没有到开发研究前所未有的问题的水平:P),只看你找不找得到了,请尽力去利用现有的资源而不是麻烦别人。
    CSDN的论坛、MSDN在线文档都是非常好的资源,基本上我们遇到的问题在这里都能找到解答。

340

主题

3478

回帖

5028

积分

网站编辑

积分
5028
 楼主| 发表于 2005-8-11 22:10:37 | 显示全部楼层
学习 C++ 的50条建议



1.  把C++当成一门新的语言学习(和C没啥关系!真的。)

2.  看《Thinking In C++》,不要看《C++变成死相》

3.  看《The C++ Programming Language》和《Inside The C++ Object Model》,不要因为他们很难而我们自己是初学者所以就不看

4.  不要被VC、BCB、BC、MC、TC等词汇所迷惑——他们都是集成开发环境,而我们要学的是一门语言

5.  不要放过任何一个看上去很简单的小编程问题——他们往往并不那么简单,或者可以引伸出很多知识点

6.  会用Visual C++,并不说明你会C++

7.  学class并不难,template、STL、generic programming也不过如此——难的是长期坚持实践和不遗余力的博览群书

8.  如果不是天才的话,想学编程就不要想玩游戏——你以为你做到了,其实你的C++水平并没有和你通关的能力一起变高——其实可以时刻记住:学C++是为了编游戏的

9.  看Visual C++的书,是学不了C++语言的

10.  浮躁的人容易说:XX语言不行了,应该学YY;——是你自己不行了吧!?

11.  浮躁的人容易问:我到底该学什么;——别问,学就对了;

12.  浮躁的人容易问:XX有钱途吗;——建议你去抢银行;

13.  浮躁的人容易说:我要中文版!我英文不行*—不行?学呀!

14.  浮躁的人容易问:XX和YY哪个好;——告诉你吧,都好——只要你学就行;

15.  浮躁的人分两种:a)只观望而不学的人;b)只学而不坚持的人;

16.  把时髦的技术挂在嘴边,还不如把过时的技术记在心里;

17.  C++不仅仅是支持面向对象的程序设计语言;

18.  学习编程最好的方法之一就是阅读源代码;

19.  在任何时刻都不要认为自己手中的书已经足够了;

20.  请阅读《The Standard C++ Bible》(中文版:标准C++宝典),掌握C++标准;

21.  看得懂的书,请仔细看;看不懂的书,请硬着头皮看;

22.  别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍;

23.  请看《Effective C++》和《More Effective C++》以及《Exceptional C++》;

24.  不要停留在集成开发环境的摇篮上,要学会控制集成开发环境,还要学会用命令行方式处理程序;

25.  和别人一起讨论有意义的C++知识点,而不是争吵XX行不行或者YY与ZZ哪个好;

26.  请看《程序设计实践》,并严格的按照其要求去做;

27.  不要因为C和C++中有一些语法和关键字看上去相同,就认为它们的意义和作用完全一样;

28.  C++绝不是所谓的C的“扩充”——如果C++一开始就起名叫Z语言,你一定不会把C和Z语言联系得那么紧密;

29.  请不要认为学过XX语言再改学C++会有什么问题——你只不过又在学一门全新的语言而已;

30.  读完了《Inside The C++ Object Model》以后再来认定自己是不是已经学会了C++;

31.  学习编程的秘诀是:编程,编程,再编程;

32.  请留意下列书籍:《C++面向对象高效编程(C++ Effective Object-Oriented Software Construction)》《面向对象软件构造(Object-Oriented Software Construction)》《设计模式(Design Patterns)》《The Art of Computer Programming》;

33.  记住:面向对象技术不只是C++专有的;

34.  请把书上的程序例子亲手输入到电脑上实践,即使配套光盘中有源代码;

35.  把在书中看到的有意义的例子扩充;

36.  请重视C++中的异常处理技术,并将其切实的运用到自己的程序中;

37.  经常回顾自己以前写过的程序,并尝试重写,把自己学到的新知识运用进去;

38.  不要漏掉书中任何一个练习题——请全部做完并记录下解题思路;

39.  C++语言和C++的集成开发环境要同时学习和掌握;

40.  既然决定了学C++,就请坚持学下去,因为学习程序设计语言的目的是掌握程序设计技术,而程序设计技术是跨语言的;

41.  就让C++语言的各种平台和开发环境去激烈的竞争吧,我们要以学习C++语言本身为主;

42.  当你写C++程序写到一半却发现自己用的方法很拙劣时,请不要马上停手;请尽快将余下的部分粗略的完成以保证这个设计的完整性,然后分析自己的错误并重新设计和编写(参见43);

43.  别心急,设计C++的class确实不容易;自己程序中的class和自己的class设计水平是在不断的编程实践中完善和发展的;

44.  决不要因为程序“很斜就不遵循某些你不熟练的规则——好习惯是培养出来的,而不是一次记住的;

45.  每学到一个C++难点的时候,尝试着对别人讲解这个知识点并让他理解——你能讲清楚才说明你真的理解了;

46.  记录下在和别人交流时发现的自己忽视或不理解的知识点;

47.  请不断的对自己写的程序提出更高的要求,哪怕你的程序版本号会变成Version 100.XX;

48.  保存好你写过的所有的程序——那是你最好的积累之一;

49.  请不要做浮躁的人;

50.  请热爱C++!
回复

使用道具 举报

22

主题

439

回帖

619

积分

高级会员

积分
619
发表于 2005-8-13 08:25:44 | 显示全部楼层
呵呵
要求置顶
回复

使用道具 举报

1

主题

114

回帖

152

积分

海星

积分
152
发表于 2005-8-13 21:45:45 | 显示全部楼层
很感谢~学到一些东西~
回复

使用道具 举报

105

主题

1729

回帖

2454

积分

论坛元老

积分
2454
发表于 2005-10-5 09:28:02 | 显示全部楼层
非常深刻,内容写的挺多得
回复

使用道具 举报

322

主题

2626

回帖

3838

积分

论坛元老

积分
3838
发表于 2005-10-5 17:09:48 | 显示全部楼层
规则的游戏--》创造的游戏   哈哈  --妄语
回复

使用道具 举报

0

主题

3

回帖

4

积分

新手上路

积分
4
发表于 2005-10-21 10:31:03 | 显示全部楼层
学习以下~~~

回复

使用道具 举报

340

主题

3478

回帖

5028

积分

网站编辑

积分
5028
 楼主| 发表于 2005-10-30 15:38:13 | 显示全部楼层
原帖由 哈哈鸟 于 2005-10-5 17:09 发表
规则的游戏--》创造的游戏   哈哈  --妄语


如果对那一行没有创新的理念,就不要入这一行。任何行当都一样,发展到一定程度,都要“我来设计天下”。比如,你总不会让自己向自己的父母一样做父母。
回复

使用道具 举报

201

主题

6222

回帖

6062

积分

网站编辑

笨笨扫雪工

积分
6062
发表于 2005-10-31 20:51:58 | 显示全部楼层
看到这些文字,可以看到如果都按照做了
中国要么就会多一个盖茨,要么就会多一个疯子
其实盖茨跟疯子也没多少区别
那些要什么,不要什么使我想起了以前读书的自己,不要浮躁,学就是了
但出来社会摸爬打滚了好一阵子
还能学以前那样为了解一道题而坐一个月的图书馆,和无月无日的过日子么??
答案脆弱得令人发笑,
强脾气只属于小孩,也只属于坚持到了我们认为成功的人
回复

使用道具 举报

1

主题

240

回帖

324

积分

中级会员

积分
324
发表于 2005-11-21 23:43:11 | 显示全部楼层
非常深刻,内容写的挺多得,学习.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|海浩社区

GMT+8, 2025-9-15 04:48 , Processed in 0.098949 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表