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