Appearance
程序员经验之谈
早已经习惯熬夜的我,今天,我学到很多东西,也明白很多,所以写下此文。
我没有师傅,也没有拜过师,只有老师,是现实生活中学校的计算机老师,并非网上找的所谓的“高手”,有人问过我,没有师傅怎么学习?难道学习技术就一定要找师傅吗?找师傅你们的条件就是技术好,无非就是多入侵了几个站的,试问他们能帮助你们什么?帮助引导你们犯罪吗?再说高一点,就是一些精通一门甚至几门技术的,他们是真正高手,但是他们又能帮助你们什么?技术革新太快,科技日益进步,我们如果想立足就一定要不断学习知识,即使技术再高超,也需要学习技术,否则到头会落后,那么他们也需要学习,但是我没见几个真正的高手是有师傅的,即使有,也没有对他太多帮助,学习是靠自己的。换个角度,你是高手,别人找你当师傅,天天问一堆简单的问题,你有耐心回答吗?没有人会耐心回答你的,更没有耐心教你什么,既然是高手,他们不会把时间放在你身上的,而是放在更深入的地方!
从中美黑客大战以后,网上许多界内的人不断建立组织,黑客站点到处是,培训班自然也不少,其实,那些VIP教程说难听点只是堆垃圾。你去参加培训班甚至是浪费钱,甚至被骗,当然肯定是学的到东西的,不过你花钱学的网上很多。网络资源丰富,教程和文章当然很多,所以没必要花钱去培训,当你要学某技术时,先在网上看看文章、搜索下视频,然后对这门技术有所了解后,或者熟悉后,可以买书,结合看书和在电脑上实际操作,效果很好的。
学网络安全不要听别人所说的开始从编程、系统原理、网络结构等学起走,如果你是个初学者,一来就给你本编程语言的书,你会看得懂吗?你会学的起走吗?除非你是天才,我是13岁开始玩电脑 现在16岁 三年前我接触网络时,也就是我开始学计算机时,是从黑客技术开始的,当时我没有任何人教我、指导我,我是从工具开始的,如果你想学好技术,兴趣是重要的,一开始就扔个你本程序语言书会打击你对技术上的信心,反而,如果用工具,比如明小子之类的,入侵某个站以后,会觉得有很大成就感,从而增大了你对学技术的信心和兴趣,当你熟练掌握工具以后,你要学会勤于思考,你应该想想这个工具是怎么实现这个功能的,为什么这样做会入侵到这个站点,这个漏洞又是怎么形成的,比如SQL注入,你应该思考为什么要加and 1=1、and 1=2来判断,为什么这样做就会查询到数据库内容,它是怎么形成这个漏洞的,这时你会知道要涉及到ASP方面的内容,如果你有了兴趣就可以从ASP下手,然后慢慢的学习其他语言。
自己解决问题永远是个最好的办法,比如你系统出了某问题,你就去QQ群里到处叫,去问好友,耐心的会以几句话给你说,不耐心的根本不理你,如果你花时间等别人告诉你答案时,还不如花时间多在网上搜索下,百度和谷歌永远是你最好的老师,比如系统错误提示***,你可以把提示的内容在搜索引擎里搜索,答案很快找到,在解决过程中你又学到了知识了。
学技术不需要天赋的,我没既没有技术的天赋,也不聪明,只是花的时间比别人多,当别人熬夜甚至通宵打游戏时,我却又学到了很多东西,我不需要游戏,也不打游戏,如果你酷爱游戏,那就更要学技术了,要做到先是你打别人的游戏,最后到别人打你的游戏,当然这也不可能是人人都能做到的。如果你认为一个玩电脑的人不懂电脑无所谓,那么我告诉你,你错了,当你帐号被偷后,当你电脑中毒,当你游戏无法正常运行后,你会怎么办?难道抱着电脑去找别人修,还是打电话请人来修呢?或许这些都是些简单的问题,我们只需要花点点功夫和时间就能学会的东西,完全靠自己解决。
我有一米多高的计算机书,我没有看完一本,父母说我是浪费,我不这样认为的,书上的东西很多我看不懂,就拿我最熟练精通的ASP来说吧,我买了两本书,前面的基础部分我看的懂,后面的全部看不懂,我全是靠多写代码,不懂就百度。我觉得一本书不需要看完它,因为书上的内容总是有限的,看书只看关键部分。
不要死记硬背,很多技术到后来总是会明白其中的,学技术掌握的是方法而不是硬背,拿五笔说吧,一开学时老师让我们学五笔,但是我拼音打得很快就可以不学,在练习文章时可以发现打拼音会有明显的差别,很多陌生的字和难找的字,于是我决定学五笔,我是期中才学的,大概花了两三个星期,就达到班上比较好的名次了,他们却花了半学期来练习和背字根,至今我只背的到两句简单的字根,多熟悉键盘,掌握其中的规律就可以的。
学技术不是一时的激情,别今天就说大话我一定要学好技术,一定要精通什么什么的,技术从浅到深,你会感觉到好玩和枯燥,越深就越显的很枯燥,很多人因此放弃,但是越深学好了就越有趣,如果你真要学好技术,就一定要坚持,到了深入的时候不要想着多恐怖,多困难,往好的方向想,想想学好后。不要听别人说某某某技术很难学,也别因为听说它太难学而恐惧,不敢学,没有面对下你怎么知道就难学呢?拿我学PHP来说,早听说过PHP很难的,有的人甚至很夸张,一直犹豫学不学的我最终还是选择学了,学后我才知道PHP不难学,相反个人觉得比ASP更简单,我花了几个月掌握ASP基本,PHP我只花了一个多星期掌握基本。学黑客也一样的,新手们不要以为黑客这个东西很神秘,真正学了以后你会发现除了本质上的安全问题,还是有很多问题出在管理员身上,他们有时太疏忽了。
学习黑客不一定就要入侵很多站和计算机才算高手,相反掌握了技术去防范他才算真正的高手,更不能用技术去解决问题,比如谁惹到你了,你就声称要入侵了他的计算机,入侵只是一种深入学习计算机和加固安全的方法。
不要问谁入门应该先学什么什么语言,如果你刚入门就学语言,那我实在很佩服你,等你技术到一定级别再去接触语言吧。也不要问刚开始学语言应该学哪门语言,看自己能力,如果你偷懒,那学VB吧,VB和ASP很相像,学好了VB再去学ASP,但是我要说,C语、汇编是必不可少的,你可以在后面慢慢学。
逛论坛并不是好方法,别以为某某组织在界内名气很大,经常呆在那就会学到东西,至少我没有泡过论坛,甚至我自己站的论坛也很少去,更别说发帖了,如果你计算机出某个问题,去发帖还不如靠自己去找答案,别人交流的东西不一定是你看得懂的,毕竟每个人技术有限,花时间学你自己需要、感兴趣的吧!
学技术更应该简单化,我是这样的,学脚本就是这样学的,你脑袋里只要记住,脚本语言不就是写入数据库-查询数据库内容-显示出来,这是核心部分,中间的什么判断、安全过滤之类的暂时别管。
学好了一门语言就别担心学其他的语言了,因为编程语言结构之类的都大同小异,要是你会了一门语言再学其他的学起感觉太难那就是你自己的问题了。
再说说现在新手的一个通病,许多人认为认识很多高手,自己的QQ等级高一点,就让人感觉很牛,QQ等级拿来有什么用?难道多个星星月亮你的技术就一定很好?认识那么多高手究竟是你很牛还是认识的那些高手很牛?为什么你不能象他们学习下呢?
搞技术的不光技术要好,要知道在这个社会,老板不光只要你的技术,如果你的技术很好,其他很差有什么用?老板要的是个综合性好的人才,长期面对计算机会很内向的,甚至是一种心理疾病,所以建议你学学心理学,不说学太深,至少能解决自己的心理问题,然后多很各行各业的人交流,从他们身上学到自己没有的优点,三人行必有我师。身体也是最重要的,谁都知道长期面对电脑不运动对身体有害,还是要适当运动下,由于我从小体育不好,也没什么体育上爱好,所以只有靠其他的方式活动下了,这点我做不到,但希望你们可以做到。
确定一个方向尤其重要,当你要学哪门技术的时候就一定要坚持学下去,别今天这学了一点又不学了,明天又去学其他的,有理想是好的,但是不要门门都会,但门门都掌握不好,特别是编程,要的不是学的多,而是学的精。
看文章是个好习惯,虽然计算机上看文章的确难受甚至枯燥,但文章里有很多好东西,坚持看完一篇文章吧,但有的你不会全部看懂的,没关系,今天看不懂明天可能就懂了。
不要经常和别人交流技术,毕竟两人水平不同,常常会争个面红耳赤,甚至有时丢面子,交流不一定要交流技术,多学学别人的好处、别人的学习方法。
如果哪天你累了,看什么技术方面的东西都看不进去,什么也不想学,那么请你休息下,晚上早点睡,多出去走走,做做运动,然后慢慢接触技术,找回激情。
我能说的也就这么多了,今天我才发现我还缺少很多很多东西,我还需要学习很多很多东西,技术更新太快了,让人接受不过来,还没喘气又得继续了,所以特写下此文,希望对大家有所帮助,别再迷茫了,如果以后有什么问题可以找我,但是别再问我技术问题,,学习靠自己,自学会成才的,关键是看你付出的,希望通过此文能引导大家,我不能在技术上帮助大家,也只有把自己的学习方法总结一下了,自学会走很多的弯路,但这些弯路是个过程,你在成功中的路,如果你觉得你花了很多时间学技术,却感觉没有学到什么东西,那么你问你自己一句:你尽力去学了吗?
我始终认为,对一个初学者来说,IT界的技术风潮是不可以追赶的,而且也没有能力去追赶。我时常看见自己的DDMM们把课本扔了,去卖些价格不菲的诸如C#, VB.Net 这样的大部头,这让我感到非常痛心。而许多搞不清指针是咋回事的BBS站友眉飞色舞的讨论C#里面可以不用指针等等则让我觉得好笑。C#就象当年的ASP一样,“忽如一夜春风来,千树万树梨花开”,结果许多学校的信息学院成了“Web 学院”。96,97级的不少大学生都去做Web 了。当然我没有任何歧视某一行业的意识。我只是觉得如果他们把追赶这些时髦技术的时间多花一点在基础的课程上应该是可以走得更远的。
几个误区
初学者对C#风潮的追赶其实也只是学习过程中经常遇到的几个误区之一。我将用一些实际的例子来说明这些现象,你可以按部就班的看看自己是不是属于其中的一种或者几种:
认为计算机技术等于编程技术
有些人即使没有这个想法,在潜意识中也有这样的冲动。让我奇怪的是,许多信息学院的学生也有这样的念头。认为计算机专业就是编程专业,与编程无关的,或者不太相关的课程他统统都不管,极端的学生只要书上没带“编程”两个字他就不看。
其实编程只是计算机技术应用过程中一种复杂性最低的劳动,这就是为什么IT业最底层的人是程序员(CODER)。计算机技术包括了多媒体,计算机网络,人工智能,模式识别,管理信息系统等等这些方面。编程工作只是在这些具体技术在理论研究或者工程实践的过程中表达算法的过程。编程的人不一定对计算机技术的了解就一定很高。而一个有趣的现象是,不少大师级的计算机技术研究者是不懂编程的。网上的炒作和现实中良好的工作待遇把编程这种劳动神秘化了。其实每一个程序员心里都明白,自己这些东西,学的时候并不比其它专业难,所以自然也不会高档到哪里去。
咬文嚼字的孔已己作风
我见过一本女生的《计算机网络原理》教材,这个女生象小学生一样在书上划满了横杠杠,笔记做得满满的,打印出来一定比教材还厚。我不明白的是,象计算机网络原理这样的课程有必要做笔记?我们的应试教育的确害了不少学生,在上《原理》这一类课程的时候许多学生象学《马列原理》一样逐字背诵记忆。这乃是我见过的最愚蠢的行为。所谓《原理》,即是需要掌握它为什么这样做,学习why,而不是how(怎样做)。极端认真的学生背下以太网的网线最大长度,数据帧的长度,每个字段的意义,IP报头的格式等等,但是忘了路由的原则,忘了TCP/IP协议设计的宗旨。总之许多人花了大量的时间把书背得滚瓜烂熟却等于什么也没学。
在学习编程的时候这些学生也是这样,他们确切的记得C++语法的各个细节。看完了C++教程后看《Thinking in C++》(确实是好书),《Inside C++》,《C++ reference》,this C++, that C++……,然后是网上各种各样的关于C++语法的奇闻逸事,然后发现自己又忘了C++的一些语法,最后回头继续恶补…。有个师弟就跟我说:“C++ 太难了,学了这里忘了那里,学了继承忘了模板。”我的回答道:“你不去学就容易了”。我并没有教坏他,只是告诉他,死抠C++的语法就和孔已己炫耀茴香豆的茴字有几种写法一样毫无意义。你根本不需要对的C++语法太关心,动手编程就是了,有不记得的地方一查MSDN就立马搞定。我有个结论就是,实际的开发过程中对程序语法的了解是最微不足道的知识。这是为什么我在为同学用Basic(我以前从没有学过它)写一个小程序的时候,只花了半个小时看了看语法,然后再用半个小时完成了程序,而一个小时后我又完全忘记了Basic 的所有关键字。
不顾基础,盲目追赶时髦技术
终于点到题目上来了。大多数的人都希望自己的东西能够马上跑起来,变成钱。这种想法对一个已经进入职业领域的程序员或者项目经理来说是合理的,而且IT技术进步是如此的快,不跟进就是失业。但是对于初学者来说(尤其是时间充裕的大中专在校生),这种想法是另人费解的。一个并未进入到行业竞争中来的初学者最大的资本便是他有足够的时间沉下心来学习基础性的东西,学习why 而不是how。时髦的技术往往容易掌握,而且越来越容易掌握,这是商业利益的驱使,为了最大化的降低软件开发的成本。但在IT领域内的现实就是这样,越容易掌握的东西,学习的人越多,而且淘汰得越快。每一次新的技术出来,都有许多初学者跟进,这些初学者由于缺乏必要的基础而使得自己在跟进的过程中花费大量的时间,而等他学会了,这种技术也快淘汰了。基础的课程,比方数据结构,操作系统原理等等虽然不能让你立马就实现一个linux(这是许多人嘲笑理论课程无用的原因),但它们能够显著的减少你在学习新技术时学习曲线的坡度。而且对于许多关键的技术(比方Win32 SDK 程序的设计,DDK的编程)来说甚至是不可或缺的。
一个活生生的例子是我和我的一个同学,在大一时我还找不到开机按纽,他已经会写些简单的汇编程序了。我把大二的所有时间花在了汇编,计算机体系结构,数据结构,操作系统原理等等这些课程的学习上,而他则开始学习HTML和VB,并追赶ASP的潮流。大三的时候我开始学习Windows 操作系统原理,学习SDK编程,时间是漫长的,这时我才能够用VC开发出象模象样的应用程序。我曾一度因为同学的程序已经能够运行而自己还在学习如何创建对话框而懊恼不已,但临到毕业才发现自己的选择是何等的正确。和我谈判的公司开出的薪水是他的两倍还多。下面有一个不很恰当的比方:假设学习VB编程需要4个月,学习基础课程和VC的程序设计需要1年。那么如果你先学VB,再来学习后者,时间不会减少,还是1年,而反过来,如果先学习后者,再来学VB,也许你只需要1个星期就能学得非常熟练。
几个重要的基础课程
如果你是学生,或者如果你有充足的时间。我建议你仔细的掌握下面的知识。我的建议是针对那些希望在IT技术上有所成就的初学者。同时我还列出了一些书目,这些书应该都还可以在书店买到。说实在的,我在读其他人的文章时最大的心愿就是希望作者列出一个书单。
大学英语-不要觉得好笑。我极力推荐这门课程是因为没有专业文档的阅读能力是不可想象的。中文的翻译往往在猴年马月才会出来,而现在的许多出版社干脆就直接把E文印刷上去。学习的方法是强迫自己看原版的教材,开始会看不懂,用多了自然熟练。吃得苦下得狠心绝对是任何行业都需要的品质。
计算机体系结构和汇编语言-关于体系结构的书遍地都是,而且也大同小异,倒是汇编有一本非常好的书。《80x86汇编语言程序设计教程》(清华大学出版社,黑色封面,杨季文著)。你需要着重学习386后保护模式的程序设计。否则你在学习现代操作系统底层的一些东西的时候会觉得是在看天书。
计算机操作系统原理-我们的开发总是在特定的操作系统上进行,如果不是,只有一种可能:你在自己实现一个操作系统。无论如何,操作系统原理是必读的。这就象我们为一个芯片制作外围设备时,芯片基本的工作时序是必需了解的。这一类书也很多,我没有发现哪一本书非常出众。只是觉得在看完了这些书后如果有空就应该看看《Inside Windows 2000》(微软出版社,我看的是E文版的,中文的书名想必是Windows 2000 技术内幕之类吧)。关于学习它的必要性,ZDNET上的另一篇文章已经有过论述。
数据结构和算法-这门课程能够决定一个人程序设计水平的高低,是一门核心课程。我首选的是清华版的(朱战立,刘天时)。很多人喜欢买C++版的,但我觉得没有必要。C++的语法让算法实现过程变得复杂多了,而且许多老师喜欢用模块这一东西让算法变得更复杂。倒是在学完了C版的书以后再来浏览一下C++的版的书是最好的。
软件工程-这门课程是越到后来就越发现它的重要,虽然刚开始看时就象看马哲一样不知所云。我的建议是看《实用软件工程》(黄舌,清华)。不要花太多的时间去记条条框框,看不懂就跳过去。在每次自己完成了一个软件设计任务(不管是练习还是工作)以后再来回顾回顾,每次都会有收获。
Windows 程序设计-《北京大学出版社,Petzold著》我建议任何企图设计Windows 程序的人在学习VC以前仔细的学完它。而且前面的那本《Inside Windows 2000》也最好放到这本书的后面读。在这本书中,没有C++,没有GUI,没有控件。有的就是如何用原始的C语言来完成Windows 程序设计。在学完了它以后,你才会发现VC其实是很容易学的。千万不要在没有看完这本书以前提前学习VC,你最好碰都不要碰。我知道的许多名校甚至都已经用它作为教材进行授课。可见其重要。
上面的几门课程我认为是必学的重要课程(如果你想做Windows 程序员)。
对于其它的课程有这样简单的选择方法:如果你是计算机系的,请学好你所有的专业基础课。如果不是,请参照计算机系的课程表。如果你发现自己看一本书时无法看下去了,请翻到书的最后,看看它的参考文献,找到它们并学习它们,再回头看这本书。如果一本书的书名中带有“原理”两个字,你一定不要去记忆它其中的细节,你应该以一天至少50页的速度掌握其要领。尽可能多的在计算机上实践一种理论或者算法。
你还可以在CSDN上阅读到许多书评。这些书评能够帮助你决定读什么样的书。
日三省乎己
每天读的书太多,容易让人迷失方向。一定要在每天晚上想想自己学了些什么,还有些什么相关的东西需要掌握,自己对什么最感兴趣,在一本书上花的时间太长还是不够等等。同时也应该多想想未来最有可能出现的应用,这样能够让你不是追赶技术潮流而是引领技术潮流。同时,努力使用现在已经掌握的技术和理论去制作具有一定新意的东西。坚持这样做能够让你真正成为一个软件“研发者”而不仅仅是一个CODER。
把最多的时间花在学习上
这是对初学者最后的忠告。把每个星期玩SC或者CS的时间压缩到最少,不玩它们是最好的。同时,如果你的ASP技术已经能够来钱,甚至有公司请你兼职的话,这就证明你的天份能够保证你在努力的学习之后取得更好的收益,你应该去做更复杂的东西。眼光放长远一些,这无论是对谁都是适用的。
相信你已经能够决定是否学习C#或者什么时候去学它了。