存档

‘Architecture’ 分类的存档

值得关注的开源软件推荐

2017年11月15日 没有评论

作者:灰狐 Allen 来源:GitChat

我们每天的学习、工作、生活大多数都基于开源软件完成,或许你也是这样的,只是没注意到。

  • 一、关于这篇文章
  • 二、开源软件很多很多
  • 三、第一类:框架和编程驱动的应用层
  • 四、第二类:数据驱动的大数据、人工智能层
  • 五、第三类:云计算、基础设施层
  • 六、第四类:操作系统、编译器、虚拟机、编程语言
  • 七、45个开源软件特性、要点
  • 八、资源汇总

一、关于这篇文章

文章标题《值得关注的开源软件推荐》这个话题不是很好理,先按着自己的思路试着写些东西。这篇文章有点流水账,大家多包涵。

我们知道值得关注的开源软件实在是太多太多,选择这个题目也让自己有点为难。不过,试着去理一下对自己来说还是有蛮多收获的,不管正确与否,或许也对大家有所启发和帮助。

本Chat所选的45个开源软件,它们可能不是最流行的,但具有一定的代表性,它们是众多开源软件中的很小一部分。

从这么多开源软件中进行筛选有不少困难,需要我们有个好的思路和方法去有步骤、系统化了解和学习,本Chat就是和大家一起交流和探讨这个话题。希望这篇文章起到抛砖引玉的作用,这里我们只交流、讨论一些思路和方法,并不深入到某个具体项目,这个会留在以后的课程与大家一同学习交流。

开源软件在操作系统、云计算、大数据、编译器、数据库、移动、汽车工业等领域取得了巨大成功,已成主流,这篇文章就先围绕着这些内容展开。

二、开源软件很多很多

开源软件的重要性就不用多说了,它是IT工业的基础。它和我们每个人、每天的学习、工作、生活都息息相关,我们使用的互联网、物联网、车联网都广泛的依赖于它们。

先来看看,如何去寻找开源软件,我这里介绍一个可能是最有效的方式:通过GitHub上AwesomeGitHub Topics的方式去获得,它们已对一些流行热门的开源软件做了梳理和筛选,方便你的选择。这里的开源软件数量足够你在整个职业生涯中去了解、学习和实践的,而且还在持续增加中。

这么多开源软件,我们怎么选?

这需要一个有层次、系统化的了解、学习的方法和步骤。

我们先来看看有层次、系统化的了解、学习、搭建软件堆栈和平台的重要性和必要性。

在我们的工作中,或许都有过这样的经历:前一个团队或核心成员使用的是这个框架或那个平台,新来的团队或核心成员因为自身情况将会使用不同的框架和系统重构或替代前面的产品和架构体系。我自己就经历过用Java平台全面替代.NET平台的经历,其代价也是巨大的,这样的替换相信大家也都有碰到过。若经常性的因为人员变动或其它因素而导致产品和体系架构总是变来变去,带来的研发成本就会不断上升,且因为没有在稳定框架和基础架构上的持续实践和积累,团队的技术沉淀没有,框架和平台价值的体现也就少的可怜,也不能吸引到优秀的人才聚在一起。

所以层次化、系统化的了解、学习、构建公司的技术体系和平台架构就显得尤为重要,这是公司技术委员会或团队Leader的必修课。

举个简单例子:大家可从Anaconda开始Python数据分析之旅,它减少了安装、维护各种Python软件包和版本的工作量和带来的各种不方便,毕竟它整合好了几百个Python软件包。

好了,找到或选型后,接下来就是学习和实践、不断积累的过程。

  • 根据公司发展方向和战略目标,拟定多年计划,不要仅仅只解决眼前问题,要考虑框架、架构、平台的长期有效性和持续发展,不要深度锁定商业服务供应商,尽可能使用开源软件,并可以方便的替换其中部件和重构;
  • 从StackOverflow、知乎等专业网站通过搜索的方式迅速了解一下你所关注的开源软件的基本特性和大家讨论的热点;
  • 以Ecosystem的方式去思考和组织你所关注的开源软件的知识体系,这里给个参考:Node.js ecosystem
  • 在学习和实践的过程中,大家可借助印象笔记或Wiki等方式对不断学习和实践的开源软件做持续的整理。我个人就是通过Wiki的方式不停收集、整理各种开源软件和相关资源的,这个过程持续了11年,有几千个条目,近4000万的浏览量。

本篇文章参考框架涉及的45个开源软件都有Wiki条目进行跟进和维护,不少条目都持续维护了很多年,接下来我们就对它们一一做个大致了解:

  • 应用类:框架、企业应用、编辑器
  • 数据类:数据科学、大数据、机器学习、汽车机器人
  • 服务类:云计算、数据库、消息队列、服务器
  • 系统类:操作系统、编译器、虚拟机、编程语言

类似这样的工作,你自己或团队都可以经常去理一下。

此外,要紧跟所关注开源软件的Conferencce技术大会,这是了解开源软件最新进展和成功应用的一个非常好的方法。我在这里也整理了一些开源软件历年大会幻灯片资料,很有参考价值,欢迎大家收藏。

三、第一类:框架和编程驱动的应用层

通过框架加快应用的开发和上线。

1. 框架:Django、Meteor、Qt

框架类开源软件太多太多,每种语言、不同应用场景都有很多不同的框架可供选择,这里选择了Python、JavaScript、C++三种主流编程语言框架加以简要介绍。

这三个框架都是比较大而全的,覆盖某个领域的大部分应用场景和技术堆栈,它们带来的好处是快速的开发效率和生产力,但同时与会失去灵活性和自由度。喜欢用很多小软件、小工具解决不同问题的用户通常不会选择这些大块头或者说全堆栈的软件平台。

Django是个全堆栈的Python框架,有严格的开发计划和路线图。

django

注意这里的long-term support (LTS),很多开源软件都采用这样的版本支持服务,如:Ubuntu 它在你的版本选择中非常重要。

Django LTS

Django的内容和讨论的话题都很多,入门这块可从Django book 2.0 的中文开始,它把Django重点、要点和内容组织的都很好。

这里我列举一些思路和路线供大家参考:

  • 先动手构建一个最简单的Django项目;
  • 使用Django内置的Admin,再试试一些更好用的Admin解决方案;
  • 看看成功Django项目长什么样的:Mezzanine
  • 浏览Django开发的开源网站,有没有自己喜欢的,有的话先部署一个;
  • 使用Django REST Framework构建REST API;
  • 基于REST API构建一个单页面Web应用(Single Page Application, SPA),这一架构可迅速创建响应式用户交互界面;
  • 如何在Django使用其它MVC框架;
  • 将WebSockets、Tornado和Django结合起来,提供实时Web特性;
  • Django实时服务器除了Tornado外,你也可以使用Erlang等语言编写,这个内容大家自己去扩展下。

Qt是一个跨平台的C++/JavaScript应用框架,是一个桌面、嵌入、移动应用的开发平台,支持Windows、Linux、macOS、Android、iOS、Windows 10操作系统。

2011年,诺基亚出售Qt业务给Digia,该公司将接手Qt商业授权和服务业务,诺基亚也将移交大约3500家商业客户。

Maya、Google Earth、Skype、Telegram、魔兽争霸官方对战平台、网易炉石盒子等都基于Qt构建。Qt在汽车、自动化、医疗、数字电视机顶盒、物联网、移动应用领域都有广泛应用。其中,Qt Automotive Suite值得更多关注。

Qt Automotive Suite

Qt通过整合JavaScript语言,加速用户界面的构建。

QML是种声明式语言(declarative language),它是一个用户界面规范和编程语言,混合JSON语法和JavaScript表达式。

Qt应用目前主流的开发思路是:用QML(Qt Quick)构建交互界面,用C++实现业务逻辑,这也是推荐Qt的一个重要因素。

Meteor是基于JavaScript的框架,用于Web客户端、服务器端以及移动应用。Meteor应用会对数据的变化作出即时响应,因此你将获得即时响应体验,同时,一致的构建过程、前后端统一的包系统以及单个命令的应用部署过程,将在从设计到发布的每一环节上为你节省时间。

这是Meteor简单的堆栈和框架:

Meteor StackMeteor Framework

Meteor带来的优势有:

  • 全栈通用、统一的单一语言 JavaScript;
  • 内置响应式支持;
  • 代码高度重用,提供一大堆基础Packages
  • 提供强大构建工具,帮助快速构建JavaScript Apps;
  • 拥有近13000个软件包的生态系统。

Meteor的更多了解可从七大原则入手:

  • Data on the Wire. Meteor 不发送 HTML,服务器端只负责发送数据,由客户端渲染;
  • One Language. 前后端都是 JavaScript 语言;
  • Database Everywhere. 前后端都可以直接创建存取修改数据库里的数据,且数据安全;
  • Latency Compensation. Meteor 在前端提前获取数据并模拟数据模型,使其看起来像是从服务器端立即返回了数据;
  • Full Stack Reactivity. 实时响应是 Meteor 的缺省配置。在所有层次,从数据库到模板,都会在需要时自动更新;
  • Embrace the Ecosystem. Meteor 完全开源并集成了很多现有的开源工具和框架。如 Angular,React。Meteor 有自己的 AtmosphereJS 包下载管理平台,也可使用 NPM;
  • Simplicity Equals Productivity. Meteor 简单易上手,API 简洁优雅。

除Meteor和Node.js外,Angular和React可能是大家关注最多的两个JavaScript框架和平台,它们背后是Google和Facebook的推动。鉴于React因为版权专利问题,我们先放一下。Angular2官方推荐语言是TypeScript。有关ECMAScript、JavaScript、TypeScript、CoffeeScript、ClojureScript标准、语言和框架的话题有很多很多,大家可去扩展这部分的知识体系。

同时,这里也贴一张Angular2学习路线图供大家参考。

此图来自:知乎

我想,这幅图对Angular2有用,对Meteor等其它框架的学习也有一定的参考价值。

说到选择哪个框架,涉及的就是各种比较,本篇所列举的45个开源软件和项目也是各种比较的一些总结,所以生活在开源软件的世界里,比较就是家常便饭。若是作为开源软件的开发者和维护者,要做的工作也就更多了,除编程基本功扎实,维护和Bug修复外,不停的学习其它优秀的同类项目也是一门必修课,从别人身上学习优点,但又不能完全照搬,需考虑自身项目的个性和特性,又要兼顾通用功能和特性的整合,在保证项目代码和版本稳定的同时,又要不断调整和平衡新版本的需求和特新,又要很好兼容老版本,其过程想想都觉得难。所以一个成功的开源项目,除了独特的个性外,还要平衡和兼容好共性,在这里给开源软件开发者致个敬。

这节话题结束前,放一个Angular2 相比 Vue 有什么优势?项目对比的分析,是Vue作者写得,挺有趣,大家可看看。

2. 应用:odoo、iDempiere、Moqui

在这里我们说说三个企业应用,三个开源ERP/CRM开源软件。

说到企业应用,首选Java语言。除了Java语言,这几年因为数据科学和机器学习的热潮,极大的推动了Python语言在企业的普及。此外,XML作为企业应用的数据表示、存储、转换的标准已被广泛采用,而且各行各业的XML规范已经成熟和稳定。

所以简单讲,企业应用 = Java + Python + XML/JSON + RESTful API (当然, .NET也是一个不错的选择)

odoo是近几年发展非常迅猛的开源ERP/CRM套件,使用Python、XML、PostgreSQL构建。之前,写了篇odoo:开源 ERP/CRM 入门与实践的文章,大家可看看,普及一下odoo的基础知识。

iDempiere = OSGi + Adempiere

OSGi是Java模块化的非官方标准,很强大,也复杂。它是很多开源软件的基础架构,如:Eclispe;也在工业界有很多应用,BMW汽车的应用控制系统就采用OSGI作为其底层架构, 这套系统主要用来控制汽车上的音箱、灯光等设备,总共由1000多个Bundle构成,但BMW汽车的应用控制系统启动时间却只需要3.5秒。

