成熟的人不问过去;聪明的人不问现在;豁达的人不问未来.....

转载~如何成为一个好的程序员 !

上一篇 / 下一篇  2008-11-03 13:18:34 / 个人分类:经典转载

   How To Become a good Programmer?


首先问你一个问题:

你们在学校都学些什么课程?问这个问题的原因是,我认为学校的计算机科学基础课很重要。如果你所在学校的课程设置 合理,那你应该先把主要精力花在这些基础课上。很多学生看到基础理论就茫然,不知道这些图表,符号,甚至硬件的知识对将来的软件开发有什么用。用处大得很 哪。比如,操作系统课里讲到的多线程的东西在系统编程里很有用。又比如,尽管你将来不会去涉及电脑的硬件,计算机架构里的知识对分析算法的性能(快慢等 等)很有用。可以把计算机语言和开发工具比作文字,而把计算机科学的知识比做思想。只有思想,不会行文,不行;但是,行文流畅,思想空洞,也不行。大学的 阶段正是打好基础,丰富思想的年代。

成为一名好的程序员,不是简单地通过学几门课程就能做到的。我个人认为成为一名好的程序员的要素有:

1。扎实的基础知识;
2。很强的解决问题的能力;
3。熟练的编程调试能力;
4。创新能力;
5。团队合作能力;
6。持续的自学能力;
7。好奇心


这些能力和品质(甚至可以说是习惯)都应该从大学阶段就着手培养,并且从身边的小事开始培养。比如,很多中国的大学毕业生都缺乏编程和调试经验。学习C语 言,考试过关就算学会了。课题项目中,只要程序能够编译,运行,并且输入输出满足要求就了事了。但是,写程序的时候是否想过如何把程序写得更加精炼,高 效,高质量?对程序调试中出现的问题是否刨根问底知道原因,还是不求甚解搪塞过去算数?还有,很多中国的大学毕业生对于知识的掌握肤浅,机械,没有好奇 心,不会刨根问底。比如,学会了C++,有没有看过一个object在编译后,在汇编代码中是如何被初始化的?这个object的各个成员在内存中是如何 放的?在一个成员函数被调用的时候编译器在汇编代码中加入了哪些额外的动作?虚函数的调用是如何实现的? 这些东西恐怕在编程语言或编译原理中都没有详细提到。但是,你是否有过好奇心去知道?最后,一些中国学生的大问题就是死记硬背,没有学到某种算法技术的根 本原理,没有应变和创新的能力。比如,有个问题是如何在不用额外内存的情况下把一棵树的同一层节点都连起来。很多学生都能够回答这是一个广度遍历的问题。 但是,课本上说了广度遍历是一定要有额外数据结构辅助的(队列)。所以,不给额外内存怎么行?请看,课本上说的用队列的方法记住了,但是就是不知道为什么 要用队列。如果深刻掌握了这个队列的作用,那么这个问题是很容易的。

举了这么多例子,我想说明的事,想成为一位好程序员(其实从事任何一个 行业都是如此),重要的是要养成一个钻研,好奇,创新,动手,合作,不满足于填鸭,不满足于考试交差,不满足于表象的一种优秀的习惯。这不是学几门课能够 一蹴而就的。当然,如果你的在校课程不能使你满足,我以及论坛上的朋友可能能够给你推荐一些书或科目。

我觉得要提高编程的能力,有一位良师很重要。这位良师可以是在编程方面比你走在前面的同学,也可以是学校里你帮他做项目的老师,也可以是校外公司里 的老师或老板。很多东西在实际的项目中,有一位良师察看你的程序,帮你指出不足,手把手地指导你调试,会对你很有帮助。所以,当学会了书本上的基本知识以 后,可以努力寻找一些有实用性的项目,借机在项目中找到高手指导。这个项目可以在学校找,也可以到校外找。一开始不要计较报酬,甚至如果能够寻到高手指 点,白干也行。

其次是读好的源代码。多读好的源代码就象多读好的文章,会有利于自己写作。能够读懂别人的代码也是一门硬功夫。将来很多项目中你不会重头做,而是在半途加入(一般文档又不很齐全),因此需要能够很快读懂别人代码和想法的能力。

再次是看一些编程方面的好书。Writing Solid Code是一本很经典的书。最近出的Writing Secure Code也不错。在你熟练掌握C以后,可以学一下C++并熟悉面向对象的程序设计思路。在掌握C++的基础上可以看一下Design Patterns。

