一位高级程序员给学弟学妹的建议--前车之鉴

来源:互联网 发布:杭州首展科技公司知乎 编辑:程序博客网 时间:2024/04/29 11:42


我始终认为,对一个初学者来说,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后保护模式的程序设计。否则你在学习现代操作系统底层的一些东西的时候会觉得是在看天书。

计算机操作系统原理-我们的开发总是在特定的操作系统上进行,如果不是,只有一种可能:你在自己实现一个操作系统。无论如何,操作系统原理是必读的。这就象我们 为一个芯片制作外围设备时,芯片基本的工作时序是必需了解的。这一类书也很多,我没有发现哪一本书非常出众。只是觉得在看完了这些书后如果有空就应该看看《In side 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。

把最多的时间花在学习上

这是对初学者最后的忠告。把每个星期玩CS或者CS的时间压缩到最少,不玩它们是最好的。同时,如果你的ASP技术已经能够来钱,甚至有公司请你兼职的话,这就证明你的天分能够保证你在努力的学习之后取得更好的收益,你应该去做更复杂的东西。眼光放长远一些,这无论是对谁都是适用的。

相信你已经能够决定是否学习C#或者什么时候去学它了。

 

 

 

 

给所有入门程序员的建议(1)--句句是诤言 希望大家认真读完

编了这么久的程序,一直想找机会总结下其中的心得和方法,但回想我这段编程道路,又很难说清楚,如果按照我走过的所有路来说,显然是不可能的!当我看完了云风的《游戏之旅--编程感悟》和梁肇新的《编程高手箴言》我突然知道我要从何说起,我要怎么说了!

从接触编程到现在已经至少要6年,虽然时间短,但我几乎每天都在编,而编程上突飞猛进的还是最近一两年,单纯编程上的进步,很简单就是经验,但你要理解才可以进步的快!这就是说,你的理论课要学好,才能学好编程,操作系统,网络原理,计算机体系结构,数据结构,编译原理,你哪个学的不好,你根本不配成为编程高手,我见过的高手,这些学的都不错!这些都是计算机的支柱,你连它的支柱都不了解,怎么编程,即使你编写的程序好——只有一个原因,你用的是高级语言或脚本语言,因为它们封闭大量低层语言细节,让你不用了解就可以编写,你不了解低层细节你杂成为高手!



解释什么叫编程?


我觉得现在很多同学,根本不知道什么叫编程!我现在告诉你,单纯的编程,也就是就知道语法知识的编程,根本不叫编程,只会单纯的语法的编程连低级程序员都不如!
编程不仅仅是你对语法的掌握,你还要把各种技术混合到里面,这样才叫编程,你编程的时候,你应该问问自己,你的程序有算法吗?你的程序写的够简单吗?速度足够快吗?占用空间足够少吗?代码写的规范吗?语句写的标准吗?你的程序之间的结构合理吗?你类定义的合适吗?方法和属性合理吗?接口合理吗?等等等,包含很多东西!这就是高级程序员为什么赚这么多钱!要付出相当大的脑力劳动!
调试对你也很重要,一个程序高手,也是调试专家,其实调试很多方法,但大多数都是实践中得到的!




指正现在人对学计算机误区


