与C为伴 发表于 2012-5-24 23:45:34

一个程序员对学弟学妹建议,希望对大家有帮助

本帖最后由 与C为伴 于 2013-1-14 18:13 编辑

            我始终认为,对一个初学者来说,IT界的技术风潮是不可追赶。我时常看见自己的DDMM们把课本扔了,去卖些价格不菲的诸如C#, VB.Net 这样的大部头,这让我感到非常痛心。而许多搞不清指针是咋回事的BBS站友眉飞色舞的讨论C#里面可以不用指针等等则让我觉得好笑。C#就象当年的ASP一样,“忽如一夜春风来,千树万树梨花开”,结果许多学校的信息学院成了“Web 学院”。96,97级的不少大学生都去做Web 了。当然我没有任何歧视某一行业的意识。我只是觉得如果他们把追赶这些时髦技术的时间多花一点在基础的课程上应该是可以走得更远的。

         几个误区:
         初学者对C#风潮的追赶其实也只是学习过程中经常遇到的几个误区之一。我将用一些实际的例子来说明这些现象,你可以按部就班的看看自己是不是属于其中的一种或者几种:

          (1)认为计算机技术等于编程技术:
          有些人即使没有这个想法,在潜意识中也有这样的冲动。让我奇怪的是,许多信息学院的学生也有这样的念头。认为计算机专业就是编程专业,与编程无关的,或者不太相关课程他统统都不管,极端的学生只要书上没带“编程”两个字他就不看。其实编程只是计算机技术应用过程中一种复杂性最低的劳动,这就是为什么IT业最底层的人是程序员(CODER)。计算机技术包括了多媒体,计算机网络,人工智能,模式识别,管理信息系统等等这些方面。编程工作只是在这些具体技术在理论研究或者工程实践的过程中表达算法的过程。编程的人不一定对计算机技术的了解就一定很高。而一个有趣的现象是,不少大师级的计算机技术研究者是不懂编程的。网上的炒作和现实中良好的工作待遇把编程这种劳动神秘化了。其实每一个程序员心里都明白,自己这些东西,学的时候并不比其它专业难,所以自然也不会高档到哪里去。
         (2)咬文嚼字的孔已己作风:
         我见过一本女生的《计算机网络原理》教材,这个女生像小学生一样在书上划满了横杠杠,笔记做得满满的,打印出来一定比教材还厚。我不明白的是,像计算机网络原理这样的课程有必要做笔记?我们的应试教育的确害了不少学生,在上《原理》这一类课程的时候许多学生像学《马列原理》一样逐字背诵记忆。这乃是我见过的最愚蠢的行为。所谓《原理》,即是需要掌握它为什么这样做,学习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 的所有关键字。
            (3)不顾基础,盲目追赶时髦技术:
            终于点到题目上来了。大多数的人都希望自己的东西能够马上跑起来,变成钱。这种想法对一个已经进入职业领域的程序员或者项目经理来说是合理的,而且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。

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

与C为伴 发表于 2012-5-25 00:02:33

几日前,在一位仁兄的blog里看到如下一番话:其实我发现中国的教育还是有很大问题的,你们得让你们的学生认识到这门课的作用啊,有些师兄说到出去工作了才发现汇编的作用。
  我觉得值得庆幸的是这位仁兄在在校期间的学习中及时地意识到了汇编的重要性,并做出了正确的选择。然而这位仁兄提到的“老师没有让学生认识到汇编的重要性”和“有些师兄工作了才发现汇编的重要性”这些在计算机专业教育中存在的客观事实,再次让我心情沉重!
  为了让更多的计算机学习者意识汇编语言的重要性,我就抛砖引玉,发表一下对汇编语言的理解,希望能够让更多的计算机技术的学习者对汇编语言的作用有一个正确的认识。
1.汇编语言
  汇编语言是最接近于机器语言的编程语言。如果说机器语言是计算机操作的本质,那么汇编语言就是最最接近本质的语言。汇编语言操作直接面向硬件,所以,我们在使用汇编语言的时候,我们能够感知计算机的运行过程和原理,从而能够对计算机硬件和应用程序之间的联系和交互形成一个清晰的认识。这也是最能够锻炼编程者编程思维逻辑的,只有这样,学习者才能形成一个软、硬兼备的编程知识体系,这是任何高级语言都无法给予的!相对于繁复的高级语言,汇编语言指令集合更简约,指令操作更直接,从汇编开始学习更符合循序渐进的学习原理!所以,对于计算机技术初学者或者自学者,汇编语言重要性无可替代!
