那些年,追過的開源軟件和技術
前沿
筆者也是在互聯網軟件行業里面摸爬滾打十年多了,回頭想想青蔥歲月,很多時間都花在各種技術熱潮的追逐上,有些是有價值的,也有些因為沒人指導走過彎路,下面我就把我自己接觸到這么多優秀的開源軟件給大家做個梳理。也許比較枯燥無聊,供大家以后查閱。
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 的書推薦? - 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開源了這項技術。跟上面的幾個技術就可以比較一下了, https://tsicilian.wordpress.com/2015/02/16/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處理
參考資料:
The Architecture of Open Source Applications
The Top 11 Hottest GitHub Projects Right Now
--關注硅谷最新動態,了解碼工求職,工作,學習生活經歷。微信上添加“董老師在硅谷”公眾號:donglaoshi-123原文 http://dongfei.baijia.baidu.com/article/48626
百度首發,轉載請說明。