|
数据结构的重要性就不言而喻了,学完数据结构你会对你的编程思想进行一番革命性的
洗礼,会对如何建立一个合理高效的算法有一个清楚的认识。对于算法的建立我想大家
应当注意以下几点:
当遇到一个算法问题时,首先要知道自己以前有没有处理过这种问题。如果见过,那么
你一般会顺利地做出来;如果没见过,那么考虑以下问题:
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.鼻祖嘛!
关于网络安全我也想在这里说两句,随着计算机技术的发展,整个社会的信息化水平突
飞猛进,计算机网络技术日新月异,网络成了当即社会各个工作领域不可缺少的组成部
分,只要有网络存在,网络安全问题就是一个必须解决好的问题,学习网络安全不是简
简单单的收集一些黑客工具黑一黑别人的网站,而是要学习他的数学原理,实现原理,
搞清底层工作机制,这样才能解决大部分的现有问题和新出现的安全问题。
关于计算机科学的一些边缘科学我想谈一谈软件工程技术,对于一个企业,推出软件是
不是就是几个程序员坐在一起,你写一段程序,我写一段程序呢?显然不是。软件工程
是典型的计算机科学和数学,管理科学,心理学,社会学等学科的综合。它使我们这些
搞理论和技术的人进入了一个社会。你所要考虑的不仅仅是程序的优劣,更应该考虑程
序与软件的区别,软件与软件产品的区别,软件软件产品的市场前景,如何去更好的与
人交流。这方面我还在学习阶段,以后这方面再写文章吧,先推荐给大家几本书:畅销2
0年不衰的《人月神话》(清华大学中文版,中国电力出版社影印版),《软件工程-实践
者研究的方法》(机械工业出版社译本),《人件》(据说每一位微软公司的部门经理都读
过这本书,推荐老总们和想当老总的同学都看看,了解一下什么是软件企业中的人)以及
微软公司的《软件开发的科学与艺术》和《软件企业的管理与文化》(研究软件企业的制
胜之道当然要研究微软的成功经验了!)
关于计算机技术的学习我想是这样的:学校开设的任何一门科学都有其滞后性,不要总
认为自己掌握的某门技术就已经是天下无敌手了,虽然现在J ava,VB,C,C++用的都很
多,怎能保证没有被淘汰的一天,我想.net平台的诞生和X#语言的初见端倪完全可以说
明问题。换言之,在我们掌握一门新技术的同时就又有更新的技术产生,身为当代的大
学生应当有紧跟科学发展的素质。举个例子,就像有些同学总说,我做网页设计就喜欢
直接写html,不愿意用什么Frontpage,Dreamweaver。能用语言写网页固然很好,但有
高效的手段你为什么不使呢?仅仅是为了显示自己的水平高,unique? 我看真正水平高
的是能够以最快的速度接受新事物的人。高级程序设计语言的发展日新月异,今后的程
序设计就像人们在说话一样,我想大家从XML中应是有所体会了。难道我们真就写个什么
都要用汇编,以显示自己的水平高,真是这样倒不如直接用机器语言写算了。反过来说
,想要以最快的速度接受并利用新技术关键还是在于你对计算机科学地把握程度。
计算机技术牵扯的内容更为广泛些,一项一项说恐怕没个一年半载也说不清。我只想提
醒大家的还是那句话,技术与科学是不能分家的,学好了科学同时搞技术,这才是上上
策。犹如英语,原先人们与老外交流必须要个翻译,现在满马路的人都会说英语。就连2
1世纪英语演讲比赛的冠军都轮不到英语系的学生了。计算机也是一样的,我们必须面对
的一个现实就是:计算机真就只是一个工具,如果不具备其它方面的素养,计算机系的
学生虽然不能说找不到工作,不过总有一天当其他专业性人才掌握了计算机技术后将比
我们出色许多。原因就在于计算机解决的大都是实际问题,实际问题的知识却是我们少
有的。单一的计算机技术没有立足之地。
我想是时候指出:学习每一个课程之前,都要先搞清这一课程的学习目的。这一学科的
应用领域。据我自身所了解到的同龄同学和低年级的同学的学习状况:他们之中很少有
人知道学一个学科的学习目的,期末考试结束了也不知道学这科做什么用。这就失去了
读计算机科学的意义。当然这与现存的教育思想不能说一点关系都没有。
总的来说,从教育角度来讲,国内高校的课程安排不是很合理,强调理论,又不愿意在
理论上深入教育,无力接受新技术,想避开新技术又无法避得一干二净。我觉得关键问
题就是国内的高校难于突破现状,条条框框限制着怎么求发展。我们虽然认识得到国外
教育的优越性,但为什么迟迟不能采取行动?哪怕是去粗取精的取那么一点点。我们需
要改变。从我们自身角度来讲,多数人4年下来既没有学习计算机科学的学术水平,也没
有学习计算机技术的那种韧劲。在我刚上大一时,我的计算机科学入门导师,淮北煤炭
师范学院王爱平教授曾经对我说过这样一番话:“当你选择了计算机这一门科学,就意
味着你踏上了一条不归路,就意味着你一生都要为之奋斗……你的身后是悬崖,只有向
前走,不能往后退。”
有些同学说按照这样学习学的东西太多,有的未见得有用,我想打个形象的比方:学校
学出来的人都是一个球体,方方面面的知识都应具备。可是社会上需要球体的地方很少
,反而需要的是砖和瓦,即精通某一行的人才。但是对于同等体积的物体,用球体来改
造是最方便最省事的。学校的学生很多,为了能够使更多的学生来适应这个社会,学校
也就不得以把所有的学生都打造成一个球体,然后让社会对这些学生进行再加工,成为
真正能够有用的人才。即使你非常清楚自己的将来要干什么,并且非常下定决心要走自
己的路,这一步你也必须走,世界是在不断变化的,你不能预料未来。想清楚,努力去
干吧!
必须结束这篇“胡侃”了,再侃下去非我力所能及。其实计算机还有很多基础课都值得
一侃。怎奈我造诣有限,不敢再让内行耻笑。对于博大精深的计算机科学,我只能说我
永远都是个Beginner。最后声明:这些只针对本科阶段的学习。即使把这些全弄通了,
前面的路还长,计算机科学需要我们为之奋斗......学习计算机科学需要韧性,更需要
创新,需要激情。深刻学习理论知识,勇于接受新技术的挑战,这才是我们这一代人应
具有的素质。最后送大家一句话“Wake up every day with a feeling of passion
for the difference technology will make in people's life!”。
P.S.
在我大一时无意中找到了南京大学网友sir的帖子“胡侃(理论)计算机学习”,这个帖子
对我的大学生活起了至关重要的作用,也因此同他成为了好友,本帖子在原有帖子的基
础上改进了其中我认为不太合适的理论,修正了一些观点,在推荐教材方面结合我的学
习情况有了较大改变。值得一提的是增加了一些计算机理论的内容,计算机技术的内容
结合我国的教学情况和我们学习的实际情况进行了重写。感谢大家的支持,这篇文章才
能比较快的完成,这里也只是写下了我在学习计算机科学时的所思所想,很不成熟。与
原文相比增加了一些推荐参考书,删去了一些过陈旧的难以找到的材料。并且对一些问
题作了更为详细地阐述,也增加了一些新观点。希望大家多多讨论,改进不足,让我们
共同努力吧! |
|