在有限的果壳创造无限的宇宙

在有限的果壳创造无限的宇宙

初学计算机,往往会给你一个幻觉,就是这样一台神奇的机器,能够做到很多你想象不到的事情。这一想法,本是无法可厚非。但如果将「计算机科学」看得过分神秘,或多或少,你将会将其当做神秘的巫术,而不是脚踏实地、按部就班的技术科学。即便是在该领域摸爬滚打多年的人,有时候还是能够发现自己潜意识中暗藏的对神秘和未知的膜拜。

计算机科学的一个神奇之处在于,它能够不知疲倦地24小时连轴工作,能够处理海量的数据、能够永不停歇地做计算。这往往会给人一个幻觉,就是:它能够容纳无限的数据,能够有无限的引擎资源做计算。可事实是,计算机科学的艺术的精义是:在有限的果壳里创造无限的世界。它并非具备无限多的存储空间,也并非具备无限多的计算资源,但它能够通过合理的规划,服务于源源不断到来的问题。虽然只有「有限」之身,却能够通过合理的规划,有条不紊地持续输出工作成果。

programming做到高阶,必然避免不了的问题就是对CPU和内存的精细控制,就是对进程/线程、内存的分配与回收。具体地说,就是对线程池的规划,对内存回收的精细控制,如 malloc/free 或 GC(garbage collection)原理与机制的精准掌握。

一般研习programming的道路,一定是以示例为主,在建立起足够多的应用直观之后,才能够逐步加深对某些概念的探讨。这一方式也可以理解,毕竟,代码的世界是一个看不见、摸不着、但又真实存在的形式上的世界。但这就导致了一个问题,即是:这样的入门比起其它一些看得见、摸得着的学科来讲,还太过粗浅,甚至,这根本就不能算作是「学科」的入门,只能算是类似于幼儿园小朋友的「实践活动」课。因为作为「入门」,它没有介绍清楚它的目标、基本核心思想、体系结构。但矛盾的地方在于,如果要能阐述清楚这些东西,又必须事先建立对这些抽象概念的了解。于是,先有鸡还是先有蛋的问题就开始了。而要解决「鸡」「蛋」问题,最好的办法还是先从「直观」的那一端入手。然后等到「直观」建立得差不多的时候,再重新来一遍「入门」的教育。

当你已经具备一定程度的programming实践经验后,你应该重新回到原点出,重新思考一下关于「入门」所应该覆盖到的几个基本要点:这门学科需要解决的问题是什么、它的核心指导方法论又是什么、它的知识体系结构又是什么。这些基本的问题,需要不断地回过头来去审视自己。不断尝试回答这些最基本的东西,能够让你对计算机学科梳理得更为清晰透彻,也能够对其本质做更为深刻的理解。

计算机所提供的核心服务,是快速地执行机械性的工作,即快速执行分配给它的指令。但这样的优势并非毫无限制,它受制于有限的空间,更受制于有限的时间,还受制于将「现实问题」转化为「可执行指令」的准确性、有效性和条理性。而它们分别对应了:

  • CPU资源的高效复用。
  • 内存、硬盘资源的高效复用。
  • 代码实现、软件工程:代码的高效组织,即:代码本身的高效复用。

初阶developer的主要功夫,主要花费在代码的实现,以及一定程度上的软件工程的有效组织。高阶developer则会越来越关注资源的复用效率,即:CPU/内存的管理。更往上走,则是对这些技能的综合考虑,毕竟,这几条目标并非泾渭分明,很多时候,每一条的提升能够促进其它方面的提升,从而形成相互影响的放大效应。这正如「数据结构」同「算法」是密不可分的:算法的提升有赖于数据结构的精准选取,数据结构的创建也有赖于算法提升的需求。

当我们谈论一段代码、一个组件、一个框架时,我们其实需要了解:

  • 他们的所服务的目标是什么;
  • 他们存在的意义是什么,即它被创造出来的motivation是什么;
  • 它实现自身目标的核心机制与原理是什么;
  • 这些实现方式,是如何管理计算/存储资源的;
  • 实现目标、管理计算资源,是以何种方式被高效统一地组织起来的。

如果你对所使用的工具,无法了解到计算资源是被如何管理的,那么,你对它的掌握就还不够彻底。为何?因为凡是屹立于计算机之上的存在,都受制于这个「大环境」的硬性约束:CPU、内存的资源限制。如果这些「根本性的约束」对你来讲是一个黑箱,那么,你就永远无法这款工具的一些根本性的取舍标准。只有了解到了这个程度,你才能够看到在根本性的限制之下,为何要做一些貌似奇怪的取舍,为何要如此来设计系统。

发表评论