OSGi在汽车工业领域的应用可作为大家了解OSGi的重点。

Adempiere是一个很主流的开源ERP/CRM系统,也是一个完整的企业应用套件和堆栈。

Adempiere

Adempiere衍生自Compiere,因为Compiere越来越封闭和私有,就有了现在的Adempiere,很多开源软件也都是这样产生的。同时,Compiere也失去了可能成为No.1开源ERP/CRM的机会。

说到这,也说说Solaris和OpenSolaris,在Sun被Oracle后,因为Oracle的封闭,现在的它们也基本走向死亡,Oracle同时也玩死了NetBeans和OpenOffice,基于OpenOffice的LibreOffice代表着未来。

类似的故事还有很多很多,当前是个开放开源的时代,封闭自嗨的基本都会走向衰败。就连很封闭的苹果和腾讯也在不断调整自己的开源、开放战略,并陆续推出一些开源软件。

好了,现在说说Moqui。

Moqui的作者是Apache OFBiz的设计者和开发者,在企业数据模型和流程上有非常深的造诣。Moqui基于OFBiz十多年来的项目实施经验以及作者的设计、开发和方法论,包括纯粹的关系 数据层以及面向服务的逻辑层。Moqui框架的核心代码只有OFBiz核心框架代码的15%左右,提供了更多有意义的功能和更多的高级工具,使用Groovy和Java语言。

Mogui是一个企业ERP/CRM的生态系统,一个类似地球:地核、地幔、地壳的的构造结构。

Moqui

  • Moqui Framework: 核心 Core,就像 Linux 的 Kernel 内核一样
  • Moqui Mantle,地幔业务构件: 一组通用的、可作为你各种场景业务系统的基础业务构件集合,包含:
  • 通用的数据模型,Universal Data Model (UDM)
  • 通用业务服务库,Universal Service Library (USL)
  • 通用业务过程/流程库,Universal Business Process Library (UBPL)
  • Moqui Crust,地壳(插件):主题皮肤、 综合的工具集、不同行业的应用支持、大公司规模支持、业务领域支持等

初步体验了Moqui,感觉使用它构建应用很快,大部分工作就是编写XML、脚本和构件,描述数据、业务和流程。介绍它是因为以往大多数企业应用都是硬编码实现、数据、业务、编码紧耦合,而Moqui采用XML定义模型、服务和流程,提高了整个系统的可描述、可维护性。Moqui支持如下的几种类型的构件:

  • 实体 entities : 贯穿于整个业务系统中的关系数据模型(直接使用模型,无需复杂的对象关系映射)
  • 界面 screens 和 表单 forms : 用于基于 web 的应用界面或者其他用户接口(通用方式是基本构件描述存放在 XML 文件中,或者用户指定扩展存放于数据库中)
  • 界面转换 screen transitions : 用于配置页面到页面的流转以及设置页面跳转时,业务处理过程的必要输入
  • 服务 services : 远程调用的方式运行内部逻辑交互或者曝露外部的服务
  • ECA(事件-条件-行为 event-condition-action)规则 : 用于类似实体、服务操作以及 email 信息接收等系统级事件触发

Mouqi应用中通用部分以及构件之间的关系:

Mouqi add-ons

Mouqi先了解到这,让大家对它有一个总体认识,后续我们再深入下去。

3. 编辑器:Emacs、Vim、Atom

编辑器是所有计算机系统上最普遍的应用之一。

除了开发者日常使用的一些大块头IDE外:Eclipse、Visual Studio、Xcode等,这类小巧、轻盈的编辑器也备受程序员喜爱,它们是Emacs、Vim、Atom。

这篇文章由Emacs和Markdown Model编写,在macOS(基于XNU/Dawnin)上完成,呵呵。

  • Emacs:神一般的编辑器,一个不折不扣的“操作系统”,一个终极工具!
  • Vim:改进的vi,命令行编辑器的标准。
  • Atom:用户友好的编辑器,照顾IDE用户的鼠标使用习惯。

Emacs和Vim都鼓励减少鼠标使用,强迫使用键盘,熟练使用键盘编程是进阶和高效编程的必由之路,想想看在整个工作中,没碰过鼠标,全部用键盘完成是不是感觉有点酷。

Vim有自己的语言Vimscript,Emacs有Emacs lisp。

Emacs的设计目标就是,你装了个Unix或者Linux系统,不需要装任何其它软件,只要装一个Emacs就够了,它能帮助你完成所有的任务。也就是说,除了编程,你还可以用它写论文、做幻灯片、浏览网页、收发邮件、聊天、听歌、看照片、玩游戏……目前,好像除了直接在Emacs里看电影还不行,其它的都实现了。(ps:这一段是直接引用,因为太赞同)

通过使用Emacs,接触Emacs社区,让自己感受和学习更多的黑客文化,通过Emacs接触Emacs Lisp,这也是乐趣的开始!

Vim比较适合前端开发,其它语言,如:Java,还是使用IDE比较好。

Vim主要特点有:

  • Vim有多种模式:普通模式,插入模式,可视模式,命令行模式;
  • 使用Vim的主要精力在定位操作上;
  • 常见定位命令如:上下左右的操作,k 上行、j 下行、h 左、l 右;
  • 定位后就是操作,Vim操作命令是原子性的,可随意组合操作命令,如:daw(delete a word)、caw(change a word)。

除了Vim外,Vi家族还有几个其它的克隆项目:

  • nvi:新vi,vi官方的伯克利版本
  • elvis
  • vile:类Emacs的Vi

Atom 是一款基于 Electron framework、node.js 构建的跨平台编辑器。它是 Emacs 和 Vim 之外推荐的开源编辑器,非常适合前端、Web开发,也支持广泛的编程语言。

基于Atom和Electron framework构建的还有微软的Visual Studio Code和Facebook的Nuclide

Visual Studio Code是我很喜欢的,它非常强大和易用,拥有庞大的插件库和资源。

四、第二类:数据驱动的大数据、人工智能层

大数据热了好多年,这几年是人工智能,它们的核心是数据和算法,这是一个数据驱动的时代,我们每天都在产生大量的数据,对数据来说,有个庞大的知识体系:数据科学。

数据科学

4. 数据科学:Jupyter、Pandas、Anaconda

Juypter是一款面向数据科学和人工智能的前端交互工具,基于IPython构建,是IPython的未来发展方向。

Anaconda Python 是自由使用的面向大规模数据处理、预测分析和科学计算的企业级Python发行版。Anaconda 以 Red Hat 和 Debian Linux 发行版的方式来分发 Python企业版。

Anaconda

Anaconda是个大的数据科学软件堆栈和平台,当然,你也可以选择自己去搭建。

使用Python进入数据科学领域的同学就可从Anaconda入手,主要是方便。它提供GUI和命令行两种方式,使用包管理工具Conda,如安装pandas、Jupyter:

conda install pandas

>>> import pandas as pd
>>> pd.show_versions()

conda install jupyter

Pandas是非常重要的数据科学Python软件包,基于NumPy构建,简化了以NumPy为中心的应用开发。NumPy的基础是数组和矢量计算,NumPy的ndarray是一种多维数组对象,利用数组进行数据处理。

Pandas的优势也体现在它的数据结构上,两个主要的数据结构:

  • Series
  • DataFrame

写个简单的例子感受下

Jupyter

总之,进入数据科学领域的同学,这三个开源软件都绕不过。

5. 大数据:HDP、CDH、HPCC

HDP和CDH都是Apache Hadoop分发版,HPCC是一个C++开发的大数据处理和分析平台。

  • HDP:100%开源,零锁定;
  • Hortonworks解决方案包含HDF和HDP;
  • Hortonworks DataFlow(HDF)收集、组织、整理和传送来自设备、传感器、点击流、日志等的实时数据;
  • Hortonworks Data Platform(HDP)用于创建安全的企业数据湖,为企业提供实现快速、实时商业洞察力所需的分析信息。

HDP是一个开源大数据的生态系统

Apache Metron实时大数据安全

CDH除没有HDP那样开放开源外,其它都很类似。Cloudera有很强的商业化解决方案和服务能力,取得了很好的商业价值,应该是目前最赚钱的Hadoop商业化公司,同时也开源了众多优秀的开源软件,如:Impala

HDPCDH文档都组织、整理的不错,可作为了解、学习大数据、Apache Hadoop的一个重要资源。

ODPi: the open ecosystem of big data

在这里提一下ODPi项目,这是Linux基金会下的一个项目,成员包括HDP的开发商Hortonworks。

鉴于Linux基金会的成功运作和治理能力,ODPi可关注,以生态系统的思考方式去了解整个大数据市场,国内已有大数据公司来此占位。

ODPiODPi大数据生态系统

在Apache Hadoop & Spark统治的大数据市场,HPCC显得弥足珍贵,值得更多关注。

HPCC 包括以下核心组件:

  • Thor (the Data Refinery Cluster)
  • Roxie (Rapid Online XML Inquiry Engine, the Query Cluster)
  • ECL (Enterprise Control Language)
  • ECL IDE
  • ESP (Enterprise Services Platform)

HPCC

HPCC在安全、身份和风险管理有众多成功案例。

6. 机器学习(深度学习):Caffe、MXNet、TensorFlow

选择TensorFlow、Caffe(caffe2)、MXNet,一方面是软件很好,另外一个重要因素是背后有Google、Facebook、Amazon等巨头在推动,并在自己的产品服务线广泛部署,其可靠性、可伸缩性得到最大规模和严格的验证。

TensorFlow在GitChat人工智能板块已有了最多的课程和介绍,它的重要性就不多说。

TensorFlow官方文档中文版可作为你学习TensorFlow的重要参考,英文好的直接跳过。

编程语言入门有Hello World,机器学习入门有MNIST。MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片。它也包含每一张图片对应的标签,告诉我们这个是数字几。你可从MNIST开始你的机器学习,熟悉神经网络和MNIST数据集,去构建一个深度卷积神经网络。

ps:一个小道消息:MS因为内斗严重很难发力,所以用CNTK,Torch,TensorFlow,MXNet,Caffe的都有,自家的CNTK很难形成规模。

相对于TensorFlow这种重量型的后端,MXNet的轻量化路线使得可以我们在花费Google brain 1/10的人力的情况下做到类似TensorFlow技术深度的系统。(MXNet开发者李沐)

那到底选择哪个深度学习框架呢?或许贾杨清同学的这段话会给你个答案,他是Caffe(Caffe2)的作者,同时也是TensorFlow的开发者和贡献者。

另外我还要强调的是我最近每个演讲都会提到的“unframework”,或者说“unix philosophy”的观点:framework不重要,重要的是技术,这也是我一直主张把核心软件比如说Gloo,NNPACK,FAISS这些单独放出来,不放在框架里面的原因 – 每个框架都可以拿这些软件来优化,这才是做community的道理。老实说,Caffe我也参加了,TensorFlow我也参加了,C2我也参加了,最重要的是大家开心,能学到技术,能用得方便。

说到机器学习、深度学习,我想表达自己的一个观点。当前,我们都在关心机器学习,其实,我们也应该更多关心一下如何让我们自己更高效的学习,成为一个学习机器。当然,这里的学习机器是有更多思考和创造力的那种。未来是机器学习和学习机器相互学习、共同促进的世界,谁更聪明,谁就有更多支配和主导权,大家相辅相成,共同进化。

7. 汽车机器人:Automotive Grade Linux(AGL)、ROS、Apollo Auto

汽车、机器人是大数据和人工智能重要的应用领域,机器人装上人工智能的大脑将更多从事人的工作,未来很多工作将被人工智能机器人取代,而给机器人喂食的就是大数据。

首先,基于AGL的丰田佳美(Toyota Camry)将于2018亮相北美市场。

AGL是Linux基金会项目,基于Tizen项目构建,最初由韩国三星主导,现在为Linux基金会项目。

