无效的 有效的 C++”(以及其他 C++阅读技巧)
无效的“有效的 C++”(以及其他 C++阅读技巧)
原文:https://medium.com/hackernoon/ineffective-effective-c-and-other-c-reading-tips-991aeb59c3da
在我之前在谷歌的团队中,我花了 3 个月的时间编写 C 语言(致力于 Linux 内核库,然后我们突然发现自己需要 c++——我们想要编写一个测试工具,可以消除一些影响我们性能测量的操作系统级噪声。在此之前,我从未编写过任何 C++,我的第一周左右相当痛苦——我以为我可以通过编写 Java 并追踪编译错误直到代码运行来解决这个问题。
在学校,我学习良好编程风格的最好资源之一是在 freenode 上闲逛,我强烈推荐它。有经验的程序员的建议是无可替代的。所以在第一周,我试着非常依赖#c++频道。
但是当我看到第 300 个错误信息时
> > std::< > > std::Allocator< std::std:: < > < std::AngleBracket:: >
我从 IRC 得到了一些建议,我的导师可能太客气了,没有给出:
看,在这里问更多的问题之前,你需要实际学习 C++。你整个星期都在用难以置信的基本问题烦我们。去读一本书,然后回来问更多的问题,如果那没有教会你你需要什么的话。
很刺耳,但我需要听到。在那之后,我花了一段时间适当地“做功课”,从那以后,我成了一个更有效率的 C++开发人员。
作为程序员学习编程
在你已经掌握了一些编程语言之后,学习编程语言的一个棘手的部分是很难找到适合你水平的材料。写你的$LANG 的第一行的介绍性往往太基础了——如果我不得不为循环读另一个关于的 6 段解释,我会吃掉我自己的眼球。另一方面, Advanced $LANG Programming 提供了更多您需要的建议,但是假设您知道的基础知识太多,无法真正提供帮助。
我认为面向有经验的程序员的编程语言学习材料太少了。因此,为了抵制这种趋势,这里有一份阅读清单,供那些有编程经验、希望学习 C++的人参考。
顺便说一句,我会给你一长串的书。我喜欢带着一个非常宽松的“阅读”定义来阅读编程书籍——浏览一遍,关注与你相关的部分,跳过不相关的部分。记住初始化 struct 元素的确切顺序并不重要;知道它们的初始化有某种特定的顺序是很重要的。然后当你因为“member foo 将在 member bar 之后被初始化”而得到一个错误时,你就知道去哪里找答案了。
照我说的做,不要照我做的做
要获得进一步的建议,请查看这个 StackOverflow 问题,这也是直言不讳但很有帮助的 IRC 人员给我指出的方向。我将告诉你我做了什么,并建议你改进我的策略,然后给你一个简短的纲要,告诉你你可以从每本书里得到什么。
(充分披露:以下链接是通过亚马逊联盟计划,这意味着如果你通过我的链接购买,我可能会得到几分钱。话虽如此,不要让成本阻止你学习——如果亚马逊太贵,可以在网上搜索其他地方。)
我的订单:
- 加速 C++:实例实用编程 (安德鲁·克尼格和芭芭拉·穆)
- 有效的现代 C++: 42 种提高你使用 C++11 和 C++14 的具体方法 (Scott Meyers)
- 有效的 C++: 55 种改善你的程序和设计的具体方法
- 更有效的 C++: 35 种改进程序和设计的新方法
- 现代 C++设计:泛型编程和设计模式应用 (安德烈·亚历山德雷斯库)——我只看了一半
我立即跳过了名称中带有“Exception”的任何内容,因为 Google C++风格指南禁止它们,但我认为 Scott Meyers 的Exception c++系列也值得一读。
我的推荐订单:
- 加速的 C++
- 更有效的 C++
- 有效的现代 C++
读什么
- 加速 C++
对实际语言本身精彩的、节奏良好的介绍。它错过了 C++11 的特性,但是如果你在一个现有的代码库中工作,你可以从你看到的代码中找出大约 90%的 auto 和 unique_ptr 背后的神奇之处。到本书结束时,你应该能够理解你遇到的大多数错误信息,并编写出通过测试的代码。
- 更有效的 C++
这是你对 C++风格本质细节的第一次介绍。它涵盖了各种语言特性的正确用法,这些特性你可能在你编写的其他代码中没有见过,比如何时将函数标记为虚拟函数,通过值传递还是通过引用传递还是通过指针传递,等等。到本书结束时,您应该对该语言为您提供的权衡有了相当深刻的理解,并且您应该能够编写干净、合理的代码(只要合理的解决方案不依赖于 C++11 的特性)。
- 有效的现代 C++
这本书的重点基本上是教你后面的类型机械:
auto foo = std::make_unique<Bar>(1, 2, 3);
这比你想象的要复杂得多。我认为整本书值得一读,但它比更有效的 C++ 更难读,因为它与你的日常工作的相关性不太明显。这就是为什么我建议你在更有效的 C++ 之后读它,不像我那样。它更像是坚实的 C++98 风格之上的樱桃,而不是编写语言的独立指南。
TL;最重要的是,C++11 的特性很好,你应该尽可能地使用它们。到本书结束时,你会对它们为什么好,它们能给你提供什么,以及它们如何适应语言的其他部分有一个细致入微的理解。
跳过什么
- 现代 C++设计
我认为如果你不写库,你可能永远不需要知道这本书描述的技术。很多都属于“有趣,但是如果你曾经在产品代码中使用过它,你的同事就有理由把你带出去枪毙。”例如,世界上可能有五个人认为编写自定义分配器是正确的,并且您的公司可能应该在其代码库中运行恰好一个 Singleton 实现。
你可以避免这种情况,除非你想深入了解一些几乎总是会从你身边消失的漂亮技巧。
- 有效的 C++
虽然我确信这本书在写作时非常有用,但在 2016 年阅读它对你来说几乎不可能有任何好处。它本质上有 320 页,旨在让你相信 OOP 是好的,旧式的命令式 C 是不好的。但是,如果你在过去 10 年中的任何时候学习编程,另一种语言已经教会了你这些经验——例如,Java 程序员不需要任何说服就知道使用类是个好主意。
这本书的目标读者是 90 年代中期的 C 程序员,他们不确定学习一种新的编程范式是否值得。如果你在 C++之前学过 C,那么有些经验在 2016 年仍然有用(例如,永远不要使用 malloc ),但是你可以从你的同事和你组织的风格指南中获得这些经验。
如果你对为什么你更喜欢类和泛型而不是独立函数、 struct 和预处理宏有一点模糊的概念,你可以完全跳过这一步。
黑客中午是黑客如何开始他们的下午。我们是 @AMI 家庭的一员。我们现在接受投稿并乐意讨论广告&赞助机会。
要了解更多信息,请阅读我们的“关于”页面,在脸书上点赞/给我们发消息,或者简单地说, tweet/DM @HackerNoon。