看你要把编程学到多么专业。到一定程度,你会发现如果没有学过数据结构,算法原理,编译原理和操作系统,可能在某些方面会遇到一些障碍。所以,如果有精力和条件的话,可以同时了解这些方面的知识。

最后,我要提醒你不要因为编程这一业余爱好而影响了你本专业的课程,除非你决定转行。对很多在校学生来说,本专业的成绩很重要,因为这个成绩可能会影响到将 来找工作,申请研究生院等等。英语也很重要。我读翻译的计算机书总觉得隔了一层,翻得不贴切。能够直接阅读英文资料更好。

Krest




计算机专业修炼和武侠小说中功夫修炼都是一样的:

金庸先生小说中提到高手习武包括内功和外功,其实这个道理在计算机专业同学中一样适用!

内功包括:基本心法和高级心法

基本心法需要每个习武者必须修炼,包括:数据结构、编译原理、计算机组成原理、高等数学、线性代数以及外语等。

高级心法根据个人需要定,比如:网络类需要学习包括TCP/IP原理等;软件工程需要学习包括软件工程的基础课程。

外功包括:基本招式和独门武功

基本招式:比如像C,C++,C#,SQL,XML 一些语言使用或者是Windows 2000 Server的知识等基础应用知识。

高级招式:比如像DX9,Web-Services高级等技术

   每个人都有自己的学习方法,也许这种方法对我来说有用,但不见得就对所有的人有用。所以,请不要盲目的跟着别人的学习方法学习。

一、要思考属于自己的学习方法
1)学习应该从基础打起,不要一开始就尝试最高深的技术。
2)每看一本书,不要说这章我以前学习过了,也掌握的很好,因此我可以跳过这一章看
更重要的了。
3)对于作业,遇到不会的尽量不要立刻向别人请教。如果实在解决不了的问题,可以先
完成你会的,然后把一些特别的难点提炼出来,向高手请教。
3)不要指望书本和行家能帮你解决一切问题,因为并不是所有问题都能由别人教给你。
4)向别人请教问题应该把问题说明白。对于错误提示信息应该原样提供出来,不要按自
己理解的信息提供。因为既然你自己做不了,说明你理解一般都有问题。
5)问问题最好能带代码。
6)不要说“编译通过,可是运行时...",因为编译错误和运行错误可能根本没有关系。
一般来说,编译是语法问题,而运行是逻辑问题。
7) 书看千遍不如做程序一遍,应该尽量尝试去写程序。
8)做程序千个不如做好程序一个。应该尽量完善你现在做的程序,而不要不断开新的计
划,而每个计划都虎头蛇尾。
9)要想到你不是一个人写程序,而是和大家一起写程序。
10)高深的技巧虽然显示了高深的本领,但是对于合作往往是有害的,应该尽量写出简
单易读的代码。
11)编制程序应该尽量做到自注释,即代码本身一读就懂,好象自己在说明自己的逻辑
一样。
12)复杂的代码如果实在做不到自注释,应该给出适量的注释。
13)注释在修改代码的时候应该相应修改,不能用陈旧的注释去误导别人。
14)代码应该尽量可重用,相同功能的代码应该由相同的函数完成,重要函数应该给出调
试信息,以便调试时及早发现问题。
15)应该尽量写小函数,每个函数尽量不要超过40行或者更少。这样不用滚动屏幕也许
就可以读完整个函数。
16)对于switch语句,尽量不要有过多的分支,如果分支太多,可以考虑用跳转表。
17)尽量少使用一些有争议的语句,如goto和三目运算符,既然有争议,它肯定有一定
的缺点。
18)对于goto,许多工程师技术高到可以合理使用,而不至于导致问题。但是你的程序
并不一定给你同水平的人看和修改,他们可不能保证合理的读和修改这些相关代码。
19)代码编写时应该有一定的格式,其基本要求是对理解代码有一定帮助。
20)如果数据是多个模块共有的,应该提供一个封装的类来管理它,并提供一个合适的
接口给各个模块。这样,如果数据内容有重大修改,则只要接口不变,基本上可以保证
程序不要很复杂的修改。
21)应该尽量考虑到数据的并发控制。
22)数据的并发控制应该封装在接口内,而不要暴露给其他模块,这样可以减少因为并
发原因导致的程序死锁。
23)数据本身结构不可以太复杂。应该尽量把不相关的数据分割成为两组数据。
24)对于数据量比较大的情况,应该考虑数据库
25)数据库接口应该采用标准ODBC或者ADO接口,尽量不要根据实际数据库DBMS提供的接
口来处理,因为你可能在实际使用中更换DBMS。
26)小的数据可以考虑文件,文件路径应该必须设计成相对路径。
27)在一个函数中,应该尽量打开文件后使用完后立刻关闭,这样其他程序可能使用文
件。
28)不要尝试把文件全部读到内存中,应该分次处理大文件。
29)编写程序应该提供相关的测试程序,以提供测试手段。
30)应该考虑代码、函数的使用情况,不要超越函数可以使用的范围使用之。
二、学习语言的几个原则是要遵守的:
1. 坚持,坚持,再坚持。
首先要有毅力,对编程的狂热也可以在一定程序上起到帮助。我就是这样的。起初,我学习 VC 是三天打鱼两天晒网,学习进度很慢,幸好对编程的执著,使得自己坚持下来了。我周围有几个人,他们比我先学 VC 近半年,但现在仍然学不会;而我现在虽说不是很厉害,但基本的应用程序是不在话下。我就是天天看书,上机实践,几乎所有的时间都泡在里面,有时连吃饭都在想,为什么?因为我确实想啃下这块硬骨头,我不想半途而废,我觉得学习 VC不仅仅是学到了更多的东西,最主要的是培养了我们自己一种坚持克服困难的毅力。

