« 骨骼动画的插值与融合 | 返回首页 | 不要像小贝那样学习C++ »

C++ 会议第一天

Lippman 大牛的第一场,关于大型可伸缩性的软件开发的, Chen Shuo 同学翻译的很不错 :D

找到电源,所以可以写写了。

果然是牛人啊,上来就讲形而上的东西。我听的有趣,就做了点笔记,但是记的不多。

我们从自然界去寻找灵感,然后在计算机领域去搞出来。以前的计算机是没有内存的,后来冯大侠说,计算机就像大脑,大脑是有记忆的,所以有了内存。

我们现在说大脑就像计算机,是本末倒置了。人们总是从自然界的角度来思考,然后解决软件里的问题。Lippman 牛的想法是,把软件比作生物,从 DNA ,细胞核开始向上一层层的。

系统的基础组织部分是 Data Structure 和 Data Stream ,这个就像细胞一样;在应用领域方面,Executive Function 和 Type Information 就好比生物的各个器官。

大牛参加了许多项目,他抱怨了一轮,说好多都可耻的失败鸟。大项目就是容易失败。程序员辛苦啊,根本不是所谓白领。而且每个程序员都是不可替代的。因为每个人的学习经历不同,看待问题不同,写出来的程序就不同。人们对编程的理解并不像想象的那么美好。现在慢慢的我们提高了抽象层次,按这个宇宙存在的方式去运作。但是从 java 开始学习编程,对程序员来说是有很大代价的,以前用 pascal 开始学习程序也有很大代价。大约是说,失去了对某些本质的理解。形成的对程序世界的世界观会有问题。

说回大项目,比如他参加的 Visual Studio 就不是啥成功的产品。用 .net 做 Windows 也很失败,那玩意根本就跑不快。微软做软件的哲学有问题,所以做不好。

有一个土星登陆器的项目,一代代技术都更新了。他作为技术顾问,提了些建议。主架构师纠结于用 java 还是用 C++ 这种问题上。其实架构师根本不应该关心用啥语言做。语言好不好都是屁话,把事情做好才对。最终项目是失败了。有很多问题都不是常规方法可以处理的。比如通讯的问题,因为土星上有什么什么,导致有时候信号 5,6 小时发不出去,等等。传统的通讯连接方式就不适用。

还有好多项目(有具体列举,没一一记了),做着做着,做了好几年,程序员心都凉了。

另一个是 MMO 项目,花了几千万,还是可耻的失败鸟。做出来后,什么都好,什么都很完美,只能支持 40-50 人在线。公司还说圣诞就要上。高层说,无所谓,不能玩也无所谓,做出来就好。结果当然是不能用的。开发人员心那是拔凉拔凉的。

再话说,Sun AT&T 几个公司想用 C++ 重写 Unix 。还有 IBM 等等用 Unix 的公司,搞了个啥邪恶同盟。反正最后也是可耻的失败鸟。

还有 Bell Labs 的 Plan 9 。东西是好的。不过根本不能成为一个产品。这里,提醒各位同学,找工作要小心。先侦察一下,如果公司就是要做个啥项目光冲着赚钱去的,这心态就有问题,肯定玩完。还有管理人员一定要懂技术,要知道做的东西是怎么回事。否则碰到这种倒霉事赶紧卷铺盖走人,别浪费青春。

接下去又说了好多悲剧,比如 IBM 的 OS/2 啥的。说着说着,说不下去了,名单太长,全是血泪史啊。

Lippman 接着自比江湖百晓生。我觉得他是自谦,想说自己其实只是倚老卖老,知道许多事情,参与了很多项目而已。


正题其实是说怎么做大规模可伸缩性的项目。结论很悲观,说 C++ 其实不适合做这个。最后我问了个问题,说那什么合适呢。他没正面回答。不过举了个例子,提了爱因斯坦的相对论,还有量子力学。大约是想说,C++ 更像是 BS 大牛个人的作品,他一个人构架了 C++ 的大部分东西。但是我们未来需要新的语言来解决问题的话,应该参考量子力学的发展过程,大家一起来构架。C++ 呢,说这个最后可能会被我们带进坟墓。不是 C++ 不好,是因为细节太多,没人全搞的明白。结果每个人写出来的程序都不一样。指定规范很难。最后会有很多人不愿意学。

正题里围绕的实际例子是在动画工业中的。其实做动画,好多工具都是用完即弃的。提高可复用性,关键在于要把可复用单元做的足够小。做大就没人理你了。

他们有人(貌似说的 pixar)做了个神奇的东西,反正就是类似 method 注册啦,动态生成类型啦之类的一个奇妙的 C++ 玩具。可以把代码动态的以字符串形式注册进去。动态生成一些类,一些接口调用之类。大约加了两个间接层。代码里充斥着所谓的注册代码。往往多达几千个。当然性能上也因为这个间接层,下降了几十倍。