2.汇编语言之于高级语言
  不否认,在应用层面,高级语言占据了软件开发市场的绝大部分。也正是这种现象,误导了学习者,甚者是教育者!所以目前高校计算机专业的现状是:专业课程中C语言,C++,java等高级语言一应俱全,而毕业的学生却连简单的程序都不能编写。为什么?听不懂,学不会!这就是缺乏基础造成的!
汇编语言才是计算机技术的基础,而不是常说的C语言。之所以说汇编重要,其一个重要的原因就是,汇编语言能够让你更好的理解高级语言,尤其是高级语言中的C语言。汇编语言对于内存的操作都是基于内存地址的,而C语言中最令人头疼的指针概念,说白了就是内存的地址。指针的学习和应用中最头疼的就是在指针这个抽象的概念和实际的内存单元之间建立思维映射,而这些恰恰是我们在汇编语言学习中频繁做的一件平常事。另外,对于C语言中的数据类型、形参实参、函数调用、全局变量、局部变量等概念及操作,我们都可以用汇编语言中的一些操作相关联,把这些抽象的概念和过程,通过汇编语言形成一个具体的映像,深度剖析,这样我们才能真正的学会、学好C语言。
  有了汇编和C的基础,那些所谓的面向对象的语言学习起来就更为顺畅了!奉劝那些好高骛远的学习者,踏踏实实的从汇编开始吧,古云:磨刀不误砍柴工啊!
3.汇编语言之于应用
  很多学习者放弃对于汇编语言的学习,是因为高级语言的开发更容易找到工作。这个理由也是我见到过的最现实的。但是,这里面明显存在着认识误区!
  首先,我们的学习是一个系统过程,我们的知识结构不是一个单一课程所能够建立的。所以,学习汇编的目的并不是非要用汇编去挣饭钱。因为汇编语言对于一个编程人员所应该具备的基本素质的培养和形成得意义是非常重大的!这在前文中已经分析了,不再赘述!
  其次,汇编本身也是很重要的应用技术。由于学习者,尤其是在校的学生,平时接触的最多的是纯软件的东西,所以,觉得五花八门的软件才是计算机技术应用的舞台。那么这些人最终会成为那位博主提到的那些工作后才意识到汇编的作用的“师兄”!汇编的操作由于跟硬件紧密相关,所以,很多硬件设施的嵌入式编程使用的都是使用的汇编语言,因为汇编语言更直接,更有效率!我们现在的数码产品很多,而这些数码产品赖以生存的芯片,主板等,都包含了嵌入式程序,而这些程序中,汇编语言的使用是相当重要的!
  为了工作放弃汇编,得失自明啊!

很激动地写了上面这些,目的只有一个:让更多的学习者认识到汇编语言在计算机技术学习中的重要性

