有图有真相

2010-01-29 11:23:48   来自: 那谁 (Stay Hungry,Stay Foolish)
0 bug的评论   2 star rating2 star rating   2


  本不想再参合0bug失望门事件,但是看到肖老师的blog:
  ”关于《0 bug-C/C++商用工程之道》一书出版前后的故事“
  地址:
  http://student.csdn.net/space.php?uid=39028&do=blog&id=23214
  
  我觉得还是有必要将这个文章
  http://www.douban.com/review/2949973/
  的原始记录给更多人看到的,到底发生了什么,看了截图就明白了。
  
  互联网也许是这个时代最好的镜子,当你在twitter,blog等发表你的观点时,会有很多人跟你讨论,事情的真相会在这个过程中慢慢的明晰。如果不能正视这面镜子的作用,而是试图销毁,逃避,扭曲它,最后的结果只能自己来承担。
  
  最初的评论截图在我的相册里,地址:
  http://www.douban.com/photos/album/22875285/
  
  最初截图的来源在这里:
  http://blog.csdn.net/lanphaday/archive/2010/01/27/5260427.aspx
  
  还可以在这里看看文字版:
  http://www.douban.com/group/topic/9651108/
  
你认为这篇评论: 19 2

2010-01-29 11:26:04 赖勇浩

  围观

2010-01-29 11:42:47 悟怡

  我看书皮一直觉得是O bug

2010-01-29 12:13:47 锲而不舍求妹汁

  哦,bug

2010-01-29 15:19:30 [已注销]

  自从中国制造出了完全独立知识产权的龙芯与操作系统以后,程序员也牛逼哄哄的制造出了外国某某些权威都不敢想的0 bug,国家兴旺就靠他们了。

2010-01-31 08:22:43 tingsking

  吐 了

2010-02-01 01:01:47 iLRainyday

  精彩的在于CSDN中那些学生们高呼万岁的精彩场面。

2010-02-03 10:04:55 iWangLian

  @iLRainyday
   精彩的在于CSDN中那些学生们高呼万岁的精彩场面。
  
  想起了《新闻调查》中电疗大师杨教授