美日韩三国高科技公司主要在推动这个项目,其System Architecture Team(SAT)包含5-10个核心成员:Denso, Fujitsu TEN, Microchip, Panasonic, Intel, Renesas/IoT.bzh, Toyota

这张图很重要,它把AGL、Tizen和GENIVI三者以AGL UCB的方式融合在了一起。

AGL UCB

在汽车工业使用LTS: Long Term Stable Kernel,这点很重要,这两份文档可参考。

不知道到百度阿波罗计划的Linux核心是如何评估选择的?

百度Apollo托管在GitHub的开源软件

  • Apollo: An open autonomous driving platform
  • Apollo Platform: based on Robot Operating System(ROS)
  • Apollo Kernel: based on Linux Kernel 4.4.32

因为Apache v2, ROS, Linux Kernel,Apollo Auto也在这介绍一下。

百度Apollo开放平台被称为“汽车界安卓”,我想这个应该在成功后再被称。

Apollo1.5开放五大能力:

  • 障碍物感知
  • 决策规划
  • 云端仿真
  • 高精地图服务
  • 端到端的深度学习(End-to-End)

金龙客车通过Apollo 1.0的成为首例商用车落地实例。

百度Apollo开放平台通过阿波罗基金专注于汽车行业及自动驾驶领域的人民币股权投资,简单讲就是砸钱和收购,快速形成一定规模。

目前,Apollo基金第一期20亿已到位并在快速运行,目前已完成数个项目的投资。也将在未来3年完成100亿&100+个项目的投资。总之就是有钱,自动驾驶创业的同学们这也是很快变现的方式。

我们都知道自动驾驶这件事是个非常复杂、非常庞大的工程,可有人一个人就干成了,天才黑客George Hotz自己开发了一套汽车自动驾驶系统,而且成立了公司Comma.ai专注这件事,点开网页看实测效果还是很不错的。

百度Apollo和comma.i项目对比 (截止2017.11.8上午10点)

  • comma.ai openpilot: 6516 Star
  • comma.research: 3488 Star
  • 百度Apollo: 6362 Star

我也知道这个对比没什么意思,只是出于对天才的仰视。

Robot Operating System(ROS)是一个应用广泛的机器人系统和开源软件框架,ROS的基本原理是无需改动就能够在不同的机器上复用代码。ROS提供了一个标准的操作系统环境,包括硬件抽象、底层设备控制、通用功能实现、进程间消息转发和软件包管理等。

ROS方程式

ROS 提供了 C++ 和 Python 两种主要的编程接口,也可集成 Arduino,ROS 2.0 采用了DDS(数据分发服务)。

ROS & Arduino

随着ROS 2.0的开发,ROS能够兼容除Linux之外更多的操作系统,如Windows、Android;能够支持从工业计算机到Adruino开发板等各类型的硬件;能够采集RGB-D摄像头、普通摄像头和各种类型的传感器数据;能够驱动类人形机器人、四轴飞行器等各类型的机器人。新版本的ROS在采用SOA架构的基础上,集成了MVC框架,更加有利于机器人人机交互界面的开发和机器人控制。

由于ROS极大的开放性和包容性,它能够兼容其他机器人开发工具、仿真工具和操作系统,使之融为一体。这使得ROS不断发展壮大,并成为应用和影响力最广泛的机器人软件平台。

学习ROS,掌握一把通往未来的钥匙。(ps: 这部分内容取自《ROS机器人程序设计》(原书第2版))

关于市场份额:作为一家拥有近37年历史的嵌入式操作系统开发商,QNX在车载信息娱乐系统或车联网系统占据超过50%的市场份额,QNX是仪表盘背后的隐形王者,大家可关注下。

五、第三类:云计算、基础设施层

如何支撑上层的数据分析和应用,需要有个强大的软件基础设施,我们以云计算、数据库、消息队列和Web Server来搭建这个基础设施。

云计算对所有的计算资源、存储资源、网络资源进行系统管理,用数据库进行各种各种类型数据的存储和处理。以消息队列作为数据传输和应用交互的机制,Web Server将各种服务以RESTful的方式部署。

8. 云计算:OpenStack、OpenShift、SaltStack

云计算数据中心是一项具有战略意义的基础设施,其重要性和普及知识就不多讲了。

这里主要简单介绍IaaS、PaaS两种主要的云计算服务模型,其代表有:OpenStack、OpenShift

IaaS,PaaS

OpenStack是开源云平台的事实标准。

OpenStack使用Python语言编写,使用了Django、Tornado和Twisted等框架,使用AMQP消息协议和Redis分布式K/V存储。

OpenStack可以说是Linux之外最大规模的开源项目,有大量公司和开发者参与构建这个开源云平台生态系统,也有很多OpenStack发行版可供用户选择,国内用户可关注这几家OpenStack供应商:

Google加入OpenStack基金会推动着Docker/Kubernetes与混合云加速融合;EasyStack联合创始人&CTO刘国辉谈到:

”Google加入OpenStack体现了对于数据中心控制平面的争夺已经结束,以容器为代表的应用形态与以虚拟化为代表的系统形态将会完美融合于OpenStack之上,并与软件定义网络和软件定义存储一起统治下一代数据中心。“

OpenStack+K8S

OpenStack、Ansible、SaltStack等开源软件也极大奠定了Python在数据中心的地位。

OpenShift是RedHat推出的基于Docker和Kubernetes构建的PaaS开源容器云平台。

OpenShift能给用户带来什么?可参考红帽OpenShift的业务价值

OpenShift业务价值亮点有:

  • 5年平均投资回报率:531%
  • 每年每100名开发人员实现的年度平均效益:129 万美元
  • 应用程序开发生命周期加快:66%
  • 开发每个应用程序所需的IT员工时间减少:35%
  • 每个组织增加的收入:742万美元
  • 每个应用程序的IT基础架构和开发平台成本降低:38%

OpenShift

总结起来:加快产品、服务研发和交付时间,减少研发成本,增加企业收入,降低基础架构投资,获得更高的投资回报率。

为什么在这里把这个提出来说说,也是出于自己的一些经历。

在我们运作开源软件商业化服务时,开源软件需要有个好的商业包装。开源软件对我们开发人员很熟悉,但很多最终用户和客户却不了解,他们可能根本就不知道什么开源软件,你给他们大谈开源软件,他们会一脸茫然。若你把开源软件以类似这样的方式讲给他们听,效果可能会更好,也更容易成交业务,所以基于开源软件做商业化服务的同学很有必要建立起这样的思维模式,将好用、强大的开源软件做更好的商业包装。这方面的成功公司有很多,你可更多跟进Red Hat、Ubuntu、MongoDB、Hortonworks等开源软件公司,它们把开源和商业融合都做得相当出色。

此白皮书也可作为开源软件商业价值分析的参考,大家基于开源软件做商业化公司和运营时可参照这样的思路思考下去。

Docker容器和Kubernetes容器编排已成为企业交付软件和服务的行业标准,OpenShift可直接作为企业DevOps & CI/CD的基础设施, 成为部署微服务的多租户平台。

Red Hat也在积极推动区块链技术在OpenShift的应用部署,与BlockApps的合作,为其提供区块链平台的PaaS基础设施。

BlockApps on OpenShift

BlockApps

OpenShift生态系统已初具规模,这可增强大家选型的信心。不过,因为OpenShift的平台规模也比较大,定制化和扩展的难度也会加大。这也是我们常碰到的问题,选个大块头的开源平台堆栈,还是选择自由装配和维护各种小软件的融合方式。这是两种不同的思路,团队Leader和技术团队要仔细评估和做出平衡。

SaltStack是 Python开发的开源配置管理和自动化工具,SaltStack提供了一种全新的基础设施管理方式,部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度快,服务器之间秒级通讯。

关于SaltStack,大家可从以下几点去加深了解:

  • 理解Salt的动机,以及它们将影响运维人员的使用方式;
  • 更好地使用云服务,包括EC2、Azure及OpenStack等,支持更大规模云计算平台部署;
  • 学习新的RAET协议,并了解它如何改变自动化工作方式;
  • 使用ZeroMQ消息队列,管理端Master,客户端Minion,如何进行数据交换和消息传递的。

Ansible基于SSH协议传输数据,Saltstack使用消息队列zeroMQ传输数据,MQ通讯和SSH通讯,速度相差大约几十倍。

我们推崇使用消息队列MQ来进行数据传输和通讯。

与Ansible的比较,SaltStack 与 Ansible 选择?供大家选型参考。

9. 数据库(数据仓库):Riak、OrientDB、Apache Kylin

Erlang驱动的数据库,在分布式、消息、并发、可伸缩、容错方面有天然优势,Riak数据库天生就拥有这些能力。

Riak数据库以Riak Core、Riak KV、Riak TS、Riak S2的方式提供了构建分布式系统、键值存储、时序存储、对象存储的核心软件基础设施。

Riak公司在数据库对比选型上做了充分的工作,把几乎主流的开源数据库都对比了一下

  • Riak Compared to Cassandra
  • Riak Compared to Couchbase
  • Riak Compared to CouchDB
  • Riak Compared to HBase
  • Riak Compared to MongoDB
  • Riak Compared to Neo4j
  • Riak Compared to DynamoDB

其实,每个选型的开源软件都可能涉及这样的广泛比较,所以工作量是比较大的,大家可参考。

多范式、多流派(面向对象、模版、函数式、过程式)的混合式语言设计方法帮助C++成为解决复杂、多样性问题的编程语言首选。

多模型数据库OrientDB(对象模型、键值模型、文档模型、图模型)让其集多种数据库类型于一身,使其能应对多种应用场景,减少多种数据库部署运维带来的开销和成本,OrientDB这样的多模型设计是否也能像C++这样被大多数开发者所认可与接受?

strong text对象模型

Relational Model Object Model OrientDB Object Model
Table Class Class or Cluster
Row Object Document or Vertex
Column Object property Document field or Vertex/Edge property
Relationship Pointer Link

键/值模型

Relational Model Key/Value Model OrientDB Key/Value Model
Table Bucket Class or Cluster
Row Key/Value pair Document
Column not available Document field or Vertex/Edge property
Relationship not available Link

文档模型

Relational Model Document Model OrientDB Document Model
Table Collection Class or Cluster
Row Document Document
Column Key/value pair Document field
Relationship not available Link

图模型

Relational Model Graph Model OrientDB Graph Mode
Table Vertex and Edge Class Class that extends “V” (for Vertex) and “E” (for Edges)
Row Vertex Vertex
Column Vertex and Edge property Vertex and Edge property
Relationship Edge Edge

再说说Kylin是什么?

  • 可扩展、超快OLAP引擎:Kylin是为减少在Hadoop上百亿规模数据查询延迟而设计;
  • Hadoop ANSI SQL 接口:Kylin为Hadoop提供标准SQL,支持大部分查询功能;
  • 交互式查询能力:通过Kylin,用户可以与Hadoop数据进行亚秒级交互,在同样的数据集上提供比Hive更好的性能;
  • 多维立方体(MOLAP Cube):用户能够在Kylin里为百亿以上数据集定义数据模型并构建立方体;
  • 与BI工具无缝整合: Kylin提供与BI工具,如Tableau,的整合能力,即将提供对其他工具的整合。

Apache Kylin已成功部署于百度、美团、网易、京东、唯品会、中国移动、中国电信、国泰君安、华泰证券、联想、OPPO、魅族、去哪儿等公司,支撑着用户行为分析、流量日志分析、电商分析,广告效果分析,实时分析等基于数据仓库及多维分析(OLAP)技术的数据服务。是传统数据仓库、商业智能技术在互联网企业大规模应用的真实案例。

Apache Kylin有健康发展的生态系统

Kylin

在这篇文章中,我们多次提及生态系统。这个大家多重视,逐步建立起层次化、系统化、平台化的思考方式。

10. 消息队列(即时通讯):RabbitMQ、Kafka、ejabberd