当然,大型可伸缩的项目,性能也不是关键的东西。

这里还插了几句关于脚本的。说是有 C++ 程序员说,其实我拿 C++ 写什么什么也很快的。不过那不行,因为 C++ 程序员太少。你用 C++ 写没问题,不过要求你写完了翻译成 perl 代码.

不过这个东西很复杂,所以除了写它的人,没人愿意去看怎么实现的。后来做这个的那个家伙回巴黎去了。那些代码也很可怕,很复杂,里面也有很多 bug 。

后来 Lippman 也做了个类似的东西,也是号称 Metaprogramming ,不过不是所谓 template metaprogramming ,而是代码生成代码。最终自动生成的是 C 结构。不过主要目的达到,就是隐藏众多细节。有人说这个不是 OOP ,没有 class 啥的,不过他认为这个也是 OOP 。OOP 不能看表象。他说,他其实只是想明白个事,关于静态数据和动态部分之类。

这个例子我很有感触,因为我们公司曾经也有个类似的东西。做了个 C++ 和 lua 的巨复杂的粘合层。弄的看起来很高级。结果发明和维护的人走了后,用它的项目组都以把这坨东西从项目中去掉为荣。


说起大项目,Lippman 说,一切失败的大项目都有个通病。就是时间很长,经过几年后,就变成了一个封闭王国。结果没人知道在干啥。里面拉帮结派,为了一些无所谓的技术问题争来吵去。其实争论的都不是要干的事情。

另外,项目太大了后,就没人了解项目的全部细节。渐渐的,大家都只关心自己做的那一块。这样很糟糕。他思考后,认为解决的方法是,应该把结构旋转 90 度,变成一个有层次的结构。从上到下一层层剥离。同一层次上就不要横向切了。

嗯,这个问题我也很有感触,虽然我的项目不算特别巨大。但是只有我一个人了解项目全部的细节,这让人很累。当然如果要每个人都了解全部细节,就会让每个人都很累。


以上是我凌乱的一些听课笔记。很多有趣的东西没来的及记下。可能也有很多我的误解在里面。同学们姑且看之吧。

Comments

过来看看了。感觉挺好的!

每篇文字都写的好长呀,喜欢

我觉得最经典的架构设计就是

TCP/IP协议栈了。

Christmas is coming!Do you want to buy something to your relatives or friends?The headphone is on sale!you can do shopping by youself !I think it will be your best choose!

看过,不错的文章,带走了

软件分层不就是分成几个项目来做嘛,最后再统一测试。

此言误解了软件分层

在逻辑架构中,分层是为了切割逻辑,而不是简单的划分子项目

本身架构师在最初的概念架构时,就不应该考虑系统使用什么语言来开发整个系统,而是在进一步细化时,从技术,人,系统约束等方面来权衡使用哪一种语言来机型系统开发。

你好,欢迎交换友情连接 http://www.xiw.org.ru/index.shtml

还有管理人员一定要懂技术,要知道做的东西是怎么回事。否则碰到这种倒霉事赶紧卷铺盖走人,别浪费青春。


真是切身有感~

出什么事情了 还没更新??

我每天打开十次 看看有没有更新,老大不更新我这小程序员看不到人生的希望了

平均每天要打开三次来看看有米有更新:)

老大该写博客了啊,怎么还不更新博客呢,
正等着您的新作看呢...

云风从美国回来了吗?希望更新一些那边儿的见闻让大家感受一下.呵呵,谢谢了.

看来c++如此罪大恶极,我们该咋整哪,各位达达给个出路。

學習到不少東西,謝謝

风风去美国了。。

别可哪乱跑了,博客才是你永远的家啊,赶紧更新!

李大爷,还不退休

还有捕捉动作实验室啊,用在游戏里么?

Lippman 大牛,提出了问题,但没有给解决方案,任务直接交给下一代了 :)

Lippman 大牛,提出了问题,但没有给解决方案,交给下一代了。

很有共鸣。
比如不要为了OO而OO,仿生学是用来启发灵感的,矫揉造作生搬硬套就是在折腾和限制自己了。发现很多人都会犯这样的错。这就像是潜水艇从鲸鱼的身体和上浮下沉方法中得到启发就够了,不要给潜水艇也装一个鱼一样的尾巴来作为推进装置...

ada语言也很不错,可惜不流行。

云风前辈的博客看多了
自己的代码写的也多了一些

我现在也决定开始用C的方式使用C++了

目前的主打开发工具是VC2005/2008
而C++中的stl和class诱惑还是很大的,不用不爽,

但我现在已经是"浅使用"了,
不再以写了个仿函数,搞懂了个迭代器为荣

