平台框架-101

原文首发于我的微信公众号:GeekArtT .

将源代码编译,加载进入内存,相应的构建于程序员脑海中的程序便在计算机上跑(run)起来了。这看似简单的步骤背后,却是一个从无到有的施展魔法的过程。

初学programming的时候,不太能够分清楚手写的源代码和在内存中运行的机器代码(运行时代码)的区别。一直被教育,机器代码是通过源代码的编译生成的。机器代码所做的事情,会完全依赖于源代码所表达的意图。或者可以被通俗地理解为:因为源代码是人可以识别的语言,机器代码是机器可以识别的语言,而编译,便是将两者做了一个翻译而建立起来的桥梁。

如此,在我脑海中建立起来的两者关系便是,这两者就是完全等价的一回事。你想要机器做什么,那么只要在源代码里体现就好了。这一说法的直接推论便是:如果我在运行的程序中发现缺少了什么功能,那么直接在源代码里增加修改就好了

而这其实是一句表面上政治正确,却在细节上会造成完全不同理解的模糊说法。而如果你恰好在细节上将差别弄错,那么你对整个程序编写的认识、对软件工程存在的意义以及API框架设计的好坏标准,将会形成完全错误的理解(事实上,曾经的我,正是在这些方面陷入过深坑)。

编译前的源代码和运行起来的机器代码,表面上是一个一一对应的关系,但实际上已经是两个不同的时空世界。虽然运行起来的代码是完全根据源代码指定的规则和意图来做事情。可一旦机器代码运行起来,源代码将对运行时的代码毫无办法,产生不了一点影响。你不能够通过临时增加一些源代码的方式,来为运行时的程序增添一些功能或者feature。你只能老老实实地利用好当前运行着的程序为你提供的现成功能。

这里的trick是,运行时的代码已经不是代码了,它已经是运转起来的机器,或者说机器状态。而源代码提供的是让计算机如何运行的步骤指令,你可以把它理解为一份分步骤操作的菜谱。而处在运行时的程序,它已经是一套按照源代码的指令转动起来的机器。在这个程序中,它有且只能做之前源代码规定好的事情。如果要想让计算机产生别的行为,那就不得不让计算机停止当前的运转,然后重新塞给它一份执行步骤的说明书,然后重新开始运转。

所以,通过修改源代码,你确实可以为程序增加新的功能,但你不得不把当前的程序停止掉,然后重新构建计算机运行的状态。

如果用相对粗糙的比喻可以理解为:如果把程序员看作是能够施展法术,让微观的原子形成现实宏观世界的物体的魔法师(请脑补SICP的封面图案),那么这些原子便是源代码,而运行时的机器代码便是相应物理世界的物体。一旦物体形成,你便只有使用物体的能力,却没有再次更改物体性质的能力。也就是,你没有办法通过操作原子的排列方式,将手中的一把大刀,变成一杆长枪。

从这个角度讲,编译前的源代码和运行时的代码,是处在两个不同时空的存在。一旦机器运行起来,你便只能够使用当前运行着的程序所提供的功能去做动态操作(也就是对运行的计算机做操作),你不能够通过增添源代码的方式为当前的程序制作新的功能。

于是,程序在运行状态时所提供的这些功能,便是一切的关键。因为它们是构成你将来一切操作的原始操作(元操作)。这便是程序所提供的API了。

一套程序提供API的意义,并不是它能够以多么不同的方式对计算机做影响,而是它能够对它所形成的“它的世界”做多少影响。举个例子,一款游戏程序的计算方式、调用CPU的方式、让显示器呈现图像的方式并不会有多么的独特和不同。关键在于游戏里提供的操作方式(可理解为终端用户的API),是你唯一可以运用的、拿去攻击boss并对boss产生影响的方式。你无法通过计算机上一般性的“减法操作”,来减少boss的血槽值。

既然对你建造的这个MyApp的程序世界的所有影响,都要由这些基础的API来构成。那么如何设计这些API,让它们足够少、却又能够提供足够多的组合方式,去满足你对MyApp世界的各种需求,就成为了关键。

一个极好的API设计案例,当然是数学领域的几何学。通过《几何原本》上描绘的几条基本定理,便将欧式几何世界的性质、操作和需求全部囊括。而仅仅是改变第五公设的论述,又形成了另一套几何世界——非欧几何。并且也是这么几条基本公理(API),便将非欧几何的需求、操作全部囊括。

从这个角度来讲,某一个程序的一组精挑细选的API,便可以看作是数学领域中一个分支的公理假设集。而每一套这样的API,便构成了一个独有的世界。所以,这套精简的API便是支撑整个你创造的世界的骨架,也就是通常所说的框架了。而这套框架,事实上形成了一组构建世界的工具箱,或者是工作坊,也可以叫做工作平台(platform)。因为在这个平台上,你可以建造、加工你所处的MyApp世界。那它当然是最核心也最富有潜力、想象的基建设施平台了。

那么,一套程序(产品)是否具备平台意识,其实决定了它未来的想象。例如,如果你的程序只能够做规定它做的事情,没有任何开放给开发者的API,那它就只是个固定的东西,而不是一套可以完善、成长的生态系统。例如,一款俄罗斯方块游戏,你能做的,便是按照规则去玩,不能够再添加别的新鲜想法。而反观Apple 处理自己App的方式,它不是说给你一个固定不变的App,而是给你提供一套可以建造App的工具/平台/框架,让你可以按照自己的想法去做各种不同的App,去构建你脑海中不同的世界。又或是Facebook这款社交软件,它并没有选择成为一款静态的产品,而是提供足够多的API,让作为开发者的你去完善它,去为Facebook的成长贡献一份力量。

所以,对于一个特定程序之外的开发者来说,ta并不是万能的 。而这个特定程序的构建者,才是那个上帝。如果这款程序的构建者,不提供对外开放的API,那么外来者便没有办法去对这个特定的程序世界做修改。另一方面,如果一款产品不提供对外的API,也就是不具备平台思维,那么它也将失去世界上其他程序员为它带来的生长养分。

 

 

 

近期回顾

新入手MacBook Pro环境搭建
做一名「技术掮客」去变现自己的技术
「极客时间」带来的社区价值思考

 

如果你喜欢我的文章或分享,请长按下面的二维码关注我的微信公众号,谢谢!

 

VIP赞赏专区

posted @ 2017-11-01 21:52  kid551  阅读(770)  评论(1编辑  收藏  举报