关于编程的思考

最近在看网易公开课中斯坦福CS106A课程,那位教授讲了一句很值得深思的话,大致是这样的:“在keral的世界中,我们应该使用keral的语言来告诉keral如何运作,而不是写一堆keral不认识的语句,试图让keral跑起来,尽管这些语句确实能让keral跑起来,这不是一种好的实践。……有一点非常重要,代码首先是给人看的,而不是给机器”。这番话让我特别有感触,引起了我对编程的思考,似乎让我窥见了编程的真谛。

编程最基本的目的

编程最基本的目的就是通过编程的手段来告诉计算机帮我们快速地处理一些传统问题,这些传统问题在计算机的帮助下能提高效率、节约成本。说白了,编程最基本的目的就是实现需求,程序如果无法满足需求,那么这个程序是毫无用处的,这是编程的最基本目的,也是最最最基本的要求。

程序好坏的标准

程序只要能实现业务需求,那就是有效的程序,但有效的程序并不代表写得好。显然易见,只在一个函数体内实现完整的需求的代码肯定不是一个好的程序,尽管它实现了需求,因为这样的程序实在太难维护了。那么如何才能称得上好的程序呢?其实教授说的一番话已经给了很大的提示了。

编程其实是编写一套新的语言

我们要好好地理解教授说的这句话:“在keral的世界中,我们应该使用keral的语言来告诉keral如何运作”在keral的世界中,我们可以理解为在某个领域范围之内;“使用keral的语言来告诉keral如何运作”,我们可以理解为使用某个领域的语言来告诉计算机如何运行。这样理解就很清晰了,编程其实是在编写一套某个领域的专用语言,这套语言应能准确地、充分地表达这个领域的方方面面,抽象出这个领域内所有的专有术语/概念,专有的流程,程序就是在这套新的语言体系下搭建起来的。举一些例子,如驱动程序,它的作用是让硬件运作起来,它的代码中应该形成一种新的语言,这套语言会包含硬件动作的一些专有术语/概念;又如操作系统,它负责把硬件协调起来,提供友好的用户界面,使用户可以操作计算机,操作系统本身就形成了一套新的语言,我们在使用的操作系统的api,linux指令就是语言的一部分了,这套语言都是在汇编语言、c语言基础上抽象出来的;再如我们写文章,是在某种语言的基础上(如汉语、英语),抽象出一些术语,这些术语可以说是一种新的语言,然后使用这套新的语言完成科研报告或新闻文章等。这样的理解与领域驱动设计(DDD)的思想真是不谋而合,DDD中的第一要点就是在项目的过程中使用通用语言,这套通用语言是要反映到代码中去的。另外,领域专用语言(DSL)实际上也是这么一回事,设计一种语言以适用某个领域使用。

简而言之,编程是在创造一套领域专用的语言,使用领域专用语言去实现业务需求。这样写出来的代码就是好的代码了。

这种思想说起来很容易,也很好理解,但在实际情况下,却不容易做到。这种思想最大的困难点在于需要对领域有着非常深入的理解,才能写出好程序,好的代码——这也是每位程序员永远的痛了。从这个角度又再一次印证了一句话:要成为一名优秀的程序员之前,必须要成为一名出色的领域专家!可惜,还有着很多程序员都存在这个误区。另外,这也说明了一个残酷的事实:编程大部分情况下都应该作为附属专业,而不应该将其视作主要专业,一旦把编程作为主要专业对待,那么就至少需要学习两个领域内的知识,一个是编程领域,一个是业务领域。这也解释了为什么程序员的日子如此之苦。

另外,必须要指出的是,编写越高层的代码,越难写得好。假设电商业务的代码是用java语言来写的,同时它也依赖于一些基础设施,如消息系统,数据库等等,这些基础设施本身也是有自身的一套语言的,这些语言都有其专用领域,如java语言是针对计算机方面的语言,数据库是针对数据存储和快速检索而设计的,所以数据库语言sql也只提供了数据存储和快速检索的表达(增删查改)。也就是说我们要构建出来的“电商业务的语言”是建立在多个专用领域语言的基础之上,就必须要协调领域语言之间的矛盾,如事务处理,消息系统与数据库往往是不同的事务范围内的。

代码是给人看的,更确切地说是给领域内的人看的

这个不用多说,只要能编写出一套好用的领域专用语言,自然可阅读性就强了。