11 月 19 - 20 日 Apache Pulsar 社区年度盛会来啦,立即报名! 了解详情
写点什么

未来属于算法,而不是代码

  • 2017-04-25
  • 本文字数:3835 字

    阅读完需:约 13 分钟

大数据在人类历史长河的各个时期一直存在着,只是要等到技术发展到一定阶段,它才开始崭露头角。而它的未来又在哪里?来自 Intercom 的工程师 Cathal Horan 表达了他对大数据的看法,他认为,未来属于算法,而不是代码。以下内容翻译自 Cathal 在 hackernoon 网站发表的博文,已获得翻译授权。原文链接: The future is algorithms, not code

“大数据时代”的称号并不能为当今世界所独享,数据充斥着人类文明历史长河的各个时期。纵观这些历史时期,通过从离散到抽象的转换,我们就会明白为什么算法比代码重要。

说到大数据……

如果我们把整个人类历史看成一天,那么我们只能从晚上 11 点 7 分开始说起。这是安静的一天。但是在随后的一丁点时间里,我们积攒了很多知识和故事,并打算将它们传达给其他人。你可以想象最开始人类通过对话的形式将知识代代相传,从父辈传给子辈,从老师传给学生。但是整个社会的知识量增长迅速,以至于最初的对话形式无法传达这么多的信息。

我们需要将这些信息编撰成册进行保存和传播。通过书写的方式将知识编撰成册代表着这些时期在技术上的重大转变。事实上,苏格拉底(柏拉图“斐德罗篇”里的角色)认为这种技术转变比不上最初的对话形式,担心它会降低我们开发智慧和知识的能力。所以很自然地,我不认为苏格拉底会喜欢电视。

问题的核心是,对话代表了一种离散的沟通手段。你知道你的交谈对象是谁,而且参与对话的人通过论证和反证的方式进行直接的互动。反过来,书本是一种抽象的沟通手段,作者和读者之间不存在直接的互动。作者并不知道谁读了他的书,也不知道有多少人、在什么时候、在哪里读了他的书。有时候,我们可能知道潜在的读者群体是谁,然后根据读者群体进行内容裁剪。不过大多数时候,书本都只是一种抽象的传播知识和学习新技能的手段。

等腰三角形的大数据

当我们从简单的计算形式转变为由定理、符号和算法组成的抽象形式(我们现在称其为数学),就开启了另一个大数据时代。第一批有记载的计算发生在公元前 2500 年的美索不达米亚。当时,美索不达米亚人需要计算出一谷仓的粮食能够养活多少人。

美索不达米亚人有具体的问题关注点,他们很清楚需要解决的问题是什么。他们的计算都是很离散的,因为每一次计算只能解决一个问题。这也就是为什么评论家们认为它们不是数学。直到公元前 500 年的古希腊,毕达哥拉斯学者们(可以把他们认为是早期的 Google 使用者,哈哈)开始针对三角形提出了一些奇怪的问题。比如,他们想知道等腰直角三角形的三个边能否都是整数(这听起来像不像一个 Google 风格的面试题?)。

如果你想通过离散的方式来解答这个问题,那么可以像美索不达米亚人那样做。不过,随着数字的增加,这种方式会显得很笨重。要证明这个假设,你需要进行多少次计算(其实这个假设是错误的,三个边不可能都是整数)?等腰三角形问题的不同之处在于,它不存在具体的关注点。我们不知道三角形的大小,也不知道它们的边长,而且它们的大小可能是无限的。如果我们在数字上应用推理,那么就进入了数学领域,大数据也就接踵而至。毕达哥拉斯式的思维方式体现了数学的抽象特征,在今天,我们使用符号、规则和推理来解答这类抽象的问题。

或许你想知道人类历史上的其他大数据时期,不过我想直接跳到 20 世纪,看看代码如何成为现代技术领域的重要组成部分(如果你有其他大数据时期的资料,可以联系我 @cathalhoran,我相信它们会很有趣)。

代码的崛起

1945 年,当 Grace Hopper 开始在 Harvard Mark I 计算机上工作时,编码(或者说编程,不过我们不打算在这里区分它们有什么不同)这项工作的重要性就开始凸显出来。在这之前,电脑(如果可以这么叫它的话)充其量只是个计算工具。以二战为例,当时的大炮需要借助矩阵进行辅助瞄准。矩阵是一些方程式的计算结果,这些方程式使用数百种不同的计算因子,比如距离、海拔、风速、温度、湿度,等等。电脑(computer)这个名字的由来也是很偶然的,人们用它描述在二战中操作计算机的女性,她们被称为“computer”。操作员们必须使用打孔卡和曲柄来处理方程式。一个打孔卡需要 170 个人月才能完成。

