在编程中,为什么说数据仍占主导地位?

640?wx_fmt=gif

互联网时代,究其根本,也是一个数据不断叠加的时代,而这对于开发者而言,又意味着什么?html

640?wx_fmt=jpeg

做者 | Simon Arneaud
程序员

译者 | 弯月,责编 | 屠敏
算法

出品 | CSDN(ID:CSDNnews)数据库

如下为译文:编程

如下引用的是2006年Linus Torvalds说过的一句话:微信

我很是同意围绕数据设计代码,我认为这是Git取得成功的缘由之一......事实上,我认为一位糟糕的程序员与一位优秀的程序员之间的区别就在于,在他心目中代码与数据结构哪一个更重要。糟糕的程序员关心的是代码,而优秀的程序员关心的则是数据结构及其关系。数据结构

这句话与2003年Eric Raymond提出的“表示原则”很是相像:架构

把知识叠入数据以求逻辑质朴而健壮。app

与1989年Rob Pike总结的想法也很相似:dom

数据占主导地位。若是你选择了正确的数据结构,并且进行了良好的组织,那么算法几乎不言自明。数据结构才是编程的核心,而非算法。

还有1975年Fred Brooks在《人月神话》中说道:

数据的表现形式是编程的根本

创造出自精湛的技艺,精炼、充分和快速的程序也是如此。技艺改进的结果每每是战略上的突破,而不只仅是技巧上的提升。这种战略上突破有时是一种新的算法,如快速傅立叶变换,或者是将比较算法的复杂度从n2 下降到n log n。

更广泛的是,战略上的突破常来自数据或表的从新表达——这是程序的核心所在。若是提供了程序流程图,而没有表数据,我仍然会很迷惑。而给我看表数据,每每就再也不须要流程图,程序结构是很是清晰的。

如上所示,近半个世纪以来,不少伟人反复强调:关注数据。然而,有时我感受人们忘记了伟人给咱们的编程忠告。

让我举几个例子。


640?wx_fmt=png

没法扩展的高度可扩展系统


这种系统的设计初衷就是为了处理CPU密集型负载,原本应该具备极佳的可扩展性。系统内没有同步操做。一切都是经过回调、任务队列和工做池来完成。

可是,这种系统存在两个问题:第一,毕竟“CPU密集型负载”其实并非那么CPU密集,在最坏的状况下,一个任务就有可能耗费几毫秒。因此大部分架构上的决定弊大于利。第二,虽然这种系统听起来像一个高度可扩展的分布式系统,但事实并不是如此,由于它只能在一台机器上运行。为何?由于异步组件之间的全部通讯都是使用本地文件系统上的文件完成的,这是目前全部扩展的瓶颈。原始设计并无说起数据,采用本地文件的方式只是由于“简单”。大部分文档讲述的都是关于处理负载“CPU密集度”所需的全部额外架构。


640?wx_fmt=png

面向服务的体系结构仍然是面向数据


这种系统遵循微服务设计,由单一用途的RESTful API组成。组件是存储文档的数据库(基本上是标准表单的响应以及其余电子文书)。这种系统天然会公开用于基本存储和检索的API,但很快就须要更复杂的搜索功能。设计人员认为将这类搜索功能添加到现有文档API将违背微服务设计的原则。他们认为“search”与“get/put”是不一样类型的服务,所以他们的架构不该该将它们结合在一块儿。此外,他们计划使用的搜索索引工具与数据库自己是分开的,所以在实现时也须要此建立新服务。

最终只能建立一个包含搜索索引的搜索API,而该索引基本上是主数据库数据的副本。该数据会动态更新,所以任何经过主数据库API修改文档数据的组件都必须更新这个搜索API。在不致使竞态条件的状况下,REST API不可能作到这一点,因此不管如何,这两组数据都没法时刻保持同步。

不论架构图作出怎样的承诺,这两个API仍是经过数据依赖性紧密耦合。后来人们认识到,搜索索引应该是统一的文档服务的实现细节,这样才能大大下降系统的维护难度。“仅作一件事”是数据层面的要求,而不是动做层面的要求。


640?wx_fmt=png

荒谬的模块化与配置的混乱


这种系统是一种自动化部署流水线。最初的设计人员但愿制做一个足够灵活的工具来解决整个公司的部署问题。系统能够编写为一组插件,配置文件系统不只配置了组件,还充当了DSL,经过编程让组件嵌入流水线。

几年以后,这种系统变成了人们口中的“那个程序”——bug累累,却没人管。没人敢碰这些代码,由于都惧怕破坏别的代码。没人使用DSL的灵活性。每一个人在使用该程序时,都只是复制和粘贴其余人使用过的配置。

为何会这样?尽管最初的设计文档使用了诸如“模块化”、“解耦”、“可扩展”和“可配置”之类的词语,但却从未说过任何关于数据的内容。所以,组件之间的数据依赖性最终经过全局共享的JSON blob的特殊方式处理。随着时间的推移,组件中就会出现愈来愈多没有文档记载的JSON blob或之前没有的内容。固然,DSL容许按照任意顺序从新排列组件,但大多数配置都不起做用。


640?wx_fmt=png

经验教训


我选择第三个例子的缘由是由于这个例子很容易说明。有一次我在作一个网站,可是我创建了一些很尴尬的XML数据库,因此最后也未能解决数据问题。而后,这个项目成了make的拙劣模仿,并且仅实现了make的一半功能,缘由也是我并无考虑我真正须要的东西。

原文:https://theartofmachinery.com/2019/06/30/data_still_dominates.html

本文为 CSDN 翻译,转载请注明来源出处。

【End】

640?wx_fmt=jpeg

640?wx_fmt=gif

 热 文 推 荐 

☞计算机密码发明者去世!曾获图灵奖、并启蒙 Unix 诞生!

☞Perl 6 真的太烦人了?

☞微信们正在成为“被模仿者”!中国互联网现状及趋势报告

☞程序员爬取 2 万条数据,撕开微博热搜的真相!

☞"别太乐观, 冲破黑暗还很远呀! "

☞帮嫦娥五号登月的AI还能用来玩游戏,20行Python代码带你领略强化学习的风采

☞2019年技术盘点容器篇(四):来自京东云的技术问答 | 程序员硬核评测

☞读完这45篇论文,“没人比我更懂AI了”

实测!华为鸿蒙比 Android系统快60%!

640?wx_fmt=gif点击阅读原文,输入关键词,便可搜索您想要的 CSDN 文章。

640?wx_fmt=png 你点的每一个“在看”,我都认真当成了喜欢