本文原創並首發於公衆號【Python貓】,未經受權,請勿轉載。html
原文地址:https://mp.weixin.qq.com/s/ObDK4Mt8adL4-De354rMuQnginx
今天,貓哥要推薦一本很是著名的開源書籍:《500 Lines or Less》。git
在開始正題以前,先介紹一下它所屬的系列。該系列叫 AOSA,是「The Architecture of Open Source Applications」的簡稱,即「開源程序的體系結構」,目前有四本書,本期主角是最近的一本(發佈於 2016.7.12)。程序員
這個系列最初的目的是:研究那些優秀的開源項目,從中吸收精華的實踐經驗。github
在前三本書中,研究對象已多達 50 幾個,其中不乏名頭響亮者,例如 Eclipse、Selenium、Git、matplotlib、nginx、Puppet、Pypy、SQLAlchemy 與 Twisted 等等。算法
每一個章節的做者都是開源軟件的核心參與者,介紹了項目是如何設計的、爲何這樣設計、主要的組成部分是什麼、各模塊間如何互動、開發中的優秀成果有哪些……數據庫
這些書拆解了開源界的明星項目,經過閱讀,你能瞭解到開源做者們的思考方式,瞭解到各種困難問題的解決方案,學習使用現成的輪子。所謂見多識廣,學習吸收經驗,有望「站在巨人的肩膀上」。編程
可是,這幾本書主要偏向於架構和工程方面,項目代碼量基本是幾千上萬行,對於初級程序員來講不夠實用,想要吃透,挑戰性太大。網頁爬蟲
針對這個問題,該系列新出了一本《500 Lines or Less》,專一於 500 行或更少代碼的小型項目。瀏覽器
關注編寫代碼時所做出的設計決定與權衡 :
簡而言之,這本書聚焦於一些相對較小但又很具表明性的課題,並經過 500 行之內的代碼來實現它。
書中寫了 22 個項目,下面逐一簡介:
一、Blockcode: A visual programming toolkit(可視化編程工具包)
使用語言:HTML、CSS、JavaScript
該項目基於開源的 Waterbear
工具,提供可視化的操做界面,經過簡單而直觀的交互方式,實現圖形編程。
二、A Continuous Integration System(持續集成系統)
使用語言:Python 2
CI 是軟件開發中重要的持續集成系統,保障新功能的穩定實現。這個項目介紹了 CI 系統的工做原理,並嘗試構建本身的 CI 系統,實現監聽器、測樣例調度器和測試運行器。
三、Clustering by Consensus(分佈式系統)
使用語言:Python
探索如何實現一個網絡協議,用於可靠的分佈式計算。爲了解決共識性問題,使用了 Paxos 算法的衍生 Multi-Paxos。學習這個項目,能接觸不少分佈式的知識。
四、Contingent: A Fully Dynamic Build System(動態構建系統)
使用語言:Python
構建系統(build system)用於將源代碼生成用戶可用的目標(如庫、可執行文件、腳本等),常見的有 GNU Make、CMake、Apache Ant 等。Python 中的 PyInstaller 也是構建系統的一種。本項目實現了一個構建系統,且試圖對「動態交叉引用」問題提出一個解決方案。
五、A Web Crawler With asyncio Coroutines(使用協程實現的爬蟲)
使用語言:Python
做者之一是 Python 之父(Guido van Rossum),使用標準庫 asyncio 實現異步的網頁爬蟲。(學習爬蟲者必看)
六、Dagoba: an in-memory graph database(內存中的圖形數據庫)
使用語言:JavaScript
圖形數據庫是 NoSQL 數據庫的一種,使用圖形理論來存儲實體間的關係。這個項目介紹了圖形數據庫要解決的幾個問題,而後將它實現。
七、DBDB: Dog Bed Database(狗牀數據庫)
使用語言:Python
用 Python 實現一個簡單的鍵值對存儲數據庫(key/value database),其特色是在電腦崩潰或程序出錯時,也能保證數據的安全。學習這個項目,能夠掌握關於數據庫的一些核心特性,例如原子性(atomicity)、一致性(consistency)、獨立性(isolation)和持久性(durability)。
八、An Event-Driven Web Framework(事件驅動的Web框架)
使用語言:Common Lisp
構建一個以事件驅動的 Web 框架,使用 HTTP 作通訊協議。
九、A Flow Shop Scheduler(流水車間調度器)
使用語言:Python 2
流水車間調度問題是查找最優解問題的一種,本項目基於局部搜索(local search)方法,實現流水車間調度器。
十、An Archaeology-Inspired Database(受考古學啓發的數據庫)
使用語言:Clojure
主流的數據庫是面向空間編程 (place-oriented programming),即在更新數據的時候,新數據會佔據老數據的空間。本項目開了個腦洞,用考古學家的視角設計數據庫,記錄數據的全部變化軌跡,更新數據時並不刪除老數據。最終實現代碼僅 360 行,做者稱這個數據庫爲CircleDB
。
十一、Making Your Own Image Filters(圖片濾鏡)
使用語言:Java
Processing 是一種用 Java 構建的開發環境,本項目介紹了它的特性與配置,並最終實現本身的濾鏡 APP。功能比較簡單,但實現過程涉及不少圖像處理的內容。
十二、A Python Interpreter Written in Python(Python解釋器)
使用語言:Python
它的結構跟 CPython 解釋器差很少,做者命其名爲 Byterun。 文中詳細講解了解釋器的工做原理,跟着學習,將極有幫助。
1三、A 3D Modeller(3D建模)
使用語言:Python
3D 圖形化編程,使用到了 OpenGL 來渲染圖形。
1四、A Simple Object Model(對象模型)
使用語言:Python
當今最主流的編程範式依然是面向對象編程,而它的核心則是對象模型。編寫一些簡單的對象模型能夠更好地理解現有語言的內部工做原理,而且深刻地瞭解面嚮對象語言的設計理念。
1五、Optical Character Recognition (OCR,光學字符識別)
使用語言:Python、JavaScript、HTML
基於人工神經網絡(ANNs)實現的簡單 OCR 系統,並設計了一個 Web 客戶端。
1六、A Pedometer in the Real World(現實計步器)
使用語言:Ruby
計步器的設計依據是什麼,如何在現實世界中把它實現呢?該文回答了這個問題,它還設計了一個友好的 Web 界面。
1七、The Same-Origin Policy(同源策略)
使用語言:Alloy
同源策略(SOP)是當今瀏覽器中安全機制的重要組成部分,用於控制瀏覽器中腳本間的通訊。文中使用 Alloy(一種用於建模與分析軟件設計的語言)來構建一個可執行的 SOP 模型。
1八、A Rejection Sampler(採樣器)
使用語言:Python
「採樣」是指從一些機率分佈中生成隨機數,文中介紹瞭如何從非標準的機率分佈裏進行採樣,以及如何計算樣本在分佈裏對應的機率。
1九、Web Spreadsheet(Web 電子表格)
使用語言:HTML、CSS、JS
電子表格是辦公軟件的必備,咱們最熟知的是微軟的 Excel。文中用 AngularJS 框架來實現一個簡單的 Web 電子表格,所用代碼僅 99 行。效果可在這查看:https://audreyt.github.io/500lines/spreadsheet
20、Static Analysis(靜態分析)
使用語言:Julia
「靜態分析」指的是在不運行代碼的狀況下檢查代碼(類型、格式、編碼規範等等),這項工做一般是由各類 IDE 編輯器來完成。本項目使用 Julia,實現了一些基本的靜態分析功能。
2一、A Template Engine(模板引擎)
使用語言:Python
「模板引擎」是 Web 開發中很重要的東西,支持將用戶界面與實際業務數據分離,經過它可生成標準的 HTML 文檔。文中所用的模板引擎語法基於 Django,總代碼量僅 262 行。
2二、A Simple Web Server(Web服務器)
使用語言:Python、HTML
實現了一個簡單的 Web 服務器,主要使用了標準庫中的 BaseHTTPServer
。另外,它還介紹了 CGI(通用網關接口) 協議,給服務器實現了運行外部程序的功能。
全部項目介紹完畢。能夠看出,22 個項目中有 13 個使用了 Python,佔60%,難怪網上有些不明真相的同窗直呼它是「一本Python神書」。
有些項目初看的話,你不可思議只需不到 500 行代碼就能實現,可是通過必要的問題裁剪,並使用恰當的現成輪子(開源庫、工具、框架等),就能取得簡單的成果。
與之相對的,不要覺得 500 行之內的項目就很簡單。每一個項目的做者都大有來頭(連 Python 之父都親自上陣啦),文章中寫到的技術背景、實現原理以及設計思路,全都值得仔細研讀(不少還不必定能讀懂)。
這本書是開源的,在官網上能夠免費閱讀。它還配套了 Github 倉庫,存放了完整的項目代碼,目前已經得到 20000 多顆星星啦。
Github 上有對它的中文翻譯計劃,可是翻譯者寥寥,只有 10 幾篇翻譯了出來,翻譯質量還不敢恭維。
無論如何,這麼優質而誠意十足的開源書籍,很是值得推薦!做爲我們 Python 貓薦書系列的第八期,也很是合適。
最後附上該書在開篇中的寄語:
We hope that the experiences of the authors in this book will help you grow out of your comfort zone in your own programming practice.
咱們但願本書做者的經驗可以幫助您在本身的編程實踐中成長。
相關連接:
書籍官網:http://aosabook.org/en/index.html
Github英:https://github.com/aosabook/500lines
Github中:https://github.com/HT524/500LineorLess_CN
往期薦書回顧:
第一期:《編寫高質量代碼改善 Python 程序的 91 個建議》
第二期:《Python最佳實踐指南》
第三期:《黑客與畫家》
第四期:《Python源碼剖析》
第五期:《Python高性能編程》
第六期:《深度學習》
公衆號【Python貓】, 本號連載優質的系列文章,有喵星哲學貓系列、Python進階系列、好書推薦系列、技術寫做、優質英文推薦與翻譯等等,歡迎關注哦。