【前言】本文以数据结构为例。但关于理论和实践的关系,以及学习路线,对其他课程、学科也有参考价值。

【正文】
  有学生问:“数据结构应该偏理论还是偏实践?”
  这是一个非常好的问题。
  我知道,他是在学数据结构中有压力了,想去偏一偏。
  这是一个选择问句,但若回答,还真不是顺着这个道二选一就了事。
  
  (一)理论和实践
  先分析一下何为理论,何为实践。
  理论是从大量应用中提取出来的共性的特征、原理。理论层次的知识,是大家智慧的结晶。对当下的学习者而言,就是前人的积累。理论这种间接经验的学习,可以让我们在很短的时间之间,接受前人需要几十年,甚至成百上千年的积累。
  理论,是在学习中,尤其中在大学的学习中,极其重要的部分。不掌握专业中基本的理论,上大学的成色不足。只凭着有限的直接经验和体验,而放弃前人的积累,亏大了。不拿,白不拿啊。
  然而,理论的学习,却常常是枯燥的。学习者,不,往往是欲入门而不得的初学者,会由于这种枯燥而急燥、心焦,甚至产生厌恶,萌生放弃的念头。
  这不是理论的错,是学法的错。
  理论本来是鲜活的,理论的学习也可以是鲜活的。
  如何鲜活起来?
  需要实践来出场了。
  在学理论中,要融入实践。从实践中,得到的是直接经验,是属于自己的体验、体会。
  在大学生阶段学习过程中做的实践,可以算是对知识初步的应用。通过实践的行为和过程,你会发现理论的确是在指导着实践,理论这个东东真是有用啊。在思考实践问题的解决方案时,你会发现理论传达的那个思维方式在起作用了。甚至于,解决实际问题时,理论里的那些个公式、算法直接拿过来用,真省事!
  有了高度概括的理论,具体问题的解决,变得很容易的样子。
  有了实践,再也不会说“老师教的这些东西全没用”。去除了这个心魔,学习的主动性,这个学习的法宝,自然就留在你身边了。
  实践,其实是我们学习的最终目的。从这个角度,理论是阶梯。最终我们有创新的实践,也会进入到理论体系中,成为后人可学的宝贵的间接经验。你在达成自己目标的过程中的间接成果,再次成为后人的阶梯。
  实践,也是我们学习的手段。不去结合实践的理论学习,注定是枯燥的。有个别的人,在纯理论堆里得心应手,那自有他的道道。但是,现在对于感觉理论枯燥的人,你缺的,是实践。
  
  (二)理论和实践的层次
  现代科学体系变得越来越庞大,形成了各个分支,每个分支中又形成了多个层次。
  这个层次的存在,使得理论和实践没有了绝对的区分。
  换句话说,同一个知识点,在有人眼里是理论,有人眼里是实践。说它是实践的人,是站在学科更高层次的;说它是理论的,常是刚入门者。
  小学时学1+1,其实已经进入到符号思维的层面了。这是理论,因为你再不用具体到1个苹果或1个小朋友的层面了。而到了小学高年级学到a+b的时候,学运算的交换律、结合律之类的,1+1不就是很具体的应用了吗?
  说大学。高等数学、线性代数,数学类的科目,是理论。但若学一下泛函分析、近世代数,那些分明很具体了呵。显然,学泛函、近代前,先学高数、线代。
  说计算机类专业的学习。数据结构、数据库原理,初学发现是理论,大部分人也这么说。联系离散数学想一想,这不全是应用层面的实践吗?
  而数据结构,确是理论。这是站在程序设计的角度说的。做各种项目,用各种语言,随便你要解决个什么问题,数据该如何表示,如何存储,在特定存储结构下,基本运算该如何实现,这些都是真实应用需要的基石。
  前面说的在纯理论堆里得心应手的个别人,是将你眼中的理论当应用的人。
  理论和实践有层次,但千万不要理解偏为社会分工有高低。随着长大,我们总要在行业、学科中的某个层面找到自己的位置。社会的需要,每个人的生存、发展,需要有多个位置,各个位置上都需要有人做事。哪个层面的工作做得得心应手了,那都是专家。
  不管哪个层面,都需要娴熟于自己那个层面的实践,要熟悉直接支撑自己工作的那个层面的理论,对这个理论背后的理论有一点点了解,直到你再也不必了解的那个理论的理论层面。
  是的,随着学习的进展,自己要成为专家,成为高手的那个层就要定下来了。对你而言,何为理论,何为实践也就定下来了。
  
  (三)数据结构该如何学
  大学是专业学习的入门阶段。
  数据结构,是大学专业课中的“专业基础课”,这是大家的共识。这样的表述,意味着数据结构就是承上启下的。若说学某语言及其程序设计是1+1的话,数据结构就是a+b,后面还有解析几何、微积分。有了程序设计的直接体验,可以学数据结构,学数据结构中的理论,做数据结构层面的实践。等学过了数据结构了,操作系统、网络原理之类的课中,张口就是堆、栈、树、图,老师都不用多解释一句。
  数据结构是理论,也是实践。
  数据结构不是理论,也不是实践。
  看你站在哪个角度讲。
  在学习数据结构的时候,理论和实践要同步上。每一种逻辑结构,要解决的问题,数据的表达、存储,基本运算的实现,算法的复杂性,是要学的。光看懂书,能说明白不算,把这些东西能变成代码,这是科班人员的基本功。基本功是靠练才能出来的。
  为了学的感受好一些,为了能解答所学知识用在哪儿,怎么用,用所学解决点问题,也是应该的。这些东西要靠着老师讲,一是讲不了,二是他讲了不算,你做了才行。
  据此,对于要成为计算机科学与技术的科班人员而言,数据结构中的理论和实践,两手都要抓,两手都要硬。
  说“我会实践”就行了的,我觉得可惜。能做出来是一回事,你要清楚到底做得好不好,怎样做才是好的,是需要点理论的。会做的,一抓一大把,我们缺少的,是能做好的。
  说“我把书看懂了就行”的,我表示怀疑,可以混个及格还可以。经常,做一做实践,你会发现你未必真懂了。
  产生“偏理论”或者“偏实践”念头的同学,是遇到困难了。是进大学后,在学习上欠了账的。
  知道要实践,但一看代码就头疼,程序设计的实践没做够,甚至程序设计语言层面的知识都不过关。知道理论很重要,但学不下去,是理论之前的理论不扎实,思维跟不过来。而不扎实的理论,和没有经过实践也脱不了干系。
  这也就是我一直呼吁同学们要用实践的方式学程序设计的原因了。程序设计,作为大学中不必有先修课就学的课程,先不必找什么理论,直接实践起来就行。
  产生“偏理论”或者“偏实践”念头的同学,紧跟课程的进度为要。因为你有欠账,所以得加倍付出努力。紧紧跟住,是因为学数据结构中的实践,也是程序设计能力提高的方式。一旦遇到突破不了的点,补程序设计中的知识点。
  要不要先把C语言学一遍再学数据结构?至少数据结构快考试了,来不及。如果需要,假期时间自己重学一遍C语言是可以的。如果你真能协调好时间,现在做也可以。就现实的情况,以能将实践做下去为原则,C语言部分则是缺啥补啥更现实。
  
  
  