2010-02-04 20:40:35 肖舸

   我的新书《0 bug -- C/C++商用工程之道》近期已经面市,经过出版社统计,上市一个月20天左右,销售共计2500多册(出版社数据),这在专业性技术书籍中,应该还是比较乐观的。我作为作者本人,也衷心感谢各位读者的鼓励和支持,我将一如既往地努力进行后续版本的修订和写作,为大家提供更好的精品书籍。
  
   应该说,我写这本书,还是有一定目的的。
  
   目前的社会上,讲C和C++语言的书籍汗牛充栋,但是,我发现有个问题都没有讲,就是“并行计算”。
  
   很多学习计算机软件编程的朋友,在学校中学习到了很多很好的知识,但是,就笔者所知(可能是笔者孤陋寡闻),确实很少有大学开设《并行计算》这门课程。
  
   但我们知道,现实社会中,目前32位多任务操作系统,如Windows、Linux、Unix等操作系统已经完全普及,哪怕连很小的嵌入式设备,如手机上,都开始使用多任务开发环境,这就要求现代程序员必须具有并行程序设计能力,但无疑,目前大多数程序员缺乏这种能力。最直观的例子就是Intel等CPU厂商,为了自己的多核CPU好销,已经开始在各地区开设程序员进修班,以各种形式向大家培训并行程序开发技能,以便解决整个业界无法适应多核多任务开发环境的需求这个问题。
  
   我也是在这种情况下考虑写作本书的,本书虽然定位于0bug,无错化开发,宣导商业化的务实开发思维,但这仅仅是一个方面,传统单任务程序设计的无错化方法,其实已经有很多参考资料了,笔者认为再“炒剩饭”没有多大意义。笔者从第一天开始写作本书,就致力于解决大家关心的一个核心问题:“如何书写无错化的并行程序?”,这应该说是本书的核心宗旨。
  
   这么做的意义显而易见,由于现在是互联网的社会,网络化开发采用C/S模型,但是,大量的书籍讲了Client端的开发和设计,缺很少,甚至没有书籍来描述服务器端的设计技能。但偏偏目前业界几乎所有的应用,都已经逐渐网络化,在未来的集中式和分布式运行模型下,大量的设计需求要求程序员具有多任务服务器的设计能力,这是一个现实的情况。
  
   现在,哪怕一个很小的嵌入式家用路由器,其实都要求具有7*24小时的连续服务能力。这很好理解,大家想想自己家里的小路由器,买回来连通后,是不是很少断电和关机?
  
   所以我作为作者,才认为这本书有这么大的现实意义,我是商用程序员,做事情讲究务实,我写书,也希望切切实实帮助现在的大多数程序员解决自己身边,现在就遇到的问题,因此我从这个角度切入,写作本书。据某些读者朋友反映,本书是:“目前为止我知道的惟一一本关注服务器端程序设计的 C++ 书。而且又是国人的原创作品,十分难能可贵。”
  
   不过呢,俗话说,林子大了,什么鸟都有,网络作为现实社会的一个剪影,确确实实什么人都有的。本书出来后,一直受到很多不必要的干扰,这个,我在博文《关于《0 bug-C/C++商用工程之道》一书出版前后的故事》中,已经有了详细论述,此处就不再详述。
  
   但是,我作为作者,也考虑了,不能把提批评意见的朋友都一竿子打死,这也不是客观的科学态度。毕竟,所谓“枪手”之说,我的猜测居多,并没有什么铁证,只能参考一下。因此,我又静下心来,详细阅读了一些读者,特别是一些“大牛”级的读者的批评意见。希望能找出一些真正属于自己的错误,好修订本书。这也是本着为读者负责的态度。
  
   但是,很奇怪,我发现不管是这些大牛,还是一些小牛,批评的意见大体有个总体思想,就是本书不符合C++开发的主流规范,显得“不标准”,“野路子”。这差不多也是目前批评本人和本书最主流的意见了。这让我这个作者莫名其妙,先不论这些读者是好心还是恶意,也不论他们批评的意见是否正确,但这些意见显然我无法接受。
  
   原因很简单,请大家看本书的书名《0 bug -- C/C++商用工程之道》,这表明,本书源代码其实是用C和C++这两种语言开发完成的,并且,在本书中任何一处提到开发语言的时候,C一定排在C++语言前面,如“C和C++无错化开发方法”。
   就我这个作者本人而言,在平时工作中,我比较喜欢同时使用C和C++两种语言混合开发,当然,以C为主。这一来是工程有时候需要,二来是我个人开发习惯,毕竟,我是先学会C语言,后来才学习的C++语言。
  
   我想这也很好理解,从第一天开始,C和C++语言编译器就是兼容多种语言的,我们知道,几乎所有版本的C和C++语言编译器,都支持内嵌式汇编开发,这是合理的,因为工业控制中很多高速端口操作,需要汇编来完成。所以现代的C和C++编译器,也有逐渐大一统的趋势,无论是VC还是gcc,均支持混合语言编程,可以说,目前我们的主流编译器,基本上都兼容三种语言,C、C++和汇编。
  
   因此,请各位读者就事论事,在阅读过程中,不要用纯正C++语言来考察本书的源代码,本来就不是主要用C++语言开发的。
  
   其实,我分析了一下,在我的源代码中,C和C++的比例,差不多8:2,即80%左右使用C语言开发的。对于C++语言,我本人倾向于“有限使用”,这个呢,是我的习惯,我习惯于到具体功能点的实现,使用C模式,因为即使是C++语言,函数内部都还是OP的,即面向过程的,这符合实际需要,但在模块组织上,我比较喜欢使用C++的对象概念来封装,因为确实方便。
  
   实际上,我曾经想过,是不是以本书定名就定为“C语言商用工程之道”,但显然也不现实,因为书中确实提到了对象。
  
   根据我个人经验呢,这比较符合现代商用系统的开发模型,一个较为大型的系统,尤其是网络相关,很多时候,系统是多种语言的混合体,有C和C++的,还有PHP和Java的,客户端开发还经常使用JavaScript和C#等,这些,我认为都是合理的。这毕竟是一个全方位满足客户需求的综合开发时代。
  
   另外,我这里也说说本书的源代码,很多读者知道,本书虽然内部包含大量带来,甚至包含一个并行开发工程库,但我并没有提供源代码下载服务,也不提供源码光盘,很多朋友都问我为什么,其实我是有原因的。
  
   1、本书定位为一本工程实战书籍,我认为更多是讲思路,讲解法,即share我本人的一些经验,帮助大家在以后的工程开发中,能有一些解决思路,能解决具体问题。因此,我没有认为本书的源代码有多重要。
  
   2、本书的源代码,我本人认为它是一种语言,由C和C++语言代码,以及相关注释,以及相关文字描述共同组成的一门语言,是程序员写给程序员看的一门语言,是用来讲清楚问题的,不是拿来就用的。就好比我们上学时的伪代码,是描述逻辑使用的,仅仅是我这个作者图省事,把自己的代码直接拿出来,做了注释就写到书里了。
  
   3、我本意是写书,不是做开源,如果做开源,我直接在网上开个库供大家下载好了,不需要写书这么麻烦的。
  
   4、本书中代码,最少的都有两年无故障连续运营历史,最多的有9年。但我仍然不认为这些代码就一点bug都没有。只能说,在过去的工程环境下,没有暴露出bug而已。这在书中已经说明了的。
  
   5、本书讨论的0bug,我有专文说明,一来,0bug我认为是程序员应该有的一种追求,是目标,其实我本人也没有做到的,但二来,本书讨论的0bug,可能比大多数人讨论的严厉一点点,即产品卖出钱了,你把钱揣到包包里面,并且落袋为安,不会因为维护再花出去,这个叫做0bug。我想我已经说得够清楚了,此处再次重申一下,就不劳大家不断争论了。
  
   此处呢,我作为作者,在此做个郑重声明,也希望各位读者和准读者朋友能精确看清楚本书的定位,以及写作的目标,有的放矢地购买和阅读本书,以便更好地学有所获。
  
  ==================================================
  
  (以下文字,纯属虚构,如有雷同,实属巧合)
  
  From: Mxxx Yxx <xxxxxx@gmail.com>
  Date: 2010-2-2 12:28
  Subject: Re: 关于程序中需要用锁的原因
  To: xxxx <xxxxxx@gmail.com>
  
  
  x先生你好
  
  謝謝賜教。
  我對於硬體的知識很有限。我以為cache是其中一個可能做成不同步的原因。
  不同的 architecture 下的同步機制會有出入,行為會有出入,所以我認為編程時應該使用平台提供的方法,而不要去假設一些行為。
  RISC 的 load/hit/store 是會造成不同步,但書中說的不一致的例子是: 一個 32-bit data 寫到
  memory,只寫了16-bit,另一個 thread 就去讀取。這個情況我覺得在現代的系統裡應該不存在的。
  所以我才建議,如果不需要就不要寫一些底層的機制,讓讀者明白一組內存/設備要同步時使用同步機制便可以了。
  如果願意, 閣下可以把這討論放到豆瓣, 我轉載也可以的。
  再次感謝x先生的來信指導。
  
  在 2010年2月2日上午11:45,xxxx <xxxxxx@gmail.com> 寫道:
  > 昨天看了您在豆瓣上的书评,以及后面的争论。关于0bug的
  > 有个技术问题跟您讨论一下。
  > 您说的关于程序中需要用锁的原因,是由于smp系统中存在cache。我觉得,这个论断是不正确的。
  > 大多数现代的smp系统,包括多核、多CPU系统,应该都是在硬件解决了这个问题。
  > 比如,小规模的系统,用总线侦听协议,如:MESI协议。
  > 而大规模系统,则用目录协议来解决这个问题。
  > 所以一般来说,在软件实现的互斥锁中,并不会有一个显式的cache同步指令。
  > 即便是在没有cache的单CPU、单核系统中,也可能存在多线程之间的数据不一致的问题。
  > 例如:我们有一个简单程序,一个线程循环执行i++,另外一个线程执行i--,两个线程的循环次数相等,这两个线程的循环次数足够的大的时候,运行完毕之后,i的结果可能不等于初始值。
  > 这是因为,某些RISC体系的CPU,load和store指令是分开的,当一个线程执行了load之后,如果被另外一个线程打断,此时就会出现我们不期望的结果。
  > 即便在x86上,也可能出现,因为对多数语言并不会去定义,i++这条语句应该对应一条什么样的汇编指令。
  > 尽管大多数x86上的编译器会把i++编译成一条inc mem[imm]指令,但这个是不保证的。程序正确性不应依赖于某个特定编译器。
  >
  
  
  下面是MSN的讨论记录:
  
  xx 说:
  打扰
  xx 说:
  昨天看了您在豆瓣上的书评,以及后面的争论。
  xx 说:
  关于0bug的
  xx 说:
  有个技术问题跟您讨论一下。
  xx 说:
  您说的关于程序中需要用锁的原因,是由于smp系统中存在cache。我觉得,这个论断是不正确的。
  xx 说:
  大多数现代的smp系统,包括多核、多CPU系统,应该都是在硬件解决了这个问题。
  xx 说:
  比如,小规模的系统,用总线侦听协议,如:MESI协议。
  xx 说:
  而大规模系统,则用目录协议来解决这个问题。
  xx 说:
  所以一般来说,在软件实现的互斥锁中,并不会有一个显式的cache同步指令。
  xx 说:
  即便是在没有cache的单CPU、单核系统中,也可能存在多线程之间的数据不一致的问题。
  xx 说:
  例如:我们有一个简单程序,一个线程循环执行i++,另外一个线程执行i--,两个线程的循环次数相等,这两个线程的循环次数足够的大的时候,运行完毕之后,i的结果可能不等于初始值。
  xx 说:
  这是因为,某些RISC体系的CPU,load和store指令是分开的,当一个线程执行了load之后,如果被另外一个线程打断,此时就会出现我们不期望的结果。
  xx 说:
  即便在x86上,也可能出现,因为对多数语言并不会去定义,i++这条语句应该对应一条什么样的汇编指令。
  xx 说:
  尽管大多数x86上的编译器会把i++编译成一条inc mem[imm]指令,但这个是不保证的。
  xx 说:
  程序正确性不应依赖于某个特定编译器。
  xx 说:
  稍等,去开会。
  xx 说:
  回来再讨论。
  xx 说:
  hi
  xx 说:
  关于为什么要用锁的问题,可否这样解答。
  xx 说:
  在多线程环境下,多个线程之间共享内存中的对象。
  xx 说:
  程序运行的正确性,依赖每个线程对于内存对象的更改操作的原子性。
  xx 说:
  用锁的目的,就是为了保证原子性。
  xx 说:
  而非原子更改操作产生的原因是多方面的,如:肖先生所说的原因,多个byte分开操作,是一方面的原因。
  xx 说:
  您说的smp体系下cache不一致性的问题,是导致这个问题的另外一个原因。
  xx 说:
  究竟应该用何种类型的锁,是由编程环境所定义的内存一致性模型决定的。
  xx 说:
  对象原子性被破坏的问题,是表现在不同层次上的。
  xx 说:
  他们之间又是相互联系的,如:底层内存访问的不一致,可能导致编程语言和操作系统层面不一致。
  xx 说:
  例如,您说的cache一致性问题,可能被传导到上层编程语言的层面。
  Mxxx 说:
  要正確說明為甚麼要用同步機制, 可能是挺困難的. 我有空的看看相關書籍的說法吧.
  xx 说:
  至于究竟应该用那种类型的锁,是由编程环境决定的,例如:如:PowerPC体系结构采用“释放一致性”模型,是比较松散的。
  Mxxx 说:
  atomicity 和 consistency 好像是兩個不同的 quality
  xx 说:
  而其模型,则要严格些。
  xx 说:
  是的,这是不同的概念。
  xx 说:
  似乎你对中文技术词汇,不是很熟悉
  Mxxx 说:
  小時候主要看台灣的, 現在又看內地的, 都混亂了
  xx 说:
  关于那本书,我没看过
  xx 说:
  但是那个人,我认识
  xx 说:
  我觉得要全面评价一本书籍,是比较困难的事情。
  Mxxx 说:
  這當然了, 不然就不會有評論家了.
  xx 说:
  您之所以产生“失望”的感觉,是因为那本书不太适合您。
  Mxxx 说:
  我希望可以比較客觀地在總結裡寫本書的優缺點
  xx 说:
  如果让一个成年人去读儿童读物,就会比较“失望”
  xx 说:
  当然,也并不是说儿童读物没有价值。
  Mxxx 说:
  其實我看前三章時, 真的感到書裡的不嚴謹, 只是靠經驗去解決問題, 也叫讀者這麼做.
  xx 说:
  这是他的习惯,我并不赞同。
  xx 说:
  但,返回头来说,这本书可能会让另外一些人学习到一些经验。也未尝不是好事。
  xx 说:
  我相信,每个人读书,对其内容都是选择性的读。不会是全盘接受的。
  xx 说:
  如果肖先生能够再谦虚一点,也许更好。
  xx 说:
  打扰了。
  
  --
  Mxxx Yxx
  
  

