2018讀書總結
前言
馬上過年了,迫於買了kindle & kindle ultimate,今年看了很多書,看完之後如果不寫點總結有點遺憾,趁週末寫下讀後感。
我看的書書書書書書書
專業書
《程式碼大全》
不要被名字騙了,這本書英文名《Code Complete》,'complete'意為完整,完成,完備.'code complelte'即完備的程式碼
,它並不是程式碼的百科全書,而是教你如何寫出工程化,規範化,遵循最佳實踐的程式碼.初入公司時寫出的程式碼,emm...屎一樣,現在一直看書+實踐,好了很多。
恰當的命名十分重要 智力上的可管理性,隱藏的資訊越多同一時間需要考慮的資訊就越少. 寫出為什麼這麼做,而不是怎麼做的 個人實踐,十分有效
一本值得反覆閱讀
的書,可能明年會翻出來再看一遍
《Java併發程式設計的藝術》
Java併發程式設計的底層原理和實現,國人寫的書,本來只是因為kindle uiltimate 免費才隨便看看,看到第三章就徹底被吸引了.完完整整看了三四遍,推薦觀看,尤其是第三章,全書的精華
Doug Lea
個人強烈推薦,準備買本實體書收藏
《重構》
如何安全的改造老程式碼? 看它就對了.這本書的內容和《程式碼大全》有很大一部分重疊,比如命名和提取子函式,但它更著重於如何安全的改造舊程式碼
,這一點是很多像我一樣的新手容易忽略的。
看這本書也是有起因的: 之前有一個功能是我來做的,上線之後雖然能跑,但是邏輯太亂,程式碼太爛,就在空閒時間改了很多,交給大佬審得到的回覆是:你這完全是重寫,不是重構
,之後就一直思考這個問題,直到看到這本書,才明白重構的真正意義:改造程式碼使其邏輯更清晰,程式碼更整潔是重構的一個目的,改造後的程式碼可以正常執行是更重要的目的,如果不滿足第二個條件,恭喜,又一個背鍋俠誕生了
《編寫可讀程式碼的藝術》
相當於《程式碼大全》的一個子集,比較獨特的是它把可讀程式碼的編寫分為了幾個層級
- 表面層次的改進——命名和註釋
- 簡化迴圈和邏輯——控制流和表示式拆分
- 重新組織程式碼——提取子函式
- 易於測試的程式碼——TDD
印象已經不太深了,可以作為程式碼大全的進階讀本
《高效能MySQL》
只學到了這本書的20%,不過對於開發來說,足夠了
最左字首索引原則
《Maven實戰》
一本很好的工具書,看完之後對maven的原理基本理解了,作者為了湊字數強加了很多程式碼,可以跳過。必看
- 構件(maven中的術語,比如log4j就是一個構件)的定位原理
-
依賴管理——scope的含義,依賴傳遞的處理以及依賴衝突的解決辦法,
一定多看幾遍,你會用到的
-
超級pom:‘兒子,我是你爸爸’——maven一直說約定大於配置,'約定'就在
超級pom
裡,所有pom都繼承自超級pom,如果有一些預設配置你不清楚,去超級pom裡看下就明白了 -
生命週期-resource,compile,test-resource,test-compile,test,jar,install。
外掛和生命週期的繫結
以及外掛簡寫是如何解析的(mvn compile 這裡的compile就是外掛簡寫)
- dependencyManagement——按需對依賴版本進行管理,如果你的專案有多個模組,記得看下
- 模組的繼承和組合——繼承-爸爸不知道兒子,兒子知道爸爸。組合-爸爸知道兒子,兒子不知道爸爸。
- 構件倉庫/外掛倉庫&映象——在國內不知道怎麼設定映象,拉取速度會讓你痛苦的
《深入理解Java虛擬機器》
JVM方面這本算是必備書,針對JDK7。有些內容如新生代老年代不太適用目前版本的JDK。大致有這幾塊
-
JVM中的記憶體劃分
- 共享——堆,方法區
- 私有——虛擬機器棧,本地方法棧,程式計數器
-
GC
- 物件還活著嗎?——引用計數法和可達性分析演算法
- Java卡頓的原因-GC時stop the world
- GC演算法——標記-清理,複製,標記-整理
-
新生代——大多數物件朝生夕死,使用
複製
演算法快速回收 -
老年代——少數物件生存時間長,使用
標記-整理
和標記-清理
回收 -
新生代收集器——
Serial
,ParNew
,Parallel Scavenge
-
老年代收集器——
Serial Old
,Parallel Old
,CMS(目前最常用)
-
JDK7時的前沿收集器——G1,
可預測的停頓
,並行
,分代整理
。整體基於“標記-整理”演算法,區域性(兩個Region)基於複製演算法
-
類載入
以上階段可能交替進行
-
JVM的各種神優化
- 編譯期優化——在原始碼翻譯到位元組碼時起作用,舉個比較有趣的:解語法糖,詬病已久的以擦出為基礎的範型的底層原理,foreach在位元組碼中表示,已經自動裝箱拆箱。
-
執行期優化—— 解釋執行和編譯執行,編譯執行的不同級別
C1
,C2
.JIT(just in time)
即時編譯器和熱點程式碼
- 各種優化術語——延遲編譯,分層編譯,棧上替換,樂觀判斷,分支預測,公共子表示式消除,逃逸分析,鎖消除。。。。等等,第一次看到這些名詞可能不明覺厲,不要害怕,認真讀一遍,很多技術後面的思想都是很簡單的(這並不代表實現很簡單)
有興趣可以看下我之前寫的幾篇相關文章JVM專題
《Go語言實戰》
Go很火,自己私下也使用過,找了這本書,看了一遍,結合對底層原理的理解終於明白:Go火起來時有道理的
直接決定了它們使用的記憶體模型
參見之前寫過的一篇Go語言之思
《精通正則表示式》
正則表示式基礎,介紹了正則表示式的流派和它背後的原理,看過兩個月後80%的內容都忘了,印象最深刻的就是環視
,推薦快速過一遍,瞭解下原理就可以,以後用到知道往哪方面找。
《敏捷軟體開發(原則模式與實踐)》
經典,過了一遍,第一次覺得結對程式設計是真實存在並且有效的,快速設計,快速反饋,快速修改以及TDD,領略到了不一樣的風采。
《Java8實戰》
十分有用,lambda,Stream,Optional更是重點
,之前Stream用的挺多,大都是filter,map,collect一把梭,用的很爽然而沒有什麼提升。看這本書期間正好在做一個版本,現學現賣,都用了上去,程式碼量減了不少,語義也更清晰
,以前想試下設計模式,奈何都要搞一個繼承體系(如模版方法),得不償失,有了lambda終於試了一下,感覺良好。
-
lambda的語法—— ([ArgType arg...])->[{[return] }],lambda中很多語法組成都是可選的,這也是lambda的目標:
儘可能的簡潔
-
lambda的匹配規則——鴨子型別,如果它走起來像鴨子,叫起來像鴨子(實現了介面要的方法),它就是一隻鴨子(可以被賦值給介面的值)
,這點和Go挺像的
3.Stream的高階使用——分組,多級分組,partitionBy,collect()的自定義使用。如果使用恰當,程式碼可以從幾十行縮減到1行,並且語義更清晰。 - 不要濫用parallel,參見不要濫用parallel
-
Optional,null的另一種解決方案,提升程式碼的流暢度,對於
程式碼語義
真的意義重大
有興趣可以再看下這篇工作覆盤,有一部分講了怎麼實踐的
閒書
《自控力》
個人學到最重要的:學會原諒自己&及時行樂。
《非暴力溝通》
emm,挺有意思的一本書,相比於書中的語言,我們平時溝通確實算的上暴力溝通
《男人來自火星,女人來自金星》
男女之間有些差異很神奇!作者研究的很透徹,從他的對男人的描述中,可以看到自己的影子,可惜的是,看完之後,還是不知道怎麼哄女朋友。
《無聲告白》
be yourself!live for your own。
《系統之美》
簡單點說,強迫自己看的,只能說不太適合我,唯一get到的就是正反饋和負反饋。
《人間失格》
致鬱系的書,看了一章,看著很扎心。
《給投資新手的極簡股票課》
兩個小時看完,對股票沒那麼多的誤會了(沒區別,我又不會買股票,23333)
《碼農翻身》
劉欣劉大的書,用故事講技術,通俗易懂又不失深度,強推。
明年準備看的書
- 《CSAPP》大三看到第三章停了,不求全理解,只希望能過一遍
- 《演算法4》 演算法一直是心中之痛,一直不得其法,完整看一遍,把基本演算法記下來
- 《SICP》 Lisp,讓我體會一下函數語言程式設計的魅力吧
後記
終身學習。