数据结构应该偏理论还是偏实践?相关推荐

  1. 从运维角度看微服务 k8s部署微服务【偏理论】【AL】

    从运维角度看微服务 & 部署微服务[偏理论] 1.微服务的特点 服务组件化: 每个服务独立开发.部署,有效避免一个服务的修改引起整个系统重新部署. 技术栈灵活: 约定通信方式,使得服务本身功能 ...

  2. 从零搭建一套结构光3D重建系统[理论+源码+实践]

    01 背景介绍 图1 典型3D结构光系统 尽管结构光作为一种已经相当成熟,并且广泛应用的三维重建技术,不同于深度学习,依旧缺乏相关的课程,网上的开源资料寥寥无几,即使有,也是晦涩难懂,许多刚入门的研究 ...

  3. RHCS集群理论暨 最佳实践

    RHCS集群理论暨 最佳实践 什么是集群? 集群是一组(>2)相互独立的,通过高速网络互联的计算机组成的集合.群集一般可以分为科学集群,负载均衡集群,高可用性集群三大类. 科学集群是并行计算的基 ...

  4. HOG:从理论到OpenCV实践

    HOG:从理论到OpenCV实践 时间 2014-03-11 22:55:57 CSDN博客 原文  http://blog.csdn.net/zhazhiqiang/article/details/ ...

  5. 三极管的“非教科书式”解析,什么正偏、反偏都统统滚蛋!

    什么正偏,反偏都统统滚蛋!!! ❤三极管有三个工作状态:截止.放大.饱和:放大状态很有学问也很复杂,多用于集成芯片,比如运放,现在不讨论:其实对信号的放大我们通常用运放处理.三极管更多的是当做一个开关 ...

  6. 数据结构与算法理论概述

    数据结构与算法理论概述 文章目录 数据结构与算法理论概述 数据结构概述 ◆ 数据结构涵盖的内容 ◆ 存储数据 算法概述 ◆ 算法的基本特性 ◆ 算法设计要求 ◆ 算法分析 数据结构概述 狭义上:数据结 ...

  7. 注意numpy与pandas里std中的有偏和无偏

    numpy 中 std默认是有偏的 pandas 中std默认是无偏的 有偏:除 n 无偏:除n-1 都取决于ddof 这个参数 ddof = 1 # 无偏 ddof = 0 # 有偏

  8. 怎么理解毕业论文中理论意义和实践意义的区别?

    有些同学在写毕业论文的时候经常会疑问怎么研究意义还要分成理论意义和实践意义,这两者该怎么写,有什么区别?现在就让我用实证来告诉你吧! 目录 1.  理论意义 2.  实践意义 3.  两者区别 课题研 ...

  9. 手段-目的理论定性研究实践经验分享

    手段-目的理论定性研究实践经验分享 -公司型项目需要尽可能高效率的定性研究,选取方法前必须对时间人力成本做出准确评估. -需要有分析方案,事先统一标准:初期需要多沟通,确保标准达成一致. -多人对同一 ...

