好文,转过来,给大家看看。原文:http://www.ithome.com/html/it/199999.htm
原标题《给初学编程的人的新年干货》,**之家编辑酌情修改。
一、这多东西啥时候能学完?
现在IT新技术日新月异。就常用编程语言而言,有c/c++、汇编、java,c#、Python等;操作系统平台有Unix/Linux,Windows系列;开发工具有VC、VisualStudio2008、Eclipse、NetBeans等;每个大平台下,还有很多的的方向:如网络、数据库、脚本、HTML、动态网站、游戏开发等;有人还在学Dreamweaver做网页、Flash做动画、Photoshop做美工、3DMax做三维动画…………是的,我们什么都想学。恨不得把所有的知识统统都塞到肚子里去。看到什么,就想学什么!
今天看这VC的书,明天又看Java,后天又看C#,东搞西搞!看到别人做网页。自己兴趣了来了。好,学html语言,我也做网页,听说做网页要会“网页三剑客”,所以又想学Dreamweaver、Flash。后来开始知道有JSP、PHP、ASP.NET做动态网站这玩意儿。也想去学,学学学……
这是几乎所有在校大学生的通病。但是,这不是坏事,甚至可以说是好事。说明了你“求知欲”高!总比那些,生活没有激情,整天知道泡妞、上网、打游戏、混日子的强。
但是如果你今天想学这个,明天又想学那个,就得永远徘徊在技术的门外。很多人都有过或者正在经历这样的苦闷日子:总觉得有“太多东西”要学了,然而人的精力是有限的,总有永远学不完的感觉,所以心理特别急,整天惶惶不可终日,不知道先要学哪个,一会儿拿起这本书,一会拿起那本书,折腾了几个月,突然发现自己什么都没有学到……
每一个大方向如果没有经过几年的学习,很难能学习出什么来。但程序设计的最根本的东西是相同的。所以我们学习要抓根本。俗话说:通一理,融百里。
学程序设计就像习武一样,如果内功学的好,其他功夫就很容易上手。君不见《倚天屠龙记》中的张无忌练了“九阳神功”8年,练“乾坤大挪移”只需12个时辰吗?
习武之人,谁不想在“江湖”上扬名立万,谁不想成为万人敬仰的大侠?大侠之所以能成为“大侠”,当然有他们的看家本领。狄云的“神照神功”,金世遗的正邪融合的“乔北冥内功心法”,张无忌的“九阳神功”,段誉的“六脉神剑”,令狐冲的“独孤九剑”,哇,太多了...
古人历经千辛万苦才能找到这些“武功秘籍”。我们现在这些后辈,比起古人来说:简直太幸运了。去书店,各种各样的心功心法,剑法,拳法,应有尽有,看得你眼花缭乱...你选什么呢?今天练“六脉神剑”几式,明天去学“降龙十八掌”几招,后天又去练“发暗器”,这样何时才有个尽头呢?你说,你什么武功都会,但是“形似而神不似”,不得要领,不够火候。一上擂台,就被别人一掌打趴了。试问哪个软件公司敢要一个号称任何编程语言都会,而是每种语言只能写出个“helloworld!”的程序员,你不被人家扫地出门才怪。
二、学**还是学**更有前途?
看了上面的话,有的同学已经开始烦了,“知道了知道了,不止一个像你这样的所谓的‘老前辈’跟我说过‘学什么都一样,思想才是最重要’的大道理,可是你们站着说话不嫌腰疼呀,现实是有很多技术需要学,比如做Web开发就有JSP、PHP、ASP.NET等好多方向,我总得选一个吧!到底学哪个有前途呢?我必须要选择一个有前途的,选错了就麻烦了。”
其实像“学**还是学**更有前途”的话没意义,因为“选择JSP还是选择PHP”的前途的差别不像“选择英语还是选择日语”的前途差别那样大,不存在“选错方向”的问题,因为都是相通的,你也不能保证你毕业以后搞的就是你学的那个方向,更不能保证你靠你学的这点东西就能吃一辈子。比如我上大学的时候一直在钻研是Delphi语言,可是毕业校园招聘的时候我照样在Java职位的考试取得了第一名,而且工作以后经过简单的学习就掌握了Java语言,并且后来还写了三本关于Java语言的书;再如我毕业后两年多的时间一直在用Java开发,后来公司要做一套基于.NET的产品,我只用了一个礼拜熟悉了.NET体系以及C#的语法,然后就开始进行开发。
不过就像上边说的“做Web开发就有JSP、PHP、ASP.NET等好多方向,我总得选一个吧!”这个问题是非常实际的,因为只有先学一个才能深入这个方向,把这个方向学通了才能想以后“一通百通”。因此我的建议就是学校教过什么语言,你就继续深入学习这么语言,而不要去问“这么语言有没有前途”这样的傻问题。尽量不要去学一门所谓“有前途”的新语言,因为你去学一门新语言就要把很多精力耗费在语言、语法本身,而耽误了编程的实战,而以一个已经学过的语言来学习的话,起码语法本身不用再去学、开发工具本身不用再去熟悉,只要研究怎么使用这门语言开发有用的程序就ok了。比如大部分同学都学过C语言(有的学校直接开了C++的课,但是C++的面向过程编程部分还是C语言),所以咱们就开了《C语言也能干大事》的课程,让同学们把精力放到学以致用上,而不是学“有前途”的新语言上,这也是这个思想的一个体现。
举几个例子。咱们如鹏网的《计算机专业职业发展测评系统》是我用PHP开发的,但是在这之前我从来没写过PHP程序,但是我以前写过JSP、ASP的程序,因为写网站程序的原理都是相通的,只是语法不同而已,因此我只用了几个小时的时间熟悉了开发PHP用的工具并且快速浏览了一下PHP的语法,然后用半天时间就开发出了这个测评系统。想像一下一个整天在今天学JSP,明天学ASP,后天学PHP,大后天仰天长叹“到底学哪个有前途”的人能用半天时间学会一门新语言吗?
我大学时有一个同学,他看我当时Delphi学的比较好,写了很多程序,他就说他也想学软件开发,让我教他Delphi,可是我们专业前一个学期已经开了PowerBuilder的课,因此当时我就建议他还是继续深入学习PowerBuilder,用PowerBuilder写又实用价值的东西,而不是像上课那样写HelloWorld的程序。当时Delphi还是如日中天的流行的编程语言,而PowerBuilder则市场占有率比较小,他就说不想继续学PowerBuilder,因为PowerBuilder没前途,我就给他讲了“一通百通,从自己最熟悉的入手”这个道理,然后他就踏实的深入研究PowerBuilder起来,到了毕业的时候他已经能用PowerBuilder写非常复杂的程序而且还学习了用PowerBuilder写Web程序。毕业后没多久就应公司的要求用Delphi写程序,他只用了不到一周的时间学习了Delphi,然后就写出了一个符合公司要求的系统,当时他就给我打电话向我报喜。前一阵子我听说他已经开始指导一些新员工用Java开发一个中型规模的企业级系统了。可以说他的成功就得益于“一通百通,从自己最熟悉的入手”这个原则。
总结一下,不要管“哪门语言好就业、有前途”,因为那些“好就业、有前途”都是纸老虎。尽量不要学新语言,从自己最熟悉的语言入手,深入研究,出山后你就是被用人单位争抢的红人。
三、企业里都需要什么方面的才能?
这个要视用人单位的要求而定了。你现在还没有毕业,也不知道未来要面对什么样的岗位。因此建议大家在上学期间不要偏科,所以的课程都要好好学,学好专业课,培养自己的“内功心法”,然后进入一个大公司,那么大公司自然会为你安排一个人才培养计划,在工作的环境中学习就更有目的性。
1、学什么最容易
由于现在的快速开发工具的不断推出,使得软件开发越来越容易,进入软件开发的门槛也越来越低。很多人在IDE工具的诱骗之下,快的十天,慢的半个月就可以进入所谓“程序员”的领域,成了一个所谓的“程序员”。这对于IDE提供商来说是乐得合不拢嘴的事情,但是对于软件来说却是一个无形的打击。由于快速工具的盛行,很多人把开发看作小菜一碟,特别是很多在校的大学生,都认为现在教的内容一旦出了学校都已经是落伍,无形中产生了厌学的心理。
今后的软件开发逐渐趋于两极化,一方面有越来越多的人将从事简单的重复性开发,而且这部分的开发难度会逐渐降低;另外一方面核心部分的开发会越来越复杂,这部分的入门所涉及的知识内容会逐步增加。所以对于今后希望从事软件开发的同学们,需要好好的努力学习,学校的东西会有他们的用处,只要现在把基础打扎实了,即后你们在软件的领域会有很好的机会,不要盲目的放弃学习的机会。
2、有什么速成的办法没有?
有一种蛾子名叫“帝王蛾”。帝王蛾的幼虫时期是在一个洞口极其窄小的茧中度过的。当它的生命要发生质的飞跃时,这天定的窄小通道对它来说无疑成了鬼门关。那娇嫩的身躯必须拼尽全力才可以破茧而出。太多太多的幼虫在往外冲杀的时候力竭身亡,不幸成了“飞翔”这个词的悲壮祭品。
有人怀着悲悯恻隐之心,企图将那幼虫的生命通道修得宽阔些。他们拿来剪刀,把茧中的洞口剪大。这样一来,茧中的幼虫不必费多大力气,轻易地就从那个牢笼里钻了出来。但是,所有因得到救助而见到天日的蛾子都不是真正的“帝王蛾”,它们无论如何也飞不起来,只能拖着丧失了飞翔功能的累赘的双翅在地上笨拙地爬行。
原来,那“鬼门关”般的窄小茧洞恰恰是帮助帝王蛾幼虫两翼成长的关键所在。穿越的时刻,通过用力的挤压,血液才能顺利送到蛾翼的组织中去,惟有两翼充血,帝王蛾才能振翅飞翔。人为地将茧洞剪大,翼翅就失去了充血的机会,生出来的帝王蛾便永远与飞翔无缘。
没有谁能够施舍给帝王蛾一双奋飞的翅膀。不惧怕独自穿越狭长墨黑的隧道,不指望一双怜恤的手送来廉价的资助,将血肉之躯铸成一支英勇无畏的箭镞,带着呼啸的风,携着永不坠落的梦想,拼力穿透命运设置的重重险阻,义无反顾射向那寥廓美丽的长天……
让一个“帝王蛾”速成的方式就是帮它把茧剪开;一个人学一门技术的速成方法就是不学那些“没用”的东西,直接告诉他最终结论和操作方式,但是很多东西是在探索中、学习中才能领悟的,很多人在钻研一个技术难题的过程中查资料、看书、求证,在这过程中不仅锻炼了自己思考问题的能力,而且夯实了基础知识,最重要的是在探索过程中收获了很多意想不到的新东西,有很多朋友在钻研一个问题的时候经常能无意中的学会很多新东西。
上山的“速成”方法是直接坐缆车上去,可是你会比那些登山者少看到很多路边的风景。那么你是愿意做一个掌握“速成”方法的人,还是愿意有机会看看路边的风景呢?
3、成功的秘诀
古希腊大哲学家苏格拉底,思想深邃,思维敏捷,关爱众生又为人谦和。许多青年慕名前来向他学习,听从他的教导,都期望成为像老师那样有智慧的人。他们当中的很多人天赋极高,天资聪颖者济济一堂。大家都希望自己能脱颖而出,成为苏格拉底的继承者。一次苏格拉底对学生说:“今天我们只学一件最简单也是最容易的事,每个人都把胳膊尽量往前甩,然后再尽量往后甩。”苏格拉底示范了一遍,说:“从今天起,每天做300下,大家能做到吗?”学生们都笑了,这么简单的事有什么做不到的?
第二天,苏格拉底问学生:“谁昨天甩胳膊三百下?做到的人请举手!”几十名学生的手都哗哗地举了起来,一个不落。苏格拉底点头。一周后,苏格拉底如前所问,有一大半的学生举手。过了一个月后,苏格拉底问学生:“哪些学生坚持了?”有九成的学生骄傲地举起了手。
一年后,苏格拉底再一次问大家:“请告诉我,最简单的甩手动作还有哪几位同学坚持了?”这时,整个教室里,只有一个学生举起了手,这个学生就是后来成为古希腊另一位伟大哲学家的柏拉图。
如果说柏拉图的故事太过遥远,那么就再给大家讲一个发生在眼前的故事。
一次英语课上,老师带来300句高考精华句子,并且许诺说:如果能够把这些背诵得滚瓜烂熟,高考成绩一定会提高。大部分学生以为又是老师哄学生的话,但身为有一个学生却有着迫切提高成绩的压力,对老师的话铭记在心。回去后,他把这300句话当作至宝,先翻译成中文,又翻译成英文,发现几乎每个句子都程度不同地存在错误,或时态、或单词、或结构出现错误。他把这些知识整理在一个本子上,重点记忆。随后的一个月,他仿佛吃了兴奋剂,拼命地背诵和默写这300句话,在付出一个个的清晨和夜晚的时光后,终于取得丰硕的成果,他能够一字不差地默写出这300句话。从此,这300句英文成为他的绝技,使他的英文成绩很快得到了提高。这个人就是现在留学培训的航母——新东方的掌门人俞敏洪。
有同学问我“学计算机有没有什么速成的办法”,我想说的是最好的速成的方法就是“坚持”。一切其他的速成方法学出来的东西都太容易,“越容易得到的东西越不值钱”这是一条永远不会变的价值规律。越是厉害的武功,越是难练,需要的时间越长。很多人,都是中途退场了。
坚持是最容易的,因为每个人都可以做到;坚持又是最困难的,毕竟没有几个人能够坚持下来。坚持下来的人就是成功的人。
最后一句话:切务浮沙筑高台,练从难处练,用从易处用!无速成,唯有坚持!
同学们千万不要犯大部分人都犯的错误:
• 下载了一硬盘的视频教程、电子,几乎没看过,即使看过也是看看就算了,根本没用心看过,更别说跟着老师进行代码练习。
• 光down不看是浪费硬盘和带宽
• 光看不练是浪费时间和青春!
• 不要光下载不看,不要光看不练!
错误认识
1、C/C++太老了,过时了,平时用得很少,现在流行都Java、C#等等。
解惑:不要动不动觉得什么东西过时了,COBOL还有OO版本面世,还有FORTRAN,LISP,好古老的语言吧,现在还用得很广呢。杨中科老师经常提醒我们“一切语言都是纸老虎,一通百通”,学校已经开了C/C++的课,并且想继续深入学习编程,那么就继续使用学过的语言来学习,不要再去学一门新的语言。等把C/C++弄熟了以后,回头一看,相信你也能像杨中科老师那样“半天学会一门新语言”了吧。
2、入门要从OO开始,培养用OO方式思考的习惯。
解惑:初学者一入门便摆弄Java、C++等很容易形成误解,似乎OO=Java,C++...。一切编程语言的根本都是面向过程的,Java、C++等语言也是支持面向对象特性的面向过程的语言。面向过程就是if……else……、while、for这些东西,Java、C++等语言中难道就没有这些语句了吗?
过程式语言(或者说结构化方法)的精髓不会消亡,OO里面也不可能摆脱掉一条条的语句、函数调用,结构化方法还是需要提倡的。OO方法不是那么容易学会的(OO语言的语法弄得很熟练不代表你懂OO),而结构化那套方法,自个写个千把行的程序就很能体会了,我是说写个实用点的东西,比如试着自个实现一些数据结构和算法,写几个小游戏等。写个一千行Helloworld等于没写。
我觉得方法是实践中体会出来的,不是看看书就能学会的。过程式语言的代码一般比较简练,我们编程序最终的目的是要解决问题,是要计算,是要获取信息,不要被OO,设计模式等迷糊了。
3、过程式语言弄久了,很难转入OO的思维模式
解惑:我以前也没有深想过这个理由,不过时间久了,发觉自己不过是把数据和方法集中在一起而已,看着方便,其实有很多不合理的东西,这里头就需要OO的理论指导了,还是需要时间来体会。我相信有很多用OO语言的人也不过是在框架里头添添代码,调用来调用去而已,把人类当作数据和操作的打包器。
个人觉得只有在用过程式方法做了十来年,编码上十万行后才有思维定势,难以习惯用OO的眼光看待系统,然而这个转变,我仍觉得比改变一个人的恶习容易许多。OO方法不是学了个Java,C++等就能掌握的,需要实践,需要时间。过程式语言也容易培养一个人严谨的做事态度,比如用汇编,C等写代码,没有命名空间、没有一大堆类库,没有模板、没有异常,你要花很多心思处理一些细节,比如警惕数组索引越界、悬挂指针、野指针等等,请不要觉得麻烦,这个就是计算机啊,底层就是这样的啊。
4、别用C了,看我用Java、VC等轻轻松松就写了个漂亮的图形界面
这篇文章是给初学者看的,也可以给一些浮躁的人看看,初学编程的人精力应该放在数据结构、算法上面,尽量多看一些底层的东西,数字逻辑,操作系统,编译原理,计算机组成、体系结构,计算机网络等等基础知识。编写GUI拖几个控件有什么好吹的,既然你会拖几个控件那么一个初中都没毕业的也会拖控件,你和他的差异性体现在哪里?你知道窗口消息怎么回事么,你编的界面是把易用放在第一位呢还是把漂亮放在第一位呢,你的GUI程序容易修改吗?比如我一会要加个button,一会去个listbox,你会不会改的疯掉呢?你是不是在OnClick里头写了大段大段的代码,做类似“从edit1.text中去掉不是数字的字符,搜索xxx再转成16进制,再复制到edit2.text”的事?
学习还是找纸版的书老实的看比较好,想想你积攒了多少电子书而又看了多少。
底层不了解,仅多也就飘在别人上头,别人一闪身,你就得摔下来。
初学编程的人一来就IDE, GUI,Network啥的猛搞,能不浮躁么?还是沉下心来研究一下基础知识吧,我以脑袋担保你有生之年会觉得他们有用的(呵呵,你转行我就没辙了),别看着别人弄JFC,Socket了你还在头大这个quicksort怎么就不对呢就心里惶惶的,你要知道在一批API不被支持后不少人心里空空的没个着落:天啊,我除了那个就啥都不会了,郁闷啊,花了我那么久时间钻研那套API,呜呜。。。。
5、C好难啊,我入门还是从Java,C#开始吧
解惑:语言只是表达思想的工具,不要只局限于一种语言,不要狂热于某一门语言。记住杨中科老师说那句话“价值规律就是——越是容易得到的越不值钱”。