旨在分析并总结学习C++的误区和正确的学习方法,为初学者或者学习了一段时间迷惘的中级学者 提供一个可操作的guideline。
猛击这里浏览全 文,欢迎砖头(尤其是,如果你是初学者或学习了一段时间比较迷惘的话,请一定找出你觉得不好的地方),这也许是我写的C++学习方法的最后一篇文章,我觉 得我要说的全都说完了:)
在 07-12-11,red...@gmail.com<red...@gmail.com> 写道:
Atry 写道:
在 07-12-12,red...@gmail.com<red...@gmail.com> 写道:
在 07-12-12,Atry<pop....@gmail.com> 写道:
On Dec 11, 2007 6:12 PM, pongba <pon...@gmail.com> wrote:
此外,和老莫不同,我没那么热衷于 concept ,也是因为我仅仅把这些语言特性当成一个工具,而不是面向 XX 之类的思想。
那段时间我正热衷于 boost ,云凤的日志里面写到这个,简直给我是当头一棒啊。我觉得版主应该也和我一样有同感吧。那之后版主就不写关于
C++ 特性或者 boost 的文章了……
http://blog.codingnow.com/2007/09/c_vs_cplusplus.html
我又把这个帖子读了一遍,每读一遍就感慨一遍。刚才又感慨了一遍。
一点建议:看了pangba的这片好文,解决了我心里的一些疑惑。
另外我有一个建议,以前也在想的,就是:抽象惩罚 ==〉抽象损失,效率惩罚==〉效率损失。我觉得把惩罚换成损失,我在理解的时候更容易。
pongba, 我观察到这么一个现象, 不知道你是否同意:
在网络编程这一块, C++ 可重用库的使用覆盖程度, 似乎比这些库设计初衷覆盖程度要小. 不少的客户,服务器项目,例如不少游戏软件项目, 都没有使用 C++ 可重用库 ---- 无论是使用 C++ 通用网络库ACE, 或者专用的游戏库, 反倒libevent 这种轻量级的C 库, 被接受的程度似乎更高.
如果这个现象我没有看错, 那么表明了什么呢? 我来初步分析一下:
1. 用到C/C++ 来编程, 对系统的性能, 容量, 可扩展性要求都相对会更高, 否则, 为什么不用更简易的语言来编程 ?
其他语言的库/框架有些不足的情况下, 多数还能够被使用者忍受, 例如 java 不支持非 block io 很多年, 搞得必须thread per connection, 也照样用下来.
但是, C/C++ 碰到这种情况, 就肯定不能被忍受.
2. C++ 的不少库的设计太过野心勃勃, 缺乏专心做好一个工作, 和其它库配合好的思想
ACE 的设计, 是想什么样的通信软件都可以用它, 一网打尽, 结果是很复杂很罗嗦, 做什么都不轻松, 和 C++ 语言的特点倒比较象. 结果是, 做简单的事情, 多数懒得用它, 做复杂的应用, 能不能用还要看应用的具体情况了.
再说一些游戏编程的库, 底层有网络通信, log, thread, 高层有对象管理, 由于 C++ 标准库的缺乏, 以及 C++ 社区的习惯, 这些库都自立更生, 不需要和别的库协作, 也很难协作, 要接受它的设计和实现, 就全部接受, 顶多是自己重新其中的代码, 而很难将几个库中的优秀部分组合起来.
这个因素影响更大, 使得现有的库难以组合发挥作用. 想想, 数学上的组合效应, 可以产生的变化有多少啊.
如果 C++ 的库可以协同工作, 那么现在 C++ 肯定就不至于陷入缺乏库的情况了, 现在是, 什么方面的库几乎都是有的, 但是由于经常只能接受一套, 顶多是一套大的, 加几个很小的.
这是一个很要命的状态, 但是眼下看不到改善的倾向.
说得好!
特别是这句:" 如果 C++ 的库可以协同工作, 那么现在 C++ 肯定就不至于陷入缺乏库的情况了, 现在是, 什么方面的库几乎都是有的, 但是由于经常只能接受一套, 顶多是一套大的, 加几个很小的."
On Dec 12, 2007 10:46 AM, <red...@gmail.com> wrote:
pongba, 我观察到这么一个现象, 不知道你是否同意:
在网络编程这一块, C++ 可重用库的使用覆盖程度, 似乎比这些库设计初衷覆盖程度要小. 不少的客户,服务器项目,例如不少游戏软件项目, 都没有使用 C++ 可重用库 ---- 无论是使用 C++ 通用网络库ACE, 或者专用的游戏库, 反倒libevent 这种轻量级的C 库, 被接受的程度似乎更高.
如果这个现象我没有看错, 那么表明了什么呢? 我来初步分析一下:
1. 用到C/C++ 来编程, 对系统的性能, 容量, 可扩展性要求都相对会更高, 否则, 为什么不用更简易的语言来编程 ?
其他语言的库/框架有些不足的情况下, 多数还能够被使用者忍受, 例如 java 不支持非 block io 很多年, 搞得必须thread per connection, 也照样用下来.
但是, C/C++ 碰到这种情况, 就肯定不能被忍受.
2. C++ 的不少库的设计太过野心勃勃, 缺乏专心做好一个工作, 和其它库配合好的思想
ACE 的设计, 是想什么样的通信软件都可以用它, 一网打尽, 结果是很复杂很罗嗦, 做什么都不轻松, 和 C++ 语言的特点倒比较象. 结果是, 做简单的事情, 多数懒得用它, 做复杂的应用, 能不能用还要看应用的具体情况了.
再说一些游戏编程的库, 底层有网络通信, log, thread, 高层有对象管理, 由于 C++ 标准库的缺乏, 以及 C++ 社区的习惯, 这些库都自立更生, 不需要和别的库协作, 也很难协作, 要接受它的设计和实现, 就全部接受, 顶多是自己重新其中的代码, 而很难将几个库中的优秀部分组合起来.
这个因素影响更大, 使得现有的库难以组合发挥作用. 想想, 数学上的组合效应, 可以产生的变化有多少啊.
如果 C++ 的库可以协同工作, 那么现在 C++ 肯定就不至于陷入缺乏库的情况了, 现在是, 什么方面的库几乎都是有的, 但是由于经常只能接受一套, 顶多是一套大的, 加几个很小的.
这是一个很要命的状态, 但是眼下看不到改善的倾向.
肖兄,网络编程我不熟悉。不过你说的这个现象我觉得的确是广泛存在的,不仅是网络编程。而且不仅在C++里面。OOP的框架类库都有庞大和紧密耦合的毛 病,C的库往往简洁,基本,比如Win32 API,容易在其上再造其它东西。那么,由此是不是得出结论说,库设计应该是分层的,底层用一层最简单的接口封装primitive的功能?
继续召唤这方面有经验的,以下为咒语:@#@$&#%$ :P
GUI 方面, 自己重新造轮子的代码太高, 而且除了游戏编程之外, 性能和内存耗用
也不会是特别问题, 所以, 找一个现成轮子用还是最轻松的.
我觉得这不是 OOP 一定会带来的问题.
举个例来说, C++ 标准库中, 如果提供一个 log 库, 不用特别强, 不用特别完备, 只需要最终用户调用 log 语句这里, 给出一个标准, 能够带来什么好处呢 ?
以后其他家提供 log 功能, 可能功能更强大, 内部实现更复杂, 初始化语句也不同,但是, 给最终用户调用 log 语句这里, 99% 的可能会遵循这个标准, 这能够带来什么呢 ? 虽然, 初始化语句无法移植, 但是程序的主体部分代码, log 部分, 是可以适应多个框架的, 是可以更改 log 库的.
但是, C++ 什么都没有做, 后果就是各家的使用方法都不同, 假设现在 C++ 推一个新的标准, 又怎么样呢 ? 大量的代码已经绑定到不同的框架平台上了.
我觉得C++ 标准库的设计者, 老是想着, 倚天一出, 谁与争锋 ? 但是实际上问题就在这里.
1. 设计一个复杂的库, 用起来麻烦, 以后扩展起来也麻烦
2. 老是出不来标准, 什么事情都被坏掉了
还不如, 设计简单的库, 结构是简单的, API 是清晰的, 存在扩充的余地的, 定好一个标准, 以后第三方可以在这里增强.
BJ 不希望推 C++ 的子集语言, 但是语言分裂. 好, 现在语言不分裂, 但是用户分裂 ---- 不同的用户使用不同的语言特性, 库分裂--- 不同的库不能协同工作. 现在, 即使标准库中加入 log, 网络编程, 线程, 那些已经用ace, zthread 很深入的程序, 难道就会改过去吗 ? C++ 的分裂是最严重的.
D, 语言里面, 如果按照 phobos 的走法, 迟早会在这方面重蹈覆辙, 好在有个 tango, 即使 tango 现在的实现有缺点, 但是, 举例, 希望用到 log 的人, phobos 不够用, 会用 tango, 这就有一个相对标准, 以后的各个第三方库, API 之间起码可以兼容, 不至于写最终代码的人, 用一个第三方库就绑死在上面.
GUI 就不说了, 这方面要提供好用的框架, 确实不容易, 再说, 即使技术上能做出
来, 又怎样呢 ? 各个平台早有自己的主导框架, 有自己的小社区了, 操作系统提
供商主力肯定放在自己的 SDK 上.
但是其他方面, 文件系统, 目录枚举, 进程, 线程, 以及他们的同步和通信, log,
序列化, 网络, 内存池 等等, 这些方面语言能力是够的, 局面不是一样很乱 ?
同样从"心智包袱"出发,云风和 Linus 认为 C++
引诱程序员去做过多的抽象。我则认为是程序员引诱自己去做过多的抽象。所以我得出的结论是,只要放下包袱, C++ 照样可以用嘛;云风得出的结论是
C++ 不能用。
"在绝不对效率进行妥协的前提下进行抽象",这是 C++ 的目标,C++
FQA(http://yosefk.com/c++fqa/index.html) 把这一点抓出来冷嘲热讽,云风和 Linus
则说这是"低效的抽象编程模型"。我这样的 C++
死忠者是不能接受这样的观点的。我认为"在绝不对效率进行妥协的前提下进行抽象"是可行的,问题在于 C++
程序员进行了过多的抽象和错误的抽象,而不在于 C++ 不能正确的抽象。
所以,当我们看到 D 的时候,D 抨击 C++ 抨击得越厉害,我们这些 C++
的死忠就越高兴:"看,'在绝不对效率进行妥协的前提下进行抽象'是能做到的, D 不就做到了吗"
此外,C++ 追求到了极致的类型安全, D 也一样认可,而 C 只是半拉子的类型安全。
对比 std::string 、 std::vector 和 D
的动态数组,这三个东西里面,越靠后的越简单,越靠后的所做的事情越少,越靠后的越好用,越靠后的越透明。
关于抽象, D 所做的事情并不比 C++ 更多,但是比 C++ 更对!
D 做对了!
过几天我会开始写一个新游戏的服务器的代码,我会考虑用 C++ 、 D 或者 Java 。 C++
的优势在于我个人编写经验要多得多,劣势在于没有垃圾收集以及编译速度慢。 D 的优势在于他更容易做对,劣势在于缺乏第三方库,需要移植一些 C
库。 Java 的优势在于 IDE 强大和虚拟机所保证的安全,劣势在于他放弃了极致的性能(当然这也可能是优势)
在 07-12-12,pongba<pon...@gmail.com> 写道:
Linus 那个事件以后的很多文章,属于瞎子摸象,各自摸到一部分。我和云风是两个不同的瞎子,摸到的东西不同,结论也不同。
同样从"心智包袱"出发,云风和 Linus 认为 C++
引诱程序员去做过多的抽象。我则认为是程序员引诱自己去做过多的抽象。所以我得出的结论是,只要放下包袱, C++ 照样可以用嘛;云风得出的结论是
C++ 不能用。
这里的"初学者"还是要细分一下
1)C++的初学者,他们已经熟悉了一门或多门其它语言,因为某种需要来学习c++
2)程序设计的初学者,碰巧用C++来入门。
对于第1种初学者,他们已经对程序设计有了相当不错的了解了,再来学习C++会轻松一些。因为不需要同时对付程序设计概念和C++本身的复杂问题。这种
人在学习C++时虽然可能仍然会有些痛苦,但应该不至于茫然不知所措。
对于第2种初学者,在C++学习上花费更多的时间几乎是肯定的。因为他们不仅要学习程序设计本身,还要对付C++里面那些麻烦的概念。
所以其实很多人并不推荐第2类初学者刚开始就学习C++。起码我看gamedev.net上的很多入门帖的回答都是用C# , Python来入门,以后
需要再来学习C++。
至于BS常说的"我们的系统已经是极度复杂的了,为了避开C++的复杂性而干脆不用C++(Linus的做法),无异于因噎废食。"。这么说没错,有时
C++的确是最好的选择。但C++里面所谓"非本质复杂性"很多也的确是事实。而且这些复杂性还有很多来源于"历史包袱"。所以很多时候用C++更像是
一种妥协,如果有更好得替代品或者没有什么庞大的遗留代码,不知道还会有多少人仍然选择C++。所以这里我想问个问题,C++打算一直妥协下去么?
C++0x按照圈子内人士说,大大有助于简化以后写库的复杂度。可我觉得这里有几个风险:
1。C++0x会象C++98那样获得广泛的支持么?C99M就是一个典型。当初C89很快就获得了一批支持的编译器,可能够完全支持C99的就寥寥无
几了,两大编译器主力VC++和GCC更是没能完整支持(带了个坏头?)。
2。C++0x是在c++98的基础上添加了一堆新特性。这些新增加的特性会减少人们的学习成本么。我意思是在一个本身已经复杂的语言上,再添加一堆特
性,然后说这些特性可以让人们学习和写代码轻松,我不知道事实会不会是这样。
关于楼主文章中所说的"心理因素",或称之为某种"迷信",我觉得虽然有道理,不过很难有什么做为。 可能在小范围内有所影响,但大范围让人们改变很
难。
除非C++社群里出了个"圣人"之类的人物, 可以用简单的办法让人们轻松学会C++,或者人们可以看到写C++可以不用在语言本身上费力挣扎,否
则人们会改变看法么?(bs的新书不知道会有什么效果。)
哈哈, 一鳞半爪地说几句我还可以, 系统地讲述事情, 我就不行了, 会乱七八糟的.
最近几个月, 其实工作任务都很重, 空闲时间不多, 这两天在groups上发了很多厥
词, 是因为有点头痛, 集中不起精神来, 于是乱吐口水 :)
一鳞半爪就很好,不用系统,实际上一旦系统地整理,倒是可能会出现很多废话:P
我有一个建议,见这里: http://groups.google.com/group/pongba/browse_frm/thread/4fc7a675fbb78e9e/d50e12e53f855404#d50e12e53f855404
我甚至觉得OO都不应该过早介入。等到实践当中体会到ADT的不足时再去看或许更好。我们的学习之路往往是一溜小跑把一堆语言特性装脑子里面,根本不知所以然,不知道动机和适用场景,所以,知识有了,能力没有。思考也没有。非得经过了一次次的痛苦挫折才会发现一些道理。而到那个时候,有人就会走得更远,走向另一个极端,认为要简约到...我不知道...过程式编程。我认为这种转变乃是心理所致,并非客观的。
此外,我不认为非得经历痛苦挫折才会发现设计的真谛。而是这些书都讲解得不够深刻。所谓不够深刻,比如说设计模式吧,里面就有大把的模式根本就是在C++语言的静态性质的限制之下衍生出来的workarounds,如果拿到ruby里面就消失了。但关键是书中并没有把这个"背景"讲出来,背景被忽略了,也许作者本人也跟所有人一样,并没有意识到这个背景吧,虽然这个背景其实是适用场合的一个重要部分。结果就是大家都只看到了一个形式,一个花架子,不知道本质是什么。
我的感觉是,读了《设计模式》和《敏捷软件开发》这类书,最大的可能性(绝大多数人)是离好的程序员又远了一步。
--
刘未鹏(pongba)|C++的罗浮宫
http://blog.csdn.net/pongba
TopLanguage
http://groups.google.com/group/pongba
对这段深有同感,一个实践不够的程序员过早的接受OO等概念,过度设计的情况会经常出现
对于ruby,前段时间也是有这样的疑问,GOF中的好多模式发现在ruby中用不太上,写代码的过程中发现基本没用使用模式
On Dec 12, 2007 3:23 PM, SpitFire <spit...@gmail.com> wrote:
对 这段深有同感,一个实践不够的程序员过早的接受OO等概念,过度设计的情况会经常出现
对于ruby,前段时间也是有这样的疑问,GOF中的好多模式发现在ruby中用不太上,写代码的过程中发现基本没用使用模式
不仅不用模式,也不用啥啥Idiom的(我总是把这个词同Idiot搞混:P)。我感觉这就是为什么那么多程序员觉得Ruby用起来解放了的原因。
用Javascript我都觉得解放了许多:P sigh~
看一遍可以,了解精髓:对接口编程而不是对实现编程。至于使用的时候,具体问题具体分析。
在 07-12-12,Atry<pop....@gmail.com> 写道:
--
新的理论从少数人的主张到一统天下,并不是因为这个理论说服了别人抛弃旧观点,而是因为一代人的逝去。
My blog: http://googollee.blog.163.com
呵呵,设计模式看的时候就会想:这个我不是用过了么?原来叫这个名字。
实际上,系统提供的api就是一系列接口。所有应用程序都是对这个接口编程的。虽然系统升级了,应用程序却不用做改动。
实际上,系统提供的api就是一系列接口。所有应用程序都是对这个接口编程的。虽然系统升级了,应用程序却不用做改动。
在 07-12-12,Atry<pop....@gmail.com> 写道:
BTW:
读中学的时候, 大家都知道, 咱们中国考历史最喜欢考年号, 发生地点之类的, 我
机械记忆力差, 曾经考过19分 --- 其实本来是应该是不止的 --- 至少有20 嘛
--- 有一道题目, 我记得事件前后相关地点肯定是意大利三个城市, 但是我记住了
三个城市的名字, 却记不住对应关系, 所以全部填了其中一个城市的名 --- 我至
少对了一个啊, 但是老师就是不给我分, 还将我作为坏人的典型 :(
当年本科毕业的时候, 同学问我考不考研; 后来工作之后, 有个前辈问, 有个博导
找学生, 问我考不考, 我都是赶快摇头, 好不容易捱过了要背书的学生年代, 还要
自己扎进去 ?
BTW again:
本科有个同学, 平时一起逃课, 但是很多课就是考得好, 没办法, 别人脑袋聪明.
搞笑的是, 马列当时是开卷考, 他老人家居然考不及格, 一个年级不多的几个不及
格就有他 ---- 不就是根据题目翻目录抄内容嘛, 虽然目录咱几个都是第一次翻.
这人幸好没有学图书检索专业.
最牛的是一个女同学, 上课总是坐在最后一排开小差, 据说晚上也不学习, 但是别
人次次考试, 都是年级前几名, 不服不行; 到了考研, 也不见她老人家怎么复习,
就考取北大的研究生 ---- 这才知道, 相比之下, 自己的脑袋是绝对的差劲啊.
李扬 写道:
在 07-12-12,WaterWalk<toolm...@163.com> 写道:
能讲讲C#的virtual机制和java和c++的区别么?
在 07-12-14,Eli<Eli...@gmail.com> 写道:
Anders确实是大牛啊,这种细节都考虑的很周到。
D 的作者 Walter 的想法是, 到底什么函数应该 virtual, 什么函数不要
virtual, 对于库的原始设计者来说, 要做这个决定是不容易的, 要做出正确的决
定, 需要非常高超的预见力.
库的用户到时很清楚自己的需要, 所以他将职责转到库的用户那边去了, 库的用户
自己写 override, override 那个函数是不是有问题, 库的用户自己要负责.
Walter 的做法, 对 open source 世界, 实际项目的编写者很有实际意义.
Anders 的做法, 则主要对于库的作者有意义, 特别是, 不 open source 库, 库的
用户无法判断原来的实现是否适合 override, 此时 Walter 的做法行不通.
立场不同, 导致的技术决策都不同, 哈哈, 有意思.
Eli 写道:> Anders说的不是区别, 而是为什么区别.D 的作者 Walter 的想法是, 到底什么函数应该 virtual, 什么函数不要
>
> 他的意思大概是: virtual一个方法的同时你就背负上一个责任, 一个"override该方法如何折腾也不会出错的责任", 而他认为大多数类
> 作者其实根本不想负担这个责任, 所以C#的方法就被设计成默认是不可覆写的, 这样在程序员去打virtual这几个关键字的时候就会注意到这种责
> 任. 如果是默认virtual, 很多懒惰的程序员就会任由virtual传递给继承者, 同时又不负担这种责任.
>
>
virtual, 对于库的原始设计者来说, 要做这个决定是不容易的, 要做出正确的决
定, 需要非常高超的预见力.
不敢苟同。D的数组支持slice,这可是大多数主流语言都不支持的特性啊。
>关于C#增加各种语法糖的问题:
>1. 说到底, 对象不也就是语法糖吗?
>关于委托和匿名委托的问题:
>2. 这几乎就是函数式编程的全部了.
当然,这话没错,问题是:他只能在现在说,在别人折腾了n多年以后才拿过来然后说。为什么不能在别人没有发明以前就折腾出来呢?当然了,我承认Anders很牛,但毕竟只是跟随者而不是首创者,并且,C#【或者更深入的说:.net
framework】的Deleget的实现是很低效的。
关于OO继承以及相关的virtual,其实,C++的实现确实不好。给了类设计者太多的责任,太多的义务,导致扩展性很差。我想那本关于C++,Java,Eiffel比较的书【紫云英翻译的】讲的很透彻了。
对类的编写者来说, 我觉得无需考虑实现哪些接口吧? 这个类是被拿去用的, 至于怎样用这个类实现某个接口, 那不是类作者的事情. 是语言提供机
制, 还是使用者自己Wrapper, 我觉得更好的还是提供一个更外围但足够简单的手段就足够了. 类要求什么接口才是问题所在, 可要求的接口永远
可以通过对另一个类的包装得到满足. 所以说到底, 你重视的这个, 不过还是一个语法糖罢了.
很多人觉得这个似乎无所谓,但实际上只要代码量能减少,生成效率就能提高。相比于不同语言百行代码的bug率来说,不同程序员百行代码的bug率差异更大。也就是说,bug数量几乎与语言没有什么关系,只与代码量相关。
>另外virtual的问题是我说的否定, Java否定了C++的什么, C#否定了Java的什么, 否定的是否有理(有理不代表全面正确)?
Java不再要求程序员指定那个函数是可以被override的,默认所有的函数都是,当然编译器会进行优化。这就是一种否认,对实现多态的机制暴露出来导致的复杂性的否认,显然,编译器可以看到哪个method被override,不需要我们告诉它哪个是virtual的。暴露出来实现机制永远都不能提升抽象层次,virtual如此,inline也如此,register也如此。能够优化的事情编译器比人更清楚。更何况C++给出的这些底层接口不能够直观的任意组合,这其实限制了表达能力。C#相对于Java来说,也是一个退步。
其实关于virtual这个问题, 我的判断思路, 是个外沿法. 即我个人不认为自己能很好的判断是否合适, 我赞同与否, 是看这几个条件:
1. Anders有没有根据经验和样本作出判断的能力. (这个其实又有其它的判断做基础, 总之, 最后必须落实在事实支撑之上)
2. Anders获取经验和样本的渠道是否比别人好.
关于2, 我个人认为以身边的样本作为依据, 从有效性, 距离等方面, 肯定比社区反馈靠谱; 同时, Anders身边的样本也足够大, 如果一单
一组织而论, 也许是世界上最大的? 这样, 咱们碰见的各种情况, Anders得到第一手资料的可能性应该比某些其它设计者更大, 同时咱们没碰见
的情况, 在MS这样的程序员大杂烩里可能照样会碰到.
比如大家都说Google在软件上开始挑战微软, MS有一个搞测试的大牛, 被Google挖走了, 到Google工作了一年, 发现根本没法进行
良好的测试实践, 因为Google根本没有能进行这种实践的环境, 换句话说就是软件开发的整体水平, 太嫩了. 如果你说Google的开发方式不
需要良好的(或者换一个中性的说法, 类似于MS那样的)测试体系, 那Google挖MS墙角干嘛? MS做的东西, 很多很烂, 正是这种人多东西
烂的情况, 才让我相信, MS里那些有权力对各种选择做设定的, 一定会更加谨慎.... 存在即是有原因的, 我比较的不是谁的原因听起来可靠,
而是谁的原因更可能包含更多的事实去支撑.
我相信,社会进步的动力是对最高的投入产出比的追求。而要想达到草最高的投入产出比,对于软件开发来说就是尽可能的重用。你或许觉得你能有把握的预测未来,你或许觉得你的控制比使用者的瞎用更高明,可是这不足以成为我们通过某种技术限制使用者的理由。Ruby之所以流行,就是因为继承了Smalltalk的无所限制的能力,而不是继承了C#的给出明确的限制手段的能力。
另外,给出限制手段【而实际上,限制手段很大程度上是一些不稳定的技术,换一个不同的抽象模型限制手段就完全没有价值了】,实际上限制了语言【或者编译器】的自由发展。C++在这方面的经验够丰富的了。
上午没事干了,下午开忘年会。所以仔细看了一遍。觉得写了很多,也很长 。从内容上应该很适合我这类C++中级初学者。好的地方我就不说了,那样没什么意义。你的水平有目共睹哦。谈谈自己看后的感觉吧。首先没排版分段肯定是让我觉得too long to...感觉思想不够明确,你说了太多的内容,以及你自己的感想,建议也提了太多,虽然条理上还算清晰,可是全文读完就觉得有些空了,没突出你想说明的东西。建议写成一系列文章,分成几个内容去分别阐述。beta版很不错了,期待完成版。还有终结版,以及改良版,和十年纪念版哈哈。。。。pongba老大,我说的都是个人实话,无责任hoho
首先格式分段成几个部分来比较好吧?
读起来感觉每部分说的都还很好,读完之后感觉联系不起来。
完善一下可以在程序员上发表一下也不错。那样细节就需要准确一下,用词也要文一些了哈哈。还有前期分析的太多了,觉得可以简单扼要。毕竟重点在后面。避免头重脚轻。
推荐的书目,我感觉 c++ primer也很好,至于原因么,那里有很多小的有趣的思考。需要细心领会。而且对于c转c++很适合。至于大部头的其他真的看的头晕。
对数据【或者信息】进行表达的手法就叫做code,就叫做编码。它是一种最最基本的抽象机制,使得我们可以用0xCCED表示'好'这个意义,使得我们可以用0x3D表示'+'这个动作,……没有这个东西,很难理解所谓的"计算机语言",很难理解CPU【运算单元,寄存器】,很难理解IDL和WSDL,很难理解XML为什么,很难理解print
x + y为什么……
On Dec 12, 2007 1:46 PM, Atry <pop....@gmail.com> wrote:
Linus 那个事件以后的很多文章,属于瞎子摸象,各自摸到一部分。我和云风是两个不同的瞎子,摸到的东西不同,结论也不同。
同样从"心智包袱"出发,云风和 Linus 认为 C++
引诱程序员去做过多的抽象。我则认为是程序员引诱自己去做过多的抽象。所以我得出的结论是,只要放下包袱, C++ 照样可以用嘛;云风得出的结论是
C++ 不能用。
总算触摸到你的观点了,不容易啊~:-)
话说回来,放下包袱,一句话,做起来谈何容易啊,我blog上有人建议我应该在书单里面加上《设计模式》、《敏捷软件开发:原则,模式与实践》两本。就拿设计模式来说吧,这本书太容易误导人了。当我们手头有一堆fancy的工具的时候,真的很难从心理上摆脱用一用他们的倾向,上次我记得7猫转的douban上的一个讨论里面也有人提到说是C++的特性放着不用觉得暴殄天物,典型心态啊。
我甚至觉得OO都不应该过早介入。等到实践当中体会到ADT的不足时再去看或许更好。我们的学习之路往往是一溜小跑把一堆语言特性装脑子里面,根本不知所以然,不知道动机和适用场景,所以,知识有了,能力没有。思考也没有。非得经过了一次次的痛苦挫折才会发现一些道理。而到那个时候,有人就会走得更远,走向另一个极端,认为要简约到...我不知道...过程式编程。我认为这种转变乃是心理所致,并非客观的。
此外,我不认为非得经历痛苦挫折才会发现设计的真谛。而是这些书都讲解得不够深刻。所谓不够深刻,比如说设计模式吧,里面就有大把的模式根本就是在C++语言的静态性质的限制之下衍生出来的workarounds,如果拿到ruby里面就消失了。但关键是书中并没有把这个"背景"讲出来,背景被忽略了,也许作者本人也跟所有人一样,并没有意识到这个背景吧,虽然这个背景其实是适用场合的一个重要部分。结果就是大家都只看到了一个形式,一个花架子,不知道本质是什么。
我的感觉是,读了《设计模式》和《敏捷软件开发》这类书,最大的可能性(绝大多数人)是离好的程序员又远了一步。
On Dec 21, 2007 11:09 AM, 王磊 <wangle...@gmail.com> wrote:
完善一下可以在程序员上发表一下也不错。那样细节就需要准确一下,用词也要文一些了哈哈。还有前期分析的太多了,觉得可以简单扼要。毕竟重点在后面。避免头重脚轻。
恩。Advice Taken :)
推荐的书目,我感觉 c++ primer也很好,至于原因么,那里有很多小的有趣的思考。需要细心领会。而且对于c转c++很适合。至于大部头的其他真的看的头晕。
ProgrammingRuby的语言部分也有500页。跟TC++PL一样。
底层知识的书最少需要一本,而《深入理解计算机系统》我觉得最好了。
至于其它大部头么...我没有建议预先看完啊:)
C++ Primer不建议;更多站在语言特性的角度来介绍语言。作为reference也许可以。作为入门读物我觉得是误导。