暂时回归C,面向机器,面向传统的数据结构+算法
面向应用,面向库API...
就是暂时不面向复杂的语言本身了,不以掌握复杂怪异的语法为荣了

(以后经验丰富,水平再高些了,可能会研究下语法,以及它为什么要这样,从编译器和库设计的角度看看C++的语法)

莫华枫:学过C++却从来不会用!
<strong>同顶</strong>

其实我觉得Stan自己演讲的主题也不够清晰。反正最后没有给出一个很好的解决方法,他的意思是把现有的问题和不完善的解决方法摆在大家面前,希望给大家以启发。他自己都说了寄希望于后辈,呵呵。
关于Stan对C++悲观的问题,我倒不这么认为。专门去问他关于语言发展的问题,他的意思是说目前的语言都有一个适用的阶段,之后就会逐渐走向衰退,不仅仅是C++一门的问题,各个语言都会这样。Stan的意思是现在面对超大规模软件开发需要一种新的技术来解决现有的问题,但并没有和语言相关。

个人还是觉得C++0x会是C++的一次涅磐重生,让C++足以继续活跃xx年。

云风高中是几班的?

后来呢?第二天怎么样了?

感谢你的分享,对我有所启发

还很着急

下载的东西都还在,就是Lua for Windows 最新版的安装包找不到了,

有知道的跟下帖,谢谢了

知道云风前辈的博客,来看Lua的人多...

云风前辈,和恰好看到这里的朋友
问一个可能不合宜的问题:
今天我上网的时候发现关于Lua的好几个网站都打不开了,
是怎么回事呀?
luaForge,lua官网打不开我可以理解
但是luaer.cn也打不开了
...很奇怪,

语言的选择不完全是一个技术问题,同时也会是一个政治问题,所以从技术上来看微不足道的事情,在实际项目生产中也可能会是个大问题。

其实有人是在选择语言吗?其实8成选择语言的情况/争执是在选择平台及风格吧。
在我看来相同平台上的多语言才算是“语言之争”,但这也就近两年才出现,而且至今没有流行开来……

@kepper

可以参见SICP的第四章,其实应对复杂性的最有效方法就是发明新的语言。当然不是有C++了,再搞个Java或者C#之类的意思。

项目太大了后,就没人了解项目的全部细节。渐渐的,大家都只关心自己做的那一块。这样很糟糕。他思考后,认为解决的方法是,应该把结构旋转 90 度,变成一个有层次的结构。从上到下一层层剥离。同一层次上就不要横向切了。

什么意思?

听你说好玩,就知道肯定有博客可看,果然看到了......

总结得挺好,谢谢。

没办法,c++是唯一能用的高性能语言,不知道google的go如何。目前,只能在做项目的时候定写原则,别玩花的,可读性很重要。

噢,云风也去了,怎么没发现你提问。。

呃,幸好带了接线板,解决了一干人等电源问题。:)
那个土星登陆器应该说的是卡西尼号上的惠更斯探测器,在卫星泰坦上着陆的。Lippman还提到了勇气号和机遇号。
个人觉得,用C++是没办法。又需要抽象,又需要性能,加上其他要求,还真找不出更适合的。

学过C++却从来不会用!

看来你很忙呵呵,都是中午休息时写的

看来你很忙呵呵,都是中午休息时写的

@Fenng

翻墙不是问题 :) 我买了国外的 ssh 帐号。

问题是,电源缺乏啊。后来我都是用铅笔。中午才敲成文章。

冯提出来的存储程序的概念是为了解决图灵机模型中无限存储的实现问题的。

应该翻墙用Twitter直播嘛

回头帮你翻

有时候,语言会左右怎样去做。语言是解决问题思维范型的具体表达,不仅仅是实现工具,语言即是实现工具,更是思考工具。

@庄表伟

可能是我没理解对。

应该这样理解,构架师不应该固执于用什么语言去做。

或者说,用什么语言其实不那么所谓。选择语言应该是实现人员的选择。做的人会找到更合适的语言。而总构架师想的是要做什么,怎么去做的问题。

"其实架构师根本不应该关心用啥语言做。语言好不好都是屁话,把事情做好才对。"

"结论很悲观,说 C++ 其实不适合做这个。最后我问了个问题,说那什么合适呢。他没正面回答。"

一个项目的成败,到底跟用的语言,有没有关系?如果有关系,那就得吵明白再做。

深表赞同。
个人认为,现在最成熟的架构是框架+插件的方式。这类的成功软件和网站很多,如winamp, emacs, eclipse, wow, facebook

软件分层不就是分成几个项目来做嘛,最后再统一测试。

软件工程不知会发展成什么样?软件是万千人脑思想的综合,不可能像工业制造那样发展。

沙发。看来是趁着午饭时间写的。

Post a comment

非这个主题相关的留言请到:留言本