1. 程式人生 > >小型的程式設計專案有哪些值得推薦?這本神書寫了 22 個,個個了不得

小型的程式設計專案有哪些值得推薦?這本神書寫了 22 個,個個了不得

本文原創並首發於公眾號【Python貓】,未經授權,請勿轉載。

原文地址:https://mp.weixin.qq.com/s/ObDK4Mt8adL4-De354rMuQ

今天,貓哥要推薦一本非常著名的開源書籍:《500 Lines or Less》。

在開始正題之前,先介紹一下它所屬的系列。該系列叫 AOSA,是“The Architecture of Open Source Applications”的簡稱,即“開源程式的體系結構”,目前有四本書,本期主角是最近的一本(釋出於 2016.7.12)。

這個系列最初的目的是:研究那些優秀的開源專案,從中吸取精華的實踐經驗。

在前三本書中,研究物件已多達 50 幾個,其中不乏名頭響亮者,例如 Eclipse、Selenium、Git、matplotlib、nginx、Puppet、Pypy、SQLAlchemy 與 Twisted 等等。

每個章節的作者都是開源軟體的核心參與者,介紹了專案是如何設計的、為什麼這樣設計、主要的組成部分是什麼、各模組間如何互動、開發中的優秀成果有哪些……

這些書拆解了開源界的明星專案,通過閱讀,你能瞭解到開源作者們的思考方式,瞭解到各類困難問題的解決方案,學習使用現成的輪子。所謂見多識廣,學習吸取經驗,有望“站在巨人的肩膀上”。

但是,這幾本書主要偏向於架構和工程方面,專案程式碼量基本是幾千上萬行,對於初級程式設計師來說不夠實用,想要吃透,挑戰性太大。

針對這個問題,該系列新出了一本《500 Lines or Less》,專注於 500 行或更少程式碼的小型專案。

關注編寫程式碼時所作出的設計決定與權衡 :

  • 為什麼要使用一些介面將應用程式分成不同的模組?
  • 為什麼在這裡使用繼承,在別處使用封裝?
  • 如何預測程式的擴充套件,如何讓其他程式設計師輕鬆實現?

簡而言之,這本書聚焦於一些相對較小但又很具代表性的課題,並通過 500 行以內的程式碼來實現它。

書中寫了 22 個專案,下面逐一簡介:

1、Blockcode: A visual programming toolkit(視覺化程式設計工具包)

使用語言:HTML、CSS、JavaScript

該專案基於開源的 Waterbear 工具,提供視覺化的操作介面,通過簡單而直觀的互動方式,實現圖形程式設計。

2、A Continuous Integration System(持續整合系統)

使用語言:Python 2

CI 是軟體開發中重要的持續整合系統,保障新功能的穩定實現。這個專案介紹了 CI 系統的工作原理,並嘗試構建自己的 CI 系統,實現監聽器、測樣例排程器和測試執行器。

3、Clustering by Consensus(分散式系統)

使用語言:Python

探索如何實現一個網路協議,用於可靠的分散式計算。為了解決共識性問題,使用了 Paxos 演算法的衍生 Multi-Paxos。學習這個專案,能接觸很多分散式的知識。

4、Contingent: A Fully Dynamic Build System(動態構建系統)

使用語言:Python

構建系統(build system)用於將原始碼生成使用者可用的目標(如庫、可執行檔案、指令碼等),常見的有 GNU Make、CMake、Apache Ant 等。Python 中的 PyInstaller 也是構建系統的一種。本專案實現了一個構建系統,且試圖對“動態交叉引用”問題提出一個解決方案。

5、A Web Crawler With asyncio Coroutines(使用協程實現的爬蟲)

使用語言:Python

作者之一是 Python 之父(Guido van Rossum),使用標準庫 asyncio 實現非同步的網頁爬蟲。(學習爬蟲者必看)

6、Dagoba: an in-memory graph database(記憶體中的圖形資料庫)

使用語言:JavaScript

圖形資料庫是 NoSQL 資料庫的一種,使用圖形理論來儲存實體間的關係。這個專案介紹了圖形資料庫要解決的幾個問題,然後將它實現。

7、DBDB: Dog Bed Database(狗床資料庫)

使用語言:Python

