本書用故事的方式講解了軟件編程的若干重要領(lǐng)域, 側(cè)重于基礎(chǔ)性、原理性的知識(shí)。第1章講述計(jì)算機(jī)的基礎(chǔ)知識(shí),包括程序的運(yùn)行原理,進(jìn)程、線程、文件系統(tǒng)、I/O系統(tǒng)、數(shù)據(jù)庫(kù)原理、TCP/IP,Socket,編譯原理的概述,遞歸等。第2章側(cè)重Java的基礎(chǔ)知識(shí),包括Java的歷史、JVM、序列化、持久化、JDBC、JSP、動(dòng)態(tài)代理、泛型、注解、日志、JMS、CAS等。第3章則偏重Web后端編程,包括HTTPS、SSO、OAuth、RPC、SOA、微服務(wù)、HTTP服務(wù)器的原理、緩存、分布式一致性算法、高可用性、數(shù)據(jù)庫(kù)讀寫分離等。第4章講解代碼管理的本質(zhì),包括各種源碼管理工具(SVN, Git)的原理,Ant和Maven的原理,如何做單元測(cè)試,爛代碼的產(chǎn)生等。第5章講述了JavaScript的歷史、Node.js的原理、程序的鏈接、命令式和聲明式的區(qū)別以及作者十多年來使用過的各種編程語言的感受。第6章是作者的經(jīng)驗(yàn)總結(jié)和心得體會(huì),包括職場(chǎng)發(fā)展的注意事項(xiàng)、作為架構(gòu)師的感想、寫作的好處等。
劉欣(@碼農(nóng)翻身):15年的軟件行業(yè)從業(yè)經(jīng)驗(yàn),前IBM系統(tǒng)架構(gòu)師,擅長(zhǎng)企業(yè)應(yīng)用架構(gòu)和設(shè)計(jì),領(lǐng)導(dǎo)過多個(gè)企業(yè)級(jí)應(yīng)用架構(gòu)設(shè)計(jì)和開發(fā)工作。
第1章 計(jì)算機(jī)的世界你不懂 1
1.1 我是一個(gè)線程 1
初生牛犢 1
漸入佳境 4
虎口脫險(xiǎn) 5
江湖再見 8
1.2 TCP/IP之大明內(nèi)閣 9
1.3 TCP/IP之大明郵差 12
1.4 CPU阿甘 17
啟動(dòng) 17
運(yùn)行 18
新裝備:緩存 19
自我提升:流水線 20
1.5 我是一個(gè)進(jìn)程 21
批處理系統(tǒng) 22
多道程序 22
地址重定位 24
分時(shí)系統(tǒng) 26
分塊裝入內(nèi)存 27
虛擬內(nèi)存:分頁 28
分段 分頁 30
程序的裝載 31
線程 35
1.6 我是一塊硬盤 36
內(nèi)部結(jié)構(gòu) 37
文件 38
文件的存放 39
管理空閑塊 44
文件系統(tǒng) 45
1.7 我是一個(gè)鍵盤 46
二等公民 46
總線和端口 47
輪詢(程序式I/O) 48
中斷 49
DMA 50
1.8 數(shù)據(jù)庫(kù)的奇妙之旅 51
無紙化辦公 51
數(shù)據(jù)的冗余和不一致 52
李氏查詢 52
并發(fā)訪問 54
原子性問題 56
安全 58
1.9 搞清楚Socket 59
1.10 從1加到100:一道簡(jiǎn)單的數(shù)學(xué)題挑戰(zhàn)一下你的大腦 64
CPU和內(nèi)存 64
從1加到100 65
熱身 65
正式出發(fā) 65
1.11 一個(gè)翻譯家族的發(fā)家史 68
機(jī)器語言 68
匯編語言 69
高級(jí)語言 70
1.12 編程世界的那把鎖 74
共享變量惹的禍 74
爭(zhēng)搶吧,線程 75
改進(jìn) 76
信號(hào)量 77
1.13 繞不開的加法器 81
1.14 遞歸那點(diǎn)事兒 85
第2章 Java帝國(guó) 91
2.1 Java:一個(gè)帝國(guó)的誕生 91
C語言帝國(guó)的統(tǒng)治 91
反抗 92
一鳴驚人 93
開拓疆土 93
帝國(guó)的誕生 94
2.2 我是一個(gè)Java Class 96
陌生警察 96
刺探信息 97
初識(shí)虛擬機(jī) 98
快樂假期 102
真相大白 103
2.3 持久化:Java帝國(guó)反擊戰(zhàn) 104
斷電的威脅 104
數(shù)據(jù)庫(kù)聯(lián)合酋長(zhǎng)國(guó) 105
表面風(fēng)光的EJB 106
輕量級(jí)O/R Mapping框架 106
帝國(guó)的反擊 107
2.4 JDBC的誕生 108
談判 108
統(tǒng)一接口 110
面向接口編程 111
簡(jiǎn)單工廠 112
數(shù)據(jù)驅(qū)動(dòng) 114
工廠方法 115
2.5 Java帝國(guó)之宮廷內(nèi)斗 119
JDBC大臣 119
密謀 120
兩階段提交 121
JTA 123
塞翁失馬,焉知非福 124
基本可用 125
走漏風(fēng)聲 127
宮廷激辯 128
2.6 JSP:一個(gè)裝配工的沒落 131
黑暗歲月 131
服務(wù)器端動(dòng)態(tài)頁面 132
標(biāo)簽庫(kù) 134
模板引擎 134
草根攪局 135
2.7 Java 帝國(guó)之消息隊(duì)列 137
張家村的歷史 137
拆分 138
新問題 139
消息隊(duì)列 139
互不兼容的MQ 140
消息隊(duì)列接口設(shè)計(jì) 141
配置和代碼的分離 143
再次抽象 144
2.8 Java帝國(guó)之動(dòng)態(tài)代理 147
深夜奏對(duì) 147
明察暗訪 149
Java 動(dòng)態(tài)代理 150
2.9 Java注解是怎么成功上位的 153
XML大臣 153
安翰林獻(xiàn)計(jì) 154
早朝爭(zhēng)斗 157
2.10 Java帝國(guó)之泛型 159
新王登基 159
C 使者 159
泛型實(shí)現(xiàn) 162
泛型方法 163
泛型和繼承 164
2.11 一個(gè)著名的日志系統(tǒng)是怎么設(shè)計(jì)出來的 166
前言 166
張家村 167
小張的設(shè)計(jì) 167
正交性 170
Log4j 171
尾聲 171
2.12 序列化:一個(gè)老家伙的咸魚翻身 172
寒冬的蟄伏 172
XML和JSON的挑戰(zhàn) 173
新協(xié)議的崛起 175
2.13 加鎖還是不加鎖,這是一個(gè)問題 176
互斥鎖 176
要不要加鎖 177
CAS的擴(kuò)展 179
2.14 Spring 的本質(zhì) 182
問題來源 183
設(shè)計(jì)模式:模板方法 184
設(shè)計(jì)模式:裝飾者 186
AOP 187
實(shí)現(xiàn)AOP 188
對(duì)象的創(chuàng)建 189
IoC與DI 191
第3章 浪潮之巔的Web 192
3.1 Web的起源 192
3.2 兩個(gè)程序的愛情故事 195
好感 195
分離 196
網(wǎng)絡(luò) 197
Web 198
3.3 一個(gè)故事講完HTTPS 199
總有一種被偷窺的感覺 199
RSA:非對(duì)稱加密 200
非對(duì)稱加密 對(duì)稱加密 202
中間人劫持 202
你到底是誰 203
HTTPS 206
3.4 機(jī)房夜話 207
第一夜 207
第二夜 209
第三夜 211
3.5 從密碼到token,一個(gè)有關(guān)授權(quán)的故事 215
我把密碼獻(xiàn)給你 215
token 216
授權(quán)碼 token 218
后記 220
3.6 后端風(fēng)云 220
數(shù)據(jù)庫(kù)老頭兒 220
危機(jī) 221
黨委擴(kuò)大會(huì)議 221
分家 223
Redis 224
余數(shù)算法 227
一致性Hash算法 229
Hash槽 (Hash Slot) 233
故障轉(zhuǎn)移 235
高可用的Nginx 237
高可用的Tomcat 238
數(shù)據(jù)庫(kù)的讀寫分離 240
3.7 我是一個(gè)函數(shù) 243
3.8 從SOA到微服務(wù) 246
3.9 什么是框架 249
3.10 HTTP Server:一個(gè)差生的逆襲 252
HTTP Server 1.0 252
HTTP Server 2.0:多進(jìn)程 253
HTTP Server 3.0:select模型 254
HTTP Server 4.0:epoll模型 255
第4章 代碼管理那些事兒 258
4.1 版本管理簡(jiǎn)史 258
“人肉” 版本管理 258
鎖定文件:避免互相覆蓋 259
允許沖突:退一步海闊天空 260
分支:多版本并行 261
分布式管理:給程序員放權(quán) 262
程序員也愛社交 264
4.2 Build的演進(jìn)之路 265
手工Build的煩惱 265
自動(dòng)化Build 267
Java 與 XML 268
消除重復(fù) 270
4.3 爛代碼傳奇 275
4.4 敏捷下的單元測(cè)試 277
敏捷運(yùn)動(dòng) 277
困惑 278
討論 279
一年以后 280
4.5 再見!Bug 281
第5章 我的編程語言簡(jiǎn)史 284
5.1 JavaScript :一個(gè)草根的逆襲 284
出世 284
成長(zhǎng) 286
第一桶金 288
發(fā)明JSON 289
人生巔峰 291
5.2 Node.js:我只需要一個(gè)店小二 292
5.3 C老頭兒和Java小子的硬盤夜話 295
5.4 編程語言的“愛恨情仇” 300
讓人懷疑的C 語言 300
被忘卻的 VB & Visual FoxPro 301
蹂躪我的C 302
賴以謀生的Java 303
優(yōu)雅的Ruby 304
5.5 命令式編程 VS 聲明式編程 306
一則小故事 306
命令式編程 306
聲明式編程 307
第6章 老司機(jī)的精進(jìn) 309
6.1 凡事必先騎上虎背,和性格內(nèi)向的程序員聊幾句 309
6.2 碼農(nóng)需要知道的“潛規(guī)則” 311
上帝的規(guī)矩:局部性原理 311
坐飛機(jī)的怎么和坐驢車的打交道:緩存 311
拋棄細(xì)節(jié):抽象 312
我只想和鄰居打交道:分層 312
我怕等不及:異步調(diào)用 313
大事化小,小事化了:分而治之 314
6.3 15年編程生涯,一名架構(gòu)師的總結(jié) 314
好奇心 315
養(yǎng)成計(jì)算機(jī)的思維方式 315
扎實(shí)基礎(chǔ),融會(huì)貫通 317
要透徹地理解一門技術(shù)的本質(zhì) 317
能寫漂亮的代碼 318
抽象的能力 319
技術(shù)領(lǐng)導(dǎo)力 319
6.4 對(duì)自己狠一點(diǎn),開始寫作吧 320
6.5 學(xué)習(xí)編程的四兄弟 322
搖擺不定的老大 322
“小倉(cāng)鼠”老二 322
不看書的老三 323
半途而廢的老四 323