前言
笔者也是在互联网软件行业里面摸爬滚打十年多了,回头想想青葱岁月,很多时间都花在各种技术热潮的追逐上,有些是有价值的,也有些因为没人指导走过弯路,下面我就把我自己接触到这么多优秀的开源软件给大家做个梳理。也许比较枯燥无聊,供大家以后查阅。
LAMP
属于创业公司的最经典组合。
Linux:不用说,大多数公司都用这个,随着虚拟机越来越成熟,大家喜欢创建虚拟的Image,来提供某个Linux版本,我接触过一些常用的,Ubuntu,Redhat,Debian, Gentoo, CentOS, Federo,OpenSuse。
Apache:最著名的web server,Apache也是开源最活跃的社区,非常成熟的web服务器,有段时间被性能卓越的Nginx赶超,但目前稳定性和模块成熟度还是最高,广受好评。有人比较这两者的差异:Nginx vs Apache。
PHP:当时很多网站用Java写的,php提出就是为了简化网站开发,为web而写。Facebook早年也是PHP写的,是很灵活的脚本语言,Coursera之前也是用Php搭建的,但却是很难维护,主要问题是每个人都可以写一个小框架,编程风格随便,难统一。除了Facebook他们花了大量人力去完善,基本上重写了Php,底层加速成C++,也发明了新语言Hack。
MySQL:经典开源数据库,被Oracle收购,Facebook, Baidu, Taobao都是大量基于MySQL做出非常稳定靠谱的系统。我记得Pinterest也总结过他们为什么用MySQL提高他们的规模。
编程语言:
有个笑话,让程序员打架的一个最有效的方式是去讨论区问大家那种编程语言最好,这就会没完没了的讨论。大致分成C++派,Java派,Python等脚本派。
C/C++:可能很多人入门都是啃着谭浩强的C程序设计,这种语言很强大,既高性能,又灵活(指针,地址,二维指针,指针数组),名词特别多(多态,重载,重用,范型,模板类,元编程),坑也特别多,容易造成内存泄露,野指针,在大学里面吃了不少苦头,疯狂看各种C++经典,秘籍,后来去了创业公司和百度都是大量使用,里面也很多人玩的如火纯青,面试时候经常出个写个线程安全的C++单例模式,析构能否多态或者什么写个调用顺序,让面试者骚手挠腮,欲罢不能,想想自己也折磨过这些面试者,真是罪过啊。
这几年视野广了,不接触C++了,回过头来看还是觉得当年有些走火入魔,没必要自己折磨自己。
Java:估计是目前用的最广的项目语言,容易上手,概念简单,无数的库,大量的代码。我就不多介绍了,我自己也是大半的项目用Java写的。缺点时配置比较烦,很多什么XML,Config,适合写服务端。
LUA:大量应用在大型游戏的脚本语言,主要是高性能,语言规范精简、运行时库小,与C/C++交互方便,我在百度做云计算平台时候也是用它作为嵌入式脚本。
Python:跟Perl, PHP,合成3P语言,都是脚本:) 非常方便实用,初学编程就可以拿它练习,有很多方便的库,比如urlib, beautifulsoap。有句话说:人生苦短 我用Python。做数据分析的有个超好的工具叫iPython,它是结合在线notebook,可以交互式编程,非常爽。据说Python的创始人在Dropbox,当年他简历就一句话,说I wrote Python. 在面试Google时候还被一些人误会,想会python算个啥,但人家是作者。有一本书《集体智慧编程》用Python作为实践做机器学习,推荐给大家。
GO:Google开源的语言,比C++容易上手,却有相似的性能,很多从Google出来的人喜欢,据说Square, Pinterest就在用。Go语言有哪些好处,谁用谁知道,为什么要使用 Go 语言,Go 语言的优势在哪里?
Scala:各种集大成,面向对象,函数式编程,面向过程。我目前也在学习,东西实在太多,Coursera上面有Scala作者的一门课(https://www.coursera.org/course/progfun)公司技术部也主推这种语言,这也是为啥我们墙上员工证书中最多就是Scala这门课的。另外著名的Spark,Kafka也是Scala写的,确实在高性能,高并发上面表现不错,又保持了优雅精炼的写法。值得玩味。
Javascript:本来这是个前端客户端的动态语言,做一些页面特效,主要特点是天然支持异步,又跨平台,弱类型,比较安全 (有sandbox),有人把它拓展到后台,随着V8,Node.js, Angular出现也显得越来越厉害了。
还有一些语言,Ruby,R,Object-C, Swift,Matlab, Perl, SQL, D, Lisp就是偶尔用了,有个TIOBE编程语言排名。
J2EE 三剑客:
Java出来之后,为了提高大规模网站的开发效率,提出了很多框架,最经典就是分层J2EE, 在企业级,如银行系统大量使用,什么servlet,java bean,EJB,RMI,JMS, JSP,JNDI,JDBC,容器,管道,数据库连接池,当时最火的就是什么Java架构师,年薪百万啊有木有。那当然一般人玩不会了,后来出现了轻量级的MVC解耦合分层结构,在本科时候经常做管理系统,就使用这种轻量级J2EE框架,搭系统。里面重要3个组件:
-
Hibernate:数据持久框架,ORM,对数据库的CRUD操作进行对象化映射。
-
Spring MVC:中的控制层,但容易造成Config的泛滥,后来Linkedin中起了个项目就叫Kill Spring,改成下面提到的Rest.Li。
-
Struts:View层,有很多tag库可以选择,有个JSTL 标签可以搭配选择。
Web 服务器
Lighttpd:当时在百度我就是把它作为云平台(Baidu App Engine)的服务器。为了彻底搞懂它,我真的看了它所有的源代码,代码很精炼,大概5w行,又研读了所有它的maillist,jira上面的进度,还给开源社区打了补丁。感觉就像武林高手修炼一样。
Nginx:高性能web服务器,异步,C10K (意思是单机同时维持一万的连接)杰出代表。俄国人写的,代码可读性不如上面的,但确实功能更强大些。
Tomcat/Jetty:Java J2EE容器,经常用的,我记得当时最喜欢看到配置成功后,页面显示的小猫图案。在Linkedin,这两个都用。一个用来做前端服务器,一个用来做后端。
框架
Rest.li:RESTful是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。使用HTTP协议中的请求方法来对应后端操作数据时候的增删添改(CRUD)。LinkedIn提出Rest.Li编程框架,是一款REST+JSON框架,使用动态发现和简单的异步API即可构建健壮可伸缩的服务架构体系。
Thrift:Apache Thrift 是Facebook 实现的一种高效的、支持多种编程语言的远程服务调用的框架。
ProtoBuf:Google提出的跟上面很像,用来序列化结构化数据的技术,支持多种语言持久化数据或者序列化成网络传输。
CloudStack:cloud computing框架。
Helix:通用的集群管理框架,Linkedin出品。
前端技术
其实前端我接触的并不多,但现在不是提倡Full Stack全栈工程师嘛。如果你掌握下面的会让你如鱼得水,不需要被UI,UE人员优先级而影响。
Ruby on Rails:在web2.0时代,RoR一下子获得很多创业公司的青睐,开发者将Rails作为一个框架来创建数据库支持的Web应用,它本身是一个完整的解决方案,通过默认的标准实践(convention)可以很大的加快开发效率,无缝的整合所有子组件以提供给开发者一个统一的接口。当时Twitter早期也是用这个框架写的,但这个也是双刃剑,在性能和内部机制上很难调节。
Django:Python的前端管理框架,直接生成管理页面。有人经常那上面的作为PK,相比于 Django、Pylon 等 Python 框架,Ruby on Rails 是否有很大的技术优势?
Smarty:PHP的一种模板语言,很容易上手。
Bootstrap:Twitter提出的HTML,CSS和JS框架,让你的web app容易适配到各种平台,比如手机上。
JQuery:Javascript的最流行的库,可以做一些Ajax调用。
HTML5:就是下一代的HTML标准,增加了一些兼容的便签,使得在手机和浏览器中阅读效果一致。对应的是Native APP,就是原生的从底层开始写的APP。当年Facebook是走HTML5的路,发现不对劲,性能很差,体验糟糕。赶紧转变成Native APP才让它重新赢得市场。
Node.js:js写的后端服务器,处理高并发场景性能佳,使用 Node.js 的优势和劣势都有哪些? 特别适合移动的服务器端。 Socket.IO是其中一个组件,为了在浏览器和移动设备上创建实时应用而产生的,它可以模糊不同传输机制之间的差异。
D3:各种可视化的效果,确实非常酷。
Impress.js:基于CSS3转换和过渡、工作于现代浏览器、并受prezi.com的理念启发的演示工具。
Backbone.js:前端的MVC,为复杂Javascript应用程序提供模型(models)、集合(collections)、视图(views)的结构。
搜索
Nutch:是一个开源Java 实现的搜索引擎,当时Hadoop的前身就是为了做这个项目。
Lucene:基于Java的全文检索引擎,很有名也非常强大,elasticsearch就是基于这个开源基础二次开发。
Solr:基于Lucene的XML接口的独立运行的搜索服务器。通过HTTP协议以XML格式将文档放入搜索服务器(索引),GET来查询搜索服务器得到结果。
Sphinx:Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能。反正比MySQL内置的全文检索要快很多。
Hadoop生态系统
这一块关注过很久了,目前很多很成熟的组件。这是一张生态图,我大多数都在本文中介绍过了,主要的组件都是为了方便大家从底层的MapReduce模型中脱离出来,用高层语言来做分布式计算。
HBase:是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化数据集群。像Facebook,都拿它做大型实时应用。(可参考文章Facebook's New Realtime Analytics System: HBase to Process 20 Billion Events Per Day)
Pig:Yahoo开发的,并行地执行数据流处理的引擎,它包含了一种脚本语言,称为Pig Latin,用来描述这些数据流。Pig Latin本身提供了许多传统的数据操作,同时允许用户自己开发一些自定义函数用来读取、处理和写数据。在LinkedIn也是大量使用。
Hive:Facebook领导的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计。像一些data scientist 就可以直接查询,不需要学习其他编程接口。
Cascading/Scalding:Cascading是Twitter收购的一个公司技术,主要是提供数据管道的一些抽象接口,然后又推出了基于Cascading的Scala版本就叫Scalding。Coursera是用Scalding作为MapReduce的编程接口放在Amazon的EMR运行。
Zookeeper:一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现。
Oozie:一个基于工作流引擎的开源框架。由Cloudera公司贡献给Apache的,它能够提供对Hadoop MapReduce和Pig Jobs的任务调度与协调。
Azkaban:跟上面很像,Linkedin开源的面向Hadoop的开源工作流系统,提供了类似于cron 的管理任务。
Tez:Hortonworks主推的优化MapReduce执行引擎,与MapReduce相比较,Tez在性能方面更加出色。
数据存储(NoSQL)
当时为了解决Scale的问题,伴随分布式系统发展,形成各个NoSQL软件,百花齐放。下面介绍常见的一些:
Memcached:是高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。性能瓶颈第一个就要想到用这个。有点万金油的感觉。
Redis:一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多。
Cassandra:名称来源于希腊神话,是特洛伊的一位悲剧性的女先知的名字。最初由Facebook开发,用于储存收件箱等简单格式数据,集Google BigTable的数据模型与Amazon Dynamo的完全分布式架构于一身,可扩展型和性能都不错,Coursera也是大量使用作为数据对象存储。
Berkeley DB:文件数据库,介于关系数据库与内存数据库之间,使用方式与内存数据库类似,它提供的是一系列直接访问数据库的函数。之后被Oracle收购了。
CouchBase:文档型数据库,由CouchOne与Membase合并,之后的公司叫做Couchbase,功能还是挺强大的,自动备份,自动分片,在Linkedin广告组和运维部门都大力推荐。
RocksDB:比LevelDB更彪悍的引擎,代码层面上是在LevelDB原有的代码上进行开发的,但却借鉴了Apache HBase的一些好的idea。
LevelDB:Google开发的,一个速度非常块的KV存储库(storage library),它支持字符串的key与value,并且这种映射关系按key排序(ordered mapping)
MongoDB:一个基于分布式文件存储的数据库。为WEB应用提供可扩展的高性能数据存储解决方案。 介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。
有一些基于各种NoSQL 特性和性能的比较,可参考文章:
Cassandra vs MongoDB vs CouchDB vs Redis vs Riak vs HBase vs Couchbase vs Hypertable vs ElasticSearch vs Accumulo vs VoltDB vs Scalaris comparison;
Benchmarking LevelDB vs. RocksDB vs. HyperLevelDB vs. LMDB Performance for InfluxDB。
下面几个都是Linkedin开源的数据技术 Projects | LinkedIn Data Team
Voldemort:NoSQL 键/值存储引擎,完全是分布式且去中心化的,支持分区与容错。
Espresso:文档型NoSQL数据存储系统,MySQL作为底层数据存储,具有高性能、高扩展性、支持事务、容错能力等重要特征。
Databus:实时低延迟数据抓取系统
AMP Lab三剑客
AMP Lab 是Berkeley的一个王牌实验室,汇集系统,数据库,机器学习,各个领域的教授和丰富工业经验的学生,它们做出了很多有意思得到工业界认可的技术。
Mesos:一个分布式环境的资源管理平台,它使得Hadoop、MPI、Spark作业在统一资源管理环境下执行。它对Hadoop2.0支持很好。Twitter,Coursera都在使用。
Spark:已经成为Apache的顶级项目了,2014年的当红炸子鸡,我在这个帖子里面也介绍的比较全面了。Spark,它们也成立公司Databricks对cloud管理进行产品化。
Tachyon:是一个高容错的分布式文件系统,允许文件以内存的速度在集群框架中进行可靠的共享,就像Spark和MapReduce那样。有幸跟项目发起人李浩源聊过几次,这个项目目前发展非常快,甚至比Spark当时还要惊人。目前到0.6版本,参与开源的规模和版本迭代速度都很快。
先进大数据技术:流式,实时
由于Hadoop的火红,整个业界都在喋喋不休地谈论大数据。Hadoop的高吞吐,海量数据处理的能力使得人们可以方便地处理海量数据。但是,Hadoop的缺点也和它的优点同样鲜明——延迟大,响应缓慢,运维复杂。
Storm:所谓流处理框架,就是一种分布式、高容错的实时计算系统。Storm令持续不断的流计算变得容易。经常用于在实时分析、在线机器学习、持续计算、分布式远程调用和ETL等领域。Twitter是他们的主推。
Kafka:是Linkedin开源的一种分布式发布-订阅消息系统,它主要用于处理活跃的流式数据。我面试过很多硅谷创业公司都在使用,比如最重要的用户Tracking数据。LinkedIn的开发者也出来成立公司Confluent,最新发布platform。
Samza:一个分布式流处理框架,专用于实时数据的处理,非常像Twitter的流处理系统Storm,LinkedIn开源了这项技术。跟上面的几个技术就可以比较一下了,streaming big data storm, spark and samza
SummingBird:将批处理和流处理无缝连接,通过整合批处理与流处理来减少它们之间的转换开销。把上面的Storm跟Scalding结合起来,所谓Lambda Architecture。跟这个相关组件是Algebird: 利用一些概率算法HyperLogLog来提高计算速度。
Drill:先说Dremel,是Google 的“交互式”数据分析系统。可以组建成规模上千的集群,处理PB级别的数据。MapReduce处理一个数据,需要分钟级的时间。Dremel将处理时间缩短到秒级。Apache推出Dremel的开源实现Drill。
Druid:在大数据集之上做实时统计分析而设计的开源数据存储。这个系统集合了一个面向列存储的层,一个分布式、shared-nothing的架构,和一个高级的索引结构,来达成在秒级以内对十亿行级别的表进行任意的探索分析。
Impala:Cloudera公司主导开发的新型查询系统,它提供SQL语义,能够查询存储在Hadoop的HDFS和HBase中的PB级大数据,号称比Hive快5-10倍,但最近被Spark的风头给罩住了,大家还是更倾向于后者。
Spark Streaming:建立在Spark上的应用框架,利用Spark的底层框架作为其执行基础,并在其上构建了DStream的行为抽象。利用DStream所提供的api,用户可以在数据流上实时进行count,join,aggregate等操作。
Spark SQL:之前Spark类似Hive的工具称为Shark,现在新替代就是Spark SQL, Big Data Benchmark里面也跟Impala性能比较。
工具类:
Make:很多同学在学校时候,认为编程就是在编辑器里面运行,当离开了IDE,他们就不知道该怎么办。C语言的打包工具,比如解析依赖,生成二进制和可执行程序。
Ant:Java的传统打包工具,需要写个build.xml
Gradle:新一代的编译构建工具,结合ivy自动匹配和下载官方稳定版本。
Maven:同上,有个比较Java构建工具:Ant vs Maven vs Gradle
Homebrew:最近几年都用Mac平台,那么包的管理可以用这个。
Eclipse:使用最广泛的IDE,著名的日蚀标识。它的出现就是吃掉SUN(Java诞生地),我大多时间用这个,后来也用过Intellij 不过是商业版本的。跟Eclipse相比,管理大型代码库时候速度快。
Docker:作为一种新兴的虚拟化方式,Docker容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多,运行时所需的资源比虚拟机少,而效率又比虚拟机高提供隔离的执行环境。算是2014年上升最快的一个工具了。
JUnit:java的单元测试,属于测试驱动的利器。
Git:强大的分布式代码版本管理,Linux那么多分支都没乱正是它的功劳。但还是挺复杂,一大堆命令比SVN要多多了。目前GitHub 就是最大的源码管理平台,我们公司也用它的企业版。有个结合Git和代码审查的工具由Facebook开发,Phabricator。
SVN:简化的代码管理,还有perforce Amazon和Google也用。最老的是CVS估计现在没人用了呃。
浏览器:
Firefox:开源浏览器,当时靠丰富插件很强大,就靠Google的默认搜索来维持,但Google也开发了Chrome,给Firefox市场份额极大打击。所谓成也Google,败也Google。这个组织是Mozilla,就跟Coursera是邻居。我当时用过很多插件,比如proxy,去除广告,Firebug来调试,还有什么换皮肤,监控网络流量等。
Webkit:自从苹果开源了这么好的内核引擎,Google就就直接用它开发了Chrome。当时做信息抽取,有一种办法是基于视觉的信息提取,VIPS算法,如果通过webkit,就可以拿到正文的一些具体坐标和字体颜色大小,然后再分块确定重点内容做提取。
Spidermonkey:就是Mozilla旗下的一个JS解析引擎,我用这个是因为当时为了抓取网页,一些很变态的网站比如水木社区:( 把内容写在javascript里面,都是用字符串拼接起来,我为了获取完整的源码就要涉及到JS的解析。
V8:Google 的一个开源项目,是一个高效的JavaScript 引擎,像Node.js基于Google V8提供了基于事件的I/O处理。