这个与我们之前讨论的事情有什么相似之处?美索不达米亚人使用黏土矩阵来进行计算,而到了 20 世纪,计算媒介变成了编码。虽然已经有了长足的进步,不过编码仍然是一种离散的操作,因为它执行的是具体的计算任务,只是效率上有所提升而已。编码解放了人工操作,让我们可以处理更多的数据。

算法与代码

算法:一系列用于描述一个问题解决方案的步骤,符合正确性和有限性的标准。是与具体实现相互独立的抽象计算步骤。

代码:一系列计算机指令。它们是计算的具体实现,使用一种特定的编程语言,运行在一个特定的平台上。

人们可以借助这种直接向计算机发送编码指令的方式来实现更为复杂的指令序列,并以算法的形式呈现出来。算法比编码的出现要早得多。穆斯林数学家 Al-Khawarizm 早在公元 820 年就对解决线性方程和二次方程式的算法进行了描述。算法一词来源于这位数学家的拉丁文名字“Algoritmi”,而“algebra”则来源于“al-jabr”,Al-Khawarizm 用它来解决二次方程式问题。算法由一系列有限的计算或指令组成,并产生一个结果。正如我们所知道的那样,代码是向计算机发出指令的一种方式,很适合用于实现算法。它们只不过是一系列按照一定次序执行的操作。

与早期的大数据时期一样,我们这个时代的信息量也在增长。根据摩尔定律,我们在编码的设计和使用方面所作的改进换来了性能的提升,从而能够应付不断增长的数字化需求。你可以继续编写代码从数据库查询相关的资源列表。这些操作的离散特征仍然被保留了下来,因为人们仍然在通过编写代码告诉硬件应该做哪些事情。就算操作变得越来越复杂,它仍然只是人类的编码指令。不过,算法已经开始展露头角,正在创造一个抽象的新时代。

算法的崛起

所以说,算法和代码之间有很大的不同。代码可以用来实现算法,而且代码的实现方式会影响到性能。例如,如果你要从一个序列里找出最大或最小的元素,那么二叉堆的性能相比其他的数据结构要好很多。不过,你已经没有必要通过编写代码来实现一个算法,就像没有必要通过听音乐来写歌一样。

虽然每个人都知道摩尔定律的魔力,驱动数字经济发展的性能改进遵循的就是摩尔定律,但鲜有人知道,在很多领域,算法所产生的性能改进已经超过了硬件所带来的性能提升。实际上,2010 年的一份官方报告表明,算法已经为很多领域带来了显著的性能提升,比如语音识别、神经语言处理和物流。

“更加令人感到吃惊但同时又令人难以理解的是,在很多领域,算法为性能带来的提升已经远远超过了处理器速度提升所带来的性能改进。”
——面向总统和国会的报告:设计数字的未来

抽象算法

我们现在拥有大量的数据,这意味着我们不能再用离散的思维来思考问题。大数据促使我们转变思维。它促使我们向后退一步,去寻找能够处理数据洪流的方法。按照传统的方式,你可能会根据一些指定的模式或参数编写代码来查询数据。例如,你可能想从数据库中查找在过去两周买过 2 件商品并且支付超过 30 欧元的顾客,因为你想联系到这些顾客,并向他们推荐一些优惠活动。你使用这个模式来查找匹配的数据。不过大数据却正好相反,你先有了数据,然后查找可以匹配这些数据的模式。

想想看,有这么多的数据,但是我们却找不到匹配的模式,所以我们要回退一步。我们通过集群、分类、机器学习和其他新的支撑技术来寻找模式,而能够帮助我们做到这点的是算法,不是代码。要找到隐藏在暗处的模式,跨出这一步是必需的。与光谱一样,有一些波长的光线我们是看不到的,而超过一定数据量之后的模式我们也是看不到的,它就是大数据。

我们不仅可以从中搜索到模式,它还能够生成做这些事情所需要的代码。Pedro Domingos 在“The Master Algorithm”一书中描述了如何使用“学习者算法”来创建新的算法,这些算法可以反过来为我们编写我们所需要的代码,“通过机器学习,计算机可以自己编程,我们就可以解放了”。为了实现这个目标,我们需要更好地理解这些算法的原理,以及如何让它们与我们的需求相匹配。否则,我们就无法向抽象转变。

