有哪些可以提升編程技能的好書值得推薦?
本文轉(zhuǎn)載自公眾號“讀芯術(shù)”(ID:AI_Discovery)。
提高編程技術(shù)離不開大量的練習(xí),這是在專業(yè)上有所提高的唯一途徑。但在此之前,我們最好先掌握理論知識,再將其應(yīng)用于實踐,這樣你的理解會更加深刻。
在軟件開發(fā)行業(yè)中,人們常常通過閱讀文章、書籍、參加會議、嘗試新的庫、模式和范例不斷提升自我。筆者為了提高編程技能閱讀了頗多書籍,本文為你精選了一份書單,能夠幫助你編寫簡練代碼,并在職業(yè)生涯中達(dá)到新的高度。
羅伯特·塞奇威克的《算法》
這本書講解了基本的算法,如搜索、排序和繪圖等。計算機(jī)科學(xué)的所有學(xué)生都要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法,這是該領(lǐng)域最基礎(chǔ)的部分。
本書中會解釋搜索功能的實現(xiàn)和各種排序算法之間的差異。其中有一節(jié)是關(guān)于圖論的,讀完之后,你將清楚如何遍歷樹并找到最短的路徑。認(rèn)識這些算法并應(yīng)用它們,會對你下次的求職面試大有益處。一位有經(jīng)驗的軟件工程師需要有能力在特定的情況下使用合適的算法,并預(yù)知其性能。
如果你不喜歡讀文字而更喜歡聽課,Coursera 上有一門由該書作者提供的免費課程值得一看。(https://www.coursera.org/learn/algorithms-part1)
史蒂夫·麥康奈爾的《代碼大全》
合上這本書時,筆者驚訝于自己從未聽人解釋過其中一些至關(guān)重要的基本概念。下面舉幾個例子。
例如,只在需要使用變量的地方聲明和初始化變量;不需要聲明變量時,只需要在代碼中賦值。變量應(yīng)該具有最低可見范圍,這樣做的好處是代碼的可讀性會得到很大的提高,隊友將對此感激不盡。
另一個例子是如何有效地使用if 條件。它們用起來很簡單,但能顯著降低代碼的可讀性。
- if (paymentComplete) {
- if (errorCode != 0) {
- ...
- } elseif(errorCode ==422) {
- ...
- } else {
- if (showError) {
- ...
- } else {
- ...
- }
- }
- } else {
- ...
- }
示例中嵌套了太多的if條件,難以遵循和測試其邏輯。在學(xué)習(xí)編程時,人們總是關(guān)注if 條件如何工作以及何時使用,但沒有人告知我們它被濫用的情況。本書對此給出了一些建議:避免太多嵌套塊,考慮將代碼分解為函數(shù),并檢查 switch..case 語句是否合適(編程語言是否支持)。
尼爾·福特的《功能的思考》
據(jù)維基百科,第一種函數(shù)式編程語言是在20世紀(jì)50年代后期開發(fā)出來的。從那時起,函數(shù)式編程的范例逐漸普及起來。這意味著數(shù)據(jù)開始通過函數(shù)進(jìn)行轉(zhuǎn)換,可以組成多層級數(shù)據(jù)。
不過,對初級開發(fā)人員而言,構(gòu)建無狀態(tài)序列很難。即使是對于經(jīng)驗豐富但從未使用過函數(shù)式編程的開發(fā)人員來說,編寫高效且可維護(hù)的函數(shù)代碼也是一個挑戰(zhàn)。下面是科特林中對偶數(shù)的平方求和的例子:
- val input = listOf(1, 2, 3, 4, 5, 6)
- val result = input.filter { it % 2 == 0 }
- .map { it * it }
- .sum()
我們可以通過一般的聲明式的方法完成,但這需要編寫一些循環(huán)并保存其中間狀態(tài)。以功能性的方式編寫代碼更簡單清晰并愈發(fā)無狀態(tài)。除此之外,認(rèn)識到函數(shù)的順序在性能中的作用很重要??纯词纠?,當(dāng)前面調(diào)用 filter() 方法時,后面的函數(shù)已經(jīng)在較小的數(shù)據(jù)集上操作了。
這本書解釋了最普及的函數(shù),并介紹了該如何有效地應(yīng)用它們,以及如何以函數(shù)的方式編寫簡潔的代碼。本書適合已經(jīng)具有一些編碼經(jīng)驗的開發(fā)人員。
圖源:unsplash
軟件工程領(lǐng)域從不缺少好書,筆者推薦的這三本書也是可以找到替代品的。但讀完文中這些,足以讓你交付可讀可伸縮的代碼了。