现在我每天在和汇编,硬件指令 ,c和c++或一些低层API打交道,有些时候编程这个东西很难说清楚,只有你经历了,你才能感受到,你没有经历,就永远体验不到!
我现在要更正几个现在学计算机人的误区,我想回答的是,学什么才是学计算机!
学计算机的两个方向:一个是纯搞理论的,一个是搞实践的。搞理论的无可厚非的,大家都承认是学计算机。那么实践呢?我很难给出一个定义,但我会列出那些才是真正学计算机学的:
(1)编程,这里的编程,我要抛出FLASH,PHOTOSHOP,3DMAX等,它们虽然也有语言,但都是为了给美术人员提供的!也就是几乎封闭了大量的低层细节,对于一个学计算机的人来说,如果你努力学它们,你还是不要学计算机了,去学美术把!网页编程能接触到至少两种类型语言,,HTML和ASP或JSP(PHP),HTML说实话,不应该是计算机人学的,你应该学的是ASP,JSP等!
按严格意义上讲(但实际没有这么严格)如果你的主要必修语言,不是c ,c++,JAVA,或者硬件指令,都不算是真正学计算机的,之所以这么说,我举个例子,比如你用JSP,它是一个脚本语言,如果你用过这个语言,你认为你用好这门语言需要了解硬件结构知识吗?显然不用,如果你纯是JSP程序员,你需要只是,JSP语法,一些简单的JAVA语言,SQL之类的数据库知识,其余的你什么都不需要,至于分析流程,那是系统分析师的事,不要和编程混为一谈,我学JSP学了3个月,现学现买就做出了功能齐全的网上书店(当时是老师布置的作业),如果再努点力,就可以投如使用!所以说,学JSP根本就不需要太多的专业知识,不是学计算机的也很容易就学会!
学c++,我都学了好几年了,用它写程序都几十万行,我也不敢说我学的精通!就是因为它太灵活了!不同人,用的效果就是不一样!
所以按严格意义上讲,如果你的主要必修语言,不是c ,c++,JAVA,或者硬件指令,都不算是真正学计算机的,也就是说,学那些对计算机专业知识不需要太多了解的语言,就不叫学计算机的!
2)从事软件方法实践研究,这个纯是软件工程方面的,如果你没有容入一个大项目中很难体会它的重要性,想一想,一个程序,几十万,几百万行代码,能这么好的实现,并运行,它的功劳不小!
(3)从事低层硬件开发,这里可能和搞电子的专业有些重叠,但事实就是这样,他们也是学计算机的!
其余的,装系统了,装电脑了,用人家编好的软件实现些图片音乐等功能的,那都是计算机的门外汉,不要和真正学计算机的混为一谈!
我经常被问到:
你会盗qq不?我晕,学计算机的就要会盗qq?
你会装电脑不?虽然我会,但不会并不可耻
你会装系统不?虽然我会,但不会并不可耻
''''''''''''
'''''''
等等把,有好多,通过我上面解释,你应该理解学计算机的应该会什么,不会什么也是应该的!





正式入题,怎么学好编程!



, 世面上好象只有这两本是中国人写的关于编程心得的书,中国编程好的人很多,但写出方法很难!第一本《游戏之旅--编程感悟》前面几章写的是云风的编程经历,后面几章写的是编程经验!总的来说本书很容易读懂!《编程高手箴言》书很难,尤其写操作系统那章!正如作者所说,真正写一门编程方法学的书很难!本书前几张概括了当前中国软件面临的形式,我强烈建议看一下,写的很经典!以前我不知道程序和软件的区别是什么,现在我知道了!后面几张写的都是编程方法和编程要具备的知识!


总结他们两人所说的,我准备按照下面提纲来写编程方法!


1。如果你感兴趣,学计算机是一种光荣,如果你不感兴趣,那么它是地狱!
2。理论对你很重要,尤其是你一名搞技术的程序工程师!
3。学会自学,学会思考,学会合作与交流!
4。要想成为高手,一定要从底层学起,底层是什么?CPU,汇编等硬件指令!
5。编程需要经验积累,学会调试对你尤其重要!
6。全局把握整个工程,具体到每个类的属性和方法以及各个类的关系!一定确保你设计的类和类模式和类间关系能够有效,利于修改和升级!概括说就是软件工程

下面我就分别说一下

一。如果你感兴趣,学计算机是一种光荣,如果你不感兴趣,那么它是地狱!