2010-02-05 09:28:08 肖舸

  话说某日,我正在归妹位看书。
  
  突然,一声怒喝,某人左手板砖,右手大刀片子,身上挂着要你命3000,奔着我就过来了,吓我一跳。
  
  他身后,还跟着一群打了鸡血的小公鸡,一个个鸡冠子竖老高,红得发紫,亢奋得嗷嗷直叫。这叫助威团。
  
  我说大事不好,正待摆出架势接招。
  
  没想到某人行至中途,突然刀锋一转,直接砍到无妄位的电线杆子上去了。
  
  可怜的电线杆,脑门上挂了个“C”。
  
  随后,板砖,脏水,烂西红柿,臭鸡蛋... ...
  
  电线杆惨不忍睹!
  
  我看了一下,觉得无趣,就走了... ...
  
  一个星期以后,我突发奇想,就回去看看。
  
  电线杆子还在,某人还在继续劈砍,不过,显然后继乏力。
  
  助威团呢,还剩下小鸡两三只。鸡冠子也垂下来了。毕竟,从生理学上讲,雄起得太久,会钙化的,呵呵。
  
  我看了一下,觉得无趣,就又走了... ...
  
  ... ...
  
  ... ...
  
  “收工!”,随着导演一声令下,摄影棚一片忙乱。
  
  “碰”,道具关闭了电闸,灯火通明的摄影棚暗了下来。
  
  人声渐行渐远,摄影棚安静下来。
  
  墙边的小门被微风吹开,一缕路灯的灯光,射了进来。
  
  凄白的灯光,射到摄影棚中心的道具“C”电线杆上。
  
  杆下靠坐着某人,嘴里喃喃地说:
  
  “哥拍的不是C,哥只是想成为传说... ...”
  
  
  
  ----仅以此文,纪念2010年春,某人以C++拍C,以及替伪代码debug的神勇之战
  
  

