作为一个学了七年CS的学渣,一直没去了解过CS到底意味着什么.ComputerScience与其它Science的本质区别在哪?它与其它Science的共同点又在哪?直到最近读了ProblemSolvingwithAlgorithmsandDataStructures这书后,才开始去了解CS到底是什么鬼.
ComputerScience就是一门专门研究Problems与Problem-solving的学科.
面对一个问题,一个ComputerSciencist的目标就是找出一个算法(即解决方案),明确指示出如何一步步地解决该问题.
当然,这里还会涉及到可计算性的问题(P与NP),面对不可计算的问题,设计什么样的算法来满足解决问题的目标,也是一个CS的研究内容.
现实世界里的问题一般都会包含比较多的条件,把现实世界里的问题明确表示的过程中,不可避免地要进行一次抽象,去掉无关的边缘条件,保留该问题最核心的内容.
我们开车的时候,踩一脚油门车就动了,我们不需要去了解车是怎么打火的,发动机是怎么运作的.这种对解决方案的包装,展示给最终用户的界面,CS里叫Interface,现在互联网圈叫用户体验.
CS不是研究如何编程的学科,但编程,却是一个ComputerScientist工作中的一个重要组成.毕竟,CS目标是解决问题,编程是把这个问题的解决方案给最终实现的基础操作,重要性可想而知.
相信每个CS都听过上面这句,所有Data对应到计算机执行指令的时候都是0和
1,但各个编程语言会对这些01串进行「包装」,这样我们在使用这些语言的时候,就可以从包装后的「砖块」层级来考虑如何把算法用该语言表述出来,而不需要以01串的角度来思考.
各编程语言本身自带的这些对01串的「包装」叫做PrimitiveDataTypes.可以理解为天赋属性.语言好坏,很多时候从这里就可以做一个区分了.
对于复杂的现实世界问题,所有编程语言都不可能出厂时都「包装」好「砖块」让你砌墙.所以后来才会有了AbstractDataType的概念.通过支持自定义类,你可以自己去「包装」现实世界,抽象数据类型出来,想怎么玩就怎么玩.
有了数据结构,我们可以表示现实世界中的问题了.但仍需要更重要的一个东西来把我们的算法表述出来.表述算法的语句就是ControlStructure.
只要有了这三类语句控制,我们就可以表述算法了.剩下的工作就是把算法给翻译成这些语句的工作了,也就是编程.