2. 实践,实践,再实践。
当你学到了一种新的技术或知识时,多实践是巩固学习的一种最好最有效的方法。这个实践不是照著书上的例子做一遍,而是根据自己的能力,给自己出题,然后去完成它。只有这样,你才能发现自己的不足,同时又增加了编程经验。但要成为合格的程序员,光会写代码是远远不够的,更重要的是思考。谋定而后动,是不变的真理。
3. 掌握编程思想。
学一门语言,不能仅仅是语言,还要注重语言背后的思想方法,获得提出问题,分析问题,解决问题的能力,不是为编程而学习。看它是如何来解决某一问题的,为什么要这样去做,他总是要符合客观事实的,就像人说的话一样,存在某种逻辑,数据的组织,信息的传递,靠你自己的头脑去建立,然后看该怎么样用编程语言来表达自己的想法。只要你认真实践,努力去做,寻求乐趣,就会达到目标。
4. 耐心、细心、平常心、团队协作精神。
在这个网络时代,资料到处都有,无论什么先进的技术,只要查到资料,不会的快的学上几天慢的一两个月也能学会。现在已没有写不出的程序了,写不出是因为你没有写完它。我以为现在的程序员不一定要多么聪明,而更需要他有完成枯燥项目的耐心,找 BUG 的细心,对于金钱的平常心(不要为了早日拿到钱而赶进度),最后最重要是有顾全大局,团队协作的精神。
三、怎么才能学习C语言
1. 扎实的基础。
数据结构、离散数学、编译原理,这些是所有计算机科学的基础,如果不掌握他们,很难写出高水平的程序。据我的观察,学计算机专业的人比学其他专业的人更能写出高质量的软件。程序人人都会写,但当你发现写到一定程度很难再提高的时候,就应该想想是不是要回过头来学学这些最基本的理论。不要一开始就去学OOP,即使你再精通OOP,遇到一些基本算法的时候可能也会束手无策。
 
2. 丰富的想象力。
不要拘泥于固定的思维方式,遇到问题的时候要多想几种解决问题的方案,试试别人从没想过的方法。丰富的想象力是建立在丰富的知识的基础上,除计算机以外,多涉猎其他的学科,比如天文、物理、数学等等。另外,多看科幻电影也是一个很好的途径。
 
3. 最简单的是最好的。
这也许是所有科学都遵循的一条准则,如此复杂的质能互换原理在爱因斯坦眼里不过是一个简单得不能再简单的公式:E=mc2。简单的方法更容易被人理解,更容易实现,也更容易维护。遇到问题时要优先考虑最简单的方案,只有简单方案不能满足要求时再考虑复杂的方案。
 
4. 不钻牛角尖。
当你遇到障碍的时候,不妨暂时远离电脑,看看窗外的风景,听听轻音乐,和朋友聊聊天。当我遇到难题的时候会去玩游戏,而且是那种极暴力的打斗类游戏,当负责游戏的那部分大脑细胞极度亢奋的时候,负责编程的那部分大脑细胞就得到了充分的休息。当重新开始工作的时候,我会发现那些难题现在竟然可以迎刃而解。
 
