那些年,追过的开源软件和技术(上)
笔者也是在互联网软件行业里面摸爬滚打十年多了,回头想想青葱岁月,很多时间都花在各种技术热潮的追逐上,有些是有价值的,也有些因为没人指导走过弯路,下面我就把我自己接触到这么多优秀的开源软件给大家做个梳理。也许比较枯燥无聊,供大家以后查阅。
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在性能方面更加出色。