写这篇文章是因为今年我又担任了新生班主任,信息学院计算机科学与技术专业19级1班,也是我校今年录取分数最高的一个专业。今年正好是我教书,前我第一次担任班主任的情景还历历在目,如今9905班的学生已投身到各行各业,并成为各企事业单位的中流砥柱,其中有华为中层骨干,英伟达亚洲区技术高管,还有人工智能AI、机器人教育的专家等等。学生成才,这是当教师的最大幸福吧。
我经常给学计算机专业的学生讲,学计算机是最辛苦的专业,为什么?我们普通计算机的CPU一秒钟运行80亿条指令,即一条指令完成的时间是80亿分之一秒,这个时间我们完全无法想象,而我们却还要把一条指令分解为十几条微指令,学习计算机完成一条指令的全过程,更要命的是这些学习是看不见、摸不着的。这还仅仅是计算机的底层,而要从硬件到软件、从原理到应用、从机器到AI,成为计算机专业的翘首,同学们要投入的时间和精力是其他学科无法比拟的。
计算机专业是最好的专业,也是最坏的专业,最好是因为计算机代表人类最为先进的生产工具和技术,有非常广阔的前景;最坏是因为如果你没有学好,而其他所有专业都要学计算机,那将来你一无是处。想要比别人强,唯一的途径就是你比别人花更多的时间和精力学习。值得庆幸的是,随着互联网的发展和我国自身计算机技术的进步,我们的学习资源越来越丰富,计算机大牛提供的学习博客、知名企业提供的学习资源应有尽有。当然,在海洋中游泳,如果没有方向,茫然不知所措,也上不了岸。对于刚进入大学的新生,了解计算机科学与技术专业的知识体系,把握学习方向,至为关键。
1万丈高楼从坚实的基石而起
整个计算机科学就像人一样,有两条腿。一条叫做数学基础,一条叫做物理基础(不是指物理学科)。数学主要指的是数理逻辑。其中比较重要的是形式逻辑系统、图灵(Turing)论题和丘彻(Churcher)论题。形式逻辑系统用逻辑的方法描述这个世界,在寥寥数条公理和推理规则之上构筑了整个逻辑系统、数论系统乃至计算机科学。Turing论题是计算机科学的基础,它点出了形式逻辑系统的威力:只要是人能计算的,机器都能用形式逻辑的规则进行计算。并且它提出了一种实现的方法,就是Turing机。Churcher论题指出了形式逻辑系统的不足:人能证明的,机器不一定能证明。更准确的说是,在形式逻辑系统中,不存在一种通用的算法,能判断所有命题的真假。这就是计算机科学的数学基础。
而计算机技术的物理基础就是数字逻辑电路。这里不说模拟电路、电磁学,因为感觉和“逻辑”联系不是很大。首先数字电路中给出了逻辑的电路实现,例如如何实现这样的电路:仅当两输入均为高电平时输出为高电平——与门。然后数字电路给出了组合逻辑的设计方法。这直接使算术逻辑单元(ALU)的设计成为可能。最后,数字电路给出了时序逻辑的设计方法,典型的结果就是寄存器、计数器的出现,使得时序控制成为可能。我们院把《模拟电路》和《数字电路》合成了一门课——《电路基础》。
工科开的数学都是《高等数学》,而我大学读计算机专业学的是《数学分析》——只有数学系开这门课,且每周六节课,上三个学期。它们的区别是《高等数学》删除了《数学分析》中较困难的理论推导、证明部分,强调套用公式计算。个人浅见,对计算机专业的学生而言,追求算来算去的所谓“工程数学”就是走进了误区,记上一堆曲面积分的公式,难道就算弄懂了数学?公式随时可查。数学是从实际生活中抽象出来的理论,之所以要将实际抽象成理论,目的就在于想用抽象出来的理论更好的指导实践。《数学分析》偏向证明型的数学课程,对我们培养良好的分析能力极有帮助。将抽象的理论再应用于实践,不仅要掌握解题的方法,更要掌握解题的思想。掌握证明过程即掌握定理的由来,训练自己的推理能力。只有这样才达到学习数学的目的。
《离散数学》对于计算机专业至关重要,它包含了集合论、逻辑、图论、组合、抽象代数、数理逻辑(数论),可惜的是往往由于课时不够,有些是讲不到的。计算机专业的学生不懂组合和数论,也是巨大的缺陷,要去更高层次的研究理论,吃亏大了。《线性代数》、《概率论与数理统计》都是很重要的课程,可惜也会少讲些东西。
介绍一个人:唐纳德·克努特(Knuth),算法和程序设计技术的先驱者,百万言的《计算机程序设计的艺术》堪称计算机科学理论与技术的经典巨著,其作用与地位可与数学史上欧几里得的《几何原本》相比,被《美国科学家》杂志列为20世纪最重要的12本物理科学类专著之一,与爱因斯坦《相对论》、狄拉克《量子力学》、理查·费曼《量子电动力学》等经典比肩而立。Knuth认为,传统数学研究的对象过于抽象,导致对具体的问题关心不够。他抱怨说,在研究中他需要的数学往往并不存在,所以他只能自己去创造一些数学。为了直接面向应用的需要,他提倡“具体”的数学。Knuth是把理论数学在计算机科学应用中“具体”化的第一人。
理论计算机科学目前主要的研究领域包括:可计算性理论,算法设计与复杂性分析,密码学与信息安全,分布式计算理论,并行计算理论,网络理论,生物信息计算,计算几何学,程序语言理论等等。这些领域互相交叉,而且新的课题在不断提出。这些研究无一不跟数学紧密相关。
2庞大复杂的计算机科学与技术专业知识体系
仅仅是数学和物理远不足以构成计算机科学与技术这样庞大复杂的知识体系。从历史的角度来看,对计算能力的渴求直接造就了计算机的出现。什么是计算机?高效完成计算的机器。为了实现用机器来高效计算这个目标,我们至少需要解决两个问题:首先,如何和机器沟通,亦即如何让它明白自己应当做什么,这就是软件知识系统的起源。然后,机器自身如何运作,这就是硬件知识系统的起源。再后来,随着时代的进一步发展,又诞生了很多对计算能力也有需求的新的科学分支,于是如何应用计算机的科学也就应运而生了。下面将从硬件、软件、应用这三个层次,自底向上分析计算机科学技术的知识架构。
数字电路已经实现了ALU、寄存器(存储器)等等基本部件。下一个问题就是如何用这些部件构成一个能完成高效计算的机器。现代常用计算机的体系结构是由冯.诺依曼设计的,称为冯.诺依曼结构。他把整个计算机拆成了5大块:运算器、控制器、存储器、输出设备和输出设备。计算机采用2进制。指令和数据以同等的地位存放在存储器里。计算机进行计算时,控制器负责全局的调度,先去存储器拿指令,然后根据指令的内容(比如要求计算a + b)去存储器取操作数(比如取回a和b)。随后将操作数(a、b)和操作类别(加法)送给运算器,运算器算好了再根据控制器的指示把结果(a + b的和)送回存储器。这就是计算机中最简单的工作流程。关于计算机究竟是怎么干活的,在《计算机组成原理》这门课中进行介绍。这门课程不仅介绍了整个计算机系统的组成,而且分别详细介绍了各个部件的工作原理,比如总线、存储器等等。最后,还会涉及到CPU的设计等问题。
硬件实验也是硬件学习不可或缺的组成部分。数字电路实验主要给同学们一个实践基本的电路设计方法的机会。现代的电路设计不像以前画电路图,然后手工蚀刻那样麻烦,而是采用硬件描述语言(HDL)的方式。在电脑上敲敲代码,告诉电脑你想设计一个什么样的电路,电脑就会自动进行综合、布线,最终将结果烧到FPGA或者CPLD这样的芯片里就可以直接用了。数字电路实验就是让同学们体验一下这样的过程,了解HDL和FPGA的基本使用方法。至于计算机组成原理实验,主要是让同学们利用HDL设计计算机的各个部分,如寄存器堆、时序控制部件、SRAM、程序计数器等等。最后设计一个简单的8指令CPU。
有了计算机组成原理的基础,计算机就可以造出来了。更高一层的课程是将原理拓展到实践——《微机原理》。这门课程以现代常用的x86架构为例,介绍8086处理器典型的指令,让人和电脑的交互在现实中成为可能。在这门课里,将会教授如何通过机器语言和汇编语言与电脑进行最底层的沟通,让电脑按照人的指令进行计算。可以说,到了这门科学发展起来的时候,计算机已经进入实用的阶段了。
一门科学不涉及定量的数学计算,自称“科学”时总是没有什么底气。本科阶段接触的硬件方面的顶级课程——《计算机体系结构》——就给了硬件科学这样的底气。这门课从数学的角度介绍了定量评估计算机性能的方法,并且从不同的角度给出了优化计算机性能的手段:指令集的合理设计、流水线技术、高速缓存的合理设置等等。至此,本科阶段学习的硬件课程告一段落。
下面介绍软件方面的知识。这一部分对于非计算机科学与技术专业,比如计算机应用、计算机工程甚至非计算机专业的同学来说就相对熟悉了。在介绍整个知识体系之前,我们先来看一下典型的软件开发的流程:拿到一个软件开发任务——往小了说比如就是平时上课的一个project,第一步就是需求分析:分析这个程序的输入是什么、输出是什么,输出和输入之间满足怎样的数学关系。在确定了需求以后,需要进行的就是《算法分析》:分析这个问题如何进行求解。根据典型的算法设计思想,结合既有的常用算法确定适用于这个问题的算法——是用最土的深搜,广搜,还是动态规划、贪心,或者更高级的A*搜索、子句归结等等。确定了算法之后,就需要根据设定的算法来确定算法实现的基础——《数据结构》。比如算法只要求对相邻元素的访问但是插入删除操作频繁,采用链表就好;要求对线性元素的随机访问,就需要顺序表或者哈希表等等。在确定了数据结构以后,不要忘了对整个软件的架构进行验证:根据算法划分的模块是否足够合理,它们能否正常配合工作?因为整个程序的架构一旦到了实际编码阶段很难再更改,所以在编码前应当专门留心思考。接下来的工作就简单了:实际编码、调试、测试等等。当然,以上的各步之间顺序是可以更改的,比如Thinking in C++就建议在设计程序前先编写测试代码,而《软件工程》则要求在整个开发过程中维护开发文档等等。
从软件开发的任务出发,就可以很容易的领会到软件科学的体系架构了。首先,我们需要有一种高级语言来与电脑进行符合人类思维的交流。在它的基础上,就可以实现数据结构,从而为算法的实现打好基础。数据结构之上自然是算法。再往上是一些架构性的程序设计思想和规范,比如面向对象的思想、软件工程的思想等等。现代软件设计程序和数据是分开的,即相互独立,而独立管理数据的数据库系统——《数据库原理》也要重点学习。软件科学到此似乎就比较完善了。但是不要忘了高级语言下面还有支撑它的基础:编译器和操作系统。这两门课:《编译原理》和《操作系统》就成为了沟通软件和硬件之间的桥梁。
至于计算机应用,涉及到的领域就太多了。举例来说,《人工智能》、《数字信号处理》、《计算机网络》、操作系统等等等等。这里将操作系统也列为计算机的应用,是因为它的实现也用到了很多计算机科学的知识,比如算法、图论等等,也是需要下层知识的支撑的。每一门领域中,又各自有它自己的数学作为基础:比如人工智能需要形式逻辑,数字信号处理需要信息论、积分变换和采样理论,计算机网络对概率论的应用较多等等。因此,计算机应用可以分为两层,下层是数学,上层则是各个具体的学科。
到这里,整个计算机科学技术的知识系统基本上阐述完了。在整个体系中,数学贯穿了始终。可以说,数学是计算机科学技术的灵魂,扎实的数学基础对于这个专业的学生来说是相当大的优势。
3技术与科学不能分家
人工智能是目前比较流行的计算机技术,但大学里学习人工智能有点像学数学似的学一些现成的结论,建议学会分析问题,最好能利用程序设计实现。随着计算机技术的发展,计算机网络技术日新月异,网络成为社会各个领域不可缺少的组成部分,只要网络存在,网络完全就是一个必须解决好的问题,学习网络安全不是简单收集一些黑客软件,而是要学习它的数学原理、实现原理、搞清底层工作机制,这样才能解决大部分的现有问题和新出现的安全问题。软件工程技术目前主要是Java(开源)方向和.NET(微软)方向,然而不仅仅是写程序这么简单,掌握一门语言两三周就够了,但要做出一个优秀的软件产品,如何更好的与人交流至关重要。计算机技术的前沿还有大数据、云计算、量子计算机等等。
计算机技术牵扯的内容实在太广泛,从教育的角度来看,国内高校的课程安排无法做到合理,强调理论,又不愿在理论上深入教育;无力接受新技术,想避开新技术又无法避得一干二净。这就造成了学生对学习的困惑,低年级的学生很少有人知道学一门课程的目的,期末考试结束了也不知道学这科做什么用。这就失去了读计算机科学的意义。
我教了计算机专业,近几年更在带团队、带学生做项目、搞竞赛,我想提醒大家的是:技术与科学是不能分家的,学好了科学同时搞技术,这才是上上策。犹如英语,以前我们与老外交流必须要个翻译,现在满大街的人都会说英语,就连英语演讲比赛的冠军都轮不到英语系的学生了。计算机也是一样,计算机真就只是一个工具,如果不具备其它方面的素养,计算机系的学生虽不能说找不到工作,但总有一天当其他专业性人才掌握了计算机技术后将比我们出色许多。原因就在于计算机解决的大都是实际问题,实际问题的知识却是我们少有的。单一的计算机技术没有立足之地。
“当你选择了计算机这一门科学,就意味着你踏上了一条不归路,就意味着你一生都要为之奋斗......你的身后是悬崖,只有向前走,不能往后退。”
4结束寄语
大学不是“象牙塔”,它通过人才培养、科学研究、社会服务、文化传承和创新来不断推动国家发展和人类的文明进步,作为新时期的大学生,肩负着为民族独立、国家富强、科技进步而努力奋斗的崇高使命。无论是我们湖南理工学院还是哈佛这样的世界一流大学,都只是为学生的成长提供条件和帮助。启迪心智的课程、深邃洞察的讲座、挑战自身的实践、丰富多彩的校园文化生活,大学犹如百花园中肥沃的沃土,教师精心培育浇灌,但是记住:除了你自己,任何人都不能担保你会有成功的人生,命运掌握在你自己的手中!
面对丰富多彩和鱼龙混杂的未来,我们比任何时候都需要强大的内在理性和人文素养,需要独立思考、批判能力和决断能力。我们看到太多的人宁愿相信似是而非的传闻,而没有耐心等待真相出现;宁愿拿网上信息做快餐式的拼凑,也不愿宁心静气的思考;互联网让世界越来越小,也使信息变得纷繁复杂、混沌不清,我们的社会多么需要理性宁静,而这些正是你们需要在大学磨炼的,因此,我建议大家除了我们的专业书,多读人类千百年沉淀下来的经典名篇,少看花边新闻;多用评判的眼光审视现成的结论,而不是盲从迷信所谓的权威;多花时间参加集体活动,锻炼交流沟通能力,而不是沉湎于虚拟世界的幻觉;更多的培养学习“科学的方法、公正的态度、果断的决心”,而不是把生命浪费在眼前的急功近利上。
如果觉得《计算机组成原理r型指令logisim实现_大学本科计算机科学与技术专业知识体系》对你有帮助,请点赞、收藏,并留下你的观点哦!