探秘C 的复杂性问题
创始人
2024-06-20 16:21:24
0

你用一个天生用来开啤酒瓶的工具开了啤酒瓶,不但啥成就感也没有,而且谁也不会觉得你牛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++中大抵有哪些地方有复杂性(陷阱、缺陷),那么遇到问题的时候自然能够知道到哪儿去寻找答案了。具体的建议在后文。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...