值得關注的開源軟體推薦
本場 Chat 我們來一起了解、學習一些常見的開源軟體。
在這裡我們把你可能用到的開源軟體分成 4 大類 15 個小類 45 個軟體去有層次的瞭解和學習。這些被選的開源軟體都經過廣泛應用、有使用者群和穩定的更新頻率,它們可能不是最流行的,但具有一定的代表性,提供給大家學習參考。
- 應用類:框架、企業應用、編輯器
- 資料類:資料科學、大資料、機器學習、汽車機器人
- 服務類:雲端計算、資料庫、訊息佇列、伺服器
- 系統類:作業系統、編譯器、虛擬機器、程式語言
我們知道在眾多開源軟體中選擇本身就極具挑戰,因為涉及廣泛的比較和排除,也因為不同場景不同應用對開源軟體的需求是不一樣的。這裡的簡單分類只是一個參考,希望它能起到一個拋磚引玉和觸類旁通的作用,大家可在這個基礎上進行修正和延展。若有不妥和錯誤,還請指正和諒解。
實錄提要:
- 小企業的架構受限於技術人員已掌握了什麼,怎麼選一個容易相容擴充套件的框架?
- 有哪些能提高開發效率的軟體,如何通過開源軟體提高開發效率?
- 學習開源軟體的時候,什麼時候應該閱讀原始碼?閱讀原始碼的方法是什麼?
- 如何根據自身需要快速辨別一個開源軟體是否適合自己?
- 開源軟體有很多,需要對每個開源軟體都要了解嗎?瞭解到什麼程度?
- 怎麼開啟開源軟體原始碼學習,在沒有文件的情況下,又怎麼了解開源軟體架構?
- 對於大的開源專案,如何學習和參與?
我們每天的學習、工作、生活大多數都基於開源軟體完成,或許你也是這樣的,只是沒注意到。
- 一、關於這篇文章
- 二、開源軟體很多很多
- 三、第一類:框架和程式設計驅動的應用層
- 四、第二類:資料驅動的大資料、人工智慧層
- 五、第三類:雲端計算、基礎設施層
- 六、第四類:作業系統、編譯器、虛擬機器、程式語言
- 七、45個開源軟體特性、要點
- 八、資源彙總
一、關於這篇文章
文章標題《值得關注的開源軟體推薦》這個話題不是很好理,先按著自己的思路試著寫些東西。這篇文章有點流水賬,大家多包涵。
我們知道值得關注的開源軟體實在是太多太多,選擇這個題目也讓自己有點為難。不過,試著去理一下對自己來說還是有蠻多收穫的,不管正確與否,或許也對大家有所啟發和幫助。
本Chat所選的45個開源軟體,它們可能不是最流行的,但具有一定的代表性,它們是眾多開源軟體中的很小一部分。
從這麼多開源軟體中進行篩選有不少困難,需要我們有個好的思路和方法去有步驟、系統化瞭解和學習,本Chat就是和大家一起交流和探討這個話題。希望這篇文章起到拋磚引玉的作用,這裡我們只交流、討論一些思路和方法,並不深入到某個具體專案,這個會留在以後的課程與大家一同學習交流。
開源軟體在作業系統、雲端計算、大資料、編譯器、資料庫、移動、汽車工業等領域取得了巨大成功,已成主流,這篇文章就先圍繞著這些內容展開。
二、開源軟體很多很多
開源軟體的重要性就不用多說了,它是IT工業的基礎。它和我們每個人、每天的學習、工作、生活都息息相關,我們使用的網際網路、物聯網、車聯網都廣泛的依賴於它們。
先來看看,如何去尋找開源軟體,我這裡介紹一個可能是最有效的方式:通過GitHub上Awesome和GitHub 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框架,有嚴格的開發計劃和路線圖。
注意這裡的long-term support (LTS),很多開源軟體都採用這樣的版本支援服務,如:Ubuntu 它在你的版本選擇中非常重要。
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通過整合JavaScript語言,加速使用者介面的構建。
QML是種宣告式語言(declarative language),它是一個使用者介面規範和程式語言,混合JSON語法和JavaScript表示式。
Qt應用目前主流的開發思路是:用QML(Qt Quick)構建互動介面,用C++實現業務邏輯,這也是推薦Qt的一個重要因素。
Meteor是基於JavaScript的框架,用於Web客戶端、伺服器端以及移動應用。Meteor應用會對資料的變化作出即時響應,因此你將獲得即時響應體驗,同時,一致的構建過程、前後端統一的包系統以及單個命令的應用部署過程,將在從設計到釋出的每一環節上為你節省時間。
這是Meteor簡單的堆疊和框架:
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衍生自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 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先了解到這,讓大家對它有一個總體認識,後續我們再深入下去。
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家族還有幾個其它的克隆專案:
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是個大的資料科學軟體堆疊和平臺,當然,你也可以選擇自己去搭建。
使用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
寫個簡單的例子感受下
總之,進入資料科學領域的同學,這三個開源軟體都繞不過。
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
HDP和CDH文件都組織、整理的不錯,可作為了解、學習大資料、Apache Hadoop的一個重要資源。
ODPi: the open ecosystem of big data
在這裡提一下ODPi專案,這是Linux基金會下的一個專案,成員包括HDP的開發商Hortonworks。
鑑於Linux基金會的成功運作和治理能力,ODPi可關注,以生態系統的思考方式去了解整個大資料市場,國內已有大資料公司來此佔位。
ODPi大資料生態系統
在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在安全、身份和風險管理有眾多成功案例。
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的方式融合在了一起。
在汽車工業使用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 提供了 C++ 和 Python 兩種主要的程式設計介面,也可整合 Arduino,ROS 2.0 採用了DDS(資料分發服務)。
隨著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
OpenStack是開源雲平臺的事實標準。
OpenStack使用Python語言編寫,使用了Django、Tornado和Twisted等框架,使用AMQP訊息協議和Redis分散式K/V儲存。
OpenStack可以說是Linux之外最大規模的開源專案,有大量公司和開發者參與構建這個開源雲平臺生態系統,也有很多OpenStack發行版可供使用者選擇,國內使用者可關注這幾家OpenStack供應商:
- UnitedStack有云
- EasyStack 也提供ESContainer企業級容器平臺,深度融合Kubernetes與OpenStack兩個平臺。
- 華為OpenStack
Google加入OpenStack基金會推動著Docker/Kubernetes與混合雲加速融合;EasyStack聯合創始人&CTO劉國輝談到:
”Google加入OpenStack體現了對於資料中心控制平面的爭奪已經結束,以容器為代表的應用形態與以虛擬化為代表的系統形態將會完美融合於OpenStack之上,並與軟體定義網路和軟體定義儲存一起統治下一代資料中心。“
OpenStack、Ansible、SaltStack等開源軟體也極大奠定了Python在資料中心的地位。
OpenShift是RedHat推出的基於Docker和Kubernetes構建的PaaS開源容器雲平臺。
OpenShift能給使用者帶來什麼?可參考紅帽OpenShift的業務價值。
OpenShift業務價值亮點有:
- 5年平均投資回報率:531%
- 每年每100名開發人員實現的年度平均效益:129 萬美元
- 應用程式開發生命週期加快:66%
- 開發每個應用程式所需的IT員工時間減少:35%
- 每個組織增加的收入:742萬美元
- 每個應用程式的IT基礎架構和開發平臺成本降低:38%
總結起來:加快產品、服務研發和交付時間,減少研發成本,增加企業收入,降低基礎架構投資,獲得更高的投資回報率。
為什麼在這裡把這個提出來說說,也是出於自己的一些經歷。
在我們運作開源軟體商業化服務時,開源軟體需要有個好的商業包裝。開源軟體對我們開發人員很熟悉,但很多終端使用者和客戶卻不瞭解,他們可能根本就不知道什麼開源軟體,你給他們大談開源軟體,他們會一臉茫然。若你把開源軟體以類似這樣的方式講給他們聽,效果可能會更好,也更容易成交業務,所以基於開源軟體做商業化服務的同學很有必要建立起這樣的思維模式,將好用、強大的開源軟體做更好的商業包裝。這方面的成功公司有很多,你可更多跟進Red Hat、Ubuntu、MongoDB、Hortonworks等開源軟體公司,它們把開源和商業融合都做得相當出色。
此白皮書也可作為開源軟體商業價值分析的參考,大家基於開源軟體做商業化公司和運營時可參照這樣的思路思考下去。
Docker容器和Kubernetes容器編排已成為企業交付軟體和服務的行業標準,OpenShift可直接作為企業DevOps & CI/CD的基礎設施, 成為部署微服務的多租戶平臺。
Red Hat也在積極推動區塊鏈技術在OpenShift的應用部署,與BlockApps的合作,為其提供區塊鏈平臺的PaaS基礎設施。
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有健康發展的生態系統
在這篇文章中,我們多次提及生態系統。這個大家多重視,逐步建立起層次化、系統化、平臺化的思考方式。
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。
由阿里巴巴捐贈給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作業系統的歷史
我們只關心圖中上面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++編寫。
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實現版本:
- 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萬個程式。
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編輯器的資料程式設計。
好了,我們走馬觀花般的過了一遍這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
- 一套C++開發的大資料處理和分析平臺;
- ECL (Enterprise Control Language) 和KEL (Knowledge Engineering Language) 是兩個High Level的指令碼語言;
- HPCC比Apache Hadoop歷史更加悠久,在並行架構上也有自己的獨到之處:Data Parallelism、Pipeline Parallelism、System Parallelism。
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
- OpenStack是開源雲平臺的事實標準;
- OpenStack + Kubernetes 開啟雲端計算的新時代;
- 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
- 與RabbitMQ實現的AMQP相比,XMPP廣泛應用於即時通訊領域;
- Ejabberd是XMPP Server的首選;
- Ejabberd支援Elixir程式語言。
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
- FreeBSD從10.0開始,使用LLVM替換GCC作為預設的編輯器,除了一些技術的考量外,GCC的GPL v3與FreeBSD專案的不相容性,LLVM/Clang的許可協議是BSD,相容FreeBSD;
- Azul Systems推出Falcon,一個基於LLVM的新的Java即時編譯器;
- Clang是LLVM的前端,用來編譯C,C++,Objective-C。
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)
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#作為一門適合於金融和計算密集型的語言而聞名。
八、資源彙總
以開源軟體介紹的順序彙集文件、連結、書籍資源
文件和連結
- GitHub上的Awesome資源 尋找開源軟體
- GitHub Topics 尋找開源軟體
- 各種技術大會、程式語言、應用的幻燈片資料彙總
- Django Book: 一本免費的自由Book
- Qt 5.7 License changes, The Qt Automotive Suite, The Qt Company in Japan
- odoo培訓參考資料
- Moqui應用開發指南
- 一年成為 Emacs 高手 (像神一樣使用編輯器)
- Vimer的程式世界
- spf13-vim : Steve Francia's Vim Distribution
- Vimcasts 各種Vim技巧
- 中文文案排版指北
- Awesome Atom
- OpenWrt中文網站
- Top 8 Meteor Open Source Projects
- Node.js, Meteor, React.js, AngularJS, JavaScript 和 HTML5 生態系統
- Awesome Meteor
- iDempiere維基
- An Introduction to Data Science
- Jupyter文件
- Pandas文件
- 中文 Python 筆記
- Deep Learning on HDP
- Cloudera官方中文文件
- ECL程式設計師指導手冊、 更多文件
- ODPi Runtime Specification
- Deep Learning Tutorial, ICML, Atlanta, 2013-06-16 Yann LeCun編寫,200頁幻燈片
- TensorFlow 官方文件中文版
- MXNet設計和實現簡介
- AWS 上的 Apache MXNet
- Automotive Grade Linux大會幻燈片
- Open Source in Every Car with Automotive Grade Linux
- Next-generation ROS: Building on DDS
- 百度Apollo Auto @ GitHub
- Tizen Experts
- OpenStack文件
- OpenShift 3 Technical Architecture
- OpenShift 3 and The Next Generation of PaaS
- Using OpenShift & PaaS to accelerate DevOps & Continuous Delivery
- 中國SaltStack使用者組 中文文件
- SaltConf
- From NoSQL to Mo’SQL
- From Relational to Riak
- OrientDB文件
- Apache Kylin Introduction
- 架構師特刊:Apache Kylin實踐
- 用Spring和RabbitMQ技術應對訊息傳送挑戰
- Building a Distributed Data Ingestion System with RabbitMQ
- Using RabbitMQ to stream data events across PostgreSQL Databases
- Apache Kafka文件
- Worktile中的實時訊息推送服務實現
- Nginx架構圖
- Languages, and about languages, on the BEAM
- Jetty:The Definitive Reference
- Cowboy 2.0
- GNU Manuals Online 我們收集整理了一些GNU專案文件資源
- Awesome macOS
- OpenDarwin存檔資源 OpenDarwin專案已關停11年
- LI, Xin.FreeBSD開發者
- LLVM and Clang: Next Generation Compiler Technology
- HotSpot Synchronization: A Peek Under the Hood
- An Introduction to JVM Performance
- .NET Core Documentation、.NET Core API Reference
- Erlang VM(BEAM)文件資料
- Languages, and about languages, on the BEAM
- Awesome Erlang
- Awesome Elixir
- 為什麼我們仍需要Lisp(Clojure)
- Awesome Clojure
- Clojure Cookbook
- F# for fun and profit
- F#幻燈片資源
- F# Programming維基圖書
參考書籍
- 《輕量級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(中文版)》
還有一些圖書,就不羅列了。
內容有些多,還是篇流水賬,感謝大家耐心閱讀。
本文首發於GitChat,未經授權不得轉載,轉載需與GitChat聯絡。
閱讀全文: http://gitbook.cn/gitchat/activity/59f5338eb1e2ca682628410d
一場場看太麻煩?成為 GitChat 會員,暢享 1000+ 場 Chat !點選檢視
相關文章
- 值得關注的12大開源大資料分析應用軟體大資料
- 微信開發值得推薦的開源專案
- 7 個值得關注的開源雲原生工具
- Windows上那些值得推薦的良心軟體-整理Windows
- 值得推薦的android開源框架簡介Android框架
- 推薦七個超酷的免費開源軟體
- 最值得關注的10個C開源專案
- Mac上有哪些值得推薦的必裝安全軟體?Mac
- 推薦20個值得收藏的前端開源專案前端
- 4 款基於Django框架的開源軟體推薦Django框架
- 【推薦】4款Linux開源防火牆軟體!Linux防火牆
- 六款值得推薦的Android開源框架簡介Android框架
- 推薦10個值得收藏的前端開源Awesome專案前端
- 6個值得推薦的Android開源框架簡介Android框架
- [推薦]Bitnami 開源軟體包安裝解決方案
- 有什麼比較好用的遠端軟體值得推薦?
- 有哪些簡單易用的專案管理軟體值得推薦?專案管理
- 值得推薦!安利5款良心又好用的小眾軟體
- 2020年最值得推薦的PHP開源商城PHP
- 【推薦】常用的7款最佳開源運維監控軟體!運維
- 軟體測試應該重點關注的測試過程,廣東軟體測試公司推薦
- 軟體推薦
- 松下相機相關軟體推薦
- 2013 年你應該關注的 10 個開源軟體
- 有哪些比較好用的線上專案管理軟體值得推薦?專案管理
- Android優秀文章和開源庫推薦(讀值得讀的)Android
- Kagol:2022年最值得推薦的前端開源文章Go前端
- 2018最值得關注的30個vue開源專案Vue
- 程式設計師最值得關注的10個C開源專案程式設計師
- 軟體開發中關注習慣的力量
- 這款好用免費的多人協同辦公軟體值得推薦
- 值得重點推薦的BI軟體有哪些?全在這裡了
- Windows軟體推薦Windows
- 效率軟體推薦
- 推薦:又一個支援O/R map的開源軟體釋出:Cayenne
- 5款值得推薦的工具和軟體,讓你的工作效率翻倍
- 強烈推薦的軟體
- 開源專案管理軟體-redmine 薦專案管理