计算机科学是什么?从某种程度上来说,计算机科学并不能称为科学,而更应该称为工程或者艺术。称之为工程是因为在使用计算机从事生产创造的工作中,其中包含了大量的经验和技艺。称之为艺术则是因为其与魔法一样有着众多神奇之处,如艺术般展现着人类智慧惊人的创造力。另一方面,计算机科学甚至与计算机也不紧密相关,就像数学并不与数字密切相关一样,生物学并不与显微镜密切相关一样。计算机科学并不仅是研究作为工具的计算机实体,它更多关心的是如何对计算过程进行形式化表述,关心如何解决问题。而这些关于如何解决问题的表述,就是计算机程序。很喜欢一个比喻,在计算机中生活着执行操作的精灵,而计算机程序则是控制这些精灵的咒语。学习一门计算机语言,便是掌握一种控制精灵的咒语。自然地,码农的真实身份是会使用咒语的魔法师。实际上,相比人类语言,计算机语言的规则要容易的多。任何计算机语言都仅由三个要素组成:基本对象,组合方式,抽象方式。了解这三部分内容,便也了解了一门语言。但真正的难点在于如何使用这些规则,来形式化这种有关”如何做“的指令性知识。
这种如何做指令性知识难在哪呢?真正的难点来自于构建规模庞大的系统时,如何控制复杂度。当面对几千页的代码时,一个人的脑子是无法同时装下这么多东西的。这些控制复杂度的技术,便是计算机科学的真正议题。总结起来,共有三点控制复杂度的技术:
黑盒抽象 。即将一些东西封装起来当做整体看待,隐藏起盒中的细节,从而细节中抽身出来去构造更大的黑盒。这其中艺术与智慧便体现在何种层次上进行抽象,好的抽象策略往往能抓住事物中最本质的模式。不同的抽象水平反应了对事物的不同认知水平,最深刻的抽象常常能让人叹为观止,对人类智慧产生深深的敬仰与赞叹。
-
建立约定的接口。约定的接口是控制复杂度,进行模块化设计的另一利器。约定的接口为构建大规模系统提供了巨大的便利性。其可进一步产生两种不同的编程模式:
- 面向对象的程序设计。在这种模式中,整个系统可以看作一个社区,社区中各个部分通过传递消息来进行交互。这些消息的形式便是由这些规定的接口所定义,从而使得各部分能准确无误进行沟通。
- 函数式程序设计,又可称为基于流的操作。这种编程模式直接抹去了面向对象的程序设计模式中的状态和变化,事物的动态性源于其以时间点作为参照,但如果从整个时间长河来观察,整个动态的过程便是一个确定性的静止状态。站在整个历史长河中看待事物,任它潮起潮落,我自岿然不动。
同是通过约定的接口控制复杂度,但折射出了不同的世界观,何其妙哉!
元语言抽象。换句话,便是设计一种新的计算机语言,来隐藏背后的复杂性。新语言的设计意图是为了强调系统的某个方面,同时弱化其他部分。LISP, C, C++, JAVA, JS, Python, Scala, GO...这些精灵的语言,便是那些伟大的魔法师们开创新纪元时所创造的咒语。
不过,纸上得来终觉浅。就像了解象棋规则并不能成为象棋大师一样,想深入领略计算机科学的美,成为优秀的魔法师也需要付出汗水的努力与修行。在这里给大家强烈推荐一本书,《计算机程序的构造与解释》,也称为SICP. 这本便涵盖了我前面所讲的所有内容,给人以无限的启迪,体会到计算机程序的深层次的美感。前前后后这本书我总共刷了三遍,第一遍因为不得要领,胡乱的看了前面两章便放弃了。第二遍耐着性子认真读完了三章,但因为课后习题没怎么做过,后面越看越吃力便放弃了,但仍然有种醍醐灌顶之感。最近刚刚三刷SICP,来了套组合拳,看书,看视频,做习题,愈发领会到其中精妙。三遍下来,虽然有一些弯路,但还是收获满满的。如果没有看过这本书的小伙伴,我在这里推荐一种学习方式:
- 书和讲课视频结合起来学习。书已经是神书了,视频更能让你领悟到神书的精髓。视频传送门 https://www.bilibili.com/video/BV1Xx41117tr?from=search&seid=8006333518411622555
- 课后习题要做,如果没时间做,也要花时间思考,对理解本书有着至关重要的作用。而且计算机作为一种工程类学科,手上功夫必不可少。不过相信我,畅游在思维的海洋,你会乐在其中的。对于做不出来的题,可以参考前人编写的答案:https://sicp.readthedocs.io/en/latest/
- 需要下载一个LISP的开发环境用于编写代码,我个人用的是Racket这个IDE,其中集成了LISP这个语言的解释器。https://www.racket-lang.org/ . 或者也可以使用MIT提供的scheme解释器,https://www.gnu.org/software/mit-scheme/.
另外还有一些小提示:
- 其中讲解LISP语言的部分一定不要跳过,书中代码和讲解均由LISP讲授,好在是LISP规则非常简单。
- 书中页底注释也尽量不要跳过,有些注释还是很有价值的。
记得在没读这本书之前在豆瓣上看到一篇短评,燃起了我好好学习这本书的兴趣,“SICP,尽管只读过前三章也深深体会到,这是一本启发思维的书,它燃起你编写出色程序的热情;它还将教会你认识并欣赏美;它让你有种敬畏,让你难以抑制地渴望学习更多的东西”, 诚不欺我!现在这本神书也分享给大家,希望喜欢。
历史长河滚滚向前,社会仍在进步,科技仍在发展,人类社会仍在不断面对新的挑战,面临着前所未见的复杂性,而这一切都在等待着新晋魔法师们运用自己的智慧去征服去创造。美而壮丽。翻滚吧,魔法师们!
欢迎大家关注我的公众号:范维的科技之旅