关于计算机科学的学习

这篇文章的标题写了很久都没有开始动笔去写,因为随着学习的宽度和深度不断的扩大,越来越不敢贸然的去写这么大的题目。

首先这个文章是我自己的经验和思考,要适合个人的情况。

如何学习新事物

抓住概念,触类旁通。

上面这个两个词是一个高度的概括。扩展出来分成两个方面,一个是如何抓住概念,一个是什么是触类旁通。

抓住概念

在传统的学科中,概念是十分清晰的,尤其是数学、物理学的表述。这样经过总结下来的概念是什么呢?
就是描述这个事物的特点的严谨表述。
归根结底,现在科学发展的再高,也只是一种归纳,谁也无法确保数学的基础就是无法动摇的,物理学的基础还存在很多不同维度上的争议。所以现在的概念就是一种归纳。

这种归纳将这个事物独有的特征组合进行描述。符合了这个描述的东西我们就可以认为是这个东西。

所以当我们在分析事物的时候,除了我们本能主管可以判断的事物以外,我们就是利用这样的特征比对来进行分类判别。

为什么我们要进行分类判断,给这个东西一个定义呢?

为了应用前人的理论研究。举个例子,你知道一个直角三角形的两条直角边的长度,你想知道第三条边的长度,如果你不上升到理论的层次上去,你就只能去量。但是一旦你将这三个点上升到了直角三角形的理论分类中,接下来的思考就是理论上继续延伸出去,可以用三角函数、勾股定理等,在没有上升到理论层面的时候是直观的问题,上升到了理论上就是抽象的问题。

所谓科学与经验的区别,我认为某种程度上是直观与抽象的区别。

上面说的实际上是抓住概念的重要性。那么如何抓住概念。

很简单就是去找概念,总有别人定下的概念。
但是!计算机科学有其特殊之处,而且非常的独特的地方,就是,这个领域的很多概念是个体的思维抽象,其他的理论基础非常少。会出现什么问题呢,就是同样的事情,第一个发明出这个概念的人有很清晰的概念。当别人看到了这个东西或是理论以后,他会有自己的理解。这个理解就让人很头疼。有的时候,有些人的理解很形象,相比于最初的概念来说,很容易被人们普遍直观理解。但是,如果这个时候这个人对于原概念或是事物本身并没有理解的非常深刻,没有完全抓住这个事物的特点,那就会产生信息的缺失。

概念中的信息缺失是十分可怕的。

就比如你学习牛顿第一定律:一切物体再不受外力作用时,总保持匀速直线运动状态或静止状态。这是原生的概念,如果我说在一个光滑的平面上,放一个小球,不推他,他就静止在那里,推他一下他就一直保持匀速往前滚。这就是牛顿第一定律。

上面的这个表述对于一个初中生来说,确实很好理解啊。但是这个表示事实上出现了信息缺失,我说的是光滑的平面上,这并不是牛顿第一定律的特征,或者说只是符合条件的一个特殊情况。相比较原版的不受任何外力,对于这个定律的理解就会产生非常大的偏差,你可能会以为只有在平滑的平面上才是这样。

就是这样,很多时候我们想去快速的了解一个东西或概念是什么意思,于是就去问别人,或是看别人的转述,别人的理解。但是很多情况下,写下这些东西的人本身可能理解了,但是在表述上又讲不完全,导致你的理解会有问题。

所以你要去抓住概念本身,总结概念本身表述出来的特征,才能让你真正准确的理解这个问题。真正的概念和定理都是非常的简短且优美的,形式上的简单,思维上的复杂,所以需要花时间好好领悟出来。

在以前学习计算机相关的知识的时候,我会经常去看别人的博客,也能学到很多东西,但是有些时候就无法掌握一个技术点的精髓,尤其是一些算法的精髓。好在在学习算法并实现算法的过程中自己根据实践的经验也能够弥补这些不解,在实践中总结规律和特征。

在别人的博客中,学习的其实是经验,而概念,要找到源头去理解,好在那些发明了这些概念的人都还大部分建在。

触类旁通

任何事物和理论都不是孤立的。
计算机的很多理论都是相通的,一切的发展也都是有原因的。

