大三计算机科班学生悟道理论联系实际

这又是一名我心目中“好”学生的来信,尽管我没有见过他的面。教育的大环境,对我们大家都一样。但,看清了路并坚持,而不是受风气的影响,可以这样做。前行中遇到的问题,总是要比坐等来得多,只要打开着交流的大门,没有找不到渠道交流的。

【来信】

老师您好!

  首先很敬佩您,作为一名老师能够放下那些名利,而专心做一名人民教师。其次对于您能以身作则,开博客领导学生们去实践,耐心解答学生的问题,非常的喜欢与支持。所以呢,我也慕名前来了:)

  很冒昧给您添加负担了,文字稍微有点多,但是问题很简单,在文章的最后面,所以如果您时间比较紧的话,可以直接跳到文章的最后面。如果您详细浏览文章,对于我的一些观点您不认同的话,务必请老师指正出来。

  我是一名大三的计算机科班学生,因为对计算机比较感兴趣,大一的时候就开始编程了(那时候我们还没有开相关的语言课程),中间也经过了很多颓废(打dota),与兴趣散发(学Android,学C#,等等),不过还好总的大方向我还是一直没有变,最后觉得我更喜欢互联网与后端技术。现在我的大多数同学都去在外面报培训班或考研,而我两个都没有选择,我选择的是自己针对自己的兴趣去规划(精通一门语言JAVA,计算机理论基础扎实,热爱互联网)然后毕业即就业。

  针对学院为我们专业量身订做的课程,我也没有抛弃,绝大多数专业课都在90分以上(我从来都不是为了成绩而学习的,但是成绩可以作为我学习努力成果的一个指标),在上课的过程中呢,我一直都在努力的将课程中的理论与实际联系起来,例如学编程语言时,我敲代码的时间可能比上课听老师讲课的时间还要多一点(有点小逃课_嘿)。还有我们这学期学习数据库再做课程设计的时候,我就联系到了并发性错误(这些在平常编程中会考虑的很少),并且针对程序中可能会出现的并发性错误情况进行考虑,等等还有好多情况。

  可是呢,有时有些东西,我就发现很难将理论与实践相结合起来。例如我这学期同一个大四的朋友给学校的一个志愿者协会做一个信息系统(大概1000人左右),我们是用java语言弄的 B/S架构,然后使用了网上的一个开源框架JEECG(框架里的东西了解的不是很多,以后有待加强)。 

  整个项目进行的过程中,我也学到了很多知识,例如前期的用户需求调查很重要,这对项目的后期需要更改多少有很大的决定作用。还有在两个人共同完成的项目中,版本控制问题也非常重要等等。

  但是在编写这个软件的过程中,我发现跟理论科的联系就比较少,大部分都是编程语言,以及软件、框架的熟悉度来决定项目完成的好坏。因为现在的很多的东西都封装的特别好了,你根本不用关心数据库当中的数据是以某种形式存放的,根本不用关心网络实际的运行情况。

  这种东西我刚开始接触起来还稍微有些意思,但是多了之后就感觉到很无趣。因为如果以后只是做项目的话完全可以去报个培训班就可以了,就没必要上大学了。如果让我以后整天就是做这些信息系统,我肯定是非常不愿意的。因为大多数东西都与计算机理论知识联系不起来,只是熟练度的问题(当然我也明白任何一个系统想做的非常完美都是很不容易的,我也并没有歧视培训班,只是觉得创造性比较少)

  所以后来老师又找我,让我下一学期在给做一个体育成绩统计的一个项目,我也拒绝掉了。 

  因为我明白自己的价值肯定远远比这些要高,所以我应该花费更多的时间去追逐更高的知识层面,而不仅仅是做目前这些。 

  在生活中我也经常会把去思索很多产品应用,并且查资料去了解技术方面。例如百度网盘(空间的合理分配利用)、新浪微博(消息的队列)等等这些应用所用到的一系列知识。

  并且我还经常把计算机知识与其他学科的知识互相串起来,因为我发现很多东西都是相通的。说不定有些计算机知识就是从其他学科那里演化而来的。

  以前我一直也在想,为什么考研考的计算机是数据结构,计算机网络,操作系统,计算机组成原理这些东西,后来发现这些东西都是整个计算机科学的最核心的几门课了(软硬件都有),其他的很多东西(例如数据库,WEB开发,分布式系统,嵌入式)都是这些课程所延伸出来的。所以呢,虽然说我不决定考研,但是我还是非常认真的在学习这些课程。

  并且我一向是觉得实践出真理。我学那么多难啃的理论知识,目的只有一个,就是为了以后的实际应用所服务。所以对于理论知识,我会多想很多个为什么。硬件已经如此发达了,为什么O(Nlog N)排序还那么重要?假如我是在百度有1亿个数据(而不是简简单单的几十个数据)需要排序的话,那我肯定不能用冒泡排序,这个时候就需要用到更高级一些的排序算法。我一向都不单纯的对理论感兴趣,(例如数据库的范式,我一点都不觉得有趣,但是这个东西在设计数据库的时候真的很厉害),一个是我也静不下心来学那么多,第二个确实不是太感兴趣。

  可是光学理论肯定理解的是不够深入的,我一直想对每一门课更加深入的理解,尤其是通过编程的方式,因为这样不但提高了我的编程能力,而且还巩固加深了我的计算机理论知识。

  但是想把所有的理论知识与实际都联系起来,是非常困难的一件事情。在这个过程中会有很多事情无从下手。我只能把他们与现实的一些已经成型的产品联系起来。可是让我去直接实现这些产品是肯定不行的,我应该去找一些小的事情练习实践应用。就是这些小的事情让我头疼了。

  在理论到现实世界中间的这一个桥梁就是我想走的,可是我不知道该如何去走,或者说如何的走好。就例如针对数据结构的实践,我想做出一个成型的东西,一个小程序,可以完成某些功能。但是我不知道在这个过程中,如何去运用数据结构来进行实践。如何去在小程序小项目中应用数据结构。等等一系列理论到实践的问题。

  最后总结一下。我的问题就是在日常学习中,如何(HOW)去运用实践,去编程!!,去运用这些计算机科学与技术理论课程,而不只是在脑子里联系他们。

  最后,万分感谢老师!!!

 

【回信】

  很高兴看到你对自己大学的把握。这几天的读书时间,我看的是郑也夫先生的《吾国教育病理》。该书从宏观上的教育观念、教育政策,甚至于社会制度的设计上提出问题、给出回答,并进行了充分的反思。而我们作为教育中的个体,无论我作为教师,还是你现在作为学生,我们都应该有这种自觉,看清自己的路,做好自己该做的事,而不是在病态中随波沉浮不定。这是我们个人精彩人生的表现和依托,也是对社会的贡献。

  你知道了理论和实践的结合,并在其中做了诸多的努力。这样的学习和思考要继续下去。台湾大学黄武雄教授在《学校在窗外》中道出了学校教育做且仅做的两件事,一是打开人的经验,二是发展抽象能力。但在实践中,发现不少同学的执行是在这两个方面走极端:认定考研的眼睛盯在考试上,实践靠边站,因为不考(貌似不考);而准备就业的,将理论课称为没用的,可悲的是,有不少人,由于其学习路线的安排,已经永远失去了知道理论知识之用的机会。所以,将你的学习风格、思考的方式继续下去。

  下面的文字中,针对你的情况我谈点想法,希望借此能传达一些从我的角度给你的建议。因为你的问题,有些是触及学科根本的,我没有把握说好。你需要结合自己的理解,形成你的结论。

  你将理论和实践的界限划得有些绝对了。实际上,理论和实践都是相对的话题。在大学阶段所学的课程,囊括了一些知识点,而这些知识点,处于完全的纯理论和完全的纯实践(如果有的话)为两端的轴上的某一点,并没有绝对的理论或实践。例如数据结构,站在程序设计实践的角度是理论,但是从算法理论的角度看,也就是应用层面的东西。大学生将其称为理论,大概是因为在大学这个阶段,数据结构的抽象味道还是有一些的。所以,你可以让这样一个分界线在自己心中模糊一些。实际上你有点为了达到理论联系实际这样一个明确的目标而背上了一些包袱。重要的不是分清理论和实践,而是编织好你的知识结构。做设计的时候,想到相关的指导原则(如设计数据库,想到和用到了范式,写查询语句时,用上关系代数中的启示,出手就是优化的语句),在编程的实践中,不避关键的问题的锋芒,拒绝“捷径”,这时必定需要在理论层面学得的知识的支撑(例如,在诸如数据结构课程设计规模的设计中,不是随便用一种方案处理,而是根据问题本身的要求完成,这样涉及算法、效率、可靠性等各方面的问题都会成为引发你进一步提高的因素);在学习到一些抽象层面的知识时,想着去拓展,例如关于反函数的性质,可以将undoredo、编码和解码、加密和解密等联系。你已经在这样做了,这是你要知道的。在形成个性化知识结构的过程中,我们可以只在意你是否有这样一种学习方式。有不少事情,只要方式正确,就会在不经意之间到来,过份关注,或者要明确的给出回答,往往会成为负担,不利于前行了。

  在理论联系实践的道路上,当回答不了如何才能更多有效地联系二者时,加强实践,多见识一些,学习理论,不避抽象的推导和证明,这二者的联系就是在你的意识中默默发生的。如果要让效果更好一些,你没有提到你看过哪些书,我给你建议看一看每个方向上最经典的教材。例如,算法与数据结构方面,看Thomas H. Cormen的 Introduction to Algorithms(《算法导论》),如果可以的话,计算机科学的圣经《计算机程序设计艺术》也可以看。再如,计算机系统方面的《深入理解计算机系统》,将计算机的软、硬件设计和理论结合得非常好。这些经典教材中,常会给出非常实用的例子,讲出理论和实践的联系。你现在大三,也应该定下自己的方向了,在你选择的方向上有什么经典的书籍,有网络在,相信你能找到。

  除此之外,我不知你有没有去过学校图书馆的网站上利用过“数字图书馆”。其中的“万方”、“中国知网”等学术论文数据库提供了数不清的资源。你可以找到国内外各种期刊、会议上发表的文章,硕士、博士论文全文,这些资料比写到教材中的要新,也更有针对性。读这些论文起步会有些难度,但我感觉你可以找到合适你读的并能读下去(好文章多的是,烂文章也不少,学会选文章也是你在实践中学习的内容之一)。在读文章的过程中,你可以看到研究人员是如何理论联系实际的,并且从中学到理论和实际联系的方法。有人说本科生不用读学术文章,但我这几年在带本科生读学术文章方面还是有正面的心得的,只要去读了,就会知道读的必要性,且收获不一般。

  最后想说的,可能对你更实用。你设计的发展道路是直接就业,应该从事软件开发,并且可能就是以信息系统开发入手。但是你将之视为技能技巧的成份多一些,没有意识到其背后的支撑。这一段落以前的所有话题是围绕着“计算机科学和技术”展开的,这非常必要。而立足于你的现状,你还应该该知道在另一个方向上的“工程”,也并不是纯技艺的事,并不是完全靠直接经验的事。例如:良好软件的结构如何度量,是怎样才能做到的?程序的测试该如何进行?等等。在这一方面,无论你有没有学过软件工程,现在都可以试水一下这方面的知识。其中用字面表述的各种原则、经验,也都有形式化表述的支撑。软件工程的实践者重原则和经验,而软件工程的研究者还会将其用形式化方法,在抽象的层面上开展工作。软件工程将计算机科学、工程与管理科学等结合起来,你做过小项目的经验(直接经验)会和软件开发管理中的一般原则(抽象理论)编织成独特的知识体系的。至于目前手头的一些小项目,如果时间和精力允许,可以做着,一来不少事情要有量的积累,再者,这也是你所学开发原则、方法的实践机会。网络社区中有不少架构师、项目经理开博的,你也可以从中看到你的项目中体会不到的东西。软件工程我不怎么明白,想到三个人邹欣(http://www.cnblogs.com/xinz/)、李智勇(http://blog.csdn.net/leezy_2000)和陈勇(http://blog.csdn.net/cheny_com),你可以去看他们写的文字。

  就说这些,祝你能有更犀利的表现。


【学生回复】

  感谢老师的回复!
  我思考了下,大概还是我各方面接触还是不够广,造成我思路的狭窄。
  书读的少,而想的多。
  确实很多经典的计算机书籍我都没有看。看来以后这方面要稍微努力努力。
  另外的确是因为我所站的高度太低,所导致看待数据结构变为了一种理论知识。换做算法或操作系统方面的角度来看待数据结构却是一门实践性的课程。

  关于实践与理论。
  想要根据实践来学习理论,或者学习理论来搞实践。有种鸡生蛋,蛋生鸡的味道。所以与其纠结于此,倒不如坦然放下,随便取其一即可。过程中,遇理论则习之,遇实践则练之。
  想要真正的把理论与实践相结合起来,不光经得起实践还要藏理于心中,这样办起事来才能游刃有余。

  另外,对于老师所说的软件工程,确实也属于很大的一门学科在软件范畴方面。我也只是听说过,具体还没有去详细了解过。
  所以以后还需好好努力!
  最后再次感谢老师指导!!!



  如果我的工作能得到您的认可,请点“投他一票”,投票正在进行



==================== 迂者 贺利坚 CSDN博客专栏=================

|==  IT学子成长指导专栏  专栏文章分类目录(不定期更新)    ==|

|== C++ 课堂在线专栏   贺利坚课程教学链接(分课程年级)   ==|

======== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =======


©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页