第一篇:计算机学习心得
计算机学习心得体会
在未学习计算机之前,我从不知道它到底是干什么用的,为什么很多很多的人都要迫不及待的地要去学它,同时也有人陷入计算机的泥潭,不能自拔。自从我触摸到它的时候,即老师教给我们怎样使用计算机时,我才明白它的重要性。它涉及了生活的各个方面以及各个层次的人都离不开它,同时也明白了它的利与弊。
我在读小学的时候第一次接触计算机觉得很新鲜。我清晰的记得,当时有一个清晰的想法,那就是一定要学好计算机。但随着自己对电脑接触的不断深入,对计算机的认识越来越深,特别是刚进到高中,使用了各种办公软件,可是在设计和办公过程中,当遇到一些电脑系统出错导致文件成果丢失的突发问题时。我才深深地感受到自己计算机知识是多么的欠缺,自己终归不是学计算机专业的,对计算机知识的掌握都是零散的,对这些突发问题只能束手无策。于是我暗自发誓,无论如何,要学好计算机,但上高中是我忙于课业学习,没有足够的时间学习计算机知识。这一只是一个很大的遗憾,所以我在高中时就决定大学后一定要好好学习计算机知识,把落下的都补回来。
令我开心的是,大学计算机课时很多,我可以好好利用它来获取我想要的知识。在课堂上我用心听讲,认真做笔记。实践课上也好好练习,学到了很多新的知识。真的很值啊。
我对自己也提了很多要求,只为了学好知识,向全方位人才买件一步。
第二篇:计算机学习心得
计算机学习心得
“大学生计算机基础”是以培养学生计算机技能和信息化素养为目标,是后期课程学习的基础。由于小学初中时候的计算机课基本上是被略过甚至有的地区由于条件的限制根本就没有开设这门课程,而高中时没怎么要求计算机,而且高中我们的时间基本被课本的学习所占用。所以对于计算机的基础知识是了解很少。而以后我们作为教师虽然对计算机没有很高要求,但我们也应懂得计算机基础知识和应用。深知这个道理,所以在计算机的学习上,尤为注重。下面就简单地谈一下我自己学计算机的感感受:
一: 循序渐进
整个学习过程应采用循序渐进的方式,先了解计算机的基本知识,如计算机的起源、发展、windows操作系统、XP的桌面操作、电子表格等,使自己能由浅入深,由简到繁地掌握他们的使用技术。这是最好的学习模式,但是由于平时没那么多时间,但是最起码如计算机基本知识、windows系统、电子表格等必须掌握。
在这方面,老师的教学安排比较合理。可能也是考虑到我们的基础薄弱的问题,所以老师把计算机最基础的如计算机概述放在第一节课,让我们对计算机有个大概的了解。接着再讲windows XP 的一些基本概念,然后才把一些常用软件介绍给我们。虽说那些软件我们平时也在用,但是里面好多东西都不懂,经过老师讲解后方才知道那些软件还有很大的空间需要我们去专研。
计算机的理论课让我们认识到自身对电脑了解的匮乏,而实验课则让我们亲身体验摸索。如果老师讲授和实验操作同时进行的话会更好吧。因为很多时候我们会忘记老师讲的一部分内容,但这主要是我们学生自己的问题,毕竟下来复习不是很好。
二:学以致用
在学习时始终要与实际应用相结合。在课堂上学习后,老师给我们安排的自主学习周其实挺好的,那样能让我们自己去回想巩固老师所讲的内容,同时自己结合着老师说讲的去摸索,既能很好的记住又有了实质性的提高。只是需要花费的时间将会成倍增加。不过有得必有失就是这个道理吧。
对于网上学习计算机,因为里面有很多资源可以利用,还可以提问,这对于我们学生的学习是相当便捷的,不懂的可以随时提问,如我的电脑会莫名其妙地下载一些东西,但我自己又不知道什么原因,因此我发了一个帖子,后来得到老师的完美解答。或者自己在计算机平台上找相应资源,还能看到别的同学的提的问题,因为那些问题都是普遍存在的,也就能参考一下了。
就自己而言,如果我有不会的计算机知识,我会先在平台上收寻看有没有和自己类似的已解答的问题,有的话自然是好,如果都没有,我会发一个帖子,期待别人或者老师能给我解答。这样的学习方法,至少挺适合我自己的。这个平台不仅能提供我们解决问题的途径,还可以从别的同学那获得经验,避免犯一些不必要的错误。学习状态良好。
第三篇:计算机学习心得
大学学习学习心得
现在我已经大四将要毕业了,这个心得早就应该写,起码要半年前写,因为大四下学期的生活几乎没有给我带来任何的改观。在学习上,我几乎经历了该经历的(我这个年龄),这些学习中,只有大学的学习让我感到一种自主,一种无法形容的豁然开朗的感觉,是计算机改变了我,我也尽力去改变计算机的一切,尽管我知道这很难,但这是我的职责。
可以说,学习无论学什么都不会浪费,很明显的原因就是,计算机兼容了太多的学科,让你无法去想象,你可以提到任何一个,我都能说出计算机的作用。所以,如果有机会我们什么都要学,但不要盲目的学,因为你是学计算机专业的,要学的主要是计算机。
学计算机并兼有多方面知识的人才确实很少,这也难怪,上帝造人就是这样,要达到这一点,要付出很大的代价,需要一些机遇,我们只需要抓住自己所能创造的机遇就可以了。
说实话,具我了解,中国的计算机确实和国外差的太多,这是多方面原因的,一个就是人家发展60几年的计算机,被中国十几年搞定这显然是不可能的,中国人能比国外人聪明多少??中国计算机教育存在着严重弊端,初等教育和高等教育计算机完全脱轨,很多刚上大学的学生连计算机都没有摸过,更别说学了,四年期间的努力很难填补。还有就是,中国学生学习方向不明确,甚至没有目标。可以说很多大学生对自己的专业,在四年之间几乎什么都没有学到,而学到的是关系,更确切的说是人与人交往的关系,但这个学的还是有好有坏,确切一点就是混。当然,光靠专业实力来闯天下固然不行,那么那些生产力的发展就交给了有专业实力的人,所以中国高级人才少的很。
我处在中国软件萌芽的阶段,这阶段需要大量的人才,所以很多大学里没有学到东西的人(学习计算机的),也不用怕,几乎都能找到工作,也不会沦为底层人民,因为大家都这样,只是到公司的培训,有了突飞猛进的发展。这样短暂的学习永远成不了高手,虽然现在我不是个高手,但我可以这样说。
确实,如果你不是对计算机热爱的话,那它对你是枯燥的,什么都是,但为什么人们都对异性感兴趣呢??这确实值得研究,如果成功的话,这样可以改变一个人,会不会带来世界末日是另一码事。
我接触计算机(相对和我一届学生)可以所算是早的,但那时只是游戏,但我认为对我已经足够了,如果那时有计算机高手在我面前(这是个幻想,几乎不可能),那我可能就上不了大学了,整天沉迷于编程了,相对来讲,在中国大学学历大重要了,尤其是好的大学。我第一次接触计算机是在初中一年,大约九七年,那时还是DOS系统,是486,586流行时代,当时不知道486,586是什么,但大家都这么叫,而且都知道586比486快,而且要好,我上初三和高一阶段,1999年,开始有了windows95,那时都叫95网,这是从文字界面到图形界面的转换,我能感上这个,我是庆幸的,这使我对计算机的发展有很深的印象,当时也是处在游戏阶段,我从来没有想过做游戏,也没有想过怎么做。可以说我的童年是在电子游戏上度过的,在2000年,开始有了windows98,2002年我见到了windows me,可是直到我高中毕业我还是对计算机的基本操作还不会,原因很简单我只知道打游戏。我高三那年,是我对计算机编程的萌芽,它的出现,让我产生了极大的兴趣,也是游戏把我带动的,我要感谢文曲星,这样也许就是个上天的安排。当时文曲星cc800上有了QBASIC编译系统,而且有一些简单的系统函数,可以让编程者编写自己的程序,我从网上下载了几个游戏程序,那些代码都是公开的,而且可以修改,我对那些程序真的震惊了,虽然我不是很了解,但那些眼花缭乱的游戏开始画面,和动画效果,能在这么小的手掌机上做的这么好,我真的很佩服编程者,我查查一些基本画图函数,自己做了几个简单的动画,还不错,达到我想要的效果,尽管不是很难,但对我是个极大的鼓舞,我很兴奋。由于是高三阶段,面临高考,我也没有时间去学这个东西,我只能在他们编写的游戏中改改,我可以说他们已经做的很好了,我很佩服,有些知识现在我还没有接触到。
一年以后,我来到了大学,来学习计算机,其实大学里学习的主要是理论,实践要靠你自己,因为大学时间主要靠你自己支配,学不学是你自己的事情。理论很重要,它是你起飞的飞机场,实践就是你的双翼,他们要结合起来才可以,因为你飞的累了,还要在飞机场停下来歇歇,这就是你理论知识不足的时候。大学的8大专业课都重要的很,我们不能忽视任何一门,它们是计算机的基础。
下面我就把我从所学的每个专业课中获得的心得说一下。
数学:
刚到大学时,学习的心态还停留在高中,不知道为什么而学,学有什么用,这也是中国的特色吧!但到后期越深的课程,尤其是计算机图形学等很多课程都和数学是息息相关的,如果哲学排在所有学科的首位,那么数学就要排第二,它是那些我们看来比较变态的人,把世界的高度抽象,我经过考研后,和参加数学建摸辅导后确实对数学有些了解,但这只是很浅显的,真正的数学内涵离我遥遥无期,我试图把自己的思想和这条轨道靠拢,但始终很难达到。说实话,中国的教育是失败的,他过分强调知识的结果,不注重过程和起始,思维过程很重要,其实结果并没有它重要,思维的方式决定着一个人,从小就听人家说1+1=2,但为什么?从什么地方来去思考,怎么思考,却很少有人知道。我可能说的有点偏题,但这是重要的,也许是我说数学来把说思维模式引出来。在讲授思维时,这狠难,最根本的是,人们对思维还存在着争议,而且不同人的经历也多少要决定人的思维。我在这里只说学习上的思维。我认为人从一出生,就具有某种特长(这是相对的),也就是说在同等环境下的人学习(我们排除在这种学习以前的经历的影响,比如说学习音乐),一定会分出优劣,在大家都很努力的情况下。如果有音乐天赋的人,他不去努力,可能落后于努力而不具有天赋的人,所以勤奋出天才不假,但要用到自己具有天赋的一面,那必然事倍功半。天赋和兴趣不是一会事,但大多数人,能在有天赋中找到兴趣,在兴趣中而找不到天赋。所以在大学阶段,(在中国这种教育,高中阶段几乎不可能),在大多有自己支配的时间里,你要尽快找出自己的天赋,并发现这方面的兴趣。记住,你在这方面有天赋,不代表你在这方面比任何人都前,但你已经比很多人强,如果你很努力,你会走的更高。说了这么多,回来说数学,老师讲课很少讲数学的思维模式,虽然我不清楚真正的数学思维模式,但我很清楚老师一定没有讲,他也很难讲出来,因为很少有人知道牛顿看苹果落地,为什么会想出万有引力定律,而为什么我们不能。很多人说是牛顿爱思考的结果,这一点不假,但并不是每个爱思考的人能想到,很好问题就在这里,这就是我们跟人家的差别,因为思维的东西很难传授给别人,所以这样的高人很少,光靠他们留下的书是很难解决问题的。
离散数学:
离散数学包括很多章节,各个部分联系不是很大,而且各个学校的教材和所讲授的知识重点也不一样,但大体要讲的都是一样。我个人认为离散数学是最难的,最难的在图,群等,它们之所以难,是我们很难容入到那种神秘的思考方式,容入思考方式太难了,只有靠我们的感悟,因为这些真正很强的人真的寥寥无几,能指导我们的更是很少,我本人始终无法理解群的真正含义,我也没有去查什么相关资料,但我知道,再抽象的数学理论,都不是凭空想象的,它一定有它的现实基础,它的出现是有来历的。
数据结构:
数据结构是十分重要的学科,它完全是建立在实践的基础上,也就是说,你要多打代码。它在一定程度是依赖语言的。我很清楚的知道,第一遍学习数据结构,也就是几乎很少有实践的,大脑几乎一片空白,也是只有在考试前,反复的复习才知道在讲什么,只能手工的模拟执行过程,把算法转化成程序始终是个迷。但我认为这已经足够了,因为任何理论只有在理解它,你才能凌驾于它,所以接下来一个质的飞跃就靠自己,靠自己把那些算法变成代码,在自己有想法时,能够把这个想法用适当的数据结构实现,这需要在电脑旁的硬功夫,绝对是。一个高级的程序员,绝对是个硬功夫。这种把自己的想法变成代码,也是你独立思考的开始,记住思考很重要,他是你在捕捉你的灵感,善于思考的人,灵感来的很快,而且你的灵感会告诉你,对于它,你能把它做出来,这一切都是思考的结果,我不是个思想家,但我知道,我每天对世界万物的沉思,在指引着我发现那些太多的为什么的答案,这个世界为什么这个样子,它后面究竟隐藏着什么,让我们大胆的假设吧!多做程序的人,程序会改变你的思维,这绝对错不了。
语言:
我们一共学了四种语言,VB,C,C++,Java。VB的语法很简单,它确实是我练习算法的平台,它使我实现很多小游戏,对数据结构有了很深的了解,但我本人对VB不是很感兴趣,它只能做些小项目,因为它为大家提供的友好界面,阻挡了大家通往高级程序员的道路,它封闭了语言太多的细节和计算机的基理,使你对它的界面有太大的依赖。C是个纯面向过程的语言,它的语法不是很难,你用它大约一年半多左右,就完全可以掌握它,记住这需要你的实践,大家几乎学的都是潭浩强的书,这本书我开始认为很好,但我看了很多国外的书,和很多国外人所打的代码后,和国内高级程序员所说的话,我只能说这本书,只能是你的开端,但不能让你更深层次了解语言。但你要问我初学者用什么书,我还会介绍这本书。C的精髓在于指针,你能灵活运用指针就几乎等于你掌握了C语言,这是一种高效的语法支持,快的让你无法想象,我很有感触,在VB下要慢的多。C++是个很复杂的语言,你要完全了解它,要在C语言的基础上,我很少用C++,我相信我会攻克它的,也许很多人用C++,但了解它真正的机理估计不是很多,我看了C++ primer之后的感触,它确实很复杂,也是这本书太深入了,了解一门语言,少了编译知识确实不行。
编译原理:
其实编译原理和汇编,操作系统,语言都是紧密相关的,编译器是在操作系统之上,语言之下。在讲编译器时,除了讲编译源程序成目标程序外,还介绍了很多地方都用到的自动机理论,这个也很重要。在人工智能,很多分析语法,文字类的东西都很重要。编译原理和语言是相辅相成的,只学语言不学编译,无法真正的了解语言,而编译器是在语言基础上的,没有语言的了解更学不了编译,现在大多数高校的编译原理讲的语言都是基于面向过程的,但我认为足够了,你真正的理解了编译所讲的东西,自己在深入学习面向对象的语言,你一定会很好的把握面向对象的编译过程,很好的掌握面向对象语言,在语义分析过后的中间代码生成和动态存储空间分配,和汇编有很大的联系,我在学习汇编时,总是先把要求的题目写成C语言,在转化成汇编语言,这就是不知不觉的一种中间代码生成,虽然不完全一样,但让你掌握中间代码生成已经足够了。动态存储空间分配,主要基于指针所指向的动态空间。因为非指针的变量在编译时就已经有内存分配了,这也是编译要做的事。
汇编:
大多数学的都是8086,编译器我推荐用TD,很好的开发环境。作程序调试是最主要的,没有作过程序的人是想不到调试是多么难,好的开发环境有助于有效的开发程序。个人认为,学习汇编要和计算机组成联系起来,主要是指令系统,讲CPU时的知识。汇编是最低级的,最快的语言了,有时为了运行速度不得不用汇编来实现想要的功能,我认为对汇编的掌握程度,只要你能做出个递归函数就可以了,你了解了很多指令用法,寄存器的使用,计算机存储数据和代码的方式,函数调用的方式,栈是怎么实现函数的,你会有很深刻的发展,相信我没错的,一定要上机实现一个递归函数,再加上你对C语言的了解,和一些编程知识,你就可以摆平几乎所有的汇编程序了。
数据库
我在大学里没有接触过太大的项目,而且平常编程对数据库深入不多,只是达到了做网上书店所要求的基本知识,首先是ER图,各种范式,还有数据流图,怎么用语言插入数据,删除,查找等等,实际上,你要不是搞理论的,深到数据的具体存储效率的级别,我想这些对于编程就足够了,但对于高级的数据库程序员这些是不够的。
计算机组成
对于学习汇编和C语言这个其实很重要,因为这些语言还没有屏蔽这些硬件细节,VB就几乎完全屏蔽了硬件细节,你不需要了解太多的硬件知识。但学习汇编和C语言并不是要你了解到能作出CPU和连接存储器,我们只要知道他们的运行机理,但有一点你不要怀疑,那就是电信号他就是那样有趣,有趣到你无法想象它的速度和高低电平的传递,但是事实就是这样,你不需要怀疑,承认它就好了,因为我们还不能解释规律,只能运用它一样。原理对软件程序员就应该足够了,它会使你更加容易了解操作系统和硬件的工作。
操作系统
大家每个人对操作系统都不陌生,所有的计算机的课程几乎都是息息相关的,他们都有太多的联系,有些你可能迷茫,当所有的学完以后,你应该有个豁然开朗的感觉,那就是计算机的一切不应该是个迷。操作系统和硬件的接口,就是那些硬件提供的指令,通过这些指令来操作硬件,就象操作系统定义一样,他是管理系统资源的,管理硬件的使用,你在学习操作系统时,把它看成一个管理者就可以了,它是一个有着自己管理方法的管理者,管理这些硬件给每个进程使用,进程说白了就是一个应用程序在内存中或在外存中,有着运行权利的程序。现在的操作系统是多任务的,可以运行多个程序,并发是指单个CPU而言,每个进程在CPU中轮流执行,因为它太快了,你根本感觉不到他们的交替性,就象在同时运行,大多数教材讲并发比较多,我们大多数计算机都是单CPU的,具体怎么交替运行,那就是操作系统管理进程使用硬件的方法,不同的操作系统方法不同,但你的方法不要让其中的一个进程总是得不到想要的硬件使用(活锁或饥饿),但想出个好办法还不发生死锁(这里不说什么是死锁了,我毕竟不是再讲操作系统)也很难,总之,你要学的就是这些方法,这里说的是管理CPU,还有管理内存,外设等等。我在给出进程定义时,还说了外存,其实通常就指硬盘,因为你的内存太小,运行的程序又多,我要为了让其他的程序运行,只能先把它放在外存,也叫挂起。总之,你学的就是管理硬件的方法,怎么管理才能有效率,方便用户使用。如果可以,你也可以设计一套管理方法,那你就作出了一个新的操作系统。
计算机网络
所有和硬件有关的最后一个,说实话计算机网络很杂,你学第一遍后,把网络7层所有管理方法说出个查不多,很难,大多数学生都是晕头转向,网络是个很庞大的系统,它从硬件到软件,被规定了很正规的完整体系,这样大家都遵照这个规则才能,使每个人开发出的软件和硬件都可以用。记住计算机的交互就象人与人的交互,它通过0和1来代替人的语言,表情或所有可以可以传达信息的东西,也可以说是计算机通信的暗号,只有双方都知道了这个暗号的含义,双方才能通信,你和另一个人怎么通信,那么计算机和另一个计算机就怎么通信。例如:我想给你一个礼物(计算机看成我要给你发送数据,A发给B),我要先通知你,看你能不能收(这符合人的交往)(A发给B一个0和1组成的编码,事先两台计算机已经规定好了,比如说10010011代表看对方是否能接受),如果这个请求不丢失的话(丢失有很多处理方法,你自己也可以想一个处理方法,比如隔一端时间你没有收到对方是否同意接受,你就重发信息,总之,只要你肯想象,任何都是可能的),(1)对方发送一个可以接受的消息(比如说10010012),你收到了,你就可以发送,发送途中又有很多情况,比如说,你怎么发送,作车,还是徒步,如果交通堵了怎么办,是把礼物一起送过去,还是分开送过去,等等,具体到网络里是快速发送,分开发送,我们学的就是这些方法。(2)对方发送个不能接受的信息,你是还要立即发送,还是不发,还是等一会在发,这些方法很活,你要学的就是这些方法,如果你可以处理网络中出现的任何问题,你不学它也可以。我要告诉你的是,你要学的就是就是通信协议(就是实现规定好的暗号),通信方法,出现问题怎么处理等,你有好的方法,你可以不学了,很简单,方法就是人发现的,你比它的好,学它的干什么,就用你的。
软件工程 软件工程是从实践中总结的经验,对于很少做过项目的大学生来说,确实很难理解,只要你作过一些项目,比如网上书店之类的系统,你就会有些了解,它说的很对,我很清楚的记得软件工程分这几个过程:(1)可行性研究,也就是你要做的这个系统可行不,是否值得去做,做了能得多大效益。(2)总体分析,这个就是从整体来规划你要作的系统,只是个概况,并没有详细的阶段,把系统大体分成几个模块。(3)详细分析,这个阶段就是来详细每个模块,把所有的细节都要写好。(4)程序编码(5)测试(6)售后服务。
每个过程有分很多规范,因为一个项目很多人做,很多公司做,没有个很好的规范会乱套的,所以最后很容易合在一起。
我上面所介绍的都是最基础的,只要你掌握这些,学任何计算机的东西都不成问题,关键一个字那就是思想,也许有些具体你忘记了,但思想你会永远记住,你会看的时候也会很简单,和别人讨论时你也知道他们在说什么。
记住的是一定要在思想上有飞跃,学会思考,你的灵感会让你抓住问题的突破口,凡事多问为什么,原因在何处,怎么才能解决,至于怎么才能到达这个境界,我没有什么太多的高招,因为我也不是什么高手,最直接的就是,多看书,多思考,多练习写程序,要在理解的基础上,抛开所有的别人写过的模板写出自己的想法,自己的程序,如果你参考别人的,那么你知识在量上有飞跃,质上根本没有飞跃,即使你方法很苯,你把它实现了,那你也是成功的,因为你挑战了自己,你在思想上有了飞跃,表面上你没人家做的好,那是他有现成的代码可以使用,当没有现成的代码时,你的想象力就发挥了作用,思考和想象高于一切,你的内心得到了升华,你有好的新方法现在就比那些旧的方法好,所以创新很重要,是勤于思考的人的专利,不要死记公式,要问问公式的来源,什么都要弄懂,为什么书上这么讲,死记不如不记,死记只能得到眼前的利益,人成功不就在于要长远的考虑吗??
我认为多学学哲学逻辑学,对人的大脑思维很有帮助的,我说的哲学并不是专指马克思哲学,很多种,他们都有可以借鉴的一面,如果你站在任何一个立场去思考问题,你就会觉得他们似乎说的都有道理,就因为有些人立场不同,才发生的冲突。思想教育是最重要的,也是最难的,尤其学习上的思想境界,很难用语言来沟通,要靠自己勤奋的练习,多加的思考,还记得我说金庸的武狭小说吗??那里的功夫学习和这里说的学习就是一样的。
第四篇:计算机学习心得
计算机科学与技术学习心得
原先不管是国内还是国外都喜欢把这个系分为计算机软件理论、计算机系统、计算机技术与应用。后来又合到一起,变成了现在的计算机科学与技术。我一直认为计算机科学与技术这门专业,在本科阶段是不可能切分成计算机科学和计算机技术的,因为计算机科学需要相当多的实践,而实践需要技术;每一个人(包括非计算机专业),掌握简单的计算机技术都很容易(包括原先Major们自以为得意的程序设计),但计算机专业的优势是:我们掌握许多其他专业并不“深究”的东西,例如,算法,体系结构,等等。非计算机专业的人可以很容易地做一个芯片,写一段程序,但他们做不出计算机专业能够做出来的大型系统。今天我想专门谈一谈计算机科学,并将重点放在计算理论上。
在我大一时无意中找到了南京大学网友sir的帖子“胡侃(理论)计算机学习”,这个帖子对我大学学习起到了至关重要的指导作用,我在这篇文章成文的时候正是基于sir的文章做得必要的补充和修改,并得到了sir的支持。再有就是每次和本系司徒彦南兄的交谈,都能从中学到很多东西,在这份材料中也有很多体现。这份材料是我原来给学弟学妹们入学教育的讲稿之一,原有基础上改进了其中我认为不太合适的理论,修正了一些观点,在推荐教材方面结合我的学习情况有了较大改变。值得一提的是增加了一些计算机理论的内容,计算机技术的内容结合我国的教学情况和我们学习的实际情况进行了重写。这里所作的工作也只是将各位学长和同学们的学习体会以及我在学习计算机科学时的所思所想汇总在一起写了下来,很不成熟。目的就是希望能够给一些刚入学或者是学习计算机科学还没有入门的同学以一些建议。不期能够起到多大的作用,但求能为同学们的学习计算机科学与技术带来微薄的帮助。还是那句话,计算机科学博大精深,我只是个初学者,不当之处希望大家批评指正。
1、计算机理论的一个核心问题--从数学谈起:
[1]高等数学Vs数学分析
记得当年大一入学,每周四课时高等数学,天天作业不断(那时是七天工作制)。颇有些同学惊呼走错了门:咱们这到底念的是什么系?不错,你没走错门,这就是计算机科学与技术系。我国计算机科学系里的传统是培养做学术研究,尤其是理论研究的人(方向不见得有多大的问题,但是做得不是那么尽如人意)。而计算机的理论研究,说到底了,如网络安全学,图形图像学,视频音频处理,哪个方向都与数学有着很大的关系,虽然也许是正统数学家眼
里非主流的数学。这里我还想阐明我的一个观点:我们都知道,数学是从实际生活当中抽象出来的理论,人们之所以要将实际抽象成理论,目的就在于想用抽象出来的理论去更好的指导实践,有些数学研究工作者喜欢用一些现存的理论知识去推导若干条推论,殊不知其一:问题考虑不全很可能是个错误的推论,其二:他的推论在现实生活中找不到原型,不能指导实践。严格的说,我并不是一个理想主义者,政治课上学的理论联系实际一直是指导我学习科学文化知识的航标(至少我认为搞计算机科学与技术的应当本着这个方向)。
其实我们计算机系学数学仅学习高等数学是不够的(典型的工科院校一般都开的是高等数学),我们应该像数学系一样学一下数学分析(清华计算机系开的好像就是数学分析,我们学校计算机学院开的也是,不过老师讲起来好像还是按照高等数学讲),数学分析这门科学,咱们学计算机的人对它有很复杂的感情。在于它是偏向于证明型的数学课程,这对我们培养良好的分析能力和推理能力极有帮助。我的软件工程学导师北工大数理学院的王仪华先生就曾经教导过我们,数学系的学生到软件企业中大多作软件设计与分析工作,而计算机系的学生做程序员的居多,原因就在于数学系的学生分析推理能力,从所受训练的角度上要远远在我们平均水平之上。当年出现的怪现象是:计算机系学生的高中数学基础在全校数一数二(希望没有冒犯其它系的同学),教学课时数也仅次于数学系,但学完之后的效果却不尽如人意。难道都是学生不努力吗,我看未见得,方向错了也说不一定,其中原因何在,发人深思。
我个人的浅见是:计算机系的学生,对数学的要求固然跟数学系不同,跟物理类差别则更大。通常非数学专业的所?quot;高等数学“,无非是把数学分析中较困难的理论部分删去,强调套用公式计算而已。而对计算机系来说,数学分析里用处最大的恰恰是被删去的理论部分。说得难听一点,对计算机系学生而言,追求算来算去的所谓”工程数学“已经彻底地走进了误区。记上一堆曲面积分的公式,难道就能算懂了数学?那倒不如现用现查,何必费事记呢?再不然直接用Mathematica或是Matlab好了。退一万步讲,即使是学高等数学我想大家看看华罗庚先生的《高等数学导论》也是比一般的教材好得多。华罗庚在数学上的造诣不用我去多说,但是他这光辉的一生做得我认为对我们来说,最重要的几件事情:首先是它筹建了中国科学院计算技术研究所,这是我们国家计算机科学的摇篮。在有就是他把很多的高等数学理论都交给了
做工业生产的技术人员,推动了中国工业的进步。第三件就是他一生写过很多书,但是对高校师生价值更大的就是他在病期间在病床上和他的爱徒王元写了《高等数学引论》(王元与其说是他的爱徒不如说是他的同事,是中科院数学所的老一辈研究员,对歌德巴赫猜想的贡献全世界仅次于陈景润)这书在我们的图书馆里居然找得到,说实话,当时那个书上已经长了虫子,别人走到那里都会闪开,但我却格外感兴趣,上下两册看了个遍,我的最大收获并不在于理论的阐述,而是在于他的理论完全的实例化,在生活中去找模型。这也是我为什么比较喜欢具体数学的原因,正如我在上文中提到的,理论脱离了实践就失去了它存在的意义。正因为理论是从实践当中抽象出来的,所以理论的研究才能够更好的指导实践,不用于指导实践的理论可以说是毫无价值的。
我在系里最爱做的事情就是给学弟学妹们推荐参考书。没有别的想法,只是希望他们少走弯路。中文的数学分析书,一般都认为以北大张筑生老师的”数学分析新讲“为最好。张筑生先生一生写的书并不太多,但是只要是写出来的每一本都是本领域内的杰作,这本当然更显突出些。这种老书看起来不仅是在传授你知识,而是在让你体会科学的方法与对事物的认识方法。万一你的数学实在太好,那就去看菲赫金哥尔茨?quot;微积分学教程”好了--但我认为没什么必要,毕竟你不想转到数学系去。吉米多维奇的“数学分析习题集”也基本上是计算型的书籍。书的名气很大,倒不见得适合我们,还是那句话,重要的是数学思想的建立,生活在信息社会里我们求的是高效,计算这玩意还是留给计算机吧。不过现在多用的似乎是复旦大学的《数学分析》,高等教育出版社的,也是很好的教材。
中国的所谓高等代数,就等于线性代数加上一点多项式理论。我以为这有好的一面,因为可以让学生较早感觉到代数是一种结构,而非一堆矩阵翻来覆去。这里不得不提南京大学林成森,盛松柏两位老师编的“高等代数”,感觉相当舒服。此书相当全面地包含了关于多项式和线性代数的基本初等结果,同时还提供了一些有用的又比较深刻的内容,如Sturm序列,Shermon-Morrison公式,广义逆矩阵等等。可以说,作为本科生如能吃透此书,就可以算是高手。国内较好的高等代数教材还有清华计算机系用的那本,清华出版社出版,书店里多多,一看就知道。从抽象代数的观点来看,高等代数里的结果不过是代数系统性质的一些例子而已。莫宗坚先生的《代数学》里,对此进行了深刻的讨论。然而莫先生的书实在深得很,作为本科生恐怕难以接受,不妨等到自己以后成熟了一些再读。
正如上面所论述的,计算机系的学生学习高等数学:知其然更要知其所以然。你学习的目的应该是:将抽象的理论再应用于实践,不但要掌握题目的解题方法,更要掌握解题思想,对于定理的学习:不是简单的应用,而是掌握证明过程即掌握定理的由来,训练自己的推理能力。只有这样才达到了学习这门科学的目的,同时也缩小了我们与数学系的同学之间思维上的差距。
[2]计算数学基础
概率论与数理统计这门课很重要,可惜大多数院校讲授这门课都会少些东西。少了的东西现在看至少有随机过程。到毕业还没有听说过Markov过程,此乃计算机系学生的耻辱。没有随机过程,你怎么分析网络和分布式系统?怎么设计随机化算法和协议?据说清华计算机系开有“随机数学”,早就是必修课。另外,离散概率论对计算机系学生来说有特殊的重要性。而我们国家工程数学讲的都是连续概率。现在,美国已经有些学校开设了单纯的“离散概率论”课程,干脆把连续概率删去,把离散概率讲深些。我们不一定要这么做,但应该更加强调离散概率是没有疑问的。这个工作我看还是尽早的做为好。
计算方法学(有些学校也称为数学分析学)是最后一门由数理学院给我们开的课。一般学生对这门课的重视程度有限,以为没什么用。不就是照套公式嘛!其实,做图形图像可离不开它,密码学搞深了也离不开它。而且,在很多科学工程中的应用计算,都以数值的为主。这门课有两个极端的讲法:一个是古典的“数值分析”,完全讲数学原理和算法;另一个是现在日趋流行的“科学与工程计算”,干脆教学生用软件包编程。我个人认为,计算机系的学生一定要认识清楚我们计算机系的学生为什么要学这门课,我是很偏向于学好理论后用计算机实现的,最好使用C语言或C++编程实现。向这个方向努力的书籍还是挺多的,这里推荐大家高等教育出版社(CHEP)和施普林格出版社(Springer)联合出版的《计算方法(Computational Methods)》,华中理工大学数学系写的(现华中科技大学),这方面华科大做的工作在国内应算是比较多的,而个人认为以这本最好,至少程序设计方面涉及了:任意数学函数的求值,方程求根,线性方程组求解,插值方法,数值积分,场微分方程数值求解。李庆扬先生的那本则理论性过强,与实际应用结合得不太紧,可能比较适合纯搞理论的。
[3]也谈离散数学
每个学校本系里都会开一门离散数学,涉及集合论,图论,和抽象代数,数理逻辑。不过,这么多内容挤在离散数学
一门课里,是否时间太紧了点?另外,计算机系学生不懂组合和数论,也是巨大的缺陷。要做理论,不懂组合或者数论吃亏可就太大了。从理想的状态来看,最好分开六门课:集合,逻辑,图论,组合,代数,数论。这个当然不现实,因为没那么多课时。也许将来可以开三门课:集合与逻辑,图论与组合,代数与数论。(这方面我们学校已经着手开始做了)不管课怎么开,学生总一样要学。下面分别谈谈上面的三组内容。
古典集合论,北师大出过一本《基础集合论》不错。
数理逻辑,中科院软件所陆钟万教授的《面向计算机科学的数理逻辑》就不错。现在可以找到陆钟万教授的讲课录像,http://里可以按编号下载RFC文档。从IP的读起。等到能掌握10种左右常用协议,就没有几个人敢小看你了。再做的工作我看放在网络设计上就比较好了。
数据结构的重要性就不言而喻了,学完数据结构你会对你的编程思想进行一番革命性的洗礼,会对如何建立一个合理高效的算法有一个清楚的认识。对于算法的建立我想大家应当注意以下几点:
当遇到一个算法问题时,首先要知道自己以前有没有处理过这种问题.如果见过,那么你一般会顺利地做出来;如果没见过,那么考虑以下问题:
1.问题是否是建立在某种已知的熟悉的数据结构(例如,二叉树)上?如果不是,则要自己设计数据结构。
2.问题所要求编写的算法属于以下哪种类型?(建立数据结构,修改数据结构,遍
历,查找,排序...)3.分析问题所要求编写的算法的数学性质.是否具备递归特征?(对于递归程序设计,只要设计出合理的参数表以及递归结束的条件,则基本上大功告成.)
4.继续分析问题的数学本质.根据你以前的编程经验,设想一种可能是可行的解决办法,并证明这种解决办法的正确性.如果题目对算法有时空方面的要求,证明你的设想满足其要求.一般的,时间效率和空间效率难以兼得.有时必须通过建立辅助存储的方法来节省时间.5.通过一段时间的分析,你对解决这个问题已经有了自己的一些思路.或者说,你已经可以用自然语言把你的算法简单描述出来.继续验证其正确性,努力发现其中的错误并找出解决办法.在必要的时候(发现了无法解决的矛盾),推翻自己的思路,从头开始构思.6.确认你的思路可行以后,开始编写程序.在编写代码的过程中,尽可能把各种问题考虑得详细,周密.程序应该具有良好的结构,并且在关键的地方配有注释.7.举一个例子,然后在纸上用笔执行你的程序,进一步验证其正确性.当遇到与你的设想不符的情况时,分析问题产生的原因是编程方面的问题还是算法思想本身有问题.8.如果程序通过了上述正确性验证,那么在将其进一步优化或简化。
9.撰写思路分析,注释.对于具体的算法思路,只能靠你自己通过自己的知识和经验来加以获得,没有什么特定的规律(否则程序员全部可以下岗了,用机器自动生成代码就可以了).要有丰富的想象力,就是说当一条路走不通时,不要钻牛角尖,要敢于推翻自己的想法.我也只不过是初学者,说出上面的一些经验,仅供大家参考和讨论。
关于人工智能,我觉得的也是非常值得大家仔细研究的,虽然不能算是刚刚兴起的学科了,但是绝对是非常有发展前途的一门学科。我国人工智能创始人之一,北京科技大学涂序彦教授(这老先生是我的导师李小坚博士的导师)对人工智能这样定义:人工智能是模仿、延伸和扩展人与自然的智能的技术科学。在美国人工智能官方教育网站上对人工智能作了如下定义:Artificial Intelligence, or AI for short, is a combination of computer science, physiology, and philosophy.AI is a broad topic, consisting of different fields, from machine vision to expert systems.The element that the fields of AI have in common is the creation of machines that can “think”.这门学科研究的问题大概说有:
(1)符号主义: 符号计算与程序设计基础,知识表达方法 :知识与思维,产生式规则,语义网络,一阶谓词逻辑问题求解方法:搜索策略,启发式搜寻,搜寻算法,问题规约方法,谓词演算:归结原理,归结过程专家系统:建立专家系统的方 法及工具
(2)联接主义(神经网络学派):1988年美国权威机构指出:数据库,网络发展呈直线上升,神经网络可能是解决人工智能的唯一途径。关于神经网络学派,现在很多还是在发展阶段。
我想对于人工智能的学习,大家一定不要像学数学似的及一些现成的结论,要学会分析问题,最好能利用程序设计实现,这里推荐给大家ACM最佳博士论文奖获得者涂晓媛博士的著作《人工鱼-计算机动画的人工生命方法》(清华大学出版社)。搞人工生命的同学不会不知道国际知名的涂氏父女吧。关于人工智能的书当然首选《Artificial Intelligence A New Synthesis》Nils J.Nilsson.鼻祖嘛!
关于网络安全我也想在这里说两句,随着计算机技术的发展,整个社会的信息化水平突飞猛进,计算机网络技术日新月异,网络成了当即社会各个工作领域不可缺少的组成部分,只要有网络存在,网络安全问题就是一个必须解决好的问题,学习网络安全不是简简单单的收集一些黑客工具黑一黑别人的网站,而是要学习他的数学原理,实现原理,搞清底层工作机制,这样才能解决大部分的现有问题和新出现的安全问题。总的来说信息安全学的研究还是非常深奥的,这方面体会比较深的要算是在最近的微软杯程序设计大赛中利用.NET平台开发的那个项目My E-business Fairy.NET过程中了。
[3]闲聊软件工程 关于计算机科学的一些边缘科学我想谈一谈软件工程技术,对于一个企业,推出软件是不是就是几个程序员坐在一起,你写一段程序,我写一段程序呢?显然不是。软件工程是典型的计算机科学和数学,管理科学,心理学,社会学等学科的综合。它使我们这些搞理论和技术的人进入了一个社会。你所要考虑的不仅仅是程序的优劣,更应该考虑程序与软件的区别,软件与软件产品的区别,软件软件产品的市场前景,如何去更好的与人交流。这方面我还在学习阶段,以后这方面再写文章吧,先推荐给大家几本书:畅销20年不衰的《人月神话》(清华大学中文版,中国电力出版社影印版),《软件工程-实践者研究的方法》(机械工业出版社译本),《人件》(据说每一位微软公司的部门经理都读过这本书,推荐老总们和想当老总的同学都看看,了解一下什么是软件企业中的人)以及微软公司的《软件开发的科学与艺术》和《软件企业的管理与文化》(研究软件企业的制胜之道当然要研究微软的成功经验了!)看完上面的书,结合自己做的一些团队项目,我的一些比较深的体会有这么几点
1.How important a plan is for a project development.2.How to communicate with your team members in a more effective way.3.How to
solve unexpected situations.4.The importance of unification.5.The importance of doing what you should do.6.The importance of designing before programming.7.The importance of management.8.The importance of thinking what your teammates think.在软件开发过程中我们应当具有以下能力:
1.Like it if you would like to do it.We believe that your attitude toward your work will definitely makes great effect on the project.2.The spirit of group working.Take myself as an example.I am just a part of the team, just a little part.You must make it clear that you are just a member of the team, but your effort will change your project a lot.3.Passion
With passion, you can do your job in a more effective way.4.The ability of solving unexpected problems.5.Learning New things in a very short time
It is the basic requirement for we computer major to learn new technology.6.Creativity
The tools are changing.As for us, what's more important is to use these new tools and technology to enable people and businesses throughout the world to realize their full potential.7.The ability to do your work independently.Every member has his own business.In a team, your work cannot be replaced by others' so you must do your business well in order to assure the project development process.团队开发当中的一些具体精神应当有:
<1> Success and Failure is not one person's effect.Your team's success is not the contribution of a single person.Success contributes to the whole team.If your project failed, it also is not just because of one person's poor work.It is also your failure.<2> Learn from each other.Every person has his own specialty.Even Bill Gates cannot know all the things about software development.We often learn from each other and gains a lot.The old saying goes like this:
There must be one out of three who can be your teacher.In our team we say: Every person is your teacher.<3> Help those who have problems.Use the group working spirit to overcome all the difficulties.There is no need to explain it.As the old saying: Two heads are better than one.We always find it difficult to solve all the problems just by oneself.<4> Praise them who have got some improvement.In our team, I always praise the members when they have finished something or just solved one problem, and they think that it is interesting and gains a lot.Because they can see their efforts.<5> Say something if needed.这个是一次软件大赛当中的体会,和大家也做个交流,不过不能再说了,软件工程学说起来写本2000页的书一点也不多,恕我才疏学浅,不再做过多论述了。[4]谈谈学习态度的问题
关于计算机技术的学习我想是这样的:学校开设的任何一门科学都有其滞后性,不要总认为自己掌握的某门技术就已经是天下
无敌手了,虽然现在Java,VB,C,C++用的都很多,怎能保证没有被淘汰的一天,我想.NET平台的诞生和X#语言的初见端倪完全可以说明问题。换言之,在我们掌握一门新技术的同时就又有更新的技术产生,身为当代的大学生应当有紧跟科学发展的素质。举个例子,就像有些同学总说,我做网页设计就喜欢直接写html,不愿意用什么Frontpage,Dreamweaver。能用语言写网页固然很好,但有高效的手段你为什么不使呢?仅仅是为了显示自己的水平高,unique? 我看真正水平高的是能够以最快的速度接受新事物的人。高级程序设计语言的发展日新月异,今后的程序设计就像人们在说话一样,我想大家从xml中应是有所体会了。难道我们真就写个什么都要用汇编,以显示自己的水平高,真是这样倒不如直接用机器语言写算了。反过来说,想要以最快的速度接受并利用新技术关键还是在于你对计算机科学地把握程度。当然有一点我们必须指出,就是对于新技术要辩证得看,不能盲从。
计算机技术牵扯的内容更为广泛些,一项一项说恐怕没个一年半载也说不清。我只想提醒大家的还是那句话,技术与科学是不能分家的,学好了科学同时搞技术,这才是上上策。犹如英语,原先人们与老外交流必须要个翻译,现在满马路的人都会说英语。就连21世纪英语演讲比赛的冠军都轮不到英语系的学生了。计算机也是一样的,我们必须面对的一个现实就是:计算机真就只是一个工具,如果不具备其它方面的素养,计算机系的学生虽然不能说找不到工作,不过总有一天当其他专业性人才掌握了计算机技术后将比我们出色许多。原因就在于计算机解决的大都是实际问题,实际问题的知识却是我们少有的。单一的计算机技术没有立足之地。
我想是时候指出:学习每一个课程之前,都要先搞清这一课程的学习目的。这一学科的应用领域。据我自身所了解到的同龄同学和低年级的同学的学习状况:他们之中很少有人知道学一个学科的学习目的,期末考试结束了也不知道学这科做什么用。这就失去了读计算机科学的意义。当然这与现存的教育思想不能说一点关系都没有。
总的来说,从教育角度来讲,国内高校的课程安排不是很合理,强调理论,又不愿意在理论上深入教育,无力接受新技术,想避开新技术又无法避得一干二净。我觉得关键问题就是国内的高校难于突破现状,条条框框限制着怎么求发展。我们虽然认识得到国外教育的优越性,但为什么迟迟不能采取行动?哪怕是去粗取精的取那么一点点。我们需要改变。从我们自身角度来讲,多数人4年下来既没有学习计算机科学 的学术水平,也没有学习计算机技术的那种韧劲。在我刚上大一时,我的计算机科学入门导师,淮北煤炭师范学院王爱平教授曾经对我说过这样一番话:“当你选择了计算机这一门科学,就意味着你踏上了一条不归路,就意味着你一生都要为之奋斗……你的身后是悬崖,只有向前走,不能往后退。”
有些同学说按照这样学习学的东西太多,有的未见得有用,我想打个形象的比方:学校学出来的人都是一个球体,方方面面的知识都应具备。可是社会上需要球体的地方很少,反而需要的是砖和瓦,即精通某一行的人才。但是对于同等体积的物体,用球体来改造是最方便最省事的。学校的学生很多,为了能够使更多的学生来适应这个社会,学校也就不得以把所有的学生都打造成一个球体,然后让社会对这些学生进行再加工,成为真正能够有用的人才。即使你非常清楚自己的将来要干什么,并且非常下定决心要走自己的路,这一步你也必须走,世界是在不断变化的,你不能预料未来。想清楚,努力去干吧!
计算机科学博大精深,我只是个初学者。前面的路还长,计算机科学需要我们为之奋斗......学习计算机科学需要韧性,更需要创新,需要激情。深刻学习理论知识,勇于接受新技术的挑战,这才是我们这一代人应具有的素质。最后送大家一句话“Wake up every day with a feeling of passion for the difference technology will make in people's life!”。
第五篇:计算机学习心得
我个人的这种自以为c语言很牛逼的美梦在,大一下学期的一次偶然比赛后完全破灭。(−_−#)(记得那会儿大一除了c语言其他都是基础课(比如:工程制图,高数,英语等),和计算机基本没一点关系。)
还记得,正在我沉醉自己的小天地时,那个大一下学期开学,一个同学喊我去参加一个校内编程比赛。当时满怀着胜利信心去参加了比赛。结果。。大家都猜到了,初赛做了一到巨简单题目,然后。。复赛。。一道题没做出来。更惨的说应该是:一道题都不会做,最后自己无聊的看着对面的一个mm敲码。。再后来才知道是我们学校acm基地,准备纳新举行的一个比赛。并且由于急需纳新,那次题目出的是巨简单。
悲催的我比完赛后,失败了!却还不知道为什么??!。。
后来我郁闷一个星期后,在同学中介绍中,进入了当时认为”高手如云”的acm基地。
附:当时自己的水平:计算机只懂c语言,c语言只会些一些打印,简单几乎无循环的,无指针的,100行左右代码。编译基本自己搞定。逻辑错误?基本没什么逻辑的程
随后acm学习,就简单说说。记得当大家还都在迷茫中,或忙于考软件资格证,计算机二级证,或忙于网络游戏,或忙于学习其他专业的知识的时候。自己不顾外面的一切,每天和其他认真上自习室的同学一样,早起晚归得沉醉在acm中。
在acm基地,开始学习并巩固了,计算机数据结构,计算机算法,组合数学等知识,并不停的写码!在基地我一直这样坚持了两年多吧(知道二流学校的acm的艰苦的同学可能体会到,这其中的不易),到最后整个基地的同学仍坚持学习在前线的就只有我一人。于是也很自然的,我在学校acm系统中,排在了第一。虽然如此,但是越学我也越清楚这个算法的水有多深,也逐渐意识到外面高手真的如云,而且他们的高度,并不是自己所能赶上的。也意识到了,在算法前进的路上我的最大的阻碍是:数学!!而更悲剧的是,就我自己的自学能力,再加上学校数学老师不怎么给力。很难在段时间内弥补自己的这方面的缺陷。
所以大三下学期,我退出了acm,进入了实验室,做java的小项目。
在这两三年里,除了acm还有一些是计算机基础知识让我对计算机认识更深。
汇编语言让我明白了,计算机的计算机制,学完汇编,于是当我不确定c中某种结果时:我知道将c语言编成汇编语言,然后对比差别。通过反汇编理解指针,数组等类似问题差异和区别。
计算机组成原理,操作系统,不仅认识到为什么乘法会比加法费时的原因,内存存取方式,调度,分页等等。同时也就明白如何在c语言上进行这些细微底层的调优。软件工程,则告诉我如何去大规模的程序开发的基本设计思想。自己并运用到一些课程设计中去。
于此同时平时也更多的关注了,网上出现的各种c语言本身讨论的一些问题。这其中有,c混乱代码,类似这种他编译器中的float的一个问题,c绘图,了解关注类似于结构体最后定义一个char[1]的这种奇技淫巧。于是针对c语言本身的书籍和资料,比如:≪c专家编程≫、≪c缺陷与陷阱≫。
附:个人此时水平:语言基本只会c语言和汇编语言;c语言100、200行的代码写完后基本没有编译错误,最长c代码4000多行。c语言指针操纵多级的内存动态申请维护;内存泄漏,程序崩溃自己可以独立较快解决。
汇编语言,分文件设计,3000行,自己完成所有编写,和调试。(目前基本没用,很多忘了,呵呵~)
小界面,windows编程基本不懂。所以被当时同学鄙视了:你有什么牛的?也就时一些,黑屏的数字。
到了这个时候,可以说目前(也就是工作两年后)我找到的这份工作很大一部分还要归功与acm!因为在第一份工作,我基本没有用到任何可以算上算法的算法,和算上数据结构的数据结构。(小道消息:这个工作的社招比例:1:20),好了。后面可能还会提到acm。
话说后来我离开了acm,进入实验室,于是我花了整整一个暑假,加上一个月左右的时间,学习了:java,jsp,javascript,包括ssh架构一些。
这其中比较艰难的是思想转变:
1、由面向过程转变为面向对象(刚开始用java写的代码也是面向过程的。。),2、由传统的这种小计算应用转变为这种bs模型。这两个思想的提升使我对今后编写应用软件打下了很好的基础。
不管怎么样,自己很快就能熟练写java应用,后来由于就像其他习惯c的人都非常不喜欢java的这种”拿来主义”的做法一样,我后来一直在尽量不做java方面的开发,当然也就不会再进一步深入学习java方面的知识。(当然,目前来看,java还是一门开发应用软件的很给力的一门语言,细的我就不再多说,只是自己当初不喜欢)^o^()
随后大学里面还有一门重要的课程:计算机网络。(不过大学网络很基础,后来又简单自学了一些tcpip的那三本书。)
计算机网络告诉了我计算机互相通信的原理,了解计算机底层通信的方式。后来在工作中碰到的一些简单问题也就能解决。比如: 如何窃听网络数据的原理,arp欺骗,java这种bs模型能否获取客户端的mac地址(哈哈,自己后来工作中写脚本自动签到中考虑这个问题),类似这种接口调试中技巧,webservice的原理以及协议,大小端问题也算)^o^(。
还有一个是编译原理,让我明白作为c语言这种语言的编译过程,理解了编译的几个阶段。同时明白,sizeof的值再也不用记了,因为自己就可以分析出来,而且很简单,而且理解了各种错误处于哪个时期等都有利于自己对问题的分析。
哈哈,c语言中的scanf,printf高级应用,longjmp等在这后来时间也自己再进一步学习。
于此同时,自己自学了vb,学会了用vc++写动态库,所以后来一些桌面小应用,都用vb+dll来做的。所以课程设计什么的,都是小意思了。再后来毕业设设计:用matlab+vb+dll写的,实际写码调试时间不超过两个星期(约12天),代码量近6000行。毕业设计拿了年级第一。另外爆料一下:宿舍一哥们,一个算法毕设题目,我帮他搞定,总共花了一天;另外一哥们,用我的以前的课程设计搞过。。
附:自己此时的水平:语言就不说了,此时算的上说的出口的还是c语言,其他则是我的工具而已,而且很多我现在依然忘了,(检起来也简单,呵呵~)
代码编译,调试几乎不是问题。但是此时对系统设计,软件工程认识还是基本没有,对设计模式更不了解,对社会上使用的技术也是,什么不懂。
@@@第一份工作
第一份工作,我没怎么去找,(~_~;)后来去了当时实习的公司。公司主要用的架构是:oracle+tuxedo+jsp。
当然用的也是unix主机。也就是说,我毕业后没有做类似嵌入式,windows编成的工作。后期的应用也都是,unix下的环境编成。
ok,这会儿开始了工作期间了。
在刚开始实习的时候,自己被安排做一些琐碎整理的事情,比如:将一个代码改为另外一个格式?
后来,实习了两个月,我打算离职。后来主管找我谈话,我告诉了自己的想法。后来答应我调到北京总部的一个研发部(一般至少工作一年,并表现很出色才允许调)。另外这儿不得不简单提一下为什么。。
当时公司业务逻辑层主要用的是c语言,于我同批进去的实习生,后来很多人都问我c方面的问题。这个被技术主管看到,所以。。他那次同意了我的要求。
话说调去了北京总部,就是常年的出差开始了,大约三个月后,参加了一个很大的项目,(200多号人一年多。)刚开始我只是负责一个简单的数据接口后台进程的需求调研和开发,当时自己刚入社会,做起事来相对有些不好意思。在加上,我这个正好是一个接口需求,需要和不同的人沟通。所以问题出现了,其它同事看我是个新人,也不怎么理我,常常找理由推托。最后这个小需求做的让我很恼火,自己也没太好办法。
再后来,这个需求完后,自己负责另外较为重要的数据接口。在后来近半年后,自己学习很快,很快掌握了,一些unix下的编成,以及调试技术。期间,有一个数据接口同事,和领导吵架跑回去了,领导后来让我接手,并开出了一些优惠条件^_^。自己当然接下也费了一些工作,而以前的工作则交给了另外一有工作经验的同事负责。后来我每个月都回家一趟休假,都被允许了。有时很多人老员工也没被同意哦。
这之后,自己的能力慢慢得到认识,以前不理我的同事小组长,也都开始主动打招呼^_^。在之后,慢慢的有些同事问我一些技术上的问题。后来被部分同事称为”知识库”。再后来,就不多说了,也就是毕业两年后,各种原因,离开原来公司。换了一份现在的工作。
附:技术能力,这期间c语言从自己小程序变成一个实实在在的应用的代码的转变,期间包括,多进程,网络编程,oracle一些知识包括:索引优化,sql等分析;设计模式,等但是期间更多的是提升自我团队协作,沟通,时间管理,设计分析等软素质吧。
目前还在学习中。。互联网的知识。。自己还有很多要学的。呵呵。不过,学习是一件快乐的事情不是吗?
最后对还纠结在c语言的同学一点小建议吧:
1、c语言知识一门语言,就像java,peil等语言一样,仅仅是工具,因此不要把c语言看成很难,勤动手,多思考。语言终究是为了方便人,而设计的,所以他不难。
2、不要仅仅只看c语言,要从c语言看到计算机学科所有的知识点,并用c语言去巩固它们。为什么是c语言?他的确很合适,进入计算机有全面理解的一个入口。并以计算机的的角度去思考一些问题。
3、算法,数据结构,在现实中即使没用上,也会有助于你理解一些系统设计。
4、软件工程,系统设计也是很重要的哦。^_^,5、知识永远是学不完的,计算机亦如此,而且越学越菜。^_^
6、以上建议仅供参考。
和楼主蛮像的,大一时在写个二三百行的五子棋就以为自己牛得不行了。然后大二学了C++与STL之后,一直为自己C++学得很好,而且比别人多学了STL而沾沾自喜。然后,直到后来到大二下学期接触了ACM之后才发现自己就是一弱菜~~ 与楼主不同的是,我们学校之前没有人搞ACM(省赛时都是临时组队过...我是一名大三的学生,软件工程专业,从大学开始就开始了ACM的旅程,从大一到现在,基本上都是学的数论,几何等等方面的,几何也就一般般,三维几何都不是很会,对于数论,是我最擅长的吧,像连分数,二次剩余,原根,离散对数,牛顿二项式定理,费马平方和定理求表为平方和的解,对于数学方面的虽然我感觉还有很多我不会的,但是我感觉在ACM上面已经差不多了,至于其他方面的我多少也会点,至少很基础的都会吧,现在我想重点学习搜索,图论,DP,字符串,还有很多内容。在今年刚刚结束的亚洲区域赛杭州站获得铜牌,以前的省赛,东北赛等等也获得较好的名次。我毕业后想直接找工作,所以现在我想一边学习算法,继续做题,明年继续参加竞赛,一边想搞搞工程,我个人比较喜欢Linux嵌入式的方面的,又喜欢Java 和Lucene搜索引擎方面的。我是想问,这两方面哪一个比较好,比较有前景,然后对于算法方面的,哪些是以后工作后对应职业用的比较多的,比如我觉得数论在密码学方面用的比较多。对于ACM,我暂时是不想放弃。求各位学长们,或者已经工作的大神们给我建建议啊。
ACM程序题对锻炼逻辑思维是有很大帮助的,既然你明年还想参加比赛就不能放弃OJ,相信你们学校大三的学生也会带大一大二的学弟学妹吧,你可以不学习新的算法而去整理自己以前所学的,像DP、DFS什么的整理好,给他们讲,可能还会有新的收获。ACM很有魔力,相信你心里也是放不下。
ACM不是一份工作,你也不可能拿这个当自己一辈子吃饭的武器,当然除非你以后当老师什么的,专门讲一门课程。
Java从事的方面非常多,现在各行各业都需要Java程序员,真正工作了,你会发现ACM里面的算法用的微乎其微,大部分算法已经被封装好了,根本不需要你费劲脑汁去敲代码,你需要的是知道有这个东西,以及怎么去用,这个就需要你话费很长一段时间。很多东西你需要去学和复习巩固,从基础的css,sql, js, JQuery,ssh„„差不多得花费1年多的时间,如果不报培训班自己去学的话,需要你自己制定好一个规划,下载教学视频,一步步来,多实践。
Linux嵌入式工资比Java的高,但是好工作也相对难找,我仅仅知道这些,上我去年找工作的时候听同学说的,对于这方面我不懂,也就不瞎说了自己不知道的了。ACM应该是一个跳板,帮助你进一些名企,至于到底干什么,从事什么方面,很可能不会像你现在想的这么简单。大公司、名企对毕业生不会要求技术多好,随着时间累计技术都会提上去的,他们更看好你的潜力和以后对公司的价值。最后说一句,IT程序员很辛苦,你要做好准备!加油吧!
算法,数据结构是关键,另外还有组合数学,特别是集合与图论,概率论也重要。推荐买一本《算法导论》,那本书行,看起来超爽!!基本掌握语法还不行啊,语法的超熟练掌握,不然出了错误很难调试的!!最重要的是超牛皮的头脑啦,分析能力,逻辑推理能力很重要。ACM很好玩啦,祝你成功!!
acm是3人一组的,以学校为单位报名的,也就是说要得到学校同意,还要有2个一起搞的。其实可能是你不知道你们学校搞acm的地方,建议你好好询问下你们学校管科技创新方面的人。建议你找几个兴趣相同的一起做,互相探讨效果好多了,团队合作也是acm要求的3大能力之一。
数据结构远远不够的,建议你看算法导论,黑书,oj的话个人觉得还是poj好,有水题有好题,而且做的人多,要解题报告什么的也好找。我们就是一些做acm的学生一起搞,也没老师,这样肯定能行的。
基础的话是语言,然后数据结构,然后算法。
ACM有三个方向:算法,数学,实现 要求三种能力:英文,自学,团队协作
简单的说,你要能读懂英文的题意描述,要有一门acm能使用的编程语言,要会数据结构,有一点数学基础,一点编程方面天赋,要有兴趣和毅力(最重要),就具有做ACM的基本条件了。
做acm我推荐c,c++也可以,java在某些情况下好用,但是大多数情况的效率和代码量都不大好,所以建议主用c++,有些题目用java
还有什么问题,可以问我啊。
不好意思,没见过用java描述的acm书籍,大多数是用伪命令,其他有的用的c,c++,老一些的用pascal。java只是用来做高精度的一些题的,个人觉得不用专门看这方面的书,java的基本部分学好就够用了。所以我还是推荐主用c++,在高精度和个别题再用java。你可以找找java描述的算法设计与分析,这个好像有
数据结构:C语言版 清华大学出版社 严蔚敏 《数据结构》
算法:清华大学出版社 王晓东 《算法设计与分析》
麻省理工大学 中译本:机械工业出版社 《算法导论》
基本上这三本书就已经足够了,建议一般水平的人先不要看算法导论,待另外两本书看的差不多的时候,再看算法导论加深理解。
另外还有很多针对性更强的书籍,不过针对性太强,这里就不多介绍了。以上一些都是些算法方面的书,最好的方式就是做题与看书相结合,很多在线做题的网站,PKU,ZOJ很多,推荐PKU,题目比较多,参与的人比较多。做一段时间的题,然后看书,研究算法,再做题,这样进步比较快。
还有关于ACM竞赛,我有自己的一点话说。
首先说下ACM/ICPC是个团队项目,最后的参赛名额是按照学校为单位的,所以找到志同道合的队友和学校的支持是很重要的。
刚刚接触信息学领域的同学往往存在很多困惑,不知道从何入手学习,在这篇文章里,我希望能将自己不多的经验与大家分享,希望对各位有所帮助。
一、语言是最重要的基本功
无论侧重于什么方面,只要是通过计算机程序去最终实现的竞赛,语言都是大家要过的第一道关。亚洲赛区的比赛支持的语言包括C/C++与JAVA。笔者首先说说JAVA,众所周知,作为面向对象的王牌语言,JAVA在大型工程的组织与安全性方面有着自己独特的优势,但是对于信息学比赛的具体场合,JAVA则显得不那么合适,它对于输入输出流的操作相比于C++要繁杂很多,更为重要的是JAVA程序的运行速度要比C++慢10倍以上,而竞赛中对于JAVA程序的运行时限却往往得不到同等比例的放宽,这无疑对算法设计提出了更高的要求,是相当不利的。其实,笔者并不主张大家在这种场合过多地运用面向对象的程序设计思维,因为对于小程序来说这不旦需要花费更多的时间去编写代码,也会降低程序的执行效率。
接着说C和C++。许多现在参加讲座的同学还在上大一,C的基础知识刚刚学完,还没有接触过C++,其实在赛场上使用纯C的选手还是大有人在的,它们主要是看重了纯C在效率上的优势,所以这部分同学如果时间有限,并不需要急着去学习新的语言,只要提高了自己在算法设计上的造诣,纯C一样能发挥巨大的威力。
而C++相对于C,在输入输出流上的封装大大方便了我们的操作,同时降低了出错的可能性,并且能够很好地实现标准流与文件流的切换,方便了调试的工作。如果有些同学比较在意这点,可以尝试C和C++的混编,毕竟仅仅学习C++的流操作还是不花什么时间的。
C++的另一个支持来源于标准模版库(STL),库中提供的对于基本数据结构的统一接口操作和基本算法的实现可以缩减我们编写代码的长度,这可以节省一些时间。但是,与此相对的,使用STL要在效率上做出一些牺牲,对于输入规模很大的题目,有时候必须放弃STL,这意味着我们不能存在“有了STL就可以不去管基本算法的实现”的想法;另外,熟练和恰当地使用STL必须经过一定时间的积累,准确地了解各种操作的时间复杂度,切忌对STL中不熟悉的部分滥用,因为这其中蕴涵着许多初学者不易发现的陷阱。
通过以上的分析,我们可以看出仅就信息学竞赛而言,对语言的掌握并不要求十分全面,但是对于经常用到的部分,必须十分熟练,不允许有半点不清楚的地方,下面我举个真实的例子来说明这个道理——即使是一点很细微的语言障碍,都有可能酿成错误:
在去年清华的赛区上,有一个队在做F题的时候使用了cout和printf的混合输出,由于一个带缓冲一个不带,所以输出一长就混乱了。只是因为当时judge team中负责F题的人眼睛尖,看出答案没错只是顺序不对(答案有一页多,是所有题目中最长的一个输出),又看了看程序发现只是输出问题就给了个Presentation error(格式错)。如果审题的人不是这样而是直接给一个 Wrong Answer,相信这个队是很难查到自己错在什么地方的。
现在我们转入第二个方面的讨论,基础学科知识的积累。
二、以数学为主的基础知识十分重要
虽然被定性为程序设计竞赛,但是参赛选手所遇到的问题更多的是没有解决问题的思路,而不是有了思路却死活不能实现,这就是平时积累的基础知识不够。今年World Final的总冠军是波兰华沙大学,其成员出自于数学系而非计算机系,这就是一个鲜活的例子。竞赛中对于基础学科的涉及主要集中于数学,此外对于物理、电路等等也可能有一定应用,但是不多。因此,大一的同学也不必为自己还没学数据结构而感到不知从何入手提高,把数学捡起来吧!下面我来谈谈在竞赛中应用的数学的主要分支。
1、离散数学——作为计算机学科的基础,离散数学是竞赛中涉及最多的数学分支,其重中之重又在于图论和组合数学,尤其是图论。
图论之所以运用最多是因为它的变化最多,而且可以轻易地结合基本数据结构和许多算法的基本思想,较多用到的知识包括连通性判断、DFS和BFS,关节点和关键路径、欧拉回路、最小生成树、最短路径、二部图匹配和网络流等等。虽然这部分的比重很大,但是往往也是竞赛中的难题所在,如果有初学者对于这部分的某些具体内容暂时感到力不从心,也不必着急,可以慢慢积累。
竞赛中设计的组合计数问题大都需要用组合数学来解决,组合数学中的知识相比于图论要简单一些,很多知识对于小学上过奥校的同学来说已经十分熟悉,但是也有一些部分需要先对代数结构中的群论有初步了解才能进行学习。组合数学在竞赛中很少以难题的形式出现,但是如果积累不够,任何一道这方面的题目却都有可能成为难题。
2、数论——以素数判断和同余为模型构造出来的题目往往需要较多的数论知识来解决,这部分在竞赛中的比重并不大,但只要来上一道,也足以使知识不足的人冥思苦想上一阵时间。素数判断和同余最常见的是在以密码学为背景的题目中出现,在运用密码学常识确定大概的过程之后,核心算法往往要涉及数论的内容。
3、计算几何——计算几何相比于其它部分来说是比较独立的,就是说它和其它的知识点很少有过多的结合,较常用到的部分包括——线段相交的判断、多边形面积的计算、内点外点的判断、凸包等等。计算几何的题目难度不会很大,但也永远不会成为最弱的题。
4、线性代数——对线性代数的应用都是围绕矩阵展开的,一些表面上是模拟的题目往往可以借助于矩阵来找到更好的算法。
5、概率论——竞赛是以黑箱来判卷的,这就是说你几乎不能动使用概率算法的念头,但这也并不是说概率就没有用。关于这一点,只有通过一定的练习才能体会。
6、初等数学与解析几何——这主要就是中学的知识了,用的不多,但是至少比高等数学多,我觉得熟悉一下数学手册上的相关内容,至少要知道在哪儿能查到,还是必要的。
7、高等数学——纯粹运用高等数学来解决的题目我接触的只有一道,但是一些题目的叙述背景往往需要和这部分有一定联系,掌握得牢固一些总归没有坏处。
以上就是竞赛所涉及的数学领域,可以说范围是相当广的。我认识的许多人去搞信息学的竞赛就是为了逼着自己多学一点数学,因为数学是一切一切的基础。
三、数据结构与算法是真正的核心
虽然数学十分十分重要,但是如果让三个只会数学的人参加比赛,我相信多数情况下会比三个只会数据结构与算法的人得到更为悲惨的结局。
先说说数据结构。掌握队列、堆栈和图的基本表达与操作是必需的,至于树,我个人觉得需要建树的问题有但是并不多。(但是树往往是很重要的分析工具)除此之外,排序和查找并不需要对所有方式都能很熟练的掌握,但你必须保证自己对于各种情况都有一个在时间复杂度上满足最低要求的解决方案。说到时间复杂度,就又该说说哈希表了,竞赛时对时间的限制远远多于对空间的限制,这要求大家尽快掌握“以空间换时间”的原则策略,能用哈希表来存储的数据一定不要到时候再去查找,如果实在不能建哈希表,再看看能否建二叉查找树等等——这都是争取时间的策略,掌握这些技巧需要大家对数据结构尤其是算法复杂度有比较全面的理性和感性认识。
接着说说算法。算法中最基本和常用的是搜索,主要是回溯和分支限界法的使用。这里要说的是,有些初学者在学习这些搜索基本算法是不太注意剪枝,这是十分不可取的,因为所有搜索的题目给你的测试用例都不会有很大的规模,你往往察觉不出程序运行的时间问题,但是真正的测试数据一定能过滤出那些没有剪枝的算法。实际上参赛选手基本上都会使用常用的搜索算法,题目的区分度往往就是建立在诸如剪枝之类的优化上了。
常用算法中的另一类是以“相似或相同子问题”为核心的,包括递推、递归、贪心法和动态规划。这其中比较难于掌握的就是动态规划,如何抽象出重复的子问题是很多题目的难点所在,笔者建议初学者仔细理解图论中一些以动态规划为基本思想所建立起来的基本算法(比如Floyd-Warshall算法),并且多阅读一些定理的证明,这虽然不能有什么直接的帮助,但是长期坚持就会对思维很有帮助。
四、团队配合
通过以上的介绍大家也可以看出,信息学竞赛对于知识面覆盖的非常广,想凭一己之力全部消化这些东西实在是相当困难的,这就要求我们尽可能地发挥团队协作的精神。同组成员之间的熟练配合和默契的形成需要时间,具体的情况因成员的组成不同而不同,这里我就不再多说了。
五、练习、练习、再练习
知识的积累固然重要,但是信息学终究不是看出来的,而是练出来的,这是多少前人最深的一点体会,只有通过具体题目的分析和实践,才能真正掌握数学的使用和算法的应用,并在不断的练习中增加编程经验和技巧,提高对时间复杂度的感性认识,优化时间的分配,加强团队的配合。总之,在这里光有纸上谈兵是绝对不行的,必须要通过实战来锻炼自己。
大家一定要问,我们去哪里找题做,又如何检验程序是否正确呢?这大可不必担心,现在已经有了很多网上做题的站点,这些站点提供了大量的题库并支持在线判卷,你只需要把程序源码提交上去,马上就可以知道自己的程序是否正确,运行所使用的时间以及消耗的内存等等状况。下面我给大家推荐几个站点,笔者不建议大家在所有这些站点上做题,选择一个就可以了,因为每个站点的题都有一定的难易比例,系统地做一套题库可以使你对各种难度、各种类型的题都有所认识。
1、Ural:
Ural是中国学生对俄罗斯的Ural州立大学的简称,那里设立了一个Ural Online Problem Set,并且支持Online Judge。Ural的不少题目算法性和趣闻性都很强,得到了国内广大学生的厚爱。根据“信息学初学者之家”网站的统计,Ural的题目类型大概呈如下的分布:
题型 搜索 动态规划 贪心 构造 图论 计算几何 纯数学问题 数据结构 其它
所占比例 约10% 约15% 约5% 约5% 约10% 约5% 约20% 约5% 约25%
这和实际比赛中的题型分布也是大体相当的。有兴趣的朋友可以去看看。
2、UVA:
UVA代表西班牙Valladolid大学(University de Valladolid)。该大学有一个那里设立了一个PROBLEM SET ARCHIVE with ONLINE JUDGE,并且支持ONLINE JUDGE,形式和Ural大学的题库类似。不过和Ural不同的是,UVA题目多的多,而且比较杂,而且有些题目的测试数据比较刁钻。这使得刚到那里做题的朋友往往感觉到无所适从,要么难以找到合适的题目,要么Wrong Answer了很多次以后仍然不知道错在那里。如果说做Ural题目主要是为了训练算法,那么UVA题目可以训练全方位的基本功和一些必要的编程素质。UVA和许多世界知名大学联合办有同步网上比赛,因此那里强人无数,不过你先要使自己具有听懂他们在说什么的素质:)
3、ZOJ:
ZOJ是浙江大学建立的ONLINE JUDGE,是中国大学建立的第一个同类站点,也是最好和人气最高的一个,笔者和许多班里的同学就是在这里练习。ZOJ虽然也定位为一个英文网站,但是这里的中国学生比较多,因此让人觉得很亲切。这里目前有500多道题目,难易分配适中,且涵盖了各大洲的题目类型并配有索引,除此之外,ZOJ的JUDGE系统是几个网站中表现得比较好的一个,很少出现Wrong Answer和Presentation error混淆的情况。这里每月也办有一次网上比赛,只要是注册的用户都可以参加。
说起中国的ONLINE JUDGE,去年才开始参加ACM竞赛的北京大学现在也建立了自己的提交系统;而我们学校也是去年开始参加比赛,现在也有可能推出自己的提交系统,如果能够做成,到时候大家就可以去上面做题了。同类网站的飞速发展标志着有越来越多的同学有兴趣进入信息学的领域探索,这是一件好事,同时也意味着更激烈的竞争。