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

作者 | Simon Arneaud

译者 | 弯月,责编 | 屠敏

出品 | CSDN(ID:CSDNnews)

以下为译文:

以下引用的是2006年Linus Torvalds说过的一句话:

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

这句话与2003年Eric Raymond提出的“表示原则”非常相像:

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

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

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

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

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

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

更普遍的是,战略上的突破常来自数据或表的重新表达——这是程序的核心所在。如果提供了程序流程图,而没有表数据,我仍然会很迷惑。而给我看表数据,往往就不再需要流程图,程序结构是非常清晰的。

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

让我举几个例子。

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


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

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

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

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

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

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

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

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

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

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

经验教训

我选择第三个例子的原因是因为这个例子很容易说明。有一次我在做一个网站,但是我建立了一些很尴尬的XML数据库,所以最后也未能解决数据问题。然后,这个项目成了make的拙劣模仿,而且仅实现了make的一半功能,原因也是我并没有考虑我真正需要的东西。

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

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

【End】

 热 文 推 荐 

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

☞Perl 6 真的太烦人了?

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

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

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

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

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

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

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

点击阅读原文,输入关键词,即可搜索您想要的 CSDN 文章。

你点的每个“在看”,我都认真当成了喜欢

在编程中,为何说数据仍占主导地位?相关推荐

  1. 2025年全球5G设备将达到14亿部 但4G仍占主导地位

    [TechWeb]2月28日消息,据国外媒体报道,5G是当前及未来几年通信行业的重点,三星和华为在本月已推出了5G手机,5G设备在未来几年也将大量普及,研究机构是预计2025年全球的5G设备将达到14 ...

  2. 浏览器市场 Chrome 仍占主导地位,IE 继续下降

    根据NetMarketShare统计数据,上个月浏览器市场Chrome市场份额继续上升,而微软Edge市场份额则慢慢爬升.Google Chrome浏览器市场份额从上个月的59%上升到今天的59.36 ...

  3. python网络通信传输的数据类型_Python网络编程中的网络数据和网络错误。

    上一个章节我们说的是套接字名和DNS.这篇文章我们主要解决下面问题. 我们在两台主机之间建立与关闭TCP流连接以及UDP数据报连接后.我们应该怎么准备我们需要传输的数据,该怎么对数据进行编码与格式化. ...

  4. java编程中对大数据的处理

    大数据的起始计量单位至少是P(1000个T).E(100万个T)或Z(10亿个T),大数据Hadoop框架.map-reduce框架,很多部分都是用开源的Java语言编写. java编程过程中对大数据 ...

  5. c语言各个类型所占字节数,C语言中不同类型数据所占字节数汇总

    16位编译器 char:1个字节 char*:2个字节 short int:2个字节 int:2个字节 unsigned int:2个字节 long:4个字节 long long:8个字节 unsig ...

  6. 首份小程序广告投放价值榜单发布:游戏、工具类小程序占主导地位

    2018年3月小程序广告正式开放内测,所有类目小程序均可进行广告投放.随后众多品牌小程序纷纷开放小程序广告,近日第三方小程序开发工具即速应用和 精硕科技集团 赋能智慧商业的数据智能技术提供商nEqua ...

  7. 服务器操作系统市场占有率,服务器操作系统市场Windows占主导地位

    IDC研究人员近日发布了一份关于全球服务器市场占有率的报告.如同2009年最后一季一样,Windows服务器在营收比例方面,依然是市场上遥遥的领先者. Windows的占有率只有微幅上扬,达到服务器操 ...

  8. 美国和中国将成数据中心建设首选之地

    市场研究机构Synergy Research Group的一篇文章揭示,美国和中国将成为最受欢迎的数据中心选址国家. 不出意外,美国是2015年第二季度云和互联网数据中心选址最受欢迎的国家.在分析世界 ...

  9. python将音频转换成声谱图_理解语音识别系统中的语音数据,傅里叶转换,FFT和声谱特征...

    本篇文章介绍如何使用python进行声音数据分析(语音分析). 总述 每天都会产生大量的语音数据.如果他们能够很容易的被数据科学家所获得来开发AI引擎和进行AI分析,也许会产生不一样的洞见.那些早已意 ...

最新文章

  1. 腾讯终于良心了!桌面混乱终于有救了
  2. 通过HTML的canvas实现简单的画图功能
  3. Python发送邮件(带附件)
  4. 一个DBA的工作写照
  5. javascript第一天
  6. 前端学习(1967)vue之电商管理系统电商系统之切换面板获取
  7. js 跨域的问题 (同一个主域名不同的二级域名下的跨域问题) 解决 WdatePicker.js my97日期选择控件
  8. Redis学习笔记~Redis并发锁机制
  9. 安全扫描工具 Netsparker
  10. 使用原生js实现简单动画效果
  11. floyd与传递闭包
  12. Android 关于ApplicationInfo flags快速了解
  13. Ubuntu 查看系统版本
  14. C# LINQ 语法备忘-刘欣
  15. 日分发量破8.6亿,OPPO如何帮助开发者突破流量增长瓶颈
  16. 数据仓库构建方法论(六):数据建模方法论
  17. 向量余弦值(Cosine)(C#)
  18. ICN6202是一颗MIPI DSI转LVDS的桥接芯片
  19. selenium之DDT:使用DDT模块实现数据驱动测试
  20. 解决模板套用出现乱码问题的方法

热门文章

  1. 矩池云上缺少curand.h、cublas_v2.h、cusolverDn.h头文件解决方法
  2. 《推荐系统笔记(十一)》Learning to rank(LTR排序问题)的介绍和RankNet算法(内含详细推导)
  3. 新冠肺炎疫情数学模型的一点想法
  4. C++11的POD类型
  5. 2021-2025年中国制药行业MR报告软件行业市场供需与战略研究报告
  6. 教你轻松构建基于 Serverless 架构的小程序
  7. C语言的argv小案例
  8. 这个Wi-Fi安全漏洞偷跑了24年,可能危及全球所有设备!
  9. 前端大神:如何看待 React Server Components?
  10. 程序员最爱用 Emacs 写 Python、Bash,调研了 7300 位开发者有这些发现