谈谈我对攻读计算机研究生的看法

谈谈我对攻读计算机研究生的看法
  就我自己的理解,谈谈我对读研和软件学院的看法,不妥之处一笑了之即可。
  
  如果你有实际开发工作经验,感觉自己的水平和实力进入了一个高原期,迫切需要从理论上提高,那么计算机学院是唯一选择。因为计算机学院才能让你在理论上更上一层楼。软件学院从教学计划上就没有把你往这方面带。当然能不能更上一层楼最终还是完全取决于你自己。需要特别说明的是,工作经验并不一定等于开发经验,我见过很多工作2-3年的人,但是没有一点开发经验。
  
  你说:“他们都有很强的开发能力,只是不太喜欢读书,也只是希望混个学历对今后在岗位上晋升有好处”,我可以向你保证,你所说的人绝对不是开发能力很强的人。因为,1)高手不可能不喜欢读书;2)高手不可能想去混一个学历;3)高手不可能认为晋升是因为学历的原因。
  
  还需要说明的是,考计算机的人未必个个都是高手,严格来说,大部分都不会编程序。也就是说,庸庸碌碌之辈仍然占绝大多数。研究生毕业的师兄只拿2500 元左右的比比皆是,所以不要寄希望于拿一张研究生文凭出去赚高薪。但是,对于有实际开发工作经验的人,要想自己在3年之中有一个真正的提高的话,计算机学院提供了广阔的平台。就我所知,每一个月拿2万以上的也有(上海育碧,图形特效算法设计)。所以,同为研究生毕业,能力的差距是极大的。所以,不要去问 “研究生毕业能拿多少?”,要问“像我这种水平的人,研究生毕业能拿多少钱?”这样人家才能够准确地回答你。
  
  所谓“有实际开发工作经验”是指你目前已经具备下列能力:1)你已经认为C++和汇编语言都是很简单的语言,并能够自如地运用;2)你能够在30分钟之内想到正确的五子棋 AI算法设计思路和方向;3)你完全理解STL为什么这么重要;4)你能够独立地解决所有的编译与链接问题,哪怕你从来没有遇到的问题,你也不需要询问任何人;5)英文网站是你的首要信息来源;6)能够读懂英语写成的国际标准,比如NTFS磁盘格式标准。7)你经常站在集合论的角度思考算法问题;8)能够理解一个简单的驱动程序,能够理解一个简单3D交互程序;9)你能够认识到线性代数和概率论在实际编程工作中的极端重要性;10)你完全理解COM的设计思想,尤其能够理解COM为什么要设计成这样;11)当我说到虚函数的重要作用时,你不会急着去找书来翻;12)你能够说出C++为什么比其他语言优秀的理由,记住这种理由应该来自于你的开发体会,而不是因为其他人都这么说。此外还有很多判断标准,但如果你同时具备5条以上,可以认为你已经具备相应的开发经验了。在这种状态下读研,你将取得读研效益的最大值。
  
  读研最重要的是要明白你自己要干什么,不能等导师来告诉你你应该干什么。研究生的优势在于理论功底深厚,思维具有穿透力,当然编程能力首先要过关,不要读完研究生还不知道MFC程序的WinMain函数在哪里。所以,研究生期间,你一定要做有理论深度的算法设计,比如大规模数据的搜索算法,性能是首要考虑因素,不要奢望SQL函数能够帮你解决问题,所有的问题你都必须自己解决,你必须解决内外存交换的性能瓶颈。再比如极品飞车的3D场景生成,图形变换,碰撞检测,物性模拟,纹理映射,灯光模型等等,这些都是可以保证你能拿到 2万以上月薪的技术。如果你认为这些东西太难,不可能做得出来的话,那么你就不适合读研。真的,要是你认为读研之后还是要去搞一般的程序设计,如信息管理系统之类的软件,那么你读研的价值就完全不会得到体现,因为这些工作根本就不需要读研。
  
  软件学院宣称培养软件开发人才,恕我直言,我从来没有看见那个高手是培训成功的。成为软件开发高手的路只有一条:自学!软件开发中需要大量的编程实践和独立思考,只有在此过程中,你才能够逐步成长起来。软件学院宣称培养软件项目经理,这更是搞笑,在某种意义上这是欺骗行为。学院里面能够培养出软件开发经理更是十足的谎言,软件项目经理必须,或者说更强调从战争中学会战争。没有实践经验的项目经理就是绣花枕头一个。
  
  实话实说,软件学院就是一个蒙钱的机构,公关工作做得很好,善于打广告,而且都是打着高薪的幌子,就如同外面的什么北大青鸟培训班一样。两个字:蒙钱!四个字:还是蒙钱!
  
  总之一句话,如果你只想成为软件开发高手(比如认为会编驱动程序或杀毒软件就是高手的那种),建议工作,不要考研;完全没有工作经验的,也不建议考研,你进来了只有瞎混一通。如果你有上述工作经验且想成为高级软件工程师(能够独立理解并设计出快速傅立叶变换算法的那种软件工程师)的话,那么强烈建议考研。考研让你有3年放松思考的机会,也有3年让你思想和技术积累沉淀的机会。非常难得的机会。不考研的话,这种机会就是一种奢侈,可望而不可即的那么一种奢侈。
  
  所以,不管你是哪一种情况,都不建议考软件学院。除非你是女生,把能够成为一个研究生当着一生最大满足的那种女生。
  
  1)关于读书的机会成本问题。读研的机会成本的确是很高。任何人都可以简单地计算出来。所以,我也不赞成所有的人都去读研。读研只适合那些痛感数学在编程中的极端重要性的人。如果对理论工具和理论思维的极端重要性没有切肤的认识,那么读研的价值几乎为0;读研的好处在于:A,把你自己放在一个学术和工程的交叉点上;B,让你具备了进入微软等世界顶级软件研发机构的可能性;记住只是可能性。但是不读研这种可能性为0;C,如前所述,如果没有读研的机会,你也就没有静下心来好好钻研几年理论的机会;一边工作拿高薪,一边深入地学习各种理论,诸位认为这可能吗?我反正认为不可能,我觉得学习钻研理论最需要的就是一个长期安静独处的环境,一边工作一边读书是不可能有这样的环境的,你会觉得每天都在疲于奔命。而读研正好可以提供这样一个环境。我同时还反对整天跟着导师的屁股后面跑,这样会浪费很多时间。读计算机的研究生,主要依靠自己去查阅最新文献,自己去研读文献,和导师的口头交流一个月一次就足够了,前提还需要导师的水平足够牛。如果导师的水平不牛,这也没关系,不理他就是了,自己做好自己的事情即可。
  
  2)关于研究生教学质量问题。坦白地说,全国都是“洪桐县中无好人”,尤其在计算科学领域,大牛极少。那为什么还要去读研?大哉问!把读研的收获寄托在名校或名师的名我认为气上,是注定要失败的。读研全靠自学,研究生之间的差距全部体现在自学能力上面。又有人问,既然是自学,为什么非要读研?回答是:因为读研就是为你买一份保险,就是买一份你自学三年之后不会失业的保险。这份保险主要是一种心理上的后盾,让你在自学过程中经得起诱惑,能够从容镇定地去追寻计算机理论发展的坚实足迹,从欧拉,费马,高斯,康托,图灵等巨匠那里寻找方法论的珠宝。倘若没有这份保证,你在家里面自学3个月,保证你会被失业的压力压得喘不过气来,何谈安心学习?
  
  3)关于实战经验与理论学习的优劣问题。这没有定论,如前所述,管理信息系统,设备驱动开发,工具软件开发,软件病毒剖析等等这些工作不太需要创造性,需要的是耐心和经验,需要的是对既有规范的准确理解,这类开发工作最适合在实战中提高,理论学习没什么作用。但是在人工智能,模式识别,图像压缩,虚拟现实,巨量数据检索,自然语言理解,计算机图形学等等领域,理论学习就占据着绝对的统治地位!这些领域的突破对人类的生活的影响是极其巨大而深刻的。某些领域处于一个极其快速发展的态势之中,比如计算机图形学,相信诸君能够从众多3D游戏的灿烂辉煌中体认到我的这种说法。在这些领域,如果没有扎实的理论功底,一切都是那么遥远,不管你花了多少时间在编程上面。
  
  4)关于高级研发人员的知识结构问题。首先声明,我不是一个纯粹理论激进分子,即认为除了理论之外,一切都不重要。我认为,纯熟的编程技能是最基本但也是最必不可少的技能。没有这个基础,一切计算机理论就是空谈(研究图灵可计算性理论的研究者除外)。有了这个基础之后,下列理论学习方向必须重点突破:
  
  1,科学哲学。这是核心中的核心!可惜国内不开这门课。不但不开课,而且还作为批判对象来引用,实在是遗憾至极!这是一门教你如何“钓鱼”的学科,在一切科学研究中居于最核心的地位。它是古今科研方法和思维方法的集大成者,很难想象一个成熟的研究者没有一套自己的方法论体系。科学哲学最需要的是领会与总结,它的思想与启示会伴随我们的一生。
  
  2,康托集合论,矩阵方法,离散结构,图论方法,群论方法之间的紧密关系。最重要的认识这些理论对实践的重要启示和方法引导。我始终认为,如果你学了一门理论之后,却不知道这门理论有什么作用,那么你的理论就白学了,你什么东西都没有捞着。所以,学习任何理论之前,先问自己:它有什么用?在哪里用?如何用?带着这些问题去学习理论,你才会真正地学到东西。用这三个问题去问你的理论课老师,他的回答就是判断其实际水平的最佳标准。
  
   3,思维要有极强的穿透力,学会看透文献作者没有写出来的动机。绝大部分大师都有隐瞒自己最具有方法论启示意义的思考环节的习惯。牛顿和华罗庚先生都有这个坏习惯。这让大家认为他们是天才,因为很多问题他想到了,我们想不到。但是为什么他们能想到,我们想不到?他们是怎样想到的?没有人告诉我们牛顿发现万有引力定律时的思考过程,当然,牛顿可以慷慨地把他的思考结果告诉我们,但是,他那可以点石成金的“金手指”却没有教给我们。我们的任务就是要培养透过文章看穿作者背后意图和动机的能力,在这方面,台湾的侯捷和美国的Donbox是绝佳典范。这两只老狐狸(呵呵,是爱称)凭着其猎犬一般的嗅觉,抽丝剥茧,一个把COM背后的幕后设计动机揭开并暴露到了光天化日之下,另一个把MFC的宏观架构做了一次完美的外科手术。其非凡的思维穿透力令人惊叹。
  
  4,英语。英语本身不重要,但是用英语写成的文献就极其重要了。所以,专门把英语作为一个重头戏列出来。大家不要相信英语无用论的鬼话。对于搞计算机的而言,英语就是你的母语!
  
  5,其它的具体理论还有很多,但是都不如这三个方面重要,因为我觉得这三个方面是最具有根本性,全局性的能力培养环节。需要指出的是,很多高深理论对你的工作是无意义的,当心时间陷进去。一定要把效率最高的时间段用在最具有决定性意义的理论学习上。
  
  5)关于读研之后的出路是否光明的问题。我们应该承认,读研之后,你的工作机会不是变多了,而是变少了。而且越是高手,他的工作机会和工作范围就越少。这是因为,越是搞前沿研发的公司,其数量越少,在这个圈子的人也就越少。你找工作的范围就越小,试问:如果微软的OS设计专家出来找工作,能够让他选择的公司能有几家?但是,这种公司数量的减少是以工资待遇的急剧上升为补偿的,同时,你在工作中所受到的充分尊重也是在一般公司中体会不到的。所以不要担心学了高科技用不上,呵呵,你只会越来越感觉自己学的不够用。相信接到过猎头公司电话的人会体会得到。真正的高手从来就不会担心工作的问题,也从来不会到人才市场上去找工作。既然选择了理论深入,那么就应该把眼光放得更远




  近世代数或者说离散数学最强调什么?显然是强调“抽象”。抽象是把复杂问题简单化的根本手段。会不会对问题进行形式化和抽象化是判断一个程序员成熟度的首要标准。一个程序员如果没有在抽象思维能力方面受到过严格的训练,那么他是不可能成长为一个优秀的软件工程师的。我认为,离散数学这门学科是培养一个人的抽象思维能力的最佳载体!请允许我说一句比较得罪人的话,那些认为离散数学在编程中起不了作用的人,不可能已经掌握了真正的的程序设计方法。如果读一读经典算法的源代码,可以说,处处都能看到抽象化思考问题的影子。(对事不对人,请勿对号入座)
  
  如果我们没有掌握“抽象”这个最强大的思维工具,那么,我们就不可能驾驭庞大的自然或人工系统!而哲学和离散数学(我一直认为数学其实应该属于哲学门类,至少应该是应用哲学)为我们提供了最普遍、最一般的抽象思维工具。比如:任何程序设计语言都可以看成是一台可以抽象执行的机器;STL的容器都是集合;STL容器中的元素都是集合中的元素,容器元素之间的序关系、映射关系、运算关系几乎完全和近世代数中的二元关系相对应;赋予了关系的集合就构成了空间,而抽象代数的重要分支泛函分析对各类空间的性质作了大量的研究,不仅很多赋范方法和结论直接可以用,更重要的是这些赋范方法和结论为我们的思考带来了更多的启发,而这种启发就是思维具有穿透力的关键。更不消说树结构和图结构与离散数学的关系具有直接的映射关系。所以认为离散数学和STL毫无关系的观点是站不住脚的。认为不懂离散数学也可以使用好STL更是不对的。掌握了并能够熟练地使用离散数学的观点来指导实践,你才不会在问题面前一筹莫展,你才会觉得思路特别多,不会在某一个问题上钻进牛角尖。这就是抽象化看问题的好处。当然,会用STL并不难,难就难在要把它用好,要让各种容器的副作用降低到最少,性能达到最佳,这就不容易了。建议读一读《Effective STL》这本书,对于有效地使用STL很有帮助。




  好文章,我也是为此专门重新登录来发言的。
   实话实说,我以为就一个研一的学生而言,能写出这种文章很不错了,这可能与你在读研前的工作经历有关。
   文章很中肯,思想也很先进,可能由于楼主研究领域的关系,举例方面有些偏差,引得一帮子人不以为然,哈哈,其实我想楼主主要是想以此来论证思想,而不是卖弄与鄙视什么。
   不过这也是必然的,因为计算机科学太大,没有一个人能说他是计算机的专家,只能说他是某某方面的专家,在其自己的领域,他所理解的先进性,必然与其它领域有差异。
   所以我的发言,也只仅只于从我的领域的认识,肯定不全。
   我硕土也是从事图形开发的,opengl,com,ole db, vc(mfc)等等方面,当然,在理论方面肯定没有楼主这么深,如果当初早点看到这样的文章,我想我能更沉静一些。我目前从事嵌入式开发有关的技术支持工作。
   我的看法是:
   1:楼主的文章是一篇思想性很强的文章,在一些学习和研究的方法性乃至作人上都有独到之处,也强调数学做为计算机科学之母的重要性,当然,我也希望看到计算机科学之父:电子或微电子学,其实计算机分为两部分,软件,硬件,计算机体系结构等的重要性也不亚与算法设计。就算是你立志于一个高级软件开发人员,如果有较强的硬件基础,也是很好的,了解硬件后的软件开发,就会知道“我们为什么要把软件写成那个样子,而不是其它样子”。这就会有种矛盾,人的精力是有限的,那么应该专注于算法还是专注于软硬件结合呢。以我看来,后者要简单些,也容易提高,也更易实际应用,但不能说要忽视数学,其实软硬件结合的系统软件多用到了很深的算法与数据结构设计,那重点就是理解其思想和应用,不用谋求自己的开发吧,我很理解楼主所说的那种自己开发和应用算法的喜悦和成就感,不过在你工作后,你会沮丧的发现,大多数你致力研究的东西,国外已经有成熟的产品了,所以有些网友说的抄国外代码优化的情况,是普遍的。当然,在学校研究期间,我们要学习自己的理论与研发,不过在毕业后,相应的工作机会也比较少,但要求也高,要你有相关的工作经验,我同事也曾遇到音频解码算法15000的职位,不过作为一个计算机专业多媒体算法研究的硕士,她最终也没有得到那个职位。我是意思是,在目前的中国研究生教育中,就算是你得到了这个理论研究的机会,你也并不一定站到了这个领域的最前沿,因为中国的计算研究生教育落后太多,就算你可以用自学来丰富自己的理论知识,但产品化你经验永远不可能在学校里学习到的。当我们计算机专业本科生还在应付计算机体系结构考试,并在考试后迅速的忘却并怀疑这门课程的作用时,国外的本科生已经在动手设计自己的CPU芯片了。最后,我的观点是:
  硕士应该致力于成为计算机行业的通才(通信,数据库,硬件设计,系统软件设计),至于高深的理论研究,那是博士的事。这样在毕业时,工作相对好找,而且在未来的提高中,当你面对更广的天地时,你不会一无所知,也少走弯路,当你在未来工作中如果工作需要要设计算法,拿起你的书本重新补充,并结合工作找到现实的实现方法,很多高明先进的算法,在实际应用中,是少之有少的,要找到成熟,规范的方法。
  2 :开发语言之争,其实这不应该是一个问题,很多人都知道语言其实不过是一门工具,重要的是你的思想,数据结构,算法设计等等,楼主钟情于C++,我也以为是一种很好的语言,硕士期间我基本是在windows平台,VC(MFC),<<深入浅出MFC>>,这样的书,当年也是推崇备至的。其实有的网友说的很对,开发不同层次的软件,选择不同的语言,C++和JAVA各有独道之处,当年我也认为我使用VC(MFC)和STL,COM来实现软件结构已经够了,如今我却发现原来我就算是C也不见得认识透了,汗颜。在上层软件的开发中,C++和JAVA用得很多,软件工程的思想也容易实现,不过在系统软件(操作系统和编译器),则是C和汇编的天下,我以前一个从中兴过来的同事经常觉得工作无趣,说上层软件的开发才能体现软件思想,作为中兴年年优异的员工如今在这儿找不到感觉。我也只能一声叹息了,无论如何,我认为无论你是用C++还是用JAVA的程序员,都不要放弃对C和汇编的了解,因为如果你想成分一名系统级的程序员,而不是专门于一个方面的熟练的程序员,C和汇编才是你的首选,或者如此说,因为硬件而选择汇编,因为结构化而选择C。所以我的意见是:要学好C++,先要学好C,至于JAVA,也不妨学习下C。
  3:开发平台,楼主趋向于windows,而有的网友却力挺linux,从我工作情况来看,国内的开发人员大多数只有在windows开发的经验,而国外的开发人员很多是在linux上使用C++的,所以在产品推广中,往往有要帮客户培养linux程序员的事,郁闷。而从我个人而言,我也对GNU提倡的开源代码的思想比较推崇,对于到了windowsAPI层就不得而入的情况,也比较觉得不爽。我的意思是:网上有人说linux下的C++程序员比 windows下的C++程序的工作收入要高许多,从我所见,那还真是事实。
  4:最后讲讲我领域,嵌入式开发,这也是我当初放弃C++开发而进入这个领域的原因,因为我觉得它很有魅力,我不会局限于CISC的intel X86的CPU上,在ARM,在象NIOS这样的软核上,RISC的CPU上你可以用HDL语言来设计硬件,用FPGA实现,你可以移植RTOS,甚至写一个自己的RTOS,虽然你没有能力设计一个通用的OS,但你通过对linux和其它RTOS的学习,来实现一个自己的RTOS也是可能的,并给他取个自己的名字,哈哈。在这个领域,你才理解以前学习的计算机体系结构,操作系统,编译原理有什么用,来吧,你用NIOS,用FPGA设计一个自己的CPU,用 ucos,或嵌入式linux或是自己的OS实现的一自己的RTOS,包括文件系统,网络协义,用lcc或gcc实现一个自己的编译器和汇编器,这样可以说你才算是比较了解什么叫“计算机”,哈哈,我有点瞎吹了,总之,最后我的意见是:welcome to embedded world.
   哎,王婆卖瓜,这儿写贴和回贴的都一个得性。
  
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值