我经常听很多同学说,开始他对计算机很感兴趣,但随着大学里的学习,越来越感觉无聊甚至厌烦!你之所以这么想,其实一点也不怪你!从高中的应试教育到大学里的自由学习方式上的转变,我们几乎都不适应,一到大学,突然有一种解放的感觉,没有老师的强硬指示学习,自己根本不知道怎么学,学什么!所以说,教育对我们很不负责任!
如果你在大学以前已经知道编程怎么回事,那到没什么事情!但好象很少有人象云风这样从小就接触了编程教育!所以我们在没有上大学前几乎是零起步!
其实,按我的理解,刚上大学开始学编程有些晚了,之所以这么说,不是因为单纯的编程很难,如果你很努力,几年完全可以搞定,其他的你去公司的经验可以弥补!我这里想说的是,一个真正的程序员不单单要有强硬的编程实力,还要有强大的理论后盾!你只会编程,没有强大的理论做后盾,你也就不会把理论转化成实际的代码,你也不会做出高效,高技能的程序!在计算机理论中,图论,人工智能等等都是很难的理论,但如果你能把它们有效的用在计算机领域,功德无量!国人能做这点的很少,本来厉害的程序员就很少,有高尖端理论技术并把它应用的更是凤毛麟角!
(这里可以推荐大家一本书《游戏编程中的人工智能技术》,这本书抛开了传统的自动机,产生式,各种规则的传统的人工智能理论,而是讲的更前沿的计算智能——生物遗传算法,人工神经网络!这本书,不单纯讲理论,还用c++语言结合理论实现各种游戏程序!有时抽象的理论都是基于数学基础之上,如果没有一定数学基础是很难看懂的,但正因为它有数学证明是正确的,所以它是可行的!能把它用语言实现更是可观!)
所以,如果你热爱计算机,在大学以前,就应该成为一个程序高手,而大学以后,主要专研各种技术的实现,和各种技术的学习,如果你把他留在工作里,可能很难,我的同学在参加工作后,很少有继续看技术书籍,因为技术书籍很难,不是一下两下就看懂的,有几个还有这样的耐力和精力去搞!这些怎么在编程上实现,都在等着老外,咱们COPY,这样我们的软件技术能强大吗?
可是在大学以前成为一个编程高手几乎不可能,我们没有良好的学习编程的环境,而且面对着中考,高考的各种压力,几乎没有机会去学习编程!其实,小学,初中,高学,那些课程没有必要象我们这样反复的复习,反复的作题,浪费了大量时间,我们要学会什么?学会一种技能,能够应付各种变化的技能,就是自学,学会思考,学会自己解决问题,学会团结合作!初等教育,打的口号很好,实际上,完全压制了这种学习方式!
所以我们应该以最快的速度,在大学里容入一个热爱计算机的氛围!说到这又很难,当代大学生迷茫呀!不知道作什么,有些知道自己该好好编程,但光说不做!有些人,写了几段代码,出现了问题,不会调试,就放弃了!大家都这样,所以以寝室为单位没有人编程,逐渐以整个计算机学院为单位逐渐编程!确实我们的计算机老师,会编程的很少,我们应该知道,中国计算机引进并发展才短短20年,正是这样老一辈的,把这些计算机理论上确立,他们不会编程理所当然,大学的老师主要研究理论,国外的也是,因为理论太难了!
所以大学里学习编程要完全考自己,你要有信心,有意志把它学好才可以,而且这个过程是循序渐进的!以最快方式,找到你编程的爱好和兴趣!
我介绍几个方法,学习方式,希望你能找到兴趣,起码我是这样做的,记住如果跌倒了,你要站起来

    1。一定要和喜欢编程的,或编程厉害的,或经常编程的人,在一起,经常探讨问题!初学编程会有很多问题出现,你自己很    难解决
    2。我建议VB和c一起学习,这个只是我的建议!我为什么这样说呢?如果你开始只学c,你会厌烦整天在DOS下,没有图象的    程序!如果你直接学WINDOW编程会很难,所以我建议学VB,VB这是个语法简单,很快可以见到你编写程序的画面,这样你就会逐渐喜    欢编程,没有画面很枯燥的,你不这样认为吗?反正我是这样认为的,你编写的好坏,没有画面也很难用眼睛直接看出来!VB是最简    单的语言了!不存在c的复杂语法结构,程序出错概率相对c 来说很少,因为VB封状的很好,帮你解决了复杂的过程!其实象JAVA,MFC,    c#完全可以作到VB效果,但上手相对困难!
    c是我们一定要学的,它是一种很接近底层的语言!如果你要成为高手,应该学这个!C是个纯面向过程的语言,它的语法不    是很难,你用它大约一年半多左右,就完全可以掌握它,记住这需要你的实践,多做程序,主要是算法程序,最好把你教科书的后的    的习题都做了。大家几乎学的都是潭浩强的书,这本书我开始认为很 好,但我看了很多国外的书,和很多国外人所打的代码后,    和国内高级程序员所说的话,我只能说这本书,只能是你的开端,但不能 让你更深层次了解语言。但你要问我初学者用什么    书,我还会介绍这本书。C的精髓在于指针,你能灵活运用指针就几乎等于你掌握了 C语言,这是一种高效的语法支持,快的让    你无法想象,我很有感触,在VB下要慢的多。
    那么我们学VB究竟做什么,很简单,做WINDOWS程序,控件的使用,数据库的使用等等,还有一个很重要的是,你可以练习你     学的数据结构,各种计算机算法,很快就可以用图形的方式显现出来!你现在知道这些就可以,等你以后学了真正WINDOWS编    程,你会对你以前所实现的东西有很深的理解,究竟什么是API,什么是动态连接库,什么是控件,象VB,MFC这样的东西,究竟封状    了什么让我们用起来这么简单!
