聚焦与发散——浅谈编程的发展方向
最近在找工作,所以重新开始看书,重新整理知识体系,而现在上海的晚上很湿热,睡不着,就产生了这些想法。
不说更早的历史,就从dos开始说起。dos刚出来的时候是单进程的,根据人们的需求发展出了多进程的概念,而这种技术一直被保留到现在。现在的操作系统好像没有单进程的系统了吧。那为什么要有多进程,为什么会有这样的需求?比如你现在打开了word考试撰写文档,而又想要上网去查找一些资料,如果是单进程的,那就意味着打开了word就不能开IE,要开IE就要关掉word。那样操作起来肯定会很麻烦。这个和编程的发展方向有什么关系呢?暂且绕开这个话题,先看看我们写一个web网站是如何工作的。
web的工作方式,肯定需要是有一个宿主(专业点的说话,比如IIS、Apache等),然后写一段程序,把这个程序配置到宿主中,就可以访问了。 那什么是宿主,它在做哪些事情?刚才都说了宿主就是比如IIS之类的程序,可以理解为一个容器,它有一些接口,只要满足这个接口规定的程序,就可以在这个宿主中运行。为什么我们写的一面一定要以aspx后缀结尾?为什么aspx页面里不能写汇编?这个可以理解为一种协议。怎么理解这个协议的作用呢?那就要知道IIS所扮演的角色。当你访问IIS某个站点的某个文件的时候,它就知道去哪里、以什么方式来运行所要做的事情。这个和C#里接口的概念很相似,你只要满足接口,那么就可以扔到一个上下文中去执行。
假如,你来开发一个宿主,需要做些什么?首先,需要写Socket侦听,侦听到连接,开始接收请求的数据(HTTP协议消息),然后解析消息,按解析结果执行,最后返回结果。大致这么几个过程。而所有的人都在请求这个IIS,这就是聚焦。用户使用的客户端是发散的,而所有的请求,都会聚焦到这个点上。这个聚焦的点,在IIS内部就是Socket?事实上不能这样理解。HTTP请求所用的Socket是一对一的,也就是说,每个用户请求IIS之后,IIS内部对每个请求有一个隔离。每个用户都有自己当前请求的上下文,这个上下文是独立的,而我们的代码只有一份,所以的请求,运行的进程、线程,代码对它们来说就是聚焦的。就是说,现在我们开发的web应用,是在维护一份代码,而让他们可以发散地(多线程、进程地)工作。事实上,单机程序,c/s架构也是和web的开发方式一样的。开发人员不会为每个人开发独立的应用,至于个性化,那是软件的一部分。
这个道理谁都懂,上面的分析有点画蛇添足的味道,无量天尊!~~~
事实上我们开发的应用,不全是那样。比如静态变量等全局应用,是在运行时唯一的。在处理这些全局数据时,我们一般会lock,和数据库应用的悲观锁是一个概念。这个地方就会产生一个问题,全局数据会影响所有人的响应,一旦全局数据出错,那是致命的。这就是我们这里要讲的聚焦效应。静态数据是运行期有聚焦效应,而代码就是编码期有聚焦效应,并且这个效应更加明显。对一处代码的改动可能会影响很多地方,那么这里的代码就是聚焦的。在C#编程中可以理解为,接口、超类、生产者都是聚焦的。这个焦点改变了,那么影响是巨大的。可以想象下,凸透镜的焦距发生变化,要保证焦点不变,那么光源的光线就要全部变化。为了适应这种变化,各种理论发展起来,而OO就是其中之一。OO的多态是在拥抱变化,而这个过程就是发散的过程。
假设,现在开发的应用都毫不相干,没有任何可以提取公用的部分,也就是说,提不出接口,泛化不出超类,那整个代码都是发散的。而OO里面很关键的就是要提取不变的部分,设计会变的部分,这是代码重用里最重要的思想,我是这么认为的。我认为这就是一种聚焦思维,而未来一段时间编程的发展也会朝着这个方向发展。如果认为一个系统哪个地方都需要变化,那就根本没有代码重用的可能。而事实上,一个软件的代码中总有能重用的代码,那就是说总有不变的代码,总有聚焦的地方。这是不变代码的聚焦,对于变化的部分,我们也在寻求聚焦点,而这个过程需要作好设计。
对于变动的代码,有两种开发的方式。一个是提供服务的,而另一个是享受服务的。这句话怎么说呢?比如,在C#开发中,调用.Net Framework类库,那就是享受服务,这个是发散的。而提供服务最容易想到的就是工厂模式和委托。和在网站开发中模板的方式类似,在网页中设置一个替换符号,用内容来填充这个符号。委托也是这样,在一个应用中,定义了一个方法执行这个委托,我们不知道他的工作方式,但是我们已经在使用它,这应该算是一种逆向的思维。插件架构就是这样工作的,由配置来决定调用哪个类。而聚焦点就在这个超类或接口。
最后,可以看出,编写代码一共有三种方式。
第一、不会变化的,这是绝对聚焦的代码,一旦改变,后果不堪设想;
第二、类库式的,这是发散式的代码,类库不能控制你怎么提取焦点;
第三、框架式的,这个是聚焦于接口或超类的代码,不变动接口和超类,还是可以接受的。
以上贫道的一点浅见。明早还要去面试,睡了。