2010-02-05 22:27:13 Kouya

  Twitter观光团路过~瞻仰楼上的脑残。
  
  C的oo和某人的oo的确不是一个东西,因为某人制造的东西,其实本来就不是东西,没有这么个东西,说什么东西。
  
  ==================分割线=====================
  
  其实这本书是教育大家,在C里面扯C++做大旗是会被拍砖的。

2010-02-06 23:59:17 zxwind

  马克之

2010-02-07 00:32:09 [已注销]

  ==================分割线=====================
  
   闲人路过~瞻仰楼上上上的异形脑残体。
  
  ==================分割线=====================
  

2010-02-22 10:41:21 F0ur

  果然这年代是软文的世界- -
  选择国外技术书籍还是正确的

2010-03-10 14:15:35 愤怒的小猪

  面对400多M的2进制文档,一筹莫展之际,我“突发奇想”,既然我不会J,又不会C,那我为什么就不能用ASP来处理他呢?于是,通过16进制编辑器搞定结构之后,用T4400的CPU,2G内存恶跑了43个小时搞定,受到了领导的好评

2010-04-14 22:14:55 Yes

  这么热闹。。

2010-08-12 12:13:40 xxx

  肖舸你完全没必要和这帮刚毕业的SB计较,根本不知道实际工程用法,读了点C++的入门书就在这评论他人的经验,当然我知道你也不可能完全对,你的书文字上再谦虚点就行.中国的人多,XX人也多.


在哪儿买这本书?   · · · · · · 

> 0 bug

0 bug
作者: 肖舸
副标题: C/C++商用工程之道
isbn: 7121098482
书名: 0 bug
页数: 561
定价: 68.00元
出版年: 2010-1

那谁的其他评论   · · · · · ·