探秘C++的复杂性问题

开发 后端
C++的复杂性始终是一个不可回避的现实。C++中有大量的陷阱和缺陷,后者导致了数目惊人的惯用法和workarounds。不加选择的全盘预先学习,是非常糟糕的做法,不仅低效。

你用一个天生用来开啤酒瓶的工具开了啤酒瓶,不但啥成就感也没有,而且谁也不会觉得你牛13。然而,如果你发明了一种用两根筷子也能打开啤酒瓶的办法,或者你干脆生就一口好牙可以把瓶盖啃开,那也许就大不一样了。人家就会觉得你很好很强大。

每个人都喜欢戴着脚镣跳舞。

也就是说,如果你用一个天生为某个目的的工具来做他该做的事情,没有人会喝彩,你也不会觉得了不起。但如果你用两个本身不是为某个目的的工具组合出新功能的话,你就是“创新”者(尽管也许本来就有某个现成的工具可用)。

而C++则是这些“创新”的土壤,是的,我说的就是无穷无尽的workarounds和惯用法。但问题是,这些“创新”其实根本不是创新,你必须认识到的是,他们都只不过是在没有first-class解决方案的前提下不得已折腾出来的替补方案。是的,它们某种程度上的确可以叫创新,甚至研究可行的解决方案本身也是一件非常有意思的事情,但—

我知道它们很有趣,但实际上它们只是补丁方案。

是的,不要因为这些“创新”方案有趣就忍不住一头钻进去。你之所以觉得有趣是因为当你一定程度上熟悉了C++之后,C++的所有一切,包括缺陷,对你来说就成了一个“既定事实”,一个背景,一个习以为常的东西(人是有很强的适应性的)。因此,当你发现在这个习以为常的环境下居然出现了新的可能性时,你当然是会欢呼雀跃的(比如我当年读《Modern C++ Design》的时候就有一次从早读到晚,午饭都没吃),然而实际上呢?其它语言中也许早就有first-class的支持了,其它语言也许根本不需要这个惯用法,因为它们就没有这些缺陷。此外,从实践的角度来说,更重要的是,这些“解决方案”也许你平时编程根本就用不到。

不,我当然不是说这些补丁方案不重要。正如前面所说,C++中繁杂的技巧并非空穴来风,总有实际问题在背后驱动的。但问题是,对于我们日常编程来说,这些“实际问题”简直是八杆子打不着的。犯不着先费上80%的劲儿把20%时候才用到的东西揣在脑子里,用的时候查文档或书就行了。 #t#

看到这里,塑造C++中特定的心态哲学的另一个原因想必你也已经知道了。实际上,这个原因才是真正根本的。前面说的一个原因是C++书籍市场(教育)造就的,然而为什么人们喜欢写这些书呢?进一步说,为什么人们喜欢读这些书呢?(我承认,我也曾经读得津津有味。)答案很简单:心理。每个人都喜欢戴着脚镣跳舞(事实8)。认识到这一点不是为了提倡它,而是只有当我们认识到自己为什么会津津有味地去钻研一堆补丁解决方案的时候,我们才真正能够摆脱它们的吸引。

总而言之,C++的复杂性只是一个必要条件,并非问题的根本症结。根本症结在于人的心理,每个人都喜欢戴着脚镣跳舞,并且以为是“创新”。意识到这一点之后可以帮我们避免被各种各样名目繁多的语言细节和技巧占去不必要的时间。

然而,C++的复杂性始终是一个不可回避的现实。C++中有大量的陷阱和缺陷,后者导致了数目惊人的惯用法和workarounds。不加选择的全盘预先学习,是非常糟糕的做法,不仅低效,而且根本没有必要,实在是浪费生命。爱因斯坦曾经说过,“我只想知道‘他’(宇宙)的设计理念,其它的都是细节”。然而,正如另一些读者指出的,如果对C++中的这些细节事先一点都没有概念的话,那么实际编码中一旦遇到恐怕就变成没头苍蝇了,也许到哪里去RTFM都不知道。这也是为什么那么多C++面试都会不厌其烦地问一些有代表性的语言细节的原因。

把细节全盘装在脑子里固然不好,但对细节一无所知同样也不是个办法。那么对于C++程序员来说,在学习中究竟应该以怎样的态度和学习方法来对付C++的复杂性呢?其实答案也非常简单,首先有一些很重要&必须的语言细节&特性是需要掌握的,然后我们只需知道在C++中大抵有哪些地方有复杂性(陷阱、缺陷),那么遇到问题的时候自然能够知道到哪儿去寻找答案了。具体的建议在后文。

责任编辑:chenqingxiang 来源: linux
相关推荐

2010-01-27 15:50:23

C++复杂性

2010-01-21 17:30:12

C++复杂

2010-01-13 15:41:02

C++的复杂

2010-01-12 10:28:58

C++复杂性

2010-01-12 10:57:16

C++的复杂性

2010-01-21 14:07:14

CC++声明

2010-01-13 11:27:06

C++安全性

2020-01-08 21:38:30

机器学习工业4.0物联网

2017-06-23 08:45:02

存储技术复杂性

2010-01-21 10:23:53

C++代码

2010-01-27 17:36:24

C++程序库

2024-04-22 13:22:00

虚函数象编程C++

2010-01-12 15:33:26

CC++

2024-01-23 10:13:57

C++虚函数

2009-01-20 15:23:33

存储安全密钥数据保护

2019-05-13 15:47:29

Kubernetes云计算云复杂性

2011-03-31 09:30:07

CC++声明

2010-01-14 11:07:59

Visual C++

2019-08-21 13:24:25

KubernetesHadoop容器

2024-01-31 23:51:22

C++移动语义代码
点赞
收藏

51CTO技术栈公众号