第三十一章 Web是一个细节

你是上世纪90年代的开发者吗?你还记得web如何改变一切吗?你还记得我们如何看待我们旧的客户端-服务器体系结构,面对web的这闪亮新技术,不屑一顾吗?

其实web没有改变任何东西。或者至少,它不应该有。网络只是我们这个行业自20世纪60年代以来经历的一系列振荡中的最新一次。这场振荡在把所有的计算机能力放在中央服务器之间来回移动,然后集中于终端上。

我们在过去十年左右的时间里看到了几个这样的振荡,因为web太突出了。起初我们以为所有的计算机能力都在服务器群,而浏览器就是愚蠢的东西。然后我们开始在浏览器中放置小的程序(applets)。但是我们不喜欢这样,所以我们将动态内容移回服务器。但后来我们不喜欢这样,所以我们发明了Web 2.0,并用Ajax和JavaScript把大量的处理移回浏览器。我们甚至创建了在浏览器中编写的大型应用程序。现在,我们都非常兴奋,把JavaScript带回到Node服务器上。

(叹。)

无尽的摆动

当然,认为这场振荡始于web是不正确的。在网络之前,有客户端—服务器架构。在此之前,中央小型计算机还有一些哑终端(dumb terminals)阵列。在那之前,有一些带有智能绿屏(green-screen)终端的大型机(与现代浏览器非常相似)。在此之前,有电脑房和打卡设备...

所以故事就这样。我们似乎无法弄清楚我们想要计算机能力。我们在集中和分配之间来回摆动。而且,我想,这些振荡将持续一段时间。

当你从IT历史的整个范围来看,网络根本没有任何改变。网络只不过是在我们大多数人出生之前就开始的一场斗争中的一种振荡,在我们大多数人退休后,网络将继续保持良好。

但作为架构师,我们必须从长远来看。这些振荡只是我们想要从业务规则的中心核心中推脱出来的短期问题。

让我来告诉你Q公司的故事。Q公司建立了一个非常流行的个人财务系统。这是一个非常有用的GUI桌面应用程序。我很喜欢使用。

然后来到web时代。在下一个版本中,Q公司改变了GUI的外观和行为,就像浏览器一样。我被震惊了!哪有营销天才会决定在桌面上运行的个人财务软件应该具有网络浏览器的外观和体验?

当然,我讨厌新的界面。显然,其他人也是,因为几次发布后,Q公司逐渐取消了类似浏览器的体验,并将其个人财务系统重新转换为普通的桌面GUI。

现在想象一下,你是Q的软件架构师。想象一下,一些营销天才说服上层管理者,整个UI必须改变,看起来更像web应用。你该做什么?或者说,在这之前你应该做些什么来保护你的应用程序免受这个营销天才的影响呢?你应该已经从你的用户界面中分离出业务规则。我不知道Q公司架构师是否做到了这一点。

有一天我很想听听他们的故事。如果我当时在那里,我肯定会非常努力地将这些业务规则与GUI隔离起来,因为你永远不知道接下来的营销天才会做什么。

现在考虑A公司,这是一个可爱的智能手机制造商。最近它发布了“操作系统”的升级版本(我们这样谈论手机内的操作系统挺奇怪的)。除此之外,这“操作系统”的升级彻底改变了所有应用程序的外观和体验。为什么?我想是有些营销天才这么说的。

我不是该设备内部软件的专家,所以我不知道这个变化是否会给A公司手机上运行的应用程序的程序员带来很大的困难。我希望A的架构师和应用程序架构师保持他们的用户界面和业务规则相互隔离,因为总有营销天才在等待考验你的下一点耦合点。

结果

结果就是这样:GUI是一个细节。web是一个GUI。所以web是一个细节。而且,作为一名架构师,你希望将这样的细节置于与你的核心业务逻辑分离的边界之后。

这样想:WEB是一个IO设备。在二十世纪六十年代,我们学习了编写独立于设备的应用程序的价值。这种独立的初心并没有改变。web不是该规则的例外。

还是呢?可以这样说,像web这样的GUI是如此的独特和丰富,以至于追求一种独立于设备的架构是荒谬的。当你考虑JavaScript验证或拖放AJAX调用的复杂性时,或者你可以放在网页上的其他过多的小部件和小工具时,很容易认为设备独立性是不切实际的。

在某种程度上,这是事实。应用程序和GUI之间的交互是“健谈”(chatty)的,这种方式对于你所拥有的GUI是非常特殊的。浏览器和web应用程序之间的互动(dance)不同于桌面GUI与其应用程序之间的互动。试图抽象出互动,像设备从UNIX中抽象出来的方式,似乎是不可能的。

但是UI和应用程序之间的另一个界限可以被抽象出来。业务逻辑可以被认为是一组用例,每个用例都代表用户执行一些功能。每个用例可以根据输入数据,预处理和输出数据来描述。

在UI和应用程序之间的互动中,输入数据可以说是完整的,允许执行用例。完成后,最终的数据可以反馈到用户界面和应用程序之间的互动。

完整的输入数据和结果输出数据可以放入数据结构中,并用作执行用例的进程的输入值和输出值。通过这种方法,我们可以考虑每个用例都以独立于设备的方式操作UI的IO设备。

小结

这种抽象是不容易的,并且可能需要几次迭代才能得到正确的结果。但这是可能的。而且由于这个世界充满了营销天才,所以这种情况非常容易出现,抽象非常必要。

results matching ""

    No results matching ""