在介绍RabbitMQ之前,说说 Advanced Message Queuing Protocol (AMQP,高级消息队列协议)

AMQP的愿景是:从任何发布者到任何感兴趣的消费者之间的信息,通过一条软件总线实时动态的连接起来。

RabbitMQ就是要实现AMQP愿景的开源软件,AMQP的就如同电话交换机的架构,选择Erlang也在意料和情理之中。Erlang是一门消息并发编程语言,它为通信而生。

除AMQP标准外,Extensible Messaging and Presence Protocol(XMPP)是开放即时通信标准,其代表产品是Erlang开发的Ejabberd,可以说Erlang支撑起了AMQP和XMPP两大标准的开源软件实现。Erlang是消息队列、即时通信的首选语言。

XMPP是一个有着18年历史的开放消息标准,被广泛应用于物联网、即时通信、社交网络和实时Web领域,支持众多的开发语言和操作系统。

Apache Kafka 是一个高吞吐量的分布式消息系统,使用 Scala 开发,它已是企业应用和大数据生态系统中的核心组件,它是消息、数据、实时流的中心Hub。

Kafka

由阿里巴巴捐赠给Apache基金会的RocketMQ也在健康的发展着,和Kafka很类似,大家下来可做些对比评估和选型。

此外,ZeroMQ大家也可多关注,上面介绍的SaltStack就使用ZeroMQ作为传输机制,且大量的开源软件中也包含了ZeroMQ的使用。

OpenMessaging项目由阿里巴巴发起,与雅虎、滴滴出行、Streamlio公司共同参与创立的分布式消息中间件、流处理领域的应用开发标准,目前已正式入驻Linux基金会。

消息队列是重要的基础设施,因为它解耦、连接各种数据、应用和服务,充分体现互联网连接一切的本质。

11. 服务器:Nginx、Jetty、Cowboy

Nginx是轻量级、高性能 Web Server的首选,几乎部署在所有主流的互联网公司。

除了Nginx官方版本外,大家也可关注Nginx两个分发版本:

Apache Tomcat和Eclipse Jetty是Java Web Server的默认选择。

  • Jetty更轻量、更容易定制;Jetty架构基于Handler,扩展更容易,而Tomcat是基于容器设计,不易扩展;
  • Google GAE选择Jetty,定制足够小的Java Web Server支撑GAE业务;
  • Apache Tomcat和Eclipse Jetty背后是两大开源基金会的合作与竞争。

Cowboy是比较另类的,它使用Erlang开始,是一个小型、快速和模块化的HTTP服务器,常用Cowboy构建嵌入式Web Server。

个人很倾向使用Erlang开发通用的Web Server,因为Erang分布式、消息、并发、可伸缩、容错方面的天然优势,有兴趣的同学可尝试基于Cowboy构建。

六、第四类:操作系统、编译器、虚拟机、编程语言

好了,现在我们来到最底下的一层:系统层,它包含操作系统、编译器等核心软件,是每台计算设备不可或缺的组成部分。

12. 操作系统:GNU/Linux、XNU/Darwin、FreeBSD

首先简单回顾下UNIX/BSD操作系统的历史

UNIX-like

我们只关心图中上面BSD和GNU家族的东东,下面的都是商业的UNIX操作系统,我们就不考虑了。

BSD家族最具代表性的就是FreeBSD,它是GNU/Linux之外最可靠的选择。它强大、稳定、坚如磐石,也是苹果操作系统的重要组成部分。

苹果最近开源了XNU项目

XNU是XNU is Not Unix的首字母缩写,类似GNU是GNU’s Not Unix的缩写,我们暂且也以GNU/Linux的方式来称呼XNU/Darwin。

OpenDarwin以前有发布过,但因为一些原因关停,这里有网站存档

XNU是个混合内核,包含两部分:BSD和Mach。macOS在剥离了Cocoa、Carbon等东西后,剩下的叫Darwin,它包含POSIX兼容、UNIX线程、进程实现。

XNU内核是macOS和iOS的核心,由三个主要部分组成的一个分层体系结构:

  • 内核的内环是Mach层,源自卡纳基-梅隆大学开发的Mach内核;
  • BSD层;
  • I/O Kit。

macOS架构

Darwin和macOS

macOS核心架构

GNU/Linux的分发版很多,除了两大主流Debian/Ubuntu和RedHat/CentOS外,大家可更多关注下:NixOS Linux

它包含几个很有特色的项目:

  • Nix:包管理器,也可用于macOS平台。
  • NixOps:云部署工具
  • Hydra:基于Nix的持续构建系统
  • Disnix:分布式服务部署工具集

GNU/Linux驱动的Android现在已成为移动操作系统的主导,基于它的生态系统会逐渐放大。此外,以OpenWrt、ROS为代表的嵌入式、机器人操作系统也在GNU/Linux的生态系统的驱动下逐渐壮大。

OpenWrt是适合于嵌入式设备的一个Linux发行版,国内主流的路由器:如极路由、小米路由器、魅族路由器、魔豆路由器等都基于OpenWrt构建。相比Android系统,OpenWrt被认为是更加适合智能设备和机器人的软件平台,被誉为下一个时代的Android,值得更多关注。

在操作系统环节,我想聊一下虚拟化和容器技术。

虚拟机技术在操作系统、程序设计语言和计算机体系结构中占据了重要位置,它是系统与进程的通用平台。

在“进程级“ 虚拟机技术可用于实现动态二进制翻译、平台无关的网络计算等能力;而在“系统级”,可以在同一个硬件平台或一个服务器集群上同时提供多个操作系统环境。

可以说,Solaris Zone是操作系统虚拟化做得最出色的解决方案,只可惜。

最近,阿里巴巴也宣布开源它的容器技术:Pouch

13. 编译器:GCC、LLVM、Babel

GCC(GNU Compiler Collection,GNU编译器集合)是最重要的开源软件,因为其它几乎所有开源软件都在某种层次上依赖于它,核心编程语言是C语言。

LLVM(Low Level Virtual Machine)底层虚拟机,是一个开源(BSD)编译器的基础设施,使用C++编写。

LLVM

GCC和LLVM是编译器领域的两大巨头。

GCC和LLVM的体系很庞大,其内容、细节和知识点太多太多,留在后续的课程我们学习交流,后面有推荐的编译器书籍大家可参考。

Babel 是一个通用的多用途 JavaScript 编译器。更确切地讲是源码到源码的编译器,通常也叫做“转换编译器(transpiler)”,简称转译。

Babel 能把用最新标准编写的 JavaScript 代码向下编译成当前可用的老版本,Babel 能够让你提前使用 JavaScript新标准。

Babel 插件体系让其拥有庞大的生态系统。

Babel 三个主要处理步骤是:解析(parse),转换(transform),生成(generate):

  • 解析代码并输出抽象语法树(AST)含词法分析和语法分析;
  • 转换接收AST并对其进行遍历,对节点进行添加、更新及移除等操作, 这是最复杂的过程,同时也是插件将要介入工作的部分;
  • 代码生成把AST转换成字符串形式的代码。

Babel是下一代JavaScript编译器,说到Babel,也会提及TypeScript。TypeScript是JavaScript超集,是JavaScript的强类型版本,通过TypeScript Compiler API,开发者可以自己实现编译器。

可简单理解为:TypeScript = Type + ES6

Babel Handbook可作为你学习Babel的入门参考。

14. 虚拟机(运行时):JVM、.NET Core、BEAM(Erlang)

在前面操作系统章节我们提到过虚拟机,这一节我们也将了解一些有关编程语言虚拟机的技术。

虚拟机技术极大的丰富和繁荣了编程语言的生态系统,我们知道JVM平台有很多编程语言,可能你不知道有超过200多种编程语言运行在JVM平台上,它们共同繁荣了JVM生态系统。

JVM

JVM的实现也有很多,大家可关注以下几个:

  • HotSpot Oracle官方实现
  • IBM最近开源了OpenJ9Java虚拟机项目
  • Kaffe
  • Jikes RVM Java开发的虚拟机,可作为研究项目

常见语言也有很多JVM实现版本:

  • Erlang: Erjang A JVM-based Erlang VM (多关注)
  • JavaScript: Rhino
  • Python: Jython
  • Ruby: JRuby
  • PHP: Caucho Quercus

此外,.NET平台也托管了很多编程语言:C#, F# …

JVM和.NET两大平台外,值得大家更多关注的是Erlang及其虚拟机生态系统。

这三类平台,个人倾向选择将其用于不同的领域,如:

  • JVM平台更多用于企业应用,如:电商ERP、大数据平台等;
  • .NET平台更多用于泛娱乐、游戏等,当前最火的王者荣耀就基于.NET的Unity平台构建,且微软几十年个人电脑操作系统的使用和广泛普及;
  • Erlang平台主攻消息、通信、电信基础设施、软件基础架构。

15. 编程语言:Erlang、Clojure、F#

基于这三大虚拟机的三门主流语言:Erlang、Clojure、F#,它们也是函数式编程语言的代表。

JSR-335(Lambda Expressions for the Java TM Programming Language)中定义的Lambda对Java语言语法产生深远影响,函数式编程将成为主流。

在上面,Erlang被多次提到在Riak数据库、RabbitMQ消息中间件、Cowboy web server中的应用,Erlang的天然优势就是:分布式、消息、并发、可伸缩、容错。你可以在笔记本上轻松创建300万个进程。300万Erlang进程

Clojure 是一种运行在 Java平台上的 Lisp 方言,Lisp 是一门可编程的编程语言 (Lisp is a programmable programming language) Clojure将这门函数式编程语言带到了JVM生态系统。

Java、Scala、Clojure是JVM平台上三种主流的编程语言,它们的定位是怎么样:

Clojure is about Data, Scala is about Types, Java is about Objects.

先了解几个Clojue的成功应用:

  • Apache Storm 是 Twitter 开源的大数据实时处理引擎,采用 Clojure、Java 语言开发,大概一半 Clojure、一半 Java;在进程之间,Storm采用ZeroMQ进行通信;
  • 花旗信用实时风险估值系统Java/Clojure后端(1500节点分布计算)花旗投资信用部实时风险计算系统,逻辑使用Clojure;
  • 沃尔玛: “Our Clojure system just handled its first Walmart black Friday and came out without a scratch.” – Walmart Labs

此外,ClojureScript: Clojure to JavaScript compiler 大家多关注。

F# = Objects + Functional

Mixed OO/Functional Programming Has Won

F#(F sharp)是微软开发的基于.NET语言运行时的程序设计语言,采用 Apache v2 许可协议。这是一门函数式编程语言(FP,Functional programming),函数式编程语言最重要的基础是Lambda Calculus。

F#和OCaml是ML函数式编程语言的两种主要方言,有时F#和OCaml的程序是可以交互编译的。

F#支持高阶函数、柯里化、惰性求值、Continuations、模式匹配、闭包、列表处理和元编程。在早期,F#作为一门适合于金融和计算密集型的语言而闻名。现在,F#既用于算法密集型应用程序,也用于主流业务应用程序。在算法密集型应用程序中,正确性至关重要,而主流业务应用程序则在很大程度上受益于F#支持领域建模并让非法状态不可达。

F#在数据科学领域具有很大优势,基于Atom编辑器的数据编程

F# Data Science

好了,我们走马观花般的过了一遍这45个开源软件,主要让大家大致了解和认识一下它们。

最后,我们把这45个开源软件以核心特新和要点的方式再整理一下。

七、45个开源软件特性、要点

思考、总结、提炼单个开源软件的核心特性和要点,看看它能为团队带来什么帮助,能力有哪些?

1. Django

  • Django和Flask是使用最广泛的Python Web框架;
  • Django提供Web一站式解决方案:会话、缓存、ORM、验证、表单处理、后台管理等,但系统耦合度高,替换内置功能比较麻烦,学习曲线较陡;
  • Django和Flask都基于WSGI,这是同步阻塞接口,不能使用异非阻塞的编程模式,你可考虑使用Klein微框架,用法很像Flask,可以异步方式编写Web应用。