3如果你能作到,以上两点,(加上你学的专业,如果你很努力,课大约1年)我想你会对计算机感兴趣的!你逐渐容入爱学    计算机的氛围!接下来有两个方向你要去做,一个是努力学好其他计算机专业课,二是在巩固c 语言的基础上,你可以选择学习c++     或者WINDWOS编程!这两个先学哪个都无所谓。记住你大学时学的10大专业课,数学,离散数学,数据结构,编译原理,汇编,数据库    ,计算机体系结构,操作系统,计算机网络,软件工程,你要尽力把它们学好,这个是整个计算机系统的精髓,这些都是相互贯穿的    ,相互联系的,你可能学某科没学懂,但学了别的后,可能会懂的!切记,在你学好编程的同时,一定要学好这些理论,以后你会受    益匪浅的。
    4。在你觉的c或者VB学的没什么问题,或者你学会WINDOWS编程,记住一定要自己有个想法,做个小的可视化程序,小游戏也    好,小应用软件也好,都可以,这个步骤,你一定要做,你会学到很多东西!在这期间,你还会遇到很多问题,你要自己多想,多问    别人,多去网上查资料!但你做的程序,最好不要COPY别人的,如果都是你自己做的,自己想的,你收获最大,哪怕你是模仿别人的 程序,你用你自己的想法实现了,也是厉害的!其次,你可以COPY部分代码,作为自己的。在你对你的想法,知道怎么实现后,写代    码只是浪费时间的时候,而且你写的效率没有现成的代码效率高,你就可以完全COPY,但如果你是初学者,你千万不要这么做!否则 你会对它产生依赖,有一天真正让你自己去写,你会无从下手!所以开始时,你可以试着COPY,逐渐摆脱对它们的依赖,以后摆脱了 ,这个时候,你才可以总依赖它们。
    5。大学期间,有很多程序的实验课,你要认真做,做出来收获是自己的,也可以作为自己的一个小项目!大学期间加上实验 课,基本上自主编程或者团队自主编写的总小软件数目应该不少于7,8个,如果你做的程序很大,可以少些!
以上,我把如果学习计算机入门 和提起 你兴趣的方法告诉你了!我相信你按照我的去做,应该没有问题的!对于每个细节,我会在接下来详细为你们写出的!

 

 

 

 

原创粉丝点击