5. 对答案的渴求。
人类自然科学的发展史就是一个渴求得到答案的过程,即使只能知道答案的一小部分也值得我们去付出。只要你坚定信念,一定要找到问题的答案,你才会付出精力去探索,即使最后没有得到答案,在过程中你也会学到很多东西。
 
6. 多与别人交流。
三人行必有我师,也许在一次和别人不经意的谈话中,就可以迸出灵感的火花。多上上网,看看别人对同一问题的看法,会给你很大的启发。
 
7. 良好的编程风格。
注意养成良好的习惯,代码的缩进编排,变量的命名规则要始终保持一致。大家都知道如何排除代码中错误,却往往忽视了对注释的排错。注释是程序的一个重要组成部分,它可以使你的代码更容易理解,而如果代码已经清楚地表达了你的思想,就不必再加注释了,如果注释和代码不一致,那就更加糟糕。
 
8. 韧性和毅力。
这也许是"高手"和一般程序员最大的区别。A good programming is 99 weat and 1ffee。高手们并不是天才,他们是在无数个日日夜夜中磨练出来的。成功能给我带来无比的喜悦,但过程却是无比的枯燥乏味。你不妨做个测试,找个10000以内的素数表,把它们全都抄下来,然后再检查三遍,如果能够不间断地完成这一工作,你就可以满足这一条。 
  
    
  四、学习的方法
1、 比较宽的知识面,并且能够时时补充自己的知识和完善自己的知识结构
2、耐心好,特别是在调试和学习阶段,世界上没有聪明的人只有刻苦的人。做开发其实
就两件事情学习和改错,在这两件事情中间的开发过程其实是比较简单的
3、永远记住:代码是给人看的而不是给机器运行的,计算机在执行程序时是不怕累的,
而人在看代码时是非常累的
4、 良好的编码习惯,至少保证自己能够随时看懂几个月前自己所写的代码
5、尽量让你的代码能够很容易的被别人理解,写代码时想想你会不会在两个月后被别人

6、 不要容忍自己犯重复的错误和写重复的代码
7、知道如何做比得到代码更重要
8、 尽量不要做已经有很多人已经做过的事情
9、 学会尊重别人的开发成果,除非不得已不要下决定全面替换以前的系统
10、 珍惜自己的时间与工作成果,尽量让别人分享自己的开发成果
11、 避免假设,多思考极端情况与引起错误的可能性,努力减少低级错误
12、 不要相信至少是不要轻信自己为自己所做的测试结果
13、 懂得坚持自己的开发思路,并懂得理解与吸收别人的思想
14、 学会与其他人保持一致,但不能放弃自己的开发特色
15、 懂得向你周围的人学习,不论是开发能力上的还是开发经验上的
16、 懂得软件结构的的重要性,分析代码前先分析代码的结构
17、 学会总结,定期总结自己所学会的知识,看看自己前段时间因为各种原因所浪费的时

18、学会计划,尽量不要认为通过延长自己的工作时间来完成任务
19、学会正确估计自己的能力和工作时间
下面这些是我认为一些比较适合我自己的方面,不一定对每个人都合适:
20、多看些杂志,没事情的时候可以看看以前看过的参考书,书中很可能有你以前没有注
意到的一些细节
21、 不要太早去做一些与开发无关的事情,因为学习的黄金时期是很短暂的
22、学会分析别人的系统,多看看别人所开发的系统的先进的一面。这里包括别人的开发
思路,实现时所采用的结构
23、时常感到自己将被淘汰,经常埋怨自己的不努力
24、 知道自己缺少什么
25、 强迫自己做一些自己不喜欢做的事情,比如说写文档
26、能够有勇气重写自己所开发的系统,但当你重做时你应该采取和前一次不同的工作方
式和方法,否则重做就没有必要
27、将问题简单化而不是复杂化
28、 将维护时会产生的一部分问题转移到开发时或是设计时来解决
29、有时候也不妨问问自己:我不做开发时去做什么
30、坚持为自己做每周的开发计划,在事情没有做完以前不要轻易转移自己的注意力
31、 尽可能多的将你所做的教给别人,因为你有一天可能不再负责这个系统
32、做事一定要有始有终,除非是有不得已的理由否则不要在工作完成前提前离开
33、不要将你为公司做的东西带走,你因该带走的是开发经验和对开发的认识而不是代码
和产品

TAG: 经典转载

 

评分:0

我来说两句

Open Toolbar