2. Meteor

  • 一个面向Web和App的应用框架和构建平台
  • Meteor 7大原则;
  • 超过12000个包的生态系统。

3. Qt

  • Qt核心:元对象系统、属性系统、对象模型、对象树、信号槽(Signal/Slot),Qt的Signal/Slot很好解决了对象间通讯的问题,被其它语言框架借鉴;
  • Qt使用QML定义用户界面,使用C++编写业务逻辑;
  • Qt在在汽车行业有广泛应用,是GENIVI汽车联盟的推荐技术。

4. odoo

  • odoo不仅仅是开源ERP/CRM;
  • 还是一套伴随企业成长可扩展的商业运营支撑系统;
  • 一个巨大的应用生态系统,有近12500个Apps可供选用。

5. iDempiere

  • iDempiere = OSGi + Adempiere;
  • OSGi是Java模块化一个领先的解决方案;
  • Adempiere是一个世界级的集成的ERP/CRM开源软件。

6. Moqui

  • Apache OFBiz作者的又一力作;
  • 快速的企业应用原型系统开发;
  • 一个框架、一个生态系统。

7. Emacs

  • Emacs是迄今为止功能最为强大的文本编辑器,Emacs是一种信仰,它是神一般的编辑器;
  • Emacs是模块化的,遵循do one thing, and do it well原则,需要什么就安装什么,你可以像搭积木的方式搭建自己的环境和系统;
  • Everything Emacs,你可以在Emacs完成你几乎所有的工作:编程、写作、浏览网页、收发邮件、日程、娱乐游戏、它是个人操作系统。

8. Vim

  • Vim模式:普通模式,插入模式,可视模式,命令行模式;
  • Vim的使用主要放在定位操作上;
  • 常见定位命令如:上下左右的操作,k 上行、j 下行、h 左、l 右;定位后就是操作,vim操作命令是原子性的,可随意组合操作命令,如:daw(delete a word)、caw(change a word)。

9. Atom

  • Atom由GitHub开发维护;
  • Atom使用的Electron framework已有一个庞大的生态系统;
  • 微软Visual Studio Code和Facebook Nuclide都基于Atom/Electron框架构建。

10. Jupyter

  • Jupyter is the new front end for data science and AI.
  • Jupyter的操作过程可存档、传播、分享;
  • Jupyter的核心是IPython,Jupyter是未来。

11. Pandas

  • 在数据科学领域,Pandas是一个非常重要的Python软件包;
  • Pandas基于NumPy构建,让以NumPy为中心的应用变得更简单;
  • Pandas使用的两个主要数据结构:Series和DataFrame。

12. Anaconda

  • Anaconda是一个企业级Python发行版,面向大规模数据处理、预测分析和科学计算;
  • Anaconda 以 Red Hat 和 Debian Linux 发行版的方式来分发 Python;
  • Anaconda 包含近500个最流行的科学、数学、工程和数据分析的Python软件包。

13. HDP

  • Hortonworks公司拥有最多的Apache大数据相关项目开发者和贡献者,开发、发行100%开源的大数据平台;
  • Hortonworks Data Platform (HDP)和Hortonworks DataFlow (HDF)是两大产品;
  • 通过整合、交付统一的 Apache Spark 和 Hadoop,将 Spark 驱动的敏捷分析工作流程与 Hadoop 的海量数据集和经济性相结合,企业可以使用行业最佳安全性、管制和运营能力来部署 Apache Spark。

14. CDH

  • CDH可能是商业化运作最好的大数据平台和解决方案;
  • 开发维护了多个流行大数据开源软件,是HDP最主要的竞争对手;
  • Impala一个C++开发的Hadoop实查询引擎,值得关注。

15. HPCC

16. Caffe(Caffe2)

  • Caffe2 是贾扬清对Caffe的重新思考和重构,目前在Facebook,是Caffe2的核心开发者;
  • Caffe2对移动端的良好支持,15行代码Support WatchOS build 确实够简单;
  • Caffe2可在手机与树莓派上训练和部署模型。

17. MXNet

  • 比TensorFlow更加轻量、高效小巧,更适合自定义需求高的公司和研究者;
  • MXNet允许用户自由把图计算和过程计算混合起来使用;
  • MXNet正在Apache基金会孵化,相信很快孵化成顶级项目。

18. TensorFlow

  • TensorFlow体格庞大,代码量大,抽象层多,深度自定义会很困难;
  • TensorFlow也是一个商业行为,背后是Google,它带来的可行度和高质量;
  • 一个事实:Google内部版的TensorFlow和Google Cloud深度绑定优化与开源的TensorFlow在速度和性能上会又巨大差异,美国的大厂都或多或少的在拒绝它。

19. Automotive Grade Linux(AGL)

  • Automotive Grade Linux(AGL) 是 Linux基金会发布的开源Linux车载系统,AGL 基于 Tizen 构建;
  • AGL + Tizen IVI + GENIVI = AGL UCB(Unified Code Base));
  • Qt Automotive Suite based on GENIVI or Automotive Grade Linux。

20. ROS

  • ROS是一个广泛使用的机器人操作系统和软件框架,ROS的基本原理是无需改动就能在不同的机器人上复用代码;
  • 随着ROS 2.0的开发,ROS能够兼容除Linux之外的更多操作,如Windows、Android;能够支持从工业计算机到Adruino开发板等各种硬件;
  • 百度无人车阿波罗平台基于ROS构建。

21. Apollo Auto

  • 百度 Apollo(阿波罗)是一个开放的、完整的的平台,将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统,快速搭建一套属于自己的自动驾驶系统,采用Apache v2许可协议;
  • 阿波罗平台基于ROS构建;
  • 阿波罗核心核心基于Linux Kernel 4.4.32构建。

22. OpenStack

23. OpenShift

  • OpenShift is Enterprise-Ready Kubernetes;
  • Docker容器和Kubernetes容器编排已成为企业交付软件和服务的行业标准,OpenShift可直接作为企业DevOps & CI/CD的基础设施, 成为部署微服务的多租户平台;
  • OpenShift是BlockApps区块链平台的PaaS基础设施。

24. SaltStack

  • SaltStack提供了一种全新的基础设施管理方式,部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度快,服务器之间秒级通讯;
  • SaltStack使用ZeroMQ,带来极高的通讯效率;
  • SaltStack或许是构建、管理、运营云计算基础设施的最佳方式,它支持广泛的云平台。

25. Riak

  • Riak 是使用 Erlang 开发的开源(Apache V2) 分布式 NoSQL 键/值(K/V) 存储数据库系统;
  • 有 Riak Core、Riak KV 键值存储、Riak TS 时序存储、Riak S2 对象存储的完整产品线;
  • Riak拥有Erlang语言带来的分布式、消息、并发、可伸缩、容错方面的天然优势。

26. OrientDB

  • OrientDB 是一个Java开发的开源(Apache v2)NoSQL文档和图形数据库,也通过 OrientDB SQL 支持 SQL;
  • OrientDB是一个拥有对象模型 键/值模型 文档模型 图模型的多模型数据库;
  • 多范式编程语言(面向对象、模板、函数式编程、过程式 )C++带来极高的生产力,多模型数据库OrientDB能否也带来类似效果。

27. Apache Kylin

  • Apache Kylin:商业数据仓库、商业OLAP引擎的替代品;
  • Kylin是为减少在Hadoop上百亿规模数据查询延迟而设计,Kylin为Hadoop提供标准SQL支持大部分查询功能,通过Kylin,用户可以与Hadoop数据进行亚秒级交互;
  • 一个开源数据仓库、商业智能生态系统。

28. RabbitMQ

  • RabbitMQ是Advanced Message Queuing Protocol (AMQP)标准的Erlang语言实现;
  • RabbitMQ是部署最广泛的开源消息代理;
  • 可以把ZeroMQ看作RabbitMQ这类消息队列系统的补充,而不是替代品。

29. Apache Kafka

  • Apache Kafka:下一代分布式消息系统;
  • Apache Kafka 是一个高吞吐量的分布式消息系统,使用 Scala 开发,最初被用于 LinkedIn;
  • Apache Kafka 解耦企业应用的复杂性,是信息和流数据的交换枢纽。

30. Ejabberd