与C为伴 发表于 2012-5-25 00:07:08

   我相信每个当初报考计算机专业的学生没有一个不想学好计算机知识的。当他们进入大学后开始以专业的心学习计算机技术的时候,每个人我相信都有学好计算机技术的态度和信心。对于计算机专业的大学生而言,计算机技术在大学阶段其实是一个开始。之前如果学过什么word之类的办公软件,我可以说,那根本就不是计算机技术,只是计算机应用软件。所以,计算机专业的学生大学其实处于一个计算机技术的启蒙阶段。在这个启蒙阶段,最重要的就是入门。当大家都满怀信心的去学习那些被各大高校都当作计算机入门教材的C语言的时候,发现太多的“不明白”,比如说,刚开始就是#include 和printf(“hello world”),而且被很正式的告知,这就是第一个C语言程序。想必楼上的仁兄也是从这个开始的吧。那您就没有过疑问?#include是干嘛的,为什么?printf怎么就在屏幕上打印了字符了呢?高深?!非也!就是拿棍子砸你!而老师就跟你说了:“include是引入头文件,printf是在屏幕上打印字符!”然后某些人就得死记硬背,认为这就是计算机规定的。就这样,一天记,一天背,而信心呢?一天天消磨!就因为他想不明白为什么,一个问号一个问号的累积,最终否定了自己,失去了学习的心态。这就是楼主话里面说的“写不出简单程序,绝不是没有学汇编的原因”。从最直接的角度来说,确实不是汇编的原因,是因为学生失去了学习的心态。这一点应该是仁兄说的那个原因吧。咱继续往下说。
    失去了学习的心态和信心,是造成一个学习者无法学好计算机技术的一个直接原因。那么,我们要是想解决这个问题,给学习者建立学习信息,引导正确的学习心态,是不是应该就会让那些抱着理想来求学的学习者能够更好的完成学习目标呢!所以,我们考虑的重点就在如何建立学习者的信心和学习的正确态度。
    其实,按照学习者来学习的目的我们很容易就能给他们维持和巩固他们的学习热情和学习信心。就是给他们最好的入门教育,不要在他们满怀期待的进门的时候就绊他们一个大跟斗。所以,对于教育者就应该明白怎样的入门才能更好的引导学习者。对于教育者传授知识当然离不开课程。所以,我们的解决问题的焦点就明晰了,就是要确定一门最好的入门课程。我们都经历过小学,知道,入门教育的知识结构要简约,直接,而且具备极强的原理性!这三者应该是相当重要的。简约,能够使学习范围更明确;直接,能够使学习感受更加强烈;原理性,能够使学习成果更具广泛性。纵观计算机各个课程,C语言被大多数教育这认为是最简单的计算机语言了,真的如此么?他们就没有看到他们的教材上那醒目的几个大字“C语言高级编程”!我觉得这就是在抽他们自己的嘴巴!都明明是高级语言了,还敢说是入门的!学生不会,郁闷,失去学习心态,他们还埋怨学生素质差,没有学习进取心!脸怎么这么大!!
    我们再回头看看,到底什么语言是最简约,最直接,最具原理性的呢?汇编语言?非也!是计算机语言,语言范围不过0,1,够简约!代表高低脉冲,够直接!而且计算机就认识这0,1码,只要会了,至少图灵理论的计算机应该都没问题了,原理性绝对更牛!那他当入门课程?这次不用抽嘴巴了,直接上板砖算了!那是计算机语言,你是计算机么?不是吧。所以我们没有必要再去拿着0,1码在那念经了!我们既然不能学习这最简约,最直接,最具原理性的机器语言,那应该是什么呢?!俗话说,退而求其次!我们是人,具有创造性,所以,我们就定义了一个和计算机的机器语言最接近的亲戚--汇编语言。对于汇编语言跟计算机之间的关系,我就赘述了,楼上的可以去看本网的学习宣言,比我说的清楚。
   我相信,如果你说的那些因为没有学习心态直接导致没有学习好编程技术的人,当初如果他们的教育者选对了正确的入门课程的话,我想至少还会有很大一部分完成自己入学时的梦想的。(当然不排除就是混日子的,那样的人别说学习汇编了,本来就没有学习之心,不在我讨论范围)
    学习心态的丧失是导致学习者放弃学习的直接原因,而没有很好的进行入门教育是导致学习者学习心态丧失的重要原因。这才是我那句话中包含的具体意思!

九墓 发表于 2012-5-25 04:16:24

{:5_109:}{:5_109:}

小白磊 发表于 2012-5-25 10:14:22

"听君一席话,胜读十年书"{:5_105:}

架构师我当定了 发表于 2012-5-25 13:13:43

第三段没看 因为哥毕业了 而且我现在 没的选择 只有一条路走下去 因为我知道它通向光明

youraustin 发表于 2012-5-26 14:54:07

谢谢楼主的计算机学习指引!很不错!

t桀骜不驯 发表于 2012-11-3 16:25:23

确实不错@!

willtoo 发表于 2012-11-4 10:32:41

{:5_95:}这么长的文章第一次看完,强啊 啊啊

hmnbmh 发表于 2012-11-4 10:37:47

学习心态的丧失是导致学习者放弃学习的直接原因,而没有很好的进行入门教育是导致学习者学习心态丧失的重要原因。:P

Silver_age 发表于 2012-11-7 08:25:58

自己也在一直迷茫中~~~看了這篇文章大概了解了一些~~~

/aiq____害__虫/ 发表于 2012-11-7 09:25:18

还好我是从汇编学的,看的心理这个舒坦~~

vip_restart 发表于 2012-11-7 10:16:30

mark、真心励志啊、{:5_108:}

小宝贝儿 发表于 2012-11-7 11:20:17

{:5_92:}谢谢~!

风在飙 发表于 2012-11-7 11:52:29

谢谢楼主分享心得{:5_92:}

因為·有你 发表于 2012-11-7 12:57:37

嗯,说得太对了,赞

默默无蚊 发表于 2012-11-7 16:43:40

感觉收获不少,激起了我继续学下去的勇气

Lennon 发表于 2012-11-7 19:19:50

受益了,现在大学二年级了,看了一些计算机方面的书,渐渐地发现要学的东西实在是太多了,一时间没有了方向。不知道自己到底该学些什么。看到同学的技术越来越好,而自己还在理论上徘徊·····

風言瘋語 发表于 2012-11-8 20:48:00

受益匪浅         

秋舟 发表于 2012-11-9 20:35:00

谢谢前辈的指导。嘿嘿
页: [1] 2 3 4
查看完整版本: 一个程序员对学弟学妹建议,希望对大家有帮助