C++ 会议第一天

转自:云风的 BLOG

链接:http://blog.codingnow.com/2009/12/cpp2009.html

风云前辈,作为程序员我所致敬与学习的榜样。最近也是项目在一轮一轮的UAT之后终于可以有了比较闲的时间了,可以来好好看看好的文章,了解新的动态,学习新的东西。不然心里总有种不踏实的感觉。这篇文章正好是说大牛讨论的大项目的一些不成功,我也有些同感。

 

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 度,变成一个有层次的结构。从上到下一层层剥离。同一层次上就不要横向切了。

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


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

已标记关键词 清除标记
相关推荐
MD5的全称是Message-digest Algorithm 5(信息-摘要算法),用于确保信息传输完整一致。在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc,的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。它的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。不管是MD2、MD4还是MD5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。虽然这些算法的结构或多或少有些相似,但MD2的设计与MD4和MD5完全不同,那是因为MD2是为8位机器做过设计优化的,而MD4和MD5却是面向32位的电脑。这三个算法的描述和c语言源代码在Internet RFC 1321中有详细的描述(http://www.ietf.org/rfc/rfc1321.txt),这是一份最权威的文档,由Ronald L. Rivest在1992年8月向IETF提交。   MD5最广泛被用于各种软件的密码认证和钥匙识别上。通俗的讲就是人们讲的序列号,   Rivest在1989年开发出MD2算法。在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信息末尾。并且根据这个新产生的信息计算出散列值。后来,Rogier和Chauvaud发现如果忽略了检验和将产生MD2冲突。MD2算法的加密后结果是唯一的--即没有重复。   为了加强算法的安全性,Rivest在1990年又开发出MD4算法。MD4算法同样需要填补信息以确保信息的字节长度加上448后能被512整除(信息字节长度mod 512 = 448)。然后,一个以64位二进制表示的信息的最初长度被添加进来。信息被处理成512位damg?rd/merkle迭代结构的区块,而且每个区块要通过三个不同步骤的处理。Den boer和Bosselaers以及其他人很快的发现了攻击MD4版本中第一步和第三步的漏洞。Dobbertin向大家演示了如何利用一部普通的个人电脑在几分钟内找到MD4完整版本中的冲突(这个冲突实际上是一种漏洞,它将导致对不同的内容进行加密却可能得到相同的加密后结果)。毫无疑问,MD4就此被淘汰掉了。   尽管MD4算法在安全上有个这么大的漏洞,但它对在其后才被开发出来的好几种信息安全加密算法的出现却有着不可忽视的引导作用。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等。   一年以后,即1991年,Rivest开发出技术上更为趋近成熟的md5算法。它在MD4的基础上增加了"安全-带子"(safety-belts)的概念。虽然MD5比MD4稍微慢一些,但却更为安全。这个算法很明显的由四个和MD4设计有少许不同的步骤组成。在MD5算法中,信息-摘要的大小和填充的必要条件与MD5完全相同。Den boer和Bosselaers曾发现MD5算法中的假冲突(pseudo-collisions),但除此之外就没有其他被发现的加密后结果了。   Van oorschot和Wiener曾经考虑过一个在散列中暴力搜寻冲突的函数(brute-force hash function),而且他们猜测一个被设计专门用来搜索MD5冲突的机器(这台机器在1994年的制造成本大约是一百万美元)可以平均每24天就找到一个冲突。但单从1991年到2001年这10年间,竟没有出现替代MD5算法的MD6或被叫做其他什么名字的新算法这一点,我们就可以看出这个瑕疵并没有太多的影响MD5的安全性。上面所有这些都不足以成为MD5的在实际应用中的问题。并且,由于MD5算法的使用不需要支付任何版权费用的,所以在一般的情况下(非绝密应用领域。但即便是应用在绝密领域内,MD5也不失为一种非常优秀的中间技术),MD5怎么都应该算得上是非常安全的了。   2004年8月17日的美国加州圣巴巴拉的国际密码学会议(Crypto’2004)上,来自中国山东大学的王小云教授做了破译MD5、HAVAL-128、 MD4和RIPEMD算法的报告,公布了MD系列算法的破解结果。宣告了固若金汤的世界通行密码标准MD5的堡垒轰然倒塌,引发了密码学界的轩然大波。   令世界顶尖密码学家想象不到的是,破解MD5之后,2005年2月,王小云教授又破解了另一国际密码SHA-1。因为SHA-1在美国等国际社会有更加广泛的应用,密码被破的消息一出,在国际社会的反响可谓石破天惊。换句话说,王小云的研究成果表明了从理论上讲电子签名可以伪造,必须及时添加限制条件,或者重新选用更为安全的密码标准,以保证电子商务的安全。   MD5破解工程权威网站http://www.md5crk.com/ 是为了公开征集专门针对MD5的攻击而设立的,网站于2004年8月17日宣布:“中国研究人员发现了完整MD5算法的碰撞;Wang, Feng, Lai与Yu公布了MD5、MD4、HAVAL-128、RIPEMD-128几个 Hash函数的碰撞。这是近年来密码学领域最具实质性的研究进展。使用他们的技术,在数个小时内就可以找到MD5碰撞。……由于这个里程碑式的发现,MD5CRK项目将在随后48小时内结束”。   MD5用的是哈希函数,在计算机网络中应用较多的不可逆加密算法有RSA公司发明的MD5算法和由美国国家技术标准研究所建议的安全散列算法SHA.
  本书详细分析了软件工程师求职过程中的常见问题,深入解析了各大it公司考查求职者的面试真题,告诉读者用人单位需要什么样的技术人才、考查什么样的技术知识以及如何甄别人才。全书分4篇,共17章。第1篇是求职过程,讲述了程序员求职的整个过程,包括职业规划、简历撰写、简历投递、笔试以及各类面试,并列出了最常用的英文面试词汇方便读者参考。第2篇是c/c++面试题,作为本书的核心,主要讲述了c/c++程序员需要掌握的各项技术,并结合各大公司实际的面试题进行讲解,对一些面试所考查的重点和难点进行了全面和深入的分析解答。读者可以通过阅读本部分全面了解c/c++技术面试的各个方面,快速复习c/c++编程的知识。第3篇是智力测试,囊括了面试中常见的智力面试题,读者可通过阅读本部分迅速提高分析和解答问题的能力。第4篇是职场生涯,读者可以全面了解和感悟办公室文化,从而提升自己的软实力。    本书适合应聘计算机软件开发领域职位的应届毕业生和其他求职者阅读,也适合作为软件开发从业人员和计算机爱好者的参考书。 目录: 第1篇 求职过程 第1章 职业规划 2 1.1 关于理想 2 1.2 职业方向 2 1.3 如何选择职业方向 3 1.3.1 兴趣 4 1.3.2 能力 4 1.3.3 经验 5 1.3.4 现实需求 5 1.4 it人员的职业方向 6 1.5 大小公司 6 1.5.1 大公司 6 1.5.2 小公司 7 1.6 中企外企 8 1.6.1 语言差异 8 1.6.2 文化差异 8 第2章 简历撰写 9 2.1 基本要求 9 2.2 主要内容 10 2.3 目标型简历 11 .2.4 英文简历 12 2.5 模板 13 2.5.1 中文简历示例 13 2.5.2 英文简历示例 15 2.6 求职信 17 2.7 推荐信 19 2.8 其他手段——博客、网站 20 2.9 简历投放 20 第3章 面试 22 3.1 准备面试 22 3.2 面试方式 23 3.2.1 电话面试 23 3.2.2 面对面面试 24 3.2.3 常见问题 26 3.2.4 感谢信 31 3.2.5 笔试 31 3.3 待遇谈判 32 第2篇 c/c++面试题 第4章 c/c++程序基础 36 4.1 变量赋值 36 4.1.1 一般赋值语句 36 4.1.2 i++与++i 39 4.2 编程规范 42 4.2.1 条件比较 42 4.2.2 命名规则 43 4.3 类型转换 44 4.4 数值交换 45 4.5 c和c++的联系与区别 47 4.6 main函数之后的调用 50 第5章 预处理、const、static与sizeof 52 5.1 预处理 52 5.1.1 #ifdef、#else、#endif指示符 52 5.1.2 宏定义 54 5.2 const(常量) 57 5.3 static变量(静态变量) 59 5.4 sizeof操作符 62 5.5 inline与宏定义 75 第6章 引用和指针 78 6.1 引用 78 6.1.1 引用的基本问题 78 6.1.2 参数引用 81 6.1.3 常量引用 84 6.1.4 引用与指针的区别 85 6.2 指针基础 86 6.2.1 指针的声明 87 6.2.2 指针的运算 88 6.2.3 指针常量与常量指针 93 6.2.4 c++中this指针 95 6.3 指针数组与数组指针 97 6.4 函数指针与指针函数 100 6.5 野指针 105 6.6 动态内存的传递 111 6.7 指针与句柄的区别 118 第7章 字符串 120 7.1 数字与字符串的转化 120 7.1.1 数字转化为字符串 120 7.1.2 字符串转化为数字 123 7.2 字符串与数组 125 7.2.1 strcpy函数与memcpy函数 126 7.2.2 数组越界 128 7.2.3 其他编程问题 131 第8章 位运算与嵌入式编程 165 8.1 位制转换与位运算 165 8.1.1 位制转换 165 8.1.2 位运算 166 8.2 嵌入式编程 171 第9章 c++面向对象 176 9.1 面向对象的基本概念 176 9.2 class和struct的区别 178 9.3 成员变量 182 9.4 构造函数和析构函数 188 9.4.1 构造函数 188 9.4.2 析构函数 194 9.5 复制构造函数和赋值函数 197 9.5.1 复制构造函数 197 9.5.2 赋值函数 202 9.6 函数重载和运算符重载 214 9.6.1 函数重载 214 9.6.2 运算符重载 217 第10章 c++继承和多态 228 10.1 继承的概念 228 10.2 私有继承 233 10.3 多态的概念 237 10.4 多重继承和虚拟继承 246 10.5 纯虚函数和抽象基类 251 10.6 com(组件对象模型) 257 第11章 数据结构 266 11.1 单链表 266 11.2 循环链表 278 11.3 双向链表 280 11.4 双向循环链表 286 11.5 队列 293 11.6 栈 297 11.7 二叉树 303 第12章 排序 317 12.1 插入排序 317 12.1.1 直接插入排序 317 12.1.2 希尔(shell)排序 319 12.2 交换排序 321 12.2.1 冒泡排序 321 12.2.2 快速排序 324 12.3 选择排序 325 12.3.1 直接选择排序 326 12.3.2 堆排序 327 12.4 归并排序 330 12.5 基数排序 333 12.6 各种排序方法比较 336 第3篇 智力测试 第13章 智力测试题 340 13.1 数学能力 340 13.2 推理能力 351 13.3 反应能力 368 第4篇 职场生涯 第14章 踏上征途 374 14.1 第一天上班 374 14.2 入职事项 375 14.3 最初几周 376 14.4 蘑菇管理定律 377 第15章 渐入佳境 379 15.1 从依赖走向独立 379 15.1.1 习惯一:积极主动 380 15.1.2 习惯二:以终为始 383 15.1.3 习惯三:要事第一 386 15.2 建立目标 389 15.3 评价工作表现 390 15.3.1 年终总结 391 15.3.2 绩效考评 391 15.4 开会及发言 392 15.4.1 会议主持人 392 15.4.2 会议参与者 395 15.4.3 powerpoint技巧 395 15.5 电子邮件 397 15.5.1 基本注意事项 397 15.5.2 电子邮件类型 398 15.6 电话沟通 399 15.6.1 打电话的技巧 400 15.6.2 接电话的技巧 401 15.7 面谈 402 15.8 培训 403 15.9 加班 403 15.10 请假 404 15.11 出差 405 15.12 报销 406 第16章 风雨江湖 407 16.1 从独立走向互赖 407 16.1.1 习惯四:双赢思维 408 16.1.2 习惯五:知彼解己 409 16.1.3 习惯六:统合综效 409 16.1.4 习惯七:不断更新 410 16.1.5 总图 410 16.2 和老板的关系 411 16.2.1 给你的老板分个类 411 16.2.2 老板的话必须要听 417 16.2.3 老板的话要听懂 418 16.2.4 老板说的总是对的 419 16.2.5 不要给老板惊奇 421 16.2.6 和老板建立良好关系 422 16.2.7 被老板表扬 424 16.2.8 被老板批评 426 16.2.9 意见和建议 427 16.2.10 尽快投靠新老板 428 16.2.11 外国老板 429 16.2.12 异地老板 432 16.3 和同事的关系 433 16.3.1 合作 433 16.3.2 处理争议 437 16.3.3 沟通 438 16.3.4 竞争 441 16.4 和客户的关系 443 16.4.1 态度决定成败 444 16.4.2 谈判风格 446 16.4.3 谈判技巧 449 16.5 和其他部门的关系 450 16.5.1 和业务部门之间的关系 450 16.5.2 和服务部门之间的关系 452 第17章 更上层楼 453 17.1 升职加薪 453 17.1.1 如何谋求升职 453 17.1.2 如何要求加薪 455 17.2 换部门 459 17.2.1 在现岗上做出成绩 460 17.2.2 学会谦虚与等待 460 17.2.3 如何提?把戏演好 460 17.3 辞职 461 17.3.1 决定是否要辞职 461 17.3.2 如果不能辞职 462 17.3.3 开始找新工作 463 17.3.4 提出辞职 463 17.3.5 离开工作岗位 464
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页