相關文章
欄目分類 classification
提高 C++編程技術7種可靠方法推薦
有 7 種方法幫助你利用夏天真正提高 C++。之后我會給你一些小技巧來幫助你真正實現(xiàn)所選的目標。
在我去年的夏季項目中,我實現(xiàn)了一些區(qū)間適配器,這讓我學到了超多東西。所以我會把這個項目的細節(jié)告訴你,這樣你能夠得到一些靈感來構建你自己的項目:
如果你在這種項目上有任何需要幫助的地方,我都愿意效勞。另外我在這個項目上的所有嘗試都寫在 GitHub 的代碼倉庫中了,希望對你們有用。
如果你還沒有讀過《代碼大全》,你應該去看看 Scott Meyers 的《Effective C++》。我建議《Effective C++》要讀兩遍。我已經(jīng)讀過三遍了,但是我想兩遍的效果應該一樣好。盡管這本書是在 C++11 之前寫的,但是大部分內(nèi)容在今天也仍然是有用的。而且《Effective Modern C++》涵蓋了C++11 和 C++14 中的特性,可以作為這本書的補充材料。
今年夏天我要看的是 Eric Evans 的著名書籍——《領域驅動設計》(Domain Driven Design)!额I域驅動設計》涵蓋了領域專家和開發(fā)人員之間的密集交流,建立領域模型以及在討論模型與代碼時使用同一種語言。
盡管這本書的內(nèi)容很有價值,但是讀起來并不容易。我發(fā)現(xiàn)一個有用的小技巧:對每一小節(jié)先讀第一段,再讀最后一段,最后讀其余部分。這樣你能更好地理解作者的寫作方向,節(jié)省時間。
我希望通過顯示代碼中的域,來找到使代碼具有表達性的靈感。當然啦,我會在博客上分享這些靈感的。
這只是一個選擇,我還會做一個更全面的書單。
新的觀點認為,其他編程語言會讓你對編程有更一般的理解。由于你太熟悉自己所用的語言,往往會忽略它的特性,而用不同的方法解決問題能夠使這些特性凸顯出來。即使你不會使用新語言來寫產(chǎn)品代碼,所接觸到的新概念也能為你提供可以應用到主語言中的思路。
如果你用的是 C++,那么我推薦你去學習一下 Haskell 語言。Haskell 是一種函數(shù)型編程語言。如果你還沒有試用過函數(shù)型編程,那么你能從它的概念中獲得啟發(fā),并從新的角度看待 C++,尤其是 STL。
我已經(jīng)花了很長時間比較網(wǎng)絡上各種學習 Haskell 的資源。2013 年(單指那一年)賓夕法尼亞大學的課程是我找到的最好的資源。它解釋得很清楚,沒有太多理論,課程練習也很良心而且有指導性,并且它還是免費的。
一旦你學完這門課程,你可以在 data61 課程中獲得很多 Haskell 的練習,包括填空補充代碼。你能夠通過這些練習來整理不尋常的函數(shù)型編程的相關知識。
如果你想了解更多函數(shù)型編程語言以及它們在 C++中的應用,我推薦 Quentin Duval 的博客:deque.blog。
今年夏天我要學習的語言是 Lisp 。我明白它是一種非常強大的語言,能夠全面提升對編程的理解。一些語言是從它衍生出來的。它不會消失一定是有原因的!
我還沒有完成對網(wǎng)上資源的調(diào)查,但是我計劃使用《計算機程序的構造和解釋》(Structure and Interpretation of Computer Programs)。如果你有任何關于學習 Lisp 的想法,請告訴我!
我正在整理幫你掌握 STL 的資料,叫做 STL 學習資源。還沒有完成,但是有很大一部分已經(jīng)做完了,我想足夠讓你在這個夏天的大部分時間都很充實了。
有些特性很好掌握,比如 lambdas。盡管精通 lambda 表達式需要掌握很多細節(jié)上的東西,但是學會它們的基礎用法不需要花太多精力。
所以部分特性很好理解,只需要一些好資源和時間來熟悉它們。比如 Scott Meyers 的《Effective Modern C++》(見上面的第2點)涵蓋了 C++11和 C++14 的大部分特性。
我特別喜歡Bartek博客上的一份 C++17 特性列表,它可以幫你快速上手 C++17 新特性。內(nèi)容詳實,而且你可以通過給一個特定的特性添加信息來貢獻自己的一份力量。Bartolomiej 提供了所有的資源和 Github 權限,所以你能夠非常輕松地添加信息。這樣即使你還不了解 C++17 也能夠貢獻自己的力量,并且在這個過程中學到很多東西。
如果你不練習的話,是無法理解很多特性的。尤其是變參模板,它是現(xiàn)代標準 C++ 的一個重要特性。上面第一點中的項目和其他任何包含變參模板的項目都可以作為練習。
了解 Boost 的內(nèi)容很重要。有兩個原因:第一,在代碼中確實需要它們,因為 boost 主要應用于綜合使用;第二,更重要的原因是即使你在產(chǎn)品代碼中沒有使用 boost,它可以給你一個通用的精心設計的 API 和 C++ 代碼模型。留心 boost 中的內(nèi)容可以給你自己的設計帶來靈感。
學習大量的 boost 庫的一個方法是閱讀 Boris Schäling 的書——《The boost C++ Libraries》。這本書有電子版,但是紙質版可以放進沙灘包供你躺在沙灘上閱讀(真的,我去年夏天就讀的這本書)。不過這本書是基于 boost 1.55.0 的,所以它包含了很多庫,但并不是所有。
特別地,它沒有包含 Boost Hana。Boost Hana 是一個流行的現(xiàn)代 C++ 元程序庫。實際上,學習 Boost Hana 可以作為今年夏天的一個目標。
我詢問了 Louis Dionne(Boost Hana 的創(chuàng)始人)怎么樣才能有效地學習 Boost Hana。從官方指導入手是一個好的開始,而且你可以看他的 ACCU 演講(或者Meeting C++ keynote,內(nèi)容相似)來獲取初步的介紹。這里是 Louis 的所有演講,大多數(shù)都與元編程和 HANA 有關,可以幫助加深你的了解。
下面是一些我覺得有近期指導性的演講:
1)開始一個項目
用 C++ 來建一個你自己的小項目是一個很好的試驗方法,而且能通過這個項目真正理解程序的運行。另一個優(yōu)點在于你可以完全自由地決定使用什么組件。這樣你能夠提升這一年沒有權限/時間使用的語言特性和庫組件。在我去年的夏季項目中,我實現(xiàn)了一些區(qū)間適配器,這讓我學到了超多東西。所以我會把這個項目的細節(jié)告訴你,這樣你能夠得到一些靈感來構建你自己的項目:
- 如果你不熟悉 C++ 中的區(qū)間(Ranges),請參考《Ranges: the STL to the Next Level》
- 實現(xiàn) transform_iterator,
- 實現(xiàn)變換區(qū)間適配器(transform range adaptor),
- 實現(xiàn) filter_iterator,
- 實現(xiàn)篩選區(qū)間適配器(filter range adaptor),
- 實現(xiàn) zip 適配器(zip adaptor),然后結合變換區(qū)間適配器使用。Zip 適配器需要兩個區(qū)間,并且返回到來自這兩個區(qū)間的成對對象的視圖
- 為 zip 適配器一般化,要令 zip 適配器能夠使用任意數(shù)量的區(qū)間,
- 實現(xiàn)笛卡爾積區(qū)間適配器(Cartesian product range adaptor),
- 實現(xiàn)你自己的新區(qū)間適配器!
- 明確理解區(qū)間,而區(qū)間是當下一個非常流行的 C++ 特性,
- 練習變參模板(variadic templates)的使用,
- 初步接觸模板元編程(template metaprogramming),
如果你在這種項目上有任何需要幫助的地方,我都愿意效勞。另外我在這個項目上的所有嘗試都寫在 GitHub 的代碼倉庫中了,希望對你們有用。
2)讀一本好書
我會發(fā)布一個 C++ 的書單,但是我現(xiàn)在要給你一個選擇。我認為作為一個程序員要讀的第一本書就是 Steve McConnell 的《代碼大全》。盡管這本書不是專注于 C++ 的,但是它把寫好代碼要注意的幾乎所有方面都教給你了。從寫一個 if 語句(沒錯,有好多方法把 if 語句搞砸)到分配類責任,再到代碼審查,《代碼大全》涵蓋了軟件架構的所有方面。在讀完這本書以后你永遠不會還用一樣的方法來編程。如果你還沒有讀過《代碼大全》,你應該去看看 Scott Meyers 的《Effective C++》。我建議《Effective C++》要讀兩遍。我已經(jīng)讀過三遍了,但是我想兩遍的效果應該一樣好。盡管這本書是在 C++11 之前寫的,但是大部分內(nèi)容在今天也仍然是有用的。而且《Effective Modern C++》涵蓋了C++11 和 C++14 中的特性,可以作為這本書的補充材料。
今年夏天我要看的是 Eric Evans 的著名書籍——《領域驅動設計》(Domain Driven Design)!额I域驅動設計》涵蓋了領域專家和開發(fā)人員之間的密集交流,建立領域模型以及在討論模型與代碼時使用同一種語言。
盡管這本書的內(nèi)容很有價值,但是讀起來并不容易。我發(fā)現(xiàn)一個有用的小技巧:對每一小節(jié)先讀第一段,再讀最后一段,最后讀其余部分。這樣你能更好地理解作者的寫作方向,節(jié)省時間。
我希望通過顯示代碼中的域,來找到使代碼具有表達性的靈感。當然啦,我會在博客上分享這些靈感的。
這只是一個選擇,我還會做一個更全面的書單。
3)學習一個新的語言
雖然聽起來很稀奇,但是學習一種新的語言可以讓你對你所的專注語言獲得更深層次的理解,而且是最有效的方法之一。并且新的語言和你自己使用的語言差別越大,效果越好。新的觀點認為,其他編程語言會讓你對編程有更一般的理解。由于你太熟悉自己所用的語言,往往會忽略它的特性,而用不同的方法解決問題能夠使這些特性凸顯出來。即使你不會使用新語言來寫產(chǎn)品代碼,所接觸到的新概念也能為你提供可以應用到主語言中的思路。
如果你用的是 C++,那么我推薦你去學習一下 Haskell 語言。Haskell 是一種函數(shù)型編程語言。如果你還沒有試用過函數(shù)型編程,那么你能從它的概念中獲得啟發(fā),并從新的角度看待 C++,尤其是 STL。
我已經(jīng)花了很長時間比較網(wǎng)絡上各種學習 Haskell 的資源。2013 年(單指那一年)賓夕法尼亞大學的課程是我找到的最好的資源。它解釋得很清楚,沒有太多理論,課程練習也很良心而且有指導性,并且它還是免費的。
一旦你學完這門課程,你可以在 data61 課程中獲得很多 Haskell 的練習,包括填空補充代碼。你能夠通過這些練習來整理不尋常的函數(shù)型編程的相關知識。
如果你想了解更多函數(shù)型編程語言以及它們在 C++中的應用,我推薦 Quentin Duval 的博客:deque.blog。
今年夏天我要學習的語言是 Lisp 。我明白它是一種非常強大的語言,能夠全面提升對編程的理解。一些語言是從它衍生出來的。它不會消失一定是有原因的!
我還沒有完成對網(wǎng)上資源的調(diào)查,但是我計劃使用《計算機程序的構造和解釋》(Structure and Interpretation of Computer Programs)。如果你有任何關于學習 Lisp 的想法,請告訴我!
4)提升使用 STL 的能力
STL 是 C++ 中處理容器和算法的部分。它很強大而且并不難用,卻沒有它應有的名氣。要想掌握 STL 需要有相當?shù)闹R積累,但是這是值得的。它是一個神奇的方法,能使你的 C++ 代碼更具有表達性也更健壯。我正在整理幫你掌握 STL 的資料,叫做 STL 學習資源。還沒有完成,但是有很大一部分已經(jīng)做完了,我想足夠讓你在這個夏天的大部分時間都很充實了。
5)緊跟現(xiàn)代C++的特性
C++11,C++14 和C++17給C++ 和標準庫帶來了很多新的特性。即使你現(xiàn)在,比如今年夏天,沒有在產(chǎn)品代碼中使用它們,它們也都來了。并且你可以立即把它們應用在你的項目中(看上面的第1條)。有些特性很好掌握,比如 lambdas。盡管精通 lambda 表達式需要掌握很多細節(jié)上的東西,但是學會它們的基礎用法不需要花太多精力。
所以部分特性很好理解,只需要一些好資源和時間來熟悉它們。比如 Scott Meyers 的《Effective Modern C++》(見上面的第2點)涵蓋了 C++11和 C++14 的大部分特性。
我特別喜歡Bartek博客上的一份 C++17 特性列表,它可以幫你快速上手 C++17 新特性。內(nèi)容詳實,而且你可以通過給一個特定的特性添加信息來貢獻自己的一份力量。Bartolomiej 提供了所有的資源和 Github 權限,所以你能夠非常輕松地添加信息。這樣即使你還不了解 C++17 也能夠貢獻自己的力量,并且在這個過程中學到很多東西。
如果你不練習的話,是無法理解很多特性的。尤其是變參模板,它是現(xiàn)代標準 C++ 的一個重要特性。上面第一點中的項目和其他任何包含變參模板的項目都可以作為練習。
6)提高你對 boost 的了解
Boost 是設計良好的 C++ 庫的集合,可移植且開源。很多現(xiàn)代 C++ 的特性都源自 Boost。了解 Boost 的內(nèi)容很重要。有兩個原因:第一,在代碼中確實需要它們,因為 boost 主要應用于綜合使用;第二,更重要的原因是即使你在產(chǎn)品代碼中沒有使用 boost,它可以給你一個通用的精心設計的 API 和 C++ 代碼模型。留心 boost 中的內(nèi)容可以給你自己的設計帶來靈感。
學習大量的 boost 庫的一個方法是閱讀 Boris Schäling 的書——《The boost C++ Libraries》。這本書有電子版,但是紙質版可以放進沙灘包供你躺在沙灘上閱讀(真的,我去年夏天就讀的這本書)。不過這本書是基于 boost 1.55.0 的,所以它包含了很多庫,但并不是所有。
特別地,它沒有包含 Boost Hana。Boost Hana 是一個流行的現(xiàn)代 C++ 元程序庫。實際上,學習 Boost Hana 可以作為今年夏天的一個目標。
我詢問了 Louis Dionne(Boost Hana 的創(chuàng)始人)怎么樣才能有效地學習 Boost Hana。從官方指導入手是一個好的開始,而且你可以看他的 ACCU 演講(或者Meeting C++ keynote,內(nèi)容相似)來獲取初步的介紹。這里是 Louis 的所有演講,大多數(shù)都與元編程和 HANA 有關,可以幫助加深你的了解。
7)觀看網(wǎng)絡視頻
C++ 社區(qū)上有超多網(wǎng)絡視頻,尤其是年會的視頻。今年夏天是觀看這些視頻的好時機。下面是一些我覺得有近期指導性的演講:
- Patrice Roy – 異常處理(The Exception Situation)。這個演講讓你對在 C++ 中使用異常處理對你的代碼意味著什么有一個大致了解。該演講結構合理,而且 Patrice 的演講風格很讓人愉快。
- Arthur O’Dwyer – Template Normal Programming。在這個演講中,Arthur 在不用模板元編程的情況下,展示了關于模板的所有知識,同樣有板有眼。
- Stephan T. Lavave – tuple<>:新特點以及它的用法(tuple<>: What’s New and How it Works)。這里有很多關于 tuples 的有用信息和練習幫助你更了解標準庫。
- Howard Hinnant – chrono 導論(A <chrono> Tutorial)。這個演講教你使用 chrono 庫,告訴你它是怎么用強類型來完成安全又表達清楚的代碼。
- David Sankel – Monoids, Monads, and Applicative Functors: Repeated Software Patterns。David Sankel 展示了純函數(shù)概念如何應用于 C++。
- David Sankel – Variants:過去,現(xiàn)在和未來(Variants: Past, Present, and Future)。一個關于 variant 的優(yōu)秀展示,并且 variant 在 C++17 中被放進標準庫里了。
- Dietmar Kühl – Constant Fun。一個關于 constexpr 的優(yōu)秀展示。
- Jason Turner – C++周刊(C++ Weekly)。在這個周系列中,Jason 制作了一些短視頻(5 到 10 分鐘),每個視頻都展示了一個 C++ 的精彩應用。我通常把這系列視頻描述為“精彩 5 分鐘”。
說點什么吧
- 全部評論(0)
還沒有評論,快來搶沙發(fā)吧!