complete !

This commit is contained in:
Vonng 2018-05-26 21:48:33 +08:00
parent 7822b53baa
commit 68bad18069
2 changed files with 144 additions and 165 deletions

View File

@ -26,20 +26,20 @@
>
> —— Vonng
现今尤其是在互联网领域大多数应用都属于数据密集型应用。本书从底层数据结构到顶层架构设计将数据系统设计中的精髓娓娓道来。其中的宝贵经验无论是对架构师DBA、还是后端工程师、甚至产品经理都会有帮助。
现今尤其是在互联网领域大多数应用都属于数据密集型应用。本书从底层数据结构到顶层架构设计将数据系统设计中的精髓娓娓道来。其中的宝贵经验无论是对架构师DBA、还是后端工程师、甚至产品经理都会有帮助。
这是一本理论结合实践的书,书中很多问题,译者在实际场景中都曾遇到过,读来让人击节扼腕。如果能早点读到这本书,该少走多少弯路啊!
这是一本理论结合实践的书,书中很多问题,译者在实际场景中都曾遇到过,读来让人击节扼腕。如果能早点读到这本书,该少走多少弯路啊!
这也是一本深入浅出的书,讲述概念的来龙去脉而不是卖弄定义,介绍事物发展演化历程而不是事实堆砌,将复杂的概念讲述的浅显易懂,但又直击本质不失深度。每章最后的引用质量非常好,是深入学习各个主题的绝佳索引。
这也是一本深入浅出的书,讲述概念的来龙去脉而不是卖弄定义,介绍事物发展演化历程而不是事实堆砌,将复杂的概念讲述的浅显易懂,但又直击本质不失深度。每章最后的引用质量非常好,是深入学习各个主题的绝佳索引。
本书为数据系统的设计、实现、与评价提供了很好的概念框架。读完并理解本书内容后,读者可以轻松看破大多数的技术忽悠,与技术砖家撕起来虎虎生风🤣。
本书为数据系统的设计、实现、与评价提供了很好的概念框架。读完并理解本书内容后,读者可以轻松看破大多数的技术忽悠,与技术砖家撕起来虎虎生风🤣。
这是2017年译者读过最好的一本技术类书籍这么好的书没有中文翻译实在是遗憾。某不才愿为先进技术文化的传播贡献一分力量。既可以深入学习有趣的技术主题又可以锻炼中英文语言文字功底何乐而不为
不过翻译,尤其是精翻,确实是一件极其耗费心血的工作。没有什么经济收益,只有纯粹的兴趣,欢迎有兴趣的朋友一起[加入](https://github.com/Vonng/ddia)。
这是2017年译者读过最好的一本技术类书籍这么好的书没有中文翻译实在是遗憾。某不才愿为先进技术文化的传播贡献一分力量。既可以深入学习有趣的技术主题又可以锻炼中英文语言文字功底何乐而不为
##
## 前言
> 在我们的社会中,技术是一种强大的力量。数据、软件、通信可以用于坏的方面:不公平的阶级固化,损害公民权利,保护既得利益集团。但也可以用于好的方面:让底层人民发出自己的声音,让每个人都拥有机会,避免灾难。本书献给所有将技术用于善途的人们。
@ -83,41 +83,16 @@
## 翻译计划
## NOTICE
* 机翻:只在乎结构:梳理文章结构、图片、引用、备注。
* 初翻:保证经完全理解本章内容,人工修复显著的错误,重新组织语言。
* 精校:阅读相关领域文献书籍,确定术语的最终译法,修复格式瑕疵,着力信达雅。
本书大体上已完成翻译,但有少量章节翻译并不完整(初翻),请读者见谅。
精翻可以看,机翻基本没法看,初翻对于业内人士能凑合看。
| 章节 | 进度 | 锁定 |
| :--------------------------------: | :------: | :-----------: |
| 序言 | 初翻 | |
| 第一部分:数据系统基础 | 精翻 | |
| 第一章:可靠性、可扩展性、可维护性 | 精翻 | |
| 第二章:数据模型与查询语言 | 初翻 | @ jiajiadebug |
| 第三章:存储与检索 | 初翻 40% | |
| 第四章:编码与演化 | 初翻 | |
| 第二部分:分布式数据 | 精翻 | |
| 第五章:复制 | 精翻 30% | |
| 第六章:分区 | 初翻 | |
| 第七章:事务 | 精翻 60% | |
| 第八章:分布式系统中的问题 | 初翻 | |
| 第九章:一致性与共识 | 初翻 | |
| 第三部分:衍生数据 | 精翻 | |
| 第十章:批处理 | 初翻 | |
| 第十一章:流处理 | 初翻 | |
| 第十二章:数据系统的未来 | 初翻 40% | Vonng |
| 术语表 | - | |
| 后记 | 初翻 | |
## CONTRIBUTION
All contribution will give proper credit. 需同意[法律声明](#法律声明)所叙内容。
1. [序言初翻修正](https://github.com/Vonng/ddia/commit/afb5edab55c62ed23474149f229677e3b42dfc2c) by [@seagullbird](https://github.com/Vonng/ddia/commits?author=seagullbird)
2. [第一章语法标点校正](https://github.com/Vonng/ddia/commit/973b12cd8f8fcdf4852f1eb1649ddd9d187e3644) by [@nevertiree](https://github.com/Vonng/ddia/commits?author=nevertiree)
3. [第六章部分校正](https://github.com/Vonng/ddia/commit/d4eb0852c0ec1e93c8aacc496c80b915bb1e6d48) 与[第10章的初翻](https://github.com/Vonng/ddia/commit/9de8dbd1bfe6fbb03b3bf6c1a1aa2291aed2490e) by @[MuAlex](https://github.com/Vonng/ddia/commits?author=MuAlex)
@ -127,8 +102,6 @@ All contribution will give proper credit. 需同意[法律声明](#法律声明)
## LICENSE
CC-BY 4.0

262
ch12.md
View File

@ -52,9 +52,9 @@
保持不同数据系统彼此一致的经典方法涉及分布式事务,如“[原子提交和两阶段提交2PC](ch9.md#原子提交和两阶段提交2PC)”中所述。与分布式事务相比,使用衍生数据系统的方法如何?
在抽象层面,它们通过不同的方式达到类似的目标。分布式事务通过**锁**进行互斥来决定写入的顺序(参阅“[两阶段锁定2PL](ch7.md#两阶段锁定2PL)”而CDC和事件源使用日志进行排序。分布式事务使用原子提交来确保变更只生效一次而基于日志的系统通常基于**确定性重试**和**幂等性**。
在抽象层面,它们通过不同的方式达到类似的目标。分布式事务通过**锁**进行互斥来决定写入的顺序(参阅“[两阶段锁定2PL](ch7.md#两阶段锁定2PL)”而CDC和事件源使用日志进行排序。分布式事务使用原子提交来确保变更只生效一次,而基于日志的系统通常基于**确定性重试**和**幂等性**。
最大的不同之处在于事务系统通常提供**[线性一致性](ch9.md#线性一致性)**,这包含着有用的保证,例如[读己之写](ch5.md#读己之写)。另一方面,衍生数据系统通常是异步更新的,因此它们默认不会提供相同的时保证。
最大的不同之处在于事务系统通常提供**[线性一致性](ch9.md#线性一致性)**,这包含着有用的保证,例如[读己之写](ch5.md#读己之写)。另一方面,衍生数据系统通常是异步更新的,因此它们默认不会提供相同的时保证。
在愿意为分布式事务付出代价的有限场景中它们已被成功应用。但是我认为XA的容错能力和性能很差劲参阅“[实践中的分布式事务](ch9.md#实践中的分布式事务)”),这严重限制了它的实用性。我相信为分布式事务设计一种更好的协议是可行的。但使这样一种协议被现有工具广泛接受是很有挑战的,且不是立竿见影的事。
@ -66,7 +66,7 @@
对于足够小的系统,构建一个完全有序的事件日志是完全可行的(正如单主复制数据库的流行所证明的那样,这正好建立了这样一种日志)。但是,随着系统向更大更复杂的工作负载扩展,限制开始出现:
* 在大多数情况下,构建完全有序的日志,需要所有事件通过决定顺序的单个领导节点。如果事件吞吐量大于单台计算机的处理能力,则需要将其分割到多台计算机上(参见“[分区日志](ch11.md#分区日志)”)。然后两个不同分区中的事件顺序关系就不明确了。
* 在大多数情况下,构建完全有序的日志,需要所有事件汇集于决定顺序的单个领导节点。如果事件吞吐量大于单台计算机的处理能力,则需要将其分割到多台计算机上(参见“[分区日志](ch11.md#分区日志)”)。然后两个不同分区中的事件顺序关系就不明确了。
* 如果服务器分布在多个**地理位置分散**的数据中心上,例如为了容忍整个数据中心掉线,您通常在每个数据中心都有单独的主库,因为网络延迟会导致同步的跨数据中心协调效率低下(请参阅“[多主复制](ch5.md#多主复制)“)。这意味着源自两个不同数据中心的事件顺序未定义。
@ -90,28 +90,28 @@
在本例中通知实际上是消息和好友列表之间的连接使得它与我们先前讨论的连接的时间问题有关请参阅第475页的“[连接的时间依赖性](ch11.md#连接的时间依赖性)”。不幸的是这个问题似乎并没有一个简单的答案【2,3】。起点包括
* 逻辑时间戳可以提供无需协调的全局顺序(参见“[序列号排序](ch8.md#序列号排序)”),因此它们可能有助于全序广播不可行的情况。但是,他们仍然要求收件人处理不按顺序发送的事件,并且需要传递其他元数据。
* 如果可以记录一个事件来记录用户在做出决定之前所看到的系统状态并给该事件一个唯一的标识符那么后面的任何事件都可以引用该事件标识符来记录因果关系【4】 。我们将在第513页的“[读也是事件](#读也是事件)”中回到这个想法。
* 冲突解决算法(请参阅“[自动冲突解决](ch5.md#自动冲突解决)”)有助于处理以意外顺序传递的事件。它们对于维护状态很有用,但如果行为有外部副作用(例如,也许,随着时间的推移,应用程序开发模式将出现,使得能够有效地捕获因果依赖关系,并且保持正确的衍生状态,而不会迫使所有事件经历全序广播的瓶颈。
* 如果可以记录一个事件来记录用户在做出决定之前所看到的系统状态并给该事件一个唯一的标识符那么后面的任何事件都可以引用该事件标识符来记录因果关系【4】 。我们将在“[读也是事件](#读也是事件)”中回到这个想法。
* 冲突解决算法(请参阅“[自动冲突解决](ch5.md#自动冲突解决)”)有助于处理以意外顺序传递的事件。它们对于维护状态很有用,但如果行为有外部副作用(例如,也许,随着时间的推移,应用开发模式将出现,使得能够有效地捕获因果依赖关系,并且保持正确的衍生状态,而不会迫使所有事件经历全序广播的瓶颈
### 批处理与流处理
我会说数据集成的目标是,确保数据最终能在所有正确的地方表现出正确的形式。这样做需要消费输入,转换,连接,过滤,聚合,训练模型,评估,以及最终写出适当的输出。批处理和流处理是实现这一目标的工具。
批处理和流处理的输出是衍生数据集,例如搜索索引,实例化视图,向用户显示的建议,聚合度量等(请参阅“[批处理工作流的输出](ch10.md#批处理工作流的输出)”和“[流处理的用法](ch11.md#流处理的用法)”)。
批处理和流处理的输出是衍生数据集,例如搜索索引,物化视图,向用户显示的建议,聚合指标等(请参阅“[批处理工作流的输出](ch10.md#批处理工作流的输出)”和“[流处理的用法](ch11.md#流处理的用法)”)。
正如我们在[第10章](ch10.md)和[第11章](ch11.md)中看到的,批处理和流处理有许多共同的原则,主要的根本区别在于流处理器在无数据集上运行,而批处理输入是已知的有限大小。处理引擎的实现方式也有很多细节上的差异,但是这些区别开始模糊。
正如我们在[第10章](ch10.md)和[第11章](ch11.md)中看到的,批处理和流处理有许多共同的原则,主要的根本区别在于流处理器在无数据集上运行,而批处理输入是已知的有限大小。处理引擎的实现方式也有很多细节上的差异,但是这些区别已经开始模糊。
Spark在批处理引擎上执行流处理将流分解为**微批次microbatches**而Apache Flink则在流处理引擎上执行批处理【5】。原则上一种类型的处理可以在另一种类型上仿真但是性能特征会有所不同例如在跳跃或滑动窗口上微批次可能表现不佳【6】。
Spark在批处理引擎上执行流处理将流分解为**微批次microbatches**而Apache Flink则在流处理引擎上执行批处理【5】。原则上一种类型的处理可以用另一种类型来模拟,但是性能特征会有所不同:例如,在跳跃或滑动窗口上微批次可能表现不佳【6】。
#### 维护衍生状态
批处理有着很强的函数式风格(即使其代码不是用函数式语言编写的):它鼓励确定性的纯函数,其输出仅依赖于输入,除了显式输出外没有副作用,将输入视作不可变的,且输出是仅追加的。流处理与之类似,但它扩展了运算符以允许受管理的容错状态请参阅第478页的“[失败后重建状态”](ch11.md#失败后重建状态))。
批处理有着很强的函数式风格(即使其代码不是用函数式语言编写的):它鼓励确定性的纯函数,其输出仅依赖于输入,除了显式输出外没有副作用,将输入视作不可变的,且输出是仅追加的。流处理与之类似,但它扩展了算子以允许受管理的,容错的状态(参阅“[失败后重建状态”](ch11.md#失败后重建状态))。
具有良好定义的输入和输出的确定性函数的原理不仅有利于容错(参见“[幂等性](ch11.md#幂等性)”),也简化了有关组织中数据流的推理【7】。无论衍生数据是搜索索引统计模型还是缓存从数据管道角度来看,从另一个衍生出一件事情,通过功能应用程序代码推送一个系统中的状态变更和应用对衍生系统的影响
具有良好定义的输入和输出的确定性函数的原理不仅有利于容错(参见“[幂等性](ch11.md#幂等性)”也简化了有关组织中数据流的推理【7】。无论衍生数据是搜索索引统计模型还是缓存采用这种观点思考都是很有帮助的:将其视为从一个东西衍生出另一个的数据管道,将一个系统的状态变更推送至函数式应用代码中,并将其效果应用至衍生系统中
原则上,衍生数据系统可以同步地维护,就像关系数据库在与被索引表写入操作相同的事务中同步更新辅助索引一样。然而,异步是基于事件日志的系统稳健的原因:它允许系统的一部分故障被抑制在本地,而如果任何一个参与者失败,分布式事务将中止,因此它们倾向于通过将故障传播到系统的其余部分来放大故障(请参阅“[分布式事务的限制](ch9.md#分布式事务的限制)”)。
我们在“[分区与次级索引](ch6.md#分区与次级索引)”中看到,二级索引经常跨越分区边界。具有二级索引的分区系统需要将写入发送到多个分区(如果索引是分词或将读取发送到所有分区如果索引是文档分区的话。如果索引是异步维护的这种交叉分区通信也是最可靠和可扩展的【8】另请参阅“[多分区数据处理](ch11.md#多分区数据处理)”)。
我们在“[分区与次级索引](ch6.md#分区与次级索引)”中看到,二级索引经常跨越分区边界。具有二级索引的分区系统需要将写入发送到多个分区(如果索引按关键词分区的话)或将读取发送到所有分区(如果索引是文档分区的话)。如果索引是异步维护的,这种交叉分区通信也是最可靠和可扩展的【8】另请参阅“[多分区数据处理](ch11.md#多分区数据处理)”)。
#### 应用演化后重新处理数据
@ -127,19 +127,19 @@
>
> 以这种方式“再加工”现有的轨道让新旧版本并存可以在几年的时间内逐渐改变轨距。然而这是一项昂贵的事业这就是今天非标准轨距仍然存在的原因。例如旧金山湾区的BART系统使用与美国大部分地区不同的轨距。
衍生视图允许**渐进演化gradual evolution**。如果您想重新构建数据集,不需要执行迁移,例如**突然切换**。相反,您可以将旧架构和新架构并排维护为相同基础数据上的两个独立衍生视图。然后,您可以开始将少量用户转移到新视图,以测试其性能并发现任何错误,而大多数用户仍然会被路由到旧视图。逐渐地,您可以增加访问新视图的用户比例,最终可以删除旧视图【10】。
衍生视图允许**渐进演化gradual evolution**。如果你想重新构建数据集,不需要执行迁移,例如**突然切换**。取而代之的是,你可以将旧架构和新架构并排维护为相同基础数据上的两个独立衍生视图。然后可以开始将少量用户转移到新视图,以测试其性能并发现任何错误,而大多数用户仍然会被路由到旧视图。你可以逐渐地增加访问新视图的用户比例最终可以删除旧视图【10】。
这种逐渐迁移的美妙之处在于,如果出现问题,每个阶段的过程都很容易逆转:您始终有一个可以回滚的可用系统。通过降低不可逆损害的风险,您可以更有信心继续前进,从而更快地改善您的系统【11】。
这种逐渐迁移的美妙之处在于,如果出现问题,每个阶段的过程都很容易逆转:你始终有一个可以回滚的可用系统。通过降低不可逆损害的风险,你能对继续前进更有信心,从而更快地改善系统【11】。
#### Lambda架构
如果批处理用于重新处理历史数据并且流处理用于处理最近的更新那么如何将这两者结合起来Lambda架构【12】是这方面的一个建议引起了很多关注。
Lambda体系结构的核心思想是通过将不可变事件附加到不断增长的数据集来记录传入数据,这类似于事件源(参阅“[事件源](ch11.md#事件源)”)。从这些事件中,推导出读取优化的视图。 Lambda架构建议并行运行两个不同的系统批处理系统如Hadoop MapReduce和独立的流处理系统如Storm
Lambda构的核心思想是通过将不可变事件附加到不断增长的数据集来记录传入数据,这类似于事件溯源(参阅“[事件溯源](ch11.md#事件溯源)”)。为了从这些事件中衍生出读取优化的视图, Lambda架构建议并行运行两个不同的系统批处理系统如Hadoop MapReduce和独立的流处理系统如Storm
在Lambda方法中流处理器消耗事件并快速生成对视图的近似更新批处理器稍后将使用同一组事件并生成衍生视图的更正版本。这个设计背后的原因是批处理更简单因此不易出错而流处理器被认为是不太可靠和难以容错的请参阅“[故障容错]()”)。而且,流处理可以使用快速近似算法,而批处理使用较慢的精确算法。
Lambda架构是一有影响力的想法,它将数据系统的设计变得更好,尤其是通过推广这样的原则:在不可变事件流上建立衍生视图,并在需要时重新处理事件。但是我也认为它有一些实际问题:
Lambda架构是一有影响力的想法,它将数据系统的设计变得更好,尤其是通过推广这样的原则:在不可变事件流上建立衍生视图,并在需要时重新处理事件。但是我也认为它有一些实际问题:
* 在批处理和流处理框架中维护相同的逻辑是很显著的额外工作。虽然像Summingbird 【13】这样的库提供了一种可以在批处理和流处理的上下文中运行的计算抽象。调试调整和维护两个不同系统的操作复杂性依然存在【14】。
* 由于流管道和批处理管道产生独立的输出,因此需要合并它们以响应用户请求。如果计算是基于滚动窗口的简单聚合,则合并相当容易,但如果视图基于更复杂的操作(例如连接和会话化)而导出,或者输出不是时间序列,则会变得非常困难。
@ -152,8 +152,8 @@
在一个系统中统一批处理和流处理需要以下功能,这些功能越来越广泛:
* 通过处理最近事件流的相同处理引擎来重放历史事件的能力。例如,基于日志的消息代理可以重放消息(参阅“[重放旧消息](ch11.md#重放旧消息)”某些流处理器可以从HDFS等分布式文件系统读取输入。
* 对于流处理器来说,只有一次语义 —— 即确保输出与未发生故障的输出相同,即使事实上发生故障(参阅“[故障容错](ch11.md#故障容错)”)。与批处理一样,这需要丢弃任何失败任务的部分输出。
* 按事件时间进行窗口化的工具,而不是按处理时间进行窗口化,因为处理历史事件时处理时间毫无意义(参阅“[时间推理](ch11.md#时间推理)”。例如Apache Beam提供了用于表达这种计算的API然后可以使用Apache Flink或Google Cloud Dataflow运行。
* 对于流处理器来说,恰好一次语义 —— 即确保输出与未发生故障的输出相同,即使事实上发生故障(参阅“[故障容错](ch11.md#故障容错)”)。与批处理一样,这需要丢弃任何失败任务的部分输出。
* 按事件时间进行窗口化的工具,而不是按处理时间进行窗口化,因为处理历史事件时处理时间毫无意义(参阅“[时间推理](ch11.md#时间推理)”。例如Apache Beam提供了用于表达这种计算的API然后可以使用Apache Flink或Google Cloud Dataflow运行。
@ -656,245 +656,251 @@ COMMIT;
另一种审视协调与约束的角度是:它们减少了由于不一致而必须做出的道歉数量,但也可能会降低系统的性能和可用性,从而可能增加由于宕机中断而需要做出的道歉数量。你不可能将道歉数量减少到零,但可以根据自己的需求寻找最佳平衡点 —— 既不存在太多不一致性,又不存在太多可用性问题的最佳选择。
### 信任需要验证
### 信任但验证
我们所有关于正确性,完整性和容错的讨论都假设某些事情可能会出错,但其他事情不会。我们将这些假设称为我们的系统模型(参阅“[将系统模型映射到现实世界](ch8.md#将系统模型映射到现实世界)”):例如,我们应该假设进程可能会崩溃,机器可能突然断电,网络可能会任意延迟或丢弃消息。但是我们也可以假设写入磁盘的数据在`fsync`之后不会丢失内存中的数据没有损坏并且CPU的乘法指令总是返回正确的结果。
我们所有关于正确性,完整性和容错的讨论都基于一些假设,假设某些事情可能会出错,但其他事情不会。我们将这些假设称为我们的**系统模型(system model**参阅“[将系统模型映射到现实世界](ch8.md#将系统模型映射到现实世界)”):例如,我们应该假设进程可能会崩溃,机器可能突然断电,网络可能会任意延迟或丢弃消息。但是我们也可能假设写入磁盘的数据在执行`fsync`后不会丢失内存中的数据没有损坏而CPU的乘法指令总是能返回正确的结果。
这些假设是非常合理的,因为大多数时候它们都是真实的,如果我们不得不经常担心计算机出错,那么很难完成任何事情。传统上,系统模型采用二元方法处理故障:我们假设有些事情会发生,而其他事情永远不会发生。实际上,这更像是一个概率问题:有些事情更可能,其他事情不太可能。问题是违反我们的假设是否经常发生,以至于我们可能在实践中遇到它们。
这些假设是相当合理的,因为大多数时候它们都是成立的,如果我们不得不经常担心计算机出错,那么基本上寸步难行。在传统上,系统模型采用二元方法处理故障:我们假设有些事情可能会发生,而其他事情**永远**不会发生。实际上,这更像是一个概率问题:有些事情更有可能,其他事情不太可能。问题在于违反我们假设的情况是否经常发生,以至于我们可能在实践中遇到它们。
我们已经看到,数据可能会在磁盘未触及时破损请参阅第227页的“[复制和耐久性]()”并且网络上的数据损坏有时可能会妨碍TCP校验和请参阅第293页的“[虚弱形式的说谎]()” )。也许这是我们应该更加关注的事情?
我们已经看到,数据可能会在尚未落盘时损坏(参阅“[复制与持久性](ch5.md#复制与持久性)”而网络上的数据损坏有时可能规避了TCP校验和参阅“[弱谎言形式](ch8.md#弱谎言形式)” )。也许我们应当更关注这些事情?
我过去曾经使用过的一个应用程序收集了来自客户端的崩溃报告我们收到的一些报告只能通过在这些设备的内存中随机位翻转来解释。这看起来不太可能但是如果你有足够的设备来运行你的软件那么即使发生的事情也不会发生。除了由于硬件故障或辐射导致的随机存储器损坏之外某些病态存储器访问模式甚至可以在没有故障的存储器中翻转位【62】 —— 可用于破坏操作系统中安全机制的效应【63】技术被称为rowhammer。一旦你仔细观察硬件并不是完美的抽象。
我过去所从事的一个应用收集了来自客户端的崩溃报告我们收到的一些报告只有在这些设备内存中出现了随机位翻转才解释的通。这看起来不太可能但是如果有足够多的设备运行你的软件那么即使再不可能发生的事也确实会发生。除了由于硬件故障或辐射导致的随机存储器损坏之外一些病态的存储器访问模式甚至可以在没有故障的存储器中翻转位【62】 —— 一种可用于破坏操作系统安全机制的效应【63】这种技术被称为**Rowhammer**)。一旦你仔细观察,硬件并不是看上去那样完美的抽象。
清楚的是随机位翻转在现代硬件上仍然非常罕见【64】。我只想指出他们并没有超越可能性领域所以他们值得关注。
澄清的是随机位翻转在现代硬件上仍是非常罕见的【64】。我只想指出它们并没有超越可能性的范畴所以值得一些关注。
#### 在软件缺陷面前保持完整性
#### 维护完整性尽管软件有Bug
除了这些硬件问题之外,总是存在软件错误的风险这些错误不会被较低级别的网络内存或文件系统校验和所捕获。即使广泛使用的数据库软件也存在一些问题即使MySQL和PostgreSQL是健壮且充分的但我个人发现MySQL的例子未能正确维护唯一性约束【65】和PostgreSQL的序列化隔离级别表现出写入偏斜异常【66】他们认为这些数据库已经被许多人进行了多年的战斗测试。在不太成熟的软件中情况可能会更糟糕
除了这些硬件问题之外,总是存在软件Bug的风险这些错误不会被较低层次的网络内存或文件系统校验和所捕获。即使广泛使用的数据库软件也有Bug即使像MySQL与PostgreSQL这样稳健、考虑充分、久经实战考验多年以来被许多人充分测试过的软件就我个人所见也有Bug比如MySQL未能正确维护唯一约束【65】以及PostgreSQL的可序列化隔离等级存在特定的写偏差异常【66】。对于更不成熟的软件来说情况可能要糟糕的多
尽管在仔细设计,测试和审查方面做出了相当大的努力,但错误仍在蔓延。虽然它们很少,并且最终被发现并修复,但仍然存在一段时期,这些错误可能会破坏数据。
尽管在仔细设计,测试以及审查上做出很多努力但Bug仍然会在不知不觉中产生。尽管它们很少而且最终会被发现并被修复但总会有那么一段时间这些Bug可能会损坏数据。
当涉及到应用程序代码时,我们不得不承担更多的错误,因为大多数应用程序在数据库代码所做的评审和测试的数量上没有接近的地方。许多应用程序甚至没有正确使用数据库提供的用于保存完整性的功能例如外键或唯一性约束【36】。
而对于应用代码,我们不得不假设会有更多的错误,因为绝大多数应用的代码经受的评审与测试远远无法与数据库的代码相比。许多应用甚至没有正确使用数据库提供的用于维持完整性的功能例如外键或唯一性约束【36】。
ACID意义上的一致性请参阅第224页的“[一致性]()”)基于数据库以一致状态启动并且事务将其从一个一致状态转换为另一个一致状态的想法。因此,我们期望数据库始终处于一致状态。但是,如果您认为该交易没有错误,则这个概念才有意义。如果应用程序错误地使用数据库以某种方式,例如,不安全地使用弱隔离级别,数据库的完整性无法得到保证。
ACID意义下的一致性(参阅“[一致性](ch7.md#一致性)”基于这样一种想法数据库以一致的状态启动而事务将其从一个一致状态转换至另一个一致的状态。因此我们期望数据库始终处于一致状态。然而只有当你假设事务没有Bug时这种想法才有意义。如果应用以某种错误的方式使用数据库例如不安全地使用弱隔离等级数据库的完整性就无法得到保证。
#### 不要盲目信任他们的承诺
#### 不要盲目信任承诺
由于硬件和软件并不总是符合我们希望的理想,所以数据腐败似乎迟早是不可避免的。因此,我们至少应该有办法查明数据是否已经损坏,以便我们能够修复它并尝试追查错误的来源。检查数据完整性称为审计。
由于硬件和软件并不总是符合我们的理想,所以数据损坏似乎早晚不可避免。因此,我们至少应该有办法查明数据是否已经损坏,以便我们能够修复它并尝试追查错误的来源。检查数据完整性称为**审计auditing**
如“不可变事件的优点”一节中所述,审计不仅适用于财务应用程序。然而,可审计性在财务中非常重要,因为每个人都知道错误发生了,而且我们都认识到需要能够检测和解决问题
如“[不可变事件的优点](ch11.md#不可变事件的优点)”一节中所述,审计不仅仅适用于财务应用程序。不过,可审计性在财务中是非常非常重要的。这种错误发生之后,需要能被检测与解决,我们都知道所有人都会认为这是合理需求
成熟的系统同样倾向于考虑不太可能的事情出错的可能性并管理这种风险。例如HDFS和Amazon S3等大规模存储系统不完全信任磁盘它们运行后台进程,这些后台进程持续读文件,将其与其他副本进行比较,并将文件从一个磁盘移动到另一个磁盘,以便减轻沉默腐败的风险【67】。
成熟的系统同样倾向于考虑不太可能的事情出错的可能性并管理这种风险。例如HDFS和Amazon S3等大规模存储系统不完全信任磁盘:它们运行后台进程持续读文件,将其与其他副本进行比较,并将文件从一个磁盘移动到另一个,以便降低静默损坏的风险【67】。
如果你想确保你的数据仍然存在,你必须真正阅读并检查。大多数时候它仍然会在那里,但如果不是这样,你真的很想早日找到答案。通过同样的说法,尝试从备份中不时恢复是非常重要的,否则只有当它太迟而您已经丢失数据时才会发现备份被破坏。不要盲目地相信它是全部工作
如果你想确保你的数据仍然存在,你必须真正读取它并进行检查。大多数时候它们仍然会在那里,但如果不是这样,你一定想尽早知道答案,而不是更晚。按照同样的原则,不时地尝试从备份中恢复是非常重要的 —— 否则当你发现备份损坏时,你可能已经遇到了数据丢失,那时候就真的太晚了。不要盲目地相信它们全都管用
#### 验证的文化
像HDFS和S3这样的系统仍然必须假定磁盘大部分时间都能正常工作 —— 这是一个合理的假设,但假设它们始终正常工作并不相同。然而,目前还没有多少系统有这种“信任但是验证”的方式来持续审计自己。许多人认为正确性保证是绝对的,并且没有为罕见数据损坏的可能性做出规定。我希望将来我们会看到更多的自我验证或自我审计系统,不断检查自己的诚信而不是依赖盲目的信任【68】。
像HDFS和S3这样的系统仍然需要假设磁盘大部分时间都能正常工作 —— 这是一个合理的假设,但与它们**始终**能正常工作的假设并不相同。然而目前还没有多少系统采用这种“信任但是验证”的方式来持续审计自己。许多人认为正确性保证是绝对的,并且没有为罕见的数据损坏的可能性做过准备。我希望未来能看到更多的**自我验证self-validating**或**自我审计self-auditing**系统,不断检查自己的完整性而不是依赖盲目的信任【68】。
我担心ACID数据库的文化导致我们在盲目信任技术交易机制)的基础上开发应用程序,而忽视了这种过程中的任何可审计性。由于我们所信任的技术在大多数情况下工作得很好,审计机制并不值得投资。
我担心ACID数据库的文化导致我们在盲目信任技术事务机制)的基础上开发应用,而忽视了这种过程中的任何可审计性。由于我们所信任的技术在大多数情况下工作得很好,通常会认为审计机制并不值得投资。
但随之而来的是数据库的格局发生了变化在NoSQL的旗帜下一致性的保证变得越来越少,成熟的存储技术越来越被广泛的使用。但是,由于审计机制还没有形成,我们继续在盲目信任的基础上建立应用程序,即使这种方法现在变得更加危险。让我们思考一下关于可审计性的设计
但随之而来的是数据库的格局发生了变化在NoSQL的旗帜下更弱的一致性保证成为常态,更不成熟的存储技术越来越被广泛使用。但是由于审计机制还没有被开发出来,尽管这种方式越来越危险,我们仍不断在盲目信任的基础上构建应用。让我们想一想如何针对可审计性而设计吧
#### 设计可审计性
#### 为可审计性而设计
如果一个事务在一个数据库中改变了多个对象,事实上很难说事实是什么意思。即使您捕获事务日志请参阅第454页上的“[变更数据捕获]()”),各种表中的插入,更新和删除操作并不一定清楚表明为何执行这些突变。决定这些突变的应用逻辑的调用是暂时的,不能被复制
如果一个事务在一个数据库中改变了多个对象,在这一事实发生后,很难说清这个事务到底意味着什么。即使你捕获了事务日志(参阅“[变更数据捕获](ch11.md#变更数据捕获)”),各种表中的插入,更新和删除操作并不一定能清楚地表明**为什么**要执行这些变更。决定这些变更的是应用逻辑中的调用,而这一应用逻辑稍纵即逝,无法重现
相比之下,基于事件的系统可以提供更好的可审计性。在事件源方法中,系统的用户输入被表示为一个单一的不可变事件,并且任何结果状态更新都来自该事件。衍生可以做出确定性和可重复性,以便通过相同版本的衍生代码运行相同的事件日志将导致相同的状态更新
相比之下,基于事件的系统可以提供更好的可审计性。在事件源方法中,系统的用户输入被表示为一个单一不可变事件,而任何其导致的状态变更都衍生自该事件。衍生可以实现为具有确定性与可重复性,因而相同的事件日志通过相同版本的衍生代码时,会导致相同的状态变更
清楚地看到数据流请参阅第419页上的“[批处理输出的原理]()”)可以使数据的来源更加清晰,从而使完整性检查更加可行。对于事件日志,我们可以使用散列来检查事件存储没有被破坏。对于任何衍生状态,我们可以重新运行从事件日志中衍生它的批处理流处理器,以检查是否获得相同的结果,或者甚至并行运行冗余衍生。
显式处理数据流(参阅“[批处理输出的哲学](ch10.md#批处理输出的哲学)”)可以使数据的**来龙去脉provenance**更加清晰,从而使完整性检查更具可行性。对于事件日志,我们可以使用散列来检查事件存储没有被破坏。对于任何衍生状态,我们可以重新运行从事件日志中衍生它的批处理器与流处理器,以检查是否获得相同的结果,或者甚至并行运行冗余衍生流程
确定性和定义良好的数据流也使调试和跟踪系统的执行变得容易以确定它为什么做了某些事情【4,69】。如果出现意想不到的事情那么具有诊断能力来重现导致意外事件的确切环境 —— 一种时间行程调试功能是非常有价值的。
具有确定性且定义良好的数据流,也使调试与跟踪系统的执行变得容易,以便确定它**为什么**做了某些事情【4,69】。如果出现意想之外的事情那么重现导致意外事件的确切事故现场的诊断能力—— 一种时间旅行调试功能是非常有价值的。
#### 再次是端到端的论点
#### 端到端原则重现
如果我们不能完全相信系统的每个组件都不会发生腐败 —— 每一个硬件都是无错的,并且每一个软件都没有缺陷 —— 那么我们至少必须定期检查数据的完整性。如果我们不检查,我们就不会发现腐败,直到它太晚了,并且已经造成了一些下游损害,在这一点上追踪这个问题将变得更加困难和昂贵
如果我们不能完全相信系统的每个组件都不会损坏 —— 每一个硬件都没缺陷每一个软件都没有Bug —— 那我们至少必须定期检查数据的完整性。如果我们不检查,我们就不能发现损坏,直到无可挽回地导致对下游的破坏时,那时候再去追踪问题就要难得多,且代价也要高的多
检查数据系统的完整性最好是以端到端的方式完成(请参阅“[数据库的端到端争论]()”51页我们可以在完整性检查中包含的系统越多那里的机会就越少在这个过程的某个阶段腐败是被忽视的。如果我们可以检查整个衍生数据管道是端到端正确的那么沿着路径的任何磁盘网络服务和算法都隐含在检查中
检查数据系统的完整性,最好是以端到端的方式进行(参阅“[数据库的端到端争论](#数据库的端到端争论)”):我们能在完整性检查中涵盖的系统越多,某些处理阶中出现不被察觉损坏的几率就越小。如果我们能检查整个衍生数据管道端到端的正确性,那么沿着这一路径的任何磁盘,网络,服务,以及算法的正确性检查都隐含在其中了
持续的端到端完整性检查可以提高您对系统正确性的信心从而使您的移动速度更快【70】。与自动化测试一样审计增加了发现错误的可能性从而降低了系统变更或新存储技术造成损害的风险。如果您不害怕进行变更您可以更好地开发应用程序以满足不断变化的需求。
持续的端到端完整性检查可以不断提高你对系统正确性的信心从而使你能更快地进步【70】。与自动化测试一样审计提高了快速发现错误的可能性从而降低了系统变更或新存储技术可能导致损失的风险。如果你不害怕进行变更就可以更好地充分演化一个应用使其满足不断变化的需求。
#### 审计数据系统的工具
#### 用于可审计数据系统的工具
目前,数据系统并不多,这使可审计性成为高层关注的重点。一些应用程序实现自己的审计机制,例如将所有变更记录到单独的审计表中,但是保证审计日志的完整性,并且数据库状态仍然很困难。事务日志可以通过定期使用硬件安全模块对事务日志进行签名来进行防篡改,但这并不能保证正确的事务首先进入日志
目前,将可审计性作为顶层关注点的数据系统并不多。一些应用实现了自己的审计机制,例如将所有变更记录到单独的审计表中,但是确保审计日志与数据库状态的完整性仍然是很困难的。可以通过定期使用硬件安全模块对事务日志进行签名来防止篡改,但这无法保证正确的事务一开始就能进入到日志中
使用密工具来证明系统的完整性是十分有趣的,这种方式对于广泛的硬件和软件问题以及甚至是潜在的恶意行为都很有效。加密货币区块链和分布式账本技术如比特币以太坊波纹恒星等等【71,72,73】已经出现在这个领域
使用密码学工具来证明系统的完整性是十分有趣的,这种方式对于宽泛的硬件与软件问题甚至是潜在的恶意行为都很稳健有效。加密货币区块链以及诸如比特币以太坊RippleStellar的分布式账本技术已经迅速出现在这一领域【71,72,73】
我没有资格评论这些技术作为商定合同的货币或机制的优点。但是,从数据系统的角度来看,它们包含了一些有趣的想法。实质上,它们是分布式数据库,具有数据模型和事务机制,不同副本可以由互不信任的组织托管。复制品不断检查彼此的完整性,并使用共识协议来约定应执行的交易
我没有资格评论这些技术用于货币,或者合同商定机制的价值。但从数据系统的角度来看,它们包含了一些有趣的想法。实质上,它们是分布式数据库,具有数据模型与事务机制,而不同副本可以由互不信任的组织托管。副本不断检查其他副本的完整性,并使用共识协议对应当执行的事务达成一致
我对这些技术的拜占庭容错方面有些怀疑参见第304页的“[拜占庭故障]()”),而且我发现工作证明(比如比特币挖掘)技术非常浪费。比特币的交易吞吐量相当低,尽管出于政治和经济原因而不是技术交易。但是,完整性检查方面很有趣。
我可以想象完整性检查和审计算法(如证书透明度和分布式分类账算法)在一般数据系统中得到越来越广泛的应用。 一些工作将需要使它们具有同样的可扩展性,因为没有加密审计的系统,并且尽可能降低性能损失。 但我认为这是一个值得关注的领域。
我对这些技术的拜占庭容错方面有些怀疑(参阅“[拜占庭故障](ch8.md#拜占庭故障)”),而且我发现**工作证明proof of work**技术非常浪费(比如,比特币挖矿)。比特币的交易吞吐量相当低,尽管是出于政治与经济原因而非技术上的原因。不过,完整性检查的方面是很有趣的。
密码学审计与完整性检查通常依赖**默克尔树Merkle tree**【74】这是一颗散列值的树能够用于高效地证明一条记录出现在一个数据集中以及其他一些特性。除了炒作的沸沸扬扬的加密货币之外**证书透明性certificate transparency**也是一种依赖Merkle树的安全技术用来检查TLS/SSL证书的有效性【75,76】。
我可以想象,那些在证书透明度与分布式账本中使用的完整性检查和审计算法,将会在通用数据系统中得到越来越广泛的应用。要使得这些算法对于没有密码学审计的系统同样可伸缩,并尽可能降低性能损失还需要一些工作。 但我认为这是一个值得关注的有趣领域。
## 做正确的事情
在本书的最后部分,我想退后一步。在本书中,我们考察了各种不同的数据系统体系结构,评估了它们的优缺点,并探讨了构建可靠,可扩展和可维护应用程序的技术。但是,我们忽略了现在我想填补的讨论中一个重要的基本部分
在本书的最后部分,我想退后一步。在本书中,我们考察了各种不同的数据系统架构,评价了它们的优点与缺点,并探讨了构建可靠,可扩展,可维护应用的技术。但是,我们忽略了讨论中一个重要而基础的部分,现在我想补充一下
每个系统都是为了一个目的而建造的,我们采取的每一项行动都有既定的意义,也有无意义的后果。其目的可能与赚钱一样简单,但世界的后果可能会远远超出最初的目的。我们这些建立这些系统的工程师有责任仔细考虑这些后果,并有意识地决定我们希望生活在哪一种世界
每个系统都是为了一个目的而构建的;我们采取的每一项行动既会产生期望的后果,也会导致无意的后果。目的可能只是简单地赚钱,但对世界的影响可能会远远超出最初的目的。我们,建立这些系统的工程师,有责任去仔细考虑这些后果,并有意识地决定我们希望生活在怎样的世界中
我们将数据作为一个抽象的东西来讨论,但请记住,许多数据集都是关于人的:他们的行为,他们的兴趣,他们的身份。我们必须以人性和尊重来对待这些数据。用户也是人类,人的尊严是至高无上的。
我们将数据作为一个抽象的东西来讨论,但请记住,许多数据集都是关于人的:他们的行为,他们的兴趣,他们的身份。我们必须带着人性与尊重来对待这些数据。用户也是人类,人的尊严是至高无上的。
软件开发日益涉及重要的道德选择。有一些指导原则可以帮助软件工程师解决这些问题例如ACM的软件工程道德规范和专业实践【77】但很少在实践中讨论应用和实施。因此工程师和产品经理有时会对隐私和产品潜在的负面后果采取非常傲慢的态度【78,79,80】。
软件开发越来越多地涉及重要的道德抉择。有一些指导原则可以帮助软件工程师解决这些问题例如ACM的软件工程道德规范与专业实践【77】但这些很少在实践中被讨论应用罔论强制执行。因此工程师和产品经理有时会对隐私与产品潜在的负面后果采取非常傲慢的态度【78,79,80】。
技术本身并无好坏之分,重要的是如何使用它以及它如何影响人。对于像搜索引擎这样的软件系统来说,就像使用像武器这样的武器非常相似。我认为,软件工程师仅仅专注于技术并忽视其后果是不够的:伦理责任也是我们的责任。有关道德的推理是困难的,但忽视这一点太重要了
技术本身并无好坏之分 —— 重要的是它被怎样使用,以及它如何影响人们。这对枪械这样的武器是成立的,而搜索引擎这样的软件系统与之非常类似。我认为,软件工程师仅仅专注于技术而忽视其后果是不够的:道德责任也是我们的责任。对道德推理很困难,但它太重要而无法被忽视
### 预测分析
### 预测分析
例如预测分析是“大数据”炒作的主要部分。使用数据分析预测天气或疾病传播是一回事【81】;另一个问题是要预测一个罪犯是否可能再犯罪,一个贷款申请人是否有可能违约,或者一个保险客户是否有可能做出昂贵的索赔。后者直接影响到个人的生活。当然,支付网络希望防止欺诈交易,银行希望避免不良贷款,航空公司希望避免劫持,公司希望避免激怒无效或不可靠的人。从他们的角度来看,错过商业机会的成本很低,但不良贷款或有问题的员工的成本要高得多,因此组织希望保持谨慎是很自然的。如果有疑问,他们最好不要说
举个例子预测性分析是“大数据”炒作的主要部分。使用数据分析预测天气或疾病传播是一码事【81】而预测一个罪犯是否可能再犯一个贷款申请人是否有可能违约或者一个保险客户是否可能进行昂贵的索赔则是另外一码事。后者会直接影响到个人的生活
然而随着算法决策变得越来越普遍某人准确地或错误地被某种算法标记为有风险可能会遭受大量“不”决定。系统地排除工作航空旅行保险物业租赁金融服务和社会其他关键方面是个人自由的巨大制约因素因此被称为“算法监狱”【82】。在尊重人权的国家刑事司法系统在被证明有罪之前就认定无罪。另一方面自动化系统可以有系统地任意地排除一个人参与社会活动而没有任何内疚的证据而且几乎没有上诉的机会。
当然,支付网络希望防止欺诈交易,银行希望避免不良贷款,航空公司希望避免劫持,公司希望避免雇佣低效或不值得信任的人。从它们的角度来看,错失商机的成本很低,但不良贷款或有问题的员工成本则要高得多,因而组织希望保持谨慎是很自然的事情。如果存疑,它们通常会拒绝。
然而随着算法决策变得越来越普遍被某种算法准确地或错误地标记为有风险的某人可能会遭受大量这种“No”的决定。系统性地被排除在工作航空旅行保险物业租赁金融服务和社会其他关键领域之外。这是一种对个人自由的极大约束因此被称为“算法监狱”【82】。在尊重人权的国家刑事司法系统会做无罪推定默认清白直到被证明有罪。另一方面自动化系统可以系统地任意地将一个人排除在社会活动参与之外不需要任何有罪的证明而且几乎没有申诉的机会。
#### 偏见和歧视
算法做出的决定不一定比人类做出的更好或更差。每个人都可能有偏见,即使他们积极地试图抵消它们,歧视性做法也可能在文化上被制度化。人们希望根据数据做出决定,而不是通过人们的主观和现场评估来更加公平,给那些在传统系统中经常被忽视的人更好的机会【83】。
算法做出的决定不一定比人类做出的更好或更差。每个人都可能有偏见,即使他们主动尝试抵抗偏见,而歧视性做法也可能在文化上被制度化。人们希望根据数据做出决定,而不是通过人们的主观与直觉评价,希望这样能更加公平,并给予传统体制中经常被忽视的人更好的机会。【83】。
当我们开发预测分析系统时,我们不仅仅是通过使用软件来指定什么时候说是或否的规则来自动化人的决定;我们甚至将规则本身从数据中推断出来。但是,这些系统学到的模式是不透明的:即使数据中存在一些相关性,我们也可能不知道为什么。如果在算法输入中存在系统偏差,系统很可能会在输出中学习和放大偏差【84】。
当我们开发预测性分析系统时我们不是仅仅通过指定什么时候Yes什么时候No的规则将人类的决策用软件来自动化。我们甚至是从数据本身推断出规则。但是,这些系统学到的模式是不透明的:即使数据中存在一些相关性,我们也可能压根不知道为什么。如果在算法输入中存在系统性的偏差,系统很有可能会在输出中学习并放大这种偏差【84】。
在许多国家,反歧视法律禁止根据种族,年龄,性别,性别,残疾或信仰等受保护特征对待不同的人。一个人的数据的其他特征可能会被分析,但是如果他们与受保护的特征相关会发生什么?例如,在种族隔离的邻居一个人的邮政编码甚至是他们的IP地址都是一个强烈的种族预测。这样说,相信一种算法可以以某种方式将偏倚的数据作为输入并产生公平和公正的输出【85】似乎是荒谬的。然而,这种观点似乎常常被数据驱动型决策制定的支持者所暗示,这种态度被讽刺为“机器学习就像洗钱对于偏见”【86】。
在许多国家,反歧视法律禁止按种族,年龄,性别,性别,残疾或信仰等受保护的特征区别对待不同的人。其他个人特征也许能会于分析,但是如果这些特征与受保护的特征存在关联会发生什么?例如,在种族隔离的地区一个人的邮政编码甚至是他们的IP地址都是种族的强预测指标。这样说的话,相信一种算法可以以某种方式将偏数据作为输入并产生公平和公正的输出【85】似乎是荒谬的。然而这种观点似乎常常隐含在数据驱动型决策的支持者中这种态度被讽刺为“在处理偏差上机器学习与洗钱很相似”machine learning is like money laundering for bias【86】。
预测分析系统只是从过去推断出来的;如果过去是歧视性的,他们就会把这种歧视归为法律。如果我们希望未来比过去更好,那么就需要道德想象力,而这只有人类才能提供【87】。数据和模型应该是我们的工具,而不是我们的主人。
预测性分析系统只是基于过去进行推断的;如果过去是歧视性的,它们就会将这种歧视归为法律。如果我们希望未来比过去更好,那么就需要道德想象力,而这只有人类才能提供的东西【87】。数据与模型应该是我们的工具,而不是我们的主人。
#### 责任和问责
自动决策开启了责任和问责的问题【87】。如果一个人犯了错误他们可以被追究责任受决定影响的人可以上诉。算法也会犯错误但是如果他们出错谁会犯错误【88】当一辆自驾车引发事故时谁负责如果自动信用评分算法系统地区分特定种族或宗教的人是否有任何追索权如果机器学习系统的决定受到司法审查能向法官解释算法是如何做出决定的吗?
自动决策引发了关于责任与问责的问题【87】。如果一个人犯了错误他们可以被追究责任受决定影响的人可以申诉。算法也会犯错误但是如果它们出错谁来负责【88】当一辆自动驾驶汽车引发事故时谁来负责如果自动信用评分算法系统性地区分特定种族或宗教的人他们是否有任何追索权如果机器学习系统的决定受到司法审查能向法官解释算法是如何做出决定的吗?
信用评级机构是收集数据来做出人们决策的一个老例子。不良信用评分会使生活变得困难,但至少一个信用评分通常是基于一个人的实际借款历史的相关事实,并且记录中的任何错误都可以得到纠正(尽管机构通常不会这么容易)。然而,基于机器学习的评分算法通常使用更广泛的输入范围,并且更加不透明,使得难以理解特定决策是如何发生的以及是否有人正在以不公平或歧视的方式被对待【89】。
信用评级机构是收集关于人们的数据并进行决策的一个老例子。不良的信用评分会使生活变得更困难,但至少信用评分通常是基于个人实际借款历史记录,而记录中的任何错误都可以得到纠正(尽管机构通常不会让这变得容易)。然而,基于机器学习的评分算法通常使用更广泛的输入,并且更加不透明,因而特定决策是怎样作出的,以及是否有人被不公正地/歧视性地对待变得非常难以理解【89】。
信用评分总结了“你过去的表现如何?”,而预测分析通常是基于“谁与你类似,以及过去人们喜欢你的行为如何?”。与他人行为相似的绘图意味着刻板印象人们,例如根据他们居住的地方(一个关于种族和社会经济阶层的密切代理人)。那些放错人的人呢?而且,如果由于错误的数据而做出的决定是不正确的,则追索权几乎是不可能的【87】。
信用评分总结了“你过去的表现如何?”,而预测性分析通常是基于“谁与你类似,以及与你类似的人过去表现的如何?”。与他人的行为画上等号意味着刻板印象,例如,根据他们居住的地方(一个与种族和阶级关系密切的代表)。那么那些放错位置的人怎么办?而且,如果是因为错误的数据而做出的错误决定,追索几乎是不可能的【87】。
很多数据本质上是统计的,这意味着即使概率分布总体上是正确的,个别情况也可能是错的。例如,如果贵国的平均寿命是80岁那么这并不意味着在80岁生日时就会死亡。从平均分布和概率分布来看你不能说很多关于某个特定人的生活年龄。同样预测系统的输出是概率性的在个别情况下可能是错误的。
很多数据本质上是统计的,这意味着即使概率分布总体上是正确的,个别情况也可能是错的。例如,如果你国的平均寿命是80岁那么这并不意味着你在80岁生日时就会嗝屁。从平均分布和概率分布来看你无法推断特定某个人的寿命。同样预测系统的输出是概率性的对于个例可能是错误的。
盲目相信数据至高无上的决策不仅是妄想,它是非常危险的。随着数据驱动的决策变得越来越普遍,我们需要弄清楚如何使算法负责任和透明,如何避免加强现有的偏见,以及如何在不可避免的错误时加以修复。
盲目相信数据决策至高无上,这不仅仅是一种妄想,而是有切实危险的。随着数据驱动的决策变得越来越普遍,我们需要弄清楚如何使算法透明,且责任,如何避免加强现有的偏见,以及如何在它们不可避免地出错时加以修复。
我们还需要弄清楚如何防止数据被用来伤害人,并且实现其正向潜力。例如,分析可以揭示人们生活的财务和社会特征。一方面,这种权力可以用来把援助和支持集中在帮助那些最需要援助的人身上。另一方面,它有时被掠夺性企业用于识别弱势群体并向高风险产品销售如高成本贷款和无价值的大学学位【87,90】
我们还需要弄清楚如何避免数据被用来伤害人,并意识到其积极方面的潜力。例如,分析可以揭示人们生活的财务特征与社会特征。一方面,这种权力可以用来将援助与支持集中在帮助那些最需要援助的人身上。另一方面,它有时被掠夺性企业用于识别弱势群体并向其兜售高风险产品比如高利贷与野鸡大学文凭【87,90】[^译注i]
#### 反馈回路
[^译注i]: 在中国: 莆田医院,高利贷,智商税。
即使预测性应用程序对人们的影响较小比如推荐系统也存在难以解决的问题。当服务善于预测用户想要看到什么内容时他们最终可能只会向人们展示他们已经同意的观点导致产生陈腔滥调错误信息和极化可能滋生的回声室。我们已经看到社交媒体呼应室对竞选活动的影响【91】。
#### 反馈循环
当预测分析影响人们的生活时特别是由于自我强化反馈循环而出现有害问题。例如考虑雇主使用信用评分来评估潜在员工的情况。你可能是一个信誉好的好员工但是由于你不能控制的不幸你会突然发现自己陷入财务困境。由于您错过了账单付款您的信用评分会受到影响您将不太可能找到工作。失业使你陷入贫困这进一步恶化了你的分数使其更难找到工作【87】。由于有毒的假设这是一个下降的螺旋隐藏在数学严谨和数据伪装的背后
即使那些对人们直接影响比较小的预测性应用比如推荐系统也有我们必须面对的困难问题。当服务变得善于预测用户想要看到什么内容时它们最终可能只会向人们展示他们已经同意的观点将其带入滋生刻板印象误导信息和极端思想的回音室。我们已经看到社交媒体回音室对竞选的影响了【91】
我们不能总是预测这种反馈循环何时发生。然而,通过考虑整个系统(不仅仅是计算机化的部分,而且还有与之互动的人),可以预测许多后果—— 一种称为系统思维的方法【92】。我们可以尝试理解数据分析系统如何响应不同的行为结构或特性。该系统是否加强和扩大了人们之间现有的差异例如使富人更穷或更穷还是试图打击不公正即使有最好的意图我们也必须小心意想不到的后果
当预测性分析影响人们的生活时由于自我强化反馈循环会导致特别有害的问题。例如考虑雇主使用信用分来评估候选人的例子。你可能是一个信用分不错的好员工但是因为不可抗力的意外陷入财务困境。由于错过了账单付款你的信用分会受到影响进而导致找到工作更为困难。失业使你陷入贫困这进一步恶化了你的分数使你更难找到工作【87】。在数据与数学严谨性的伪装背后隐藏的是由恶毒假设导致的恶性循环
#### 隐私和跟踪
我们无法总是预测这种反馈循环什么时候发生。然而,通过考虑整个系统(不仅仅是计算机化的部分,而且还有与之互动的人),许多后果是能够预测的 —— 一种称为**系统思维systems thinkin**的方法【92】。我们可以尝试理解数据分析系统如何响应不同的行为结构或特性。该系统是否加强和扩大了人们之间现有的差异例如损不足以奉有余还是试图与不公正作斗争而且即使带着最好的动机我们也必须小心意想不到的后果。
除了预测分析的问题 —— 即使用数据来做出关于人的自动决策 —— 数据收集本身也存在道德问题。收集数据的组织与正在收集数据的人之间有什么关系?
### 隐私和追踪
当系统仅存储用户明确输入的数据时,系统会以特定方式存储和处理数据,系统正在为用户执行服务:用户就是客户。但是,当用户的活动被跟踪并记录为他们正在做的其他事情的副作用时,这种关系就不那么清晰了。该服务不再仅仅是用户告诉它做的事情,而是服务于它自己的利益,这可能与用户的兴趣相冲突。
除了预测性分析 —— 即使用数据来做出关于人的自动决策 —— 数据收集本身也存在道德问题。收集数据的组织与被收集数据的人之间有什么关系?
跟踪行为数据对于许多在线服务的面向用户的功能变得越来越重要:跟踪点击哪些搜索结果有助于提高搜索结果的排名;推荐“喜欢X的人也喜欢Y”可以帮助用户发现有趣而有用的东西; A / B测试和用户流量分析可以帮助指出如何改进用户界面。这些功能需要一定量的用户行为跟踪用户可以从中受益
当系统仅存储用户明确输入的数据时,他们希望系统以特定方式存储和处理数据,系统是在为用户提供**服务**:用户就是客户。但是,当用户的活动被跟踪并记录,作为他们正在做的其他事情的副作用时,这种关系就不那么清晰了。该服务不再仅仅完成用户告诉它要做的事情,而是服务于它自己的利益,这可能与用户的利益相冲突
但是,根据公司的商业模式,追踪往往不止于此。如果服务是通过广告获得资金支持的,那么广告客户就是真正的客户,而用户的利益则位居第二。跟踪数据变得更加详细,分析变得更深入,数据保留很长时间,以便为营销目的建立每个人的详细资料
追踪用户行为数据对于许多面向用户的在线服务而言变得越来越重要追踪用户点击了哪些搜索结果有助于提高搜索结果的排名推荐“喜欢X的人也喜欢Y”可以帮助用户发现有趣且有用的东西 A/B测试和用户流量分析可以帮助指出如何改进用户界面。这些功能需要一定量的用户行为跟踪而用户可以从中受益
现在,公司和收集数据的用户之间的关系开始变得非常不同。用户可获得免费服务,并尽可能使用户接受该服务。对用户的追踪主要不是服务于该个人,而是服务于该服务的广告商的需求。我认为这种关系可以用一个更具罪犯内涵的词来恰当地描述:监视
但是,根据不同公司的商业模式,追踪往往不止于此。如果服务是通过广告盈利的,那么广告客户就是真正的客户,而用户的利益则位居第二。跟踪的数据就会变得更详细,分析变得更深入,数据会保留很长时间,以便为每个人建立详细画像,用于营销目标
#### 监控
现在,公司与被收集数据的用户之间,关系开始变得非常不一样了。公司会给用户以免费的服务,并引诱用户尽可能多地使用。对用户的追踪主要不是服务于该个体,而是服务于掏钱资助该服务的广告商。我认为这种关系可以用一个更具罪犯内涵的词来恰当地描述:**监视surveilance**。
作为一个思想实验尝试用监视来替换单词数据并观察常用短语是否听起来如此好【93】。这样如何“在我们的监控驱动的组织中我们收集实时监控流并将它们存储在我们的监控仓库中。我们的监控科学家使用高级分析和监测处理来获得新的见解。“
#### 监视
这个思想实验对于本书“设计监控 —— 密集型应用程序”来说是异乎寻常的争论但我认为需要强调的话来强调这一点。在我们制作软件“吃世界”的尝试中【94】我们已经建立了世界上迄今为止所见过的最伟大的大众监视基础设施。我们正朝着物联网迈进我们正在迅速接近这样一个世界每个有人居住的空间至少包含一个互联网连接的麦克风以智能手机智能电视语音控制助理设备婴儿监视器甚至儿童玩具使用基于云的语音识别。这些设备中的很多都有可怕的安全记录【95】。
作为一个思想实验,尝试用**监视surveillance**一词替换**数据data**再看看常用的短语是不是听上去还那么好【93】。比如这样“在我们的监视驱动的组织中我们收集实时监视流并将它们存储在我们的监视仓库中。我们的监视科学家使用高级分析和监视处理来获得新的见解。“
即使是极权主义和专制政权也只能梦想在每个房间放置一个麦克风并强迫每个人不断地携带能够追踪其位置和动作的设备。然而我们显然自愿地甚至热心地投身于这个全面监视的世界。不同之处在于数据是由公司而不是由政府机构收集的【96】。
这个思想实验对于本书《设计监控密集型应用》来说是非同寻常的争论但我认为需要强烈的言辞来强调这一点。在我们制作软件“吞噬世界”的尝试中【94】我们已经建立了世界上迄今为止所见过的最伟大的大众监视基础设施。我们正朝着物联网迈进我们正在迅速接近这样一个世界每个有人居住的空间至少包含一个带互联网连接的麦克风以智能手机智能电视语音控制助理设备婴儿监视器甚至儿童玩具的形式存在并使用基于云的语音识别。这些设备中的很多都有着可怕的安全记录【95】。
并不是所有的数据收集都必须符合监督的要求,但检查它们可以帮助我们理解我们与数据收集者的关系。为什么我们似乎很乐意接受企业的监督?也许你觉得你没有隐瞒 —— 换句话说你完全符合现有的权力结构你不是被边缘化的少数派你不必害怕迫害【97】。不是每个人都如此幸运。也许这是因为目的似乎是良性的 —— 这不是强制性的,也不是强制性的,而只是更好的建议和更个性化的营销。但是,结合上一节中对预测分析的讨论,这种区分似乎不太清晰
即使是最为极权与专制的政权也只能想着在每个房间放置一个麦克风并强迫每个人始终携带能够追踪其位置与动向的设备。然而我们显然是自愿地甚至热情地投身于这个全域监视的世界。不同之处在于数据是由公司而不是由政府机构收集的【96】
我们已经看到与汽车追踪设备挂钩的汽车保险费以及取决于佩戴健身追踪设备的人的健康保险范围。当监视被用来确定在生活的重要方面如保险或就业等方面的东西时它开始变得不那么温和。此外数据分析可以揭示出令人惊讶的侵入性事物例如智能手表或健身追踪器中的运动传感器可用于以相当好的准确度计算出您正在输入的内容例如密码【98】。而分析算法只会变得更好
并不是所有的数据收集都称得上监视,但检视这一点有助于理解我们与数据收集者之间的关系。为什么我们似乎很乐意接受企业的监视?也许你觉得自己没有什么好隐瞒的 —— 换句话说你与当权阶级穿一条裤子你不是被边缘化的少数派也不必害怕受到迫害【97】。不是每个人都如此幸运。或者也许这是因为目的似乎是温和的 —— 这不是公然胁迫,也不是强制性的,而只是更好的推荐与更个性化的营销。但是,结合上一节中对预测性分析的讨论,这种区别似乎不是很清晰
#### 同意和选择的自由
我们已经看到与汽车追踪设备挂钩的汽车保险费以及取决于需要人佩戴健身追踪设备的健康保险范围。当监视被用于决定生活的重要方面时例如保险或就业它就开始变得不那么温和了。此外数据分析可以揭示出令人惊讶的唐突结果例如智能手表或健身追踪器中的运动传感器可以相当好的准确度计算出你正在输入的内容例如密码【98】。而分析算法只会变得越来越好。
我们可能会断言用户自愿选择使用跟踪其活动的服务,并且他们已同意服务条款和隐私政策,因此他们同意收集数据。我们甚至可以声称,用户正在接受有价值的服务,以换取所提供的数据,并且为了提供服务,跟踪是必要的。毫无疑问,社交网络,搜索引擎以及其他各种免费的在线服务对于用户来说都是有价值的,但是这个说法存在问题。
#### 同意与选择的自由
用户几乎不知道他们提供给我们的数据库的数据,或者它们如何保留和处理 —— 而大多数隐私政策的作用更多的是模糊而不是照亮。如果不了解他们的数据会发生什么,用户无法给出任何有意义的同意。通常,来自一个用户的数据还说明关于不是该服务的用户并且没有同意任何条款的其他人的事情。我们在本书的这一部分讨论的衍生数据集(来自整个用户群的数据可能与行为跟踪和外部数据源相结合)恰恰是用户无法获得任何有意义理解的数据种类。
而且数据是通过单向过程从用户中提取出来的而不是真正的互惠关系而不是公平的价值交换。没有对话用户无法选择他们提供的数据量以及他们收到的服务回报服务和用户之间的关系是非常不对称和片面的。这些条款是由服务设置而不是由用户【99】。
我们可能会断言用户自愿选择使用跟踪其活动的服务,而且他们已经同意了服务条款与隐私政策,因此他们同意数据收集。我们甚至可以声称,用户正在用所提供的数据来换取有价值的服务,并且为了提供服务,追踪是必要的。毫无疑问,社交网络,搜索引擎,以及各种其他免费的在线服务对于用户来说都是有价值的,但是这个说法却存在问题。
对于不同意监视的用户唯一真正的选择就是不使用服务。但是这个选择也不是免费的如果一项服务如此受欢迎以至于“被大多数人认为是基本社会参与的必要条件”【99】那么指望人们选择退出这项服务是不合理的 —— 使用它事实上是强制性的。例如在大多数西方社会群体中携带智能手机使用Facebook进行社交以及使用Google查找信息已成为常态。特别是当一项服务具有网络效应时人们选择不使用它会产生社会成本
用户几乎不知道他们提供给我们的数据,哪些数据被放进了数据库,数据又是怎样被保留与处理的 —— 而大多数隐私政策更多的是闪烁其词,而非打开天窗说亮话。用户不了解他们的数据会发生什么,就无法给出任何有意义的同意。通常,来自一个用户的数据还会提到一些关于其他人的事情,而其他那些人既不是该服务的用户,也没有同意任何条款。我们在本书这一部分中讨论的衍生数据集 —— 来自整个用户群的数据,加上行为追踪与外部数据源 —— 就恰好是用户无法获得任何有意义理解的数据类型
由于跟踪用户而拒绝使用服务,这只是少数拥有足够的时间和知识来了解其隐私政策的人员的一种选择,并且有可能错过社会参与或专业人士如果他们参与了服务,可能会出现机会。对于处境不太好的人来说,没有任何意义上的自由选择:监督变得不可避免
而且从用户身上挖掘数据是一个单向过程而不是真正的互惠关系也不是公平的价值交换。用户对能用多少数据换来什么样的服务没有发言权与选择权服务与用户之间的关系是非常不对称与单边的。这些条款是由服务而不是由用户提出的【99】
#### 数据的隐私和使用
对于不同意监视的用户唯一真正管用的备选项就是简单地不使用服务。但是这个选择也不是自由的如果一项服务如此受欢迎以至于“被大多数人认为是基本社会参与的必要条件”【99】那么指望人们选择退出这项服务是不合理的 —— 使用它**事实上de facto**是强制性的。例如在大多数西方社会群体中携带智能手机使用Facebook进行社交以及使用Google查找信息已成为常态。特别是当一项服务具有网络效应时人们选择**不**使用会产生社会成本。
有时候,人们声称“隐私已经死了”,理由是有些用户愿意把各种有关他们生活的事情发布到社交媒体上,有时是通常的,有时是个人的。但是,这种说法是错误的,并且依赖于对隐私一词的错误理解
因为跟踪用户而拒绝使用服务,这只是少数拥有足够的时间和知识来了解其隐私政策的人才有的特权,并能承受得了错过社会参与,或使用服务有可能带来的专业机会。对于那些处境不太好的人而言,并没有真正意义上的选择:监控是必然的
拥有隐私并不意味着保密一切;它意味着要有自由选择要向谁揭示哪些事情要公开什么以及要保密什么。隐私权是一项决定权它可以让每个人决定他们希望在每个场合保密和透明度之间的区域【99】。这是一个人的自由和自主的重要方面。
#### 隐私与数据使用
当通过监控基础设施从人身上提取数据时,隐私权不一定被侵蚀,而是转移到数据收集器。获取数据的公司本质上是说“相信我们用你的数据做正确的事情”,这意味着决定要透露什么和保密的权利是从个人转移到公司的
有时候,人们声称“隐私已死”,理由是有些用户愿意把各种有关他们生活的事情发布到社交媒体上,有时是平凡的,有时高度私密的。但这种说法是错误的,并且是基于对**隐私privacy**一词的误解
这些公司反过来选择保留这个监视秘密的大部分结果,因为揭示它会被认为是令人毛骨悚然的,并且会损害他们的商业模式(这比其他公司更依赖于对人的了解)。关于用户的亲密信息只是间接显示的,例如以广告针对特定人群(如那些患有特定疾病的人群)的工具的形式
拥有隐私并不意味着保密一切东西它意味着拥有选择向谁展示哪些东西的自由要公开什么以及要保密什么。隐私权是一项决定权在保密到透明的光谱上它使得每个人都能决定自己希望在不同场合中处于这一光谱上的哪个位置【99】。这是一个人自由与自主的重要方面
即使特定用户无法从特定广告定位的人群中个人身份识别,他们已经失去了一些关于披露一些隐私信息的机构,例如他们是否患有某种疾病。决定根据个人喜好向谁透露什么的不是用户,而是公司以最大化利润为目标行使隐私权
当通过监控基础设施从人身上提取数据时,隐私权不一定受到损害,而是转移到了数据收集者手中。获取数据的公司实际上是说“相信我们会用你的数据做正确的事情”,这意味着,决定要透露什么和保密什么的权利从个体手中转移到了公司手中
许多公司都有一个不被视为令人毛骨悚然的目标 —— 避免了他们的数据收集的实际侵入性问题而是专注于管理用户感知。即使这些看法经常被糟糕的管理例如事实可能是事实上的正确但如果它触发痛苦的回忆用户可能不希望被提醒它【100】。对于任何类型的数据我们都应该期望在某种程度上出现错误不可取或不适当的可能性我们需要建立处理这些失败的机制。无论是“不可取的”还是“不适当的”当然都是由人的判断决定的;除非我们明确地规划它们尊重人类的需求,否则算法会忽略这些概念。作为这些系统的工程师,我们必须谦虚,接受和规划这些失败
这些公司反过来选择保密这些监视的结果,因为揭示这些会令人毛骨悚然,并会损害它们的商业模式(比其他公司更了解人群)。关于用户的私密信息只会间接显示,例如针对特定人群定向投放广告的工具(如那些患有特定疾病的人群)
允许在线服务的用户控制其他用户可以看到的数据的哪些方面的隐私设置是将一些控制交还给用户的起点。但是,无论设置如何,服务本身仍然可以不受限制地访问数据,并且可以以隐私策略允许的任何方式自由使用它。即使服务承诺不会将数据出售给第三方,它通常会授予自己不受限制的权利,以在内部处理和分析数据,而且往往比用户明显看到的要多得多
即使特定用户无法从特定广告定向的人群中以个体的形式区分出来,但他们已经失去了披露一些私密信息的能动性,例如他们是否患有某种疾病。决定向谁透露什么并不是由个体按照自己的喜好决定的,是由**公司**,以利润最大化为目标来行使隐私权的
这种从个人到公司的大规模隐私权转移历史上是史无前例的【99】。监控一直存在但它过去是昂贵和手动的不可扩展和自动化。信托关系一直存在例如患者与其医生之间或被告与其律师之间 —— 但在这些情况下,数据的使用严格受到道德,法律和监管限制的约束。互联网服务使得在没有有意义的同意的情况下收集大量敏感信息变得容易得多,并且在没有用户理解他们的私人数据正在发生的情况下大规模使用它
许多公司都有一个目标,不要让人**感觉到**毛骨悚然 —— 先不说他们的数据收集实际上是多么唐突的问题让我们先来关注用户感知的管理。这些感受经常被管理的很糟糕例如事实上可能正确的一些东西但如果会触发痛苦的回忆用户可能并不希望被提醒【100】。对于任何类型的数据我们都应当考虑它出错、不可取、不合时宜的可能性并且需要建立处理这些失效的机制。无论是“不可取的”还是“不合时宜”当然都是由人的判断决定的除非我们明确地将它们编程为尊重人类的需求否则算法会无视这些概念。作为这些系统的工程师我们必须保持谦卑接受与规划这些失败
#### 数据作为资产和权力
允许在线服务的用户控制其他用户可以看到哪些方面数据的隐私设置,是将一些控制交还给用户的起点。但是,无论设置如何,服务本身仍然可以不受限制地访问数据,并能以隐私策略允许的任何方式自由使用它。即使服务承诺不会将数据出售给第三方,它通常会授予自己不受限制的权利,以在内部处理与分析数据,而且往往比用户公开可见的部分要深入的多。
由于行为数据是用户与服务交互的副产品,因此有时称为“数据耗尽” —— 表明数据是毫无价值的浪费材料。从这个角度来看,行为和预测分析可以被看作是一种从数据中提取价值的回收形式,否则这些数据会被抛弃
这种从个体到公司的大规模隐私权转移在历史上是史无前例的【99】。监控一直存在但它过去是昂贵的和手动的不是可扩展的和自动化的。信任关系始终存在例如患者与其医生之间或被告与其律师之间 —— 但在这些情况下,数据的使用严格受到道德,法律和监管限制的约束。互联网服务使得在未经有意义的同意下收集大量敏感信息变得容易得多,而且无需用户理解他们的私人数据到底发生了什么
更准确的说是反过来看从经济的角度来看如果有针对性的广告是为服务付费的话那么关于人的行为数据就是服务的核心资产。在这种情况下用户与之交互的应用程序仅仅是一种诱骗用户将更多的个人信息提供给监控基础设施的手段【99】。数据提取机器人讥讽地发现在线服务中常常表现出令人愉快的人类创造力和社交关系。
#### 数据资产与权力
个人数据是宝贵资产的说法得到了数据中介的支持这个数据中介是一个隐蔽的行业它主要是为了市场目的而排序收集分析推断和转售侵入性个人数据【90】。初创公司通过他们的用户数量通过“眼球”即通过他们的监视能力来估价
由于行为数据是用户与服务交互的副产品,因此有时被称为“数据废气” —— 暗示数据是毫无价值的废料。从这个角度来看,行为和预测性分析可以被看作是一种从数据中提取价值的回收形式,否则这些数据就会被浪费
因为数据很有价值,所以很多人都想要它。当然,公司需要它 —— 这就是为什么他们收集它的原因。但政府也想获得它通过秘密交易胁迫法律强制或者只是偷窃【101】。当公司破产时收集到的个人资料就是被出售的资产之一。而且数据难以确保因此违规事件经常令人不安地发生【102】
更准确的看法恰恰相反从经济的角度来看如果定向广告是服务的金主那么关于人的行为数据就是服务的核心资产。在这种情况下用户与之交互的应用仅仅是一种诱骗用户将更多的个人信息提供给监控基础设施的手段【99】。在线服务中经常表现出的令人愉悦的人类创造力与社会关系十分讽刺地被数据提取机器滥用了
这些观察已经导致批评者说数据不仅仅是一种资产而是一种“有毒资产”【101】或者至少是“有害物质”【103】。即使我们认为我们有能力防止滥用数据但是每当我们收集数据时我们都需要平衡这些好处和落入他们手中的风险计算机系统可能会被犯罪分子或敌对的外国情报服务数据可能会被内部人士泄露公司可能会落入不合法的管理层之中而这些管理层不会分享我们的价值观或者这个国家可能会被毫无疑问迫使我们交出数据的政权所接管
个人数据是珍贵资产的说法因为数据中介的存在得到支持这是阴影中的秘密行业购买聚合分析推断以及转售侵权性的个人数据主要用于市场营销【90】。初创公司按照它们的用户数量按“眼球数”—— 即它们的监视能力来估值
正如古老的格言所言“知识就是力量”。此外“在避免审查自己的同时审视他人是最重要的权力形式之一”【105】。这就是为什么极权政府希望监督这让他们有能力控制人口。尽管今天的科技公司并没有公开地寻求政治权力但是他们积累的数据和知识却给他们带来了很多权力其中大部分是在公共监督之外偷偷摸摸的【106】。
因为数据很有价值,所以很多人都想要它。当然,公司也想要它 —— 这就是为什么它们一开始就收集数据的原因。但政府也想获得它通过秘密交易胁迫法律强制或者只是窃取【101】。当公司破产时收集到的个人数据就是被出售的资产之一。而且数据安全很难保护因此经常发生令人难堪的泄漏事件【102】。
这些观察已经导致批评者声称数据不仅仅是一种资产而且是一种“有毒资产”【101】或者至少是“有害物质”【103】。即使我们认为自己有能力阻止数据滥用但每当我们收集数据时我们都需要平衡收益以及这些数据落入恶人手中的风险计算机系统可能会被犯罪分子或敌国特务渗透数据可能会被内鬼泄露公司可能会落入不择手段的价值观迥异的管理层手中或者国家可能被能毫无愧色迫使我们交出数据的政权所接管。
老话说的好“知识就是力量”。更进一步而言“在避免自己被审视的同时审视他人是权力最重要的形式之一”【105】。这就是极权政府想要监控的原因这让它们有能力控制全体居民。尽管今天的科技公司并没有公开地寻求政治权力但是它们积累的数据与知识却给它们带来了很多权力其中大部分是在公共监督之外偷偷进行的【106】。
#### 记住工业革命
数据是信息时代的决定性特征。互联网数据存储处理和软件驱动的自动化正在对全球经济和人类社会产生重大影响。随着我们的日常生活和社会组织在过去的十年中发生了变化并且在未来的十年中可能会继续发生根本性的变化所以我们就会想到与工业革命的比较【87,96】。
数据是信息时代的决定性特征。互联网,数据存储,处理和软件驱动的自动化正在对全球经济和人类社会产生重大影响。我们的日常生活与社会组织在过去十年中发生了变化,而且在未来的十年中可能会继续发生根本性的变化,所以我们会想到与工业革命对比【87,96】。
工业革命是通过重大的技术农业进步来实现的,它带来了持续的经济增长,长期的生活水平显着提高。然而,它也带来了一些重大问题:空气污染(由于烟雾和化学过程)以及水(工业和人类的废物)造成的污染是可怕的。工厂老板生活在辉煌中,而城市工人经常住在非常贫困的住房里,并且在恶劣的条件下长时间工作。童工是常见的,包括在矿场工作的危险和低薪
工业革命是通过重大的技术农业进步来实现的,它带来了持续的经济增长,长期的生活水平显着提高。然而,它也带来了一些重大问题:空气污染(由于烟雾和化学过程)和水污染(工业垃圾和人类垃圾)是可怖的。工厂老板生活在辉煌中,而城市工人经常住在非常糟糕的住房中,并且在恶劣的条件下长时间工作。童工很常见,甚至包括矿井中危险而低薪的工作
花了很长时间才制定了保护措施,例如环境保护条例,工作场所安全协议,禁止使用童工和食品卫生检查。毫无疑问,生产成本增加了,因为事实再也不能把废物倒入河流,销售污染的食物或者剥削工人。但是,整个社会都从中受益匪浅,我们中很少人会想要回到这些规定之前的时间【87】。
制定了保护措施花费了很长的时间,例如环境保护条例,工作场所安全条例,宣布使用童工非法,以及食品卫生检查。毫无疑问,生产成本增加了,因为工厂再也不能把废物倒入河流,销售污染的食物或者剥削工人。但是整个社会都从中受益良多,我们中很少会有人想回到这些管制条例之前的时间【87】。
就像工业革命有一个黑暗的一面需要管理一样我们对信息时代的转变也有我们需要面对和解决的重大问题。我相信收集和使用数据是其中的一个问题。用布鲁斯·施奈尔Bruce Schneier【96】的话来说
就像工业革命有着黑暗面需要应对一样我们转向信息时代的过程中也有需要应对与解决的重大问题。我相信收集与使用数据是其中的一个问题。用布鲁斯·施奈尔的话来说【96】
> 数据是信息时代的污染问题,保护隐私是环境挑战。几乎所有的电脑都能生成信息。它停留在周围,溃烂。我们如何处理它 —— 我们如何控制它以及如何处理它 —— 对我们信息经济的健康至关重要。正如我们今天回顾工业时代的早期十年,并想知道我们的祖先在匆忙建立一个工业世界的过程中如何忽略污染,我们的孙辈在信息时代的前几十年将回顾我们,就我们如何应对数据收集和滥用的挑战来评断我们。
> 数据是信息时代的污染问题,保护隐私是环境挑战。几乎所有的电脑都能生产信息。它堆积在周围,开始溃烂。我们如何处理它 —— 我们如何控制它,以及如何摆脱它 —— 对我们信息经济的健康至关重要。正如我们今天回顾工业时代的早期年底,并想知道我们的祖先在忙于建立一个工业世界的过程中是怎么能忽略污染,我们的孙辈在回望信息时代的早期年代时,将会就我们如何应对数据收集和滥用的挑战来评断我们。
>
> 我们应该设法让他们感到骄傲。
#### 立法和自律
数据保护法可能有助于维护个人的权利。例如1995年的“欧洲数据保护指”规定,个人数据必须“为特定的,明确的和合法的目的收集,而不是以与这些目的不相符的方式进一步处理”,并且数据必须“充分,与收集目的相关并不过分“【107】。
数据保护法可能有助于维护个人的权利。例如1995年的“欧洲数据保护指”规定,个人数据必须“为特定的,明确的和合法的目的收集,而不是以与这些目的不相符的方式进一步处理”,并且数据必须“就收集的目的而言适当,相关,不过分。“【107】。
但是这个立法在今天的互联网环境下是否有效还是有疑问的【108】。这些规则直接违背了大数据的理念,即最大限度地收集数据,将其与其他数据集结合起来进行试验和探索,以便产生新的见解。探索意味着将数据用于未预期的目的,这与用户同意的“特定和明确”目的相反(如果我们可以有意义地谈论同意的话【109】。目前正在制定更新的规定【89】。
但是这个立法在今天的互联网环境下是否有效还是有疑问的【108】。这些规则直接否定了大数据的哲学,即最大限度地收集数据,将其与其他数据集结合起来进行试验和探索,以便产生新的洞察。探索意味着将数据用于未曾预期的目的,这与用户同意的“特定和明确”目的相反(如果我们可以有意义地表示同意的话【109】。更新的规章正在制定中【89】。
收集大量有关人员数据的公司反对监管,认为这是创新的负担和阻碍。在某种程度上,这种反对是有道理的。例如,分享医疗数据时,隐私存在明显风险,但也有潜在机会:如果数据分析能够帮助我们实现更好的诊断或找到更好的治疗方法,可以预防多少人死亡【110】过度监管可能会阻止这种突破。这种潜在机会与风险之间难以平衡【105】。
收集了大量有关人的数据的公司反对监管,认为这是创新的负担与阻碍。在某种程度上,这种反对是有道理的。例如,分享医疗数据时,存在明显的隐私风险,但也有潜在机会:如果数据分析能够帮助我们实现更好的诊断或找到更好的治疗方法,能够阻止多少人的死亡【110】过度监管可能会阻止这种突破。在这种潜在机会与风险之间找出平衡是很困难的【105】。
从根本上说,我认为我们需要在个人数据方面进行科技行业的文化转变。我们应该停止将用户作为度量标准进行优化并记住他们是值得尊重尊严和代理的人。我们应该自我调节我们的数据收集和处理实践以建立和维持依赖我们软件的人们的信任【111】。我们应该自己去教育最终用户如何使用他们的数据而不是让他们处于黑暗中
从根本上说,我认为我们需要科技行业在个人数据方面的文化转变。我们应该停止将用户视作待优化的指标数据并记住他们是值得尊重有尊严和能动性的人。我们应当在数据收集和实际处理中自我约束以建立和维持依赖我们软件的人们的信任【111】。我们应当将教育终端用户视为己任告诉他们我们是如何使用他们的数据的而不是将他们蒙在鼓里
我们应该允许每个人保持他们的隐私 —— 即他们控制自己的数据 —— 而不是通过监视来窃取他们的控制权。我们控制数据的个人权利就像是一个国家公园的自然环境:如果我们没有明确的保护和关心,它将被破坏。这将是公地的悲剧,我们都会因此而变得更糟。无所不在的监视不是不可避免的,我们仍然能够阻止它。
我们应该允许每个人保留自己的隐私 —— 即,对自己数据的控制 —— 而不是通过监视来窃取这种控制权。我们控制自己数据的个体权利就像是国家公园的自然环境:如果我们不去明确地保护它,关心它,它就会被破坏。这将是公地的悲剧,我们都会因此而变得更糟。无所不在的监视并非不可避免的 —— 我们现在仍然能阻止它。
我们究竟能做到这一点是一个悬而未决的问题。首先,我们不应该永久保留数据,但一旦不再需要就立即清除数据【111,112】。清除数据与不变性的想法背道而驰请参阅第463页的“不变性的限制”但可以解决该问题。我所看到的一种很有前途的方法是通过加密协议来实施访问控制而不仅仅是通过策略【113,114】。总的来说文化和态度的变化是必要的。
我们究竟能做到哪一步,是一个开放的问题。首先,我们不应该永久保留数据,而是一旦不再需要就立即清除数据【111,112】。清除数据与不变性的想法背道而驰参阅“[不变性的局限性](ch11.md#不变性的局限性)”),但这是可以解决该问题。我所看到的一种很有前景的方法是通过加密协议来实施访问控制而不仅仅是通过策略【113,114】。总的来说文化与态度的改变是必要的。
## 本章小结
在本章中,我们讨论了设计数据系统的新方法,并包括了我对未来的个人意见和猜测。我们从观察开始,即没有一种工具可以有效地服务于所有可能的用例,因此应用程序必须编写几个不同的软件才能实现其目标。我们讨论了如何使用批处理和事件流来解决这个数据集成问题,以便让数据变化在不同系统之间流动。
在本章中,我们讨论了设计数据系统的新方式,而且也包括了我的个人观点,以及对未来的猜测。我们从这样一种观察开始:没有单种工具能高效服务所有可能的用例,因此应用必须组合使用几种不同的软件才能实现其目标。我们讨论了如何使用批处理与事件流来解决这一**数据集成data integration**问题,以便让数据变更在不同系统之间流动。
在这种方法中,某些系统被指定为记录系统,而其他数据则通过转换从中得出。通过这种方式,我们可以维护索引,物化视图,机器学习模型,统计摘要等等。通过使这些衍生和转换异步和松散耦合,防止一个区域中的问题扩散到系统的不相关部分,从而增加整个系统的稳健性和容错性。
在这种方法中,某些系统被指定为记录系统,而其他数据则通过转换衍生自记录系统。通过这种方式,我们可以维护索引,物化视图,机器学习模型,统计摘要等等。通过使这些衍生和转换操作异步且松散耦合,能够防止一个区域中的问题扩散到系统中不相关部分,从而增加整个系统的稳健性与容错性。
将数据流表示为从一个数据集到另一个数据集的转换也有助于演化应用程序:如果想变更其中一个处理步骤,例如变更索引或缓存的结构,则可以在整个输入数据集上重新运行新的转换代码以便重新输出。同样,如果出现问题,您可以修复代码并重新处理数据以便恢复。
将数据流表示为从一个数据集到另一个数据集的转换也有助于演化应用程序:如果想变更其中一个处理步骤,例如变更索引或缓存的结构,则可以在整个输入数据集上重新运行新的转换代码,以便重新衍生输出。同样,出现问题时,你也可以修复代码并重新处理数据以便恢复。
这些过程与内部数据库已经完成的过程非常相似,因此我们重新构思了数据流应用程序的概念,将数据库的组件分开,并通过组合这些松散耦合的组件来构建应用程序。
这些过程与数据库内部已经完成的过程非常类似,因此我们将数据流应用的概念重新改写为,**分拆unbundling**数据库组件,并通过组合这些松散耦合的组件来构建应用程序。
衍生状态可以通过观察底层数据的变化来更新。此外,下游消费者可以进一步观察衍生状态本身。我们甚至可以将此数据流一直传送到显示数据的众泰用户设备,从而构建可动态更新以反映数据变更并继续离线工作的用户界面。
接下来,我们讨论了如何确保所有这些处理在出现故障时保持正确。我们看到强大的完整性保证可以通过异步事件处理可视化地实现,通过使用端到端操作标识符使操作幂等并异步检查约束。客户可以等到检查通过,或者不用等待就行,但是可能会有违反约束的道歉风险。这种方法比使用分布式事务的传统方法更具可扩展性和可靠性,并且适合于实践中有多少业务流程工作。
衍生状态可以通过观察底层数据的变更来更新。此外,衍生状态本身可以进一步被下游消费者观察。我们甚至可以将这种数据流一路传送至显示数据的终端用户设备,从而构建可动态更新以反映数据变更,并在离线时能继续工作的用户界面。
通过构建围绕数据流的应用程序并同步检查约束条件,我们可以避免大多数协调,并创建维护完整性但仍能很好地运行的系统,即使在地理散布的情况下和出现故障时也是如此。然后,我们谈了一些关于使用审计来验证数据的完整性并检测腐败的问题
接下来,我们讨论了如何确保所有这些处理在出现故障时保持正确。我们看到可扩展的强完整性保证可以通过异步事件处理来实现,通过使用端到端操作标识符使操作幂等,以及通过异步检查约束。客户端可以等到检查通过,或者不等待继续前进,但是可能会冒有违反约束需要道歉的风险。这种方法比使用分布式事务的传统方法更具可扩展性与可靠性,并且在实践中适用于很多业务流程
最后,我们退后一步,审查了构建数据密集型应用程序的一些道德问题。我们看到,虽然数据可以用来做好事,但它也可能造成重大损害:作出严重影响人们生活并难以申诉的决定的正当理由,导致歧视和剥削,规范监督以及揭露私密信息。我们也冒着数据泄露的风险,并且我们可能会发现善意使用数据会产生意想不到的后果
通过围绕数据流构建应用,并异步检查约束,我们可以避免绝大多数的协调工作,创建保证完整性且性能仍然表现良好的系统,即使在地理散布的情况下与出现故障时亦然。然后,我们对使用审计来验证数据完整性,以及损坏检测进行了一些讨论
由于软件和数据对世界产生如此巨大的影响,我们的工程师们必须记住,我们有责任为我们想要生活的这个世界努力工作:一个对待人性与尊重的世界。我希望我们能够一起为实现这一目标而努力。
最后,我们退后一步,审视了构建数据密集型应用的一些道德问题。我们看到,虽然数据可以用来做好事,但它也可能造成很大伤害:作出严重影响人们生活的决定却难以申诉,导致歧视与剥削,监视常态化,曝光私密信息。我们也冒着数据被泄露的风险,并且可能会发现,即使是善意地使用数据也可能会导致意想不到的后果。
由于软件和数据对世界产生了如此巨大的影响,我们工程师们必须牢记,我们有责任为我们想要的那种世界而努力:一个尊重人们,尊重人性的世界。我希望我们能够一起为实现这一目标而努力。