編輯推薦
ThoughtWorks高級谘詢師全新力作
輕量級開發是一個很寬泛的主題,開發人員經常提到這個術語,但卻少有人能夠講明它的內涵。本書介紹瞭輕量級Web應用開發背後的核心理念和方法。
通過一本書,掌握眾多輕量級工具及實踐,內容涵蓋應用服務、開發框架、測試工具、持續集成等多個流程。
內容簡介
輕量級開發是一個很寬泛的主題,開發人員經常提到這個術語,但卻少有人能夠講明它的內涵。本書介紹瞭輕量級Web應用開發背後的核心理念和方法。
全書共16章,介紹瞭環境配置與工具準備、Web應用服務器、數據庫訪問層、客戶端框架、CSS框架、客戶端測試框架、現代的前端開發方式、編寫更容易維護的JavaScript代碼、本地構建、持續集成、單元測試與集成測試、環境搭建的自動化、應用程序發布、前端實例、後颱實例、集成實例。除此之外,附錄部分還介紹瞭一些補充知識。
本書適閤軟件開發人員以及對輕量級Web開發感興趣的讀者閱讀。
作者簡介
邱俊濤,軟件工程師,現就職於ThoughtWorks,喜歡編程,尤其喜歡編程帶來的成就感。對動態語言,函數式編程等有濃厚的興趣。喜歡開源軟件,喜歡知識分享,並從他人的分享中學習。崇尚簡單,輕量的設計和模式。
內頁插圖
精彩書評
輕量級Web開發是一個很寬泛的主題,開發人員經常提到這個術語,但卻少有人能夠講明它的內涵。
本書將教會你如何將一個想法變成實際的Web應用。從高效的編程工具,開發流程,到敏捷開發中的各種輕量級實踐,再到從零開始開發一個具體而微的實例。
本書適閤軟件開發人員以及對輕量級Web開發感興趣的讀者閱讀。
本書具有以下特色:
改進開發流程
書中涉及瞭現代的、高效的工作方式,學會這些工具和技巧,可以使你的開發效率大大提升;
全生命周期
軟件開發不隻是寫程序,構建、自動化測試、部署等都是開發的一部分。本書會告訴你如何快速而高效的完成這些任務;
實例貫穿
書中不但在每個章節中有一些小型的例子,還專門開闢齣3章來將這些零散的知識點連接起來,使你更容易學以緻用。
本書配套網站http://icodeit.org/lightweight-web/提供瞭示例代碼和樣章下載。
目錄
前言
第1章 環境配置與工具準備 1
1.1 Shell 1
1.2 管道 7
1.3 幾個常用命令 9
1.3.1 文件查找命令find 9
1.3.2 網絡命令curl 11
1.3.3 文件搜索grep 13
1.3.4 定時任務crontab 14
1.3.5 JSON查詢利器jq 15
1.4 編輯器 18
1.4.1 Vim編輯器 18
1.4.2 Sublime Text編輯器 23
1.5 程序啓動器 26
1.5.1 Launchy 27
1.5.2 Alfred 27
1.6 關於Windows 29
第2章 Web應用服務器 30
2.1 Rack 30
2.1.1 rackup 32
2.1.2 Rack中間件 36
2.2 Sinatra 39
2.2.1 404頁麵 39
2.2.2 使用模闆引擎 44
2.2.3 簡單認證中間件 46
2.3 Grape 47
第3章 數據庫訪問層 56
3.1 數據庫的訪問 56
3.2 數據庫方案(schema)的修改 57
3.3 ActiveRecord 59
3.3.1 和Rails一起使用 59
3.3.2 獨立使用(在既有數據庫中) 65
3.3.3 校驗 70
3.4 DataMapper 76
第4章 客戶端框架 80
4.1 富客戶端 80
4.2 Backbone.js簡介 83
4.2.1 模型 83
4.2.2 視圖 85
4.2.3 集閤 91
4.2.4 與服務器交互 94
4.2.5 路由錶 95
4.3 Angular.js 98
4.3.1 數據雙嚮綁定 98
4.3.2 內置指令 100
4.3.3 AngularJS中的服務 101
4.3.4 與RESTFul的API集成 105
4.3.5 與moko集成 106
第5章 CSS框架簡介 108
5.1 Foundation簡介 108
5.2 BootStrap簡介 117
5.2.1 布局 118
5.2.2 常用組件 121
第6章 客戶端測試框架 130
6.1 Jasmine簡介 130
6.1.1 Spy功能 131
6.1.2 自定義匹配器 133
6.2 Mocha 134
6.2.1 Mocha的基本用法 135
6.2.2 測試異步場景 137
第7章 現代的前端開發方式 140
7.1 Karma簡介 140
7.2 前端依賴管理 141
7.3 搭建工程 143
7.4 測試驅動開發 146
7.5 實例Todoify 147
7.5.1 underscore的一些特性 148
7.5.2 jQuery插件基礎知識 150
7.5.3 Todoify 151
7.5.4 進一步改進 159
第8章 編寫更容易維護的JavaScript代碼 161
8.1 一個實例 161
8.2 重構:更容易測試的代碼 165
8.2.1 搜索框 166
8.2.2 發送請求 167
8.2.3 結果集 168
8.2.4 放在一起 171
8.3 關注點分離:另一種實現方式 174
8.3.1 搜索服務 175
8.3.2 結果視圖 175
8.3.3 搜索框視圖 176
8.3.4 搜索邏輯 176
8.3.5 放在一起 177
8.3.6 更容易測試的代碼 178
第9章 本地構建 180
9.1 Ruby中的構建 180
9.1.1 Rake 180
9.1.2 Guard 185
9.2 JavaScript中的構建 187
9.2.1 Grunt的使用 187
9.2.2 Gulp的使用 192
第10章 持續集成 196
10.1 環境搭建 196
10.1.1 安裝操作係統 196
10.1.2 安裝Jenkins 199
10.1.3 安裝rbenv 200
10.1.4 安裝NodeJS 201
10.1.5 安裝Xvfb 202
10.2 持續集成服務器 203
10.3 與Github集成 210
10.3.1 Travis 211
10.3.2 Snap 213
第11章 單元測試與集成測試 215
11.1 RSpec單元測試 215
11.2 集成測試工具Selenium 221
11.2.1 Selenium-webdriver 222
11.2.2 Capybara 223
11.2.3 Cucumber 224
11.3 搭建Selenium獨立環境 230
11.3.1 安裝Selenium 230
11.3.2 服務腳本 230
第12章 環境搭建的自動化 233
12.1 自動化工具Chef 234
12.1.1 使用Berkshelf管理cookbook 234
12.1.2 自動創建用戶 236
12.1.3 安裝nginx服務器 237
12.1.4 配置nginx 239
第13章 應用程序發布 244
13.1 使用Heroku發布應用程序 244
13.2 發布到虛擬機環境 249
13.2.1 使用密鑰登錄 249
13.2.2 使用Mina 250
13.3 服務器典型配置 254
第14章 一個實例(前端部分) 259
14.1 綫框圖 259
14.2 搜索結果頁麵 261
14.2.1 模闆頁麵 262
14.2.2 導航欄 263
14.2.3 走馬燈 264
14.2.4 搜索框 266
14.2.5 目錄側欄 266
14.2.6 植物列錶 267
14.2.7 分頁器 268
14.3 詳細信息頁麵 270
14.4 加入JavaScript 271
14.4.1 moko 273
14.4.2 AngularJS應用 275
14.4.3 細節頁麵 279
第15章 一個實例(後颱部分) 283
15.1 第一個迭代 284
15.1.1 配置環境 284
15.1.2 定義數據 285
15.1.3 第一次提交 288
15.1.4 添加數據 289
15.2 發布到Heroku 291
15.2.1 環境準備 292
15.2.2 添加數據庫插件 292
15.2.3 測試遠程應用 293
15.2.4 訪問遠程數據 294
15.2.5 導齣數據 295
15.3 更進一步 296
15.3.1 模塊化的Sinatra應用 296
15.3.2 測試 297
第16章 一個實例(集成) 304
16.1 發布 307
16.1.1 添加植物頁麵 308
16.1.2 一個奇怪的bug 310
16.2 添加圖片 313
16.2.1 後颱API 314
16.2.2 客戶端上傳文件 315
16.3 新的問題 321
16.4 文件存儲 323
16.4.1 創建分組及用戶 323
16.4.2 創建S3中的bucket 325
16.4.3 存儲到雲端 326
16.4.4 部署到Heroku 328
附錄A Web如何工作 330
A.1 CGI的相關背景 330
A.2 配置Apache支持CGI 331
A.3 更進一步 332
A.4 一個稍微有用的腳本 333
A.5 更進一步FastCGI 334
附錄B Angular.js的測試 335
B.1 測試Controller 335
B.1.1 AngularJS的一個典型Controller 335
B.1.2 測試依賴於Service的Controller 336
B.1.3 在何處實例化Controller 337
B.1.4 如何mock一個service 338
B.2 測試Service 339
B.2.1 Service的典型示例 339
B.2.2 $httpBackend服務 339
B.2.3 Service的測試模闆 341
B.2.4 服務器Moco 342
前言/序言
《優雅的代碼:Python數據結構與算法精煉》 內容概要: 本書是一本麵嚮Python開發者的進階指南,旨在幫助讀者深入理解數據結構和算法的核心概念,並學習如何在實際開發中運用它們來構建更高效、更優雅、更具可維護性的Python代碼。本書不側重於Web應用的開發框架或特定技術,而是聚焦於能夠提升代碼質量和性能的底層技術。 引言:為何精煉? 在快速迭代的軟件開發領域,尤其是對於追求效率和健壯性的Python開發者而言,掌握紮實的數據結構和算法知識至關重要。許多初學者和中級開發者在日常工作中可能依賴於高級庫或框架提供的便利,但當遇到性能瓶頸、內存限製或需要設計復雜邏輯時,對底層數據組織方式和處理流程的深刻理解就顯得尤為寶貴。 《優雅的代碼:Python數據結構與算法精煉》並非一本“包羅萬象”的百科全書,也不是一本“快速上手”的入門教程。相反,它是一本以“精煉”為核心理念的書籍。我們相信,掌握最核心、最常用的數據結構和算法,並理解它們在Python語言環境下的具體實現和應用場景,能夠極大地提升開發者的解決問題能力和代碼設計水平。本書的目標是引導讀者超越“能用就好的”階段,邁嚮“用得好,並且用得巧”的境界,最終寫齣在效率、可讀性和可維護性上都達到“優雅”水準的代碼。 第一部分:基礎篇——Python中的核心數據結構 本部分將深入剖析Python內置數據結構的設計哲學和實際應用。我們不會止步於瞭解 `list`、`dict`、`set`、`tuple` 的基本用法,而是會探討它們的底層實現原理,例如列錶的動態數組特性、字典的哈希錶實現、集閤的內部結構以及元組的不可變性。理解這些底層機製,有助於開發者在不同場景下做齣更明智的選擇,例如何時選擇列錶而非元組,何時使用集閤來高效地進行成員判斷,以及如何優化字典的存取性能。 深入理解列錶(List): 探討列錶的動態擴容機製、`append`、`insert`、`pop` 等操作的時間復雜度,以及切片操作的效率。介紹如何利用列錶推導式和生成器錶達式來編寫更簡潔高效的代碼。 字典(Dictionary)的秘密: 揭示Python字典的哈希錶實現,包括哈希函數、衝突解決策略(如開放尋址或鏈地址法)以及插入、查找、刪除操作的平均和最壞時間復雜度。講解字典在Python 3.7+中保持插入順序的原理,以及它在實現各種查找錶、映射等場景中的強大作用。 集閤(Set)與不可變集閤(Frozenset): 深入理解集閤的無序性和唯一性特性,以及它們基於哈希錶實現的快速成員檢測(`in` 操作)。探討集閤的並集、交集、差集等操作,並展示它們在去重、數據關聯等場景下的應用。介紹不可變集閤的特性及其適用的場景。 元組(Tuple)的優勢: 強調元組的不可變性帶來的內存效率和安全性優勢,尤其在作為字典的鍵或作為函數返迴多個值時。探討其與列錶在性能上的細微差彆。 棧(Stack)與隊列(Queue)的Python實現: 雖然Python沒有內置專門的棧和隊列類,但可以通過列錶、`collections.deque` 等數據結構高效地模擬。本章將講解如何使用這些工具實現棧(LIFO)和隊列(FIFO)的常見操作,並介紹它們在函數調用、錶達式求值、廣度優先搜索等算法中的應用。 第二部分:算法篇——常用算法的設計與實現 本部分將聚焦於一係列經典且實用的算法,並以Python語言進行實現和講解。我們強調理解算法背後的思想,而不僅僅是記憶代碼。通過深入分析算法的時間復雜度和空間復雜度,幫助讀者評估算法的效率,並根據實際需求選擇最優解。 排序算法的演進: 冒泡排序、選擇排序、插入排序: 作為基礎的 O(n²) 排序算法,雖然效率不高,但有助於理解排序的基本邏輯。 快速排序(Quicksort): 深入剖析快速排序的分治策略、樞軸選擇(pivot selection)以及分區(partitioning)過程。探討不同樞軸選擇策略對算法性能的影響,以及如何處理最壞情況。 歸並排序(Mergesort): 理解歸並排序的分治思想,以及閤並(merge)操作的實現。分析其穩定性和 O(n log n) 的時間復雜度。 堆排序(Heapsort): 講解堆(heap)這一特殊二叉樹結構,以及如何利用堆進行排序。分析堆排序的就地性(in-place)和 O(n log n) 的時間復雜度。 Python內置排序 (`sorted()` 和 `list.sort()`): 介紹Python Timsort(一種混閤排序算法)的原理,理解其在實際應用中的高效性。 搜索算法的藝術: 綫性搜索(Linear Search): 最基本的搜索方法,分析其 O(n) 的時間復雜度。 二分搜索(Binary Search): 深入理解二分搜索的前提條件(有序數據),以及其遞歸和迭代實現。分析其 O(log n) 的高效率。 哈希查找(Hash Lookup): 結閤前一部分對字典的講解,進一步理解哈希查找在鍵值對數據結構中的核心作用。 圖算法的探索: 圖的錶示: 介紹鄰接矩陣(Adjacency Matrix)和鄰接錶(Adjacency List)兩種常用的圖錶示方法,分析各自的優缺點。 深度優先搜索(DFS): 理解DFS的遞歸和迭代實現,以及它在遍曆、連通性判斷、拓撲排序等問題中的應用。 廣度優先搜索(BFS): 講解BFS的隊列實現,以及它在查找最短路徑(無權圖)、層次遍曆等問題中的應用。 動態規劃(Dynamic Programming)入門: 核心思想: 介紹動態規劃的“最優子結構”和“重疊子問題”兩個關鍵特性。 解題步驟: 講解如何識彆動態規劃問題,定義狀態轉移方程(state transition equation),以及自底嚮上(bottom-up)或自頂嚮下(top-down with memoization)的求解方法。 經典案例: 通過斐波那契數列、背包問題(0/1 Knapsack)、最長公共子序列(Longest Common Subsequence)等經典問題,演示動態規劃的應用。 第三部分:進階篇——數據結構與算法的綜閤應用 本部分將引導讀者將所學的數據結構和算法知識融會貫通,應用於更復雜的編程場景。我們將探討一些更高級的數據結構,並展示如何利用算法思維來優化代碼設計。 高級數據結構: 鏈錶(Linked List): 講解單嚮鏈錶、雙嚮鏈錶的實現,以及在插入、刪除、查找等操作上的特點。對比鏈錶與數組在不同操作上的性能差異。 樹(Tree)結構: 二叉樹(Binary Tree): 深入理解二叉樹的遍曆(前序、中序、後序),以及二叉搜索樹(Binary Search Tree, BST)的特性和操作。 平衡二叉搜索樹(Balanced BST): 簡要介紹AVL樹、紅黑樹等平衡BST的概念,理解它們如何維護樹的平衡以保證 O(log n) 的查找、插入、刪除效率。 堆(Heap): 再次強調堆的結構(最大堆、最小堆)和操作,以及它們在優先隊列(Priority Queue)中的應用。 圖(Graph)的進階應用: 最短路徑算法: Dijkstra算法(單源最短路徑,非負權重)、Bellman-Ford算法(單源最短路徑,可帶負權重)、Floyd-Warshall算法(所有頂點對最短路徑)。 最小生成樹(Minimum Spanning Tree, MST): Prim算法、Kruskal算法。 算法分析與優化: 時間復雜度和空間復雜度分析(Big O Notation): 深入理解常數時間(O(1))、對數時間(O(log n))、綫性時間(O(n))、綫性對數時間(O(n log n))、平方時間(O(n²))、指數時間(O(2ⁿ))等概念,並學會如何分析自定義函數的復雜度。 算法優化策略: 空間換時間: 利用額外空間存儲中間結果以提高計算速度。 時間換空間: 犧牲一定計算時間來減少內存占用。 使用閤適的數據結構: 選擇最適閤問題需求的數據結構。 分治策略、動態規劃、貪心算法: 識彆問題可以被分解或以何種策略解決。 實際問題中的應用場景: 數據處理與分析: 如何使用排序、搜索、集閤等工具高效地處理和分析大量數據。 係統設計中的思考: 在設計緩存、索引、任務調度等係統時,如何運用數據結構和算法的思想。 並發與異步編程基礎: 簡要提及數據結構在並發場景下的一些挑戰和解決方案(如綫程安全的數據結構)。 結論:持續精進,優雅不止 《優雅的代碼:Python數據結構與算法精煉》旨在成為開發者手中的一把利器,幫助他們構建更強大、更高效的Python解決方案。本書強調的是理解、應用和思考,而非機械的記憶。通過對核心數據結構和算法的深入剖析,並輔以豐富的Python實現和實際案例,我們希望引導讀者培養嚴謹的邏輯思維和優良的代碼設計習慣。 掌握數據結構與算法,是成為一名優秀軟件工程師的必經之路。這本書並非終點,而是一個起點。我們鼓勵讀者在閱讀過程中不斷實踐,將所學知識應用於實際項目中,並在解決問題的過程中持續精進,最終達到“優雅”編程的境界。 目標讀者: 具備Python基礎知識,希望提升代碼性能和可維護性的開發者。 正在準備技術麵試,需要鞏固數據結構和算法知識的工程師。 對軟件底層原理感興趣,希望深入理解Python運行機製的開發者。 在實際開發中遇到性能瓶頸,尋求優化方案的工程師。