用 Python 實現一個簡單的鍵值對儲存資料庫(key/value database),其特點是在電腦崩潰或程式出錯時,也能保證資料的安全。學習這個專案,可以掌握關於資料庫的一些核心特性,例如原子性(atomicity)、一致性(consistency)、獨立性(isolation)和永續性(durability)。

8、An Event-Driven Web Framework(事件驅動的Web框架)

使用語言:Common Lisp

構建一個以事件驅動的 Web 框架,使用 HTTP 做通訊協議。

9、A Flow Shop Scheduler(流水車間排程器)

使用語言:Python 2

流水車間排程問題是查詢最優解問題的一種,本專案基於區域性搜尋(local search)方法,實現流水車間排程器。

10、An Archaeology-Inspired Database(受考古學啟發的資料庫)

使用語言:Clojure

主流的資料庫是面向空間程式設計 (place-oriented programming),即在更新資料的時候,新資料會佔據老資料的空間。本專案開了個腦洞,用考古學家的視角設計資料庫,記錄資料的所有變化軌跡,更新資料時並不刪除老資料。最終實現程式碼僅 360 行,作者稱這個資料庫為CircleDB

11、Making Your Own Image Filters(圖片濾鏡)

使用語言:Java

Processing 是一種用 Java 構建的開發環境,本專案介紹了它的特性與配置,並最終實現自己的濾鏡 APP。功能比較簡單,但實現過程涉及很多影象處理的內容。

12、A Python Interpreter Written in Python(Python直譯器)

使用語言:Python

它的結構跟 CPython 直譯器差不多,作者命其名為 Byterun。 文中詳細講解了直譯器的工作原理,跟著學習,將極有幫助。

13、A 3D Modeller(3D建模)

使用語言:Python

3D 圖形化程式設計,使用到了 OpenGL 來渲染圖形。

14、A Simple Object Model(物件模型)

使用語言:Python

當今最主流的程式設計正規化依然是面向物件程式設計,而它的核心則是物件模型。編寫一些簡單的物件模型可以更好地理解現有語言的內部工作原理,並且深入地瞭解面嚮物件語言的設計理念。

15、Optical Character Recognition (OCR,光學字元識別)

使用語言:Python、JavaScript、HTML

基於人工神經網路(ANNs)實現的簡單 OCR 系統,並設計了一個 Web 客戶端。

16、A Pedometer in the Real World(現實計步器)

使用語言:Ruby

計步器的設計依據是什麼,如何在現實世界中把它實現呢?該文回答了這個問題,它還設計了一個友好的 Web 介面。

17、The Same-Origin Policy(同源策略)

使用語言:Alloy

同源策略(SOP)是當今瀏覽器中安全機制的重要組成部分,用於控制瀏覽器中指令碼間的通訊。文中使用 Alloy(一種用於建模與分析軟體設計的語言)來構建一個可執行的 SOP 模型。

18、A Rejection Sampler(取樣器)

使用語言:Python

“取樣”是指從一些概率分佈中生成隨機數,文中介紹瞭如何從非標準的概率分佈裡進行取樣,以及如何計算樣本在分佈裡對應的概率。

19、Web Spreadsheet(Web 電子表格)

使用語言:HTML、CSS、JS

電子表格是辦公軟體的必備,我們最熟知的是微軟的 Excel。文中用 AngularJS 框架來實現一個簡單的 Web 電子表格,所用程式碼僅 99 行。效果可在這檢視:https://audreyt.github.io/500lines/spreadsheet

20、Static Analysis(靜態分析)

使用語言:Julia

“靜態分析”指的是在不執行程式碼的情況下檢查程式碼(型別、格式、編碼規範等等),這項工作通常是由各種 IDE 編輯器來完成。本專案使用 Julia,實現了一些基本的靜態分析功能。

21、A Template Engine(模板引擎)

使用語言:Python

“模板引擎”是 Web 開發中很重要的東西,支援將使用者介面與實際業務資料分離,通過它可生成標準的 HTML 文件。文中所用的模板引擎語法基於 Django,總程式碼量僅 262 行。

22、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高效能程式設計》

第六期:《深度學習》

第七期:一次性蒐羅40本Python入門書籍

公眾號【Python貓】, 本號連載優質的系列文章,有喵星哲學貓系列、Python進階系列、好書推薦系列、技術寫作、優質英文推薦與翻譯等等,歡迎關注哦