mirror of
https://github.com/cheetahlou/CategoryResourceRepost.git
synced 2025-11-15 21:53:49 +08:00
mod
This commit is contained in:
117
极客时间专栏/现代C++实战30讲/新年特别策划/新春寄语 | 35年码龄程序员:人生漫长,走点弯路在所难免.md
Normal file
117
极客时间专栏/现代C++实战30讲/新年特别策划/新春寄语 | 35年码龄程序员:人生漫长,走点弯路在所难免.md
Normal file
@@ -0,0 +1,117 @@
|
||||
<audio id="audio" title="新春寄语 | 35年码龄程序员:人生漫长,走点弯路在所难免" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/aa/53/aa5089c532ef83a529d3bf453efeb953.mp3"></audio>
|
||||
|
||||
你好,我是吴咏炜。
|
||||
|
||||
当你读到这一讲的时候,新年已经要来临了。今天,我们就轻松点,不讲硬核的话题了。我们就一起闲聊一下如何学习编程。
|
||||
|
||||
## 我的编程生涯
|
||||
|
||||
我学习编程在我的那一代人里算是比较早的。那时候已经有了“学电脑要从娃娃抓起”的说法,所以初一时老师就给我们介绍了什么是电脑:我第一次见到的是一台 Z80 芯片的 Laser 200,连接在一台单色显示器上,有着集成的键盘,ROM 里装载着 BASIC 语言解释器,有 4 KB 内存(你没有看错单位),没有磁盘、鼠标这些我们熟悉的外设,但可以连磁带机,还可以做比计算器更复杂的计算工作!
|
||||
|
||||
我还记得我尝试的头几个程序里有一个是出十道计算题,用随机数生成题目,让用户输入答案,并在最后计算得分。记得一开始我对 `For` … `Next` 循环的语义理解还不正确,找了计算机老师帮忙才得到正确的结果。但得到想要的结果后,真是有成就感啊!
|
||||
|
||||
于是,我就被这个按键会滴滴响的破烂玩意儿迷上了,还央求爸爸妈妈花了足足 500 元大洋(那时我爸妈的月收入才 60 几元,我妈因此放弃了一条金项链……)给我买了台更先进的 Laser 310(有 18 KB 内存哎!),连在家里的老式电视机上,这直接或间接导致了我的视力在初中急剧下降。不过,我的学习成绩完全没有受到负面影响,还各科全部稳定上升,直到考进了理想的高中和大学。
|
||||
|
||||
当然,没有磁盘的 Laser 310 实在是太弱了。还好,我参加了少科站的计算机班,逐渐接触到了 Apple II 计算机,后来又接触到最早的 IBM PC,并一路学习了:
|
||||
|
||||
<li>
|
||||
<p>BASIC:当然,BASIC 还是少不了,在我们那个年代,它一直是很主流的,竞赛什么的还是常用 BASIC。Apple BASIC 和 DOS 3.3 就是我高中玩得最多的系统环境了。记得因为没有递归,在 BASIC 里写快速排序还是一件非常痛苦的事……<br>
|
||||
<img src="https://static001.geekbang.org/resource/image/4f/90/4f493489d877b49b6efc90979fe1cd90.png" alt="" title="Apple DOS 3.3 的 HELLO 程序列表"></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Logo:当时曾经热过一阵,但除了提高了我对编程的热情,似乎没记得它对我有多大的帮助。当时就只是玩玩作图而已,没有领会到它背后的编程理念。<br>
|
||||
<img src="https://static001.geekbang.org/resource/image/ba/c2/bae4aeefadfdacb0edf4b99eddc574c2.png" alt="" title="Apple Logo 的界面:有没有注意到圆不圆,方也不方?因为硬件像素点就不是正方的……"></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Pascal:比起 BASIC,绝对是一阵新鲜空气啊。从 Pascal 里,我最早领会到了什么是结构化编程。记得最初需要理解指针就是在 Pascal 里。麻烦的地方是,在 Apple II 上跑 Pascal 没有 80 列卡是十分痛苦的,而少科站只有一台机器有 80 列卡……<br>
|
||||
<img src="https://static001.geekbang.org/resource/image/14/4b/146c7e73f4ee36ea8ff796dd11650a4b.png" alt="" title="UCSD Pascal 的程序编辑界面:这里用上了 80 列卡"></p>
|
||||
</li>
|
||||
<li>
|
||||
Prolog:最初在纸面上学了点,但对我个人没有产生深远的影响。整个编程生涯里实际运行 Prolog 程序的机会都没有很多次。
|
||||
</li>
|
||||
<li>
|
||||
Lisp:学 Prolog 的时候也一起了解了。但当时只是了解了语法,而没有理解它的编程范式,也完全没有实践环境,因而没什么用。真正对 Lisp 有所领会要到多年之后捡起 Scheme 和 Racket 的时候。
|
||||
</li>
|
||||
<li>
|
||||
Forth:有段时间我很迷 Forth,但同样,因为没有实践的机会,实际上影响可以忽略不计。
|
||||
</li>
|
||||
<li>
|
||||
C:少科站计算机老师大力推荐的语言,但跟 Pascal 一样,跑起来不容易——在 Apple II 上需要插 Z80 卡跑 CP/M 操作系统才行。在 Turbo C/C++ 到来之前,没有太多机会使用。
|
||||
</li>
|
||||
<li>
|
||||
<p>C++:接触到 Turbo C++ 之后,使用 C++ 就是件顺理成章的事了。具体哪一年开始用,我已经记不清了。印象比较深刻的,是 94—95 年写毕业论文时,一开始用的是没有数学协处理器的 386,作图的时候可以看到点是一个个出来的。后来换了有协处理器的 486 后,点就是一串串地流淌出来的。<br>
|
||||
<img src="https://static001.geekbang.org/resource/image/21/0d/21dc3488debd0706a2e9e427b1ea310d.jpg" alt="" title="网上找来的 Turbo C++ 集成开发环境界面"></p>
|
||||
</li>
|
||||
|
||||
在我学习计算机的年代,一个高性能的编程语言属于实际应用的刚需,所以 C++ 成了后面非玩具项目的不二选择。大学期间肯定是花了不少时间把玩 C++ 的(依稀记得有个实验室老师希望我们有人接手他的一个 Fortran 计算代码,但没人肯上)。不过,那段时间对 C 和 C++ 的理解还是有缺陷的,再加上 DOS 下没有保护模式,也不那么容易发现错误,C++ 的路不太好走。记得曾经遇到个程序发生了空指针错误,我一直没找到原因……
|
||||
|
||||
大学之后,又陆续接触了一些其他的开发语言,如 VBScript 和 JavaScript。而我对 C++ 的理解有真正长足的进步,是在 2000—2005 那段时间。那时候,我在一家网络安全公司工作,对网络上的实时报文做高性能协议分析和内容检测,需要对网络协议、面向对象编程、系统架构都有比较好的把握。这又恰恰是互联网越来越成熟、走进大众生活的年代,网上的开发资源也愈见增多。我那时在 Windows 上开发 Linux 应用程序,为了方便起见,在本机也安装了 GCC,因而有段时间我在 MinGW GCC 的邮件列表还是相当活跃的。因为有切实的工作需要,也因为有好的交流场所,那是我真正在开发技能上突飞猛进的时间。
|
||||
|
||||
再后面,我加入了 Intel,并在那里工作了十年多。Intel 是一家了不起的公司,我在那里也学到了很多东西。不过,纯粹从软件开发技能上来说,那段时间进步不多。如果我坚持一直待下去的话,应该会有机会成为 PowerPoint Engineer 的。😂
|
||||
|
||||
离开 Intel 后,我的主要开发语言从 C++ 变成了 Python。这也算是一种全新的体验吧。不同的开发语言有着不同的功能取舍,而 Python 放弃了性能,来换取表达能力上的提高,对开发人员来说真是轻松之极。我在好几年的 C++ 大会上,讲 C++ 时都会拿 Python 代码来对标。一开始还有点不服气的意思(我也就比你多写了那么几行嘛),后来成了由衷的佩服和学习。我觉得 C++ 的发展目标就应该是达到 Python 的表达能力,同时还具有高出几个数量级的性能,那样就完美了……
|
||||
|
||||
## 一万小时定律
|
||||
|
||||
说了半天,你有没有觉得我学得非常的杂啊?我现在自己想想,都觉得似乎有点太杂了。不过,人生在世,不走点弯路是不可能的。我也没觉得我花在那些小众语言或不重要的特性上的时间完全是浪费,虽说也许有更好的学习方式。学习编程绝对是一场比马拉松更长的长跑,是需要长期的努力和付出的。
|
||||
|
||||
你很可能已经听说过“一万小时定律”了。这个说法的核心意思是,在大部分的领域里,从普通人变为专家需要投入至少约一万小时的时间。如果按每天工作八个小时、一周工作五天计算,那么成为一个领域的专家至少需要五年。如果投入时间不那么多,或者问题领域更复杂,“十年磨一剑”也是件很自然的事。
|
||||
|
||||
注意这是个约数,也只是必要条件,而非充分条件。时间少了,肯定完全没有希望;大于等于一万小时,也不能保证你一定成为专家。即使天才也需要勤学苦练。而如果天资真的不足,那估计投入再多也不会有啥效果。
|
||||
|
||||
如果你看得更仔细一点,你在了解一万小时定律时,应该会注意到不是随便练习一万小时就有用的。你需要的是刻意的练习。换句话说,练习是为了磨练你的思维(或肌肉,或其他需要训练的部分),而不能只是枯燥的练习而已。
|
||||
|
||||
打另外一个比方,如果你工作了五年,任务是数据库的查询和报表。那估计对绝大多数人,只有第一年可能是有能力提高的,后面四年则对能力提高没有什么大帮助。在求职市场上,这样的五年经验,多半不比两年工作经验的更有竞争力。考虑到五年经验的的薪水比两年的要高,很多公司会更偏好经验更少的呢。这就是为什么纯编程的职位(像 Java 开发工程师、Python 开发工程师之类)基本上见不到要求十年以上经验的。C++ 这方面相对还略好些,因为大家都知道 C++ 上手需要的时间比较长,所以经验很少的 C++ 程序员意义不大,除非公司里能分配比较有经验的程序员指导。但总体而言,经验要求多的,一般更会是架构、管理方面的职位,大家更认同这些方面的能力更需要长时间的积累。
|
||||
|
||||
你有没有注意我说的是“大家更认同”,而不是“我认为”?事实上,我个人的观点恰恰相反,纯粹的程序员能力,不论何种语言,也是可以积累的。只不过,这种积累的有效性因人而异,因而在求职市场上参考意义偏弱些。程序员如果希望积累个人能力的话,很重要的一点,是不要把重复的事情一直重复下去。如果你做一件事感觉以前做过了,你就得想想这里面是否有共性了;如果你做一件事已经是第三第四遍了,那绝对是某个地方出了点问题。你应当做的事情,是退一步,看看如何可以用更好的抽象来解决问题,而不是一遍遍地去重复——否则,就真成了码农,潜在可以被其他人,甚至机器,在某一天替代了。
|
||||
|
||||
这点上来说,C++ 是很适合爱好抽象的程序员的语言。C++ 允许高效的抽象,可以用来构造新的领域专用语言。我个人觉得 C++ 挺适合分层开发的——一部分有经验的老手开发系统的框架和底层抽象,并暴露出一个简单易用的接口给上层开发者;上层开发者可以相对经验较少,在老手的指导下完成整个系统的构建。
|
||||
|
||||
估计我说了这么多,你还是会想,那你学了这么多乱七八糟的语言,有用吗?
|
||||
|
||||
我的个人意见是,既没用,也有用。
|
||||
|
||||
如果我有一个好的老师具有针对性地来指导我,指出我哪方面有欠缺,哪方面需要加强训练,那当然会是件极好的事。可那样的事似乎只在音乐界和体育界发生了。在编程这样的开放领域,我还真不知道哪个大师是好老师教出来的。我不是说老师没有用(我遇到过好几个对我编程生涯有影响的好老师),但存在一个一对一的、同领域的好老师的概率真的太低了,尤其在你成长到一定程度之后。编程绝对是一个需要自学的领域。我在编程上“荒废”的时间,应该属于这一万小时中比较低效的部分,但不是无效的部分。说低效,是因为我并不是针对我的编程能力方面的缺陷,去刻意提高自己在某方面的能力。但是,因为我也不是无聊地重复编写同样的程序,而是根据自己的兴趣爱好钻研自己不理解、感兴趣的方面,这种“泛读”也应该部分起到了塑造我的思维的作用。
|
||||
|
||||
我还很喜欢 Larry Wall 认为程序员该有的三大美德:懒惰,急切,傲慢(laziness, impatience, hubris;初次阐释于 **Programming Perl** 第二版)。我翻译出完整的原文与你妙文共赏:
|
||||
|
||||
>
|
||||
**懒惰**
|
||||
使得你花费极大努力来减少总体能量开销的品质。懒惰使你去写能让别人觉得有用、并减少繁杂工作的程序;你也会用文档描述你的程序,免得你不得不去回答别人的问题。因此,这是程序员的第一大美德。
|
||||
**急切**
|
||||
当计算机不能满足你的需求时你所感到的愤怒。这使得你写的程序不仅满足自己的需求,还能预期其他需求。至少努力去这么做。因此,这是程序员的第二大美德。
|
||||
**傲慢**
|
||||
老天都受不了你的极度骄傲。这种品质使得你写程序(和维护程序)时不允许别人有机会来说三道四。因此这是程序员的第三大美德。
|
||||
|
||||
|
||||
搞软件开发的,我相信没有很笨的。智力上的差距通过努力、态度和技巧是完全可以填补的。希望你也能拥有这三个懒惰、急切、傲慢的美德。
|
||||
|
||||
## 英语学习
|
||||
|
||||
学编程应该学好英语。学编程应该学好英语。学编程应该学好英语。(重要的事情说三遍。)
|
||||
|
||||
不管出于什么原因,中文的编程资源没有英文的好,这是不争的事实。前些天,我在帮朋友出些 C++ 的考题,也在网上找了一下,结果看到了很多错误的题目和答案。有还在使用 `void main` 的(应该是 `int main`),有对结构的对齐规则理解不正确的(部分是因为 MSVC 和 GCC 规则有些细微的小区别),还有对 C++ 对象的生命周期规则理解有偏差的,等等。
|
||||
|
||||
事实上,我对 C++ 有疑惑时,解答大部分来自于 Stack Overflow——而国内完全没有同等级的编程问答网站。形式上有点相似的是百度问答,但内容的质量——不管是问题,还是回答——完全不可同日而语。百度问答上的很多问题,如果有人胆敢贴到 Stack Overflow 上去,问题立即会变成负分……
|
||||
|
||||
怎么学好英语,这个问题是被讨论过无数次了。对于我来讲,非常简单:我喜欢英语。喜欢永远是最好的学习动力。那如果你就是喜欢不起来呢?那我觉得,你需要告诉你自己:
|
||||
|
||||
1. 学好英语是必要的
|
||||
1. 学好英语比学好编程容易
|
||||
1. 还有任何疑问,请参见第 1 条
|
||||
|
||||
你需要逼自己一下,定下小小的目标和计划,并每天**坚持**。比如:
|
||||
|
||||
- 每天阅读一篇英语的编程文章
|
||||
- 每天看一条英文的 C++ Core Guideline
|
||||
- 每天看 5 页 C++ 之父的 **The C++ Programming Language**(或其他的英文编程书籍)
|
||||
- 每天在 Stack Overflow 上看 3 个问答
|
||||
- 等等
|
||||
|
||||
你很快会发现,克服心理障碍之后,学习英语比起编程来是不费吹灰之力的事,不需要动什么脑筋。把自己沉浸到一个英文环境里,英语能力的提高是件自然而然的事。听说读写,其他方面缺乏训练还情有可原,读是应该最容易被解决的。为了能和世界各地的其他优秀程序员网上交流,写也需要多加练习——不要怕有错误,用简单的词把意思表达清楚,就是很好的第一步。多读多写,基本的网上阅读和交流就不会是一个难题了。
|
||||
|
||||
## 新春快乐
|
||||
|
||||
听我唠叨了这么多,希望你没有觉得厌烦。哈哈,就在此祝你新春快乐,在新的一年里学习顺利、工作成功。轻松的生活不是成长的人生所需要的,但希望你遇到的困难都能找到解决的方法,进而有所提高。
|
||||
|
||||
在这里顺便告个假,请容我和编辑稍稍歇上一天,1 月 27 日也就是大年初三我们停更一次。大家过年期间除了和亲朋好友团聚外,也可以抽时间把前面的内容再复习下。初五我会为大家提供一个加餐,C++ 编程推荐书目,希望能够为你在这个课程之外进一步提升自己的能力提供参考方向。1 月 31 日起我们恢复正文更新,再上征途,完成最后五讲的学习。
|
||||
233
极客时间专栏/现代C++实战30讲/新年特别策划/新春福利 | C++好书荐读.md
Normal file
233
极客时间专栏/现代C++实战30讲/新年特别策划/新春福利 | C++好书荐读.md
Normal file
@@ -0,0 +1,233 @@
|
||||
<audio id="audio" title="新春福利 | C++好书荐读" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/96/92/9690d4fef875e0a7e992307ccb89a092.mp3"></audio>
|
||||
|
||||
## 写在前面
|
||||
|
||||
你好,我是吴咏炜。
|
||||
|
||||
今天我会介绍一些我觉得好并且值得推荐的书,但我不会提供任何购买或下载链接。前者没有必要,大家应该都知道怎么搜索;后者我个人认为违反道义。这些书没有哪本是程序员买不起的。如果书作者没有提供免费下载,而市面上又买不到某本书的话,那自己偷偷找个下载渠道也情有可原——但也请你不要分享出来、告诉我或者其他人。即使你认为以后别人复制你的作品是完全没有问题的(事实上我很怀疑这点,除非你是个硬核的自由软件贡献者),也不等于你有权利复制别人的作品。
|
||||
|
||||
## 入门介绍
|
||||
|
||||
Bjarne Stroustrup, **A Tour of C++**, 2nd ed. Addison-Wesley, 2018
|
||||
|
||||
中文版:王刚译,《C++ 语言导学》(第二版)。机械工业出版社,2019
|
||||
|
||||
推荐指数:★★★★★
|
||||
|
||||
(也有第一版的影印版,那就不推荐了。)
|
||||
|
||||
这是唯一一本较为浅显的全面介绍现代 C++ 的入门书。书虽然较薄,但 C++ 之父的功力在那里(这不是废话么😂),时有精妙之论。书的覆盖面很广,介绍了 C++ 的基本功能和惯用法。这本书的讲授方式,也体现了他的透过高层抽象来教授 C++ 的理念。
|
||||
|
||||
Michael Wong 和 IBM XL 编译器中国开发团队,《深入理解 C++11:C++11 新特性解析与应用》。机械工业出版社,2013
|
||||
|
||||
推荐指数:★★★☆
|
||||
|
||||
这本书我犹豫了好久是否应该推荐。Michael Wong 是 C++ 标准委员会委员,内容的权威性没有问题。但这本书,从电子书版本(Kindle 和微信读书上都有此书)看,排印错误不少——校对工作没有做好。我觉得,如果你已经熟悉 C++98,想很系统地检视一下 C++11 的新特性,这本书可能还比较适合。(我只讲了一些重点的现代 C++ 特性,完整性相差很远。)
|
||||
|
||||
## 最佳实践
|
||||
|
||||
Scott Meyers, **Effective C++: 55 Specific Ways to Improve Your Programs and Designs**, 3rd ed. Addison-Wesley, 2005
|
||||
|
||||
中文版:侯捷译《Effective C++ 中文版》(第三版)。电子工业出版社,2011
|
||||
|
||||
推荐指数:★★★★
|
||||
|
||||
Scott Meyers, **Effective STL: 50 Specific Ways to Improve Your Use of the Standard Template Library**. Addison-Wesley, 2001
|
||||
|
||||
中文版:潘爱民、陈铭、邹开红译《Effective STL 中文版》。清华大学出版社,2006
|
||||
|
||||
推荐指数:★★★★
|
||||
|
||||
Scott Meyers, **Effective Modern C++: 42 Specific Ways to Improve Your Use of C++11 and C++14**. O’Reilly, 2014
|
||||
|
||||
中文版:高博译《Effective Modern C++ 中文版》。中国电力出版社,2018
|
||||
|
||||
推荐指数:★★★★★
|
||||
|
||||
C++ 的大牛中有三人尤其让我觉得高山仰止,Scott Meyers 就是其中之一——Bjarne 让人感觉是睿智,而 Scott Meyers、Andrei Alexandrescu 和 Herb Sutter 则会让人感觉智商被碾压。Scott 对 C++ 语言的理解无疑是非常深入的,并以良好的文笔写出了好几代的 C++ 最佳实践。我读过他整个 Effective 系列四本书,每一本都是从头看到尾,收获巨大。(之所以不推荐第二本 **More Effective C++**,是因为那本没有出过新版,1996 年的内容有点太老了。)
|
||||
|
||||
这几本书讨论的都是最佳实践,因此,如果你没有实际做过 C++ 项目,感触可能不会那么深。做过实际项目的一定会看到,哦,原来我也犯了这个错误啊……如果你不想一下子看三本,至少最后一本属于必修课。
|
||||
|
||||
值得一提的是,这三本的译者在国内都是响当当的名家,翻译质量有保证。因此,这几本看看中文版就挺好。
|
||||
|
||||
## 深入学习
|
||||
|
||||
Herb Sutter, **Exceptional C++: 47 Engineering Puzzles, Programming Problems, and Solutions**. Addison-Wesley, 1999
|
||||
|
||||
中文版:卓小涛译《Exceptional C++ 中文版》。中国电力出版社,2003
|
||||
|
||||
推荐指数:★★★★
|
||||
|
||||
我已经说过,我认为 Herb Sutter 是 C++ 界最聪明的三人之一。在这本书里,Herb 用提问、回答的形式讨论了很多 C++ 里的难点问题。虽然这本书有点老了,但我认为你一定可以从中学到很多东西。
|
||||
|
||||
Herb Sutter and Andrei Alexandrescu, **C++ Coding Standards: 101 Rules, Guidelines, and Best Practices**. Addison-Wesley, 2004
|
||||
|
||||
中文版:刘基诚译《C++编程规范:101条规则准则与最佳实践》。人民邮电出版社,2006
|
||||
|
||||
推荐指数:★★★★
|
||||
|
||||
两个牛人制定的 C++ 编码规范。与其盲目追随网上的编码规范(比如,Google 的),不如仔细看看这两位大牛是怎么看待编码规范方面的问题的。
|
||||
|
||||
侯捷,《STL 源码剖析》。华中科技大学出版社,2002
|
||||
|
||||
推荐指数:★★★★☆
|
||||
|
||||
这本是我推荐的唯二的直接以中文出版的 C++ 技术书。侯捷以庖丁解牛的方式,仔细剖析了早期 STL 的源码——对于不熟悉 STL 代码的人来说,绝对可以学到许多。我当年从这本书中学到了不少知识。虽说那里面的 STL 有点老了,但同时也更简单些,比今天主流的 STL 容易学习。
|
||||
|
||||
同时仍需注意,这本书有点老,也有些错误(比如,有人提到它对 `std::copy` 和 `memmove` 的说明是错的,但我已经不再有这本书了,没法确认),阅读时需要自己鉴别。但瑕不掩瑜,我还是认为这是本好书。
|
||||
|
||||
## 高级专题
|
||||
|
||||
Alexander A. Stepanov and Daniel E. Rose, **From Mathematics to Generic Programming**. Addison-Wesley, 2014
|
||||
|
||||
中文版:爱飞翔译《数学与泛型编程:高效编程的奥秘》。机械工业出版社,2017
|
||||
|
||||
推荐指数:★★★★★
|
||||
|
||||
Alexander Stepanov 是 STL 之父,这本书写的却不是具体的编程技巧或某个库,而是把泛型编程和抽象代数放在一起讨论了。说来惭愧,我是读了这本书之后才对群论稍稍有了点理解:之前看到的介绍材料都过于抽象,没能理解。事实上,Alexander 之前还写了一本同一题材、但使用公理推导风格的 **Elements of Programming**(裘宗燕译《编程原本》),那本就比较抽象艰深,从受欢迎程度上看远远不及这一本。我也只是买了放在书架上没看多少页😝。
|
||||
|
||||
回到这本书本身。这本书用的编程语言是 C++,并引入了“概念”——虽然作者写这本书时并没有真正的 C++ 概念可用。书中讨论了数学、编程,还介绍了很多大数学家的生平。相对来说(尤其跟《编程原本》比),通过这本书是可以比较轻松地学习到泛型的威力的。哦,对了,我之前提到使用高精度整数算 RSA 就是拿这本书里描述的内容做练习。计算 RSA,从抽象的角度,只不过就是求幂和最大公约数而已……
|
||||
|
||||
除非抽象代数和模板编程你都已经了然于胸,否则这本书绝对会让你对编程的理解再上一个层次。相信我!
|
||||
|
||||
Andrei Alexandrescu, **Modern C++ Design: Generic Programming and Design Patterns Applied**. Addison-Wesley, 2001
|
||||
|
||||
中文版:侯捷、於春景译《C++ 设计新思维》。华中科技大学出版社,2003
|
||||
|
||||
推荐指数:★★★★☆
|
||||
|
||||
这本书算是 Andrei 的成名作了,一出版就艳惊四座。书中讨论了大量模板相关的技巧,尤其是基于策略的设计。记得在这本书出版时,大量书中的代码是不能被编译器接受的。当然,错的基本上都是编译器,而不是 Andrei。
|
||||
|
||||
对了,注意到英文书名中的 Modern C++ 了吗?现代 C++ 这一提法就是从他开始的,虽然那是在 C++11 发布之前十年了。可以说他倡导了新的潮流。在今天,这本书的内容当然是略老了,但它仍然是不可替代的经典作品。书里的技巧有些已经过时了(我也不推荐大家今天去使用 Loki 库),但理念没有过时,对思维的训练也仍然有意义。
|
||||
|
||||
Anthony Williams, **C++ Concurrency in Action**, 2nd ed. Manning, 2019
|
||||
|
||||
中文译本只有第一版,且有人评论“机器翻译的都比这个好”。因而不推荐中文版。
|
||||
|
||||
推荐指数:★★★★☆
|
||||
|
||||
C++ 在并发上出名的书似乎只此一本。这也不算奇怪:作者是 Boost.Thread 的主要作者之一,并且也直接参与了 C++ 跟线程相关的很多标准化工作;同时,这本书也非常全面,内容覆盖并发编程相关的所有主要内容,甚至包括在 Concurrency TS 里讨论的,尚未进入 C++17 标准(但应当会进入 C++20)的若干重要特性:barrier、latch 和 continuation。
|
||||
|
||||
除非你为一些老式的嵌入式系统开发 C++ 程序,完全不需要接触并发,否则我推荐你阅读这本书。
|
||||
|
||||
Ivan Čukić, **Functional Programming in C++**. Manning, 2019
|
||||
|
||||
中文版:程继洪、孙玉梅、娄山佑译《C++ 函数式编程》。机械工业出版社,2020
|
||||
|
||||
推荐指数:★★★★
|
||||
|
||||
推荐这本书我是有点私心的,毕竟我为这本书作了点小贡献,你也能在这本书里找到我的名字。因为这个,也因为这本书太新、评价太少,我也很犹豫该不该推荐。不过,鉴于在这个领域这是唯一的一本,如果你想用 C++ 语言做函数式编程的话,也没有更好的书可选了。
|
||||
|
||||
如果你对函数式编程有兴趣,可以读一读这本书。如果你对函数式编程不感冒,可以跳过这一本。
|
||||
|
||||
## 参考书
|
||||
|
||||
Bjarne Stroustrup, **The C++ Programming Language**, 4th ed. Addison-Wesley, 2013
|
||||
|
||||
中文版:王刚、杨巨峰译《C++ 程序设计语言》。机械工业出版社, 2016
|
||||
|
||||
推荐指数:★★★★☆
|
||||
|
||||
没什么可多说的,C++ 之父亲自执笔写的 C++ 语言。主要遗憾是没有覆盖 C++14/17 的内容。中文版分为两卷出版,内容实在是有点多了。不过,如果你没有看过之前的版本,并且对 C++ 已经有一定经验的话,这个新版还是会让你觉得,姜还是老的辣!
|
||||
|
||||
Nicolai M. Josuttis, **The C++ Standard Library: A Tutorial and Reference**, 2nd ed. Addison-Wesley, 2012
|
||||
|
||||
中文版:侯捷译《C++ 标准库》。电子工业出版社,2015
|
||||
|
||||
推荐指数:★★★★☆
|
||||
|
||||
Nicolai 写的这本经典书被人称为既完备又通俗易懂,也是殊为不易。从 C++11 的角度,这本书堪称完美。当然,超过一千页的大部头,要看完也是颇为不容易了。如果你之前没有阅读过第一版,那我也会非常推荐这一本。
|
||||
|
||||
## C++ 的设计哲学
|
||||
|
||||
Bjarne Stroustrup, **The Design and Evolution of C++**. Addison-Wesley, 1994
|
||||
|
||||
中文版:裘宗燕译《C++ 语言的设计与演化》。科学出版社, 2002
|
||||
|
||||
推荐指数:★★★☆
|
||||
|
||||
这本书不是给所有的 C++ 开发者准备的。它讨论的是为什么 C++ 会成为今天(1994 年)这个样子。如果你对 C++ 的设计思想感兴趣,那这本书会比较有用些。如果你对历史不感兴趣,那这本书不看也不会有很大问题。
|
||||
|
||||
Bruce Eckel, **Thinking in C++, Vol. 1: Introduction to Standard C++**, 2nd ed. Prentice-Hall, 2000
|
||||
|
||||
Bruce Eckel and Chuck Allison, **Thinking in C++, Vol. 2: Practical Programming**. Pearson, 2003
|
||||
|
||||
中文版:刘宗田等译《C++ 编程思想》。机械工业出版社,2011
|
||||
|
||||
推荐指数:★★★
|
||||
|
||||
据说这套书翻译不怎么样,我没看过,不好评价。如果你英文没问题,还是看英文版吧——作者释出了英文的免费版本。这套书适合有一点编程经验的人,讲的是编程思想。推荐星级略低的原因是,书有点老,且据说存在一些错误。但 Bruce Eckel 对编程的理解非常深入,即使在 C++ 的细节上他有错误,通读此书肯定还是会对你大有益处的。
|
||||
|
||||
## 非 C++ 的经典书目
|
||||
|
||||
W. Richard Stevens, **TCP/IP Illustrated Volume 1: The Protocols**. Addison-Wesley, 1994
|
||||
|
||||
Gary R. Wright and W. Richard Stevens, **TCP/IP Illustrated Volume 2: The Implementation**. Addison-Wesley, 1995
|
||||
|
||||
W. Richard Stevens, **TCP/IP Illustrated Volume 3: TCP for Transactions, HTTP, NNTP and the Unix Domain Protocols**. Addison-Wesley 1996
|
||||
|
||||
中文版翻译不佳,不推荐。
|
||||
|
||||
推荐指数:★★★★☆
|
||||
|
||||
不是所有的书都是越新越好,《TCP/IP 详解》就是其中一例。W. Richard Stevens 写的卷一比后人补写的卷一第二版评价更高,就是其中一例。关于 TCP/IP 的编程,这恐怕是难以超越的经典了。不管你使用什么语言开发,如果你的工作牵涉到网络协议的话,这套书恐怕都值得一读——尤其是卷一。
|
||||
|
||||
W. Richard Stevens and Stephen A. Rago, **Advanced Programming in the UNIX Environment**, 3rd, ed.Addison-Wesley, 2013
|
||||
|
||||
中文版: 戚正伟、张亚英、尤晋元译《UNIX环境高级编程》。人民邮电出版社,2014
|
||||
|
||||
推荐指数:★★★★
|
||||
|
||||
从事 C/C++ 编程应当对操作系统有深入的了解,而这本书就是讨论 Unix 环境下的编程的。鉴于 Windows 下都有了 Unix 的编程环境,Unix 恐怕是开发人员必学的一课了。这本书是经典,而它的第三版至少没有损坏前两版的名声。
|
||||
|
||||
Erich Gamma, Richard Helm, Ralph Johson, John Vlissides, and Grady Booch, **Design Patterns: Elements of Reusable Object-Oriented Software**. Addison-Wesley, 1994
|
||||
|
||||
中文版:李英军、马晓星、蔡敏、刘建中等译《设计模式》。机械工业出版社,2000
|
||||
|
||||
推荐指数:★★★★☆
|
||||
|
||||
经典就是经典,没什么可多说的。提示:如果你感觉这本书很枯燥、没用,那就等你有了更多的项目经验再回过头来看一下,也许就有了不同的体验。
|
||||
|
||||
Eric S. Raymond, **The Art of UNIX Programming**. Addison-Wesley, 2003
|
||||
|
||||
中文版:姜宏、何源、蔡晓骏译《UNIX 编程艺术》。电子工业出版社,2006
|
||||
|
||||
推荐指数:★★★★
|
||||
|
||||
抱歉,这仍然是一本 Unix 相关的经典。如果你对 Unix 设计哲学有兴趣的话,那这本书仍然无可替代。如果你愿意看英文的话,这本书的英文一直是有在线免费版本的。
|
||||
|
||||
Pete McBreen, **Software Craftsmanship: The New Imperative**. Addison-Wesley, 2001
|
||||
|
||||
中文版:熊节译《软件工艺》。人民邮电出版社,2004
|
||||
|
||||
推荐指数:★★★★
|
||||
|
||||
这本书讲的是软件开发的过程,强调的是软件开发中人的作用。相比其他的推荐书,这本要“软”不少。但不等于这本书不重要。如果你之前只关注纯技术问题的话,那现在是时间关注一下软件开发中人的问题了。
|
||||
|
||||
Paul Graham, **Hackers & Painters: Big Ideas From The Computer Age**. O’Reilly, 2008
|
||||
|
||||
中文版:阮一峰译《黑客与画家》。人民邮电出版社,2011
|
||||
|
||||
推荐指数:★★★★
|
||||
|
||||
这本讲的是一个更玄的问题:黑客是如何工作的。作者 Paul Graham 也是一名计算机界的大神了,用 Lisp 写出了被 Yahoo! 收购的网上商店,然后又从事风险投资,创办了著名的孵化器公司 Y Combinator。这本书是他的一本文集,讨论了黑客——即优秀程序员——的爱好、动机、工作方法等等。你可以从中学习一下,一个优秀的程序员是如何工作的,包括为什么脚本语言比静态类型语言受欢迎😁……
|
||||
|
||||
Robert C. Martin, **Clean Code: A Handbook of Agile Software Craftsmanship**. Prentice Hall, 2008
|
||||
|
||||
中文版:韩磊译《代码整洁之道》。人民邮电出版社,2010
|
||||
|
||||
推荐指数:★★★★☆
|
||||
|
||||
Bob 大叔的书如果你之前没看过的话,这本是必看的。这本也是语言无关的,讲述的是如何写出干净的代码。有些建议初看也许有点出乎意料,但细想之下又符合常理。推荐。
|
||||
|
||||
## 其他
|
||||
|
||||
别忘了下面这两个重要的免费网站:
|
||||
|
||||
C++ Reference. [https://en.cppreference.com](https://en.cppreference.com)
|
||||
|
||||
C++ Core Guidelines. [https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines)
|
||||
|
||||
这两个网站绝对是优秀的免费资源。大力推荐!
|
||||
|
||||
希望今天的推荐能给你提供多一些的参考方向,从而进一步提升自己。
|
||||
Reference in New Issue
Block a user