热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

大数据的发展,伴随的将是软件工程师的渐退,算法工程师的崛起

大数据在人类历史长河的各个时期一直存在着,只是要等到技术发展到一定阶段,它才开始崭露头角。而它的未来又在哪里?来自Intercom的工程师

大数据在人类历史长河的各个时期一直存在着,只是要等到技术发展到一定阶段,它才开始崭露头角。而它的未来又在哪里?来自 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)和大数据技术。人们甚至创造了更好的优化技术,他们观察金属的冷却过程,并通过算法对其进行建模(被称为模拟退火算法,这就是我们应该从算法角度开始考虑问题的一个最好的例子)。

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


大数据算法


目录


绪论


时间亚线性算法


空间亚线性算法


外存算法概述


外存查找结构


外存图数据算法


MapReduce算法概述


MapReduce算法例析


超越MapReduce的并行大数据处理


众包算法


总结

需要这篇大数据算法pdf学习资料的小伙伴可以点赞+转发+关注!后台小信封扣【9】撩我领取吧!后面还会有很多干货。我有一些面试题、架构、设计类资料可以说是程序员面试必备!所有资料都整理到网盘了,需要的话欢迎下载!私信我回复【9】即可免费获取


推荐阅读
  • 什么是大数据lambda架构
    一、什么是Lambda架构Lambda架构由Storm的作者[NathanMarz]提出,根据维基百科的定义,Lambda架构的设计是为了在处理大规模数 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 本文介绍了Java集合库的使用方法,包括如何方便地重复使用集合以及下溯造型的应用。通过使用集合库,可以方便地取用各种集合,并将其插入到自己的程序中。为了使集合能够重复使用,Java提供了一种通用类型,即Object类型。通过添加指向集合的对象句柄,可以实现对集合的重复使用。然而,由于集合只能容纳Object类型,当向集合中添加对象句柄时,会丢失其身份或标识信息。为了恢复其本来面貌,可以使用下溯造型。本文还介绍了Java 1.2集合库的特点和优势。 ... [详细]
  • Hadoop源码解析1Hadoop工程包架构解析
    1 Hadoop中各工程包依赖简述   Google的核心竞争技术是它的计算平台。Google的大牛们用了下面5篇文章,介绍了它们的计算设施。   GoogleCluster:ht ... [详细]
  • 《Spark核心技术与高级应用》——1.2节Spark的重要扩展
    本节书摘来自华章社区《Spark核心技术与高级应用》一书中的第1章,第1.2节Spark的重要扩展,作者于俊向海代其锋马海平,更多章节内容可以访问云栖社区“华章社区”公众号查看1. ... [详细]
author-avatar
pfshi
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有