轉載 : http://dongfei.baijia.baidu.com/article/48626javascript
前沿php
筆者也是在互聯網軟件行業裏面摸爬滾打十年多了,回頭想一想青蔥歲月,不少時間都花在各類技術熱潮的追逐上,有些是有價值的,也有些由於沒人指導走過彎路,下面我就把我本身接觸到這麼多優秀的開源軟件給你們作個梳理。也許比較枯燥無聊,供你們之後查閱。html
屬於創業公司的最經典組合。前端
Linux: 不用說,大多數公司都用這個,隨着虛擬機愈來愈成熟,你們喜歡建立虛擬的Image,來提供某個Linux版本,我接觸過一些經常使用的,Ubuntu,Redhat,Debian, Gentoo, CentOS, Federo,OpenSuse。html5
Apache: 最著名的web server,Apache也是開源最活躍的社區,很是成熟的web服務器,有段時間被性能卓越的Nginx趕超,但目前穩定性和模塊成熟度仍是最高,廣受好評。有人比較這二者的差別:Nginx vs Apachejava
PHP:當時不少網站用Java寫的,php提出就是爲了簡化網站開發,爲web而寫。Facebook早年也是PHP寫的,是很靈活的腳本語言,Coursera以前也是用Php搭建的,但倒是很難維護,主要問題是每一個人均可以寫一個小框架,編程風格隨便,難統一。除了Facebook他們花了大量人力去完善,基本上重寫了Php,底層加速成C++,也發明了新語言Hack。node
MySQL:經典開源數據庫,被Oracle收購,Facebook, Baidu, Taobao都是大量基於MySQL作出很是穩定靠譜的系統。我記得Pinterest也總結過他們爲何用MySQL提升他們的規模。python
有個笑話,讓程序員打架的一個最有效的方式是去討論區問你們那種編程語言最好,這就會沒完沒了的討論。大體分紅C++派,Java派,Python等腳本派。mysql
C/C++: 可能不少人入門都是啃着譚浩強的C程序設計,這種語言很強大,既高性能,又靈活(指針,地址,二維指針,指針數組),名詞特別多(多態,重載,重用,範型,模板類,元編程),坑也特別多,容易形成內存泄露,野指針,在大學裏面吃了很多苦頭,瘋狂看各類C++經典,祕籍,後來去了創業公司和百度都是大量使用,裏面也不少人玩的如火純青,面試時候常常出個寫個線程安全的C++單例模式,析構可否多態或者什麼寫個調用順序,讓面試者騷手撓腮,欲罷不能,想一想本身也折磨過這些面試者,真是罪過啊。這幾年視野廣了,不接觸C++了,回過頭來看仍是以爲當年有些走火入魔,不必本身折磨本身。jquery
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編程語言排名。
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 標籤能夠搭配選擇。
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內置的全文檢索要快不少。
這一塊關注過好久了,目前不少很成熟的組件。這是一張生態圖,我大多數都在本文中介紹過了,主要的組件都是爲了方便你們從底層的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在性能方面更加出色。
當時爲了解決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 是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,或掃描下方的二維碼,跟咱們聊聊你的想法