当你知道了计算机的基本物理结构以后,你就应该能够想到一个程序的运行方式。计算机由运算器、控制器、存储器、输入、输出设备组成。那么代码一定是在运算器中运算,数据一定存在存储器中,程序如果要用数据一定也要从存储器中取到运算器中,从存储器到运算器之间的数据传输一定是需要时间的。所以你就知道为什么计算机要有内存和硬盘,因为要加速这个数据传输的过程。。。。

计算机的很多硬件的设计,其根源就在计算机的基本结构中。这也算是要抓住概念,抓住计算机的物理结构。
同样的很多程序在做优化的时候要优化那些东西,也都是源于硬件的差异,什么部件速度慢,什么部件速度快。

基本上从计算机的基本结构中我们可以触类旁通的拎出一串很长的技术线。

这是硬件层,我们的注意点再换个层面,从程序语言这个角度来思考。

低级的程序语言就是要操纵硬件和逻辑门,用什么来操作呢,用电压。高级的语言能不能被计算机理解,很明显不能,那为什么要有高级语言,因为要方便人的编写。那么高级语言势必要被某个东西转换成底层语言,这就是编译器的工作。怎么能让高级语言变成低级语言,这就要求高级语言一定不能太复杂,要有准确的规则,使得每句高级语言都能准确的翻译成一句底层语言而不能有二意性。

很多高级语言会有很多高级特性,比如什么动态绑定啦、继承、多态,你去想一下这些是否具有二异性,很明显没有。所以才能实现这样的高级特性。但是在我们直观来看多态本身就是要做到根据运行时的情况的不同去执行不同的代码呀,代码一经编译就是死的了,怎么实现的呢?肯定是在编译的时候加了一些控制代码,程序不可能活的。,肯定是死的。这个代码就是编译器去加的了。所以不同的语言有不同的特性,因为他们用不同的编译器嘛。

在此基础上在去理解什么设计模式,开发框架,就会简单很多。

计算机还有一个重要的分支,就是计算机网络。

从底层来说就是电信号或者是光信号转换成数字信号。所以每个设备都要具备一个转换器,有了转换器,我们就可以不去探讨物理上的问题了。回到计算机的问题。网络如何来认识目的地,肯定不能是单拉线,那么共用一个网络就要确认一下是不是到了目的地,就有了IP地址、Mac地址、路由、转发、协议等等。到了目的地怎么知道是发给哪个程序的呢?于是就有了端口,端口要实体的口嘛?当然不需要,因为你的电脑上没有那么多口嘛。

。。。

当你遇到一个上层的问题的时候,把这个问题往底层推,找到它的技术依赖点,然后你就可以懂了。

如果你看其他人的博客或是什么,他们一般会基于自己的知识,没有必要往下推问题才能理解,以为其本身很熟悉这个层次的问题,只是在这个层次去讨论,所以也不适合你去学习。

我觉得博客一定是要同一层次或者是略高一点层次的东西才有价值,过高的层次没有好的效果。

计算机科学本身

计算机是一门实践的科学。

在计算机中,一些工程上的设计思想其实非常简单。很多人只要逻辑思维清晰就很容易理解。这也是计算机行业的某些方面门槛很低的原因,也是很多培训机构看到的商机。

但是计算机的很多科学理论也是非常难理解的,计算机是数学、物理学、离散数学的应用。其伟大的基础并不是那么简单的逻辑就能理解的,就比如设计一门语言,并不是我们想想这样设计就能保证正确了。我们的逻辑思维虽然很智能,但是不完备,我们无法用逻辑去思考到所有的情况,为了避免逻辑上的遗漏,语言这样的设计工作都要上升到理论层面,从闭包的理论上去证明语言的正确性,也就是保证编译出来的底层语言是准确的,无二意的。举C语言的例子,语法就那么一点点,但是却几乎构建了整个计算机世界。无数人写出的千变万化的C语言代码中,没有一句话会有问题,这不是几个设计者用脑子去想出来怎么设计的,而是用理论去证明出来的。

计算机的理论可以很坚深,但是其应用也可以很简单。无论是哪一部分,都可以作出优秀的作品出来。

同时我认为计算机业界的规范还非常混乱,这样很难将经验抽象成理论,没有理论化的基础,这个科学的发展很快就会到瓶颈,因为人脑的能力有限,靠人去搞清楚这些并在记住这些东西的基础上再去发明新的东西是很浪费的。

学习计算机,关键还是要热爱,如果学着不快乐,活着有什么意义。

Talk is not cheap.