“工业的发展让手工劳动自动化,信息的发展让脑力劳动自动化,而机器学习则让它自己自动化。如果没有机器学习,程序员就会成为发展瓶颈。而有了机器学习,发展的速度就会加快。”
——Pedro Domingos,“The Master Algorithm”

思考算法

不过,不管如何从离散转变成抽象,我们仍然需要程序员,但这不是重点。并不是说代码已经变得不重要了,也不是说代码就不会再带来任何改进。重点在于,我们要开始思考算法,这不仅仅是数学家或学者的事情。我们周边充斥着各种算法,以致于我们不需要知道如何编写代码来使用它们,或者理解它们。现在,有一些人通过新的算法对不同的领域进行优化和改进,他们使用了遗传编程( genetic programming )和大数据技术。人们甚至创造了更好的优化技术,他们观察金属的冷却过程,并通过算法对其进行建模(被称为模拟退火算法,这就是我们应该从算法角度开始考虑问题的一个最好的例子)。

编码作为新数字经济的关键技能,就像学习如何阅读一样,已经模糊了我们对算法的理解。算法正逐渐成为我们生活的组成部分,从电影推荐到新闻过滤和寻找合作伙伴。我们要更好地理解它们,这样才能更好地理解和掌控我们的未来。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-04-25 19:004544
用户头像

发布了 321 篇内容, 共 123.4 次阅读, 收获喜欢 132 次。

关注

评论

发布
暂无评论
发现更多内容

零基础、非计算机相关专业的如何转型程序员

C语言技术网-码农有道

程序员 转型

我们迫切需要块状时间

Neco.W

效率 时间分配 时间管理 工作效率 提升效率

基于大疆无人机SDK二次开发

sydMobile

android 无人机

【预告】千亿数据的潘多拉魔盒:从分库分表到分布式数据库

kimmking

分布式数据库 分库分表 分布式系统 中间件

如何消除写作过程中的痛苦,让写作变成一种享受

董一凡

写作

新人怎么寻求解决问题的方法

波波

编程 职场 新人

原创 | 使用JUnit、AssertJ和Mockito编写单元测试和实践TDD (一)什么是单元测试

编程道与术

言简意赅,聊聊RPC的123事

一叶而不知秋

RPC

断章取义,不一样的C/C++语言的学习策略

C语言技术网-码农有道

C/C++

终端Terminal:程序员是如何查询天气预报的?

lmymirror

GitHub 工具 命令行 terminal 终端工具

从2009到2020,世界编程语言排行榜分析

C语言技术网-码农有道

编程语言

1分钟理解M2M和IoT概念

老任物联网杂谈

物联网 M2M IoT

从草根到百万年薪C/C++程序员的二十年风雨之路

C语言技术网-码农有道

c++ 编程语言 C语言

DataGrip常用快捷键

fliter

产品周刊 | 第 13 期(20200503)

Herbert

产品 设计 产品经理 产品设计

原创 | 类应该是匀称和均匀的

编程道与术

Flutter 中SharedPreferences 的初始化?

三爻

flutter android

快速开发那点事儿 | 选择最合适的轮子,量产跑车

Java_若依框架教程

敏捷开发 JAVA开发 RouYI 快速开发

职场发展的思考

子不语

生涯规划 职业规划

LeetCode 153. Find Minimum in Rotated Sorted Array

隔壁小王

算法

LeetCode 565: Array Nesting

隔壁小王

算法

中年危机,我们如何面对?

石云升

MyBatis 3 解析mybatis-config.xml配置

杨家昌

深度解析 mybatis 初始化 XMLConfigBuilder Configuration

Flink 作为现代数据仓库的统一引擎:Hive 集成生产就绪!

Apache Flink

大数据 flink 流计算 实时计算

部署Hexo博客到VPS

ini

企业招聘的需求决定了C/C++程序员的学习方向

C语言技术网-码农有道

C/C++

new[]和delete[]为何要配对使用?

泰伦卢

c c++ C#

源码分析shared_ptr实现

泰伦卢

c c++ C#

IT培训机构那些不得不说的事儿

C语言技术网-码农有道

IT培训机构

游戏夜读 | 有哪几种游戏玩家?

game1night

MyBatis 3 XML配置

杨家昌

mybatis mybatis-config.xml XML配置 配置

未来属于算法,而不是代码_语言 & 开发_Cathal Horan_InfoQ精选文章