最新文章

  1. 如何面对自己不喜欢的工作?
  2. Linux操作系统ssh默认22端口修改方法
  3. OC-NSString从文件中读取字符串
  4. ARM 之七 主流编译器(armcc、iar、gcc for arm、LLVM(clang))详细介绍
  5. java代码怎么打印格子,格子位置 (Java代码)
  6. 手机自动化测试IDE --手把手教你用Airtest模拟器来连接手机
  7. QT下的音乐播放器 (一)
  8. C#实现微信扫码支付
  9. 计算机游戏实践报告,关于在校学生玩电脑游戏的调查报告
  10. 【灵修】应对“三季人”,多活十余年(2012-1-14)
  11. python英文日期转数字年月日格式
  12. 普歌-码上鸿鹄团队:在Nuxt(vue)渲染模板中使用mock.js随机生成数据
  13. 美国弗吉尼亚大学计算机科学,弗吉尼亚大学计算机科学系学位设置
  14. 科普 | 数据安全与网络安全(一)概念篇
  15. [ACNOI2022]《普林斯普的荣光》
  16. 12门课100分,直博清华的学霸火了!“造假都不敢这么写”
  17. nginx过滤HttpHeader的 中划线
  18. app门户开发——recycleView的页面的点击跳转
  19. dex2jar源码解析----解析dex文件一
  20. Vue.js高仿饿了么外卖App学习记录

热门文章

  1. 《征服C指针》——读书笔记(4)
  2. 程序员必须掌握的600个英语单词
  3. 宝能汽车ERP系统SAP BASIS基础管理指南
  4. 堆的创建以及堆的基本操作
  5. 电脑入门学习最佳方法介绍
  6. 3.保安队的日子(下)我当程序员的那些事1
  7. 服务器安全狗linux,服务器安全狗Linux版(64位)
  8. Improving Multispectral Pedestrian Detection by Addressing Modality Imbalanece Problems(解决模态不平衡问)
  9. SCOM 工作概念介绍 [SCOM中文系列之四]
  10. uboot-----borad.c