31. Nginx

  • epoll(freebsd的kqueue)网络IO模型是Nginx高性能的根本理由;
  • 与Apache相比较,最核心的区别在于Apache是同步多进程模型,一个连接对应一个进程;Nginx是异步的,多个连接可以对应一个进程;
  • 对于后端动态服务来说,比如Java和PHP。这类服务器(如JBoss和PHP-FPM)的IO处理能力往往不高。Nginx有个好处是它会把Request在读取完整之前buffer住,这样交给后端的就是一个完整的HTTP请求,从而提高后端的效率,而不是断断续续的传递(互联网上连接速度一般比较慢)。同样,Nginx也可以把response给buffer住,同样也是减轻后端的压力。(此条信息来自:知乎叔度

32. Jetty

  • Eclipse Jetty,一个更轻量、更易扩展和定制的Java Web Server;Jetty架构基于Handler,扩展更容易,而Tomcat是基于容器设计,不易扩展;
  • Google GAE选择Jetty,定制足够小的Java Web Server支撑GAE业务;
  • Apache Tomcat和Eclipse Jetty背后是两大开源基金会的合作与竞争。

33. Cowboy

  • Cowboy适合构建嵌入式应用,它没有配置文件,也不会生成日志,一切都由Erlang控制。
  • Cowboy支持的协议有:HTTP/2、HTTP/1.1、WebSocket、HTTP/1.0、SPDY/3.1、SPDY/3;
  • Erlang很适合开发Web server,可基于Cowboy做扩展和定制;

34. GNU/Linux

  • Linux基金会不仅仅有Linux项目,还有众多其它的开源项目,如AGL;
  • 可更多关注类似Robot Operating System(ROS)这样的机器人操作系统和嵌入式系统;
  • 相比Android系统,OpenWrt被认为是更加适合智能设备和机器人的软件平台。

35. XNU/Darwin

  • XNU是XNU is Not Unix的首字母缩写,GNU是GNU’s Not Unix的缩写;
  • XNU/Darwin与FreeBSD都有着BSD的血统,苹果会持续投资和推动FreeBSD项目?
  • 更深入的学习、研究iOS和macOS,就从Hack XNU开始吧。

36. FreeBSD

  • FreeBSD TCP/IP协议栈实现是个经典;
  • Facebook的WhatsApp是一个FreeBSD + Erlang 的公司,大量的路由器、交换机、防火墙、金融系统在使用FreeBSD,SONY PS4游戏机操作系统基于FreeBSD构建;
  • 苹果与FreeBSD的关系应该是最密切的。

37. GCC

  • GCC:最重要的开源软件(从1987的1.0到2017年7.2历经30年,对整个自由、开源软件贡献卓著),后来者LLVM(14岁)很出色,前途无量;
  • GCC的基本语言是C语言,整个编译系统由C编程程序开始,然后逐渐加入其它语言的支持;
  • C++是C语言的直接扩展,它是GCC的第一个附加语言。C++能够完成的所有事情C语言都可以做到,所以编译器的后端保持不变,只需在前端加入一个新的语法语义分析器就可以了。一旦产生中间语言,编译程序的其它部分就和C语言完全一样了,其它语言的处理方式也类似。

38. LLVM

39. Babel

  • Babel 下一代 JavaScript 编译器(转译器);
  • 简单讲,Babel 就是把一个版本的 JavaScript 转变为其他版本的 JavaScript;
  • The Super Tiny Compiler可能是最小的编译器,先感受和普及下JavaScript编译器的知识。

40. JVM

  • JVM是最大规模的编程语言虚拟机生态系统,有超过200多种编程语言运行在JVM上;
  • Android Dalvik VM不是一个Java虚拟机,它没有遵循JVM规范,不能直接运行Java Class文件,它执行的Dex(Dalvik Executable)可通过Class文件转换而来;
  • 由John Rose领导的the Da Vinci Machine Project正致力于让JVM成为动态语言的最佳归宿。

41. .NET Core

  • .NET Core 是一个通用目的、模块化、跨平台的 .NET 开源实现;
  • 核心项目:.NET Core Libraries (CoreFX)、.NET Core Runtime (CoreCLR)、.NET Compiler Platform (Roslyn);
  • .NET Core 会包含 .NET Framework 的类库,但与 .NET Framework 不同的是 .NET Core 采用包 (Packages) 的管理方式,应用程序只需要获取需要的组件即可,与 .NET Framework 大包式安装的作法截然不同,同时各包也有独立的版本线 (Version line),不再硬性要求应用程序跟随主线版本。

42. Erlang VM(BEAM)

  • Elixir是一门运行在Erlang VM上的编程语言;
  • 可在Erlang VM创建自己的语言
  • 可关注下Erjang:A JVM-based Erlang VM。

43. Erlang

  • Erlang的世界观是一切都是进程(一个Erlang进程包括PCB进程控制块和堆栈只有几K),进程通过消息传递相互通讯;
  • Erlang是参与者模型(Actor model)最佳实践;
  • 可在一台笔记本上轻松跑出几百万个Erlang进程。

44. Clojure

  • Clojure 是一种运行在 Java 平台上的 Lisp 方言;
  • Clojure is about Data, Scala is about Types, Java is about Objects;
  • ClojureScript: Clojure to JavaScript compiler。

45. F#

  • F#和OCaml是ML函数式编程语言的两种主要方言;
  • F# = Objects + Functional ,F#混合面向对象和函数式编程,可“对应”JVM平台的Scala语言;
  • F#支持高阶函数、柯里化、惰性求值、Continuations、模式匹配、闭包、列表处理和元编程,F#作为一门适合于金融和计算密集型的语言而闻名。

八、资源汇总

以开源软件介绍的顺序汇集文档、链接、书籍资源

文档和链接

参考书籍

  • 《轻量级Django》Lightweight Django中文版
  • 《Python Web开发实践》
  • 《Meteor实战》
  • 《JavaScript高级程序设计(第3版)》
  • 《数据模型资源手册 (卷3): 数据模型通用模式》
  • 《C++ Primer(中文版)(第5版)》
  • 《学习GNU Emacs(第二版)》
  • 《学习Vi编辑器(第六版)》
  • 《利用Python进行数据分析》
  • 《Hadoop: The Definitive Guide (4th Edition)》
  • 《数据挖掘概念与技术(原书第3版)》
  • 《机器学习》周志华
  • 《深度学习》
  • 《ROS机器人程序设计》
  • 《视觉SLAM十四讲:从理论到实践》
  • 《概率机器人: Probabilistic Robotics中文版》
  • 《OpenStack设计与实现》
  • 《OpenStack最佳实践:测试与CI/CD》
  • 《Docker:容器与容器云(第2版)》
  • 《SRE Google运维解密》
  • 《精通SaltStack》
  • 《七周七数据库》
  • 《PostgreSQL修炼之道:从小工到专家》
  • 《RabbitMQ实战:高效部署分布式消息队列》
  • 《Kafka: The Definitive Guide》 PDF电子书
  • 《编程语言原理(第10版)》
  • 《七周七语言》
  • 《七周七并发模型》
  • 《七周七数据库》
  • 《OS X与iOS内核编程》
  • 《编译原理(第2版)》著名的龙书中文版
  • 《自制编译器》
  • 《虚拟机–系统与进程的通用平台》《Virtual Machines — Versatile Platforms for Systems and Processes》
  • 《深入理解Java虚拟机(第2版)》
  • 《虚拟机的设计与实现 C/C++》
  • 《Erlang程序设计(第2版)》
  • 《Scala程序设计(第2版)》
  • 《响应式架构:消息模式Actor实现与Scala、Akka应用集成》
  • 《Clojure编程:Java世界的Lisp实践》
  • 《Real World OCaml(中文版)》

还有一些图书,就不罗列了。

book

内容有些多,还是篇流水账,感谢大家耐心阅读。


值得关注的开源软件推荐:问答实录

2017年11月15日 没有评论

作者:灰狐 Allen 来源:GitChat

内容提要:

  • 小企业的架构受限于技术人员已掌握了什么,怎么选一个容易兼容扩展的框架?
  • 有哪些能提高开发效率的软件,如何通过开源软件提高开发效率?
  • 如何参与到开源软件的开发中去,开源软件如何评估其在生产环节中的安全性和可靠性?
  • 想问一下学习开源软件的时候,什么时候应该阅读源码?阅读源码的方法是什么?
  • 如何根据自身需要快速辨别一个开源软件是否适合自己?
  • 开源软件有很多,你对每个开源软件都会了解吗?了解到什么程度,而且开源会跨语言、跨平台,请问你如何学习、解决、应对的?
  • 怎么开启开源软件源码学习,在没有文档的情况下,又怎么了解开源软件架构?
  • 本群的主题是开源软件,和我们平常所说的开源项目(如github)是一回事吗?
  • 对于大的开源项目,如何学习和参与?
  • 若自己项目要上传到github上,readme.md要写哪些东西可以吸引其他人看我项目,对我的项目能有足够认知?

问:小企业的架构受限于技术人员已掌握了什么,怎么选一个容易兼容扩展的框架?

答:这个问题可从以下几点来试着去思考:

  1. 开源软件生态系统是一个框架兼容、扩展性的重要特征,Node.js有47.5万、Meteor有近13000个软件包和扩展;
  2. 团队试着开发一些小的扩展和应用来验证使用框架的兼容与扩展性;
  3. 未来可行的话,将公司开发的扩展开源出来提交公共仓库,形成良好工程师文化;
  4. 保持公司架构的兼容和扩展性需要整个研发团队达成共识,而不是某个人的喜好,团队要长期填坑和沉淀,最好更多地参与此开源软件的社区贡献。

问:有哪些能提高开发效率的软件,如何通过开源软件提高开发效率?

答:这个问题可以简单理解为开源生产力工具,通过以下7点来解答。

  1. 框架:一站式框架能极大地提高开发效率,如:Meteor、Angular、Qt、Django;
  2. 编辑器:更高效的编码,如Emacs、Vim;
  3. 消息队列:建立应用的消息总线Hub,消息队列是重要的软件基础设施,因为它解耦、连接各种数据、应用和服务,给企业带来更高的实时响应;
  4. 编程语言:使用函数式编程语言,它能带来更高的生产力;
  5. CI/CD等工具的高效使用;
  6. 敏捷开发、看板、项目管理工具的使用;
  7. Git & GitHub熟练使用等等。

问:如何参与到开源软件的开发中去,开源软件如何评估其在生产环节中的安全性和可靠性?

答:这个问题包含两个问题,首先回答第一个部分:如何参与开源项目。

参与开源软件的开发这个话题有点多、有点大,我这里简单做些整理供参考:

  1. 首先让自己编程水平不断提供,变得更牛,你厉害了,很多开源软件项目都愿意邀请你加入进来;
  2. 模仿大牛,了解他们是如何参与开源软件开发的,他们的博客时常会给出一些意见、建议;
  3. 有机会和开源软件Leader和开发者建立直接交流的机会;
  4. 先从一些小项目、不太知名的开源软件入手,不要一来就要成为Linux核心和Apache开发者(能力强悍的同学就另当别论了);
  5. 评估自己的工作、生活,确保有足够的精力和时间参与到开源软件中去,若你的公司是付工资让你参与的,那就恭喜你了;
  6. 在GitHub上找自己感兴趣且能帮上忙的项目入手;
  7. 开源软件贡献不一定都是参与代码贡献,还有其他很多工作可做,如:找Bug、修复Bug、文档、社区等等。当然,代码贡献成就感是最大的;
  8. 熟悉自由、开源软件文化,将开源软件的学习、使用、贡献逐步变成一种工作、生活方式。

接下来是第二部分:生产环节中的安全性和可靠性的评估。这个话题很广,我想从这几个方面入手:

  1. 先看看这个开源软件成功案例,若有很多大厂在用,软件的安全性和可靠性应该是不错的,若没有什么用户在用就需谨慎评估了;
  2. 然后使用有long-term support (LTS)版本的开源软件进行开发和部署,尤其是GNU/Linux这样的操作系统和核心。LTS在文章中有提及,大家可去看看;
  3. 在Git中使用多个分支进行开发和Bug修复:主分支、功能分支、Bug修复分支等;
  4. 留出充分的测试时间:单元测试、集成测试、验收测试;
  5. 估算和测试负载:可能多少并发用户、一个用户生成的数据量、用户分布等等;
  6. 除了公司内部的安全人员外,可和一些白帽子团队建立长期合作;
  7. CI/CD基础设施的引入和完善,它是软件系统安全性、可靠性的重要支撑和保障;
  8. 在安装部署环节:公有云、私有云、混合云带来安全性、可靠性的不同解决方案;
  9. 这点很重要,若公司的核心关键业务基于这些开源软件,公司尽可能安排专人深度跟进和参与到这个开源软件中来,这是技术保障。举个例子:小米就有4个HBase Committer参与HBase,这极大地保障了公司基础设施的可维护性和可靠性,若没有,如果出了一个难搞的问题,没办法解决,去问原开发者,因为交流、时间等因素总会有耽搁和延迟,而核心关键业务是不能等人的。

问:想问一下学习开源软件的时候,什么时候应该阅读源码?阅读源码的方法是什么?

答:阅读源码是为了更好的理解软件背后的实现机制和细节,为了满足好奇心,什么时候阅读都行。不过,若软件规模庞大,要去看源码就先放一下,先熟练使用它后再说。阅读方法可参考以下几点:

  1. 搜一下是否有朋友在做这件事,若有,可以和他一起,这样有交流,进步更快,GitHub上已有不少对源代码做中文注解的项目,如:带有详细注释的 Redis 3.0 代码 
  2. 若没有借鉴第1点的做法,将你要分析的源代码导入类似GitHub的代码仓库,然后边看代码边写注释;
  3. 买相关书籍,我为了看GCC源代码,买了本《编译系统透视:图解编译原理》。因为工作量太庞大,这个研读过程就先放下了;
  4. 去折腾、重构、编译源代码也是个好方法。

问:如何根据自身需要快速辨别一个开源软件是否适合自己?

答:先想一下你的最基本需求有哪些,就说三点,然后再看看这款开源软件它的特性是否能满足你的这三点需求,这也是我在文章中拟软件特性和要点的原因。

举一个例子,我想找一个特别酷的编辑器,需求点有三个:

  1. 能编程,支持大多数主流编程语言;
  2. 能写文档、支持Markdown等格式;
  3. 能完成我一天大部分的工作。

我选择Emacs,原因如下:

  1. 因为Emacs是迄今为止功能最为强大的文本编辑器,能编写代码、能写文档;
  2. Emacs是模块化的,遵循do one thing, and do it well原则,需要什么就安装什么,你可以像搭积木的方式搭建自己的环境和系统;
  3. Everything Emacs,你可以在Emacs完成你几乎所有的工作:编程、写作、浏览网页、收发邮件、日程、娱乐游戏、它是个人操作系统。

当然,你觉得没有适合自己的,自己可以发起一个开源软件项目,将自己的一个软件作品发布出去。若没有软件作品,也可以将自己心得、整理的文档、博客、各种开放资源以开源项目的方式发布出去,如:开放文档资源索引


问:开源软件有很多,你对每个开源软件都会了解吗?了解到什么程度,而且开源会跨语言、跨平台,请问你如何学习、解决、应对的?

答:对开源软件的关注程度我会在了解、学习、深入等几个方面加以平衡。

  1. 我感兴趣的开源软件,我会从背景、它是什么、为什么是它、应用、开发、部署实施、成功案例、资源等几个方面去大致了解。
  2. 应用到工作中的,我会在第1点这个基础上深入每个环节。
  3. 对生命周期很长的,如操作系统、编译器、数据库等,我会长时间跟进和学习,几年甚至更长时间。
  4. 这么多开源软件、知识、总结等如何管理?我采用的是用Wiki的方式,从2011年我就开始这个工作,每天都会学习、更新自己的学习总结,渐渐的就有了几千个开源软件条目,近4000万的浏览量,有的条目我编辑了几百次,而这个就是我非常关注度的项目,如:PostgreSQL

大家可以通过类似方法总结、整理自己的开源软件知识体系,工作量有些大,更多需要兴趣驱动。


问:怎么开启开源软件源码学习,在没有文档的情况下,又怎么了解开源软件架构?

答:这个问题和问题4很类似,可参考。若作者没有提供架构图的,可试着自己去画一个,若可以,可提交原作者,若他赞同或有修改补充,相信你对此款开源软件的整体架构有了更进一步认识,另外,结合类似印象笔记和Wiki的工具,不断总结你的学习过程。


问:本群的主题是开源软件,和我们平常所说的开源项目(如github)是一回事吗?

答:开源软件和开源项目在这里等同,主要有的开源项目是开放文档或开放硬件设计的。GitHub本身不是开源项目,它是一个托管开源项目进行分布式协作开发的网络平台,它上面托管了大多数热门主流的开源项目。GitHub是寻找、选择开源项目的首选。


问:对于大的开源项目,如何学习和参与?

答:大的开源项目,如操作系统、大数据、云计算平台等,因为涉及东西很多,学习是个很系统、漫长的过程,可参考问题6的学习建议。

大项目,知名度很高,参与的难度会比较高,首先让自己成为编程高手或社区运营高手,通过问题3所提到的8点建议入手。


问:若自己项目要上传到github上,readme.md要写哪些东西可以吸引其他人看我项目,对我的项目能有足够认知?

答:中英文、有简介、快速入门、有图、有案例,许可协议可选Apache或MIT或BSD。另外,参考一些热门项目的介绍。

开源软件许可协议选择。许可证基本考虑:Apache、MIT、BSD、GPL/LGPL等,这几个许可协议应用非常广泛,大家更容易接受和采纳。Apache、MIT、BSD这三个许可协议很相似,都很友好和自由,是首选。

Apache:其主要附加条款就是Apache的商标不与该软件一同授权。因此,如果你对Apache项目的源代码进行了修改并希望发行修改后的版本,你不能把你修改过的软件称为Apache。如:Apache Hadoop的分发版HDP、CDH。

BSD:修改并发布你的软件,却不需要公布你修改后的源代码,BSD许可证允许你将代码私有化并在私有许可证下发布BSD这也是很多防火墙等安全软件基于BSD构建的原因。

MIT:一个没有对代码使用方式有任何限制的许可证,主流的JavaScript项目大多采用MIT许可证,如:Angular、Meteor、Node.js等。

GPL:Linux核心和GNU/Linux各种发行版使用的许可证,此许可证要求对GPL下的代码进行任何修改以及你发布的修改都应该对社区开放,可以说大部分开源软件采用了GPL。

LGPL:是个较宽松的GPL,它用来解决GPL授权库(Library)的问题,如glibc,许多应用程序都依赖这个核心系统运行库,通过在LGPL下授权glibc,商业应用链接到glibc而不用担心该程序被要求在GPL下授权。如果你开发了一个开源软件,也允许商业授权的软件使用你的技术,LGPL是个不错的选择。

另外补充一些大教堂与集市的知识。

大教堂是传统的软件开发模式,开发团队规模较小,在开发开始前,设计和功能要求已全部明确。架构、设计、编码、测试不仅被完全确定,还会被全部写成文档。开发阶段几乎没有循环迭代发布过程,获得外界反馈是在alpha和beta测试阶段,所有人员仅限于公司内部员工。

集市开发会将目前可以完成且实用的功能组成一个版本发布,普遍欠缺一些功能和带有一些缺陷,但没关系,版本的循环发布会非常频繁(常常以小时计算)。采用集市会尽可能早、尽可能频繁地发布软件寻求反馈。任何地方的任何人,只要有好的想法,都可以参与贡献,发现、修复Bug,完善文档,增加新的功能等。当软件维护者认为一切已经准备就绪,就进行正式的发布。GNU/Linux、FreeBSD等重多开源软件,就是通过集式开发模式获得巨大成功的。

GitHub也将集市开发模式推向一个新高度。企业开发思路的转变,要更快的交付产品服务和即时响应客户需求,请采用集市。

给大家提一些学习的建议和总结:

  1. 不要把GitHub作为敏感话题的博客,可作为技术博客;
  2. 广泛和学习各种开源软件,了解的越多越能帮助你更好的选择和判断,但要平衡好自己的工作、兴趣和时间;
  3. 可以从一个非编程的任务开始自己的GitHub之旅,如建立一个技术博客、资源索引,参与已有项目的贡献;
  4. 个人的选型路线:
  5. 企业的选型路线,软件开发和编程语言,不存在谁好谁坏,因为它们都在相互学习也互相都看不起;
  6. 好的程序员之所以出色是因为熟能生巧,想想玩转Emacs的家伙;
  7. 随时都可以学习一门新语言,拓展自己思路,可选择JVM、.NET、Erlang VM虚拟机之上的语言,因为生态系统和相互借鉴;
  8. Lisp和Emacs都是受益终生的投资;
  9. 做技术的不要忘了自嘲:长得一般、做饭一般、家务一般、编程一般……给人一般的感觉,而背后是不一般和惊喜;
  10. 有关数学,每天都浏览一下维基百科,它把数学的整个体系整理的很全;
  11. 多看些非技术类丛书,让自己的思路发散和飘逸,软件需要哲学家,自由社会、自由软件可作为大家的入门书。

本文首发于GitChat,未经授权不得转载,转载需与GitChat联系。


在此感谢异步社区为本次活动提供的赠书《C++Primer Plus(第6版)中文版》。

异步社区是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架。


Instagram: 2年10亿美元背后的技术架构

2015年7月3日 没有评论

转自:Archfan

参考:Instagram的技术探索

Instagram是一款免费照片分享移动应用,目前支持IOS和Android。在1年多的时间里,Instagram发展到140万个用户,1.5亿张图片(几个TB),仅有3个工程师,以10亿美元的天价被Facebook收购。不得不说,Instagram是业界的一个神话。今天我们就来看看到底是什么样的技术架构支撑着这个10亿美元的公司。

Instagram团队之前发表过一篇文章:What Powers Instagram:Hundreds of Instances,Dozens of Technologies。这篇文章中提到的技术架构堪称经典,很适合初创项目的快速启动。

这个小团队使用了很多不同的技术和策略,保证他们能轻松的应付快速增长带来的压力。他们混合使用SQL、NoSQL,一堆开源项目,和云服务;云服务他们选择了Amazon,他们认为Amazon要比他们自己部署IDC更有优势;用异步队列来串联组件;系统架构在众多的对外API和内部Services之上;数据存储在内存和云端;大部分代码是动态语言;等等等等。非常时髦的一个架构,基于这个架构之上他们得以快速前进,并且保持精简。

那篇文章非常值得一读,有兴趣的同学可以直接看原文。这里我列出一些要点:

  • 架构原则:1.保持简单;2.不重复造轮子;3.尽量使用成熟稳定的技术
  • 3个工程师
  • 大量使用Amazon服务,工程师不用耗费时间自己维护服务器
  • 100+个EC2实例用于各种用途
  • Ubuntu Linux 11.04(“Natty Narwhal”),他们认为这个版本更加稳定
  • Amazon的ELB(Elastic Load Balancer)路由请求,ELB后面起了3个Nginx实例
  • ELB上关闭了SSL,因为它降低了CPU的使用率
  • DNS使用Amazon的Route53
  • 25+个Django应用服务运行在High-CPU Extra-Large类型的机器上
  • CPU使用比内存使用更加容易达到边界值,所以使用High-CPU Extra-Large的实例来平衡内存和CPU
  • Gunicorn是他们的WSGI服务器。Apache更难配置,更耗CPU
  • Fabric被用来在所有机器上并行执行命令。部署花费更少的时间。
  • PostgreSQL(存储用户,照片元数据,标签等)运行在12个Quadruple Extra-Large Memory实例上
  • 12个PostgreSQL副本运行在不同的节点上
  • PostgreSQL的Master-Replica使用流复制模式,利用EBS的快照来频繁备份
  • EBS部署在软件RAID上,使用mdadm以获取适当的IO
  • 将所有工作中的数据集存储在内存中,因为EBS每秒磁盘寻道次数有限
  • Vmtouch(轻量级的文件系统缓存诊断工具)被用来管理内存数据,尤其是当故障转移时目标机器没有足够空余的内存
  • 用XFS做文件系统,保证数据快照时RAID阵列上数据的一致性
  • Pgbouncer用作PostgreSQL的连接池
  • 有几个TB的照片存在Amazon S3上
  • 用Amazon CloudFront做CDN
  • Redis用来支撑feed,活动消息,session系统和其它服务
  • Redis运行在几台Quadruple Extra-Large Memory实例上,偶尔也会做下切分
  • Redis也是Master-Replica,副本持久化到磁盘上,并由EBS通过快照备份(这么搞是因为他们发现直接在Master上做dump相当吃力)
  • Geo-Search使用Solr,Solr提供的JSON接口也很简单易用
  • 6个memcached实例做缓存,因为Amazon Elastic Cache服务并不便宜,mmc客户端使用pylibmc和libmemcached
  • Gearman用做:向Twitter,Facebook等平台异步分享照片;新照片发布的通知;feed的反送
  • 200个Python进程处理Gearman的任务队列
  • Pyapns处理超过10亿条Apple的push通知,异常稳定
  • Munin用做监控和系统度量工具,用Python-Munin写了很多图表插件,如每分钟注册人数,每秒钟图片发表数等等
  • Pingdom做内部服务的监控
  • PagerDuty用来处理通知和事件
  • Sentry用来做Python的错误报告

以上就是Instagram的博文里面提到的技术要点,怎么样,准备好构建下一个10亿美元的应用了么?


知识共享图书《开源应用程序架构》

2011年5月28日 1 条评论

知识共享图书《The Architecture of Open Source Applications 》以 Creative Commons Attribution 3.0 Unported 许可方式发布,其内容覆盖 Asterisk, Berkeley DB, Hadoop, CMake, Eclipse, LLVM, Mercurial, Continuous Integration, NoSQL Ecosystem, Python Packaging, Erlang 等优秀开源软件和精彩内容,完全免费开放,别错过。

在线阅读

下载电子书 epub


分类: Architecture 标签:

深入 Facebook 消息应用服务器

2011年5月4日 没有评论

英文来源:Inside Facebook Messages’ Application Server
中文出处:开放博客,由灰狐翻译小组制作

要点:

  1. Facebook 统一消息系统(邮件、短信、聊天、消息等);
  2. HBase 作为后端存储设施,每个用户数据存储在 HBase 的单独一行里,每个实体(文件夹、主题、消息等等)都存储在自己的HBase列中;
  3. 涉及 HayStack 图片处理基础设施;
  4. 使用 Apache Lucene 维护反向索引列表;
  5. 镜像了大约 10% 用户的实时聊天和收件箱中的信息到测试集群中,并通过 dark launch 进行测试。

Facebook Messages 是我们曾经所创建的最具技术挑战性的一个代表产品。

当我们发布Facebook Messages 时所提到的是我们需要打造一个专门的应用服务器来管理其基础架构。

我们最近讨论了消息后台和我们如何处理所有来自 email, SMS, Facebook Chat 和 Inbox 的通信。

今天我们将深入消息应用服务器的核心。

应用服务器的业务逻辑

应用服务器集成了众多Facebook服务和保护(shields)来自各种终端的复杂性。它提供了一个简单接口方便客户端进行标准消息处理,包括:创建、读取、删除、更新消息和收件箱。

下面是每一部分的流程。

当创建一个新消息或回复消息时,应用服务器代表发送者传递消息到收件人。如果收件人是通过其邮件地址,则服务器通过HayStack获得附件(如果有的话),构造HTML主体,并创建一个RFC2822消息。

输出流

当消息发送给用户时,如果地址是一个回复处理,服务器将从存在的邮件地址和传递的输入消息中获得正确收件人的信息。服务器最终将消息传递到用户邮箱,运行所有必要的预处理和后期处理过程,并决定基于多个信号的文件夹和主题的消息路由。

输入流

当读取消息时,服务器取得有关用户邮箱的多个统计,如容量;消息、主题和回复数;朋友的数量等。同时也获得文件夹相关统计和属性,各种搜索条件的主题列表(文件夹,属性,作者,关键字等等),主题属性和这个主题的其它消息。

当删除消息时,服务器标记要删除的消息和主题。一个离线任务具体清除消息内容。

当更新消息和主题时,服务器改变消息或主题属性,如读取和到达状态,标签等等。同时也处理多个用户对主题的订阅和取消订阅的请求。

管理群组主题

Facebook Messages 使用一个聊天室模型管理群组消息主题。用户能加入(订阅)和离开(取消订阅)。

当邮件地址是是这个主题的指定接收者时这个模型是必须的,应用服务器创建一个回复处理器,类似聊天室ID。当一个邮件接收者回复了主题,则消息会被发送到回复处理器地址。

为了优化读取性能和简化移植和备份处理,消息主题以一种非规格化(denormalized)的方式存储。于是每个用户都拥有一份主题元数据和消息的拷贝,服务器广播订阅和取消订阅事件,在一个分散的方式中同步所有接收者订阅和回复处理的主题元数据。服务器也管理类似用户仍旧使用老的收件箱或通过他们的邮件地址订阅的情形。

缓存用户元数据

当用户访问收件箱时,应用服务器装载最常用的用户元数据(也称活动元数据)并将它们保存在最近最少使用的缓存中(a least recently used cache,也就是LRU算法)。随后,同一用户的请求会通过少量的HBase查询被快速的处理。

我们需要减少HBase查询,因为HBase不支持join, 为处理一个读请求,服务器可能需要在分开的HBase查询中查找多个索引和匹配元数据和消息体。HBase的最佳化体现在写操作而不是在读取上,用户行为通常拥有好的时间和地域性(good temporal and spatial locality),于是缓存能帮助解决这个问题并提升性能。

我们也在通过减少用户内存占用和转移到细粒度模式进而提升缓存的有效性方面做出了很多努力。我们能缓存5%-10%的用户量和95%的活跃元数据缓存命中率。我们在全局的memcache层缓存了访问极为频繁的数据(如在Facebook首页显示没有阅读的消息数)。当新消息到达时应用服务器标记缓存为(dirties)(注:dirties表示修改了但还没有写到数据文件的数据)。

同步

HBase对事务隔离提供了有限的支持。针对同一用户的多个更新可能同时发生。为解决它们之间的潜在冲突,我们使用应用服务器作为用户请求的同步点。一个用户在任何给定的时间里由独有的服务器提供服务。这样,同一用户请求就可以在应用服务器中以一种完整孤立的方式(Fashion)同步和执行。

存储模式

MTA代理特性附件和大量消息实体,在它们能到达应用服务器之前被存储在Haystack中。然而,元数据,包含索引数据和小的消息体,它们存储在HBase中并由应用服务器维护着。每个用户的收件箱都是独立于任何其它用户的;用户数据不会在HBase中共享(shared)。每个用户数据存储在HBase的单独一行里,它包含了以下部分:

元数据实体和索引

元数据实体包含收件箱对象属性,如文件夹、主题、消息等等。每个实体都存储在自己的HBase列中。不像关系型数据库(RDBMS),HBase没有提供用于索引的本地支持 。我们在应用级维护辅助索引(Secondary Indexes),同样以键/值对的方式存储在分开的列中。

比如,要回答查询“loading unread threads on the second page of the Other folder,” 应用服务器首先搜寻元数据索引以获得符合条件的主题列表,然后取出指定主题的元数据实体,以它们的属性构造响应。

正如我们前面所提到的,缓存和有效的预装载能减少HBase查询量以获得更好的性能。

活动日志

用户邮箱中的任何更新(如发表和删除消息,标记主题为已读等等)会立即以时间的顺序添加到列中,这称为一个活动日志(action log)。小的消息实体也存储在活动日志中。

我们能通过回放(replaying )活动日志的方式构造或恢复用户邮箱的当前状态,我们使用最后活动日志的ID以元数据实体和索引的版本回放。当用户邮箱被加载,应用服务器比较元数据版本和最后活动日志ID,如果元数据版本滞后(lags behind)则更新邮箱内容。

活动日志存储在应用级带来极大的灵活性:

  • 我们能通过回放活动日志无缝切换到一种新的模式并且能通过一个离线的 MapReduce 任务或在线的应用服务器自身生成新的元数据实体和索引。
  • 我们能在一个批处理中执行大量HBase异步写以节省网络带宽和减少HBase压缩成本。
  • 它是与其它组件交换持久性数据的标准协议。比如,我们通过将活动日志写到记录日志(Scribe log)做应用级的备份。这个移植管道转化用户老的收件箱数据到活动日志并且通过离线MapReduce生成元数据和索引。

搜索索引

为支持全文检索,我们维护着一个从关键字到匹配消息的反向索引。当一个新消息到达时,我们使用 Apache Lucene 去解析和转化它到一个(keyword, message ID, positions)元组(tuples)中,然后以递增的方式加入到 HBase 的列中。每个关键字都拥有自己的列。所有的消息,包括聊天记录,邮件和短信都被实时索引。

dark launch 测试

应用服务器是我们从零开始构建的一个全新软件,因此在将它推向5亿用户前我们需要监控它的性能、可靠性和伸缩性。我们最初开发了一个压力测试机器人(robot)用来生成模拟请求,但是我们发现这样的结果可能会受到其它一些新因素的影响,如消息长度,不同类型请求的分发,用户活跃度的分布等等。

为了仿真一个真实的产品负荷,我们制作了 dark launch,我们镜像了大约10%用户的实时聊天和收件箱中的信息到测试集群中。Dark launches 帮助我们发现更多性能问题和识别瓶颈。我们也使用它作为一个有说服力的指标来评价我们所做的很多改进 。接下来,我们会继续努力为我们的所有用户提供崭新的消息系统。

作者:Jiakai 是 Facebook Messages 开发小组成员。


分类: Architecture, Facebook 标签:

Facebook 的系统架构

2011年4月30日 没有评论

英文来源:http://www.quora.com/What-is-Facebooks-architecture (由Michaël Figuière回答)

中文出处:享受编程和技术所带来的快乐 – http://coolshell.cn

根据我现有的阅读和谈话,我所理解的今天Facebook的架构如下:

  • Web 前端是由 PHP 写的。Facebook 的 HipHop [1] 会把PHP转成 C++ 并用 g++编译,这样就可以为模板和Web逻贺业务层提供高的性能。
  • 业务逻辑以Service的形式存在,其使用Thrift [2]。这些Service根据需求的不同由PHP,C++或Java实现(也可以用到了其它的一些语言……)
  • 用Java写的Services没有用到任何一个企业级的应用服务器,但用到了Facebook自己的定制的应用服务器。看上去好像是重新发明轮 子,但是这些Services只被暴露给Thrift使用(绝大所数是这样),Tomcat太重量级了,即使是Jetty也可能太过了点,其附加值对 Facebook所需要的没有意义。
  • 持久化由MySQL, Memcached [3], Facebook 的 Cassandra [4], Hadoop 的 HBase [5] 完成。Memcached 使用了MySQL的内存Cache。Facebook 工程师承认他们的Cassandra 使用正在减少,因为他们更喜欢HBase,因为它的更简单的一致性模型,以到其MapReduce能力。
  • 离线处理使用Hadoop 和 Hive。
  • 日志,点击,feeds数据使用Scribe [6],把其聚合并存在 HDFS,其使用Scribe-HDFS [7],因而允许使用MapReduce进行扩展分析。
  • BigPipe [8] 是他们的定制技术,用来加速页面显示。
  • 用来搞定用户上传的十亿张照片的存储,其由Haystack处理,Facebook自己开发了一个Ad-Hoc存储方案,其主要做了一些低层优化和“仅追加”写技术 [11].
  • Facebook Messages 使用了自己的架构,其明显地构建在了一个动态集群的基础架构上。业务逻辑和持久化被封装在一个所谓的’Cell’。每个‘Cell’都处理一部分用户,新 的‘Cell’可以因为访问热度被添加[12]。 持久化归档使用HBase [13]。
  • Facebook Messages 的搜索引擎由存储在HBase中的一个倒置索引的构建。 [14]
  • Facebook 搜索引擎实现细节据我所知目前是未知状态。
  • Typeahead 搜索使用了一个定制的存储和检索逻辑。 [15]
  • Chat 基于一个Epoll 服务器,这个服务器由Erlang 开发,由Thrift存取 [16]

关于那些供给给上述组件的资源,下面是一些信息和数量,但是有一些是未知的:

  • Facebook估计有超过60,000 台服务器[16]。他们最新的数据中心在俄勒冈州的Prineville,其基于完全自定设计的硬件[17] 那是最近才公开的 Open Compute 项目[18]。
  • 300 TB 的数据存在 Memcached 中处理 [19]
  • 他们的Hadoop 和 Hive 集群由3000 服务器组成,每台服务器有8个核,32GB的内存,12TB的硬盘,全部有2万4千个CPU的核,96TB内存和36PB的硬盘。 [20]
  • 每天有1000亿的点击量,500亿张照片, 3 万亿个对象被 Cache,每天130TB的日志(2010年7月的数据) [21]

参考引用

[1] HipHop for PHP: http://developers.facebook.com/blog/post/358
[2] Thrift: http://thrift.apache.org/
[3] Memcached: http://memcached.org/
[4] Cassandra: http://cassandra.apache.org/
[5] HBase: http://hbase.apache.org/
[6] Scribe: https://github.com/facebook/scribe
[7] Scribe-HDFS: http://hadoopblog.blogspot.com/2009/06/hdfs-scribe-integration.html
[8] BigPipe: http://www.facebook.com/notes/facebook-engineering/bigpipe-pipelining-web-pages-for-high-performance/389414033919
[9] Varnish Cache: http://www.varnish-cache.org/
[10] Facebook goes for Varnish: http://www.varnish-software.com/customers/facebook
[11] Needle in a haystack: efficient storage of billions of photos: http://www.facebook.com/note.php?note_id=76191543919
[12] Scaling the Messages Application Back End: http://www.facebook.com/note.php?note_id=10150148835363920
[13] The Underlying Technology of Messages: https://www.facebook.com/note.php?note_id=454991608919
[14] The Underlying Technology of Messages Tech Talk: http://www.facebook.com/video/video.php?v=690851516105
[15] Facebook’s typeahead search architecture: http://www.facebook.com/video/video.php?v=432864835468
[16] Facebook Chat: http://www.facebook.com/note.php?note_id=14218138919
[17] Who has the most Web Servers?: http://www.datacenterknowledge.com/archives/2009/05/14/whos-got-the-most-web-servers/
[18] Building Efficient Data Centers with the Open Compute Project: http://www.facebook.com/note.php?note_id=10150144039563920
[19] Open Compute Project: http://opencompute.org/
[20] Facebook’s architecture presentation at Devoxx 2010: http://www.devoxx.com
[21] Scaling Facebook to 500 millions users and beyond: http://www.facebook.com/note.php?note_id=409881258919

(全文完)


分类: Architecture, Facebook 标签: