社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 银行

  • 206508阅读
  • 1107回复

软件编程杂谈文章汇总

级别: 管理员
发帖
8532
金币
2762
威望
3231
贡献值
0
元宝
0
只看该作者 9楼 发表于: 2010-09-20
暴雪CEO谈魔兽开发
一年一度举行暴雪娱乐嘉年华(BlizzCon)的安纳汉姆市(Anaheim)驱车,半个 小时左右就能达到尔湾市(Irvine)。如果要寻找暴雪娱乐(Blizzard Entertainment)总部,只要在加利福尼亚明媚阳光中看到一座巨大的骑着狼坐骑的兽人雕像,即便不是《魔兽世界》(World of Warcraft)忠实玩家也知道已来到全球最赚钱的游戏公司门口。这座由《指环王》场景制作团队完成的雕像有着恢宏的气势和难以置信的细节。底座上的铭牌刻有暴雪娱乐的LOGO和使命宣言:“致力于创造史上最史诗级的游戏体验”,周围的铜环则有“游戏性至上”、“精益求精”等八大理念。


当暴雪娱乐想要立一座雕像,方案当然很多,它简直有无数可供使用的角色。“我们想选最能体现我们游戏精神的,而在魔兽中没有比兽人更具代表性的。这座雕像捕 捉到了我们想传达给全体员工的精神,也提醒着我们魔兽的重要性。”暴雪娱乐联合创始人兼CEO迈克·莫汉(Mike Morhaime)对《环球企业家》这样解释,而他最喜欢的魔兽角色正是兽人领袖萨尔(Thrall)。


莫汉自己是就游戏界中的萨尔。从1991年与艾伦·安德汉(Allen Adham)、弗兰克·皮尔斯(Frank Pearce)创立暴雪娱乐前身“硅与神经键”(Silicon & Synapse),近20年间他们打造出《魔兽争霸》(Warcraft)、《星际争霸》(Starcraft)和《暗黑破坏神》(Diablo)三大系 列电脑游戏,在全世界赢得数千万玩家,并赚得上百亿美元。1999年5月美国发现号航天飞机(Discovery)首次和国际空间站对接时,其中就携带着 一份《星际争霸》。




(暴雪娱乐联合创始人兼CEO迈克·莫汉(图右)认为,让像魔兽首席设计师J·艾伦·布拉克(图左)这样对游戏充满爱和天赋的人做好自己的工作,创新自然就会产生)
在 中国,暴雪娱乐同样享有最高赞誉。其“暴雪出品,必属精品”的口碑在单机游戏时代就已树立,2005年《魔兽世界》引入后立刻成为最流行的大型多人在线角 色扮演游戏(MMORPG)。此后5年间,它是中国最赚钱的游戏之一,围绕其代理权和管辖权,九城与网易、文化部与新闻出版总署一度上演激烈的争夺战(详 情请于Gemag.com.cn查阅《网易“魔兽”劫》)。


无论怎样波折,《魔兽世 界》在中国的400万玩家绝大多数对其痴心不改。“它的任务系统和团队协作都颠覆了我们以前玩的韩国网游,再也不是单纯地打怪升级,而是有了剧情、休闲和 感情投入。”玩家“猫知道”从《魔兽争霸》时代便是暴雪娱乐的拥趸,在她看来,现在无论韩国还是中国的网游多少都有借鉴魔兽。狂热者俯拾皆是,姗姗来迟的 《魔兽世界》第二部资料片《巫妖王之怒》(Wrath of the Lich King)8月31日正式上线十几分钟后,就有玩家抢到“服务器第一”,24小时之后就有人满级。


这 正是莫汉乐于见到的。他将魔兽玩家形容为智慧、激情、充满创意,而暴雪娱乐赢得这样一群玩家的全部秘诀不过是“做出很棒的游戏”:“我们过去几年发布的游 戏其实并不多,但我们尽力把这少数几个游戏做到最好,玩家也很赞赏这种做法。对品质的追求和对细节的注重让我们建立起高品质游戏的品牌和声誉,在全球玩家 中建立起忠诚度。我希望能这样持续下去。”


现在,莫汉已很少编程,而是把时间主要用 于支持研发团队以确保其能获得制作出伟大游戏所需的资源,并把这些作品带给尽可能多的人。他怀念日夜思考如何解决技术问题时的日子,但他知道现在的暴雪娱 乐能做到很多“硅与神经键”无法实现的激动人心的事,比如在全世界旅行与热爱他们游戏的玩家见面。


随 着魔兽、星际和《暗黑破坏神》的成长,这些大型游戏变得比以前更庞大复杂,暴雪娱乐在实现“创造史上最史诗级游戏体验”野心的路途中也遇到更多困难。此 外,世界也变得不一样,基于手机等移动设备和社交网站的游戏正在成为很多人的新宠。下一个十年,暴雪娱乐是否依然是全球风头最劲的游戏公司?


我 们无需为此担心太多。2001年暴雪娱乐成立十周年时,迈克·莫汉曾论及未来的世界:“我们会关注所有的科技进展,并想出各种新鲜有趣的利用这些技术的办 法。我现在无法说清楚这到底是怎么回事,但这很可能与互联网、无线设备、多平台、3D画面等相关,并带来更赏心悦目的娱乐体验。我很想看到暴雪娱乐被更多 铁杆游戏圈之外的人们了解。我们甚至可能证明,一部基于游戏改编的电影并不一定糟糕。”显然,他的每一句话都说对了。


暴雪创世纪


《巫 妖王之怒》的世界主设计师(lead world designer)艾力克斯·艾法希比(Alex Afrasiabi)拥有一把“五年之剑”,这意味着他在暴雪娱乐工作已超过5年。在2000多天里他设计了无数个任务,而他最喜欢的一个是:在死亡骑士 的区域中,玩家来到一个礼拜堂,指挥官命令处决一个俘虏;但这个俘虏会认出玩家,并讲述一个悠长而悲伤的故事。


事 实上,艾法希比喜欢这个部分并不是因为被自己设计的故事感动,而是在这个任务内部测试时接到魔兽首席设计师J·艾伦·布拉克(J. Allen. Brack)的电话:“他简直为随后要发生的情节崩溃了。我问他:‘你是在哭吗,J?’他说:‘这一刻我是。’然后挂了电话。于是这一刻就成了我的最 爱。”




(《魔兽世界》是全球最赚钱的MMORPG,而莫汉认为1200万玩家不过是个开始)
魔 兽中的每一个任务和情节背后都有类似故事。这些设计师记得自己设计的第一个任务,也能辨认出同事的设计风格。他们通常坐得很近,有人摆弄些惊人的东西就会 被围观。开始设计时,设计师们会看着地图上的一个区域问自己:“如果我是玩家,我在这里会想做些什么?”然后把想法变成现实。当发现同事为自己设计的情节 感动得不得了,或是觉得骑在科多兽上拿散弹枪把跑过来的野猪人轰上天的想法很酷,他们就会想:“如果这群人都认为这很感人、这很酷,那我总算是搞出一些东 西了!”


风靡全球的《魔兽世界》就是这样开发出来的,没有玩家调研,也没有所谓的系 统性创新,只有一群对游戏充满激情和天赋的人聚在一起日以继夜地工作,试图创造出自己就很喜欢玩的游戏。“我们玩很多游戏,有很多想法。游戏开发过程中自 己的体验和感受很重要,如果研发团队对自己从事的项目没有激情,成功几率会低得多。”迈克·莫汉认为,只要让那些对游戏充满爱的人做好自己的工作,创新自 然就会产生。


狂热分子创造出来的游戏并不是只有少数游戏发烧友才喜欢,暴雪娱乐设计游戏的指导思想之一便是让所有人都能获得乐趣,无论是“菜鸟”还是骨灰级玩家。他们的游戏上手相对容易,也不需要专业级电脑配置,这甚至被视为暴雪娱乐的主要竞争力之一。


莫 汉向本刊表示,不同人在暴雪游戏中可以找到不同玩法。以《星际争霸II》为例,玩家既可以玩单人战役,这有点像看一部交互的电影;也可以和自己水平相当的 玩家进行一对一的对战,或者在二对二的对战中体验一下合作对抗;还可以通过强大的编辑器创造属于自己的游戏地图,做出跑步比赛、象棋比赛等小游戏。他尤其 指出暴雪娱乐很希望支持喜欢编辑地图的玩家,他们打算设立一个类似苹果App Store的“地图市场”,玩家可以提交自己设计的地图,其中高质量的将能面向其他玩家出售,制作者可分享所得收入。


像 《星际争霸II》这样的大型游戏开发难度一直在增加,但暴雪娱乐拥有行业中对即时战略游戏(RTS)最有经验的团队,其中不乏参与1994年发布的初版 《魔兽争霸:兽人与人类》(Warcraft: Orcs & Humans)的开发者。“经过这些年我们当然变得更聪明一些,可以利用我们的经验创造出更复杂的内容。但我认为理解会跑之前要会走非常重要。”


莫 汉指出,暴雪娱乐的研发通常是先会有一个想法,把它做出来并测试,自己玩也让很多其他人玩,并在这个过程中观察其他人,比如他们在哪里卡住了、哪里觉得不 明白,然后修改并重复一遍这个过程,经过很多次试错,“直到所有人都很满意”。而准确判断出哪些反馈是有价值的,正是优秀游戏设计师与普通之间的区别。


这个过程非常连续、相关,所以暴雪娱乐的核心研发都在尔湾市总部完成,不会分散到其他国家。 早在1990年代,他们就有了这方面的教训。 1995年《魔兽争霸II:黑潮》(Warcraft II: Tides of Darkness)发布后,暴雪娱乐决定开发一款基于这个世界观的图形冒险游戏《魔兽争霸:氏族王子》(Warcraft Adventures: Lord of the Clans)。


因为自身并不具备开发这种2D手绘冒险游戏 的能力,暴雪娱乐提供所有的设计、故事背景、声效录音并确保故事连续性,然后将制作外包给俄罗斯圣彼得堡的游戏公司Animation Magic。虽然一开始很顺利,但接下来语言和沟通等问题很快在细节工作中暴露出来。尽管后来暴雪娱乐挖来老牌冒险游戏设计师史蒂夫·马瑞扎克 (Steve Meretzky)挽救这个项目,最终仍选择了放弃。


长达20年的游 戏开发中,暴雪娱乐学到的经验教训即便没有覆盖满整个艾泽拉斯大陆(Azeroth),至少也挂满了整棵世界之树(The World Tree)。从RTS《魔兽争霸》跨越到MMORPG《魔兽世界》是暴雪娱乐历史上的一次飞跃,在这个过程中最困难的甚至不是游戏设计,而是游戏范围和规 模的延展。要维系一个同时涌入成千上万玩家的世界的秩序比RTS复杂得多,错误和问题不可避免。暴雪娱乐最初的应对方法是在知道到底出了什么问题、解决方 案是什么、什么时候能修复之前三缄其口,这让不知情的玩家除了等待和抗议别无他法。“后来我们开始改变,定期更新信息,让玩家知道问题是什么,修复进展又 如何。”莫汉认为这是暴雪娱乐历史上的巨大改进之一。


现在,暴雪娱乐已开始着手开发 下一代MMORPG。对于这个仍处在非常早期的项目莫汉不能透露太多细节,但他表示这会是一款全新的游戏,不基于已有三大游戏中任何一个的世界观,也不是 用来取代魔兽的。“原来魔兽团队中的一些人现在在做这个新游戏,但我们还是会把最重要的资源给魔兽。这个游戏会非常有趣,能调动并放大我们在《魔兽世界》 中创造的所有体验。”


多少出人意料的是,莫汉对《环球企业家》表示:“我们并不是追 求完美,而是追求做出卓越的游戏(great games)。如果我们追求完美就永远也发布不了了。什么时候足够好了,这是我们必须做的判断。”当被问及传说中的新游戏是否会是“革命性”的时,他思考 了5秒钟后回答:“我们从不追求革命性,我们只是创造非常有趣的游戏和体验。就我们的游戏而言,越是努力打磨一些东西,人们就越能感觉到你刻意做出这些选 择。很多时候设计师特意做的一些创新并没有得到赞赏。”


故事背后的故事


迈 克·莫汉将自己视为创造美好的极客。生于1960年代的他曾是《龙与地下城》(Dungeons & Dragons)、《星球大战》(Star Wars)、《星际迷航》(Star Trek)的狂热爱好者,对游戏和科技更有着天生的热情。他得到的第一台游戏机带有简单的BASIC语言编程工具和1.5K内存,于是他开始研究这台机器 如何运行。对莫汉而言,电脑能存储、编译虚拟的数据,电话能把声音传送到世界上任何一个角落—这一切实在太酷了。


1991年,莫汉的同学艾伦·安德汉召集他与弗兰克·皮尔斯创立“硅与神经键”,当时他们不过是从加州大学洛杉矶分校(UCLA)毕业半年的年轻人。1994年,公司改名为“暴雪娱乐”。




(1998年《星际争霸》发售时比初始预计晚了两年,但在头3个月即售出100万份。同样迟到的《星际争霸2》在2010年7月底发售后更是48小时就售出近150万份)
硅与神经键和早期的暴雪娱乐规模非常小,两三辆车就能把整个公司载去酒吧,打发一个人就能买回所有人的午餐,然后大家坐在地板上吃着汉堡包和薯条,继续讨论游戏。他们彼此都是非常亲密的朋友,会在一起做每件事:吃饭、看电影、泡吧和打扑克牌等等。


莫 汉们在硅与神经键时期最著名的作品是《失落的维京人》(The Lost Vikings)。这款游戏一开始只是一小群维京人到处跑来跑去,随后被改进为动作解谜游戏,主角也变成3个具有特定能力的维京人。这是暴雪娱乐设计所有 游戏的典型方法:从一个想法开始,随时准备改进它,以便让更多想法加进来。


他们每年 都会去拉斯维加斯国际消费电子展(CES),看最新最流行的科技趋势是什么,别人又在干些什么。回来以后就开七八个人的全体大会,讨论看到的游戏、行业走 向,以及如何把学到的东西放进正在做的游戏。那时他们就想到将来可以建立一个虚拟的幻想世界,让玩家在其中通过自己的化身与其他玩家进行交互式冒险。 1994年开发《魔兽世界:兽人与人类》时他们就想这样做,但这个很酷的点子当时在技术上还无法实现,所以还停留在脑子里。1997年 Origin开发出MMORPG鼻祖《网络创世纪》(Ultima Online),看到这个游戏暴雪娱乐便明白科技发展已经可以使他们的想法实现了。但直到1999年,《魔兽世界》的项目组才正式成立,而在接下来的5年 里这款大作都不会面世。


事实上,开发《魔兽世界》之前暴雪娱乐曾尝试过另一个游戏。 1998年3月《星际争霸》发售后,暴雪娱乐成立了一个团队来开发代号“游牧民” (Nomad)的基于团队作战的科幻游戏。他们试图创造出新的游戏类型和世界,但在很多方面都陷入泥潭。最终,暴雪娱乐开始思考这是不是他们当下真正想要 做的游戏,并最终放弃了它。与此同时,所有人都认为应该基于《魔兽争霸》的故事情节开发一款MMORPG。既然没有任何理由不这么做,“游牧民”团队便转 战《魔兽世界》。


《魔兽世界》显然是异常庞大复杂的项目,无论游戏设计、引擎还是基本方向都反复权衡过无数次。其早期设计像《暗黑破坏神II》一样同时包括单人模式和免费的多人模式,但MMORPG与单机游戏相差太远,无法统一在一个游戏中,为了保证品质,暴雪娱乐选择了前者。


“游牧民”和此前提到的《氏族王子》并不是暴雪娱乐仅有的“弃儿”。放弃这些已投入大量时间、精力、资源和创造力的游戏开发项目是暴雪娱乐和迈克·莫汉最惨痛的教训和最艰难的选择。


此 类悲剧中最著名的是《星际争霸:幽灵》(Starcraft: Ghost)。这是一款基于星际世界观的战略动作游戏,并是暴雪娱乐在索尼PlayStation2、微软Xbox和任天堂GameCube平台上的尝 试。开发计划始于2002年,并做了相当多的宣传,但4年过去了仍无法达到暴雪娱乐预期,终于在2006年3月进入“无限期搁置”。


忆 及《幽灵》时,莫汉不无惋惜地对《环球企业家》说:“我们很为这个游戏兴奋,到现在仍然相信它会是很好的游戏。”但当时正是《魔兽世界》发布前后,很多资 源用于增加游戏内容和满足玩家需求,这样《幽灵》的团队就不可能得到高质量人才—不管什么时候他们找到好的艺术家或程序员,《魔兽世界》也想要并且总是能 得到那个人。


显然,《幽灵》无法在这样的环境中取得成功。暴雪娱乐放弃它后,将资源 重新配置给《魔兽世界》、《星际争霸II》和《暗黑破坏神III》,聚焦于这3个项目,并都取得极大成功。“每放弃一个项目都是非常艰难的决定,但都是正 确的。我们学到的最大教训就是聚焦才能取得更大成功,如果精力分散到太多事情上,可能都没有好结果。”





极客与商人


如果暴雪娱乐拥趸来到尔湾市,可以在暴雪娱乐总部附近寻找一家叫Morton's的牛排馆。正是在这里,迈克·莫汉与罗伯特·科蒂克(Robert Kotick)谈定了暴雪娱乐与另一游戏巨头动视(Activision)的合并。


2007 年12月,暴雪娱乐母公司法国媒体集团维旺迪(Vivendi)和动视宣布,前者将以17亿美元现金加上旗下81亿美元游戏业务,收购后者52%股份。整 个交易价值189亿美元,包括暴雪娱乐在内的维旺迪游戏业务并入动视,新公司名字就叫动视暴雪(Activision Blizzard),这其实相当于双方合并,由科蒂克出任CEO。




(动视暴雪CEO罗伯特·科蒂克是更纯粹的商人)
为保证谈话的私密性,莫汉在Morton's定了一个包间。出乎意料的是,这个房间非常大,而Morton's只在这个巨大的房间正中摆了一张桌子和两把椅子,结果显得“一点也不慎重,反而很搞笑”。


这 场关系两家公司命运的谈话长达4个小时。从哲学问题到价值问题,莫汉和科蒂克询问了对方每一件事,比如什么是最重要的。对莫汉而言,必须通过这场谈话确信 科蒂克珍视暴雪娱乐的独特价值。“鲍比(罗伯特的昵称)知道我们最独特的是我们的文化和对品质的追求,这些需要被珍视和保护。我要确保他意识到这一点,并 且不想改变我们。”莫汉对《环球企业家》说。


经过那晚的4个小时,他彻底相信了科蒂克,因为他问了很多难题,而科蒂克每个都答对了—如果暴雪娱乐原计划11月发布的一款游戏看上去在年内按时发布都没戏了,这可怎么办?答案是:“那就不发布了呗。”


相比始终追求游戏乐趣至上的迈克·莫汉,罗伯特·科蒂克是更纯粹的商人。2010年6月在参加E3游戏展时,他表示自己的使命是把动视暴雪从全球最赚钱的游戏公司变成最赚钱的娱乐公司,给股东带来更多回报。


事 实上,商人科蒂克大学时的专业是艺术史。据其回忆,是苹果掌门人史蒂芬·乔布斯(Steve Jobs)将其从大学“劝退”:“你学的是艺术史,但你压根不去看那些画。那你为什么还要做这个?你有一家公司,你给苹果机开发软件,所以你是企业家。不 要在大学里浪费时间了。去,开你的公司吧。”这些乔布斯自己可能都已不记得的“洞见”被科蒂克视为此生得到的最佳职业建议。




(迈克·莫汉)
科蒂克本人也是颇具争议的游戏界传奇。从1991年到2008年与暴雪娱乐合并前,他一直是动视的CEO,并把这个专注于电视游戏(video game)的公司从濒临倒闭拯救出来,且推上能与电子艺界(Electronic Arts)相提并论的一线位置。


与 暴雪娱乐合并之前,据汤森路透估算,动视总共进行过25起并购,其中大多是没有披露交易数额的游戏开发工作室。科蒂克最著名的手笔是2006 年以超过9000万美元的价格收购制作《吉他英雄》(Guitar Hero)的RedOctane,这款2005年发布的游戏在动视旗下大获成功,发行26个月销售收入就超过十亿美元。


据 科蒂克回忆,他与迈克·莫汉间的“交易”可追溯至1995年。当时他与暴雪娱乐的东家教育软件公司Davidson & Associates的人一起吃饭,对方提到他们以700万美元收购了暴雪娱乐。那年动视的收入大约6000万美元,听到这个数字科蒂克的反应是:“你们 失去理智了吗?他们不过是游戏外包开发商,除了《魔兽争霸》他们还有什么?你们居然付了700万美元!”动视暴雪成立后,科蒂克与莫汉曾说起这件往事: “我本可以700万美元就买下你们,而不是花70亿美元。”而莫汉的回答是:“你有没有想过,如果我那时就问你要70亿而不是700万呢?”


当 我们说到科蒂克是商人而莫汉是极客时,莫汉大笑着说:“我觉得我也是很好的商人呀。”他或许是很好的商人,但他一定是最好的游戏制作者,而他对科蒂克最大 的要求和最赞赏的地方,便是保持暴雪娱乐的独特价值和在游戏创造过程中的想法。当《星际争霸II》无法按预期在2009年发布时,科蒂克就像在 Morton's回答的那样,尊重了暴雪娱乐的领导力、经验和判断,支持延期发布。


独 立性并不是暴雪娱乐的姿态,而是与其游戏品质和品牌息息相关。这一点上暴雪娱乐必须感谢“失去理智的”Davidson & Associates。双方谈判交易时,他们就承诺不会改变暴雪娱乐的运营方式,而这一段相处决定了暴雪娱乐此后与众多不同母公司合作时追求独立的风格。 1996年,Davidson & Associates被CUC International收购,暴雪娱乐随之转手。CUC International希望暴雪娱乐在8个月内发布一款《暗黑破坏神》资料片以便乘市场火热时进一步榨取剩余价值,在暴雪娱乐不肯妥协的情况下,它找 到Synergistic Software制作了资料片《地狱火》(Hellfire),但风评远不及暴雪娱乐的原版。


“我 和科蒂克取得的共识是,在游戏业中要取得商业成功,最重要的因素还是有最好的游戏。”莫汉对本刊表示。1998年《星际争霸》发售时比初始预计晚了近两 年,但在头3个月即售出100万份。同样迟到的《星际争霸II》在2010年7月底发售后48小时就售出近150万份,平均每分钟卖出533 份,成为今年迄今最热门的游戏。


自《暗黑破坏神》之后,暴雪娱乐的每一款游戏几乎都 “跳票”。这使得迈克·莫汉非常诚恳地对《环球企业家》表示:“不管你们相不相信,我们对时间表其实是很严肃的,我们并不比玩家更喜欢游戏延期发布。但当 我们这样做时,一定有很充分的理由,因为在允许的时间框架内把游戏做到达到暴雪娱乐标准,是我们在准备游戏发布之前最想做到的事。”


玩 家或许不愿等待太久,但他们更不愿对暴雪娱乐失望。事实上,所有的等待都物有所值。正如前面所说的,暴雪娱乐设计游戏的方法是从一个想法开始,随时准备改 进它,以便让更多想法加进来,而与暴雪娱乐未来发展紧密相关、契合社交化趋势的对战平台战网(Battle.net)正是在《暗黑破坏神》开发的最后阶段 才提出的设计。有时10%的优化调整决定了一款游戏是优秀还是伟大。这就是为什么科蒂克会思考如何在《星际争霸》系列中加入赞助和广告,但不会剥夺暴雪娱 乐用来寻找这10%的时间。
QQ: 378890364 微信:wwtree(省短信费) 紧急事宜发短信到0061432027638  本站微博:http://t.qq.com/wwtree QQ群:122538123
级别: 管理员
发帖
8532
金币
2762
威望
3231
贡献值
0
元宝
0
只看该作者 10楼 发表于: 2010-09-27
C++强大的背后

在31年前(1979年),一名刚获得博士学位的研究员,为了开发一个软件项目发明了一门新编程语言,该研究员名为Bjarne Stroustrup,该门语言则命名为——C with classes,四年后改称为C++。C++是一门通用编程语言,支持多种编程范式,包括过程式、面向对象(object-oriented programming, OP)、泛型(generic programming, GP),后来为泛型而设计的模版,被发现及证明是图灵完备的,因此使C++亦可支持模版元编程范式(template metaprogramming, TMP)。C++继承了C的特色,既为高级语言,又含低级语言功能,可同时作为系统和应用编程语言。
C++广泛应用在不同领域,使用者以数百万计。根据近十年的调查,C++的流行程度约稳定排行第3位(于C/Java之后)。 C++经历长期的实践和演化,才成为今日的样貌。1998年,C++标准委员会排除万难,使C++成为ISO标准(俗称C++98),当中含非常强大的标准模版库(standard template library, STL)。之后委员会在2005年提交了有关标准库的第一个技术报告(简称TR1),并为下一个标准C++0x而努力。可惜C++0x并不能在200x年完成,各界希望新标准能于2011年内出台。
流行的C++编译器中,微软Visual C++ 2010已实现部分C++0x语法并加入TR1扩充库,而gcc对C++0x语法和库的支持比VC2010更多。
应否选择C++
哪些程序适宜使用C++?
C++并非万能丹,我按经验举出一些C++的适用时机。
C++适合构造程序中需求较稳定的部分,需求变化较大的部分可使用脚本语言;
程序须尽量发挥硬件的最高性能,且性能瓶颈在于CPU和内存;
程序须频繁地与操作系统或硬件沟通;
程序必须使用C++框架/库,如大部分游戏引擎(如Unreal/Source)及中间件(如Havok/FMOD),虽然有些C++库提供其他语言的绑定,但通常原生的API性能最好、最新;
项目中某个目标平台只提供C++编译器的支持。
按应用领域来说,C++适用于开发服务器软件、桌面应用、游戏、实时系统、高性能计算、嵌入式系统等。
使用C++还是C?
C++和C的设计哲学并不一样,两者取舍不同,所以不同的程序员和软件项目会有不同选择,难以一概而论。与C++相比,C具备编译速度快、容易学习、显式描述程序细节、较少更新标准(后两者也可同时视为缺点)等优点。在语言层面上,C++包含绝大部分C语言的功能(例外之一,C++没有C99的变长数组VLA),且提供OOP和GP的特性。但其实用C也可实现OOP思想,亦可利用宏去实现某程度的GP,只不过C++的语法能较简洁、自动地实现OOP/GP。C++的RAII(resource acquisition is initialization,资源获取就是初始化)特性比较独特,C/C#/Java没有相应功能。回顾历史,Stroustrup开发的早期C++编译器Cpre/Cfront是把C++源代码翻译为C,再用C编译器编译的。由此可知,C++编写的程序,都能用等效的C程序代替,但C++在语言层面上提供了OOP/GP语法、更严格的类型检查系统、大量额外的语言特性(如异常、RTTI等),并且C++标准库也较丰富。有时候C++的语法可使程序更简洁,如运算符重载、隐式转换。但另一方面,C语言的API通常比C++简洁,能较容易供其他语言程序调用。因此,一些C++库会提供C的API封装,同时也可供C程序调用。相反,有时候也会把C的API封装成C++形式,以支持RAII和其他C++库整合等。
为何C++性能可优于其他语言?
相对运行于虚拟机语言(如C#/Java),C/C++直接以静态形式把源程序编译为目标平台的机器码。一般而言,C/C++程序在编译及链接时可进行的优化最丰富,启动时的速度最快,运行时的额外内存开销最少。而C/C++相对动态语言(如Python/Lua)也减少了运行时的动态类型检测。此外,C/C++的运行行为是确定的,且不会有额外行为(例如C#/Java必然会初始化变量),也不会有如垃圾收集(GC)而造成的不确定性延迟,而且C/C++的数据结构在内存中的布局也是确定的。有时C++的一些功能会使程序性能优于C,当中以内联和模版最为突出,这两项功能使C++标准库的sort()通常比C标准库的qsort()快多倍(C可用宏或人手编码去解决此问题)。另一方面,C/C++能直接映射机器码,之间没有另一层中间语言,因此可以做底层优化,例如使用内部(intrinsic)函数和嵌入汇编语言。然而,许多C++的性能优点并非免费午餐,代价包括较长的编译链接时间和较易出错,因而增加开发时间和成本,这点稍后补充。
我进行了一个简单全局渲染性能测试(512x512像素,每像素10000个采样),C++ 1小时36分、Java 3小时18分、Python约18天、Ruby约351天。评测方式和其他语言的结果详见博文。
C++常见问题
C++源代码跨平台吗?
C++有不错的跨平台能力,但由于直接映射硬件,因性能优化的关系,跨平台能力不及Java及多数脚本语言。然而,实践跨平台的C++软件还是可行的,但须注意以下问题:
C++标准没有规定原始数据类型(如int)的大小,需要特定大小的类型时,可自订类型(如int32_t),同时对任何类型使用sizeof()而不假设其大小;
字节序(byte order)按CPU有所不同,特别要注意二进制输入输出、reinterpret_cast法;
原始数据和结构类型的地址对齐有差异;
编译器提供的一些编译器或平台专用扩充指令;
避免作应用二进制接口(application binary interface, ABI)的假设,例如调用函数时参数的取值顺序在C/C++中没定义,在C++中也不可随便假设RTTI/虚表等实现方式。
总括而言,跨平台C++软件可在头文件中用宏检测编译器和平台,再用宏、typedef、自定平台相关实现等方法去实践跨平台,C++标准不会提供这类帮助。
C++程序容易崩溃?
和许多语言相比,C/C++提供不安全的功能以最优化性能,有可能造成崩溃。但要注意,很多运行时错误,如向空指针/引用解引用、数组越界、堆栈溢出等,其他语言也会报错或抛出异常,这些都是程序问题,而不是语言本身的问题。有些意见认为,出现这类运行时错误,应该尽量写入日志并立即崩溃,不该让程序继续运行,以免造成更大的影响(例如程序继续把内存中错误的数据覆写文件)。若要容错,可按业务把程序分割为多进程,像Chrome或使用fork()的形式。然而,C++有许多机制可以减少错误,例如以string代替C字符串;以vector或array(TR1)代替原始数组(有些实现可在调试模式检测越界);使用智能指针也能减少一些原始指针的问题。另外,我最常遇到的Bug,就是没有初始化成员变量,有时会导致崩溃,而且调试版和发行版的行为可能不同。
C++要手动做内存管理?
C++同时提供在堆栈上的自动局部变量,以及从自由存储(free store)分配的对象。对于后者,程序员需手动释放,或使用不同的容器和智能指针。 C++程序员经常进一步优化内存,自定义内存分配策略以提升效能,例如使用对象池、自定义的单向/双向堆栈区等。虽然C++0x还没加入GC功能,但也可以自行编写或使用现成库。此外,C/C++也可以直接使用操作系统提供的内存相关功能,例如内存映射文件、共享内存等。


使用C++常要重造轮子?
我曾参与的C++项目,都会重造不少标准库已提供的功能,此情况在其他语言中较少出现。我试图分析个中原因。首先,C++标准库相对很多语言来说是贫乏的,各开发者便会重复地制造自订库。从另一个角度看,C++标准库是用C++编写的(很多其他语言不用自身而是用C/C++去编写库),在能力和性能上,自订库和标准库并无本质差别;另外,标准库为通用而设,对不同平台及多种使用需求作取舍,性能上有所影响,例如EA公司就曾发表自制的EASTL规格,描述游戏开发方面对STL的性能及功能需求的特点;此外,多个C++库一起使用,经常会因规范不同而引起冲突,又或功能重叠,所以项目可能须自行开发,或引入其他库的概念或实现(如Boost/TR1/Loki),改写以符合项目规范。
C++编译速度很慢?
错,是非常慢。我认为C++可能是实用程序语言中编译速度最慢的。此问题涉及C++沿用C的编译链接方式,又加入了复杂的类/泛型声明和内联机制,使编译时间倍增。在C++对编译方法改革之前(如module提案),可使用以下技巧改善:第一,使用pimpl手法,因性能损耗应用于调用次数不多的类;第二,仅包含必要头文件,并尽量使用及提供前置声明版本的头文件(如iosfwd);第三采用基于接口的设计,但须注意虚函数调用成本;第四,采用unity build,即把多个cpp文件结合在一个编译单元进行编译;第五,采用分布式生成系统如IncrediBuild。
C++缺乏什么功能?
虽然C++已经非常复杂,但仍缺少很多常见功能。 C++0x作出了不少改善,例如语言方面加入Lambda函数、闭包、类型推导声明等,而库方面则加入正则表达式、采用哈希表的unordered_set/unordered_map、引用计数智能指针shared_ptr/weak_ptr等。但最值得留意的是C++0x引入多线程的语法和库功能,这是C++演进的一大步。然而,模组、GC、反射机制等功能虽有提案,却未加进C++0x。
C++使用建议
为应用挑选特性集
我同意Stroustrup关于使用C++各种技术的回应:“你可以做,不意味着你必须这么做。(Just because you can do it, doesn‘t mean that you have to.)” C++充满丰富的特性,但同时带来不同问题,例如过分复杂、编译及运行性能的损耗。一般可考虑是否使用多重继承、异常、RTTI,并调节使用模版及模版元编程的程度。使用过分复杂的设计和功能,可能会令部分团队成员更难理解和维护。
为团队建立编程规范
C++的编码自由度很高,容易编写风格迥异的代码,C++本身也没有定义一些标准规范。而且,C++的源文件物理构成,较许多语言复杂。因此,除了决定特性集,每个团队应建立一套编程规范,包括源文件格式(可使用文件模版)、花括号风格。
尽量使用C++风格而非C风格
由于C++有对C兼容的包袱,一些功能可以使用C风格实现,但最好使用C++提供的新功能。最基本的是尽量以具名常量、内联函数和泛型取代宏,只把宏用在条件式编译及特殊情况。旧式的C要求局部变量声明在作用域开端,C++则无此限制,应把变量声明尽量置于邻近其使用的地方,for()的循环变量声明可置于for的括号内。 C++中能加强类型安全的功能应尽量使用,例如避免“万能”指针void *,而使用个别或泛型类型;用bool而非int表示布尔值;选用4种C++ cast关键字代替简单的强制转换。
结合其他语言
如前文所述,C++并非适合所有应用情境,有时可以混合其他语言使用,包括用C++扩展其他语言,或在C++程序中嵌入脚本语言引擎。对于后者,除了使用各种脚本语言的专门API,还可使用Boost或SWIG作整合。
C++学习建议
C++缺点之一,是相对许多语言复杂,而且难学难精。许多人说学习C语言只需一本K&R《C程序设计语言》即可,但C++书籍却是多不胜数。我是从C进入C++,皆是靠阅读自学。在此分享一点学习心得。个人认为,学习C++可分为4个层次:
第一层次,C++基础:挑选一本入门书籍,如《C++ Primer》、《C++大学教程》、或Stroustrup撰写的经典《C++程序设计语言》或他一年半前的新作《C++程序设计原理与实践》,而一般C++课程也止于此,另外《C++ 标准程序库》及《The C++ Standard Library Extensions》可供参考;
第二层次,正确高效地使用C++:此层次开始必须自修,阅读过《(More)Effective C++》、《(More)Exceptional C++》、《Effective STL》及《C++编程规范》等,才适宜踏入专业C++开发之路;
第三层次,深入了解C++:关于全局问题可读《深入探索C++对象模型》、《Imperfect C++》、《C++沉思录》、《STL源码剖析》,要挑战智商,可看关于模版及模版元编程的书籍如《C++ Templates》、《C++设计新思维》、《C++模版元编程》;
第四层次,研究C++:阅读《C++语言的设计和演化》、《编程的本质》(含STL设计背后的数学根基)、C++标准文件《ISO/IEC 14882:2003》、C++标准委员会的提案书和报告书、关于C++的学术文献。
由于我主要是应用C++,大约只停留于第二、三个层次。然而,C++只是软件开发的一环而已,单凭语言并不能应付业务和工程上的问题。建议读者不要强求几年内“彻底学会C++的知识”,到达第二层左右便从工作实战中汲取经验,有兴趣才慢慢继续学习更高层次的知识。虽然学习C++有难度,但也是相当有趣且有满足感的。
数十年来,C++虽有起伏,但她依靠其使用者而不断得到顽强的生命力,相信在我退休之前都不会与她分离,也希望更进一步了解她,与她走进未来。



QQ: 378890364 微信:wwtree(省短信费) 紧急事宜发短信到0061432027638  本站微博:http://t.qq.com/wwtree QQ群:122538123
级别: 管理员
发帖
8532
金币
2762
威望
3231
贡献值
0
元宝
0
只看该作者 11楼 发表于: 2010-10-06
编程的21个潜规则

任何一个有经验的程序员都知道,软件开发遵循着一些不成文的法则。然而,如果你不遵循这些法则也并不意味着会受到惩罚;相反,有时你还会获得意外的好处。下面的就是软件编程中的21条法则:

    任何程序一旦部署即显陈旧。修改需求规范来适应程序比反过来做更容易。一个程序如果很有用,那它注定要被改掉。一个程序如果没用,那它一定会有很好的文档。任何程序里都仅仅只有10%的代码会被执行到。软件会一直膨胀到耗尽所有资源为止。任何一个有点价值的程序里都会有至少一个bug。原型完美的程度跟审视的人数成反比,反比值会随着涉及的资金数增大。软件直到被变成产品运行至少6个月后,它最严重的问题才会被发现。无法检测到的错误的形式无限多样,而能被检测到的正好相反,被定义了的十分有限。修复一个错误所需要投入的努力会随着时间成指数级增加。软件的复杂度会一直增加,直到超出维护这个程序的人的承受能力。任何自己的程序,几个月不看,形同其他人写的。任何一个小程序里面都有一个巨大的程序蠢蠢欲出。编码开始的越早,花费的时间越长。一个粗心的项目计划会让你多花3倍的时间去完成;一个细心的项目计划只会让你多花2倍的时间。往大型项目里添加人手会使项目更延迟。一个程序至少会完成90%,但永远完成不了超过95%。如果你想麻烦被自动处理掉,你得到的是自动产生的麻烦。开发一个傻瓜都会使用的软件,只有傻瓜愿意使用它。用户不会真正的知道要在软件里做些什么,除非使用过。
[英文出处]:21 Laws of Computer Programming
QQ: 378890364 微信:wwtree(省短信费) 紧急事宜发短信到0061432027638  本站微博:http://t.qq.com/wwtree QQ群:122538123
级别: 管理员
发帖
8532
金币
2762
威望
3231
贡献值
0
元宝
0
只看该作者 12楼 发表于: 2010-10-11
PHP需要被取代

是到了PHP落幕的时候了。就在我这个顽固的PHP分子正要把一个现有的Ruby on Rails代码库转换成PHP时,我要说这样的话。历史在重演 我认为PHP将亡,因为我以前见到过。大概十年之前,PHP灭掉了Perl。当然了,并不十分彻底;它还坚守在某些环境里,它还有相当可观数量的顽固粉 丝,遗留下来的应用程序也需要维护,持续几十年。但这种语言对于新一代的人,特别是web开发者,它在1999年就开始灭亡了,到2005年左右几乎完全死了。
作为在那个时期出现的新的web开发者,事情显的很明白而且水到渠成:Perl已经不适应新的应用开发环境了。在Perl里,页面需要冗长的公式化的CGI方式实现,而这些在PHP里却可以用基本的、缺省的编程方式实现。Perl语言里到处都是旧时代的特征 — 引用,不方便的数据结构,还有其他许多的小的古怪语法语义 —— 这使得web开发冗长,不稳定,不方便。无怪乎没有一个出色的web应用是用Perl写成的,而用PHP你却能做的又快又简单,尽管PHP存在着在当时就显而易见的缺陷。

在1999年支持Perl反对PHP的争论有很多:Perl要快的多,有更多的程序库和驱动支持,CPAN是个神奇的地方,里面预先写好的代码能让你绝大部分任务省去80%的工作量。现在看起来这些就有点可笑了,但“PHP缺乏可扩展性”却是个真正的缺点。但总之PHP赢了,因为上面所说的这些问题并不是这种语言固有的。PHP解释器可以变得更快,程序库可以被开发出来,PERA和PECL目前已经变得相当庞大,这还不包括各种厂商希望人们去使用他们的API而提供的非正式的程序库。

时间在推移 十年之后,我可以感觉到历史大潮正在重演。开发人员对语言的期望在前进。如果说Perl最缺乏的是PHP里令人惊讶的灵活的“关联数组”(也就是智能哈希表),那么PHP现在缺乏的就是lambdas和方法链(method chaining)了。同时PHP往往是用在只要20行代码就能写出一个网页的地方,而如今却是如果你不使用什么MVC框架之类的东西就会被认为没有把事情做对。公式化的代码表明了问题所在:这种语言需要一个框架来替人们做这些事情。

退回到以前,我认为那些顽固的使用Perl来做web开发的人很傻。现在,经历了十年的PHP开发,我处在相同的位置上了。我可以在一个小时里用PHP敲出一个不错的网站,在一两天里开发出一个优秀的网站。PHP的性能众人皆知,我可以无限的扩展它。我雇佣过的每个开发人员都会它,我集成过的每个系统里都有一个用它写出的打包的代码库。我深陷于PHP的方便性,尽管它对于我的任务并不是一个合适的语言。

转向Ruby on Rails 最明显有潜在能力继任PHP的是Ruby on Rails。Ruby是一个新的、干净的语言,具有现代的语言特征,松散、优雅的语法(很像Python)。Rails省去了我们常见的任务,省去了集成web应用里的公式化的做法,把PHP里三、四行的习惯写法变成了first-class语言结构。这看起来极其像我需要的PHP替代品、能让开发工作再一次提速的东西。

我每天使用Rails,修改一个喜爱这种框架和语言的有经验的Rails专家所写的Rails应用,七个月后,我却不能断言Rails是一个正确的选择了,原因很难表达。我这篇文章的目的就是想试图把原因说清楚。

我的主要的抱怨,必须要提的,就是性能。我之前就说过这种问题不应该被当作一种语言的致命缺陷,它只是语言实现中的暂时的问题。所以我不能把这当作一个真正的问题,尽管它是我把现在的应用移植到PHP的最主要的一个原因。我可以让Rails跑的跟PHP一样快,但那需要提供2到4倍高的硬件条件。我估计五年内将还会这样,五年后我也许不必把程序移植到PHP。但现在,它不能满足我的要求。

第二,我讨厌Active Record。Active Record是一种模式,并不是Ruby固有的,在Rails的最新版本里是可选择的,但是对它的使用和这种模式已经深入到了Rails的DNA里了。我之前曾解释过为什么我认为这数据库上的ORM不是个好做法,所以我不会再重复解释,但有一点我需要总结的就是你省去了手工写CRUD所获得的效能要大于ActiveRecord做傻事所损失的效能,要花时间搞清楚它是怎么工作的,顺应框架原则,防止它做这样的事情。

第三,我十分的不信任代码自动生成。工具能帮你生成模板式的代码很有用,但你的程序了却多出了成堆的毫无用处的代码来实现这些目的,这就变的不好了。代码生成喜欢“神奇推理”,因为生成器并不确定代码某些特别有用的特征究竟是专门写出的还是语言环境固有自带的。神奇推理是危险的。

代码生成让我想到了Ruby on Rails的一个可能是最根本的问题,就是它并不是一种语言。Ruby是一种语言。但Ruby,它在解决了PHP上的一些基本问题外,并没有解决核心问题,那就是现代web应用需要一系列的改进:像routing,model/view分类,drop-in功能性等都是很常见的特征。Rails里有,但这跟PHP里的Zend,Symfony 和 Code Igniter之类的MVC框架一样只是绑上去的绷带。

那么缺的是什么? 能够取代PHP的语言必须十分优秀于PHP,就如同PHP优秀于Perl一样。它必须承担起web应用的主要实现任务,就像PHP那样,你的代码的主要功能就是输出网页 —— 一个有点激进的要求,它要不适合去做其它的事情,例如当中shell脚本语言。我希望有这样一种语言,它能够承担起我开发一个MVC式的web应用时的所有的任务,所有功能都是核心内置的,不能仅是一个程序包。

问题是,没有这样的一种语言。有一段时间服务器端JavaScript看起来将会成为下一个重要的语言,它能统一web应用前端和后端的编程语言。但是这些JavaScript上的伟大思想总是徘徊在一些跑题的行为上,比如nodejs:事件驱动模式非常的激进和强大,能让你开发出高性能的应用程序,最大化的使用新式硬件,但这是一种开发服务器端应用程序的思路,不是web页面。并且你仍然需要去写一大堆可怕的web页面。另外一些CommonJS的成果例如ejScript开始尝试着取代PHP,但仍没有解决框架问题。

仍在等待 我不得不做出结论,PHP的替代者还不存在。Ruby on Rails很好,但并不比一个PHP之上的类似的MVC框架强多少,更别提由于Ruby自身的效率不高和ActiveRecord的ORM恶搞带来的双重打击。Python看起来并不感兴趣于作为下一代的web语言,JavaScript的服务器端解决方案还刚刚只是个开始。

我等待下一个大目标的出现。我希望能从PHP上转走,真的。我可不想成为Perl式的古董。但不管怎样,这种语言看起来还不存在。我判断错了吗?
QQ: 378890364 微信:wwtree(省短信费) 紧急事宜发短信到0061432027638  本站微博:http://t.qq.com/wwtree QQ群:122538123
级别: 管理员
发帖
8532
金币
2762
威望
3231
贡献值
0
元宝
0
只看该作者 13楼 发表于: 2010-10-11
软件大师之路的一点探索

本人并非什么武林高手,更不是编程大师, 但是我很仰慕他们,希望有朝一日也可以达到他们的境界,我很幸运能够从事自己喜欢的工作,但是一直以来总觉得自己还是太嫩,每每看到希望,走过去才发现自己依然肤浅。以下所写是我对通往大师之路的一些探索,不当之处请您指正,希望与大家一起探讨。
简单是一种力量 
“工欲善其事必先利其器”而这里所说的“简单” ,并非是使用什么开发利器来提高开发效率,恰好相反我建议大家尽可能使用简单的开发环境,摆脱对可视化环境的依赖。
    作为一个引子在后文中我将分别介绍Windows 、Linux 、Cygwin (Windows 下Linux 模拟器)下J2EE Web 项目的开发、编译和部署的简单开发环境,希望能对大家有所帮助。
   “重剑无锋,大巧不工”出自 《神雕侠侣》对武林神话独孤求败的一段描述 。《笑傲江湖》中令狐冲所使的“独孤九剑”便由其所创。 独孤求败一生用过五种不同的剑,分别为无名利剑、紫薇软剑、玄铁重剑、木剑乃至无剑。这五种不同的剑, 事实上代表了独孤求败剑学的五个不同境界, 依稀有王国维所谓“ 昨夜西风凋碧树” ,“ 衣带渐宽终不悔” ,“ 蓦然回首” 三种学问境界之意,但更为细致精确,更能传神,写出了高手的心路历程。
重剑无锋,大巧不工
    “大道至简,道生一,一生二,三生无穷”, 据说金庸大侠笔下的独孤求败就是通过观察草地上两条大蛇的争斗,悟出了武学的道理。同样我们也能通过生活中朴实的道理领悟出不断提高软件开发水平的正确方法。
 独孤求败年轻时曾看到两条大蛇相斗,它们相互缠绕,扭来滚去,极尽柔滑曲张之能事,旁边的树木草花无亦不被摧,他先是看的呆了,然后看这两条蛇斗了好久好久,再目睹周围之万事万物,突然感到神明空灵,似乎触到了什么,这时在他而言,那两条蛇的动作就好像武学中的招式,旁边的一草一木似乎都可以当作武器,顺手拈来即可伤敌,同时那蛇的弯曲弓张,缠绵不绝,腾挪起伏仿佛都很符合自然变化的奥妙,招式总是有限的,而有些东西似乎是无限的,纵然极尽变化之能事,到头来亦不免为敌所伤…… 据说独孤求败经过那惊心动目的两蛇之战,自此悟通武学境界,不以巧取胜终归自然。” 独孤求败最终达到“无剑胜有剑”的境界,生平求一敌手而不可得,无可奈何,惟隐居深谷,以雕为友。
    多年之后 《神雕侠侣》 中的杨过误打误撞,居然找到了独孤求败的剑冢,埋藏了独孤求败在人生的不同阶段使用的“宝剑”, 独孤求败一生用过五种不同的剑,分别为无名利剑、紫薇软剑、玄铁重剑、木剑乃至无剑。这五种不同的剑, 事实上代表了独孤求败剑学的五个不同境界, 依稀有王国维所谓“ 昨夜西风凋碧树” ,“ 衣带渐宽终不悔” ,“ 蓦然回首” 三种学问境界之意,但更为细致精确,更能传神,写出了高手的心路历程。
    第一柄剑“无名利剑”,长四尺,锋利无比,剑下石片上写着:刚猛凌烈,无坚不摧,弱冠前与河朔群雄争锋。  弱冠前” 即二十岁以前,独孤求败仰仗这把“利剑”,所向无敌。如同我们基本掌握了一种开发语言以后,仰仗某个开发工具,如VC++ 、VB ,可以轻易地开发出一个软件,这时候我们会感到似乎编程也不过这么回事,好像“我们什么都可以做只是时间问题”。
    第二片石片前没有剑,石片上面写着:紫薇软剑,三十岁前用,误伤义士不详,乃弃之深谷。软剑比利剑更加锋利,也更加灵活多变, 然而凡事有利亦有弊,剑过于快了往往就难以收发自如, 以至于常常失去控制,而误伤义士,独孤求败心生内疚,将软剑弃于深谷。如同我们使用了更加“高级”的开发工具如 .NET 等,这时我们的开发效率进一步提高了,功能的开发不过是控件的拖曳,以及针对控件的编程(大多数时侯几句话便可搞定),如同练剑的人所有的功夫也都围绕着剑来展开,实际上我们几乎所有的思维也同时被绑定到这些工具上,而忽略了技术背后的本质,和所蕴含的思想,同时由于工具本身的复杂,如同独孤求败的软剑过于灵活而失去控制,我们往往会遇到工具使用不当而带来的错误,如忘记添加某个Lib 等等,表面上看我们是疏忽了,其实更深层的是我们对开发理解的肤浅,同时每每当我们遇到较底层或较抽象的问题又会感到素手无策,如效率,安全性,稳定性,扩展性等等,于是我们不得不依赖于另一个更伟大的工具“Internet ”,赌博似的希望Internet 这次可以帮助我们度过难关。渐渐的我们发现自己已经停步不前,“感觉自己已经变成了做事可以不用多想的熟练工”,实际我们已经逐渐沦为会使用工具的工具。聪明的人会学习独孤前辈将“软剑弃于深谷”不再过多的依赖工具。其实“弃于深谷的不单是误伤义士的软剑,还有少年人不顾一切、不可一世的锐气”,然而更多的人却发现自己已深陷工具的陷阱,无法自拔。
放弃“软剑”这一剑学“歧途”之后,独孤求败的 第三把剑竟是凝重的钝剑。石片上写的是:重剑无锋,大巧不工,四十岁之前持之横行天下。这段充满了自信与豪气的题字,说明正当壮年之时创立了“重剑级”剑学的独孤求败在当时实已无敌于天下了。
《神雕侠侣》中对杨过初练玄铁重剑的情形有如下一段描写:
“如此练剑数日,杨过提著重剑时手上已不如先前沉重,击刺挥掠,渐感得心应手。同时越来越觉以前所学剑术变化太繁,花巧太多,想到独孤求败在青石上所留‘重剑无锋,大巧不工’八字,其中境界,远胜世上诸般最巧妙的剑招。他一面和神雕搏击,一面凝思剑招的去势回路, 但觉越是平平无奇的剑招,对方越难抗御。比如挺剑直刺,只要劲力强猛,威力远比玉女剑法等变幻奇妙的剑招更大。”
所谓“越是平平无奇的剑招,对方越难抗御”事实上正是“无招”境界的自然体现。
玄铁剑重近七十斤如何才能战胜锋利轻盈的锐剑和软剑呢? 方法只有一个:提高自身的内力,当我们放弃对高级工具的依赖而改使用简单的工具,自然会去探究事物的本质,而这些本质正是那些高级工具背后所做的事。这样的例子在生活中比比皆是,当我们没有汽车,我们不得不骑车或是走路,无形中腿力得到增强,当我们没有计算器,我们不得不心算或是研究更好的计算方法,脑力因此得到增强。提高软件水平,必须了解软件的本质,探究本质必须亲力亲为,放弃对工具的依赖。
而能对本质掌握多深,就在于能对工具放弃的有多彻底,设想一下假如你没有现成的虚拟机可用,有哪些事需要做(即虚拟机的功能),如何做,如果你能做出来或者至少研究明白,你一定对Java 有了更加透彻的理解。
独孤求败就是按照这样的办法,一步步的放弃对工具的依赖 “自此精修,渐进于无剑胜有剑之境。”最终达到了“不滞于物,草木竹石均可为剑”的境界。
不依赖于工具并不是说让我们倒退到刀耕火种的时代,当我们可以不依赖于工具,深刻的了解了事物的本质,我们就能更好的驾驭工具,为我所用。
QQ: 378890364 微信:wwtree(省短信费) 紧急事宜发短信到0061432027638  本站微博:http://t.qq.com/wwtree QQ群:122538123
级别: 管理员
发帖
8532
金币
2762
威望
3231
贡献值
0
元宝
0
只看该作者 14楼 发表于: 2010-10-11
C++之恶
Jamie Zawinski访谈:C++之恶




文/ Peter Seibel  译/李琳骁
开启编程生涯

Jamie Zawinski(简称jwz),Lisp黑客、Netscape早期开发人员。Zawinski十几岁开始编程,一直投身Lisp和人工智能领域,浸染于黑客文化;领导开发了XEmacs,后来成为最著名的开源分支之一;Netscape浏览器Unix版本及其后Netscape邮件阅读器最初的开发人员之一;与Brendan Eich一道,通过mozilla.org促成了Netscape浏览器的开源;目前在旧金山经营夜总会,力争让它成为各年龄层都能进入的现场音乐表演场所。
Seibel:你是怎么开始学习编程的?
Zawinski:哇,很久以前的事了,都快没什么印象了。没记错的话,我第一次真正使用计算机编程大概是在八年级。当时学校里有几台TRS-80,我们边玩边学了点BASIC。我记不清是不是专门开了门课,好像只是课后摆弄过。我记得那些机器没法保存程序,只能照着杂志或手册什么的,将程序逐行敲进去。当时我看了很多书。书中讲到的计算机语言,我没办法实际运行,只好在纸上编写那门语言的程序。
Seibel:后来你是怎么开始接触Lisp的?
Zawinski:我看了许多科幻小说,觉得人工智能实在太迷人了,计算机将统治世界。为此我学了点人工智能。我高中时有个朋友叫Dan Zigmond,当时我们俩互相换书看,于是一起学习Lisp。有一次,他去参加Apple用户协会(Apple Users Group)在卡耐基•梅隆大学举办的活动,这其实就是大家聚在一起交换软件,而我朋友只是想搞点免费的东西。另外,他还找了个大学生模样的人搭话,那个大学生说:“喂,大伙来看,这里有个15岁的孩子会Lisp,真是少见。你该去找Scott Fahlman要份活干。”Dan真的照做了。而Fahlman还真给了他一份活。Dan又说:“对了,我有个朋友你也一起要了吧。”他指的就是我。Fahlman就那么雇了我们。我猜他大概是这么想的,哇哦,有两个高中生居然对这东西感兴趣,让他们在实验室里晃荡也不会有什么大碍。于是我们开始做些简单的活,比如用新版编译器重新编译整套代码。整个过程真叫人难忘。你可以想象,只有我和Dan两个是小孩,其他都是研究语言和人工智能的研究生。
Seibel:高中毕业后,你很自然地就去了CMU。
Zawinski:是的。事情是这样的,我讨厌高中,那是我生命中最糟糕的日子。快毕业时,我去找Fahlman要一份全职工作,他回答说:“不大好办,不过我有几个朋友刚开了家公司,找他们谈谈。”那家公司名叫Expert Technologies,也就是ETI。他们正在打造一个专家系统,可以自动给电话簿标页码。他们使用Lisp开发,我认识其中几个人,之前都在Fahlman的小组里待过。他们雇了我,一切顺风顺水,约莫过了一年,我开始惶恐不安:哦,天哪,得到这两份工作完全是撞大运,绝不会有下次了。一旦丢了这份工作,没有大学文凭的话,我就只能去打打零工了,看来我应该去拿张文凭。
那段时间真的很糟。上高中时,所有人都抱怨:“净是些没完没了的老掉牙的标准化测试,上了大学,一切都会好起来的。”结果上大学第一年,与高中毫无区别,“放心,等你念了研究生,都会好起来的。”大学和高中一样糟糕,换了时间而已,我可受不了。每天早上8点钟起床,就开始往脑子里塞东西。那门叫做课程介绍的课还非上不可,这门课教你怎么用鼠标。我找到他们说:“我都在这所大学里工作了一年半,我知道鼠标怎么用。”但所有人都得上,概莫能外,“这是规定”。其他也都差不多,我实在无法忍受,索性退学了事。我觉得自己做得很对。
我在ETI干了大概4年,后来公司开始走下坡路。那时我已经写了不少代码,便找了个新闻组,发帖子找工作,还顺带提到自己写过不少代码。Peter Norvig(注:Google研发总监,《十年编程无师自通》作者)看到帖子后安排了面试。
Seibel:Norvig当时在伯克利?
Zawinski:是啊。那份工作很奇特。他们有一大群研究生在做自然语言理解方面的研究,他们基本上都是语言学家,只做一些编程。因此他们打算找个人接手他们自己编写的那些零零碎碎的代码,并整合成真正能用的东西。
这活相当困难,因为我没有相关背景,无法理解他们到底在做些什么。因此常常碰到这样的情形:我盯着某样东西,但完全不知所措。我不理解那是什么意思,也不知道下一步该做什么,我读些什么才能真正理解它。于是我跑去问Peter。他很礼貌地回应我:“你现在理解不了,这很正常,周二我有时间,到时给你讲解一下。”结果我就无所事事。于是我把大块时间都用在折腾窗口系统,摆弄屏幕保护程序,以及之前出于好玩而捣鼓的那些用户界面相关程序。
就这么过了6个或8个月,我觉得自己完全是在虚掷光阴。我什么都没为他们做,只觉得自己像在度假。
最后我去了Lucid,当时仅存的两家Lisp环境开发商之一。我决定离开伯克利的主要原因是我觉得自己一事无成,那种感觉很糟。我周围的都不是程序员。当然他们都不赖,我仍和其中几个人保持着友谊。与解决实际问题相比,他们对抽象的事物感兴趣得多。而我想有所成,有一天能指着某样东西说:“瞧,这个漂亮的活是我干的。”
Seibel:你在Lucid的工作成果是XEmacs,不过,你去那里一开始就做Lisp方面的开发?
Zawinski:当然,我一开始做的一个项目,我都记不起是什么机器了,不过我确定那是台16个处理器的并行计算机,我们使用的Lucid Common Lisp变体提供了几个控制结构,可以创建进程,分别部署到不同的处理器上。
我做了一部分后端优化工作,减少创建线程的开销,以便完成一些有用的计算,比如实现并行Fibonacci算法,从而不再只忙于为每个线程新建栈组(stack group)。我全身心投入其中。那是我第一次有机会使用那么奇特的机器。
这之前我还负责把Lisp迁移到新机器上。大致过程是,有人已经针对新架构写好了编译器后端,并且已编译好自举代码。首先我拿到一个二进制文件,据称是在这台机器上可执行的代码;接着我必须剖析它们的装载器格式,以便写个简单的C程序,装载拿到的文件,将页面置为可执行,并跳转到那个页面。幸运的话,你就会看到Lisp提示符,之后即可开始手工装载其他东西。
这对任何架构而言都是件难事,因为装载器几乎没有真正的文档说明。你只能找个C程序编译一把,然后逐个字节分析,用Emacs编辑字节。看看把这个字节改成零有什么结果,它会不会停止运行。
厌恶C++
Seibel:这么说来你一开始就从事Lisp方面的工作。不过,显然你的整个职业生涯并不是只有Lisp,下一门语言是什么?
Zawinski:嗯,在Lisp之后,我正经用来编程的下一门语言是C,感觉像是回到了在Apple II上编程时用过的汇编语言。PDP-11汇编器才会认为它是门语言。总之C相当令人不快。一直以来,我总是尽可能避开C。至于C++,除了叫人反感之外,一无是处。因此我总是尽可能不用C++,在Netscape时,我用C语言搞定一切。理由很简单,我们的目标平台都是性能不高的机器,没法很好地运行C++程序,一旦开始采用其他库,C++程序就会变得很大。此外,各个C++编译器千差万别,相互之间存在许多不兼容问题。于是我们一开始就敲定使用ANSI C,它很好地满足了我们的要求。C之后用的是Java,感觉又像回到了Lisp,因为Java不存在你拼命要避开的概念,这下又自在了。
Seibel:比如?
Zawinski:内存管理。函数也更像函数而非子程序。另外,对模块化的要求也高很多。用C写代码,很容易不自觉地写个goto语句,用起来实在太顺手。
Seibel:现在你好像主要使用C和Perl。
Zawinski:嗯,其实我已经不怎么写程序了。通常我只写些凌乱简短的Perl脚本,用来维持服务器的正常运转。另外,我还写些简单的代码,为自用的MP3获取唱片封面,等等。这都是些短小急就、即用即抛的程序。
Seibel:你是喜欢Perl,还是由于它方便才用的?
Zawinski:哦,我可瞧不上Perl,它太可怕了。不过,它几乎无处不在。随便找台电脑坐下来,你用不着找人安装Perl即可运行自己的脚本,Perl早装上了。这是Perl值得推荐的唯一理由。
Perl拥有大而全的库。基本上你想做的都有库能帮你实现。尽管通常实现得不是很好,但至少有现成的。如果用Java写了些代码,然后试着运行,结果发现在自己的电脑上安装Java遇到问题,这种体验实在令人不快,我就碰到过。在我看来,Perl是门卑鄙的语言。如果只用Perl很小一部分,你可以让它变得像C那样,或者更像JavaScript。Perl的语法太过古怪,数据结构一团糟。Perl的好处实在不太多。
Seibel:但至少没C++那么糟?
Zawinski:是的,绝对没有。Perl的应用场合不太一样。对于某些活,用Perl或类似的语言比用C编写要容易得多,前者是面向文本的语言,即所谓的“脚本语言”(Scripting Language)。我个人并不赞同“程序”和“脚本”的分法,这么分毫无意义。不过,如果主要操作就是处理文本或启动程序,比如运行wget下载HTML页面,并对其做模式匹配,那么用Perl实现显然更便捷。
Seibel:后来怎么离开了Lucid?
Zawinski:Lucid完蛋了。当时裁了不少人。我发邮件给自己相识的几个人:“嘿,看样子我也得快点找份新工作了。”Marc Andreessen刚好是其中一个,他回信说:“太巧了,我们上周刚开了家公司,来我们这儿吧。”大概就是这么回事。
Netscape经历
Seibel:于是你去了Netscape。你主要做什么工作?
Zawinski:我一进公司就去开发浏览器的Unix平台部分。我去之前,其他人好像已经写了几天代码。其中Windows和Mac平台的进展稍快。总的原则是后端代码尽可能多,针对三个平台的前端代码尽可能少。
Seibel:所有代码全是从头写起的?
Zawinski:都是全新的代码。绝大部分Netscape创始人之前都是NCSA/Mosaic开发人员,他们写过不同平台的NCSA/Mosaic,实际上是三个独立的程序。那六个人都在Netscape。他们没有重用任何代码,当然他们之前写过这个程序。
Seibel:你做过的哪件事是最引以为傲的?
Zawinski:那就是我们发布了Netscape浏览器,其他不值一提。我主要专注于自己负责的部分,即Unix前端的用户界面。不过,最关键的是我们发布了Netscape,而且大家喜欢用。人们立即抛开NCSA Mosaic转而使用我们的产品,并感叹:“哇噢,这是我用过的最棒的软件。”Netscape工具栏提供了“精彩站点”按钮,可以展示人们推荐的那些精彩站点。大概有近200个!我倒不太为我们写的代码感到骄傲,关键在于它发布了。从许多方面来看,Netscape的代码不算太好,因为时间紧,写得太快。不过它的确实现了产品功能。我们发布了产品,这才是关键。
推出96 Beta版的第一个晚上,我们都围坐在房间里,盯着不断增加的下载量,每次下载都会发出响声,妙不可言。一个月后,两百万人用上了我们编写的软件。真是不可思议。毫无疑问,我们为Netscape作出的付出都是值得的,我们影响了人们的生活,他们的生活因我们的工作而变得更有意思、更快乐,也更轻松。
Seibel:另外,你还开发过邮件阅读器,对吗?
Zawinski:开发2.0版本时,Marc走到我的隔间,对我说:“我们需要一个邮件阅读器。”我回答道:“好啊,听起来不错。我之前做过邮件阅读器。”我当时住在伯克利,大概有两个星期没去办公室。那两个星期我就坐在咖啡馆里,乱涂乱画,试图勾勒出邮件阅读器要实现的功能。我列出功能列表后,又一项项划掉,确定要用多长时间实现,用户界面该如何设计才好。
随后我回到公司,开始写代码。Marc又找到我说:“对了,我们又雇了个人,他之前也做过邮件相关开发。你们俩一起开发吧。”那个人就是Terry Weissman,那家伙太强了,我们合作很愉快。跟早期浏览器开发团队其他人共事相比,这次合作是完全不同的体验。
我们俩不会互相对着嚷嚷。真想不到我们之间的分工方式也行得通,换了别人不知道会怎样。我已做好初步设计,写了些代码,每天或每两天,我们会对一下功能清单,我会说:“哦,我来做这块。”他会说:“好的,我做那块。”然后我们又各自忙开来。
检入代码后,我们会碰一次头,他会说:“我这边都搞定了,你的怎样了?”“唔,我在做这块。”“那好,我就开始做那块了。”我们就以这种方式分配任务。最后看来效果非常不错。
我们也会有分歧,我认为应该把过滤功能加到文件夹里,因为时间不够,没法做好。他说:“不行,我认为我们应该搞定那个。”而我则答道:“时间不够用了!”结果他当天晚上就写好了。
Seibel:你们会发很多电子邮件吗?
Zawinski:是的,邮件不断。那时还没有即时消息,搁现在的话,估计都会用即时消息,我们发的邮件往往只有一行内容。我们还通过电话交流。
我们发布的2.0版本集成了邮件阅读器,反响不错。接着我们着手开发2.1版,我认为这一版才是完整的,它将实现第一次发布时没有的功能。Terry和我刚做到一半,Marc进来对我说:“我们刚买了家公司。他们做的邮件阅读器与你们做的差不多。”我答道:“哦,好的。不过我们已经有了。”他说:“对,是的,不过公司发展太快,要雇到好员工太难,有时直接收购一家公司是条捷径,那些有经验的员工都能为我所用。”“那是,这些人准备做哪块?”“他们会接手你们现在做的项目。”“哦,真糟糕,那我得另外找点事做。”
大体情况是他们收购了Collabra,保留了整套管理层架构,在我和Terry之上。Collabra发布过一款产品,许多方面与我们的产品类似,只不过他们的产品只支持Windows,而且根本没什么市场。
然后他们赢得了创始股,并被Netscape收购。实际上是Netscape把公司的控制权交给了这家公司。结果他们不仅接管了邮件阅读器,最后收编了整个客户端部门。收购Collabra之际,Terry和我还在开发Netscape 2.1,收购之后,他们开始重写。不用说,他们的Netscape 3.0拖了很久,我们的2.1反而成了3.0,因为是时候发布个版本了,我们需要出个主要版本。
最终他们主导开发的3.0变成了4.0,你知道,那是Netscape遭遇的最严重的软件灾难,几乎毁了整个公司。尽管此后公司还撑了很长时间,不过总的来说,我们收购的这家公司,从未取得过什么成就,却无视我们的所有劳动和成功,他们主导的软件重写,直接陷入第二系统综合症,把我们搞垮了。
他们以为,只要身在Netscape,按原来那套做法,注定成功。但是,在之前的公司,他们那套做法就没成功过。结果当取得过成功的人告诫他们“注意,千万别用C++,也不要用线程”时,他们则答道:“你胡扯些什么?真是什么都不懂。”
好吧,正是诸如不用C++、不用线程的决定,我们才得以准时发布产品。另外还有一点非常重要,我们从来都是同一时间发布所有平台的版本,对此他们根本不以为然:“哦,百分之九十的人使用Windows,我们还是专注于Windows平台,然后再移植到其他平台。”那恰好是其他许多失败公司的做法。如果你打算发布跨平台产品,历史会告诉你这么做是大忌。真想做到跨平台的话,就必须同时开发。所谓的移植只会令产品在第二平台上蹩脚不堪。
Seibel:4.0版是从零开始重写的?
Zawinski:他们没有从零开始,不过最后也替换了每一行代码。他们一开始就用C++。对此我极力反对,该死的是,结果证明我是对的。使用C++,一切变得臃肿不堪。另外还引入了大量兼容性问题,用C++编程时,没人能断定C++哪部分可以安全使用。有个家伙说他要用模板,结果你会发现,没有哪两个编译器实现模板的机制是一样的。
当编写的代码支持的多平台只是Windows 3.1和Windows 95时,你根本就意识不到问题究竟有多严重。他们的做法令Unix平台版本成了灾难,谢天谢地,那时我已经不负责那块工作。同样,Mac平台版本也好不到哪儿去。这意味着产品无法再在Win16等低端Windows机器上运行。我们不得不开始消减支持的平台。或许也是时候那么做了,不过这个理由太过蹩脚。本来不用那么做。
出于个人怨恨、自私,我觉得自己和Terry搭建了这么棒的产品,却因成功而受罚,受罚的方式就是产品被交给一群白痴。那段时间我在Netscape非常郁闷。由此我也开始了在那儿干等着的日子。
Seibel:你在Netscape待了五年?
Zawinski:是的。一直待到Netscape被收购的第二年,被收购前一天,mozilla.org项目启动,一切又开始变得有意思,为此我又待了一阵子。
Seibel:你们最后也因使用C++而陷入困境?
Zawinski:没有,是在Java上出了问题。有一次,我们打算用Java重写浏览器。当时我们的想法是:“没问题!4.0代码库会毁了公司,我们要丢弃它,只有这么做才能成功,我们清楚自己在做什么!”不过最后还是失败了。
Seibel:是因为Java还不够成熟?
Zawinski:不是。我们这部分人又拆分成分工明确的小组,其中三个人负责邮件阅读器。最后我们做好了。邮件阅读器相当不错,速度快,还有大量很棒的特性,除了妥善保存你的数据,写大文件时几乎没有停顿。我们还充分利用了Java的多线程,比我预想的好用。整个项目开发感觉很开心。从已设计好的API来看,各方面进展顺利。
只有一块没做好,邮件阅读器没法显示消息。显示消息时邮件阅读器生成HTML,而显示HTML需要一个HTML显示层,结果这个显示层没搞定,到最后也没做好。页面渲染组完全误入歧途,乱套了,它们成了项目失败的主要原因。
本文节选自《Coders  At  Work》中文版。该书是当今15位大师级计算机程序员的访谈录,重点介绍了他们的编程感悟。感谢人民邮电出版社北京图灵文化发展有限公司授权。
(本文来自《程序员》杂志10年09期)

QQ: 378890364 微信:wwtree(省短信费) 紧急事宜发短信到0061432027638  本站微博:http://t.qq.com/wwtree QQ群:122538123
级别: 管理员
发帖
8532
金币
2762
威望
3231
贡献值
0
元宝
0
只看该作者 15楼 发表于: 2010-10-11
Visual Studio 2010 是怎样炼成的

——微软公司开发者事业部Visual Studio团队总经理Jason Zander专访





记者/常政 高松



微软公司将Visual Studio 2010正式版全球发布的日子定在2010年4月,而截止1月底,VS2010 Beta 2版本国内下载量已超过 10万人次。这充分说明了这款开发利器,在中国开发者们心中的份量之重。毋庸置疑,VS2010的诞生意味着世界软件工程的重大变局,所以能否有效地把握 VS2010的精髓,以迎接全新的机遇和挑战,对于中国的开发者尤为重要。为此,本刊记者第一时间采访了微软VS2010研发团队的总负责人 Jason Zander。他将为大家揭开 Visual Studio 2010 的神秘面纱。



记者:您好,Zander先生。首先请您对数百万中国开发者做下自我介绍。


微软公司开发事业部Visual Studio团队总经理Jason Zander
Zander: 我是Jason Zander,微软公司开发事业部Visual Studio团队的总经理。作为总经理, 我的团队主要负责 Visual Studio Express、Professional和Visual Studio系列产品的开发,涉及的技术包括:编程语言、 Javascript运行与工具、IDE与生态系统、Office与SharePoint工具、云工具、资源控制/工作项目跟进、高级架构、开发人员以及 测试工具。


作为CLR的初始开发者之一,我在技术领域的主要工作包括:文件格式、元数据、编译器、调试/剖析,以及将系统集成到Windows和SQLServer等 主要微软产品中。在担任Visual Studio总经理之前,我是.NET框架团队的总经理,并在微软开发过多个产品,其中包括SourceSafe、 Repository和ODBC。1992年加盟微软之前,我在IBM公司的罗切斯特实验室致力于分布式SQL和SQL/400的开发工作。我在密歇根州 立大学获得计算机科学学士学位。业余时间,我喜欢和三个孩子一起玩耍,并在自家的木工房里做家具。我的博客地址 是:http://blogs.msdn.com/jasonz



记者:倍受全球开发者关注的VS2010正式版将于4月12日发布,能否介绍一下微软开发本款新产品的主要情况?


Zander: 微软在开发过程中乐于使用自己的产品——我认为指出这一点是非常重要的。开发事业部约有3000名员工,分别负责工具、.NET架构和运行等领域的工作。 我们在世界各地都有开发团队, 但是主要的技术开发工作集中在4个地点( 美国华盛顿雷德蒙、美国北卡莱罗纳州Raleigh、美国夏威夷以及印度的 Hyderabad)。TALM业务约有400名员工。微软的ALM产品包括:协作中心、Team Foundation Server(TFS),以及 用于测试、架构和高级开发任务的各个专门版本的VisualStudio。 将Visual Studio Professional作为主要开发环境的用户可通过授权并安装名为Team Explorer的TFS插件,在 Visual Studio 2010 Ultimate或Premium(在这两个版本中可使用Visual Studio Team System的 最新功能)团队项目中进行协同办公。



VS2010的核心价值



记者:即将发布的VS2010正式版本能够完全实现你们最初设定的目标吗?


Zander:完全能够实现。很高兴告诉大家,微软的Visual Studio 2010是一个有助于简化从设计到部署等整个开发流程的集成环境。现在,开发人员和测试人员能够:


1、通过能将愿景变为现实的强大的原型、建模,以及设计工具,释放自己的创造力。
2、个性化自己的环境并将目标锁定为使用人数日益增长的平台,如:Windows 7、Windows Server 2008 R2、SQL Server 2008、Microsoft SharePoint,以及可加速编码流程并让开发者能够利用现有技能的云应用程序。
3、由于有了可让用户迅速找到并轻松修复错误、确保高质量解决方案的集成测试与调试工具,开发人员和测试人员能够更高效地工作。


而对于企业级用户, Visual Studio 2010 也提供了大受欢迎的热门新功能:


1、确保高质量编码:IntelliTrace这样的新功能让测试人员和开发人员能够选择使用手动及自动测试方式,以及高级调试工具,以便维护源代码并查找错误。
2、通过集成提高简洁性:IDE和编辑器的功能显著增强(如:Generate from usage)意味着:无论是建模、编码、测试,还是调试,开发人员都能利用现有技能来部署越来越多的应用程序类型。
3、释放创造力:Silverlight和WPF的新拖放绑定功能、Windows 7和SharePoint的内置式工具,以及与创新技术的集成(例如:数据库、UML、Expression、ASP.NET、MVC和多核)使开发人员能够将远景目标变为现实。


总之,带有MSDN的Visual Studio Ultimate中强大的ALM功能,再加上Visual Studio Premium和Professional中强大的集成综合工具,将使开发人员把更多精力用在有创意的开发上,花在解码上的时间也会相应变少。



记者:在VS2010所拥有的这一系列热门新功能中,您认为最突出的优势是什么?


Zander:显然,并没有简单的答案,这取决于成熟团队目前的实践、技能和限制。采用ALM的三个最重要的优势在于:能够专注于客户的价值流、在流程中减少浪费、在企业 和利益相关者之间实现透明度,以便利益各方在最关键的时刻做出明智的决策。汽车行业在过去半个多世纪所推崇的精益管理也发生过同样的变革。那些成功实现变 革的公司从不起眼的小公司发展成为全球市场的领导者,而没有进行变革的公司则纷纷走向破产的深渊。


通过Visual Studio,我们已经采取了措施,专注于那些我们能够最大程度改进价值流、降低浪费、提供透明度的领域。我们提供了在线工具,以便帮助 个人用户评估其成熟度、在投放市场之前发现潜在可改进的地方、降低成本并提高客户满意度。我们还对员工及合作伙伴进行了培训,以便他们利用这些理念帮助客 户制定变革路线图。投资回报率通常可以立即在项目中体现出来,但是改进可能会持续数年,因为这涉及企业运作方式的变革。



VS2010 的挑战和经验


记者:在VS2010的整个开发过程中,您所面临的最大挑战是什么?同时,您最珍视的经验是什么?


Zander:说起开发Visual Studio2010时的挑战和经验,有几件事令人印象深刻。


首先,针对使用Team Foundation Server(TFS) 的小团队,我们在开发中进行了特别关注。TFS 2010引入了一个新的基础配置,在安装时即可使用。安装流程本身已经简化了,现在只需30分钟就能完成 安装向导和配置。我们的意图是让那些可能并不需要所有功能并安装所有配置的小型团队能够更方便地使用TFS。基本配置可支持Windows 7、 Windows Vista和SQL Server Express,并且不需要服务器操作系统、SharePoint或完整的SQL Server 。


其次,有人问我们,为什么UML现在成了Visual Studio的一部分。过去十年,UML往往被认为是MDA(模型驱动架构)的一部分。我们并没有沿 着老路走。相反,我们希望关注编码的开发者能使用UML。UML类图可视化编码是Visual Studio 2005的组成部分。在 Visual Studio 2010中,我们引入了更多功能。例如,用户可右键点击一个方法来生成一个序列图,该序列图将确切展示该方法是如何被调用 的。我们还能超越UML,将那些符号中并不包含的问题显示出来。最好的例子就是架构分层,在那里你不仅能够生动地看到逻辑组件之间的依赖关系,还能执行分 层规则,以阻止反模式(如循环混乱)随着时间的推移,无意间进入你的团队项目。


最后,在听到客户反馈之后,微软决定在Visual Studio 2010中引入一个简化的SKU结构,这将使用户更果断地做出采购决策。客户只要购买了MSDN和Visual Studio 2010,就能期待产品带来更大价值。


根据开发人员的具体需求,每个级别的版本都有其各自的优势。未来,客户将能从Visual Studio 2010的三个主要版本中选择自己所需:


1、带有MSDN的Microsoft Visual Studio 2010 Ultimate:
是一套适用于团队的综合应用程序生命周期管理工具,确保从设计到部署的质量。
2、带有MSDN的Microsoft Visual Studio 2010 Premium:
是一套适用于开发人员的完整工具组,提供可扩展、高质量的应用程序。
3、带有MSDN的Microsoft Visual Studio 2010 Professional :
带有MSDN的Microsoft Visual Studio 2010 Professional是适用于基础开发任务的基本工具,使开发人员能够轻松实施其理念。


我们建议开发人员访问Microsoft.com/visualstudio,从而了解更多关于SKU的详细信息, 以及其它可用Visual Studio产品(如:Team Lab Management)的信息。



记者:我们注意到VS2010团队本次采用了敏捷研发模式。能否和读者分享一下你们敏捷应用的具体情况?


Zander:对于Visual Studio2010,我们在敏捷工具上进行了大量投资。新的Excel Agile Planning Workbook让团队可以轻松地采用Scrum等敏捷的软件开发方法。ExcelAgile Planning Workbook提供与TFS的双向同步,而团队可以用它创建和管理用户故事及产品特性列表,评估团队的效率并细分项目工作。产品特性列表让团队能够规划各项工作并跟踪进度。此外,Team Foundation Server 2010附带针对Agile Software Developmentv5.0 流程模板的Microsoft Solutions Framework。此流程模板可以定制,它定义了一套工作项目、报告和控制面板,供团队在规划和跟踪项目时使用。



记者:在整个VS2010研发过程中,您觉得最值得回忆的故事是什么?



Zander:一个有趣的故事发生在购买计算机的时候。我们当时努力说服销售代表卖给我们最低质量(指的是性能)的上网本,以便在2月份推出的RC版本上测试性能。有趣的 是,销售代表却卖力地向我们推荐一款速度更快但价格更低的计算机。但是,我们的目标是看看低性能计算机是否能够很好地支持RC版本。最终,我们购买了性能 较低的计算机,但性能仍表现良好!



软件开发的未来


记者:发布VS2010之后,你们接下来会关注什么项目?


Zander:这个问题很难回答,但对我们最重要的是用户反馈。用户的反馈在各个Visual Studio版本的开发中起着重要作用。


云可能是很好的机会。在进行云开发时,架构师和开发人员必须在目前的开发实践中融入下一代的想法、设计、编码和测试。Visual Studio提供各种关键的创新,让云计算——软件加服务——成为现实。


首先,Visual Studi 2010提供了为应用软件创建详细的架构模型所必需的工具。及早关注架构可以防止在后期编程时出现众多严重的编程错误。对 于在多个层(演示、应用、数据,可能都在本地和/或远程)上存在的应用软件,全面详细地了解各部分如何连接至关重要。不幸的是,由于没有生命周期管理工 具,很多应用软件在设计时都没有完整的架构模型。


云应用也将必须在传统IT防火墙之外的环境——经常是第三方网络——中保证质量和可靠性,并且与第三方服务和数据相连。这极大地增加了软件测试的复杂程度。 同样,高效的生命周期管理和使用Visual Studio Test功能可以为这些场景设计测试流程,创建工作项目以跟踪这些场景中的所有变量,并且让 团队的每个成员都能够轻松地访问有关这些场景的报告。


最后,云模式为地理上分散的开发与部署带来大量机会,但同时也会造成源代码和不同版本的管理十分混乱。Visual Studio的核心是Team Foundation Server(TFS),它为位于各个地点和不同公司的开发团队提供单一的服务器解决方案。


Visual Studio Ultimate/Premium 为应用程序生命周期管理提供完整的解决方案,让用户得以开发能够在多种软件加服务模式下部署的应用程序和服务。这还利用了.NET框架,让Windows 软件能够在各种设备上运行,比如PC、Web、移动设备以及电视、游戏机和Windows Media Center等家庭娱乐系统。


还有新的用户界面,这毫无疑问是很重要的技术趋势,而微软一直在这方面居领先地位。已经在Xbox上展示的Natal项目就是一个很好的例子——这种游戏界 面让用户成为游戏杆,而不再需要手持设备。在语音等很多情况下,新用户界面确实需要实现我们的软件加服务愿景。你需要具备极佳本地计算能力的软件,以及在 云中不断积累的全球数据库以调节识别的精确度。


Visual Studio 2010已经支持多点触控的托管与本地代码的开发。随着更多的新界面功能出现在我们的平台上,我们将在未来版本的Visual Studio中为开发人员提供这些服务。



记者:能否向中国的开发者们预测一下软件开发与工具的未来?


Zander:在 回答这个问题时,我想谈一下我对应用程序生命周期管理(ALM)的看法。未来五年,微软认为ALM会超出目前的边界,作为一个类别不断成长和扩展,最终成 为所有开发工作的事实标准,这是因为越来越多的机构意识到需要管理开发过程,能够跟踪和报告开发工作,并能够让不同的业务部门和IT实施部门在多个项目上 进行更好的合作。ALM工具会扩大应用范围,而其中的关键是能够在生命周期的各个阶段进行协作。这将不仅受到软件开发周期的限制,还将扩展到包含生命周期 的方方面面——从业务价值的定义与识别到软件和系统的交付与维护到业务价值的支持。ALM目前被认为是支持软件交付的线性过程,而我们认为未来会变成环 形,随着企业不断变更战术和战略以及IT部门的应变,这个过程将充满反复和变化。


ALM是动态IT的基石,让IT更加灵活、更具成本效益且更加高效,通过流程自动化、降低复杂性和提高对业务需求的响应能力来优化企业的系统和人员的协作。 ALM就像胶水,让IT部门能够通过软件加服务的方式把现有和新的系统投资整合起来,实现差异化并帮助用户开发集成且敏捷的基于服务的解决方案,从而实现 新的应用并提高业绩。通过工具和技术把项目管理、运营和工程团队联系起来,推动信息流动、报告、治理和项目可见性,提升工程和用户体验,从而增强整个IT 业务的效率。


有多种因素推动着ALM在未来五年的增长。软件交付的质量继续是关键因素,而随着业内整体质量的提升其重要性会越来越高。可预测性要求和规章制度压力迫使机 构需要更好地跟踪软件开发和交付,推动机构采用更加正式的可跟踪流程。日益流行的离岸和全球开发只有通过好的ALM工具才能高效地控制,确保所有参与者高 效协作,还需要实施集中协作,让各个地方的人都能够围绕单一的共享资产工作。我们还看到生命周期中引入了其他人士,包括业务流程分析师、设计师和UX专 家、部署与运营团队,甚至终端用户,他们都将参与到意义更广泛的软件开发之中。



记者:谢谢接受《程序员》的专访。最后,对于即将使用VS2010的开发人员,你最想说的一句话是什么?


Zander:Visual Studio 2010有益于所有开发人员——不管组织规模、开发人员的偏好或项目需求有何不同。



(本文来自《程序员》杂志2010年4月刊)
QQ: 378890364 微信:wwtree(省短信费) 紧急事宜发短信到0061432027638  本站微博:http://t.qq.com/wwtree QQ群:122538123
级别: 管理员
发帖
8532
金币
2762
威望
3231
贡献值
0
元宝
0
只看该作者 16楼 发表于: 2010-10-11
最佳编程语录

A good programmer is someone who looks both ways before crossing a one-way street. — Doug Linder, systems administrator

好的程序员这样一类人,这类人在横穿一条单行道前都要先看一下路两边。– Doug Linder, 系统管理员

A most important, but also most elusive, aspect of any tool is its influence on the habits of those who train themselves in its use. If the tool is a programming language this influence is, whether we like it or not, an influence on our thinking habits. — Edsger Dijkstra, computer scientist

关于工具,一个最重要的,也是最不易察觉的方面是,工具对使用此工具的人的习惯的潜移默化的影响。如果这个工具是一门程序语言,不管我们是否喜欢它,它都会影响我们的思维惯式。 –Edsger Dijkstra, 著名的计算机科学家。

Being abstract is something profoundly different from being vague… The purpose of abstraction is not to be vague, but to create a new semantic level in which one can be absolutely precise. — Edsger Dijkstra

抽象和模糊完全地不同,抽象的目的并不是把事情变模糊,而去创建一个新的语义层,在那里是绝对精确的描述。 — Edsger Dijkstra

Besides a mathematical inclination, an exceptionally good mastery of one’s native tongue is the most vital asset of a competent programmer. — Edsger Dijkstra

除了数学爱好,对于一个有能力的程序员来说,出色地掌握自己的母语是最宝贵的财富。– Edsger Dijkstra

C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows away your whole leg. — Bjarne Stroustrup, developer of the C++ programming language

C很容易使你搬起石头砸自己的脚,而C++把这事变得更难,但是如果一定要这么做,那么你的整条腿都会被炸飞 -Bjarne Stroustrup, C++语言的发明者

Commentary: most debugging problems are fixed easily; identifying the location of the problem is hard. — unknown

修复bug很容易,但是定位bug却很困难 – 匿名

Considering the current sad state of our computer programs, software development is clearly still a black art, and cannot yet be called an engineering discipline. — Bill Clinton, former President of the United States

看看当前计算机程序糟糕的事态,软件开发明显一直是一门妖术,其仍然不能被称为一个工程学。 –比尔.克林顿 美国前总统

For a long time it puzzled me how something so expensive, so leading edge, could be so useless, and then it occurred to me that a computer is a stupid machine with the ability to do incredibly smart things, while computer programmers are smart people with the ability to do incredibly stupid things. They are, in short, a perfect match. — Bill Bryson, author, from Notes from a Big Country

长期以来,有个事一直困扰着我,那就是越是昂贵的,越是前沿的,就越可能是没用的。然后,困扰我的另一个事是,计算机是一个死的机器,却可以不可思议地去完成那些巧妙的事情,而计算机程序员是那么聪明人却在做着不可思议的愚蠢的事情,简而言之,他们真是天生的一对。– Bill Bryson旅游文学作家 Big Country中的笔记

Given enough eyeballs, all bugs are shallow (e.g., given a large enough beta-tester and co-developer base, almost every problem will be characterized quickly and the fix obvious to someone). — Eric S. Raymond, programmer and advocate of open source software, from The Cathedral and the Bazaar

足够多的眼睛,就可让所有问题浮现(比如:只要给于足够多的beta测试者和开发人员一起工作,那么,几所所有的问题都会很快的出现,而修正也会是显而易见的)

Good code is its own best documentation. As you’re about to add a comment, ask yourself, ‘How can I improve the code so that this comment isn’t needed?’ Improve the code and then document it to make it even clearer. — Steve McConnell, software engineer and author, from Code Complete

好的代码自己本身就是最好的文档。当你打算加注释的时候,问问自己‘我如何才能把我的代码改善到不需增加注释?’重构自己的代码,然后使文档让其更清楚。 — Steve McConnell《代码大全》的作者

Hey! It compiles! Ship it! — unknown

嘿,编译通过了!出货!–匿名

Inside every well-written large program is a well-written small program. — Charles Antony Richard Hoare, computer scientist

在每个编写精良的大程序里面都是一个编写精良的小程序。 –Charles Antony Richard Hoare,计算机科学家

It should be noted that no ethically-trained software engineer would ever consent to write a DestroyBaghdad procedure. Basic professional ethics would instead require him to write a DestroyCity procedure, to which Baghdad could be given as a parameter. — Nathaniel S. Borenstein, computer scientist

需要注意的是,没有哪个经过规范培训的工程师会赞成写一个DestoryBaghdad(摧毁巴克达)的函数。最基本的职业规范会告诉他们应该去写一个叫DestoryCity的函数,然后把“Baghdad”(巴克达)当成这个函数的参数。—— Nathaniel S. Borenstein, 计算机科学家

Managing programmers is like herding cats. — unknown

管理程序员就如同养一群猫一样 –匿名

Measuring programming progress by lines of code is like measuring aircraft building progress by weight. — Bill Gates, co-founder of Microsoft Corporation

用代码行数来衡量编程的进度,就如同用航空器零件的重量来衡量航空飞机的制造进度一样。——Bill Gates,微软创始人

More good code has been written in languages denounced as bad than in languages proclaimed wonderful — much more. — Bjarne Stroustrup, from The Design and Evolution of C++

好的代码都都在的批评声中写成的,而差的则是在表杨声中写成的。——Bjarne Stroustrup, 摘自《The Design and Evolution of C++》

Programs must be written for people to read, and only incidentally for machines to execute. — Harold Abelson and Gerald Jay Sussman, computer scientists and authors, from The Structure and Interpretation of Computer Programs

代码应该是写给其他人来读的,而能让机器运行的仅仅是附带着的。—— Harold Abelson 与 Gerald Jay Sussman, 计算机科学家和作家,摘自《The Structure and Interpretation of Computer Programs》

Real programmers don’t comment their code. If it was hard to write, it should be hard to understand. — unknown

真正程序员从来不写代码的注释,如果代码非常难写,那么同样代码的注释也会非常难懂 –匿名

Simplicity is prerequisite for reliability. — Edsger Dijkstra

简单是可靠的前提条件 — 迪杰斯特拉

The C programming language — a language which combines the flexibility of assembly language with the power of assembly language. — unknown

C语言—— 一门同时具有了汇编语言灵活性和汇编语言强大能力的语言。– 匿名

The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time. — Tom Cargill, object-oriented programming expert at Bell Labs

开始的90%的代码用了90%的开发时间,而剩下的最后的10%的代码会需要另外90%的开发时间。– Tom Cargill,贝尔实验室的面向对象编程专家。

The important point is that the cost of adding a feature isn’t just the time it takes to code it. The cost also includes the addition of an obstacle to future expansion. Sure, any given feature list can be implemented, given enough coding time. But in addition to coming out late, you will usually wind up with a codebase that is so fragile that new ideas that should be dead-simple wind up taking longer and longer to work into the tangled existing web. The trick is to pick the features that don’t fight each other. — John Carmack, computer game programmer

增加一个功能特性的成本并不单单是为这些功能编码所花费时间的成本,还这个成本应该包括特性扩展的障碍成本。当然,任何的功能清单都可以被实现,只需要有足够的时间。但是除些之外,你应该对你的代码库的脆弱性感到紧张,而那些新的想法应该足够的简单,而不是去花费更多更多的时间去纠缠于现有的蜘蛛网。这里的决窃是挑选那些不会和别人冲突的的功能。

The key to performance is elegance, not battalions of special cases. The terrible temptation to tweak should be resisted unless the payoff is really noticeable. — Jon Bently and M. Douglas McIlroy, both computer scientists at Bell Labs

表现的关键是精美和典雅的,并不是使用大量的特殊案例。对于任何调整的冲动都应该是被限制的,除非其回报真的是值得注意的。– Jon Bently and M. Douglas McIlroy, 二者都是贝尔试验实的计算机科学家

The last good thing written in C was Franz Schubert’s Symphony Number 9. — Erwin Dieterich, programmer
最后一件用C做的好作品就是弗朗茨.舒伯特的C大调第9交响曲 — Erwin Dieterich, programmer程序员

The problem with using C++ … is that there’s already a strong tendency in the language to require you to know everything before you can do anything. — Larry Wall, developer of the Perl language

使用C++最大的问题是..在C++语言里,存在这一种很强的趋势,就是如果你不明白C++语言的细节,你就无法做好任何事情。– Larry Wall, developer of the Perl language

The sooner you start to code, the longer the program will take. — Roy Carlson, University of Wisconsin

你越早开始都手编码,你所花费来编程的时间就越长 — Roy Carlson, University of Wisconsin

The value of a prototype is in the education it gives you, not in the code itself. — Alan Cooper, software author, from The Inmates are Running the Asylum

原型的价值在于他给你的教训,而不是代码自身 — Alan Cooper, software author, from The Inmates are Running the Asylum

There are only two kinds of programming languages: those people always bitch about and those nobody uses. — Bjarne Stroustrup

世界上只有两类编程语言:人们都抱怨的语言和从来没有人使用的语言 — Bjarne Stroustrup

There are two ways of constructing a software design. One way is to make it so simple that there are obviously no deficiencies. And the other way is to make it so complicated that there are no obvious deficiencies. — Charles Antony Richard Hoare

世界上有两个设计软件的方法,一种方法是设计的尽量简单,以至于明显的没有什么缺陷,另外一种方式是使他尽量的复杂,以至于其缺陷不那么明显。

Ugly programs are like ugly suspension bridges: they’re much more liable to collapse than pretty ones, because the way humans (especially engineer-humans) perceive beauty is intimately related to our ability to process and understand complexity. A language that makes it hard to write elegant code makes it hard to write good code. — Eric S. Raymond

丑陋的程序就像一座丑陋的吊桥:他们相比漂亮的良好的吊桥起来,更有可能会坍塌,这是因为人类(尤其是工程师)感知漂亮的东西是和我们处理和理解复杂问题的能力相关的。所以,一个程序语言如果很难以优雅地方式编程,那么其就很难写出好的代码。

Weeks of programming can save you hours of planning. — unknown

多做几周的编程可以节省你做计划的时间 —— 匿名 (意思为,只有实践过了,你才更容易做计划,没有实践过,做起计划来将会很头痛)

When a programming language is created that allows programmers to program in simple English, it will be discovered that programmers cannot speak English. — unknown

当程序语言被设计成允许程序以很简单的英语来编程的时候,人们将会发现编写程序的程序员都来自不会说英语的地方。 –匿名

QQ: 378890364 微信:wwtree(省短信费) 紧急事宜发短信到0061432027638  本站微博:http://t.qq.com/wwtree QQ群:122538123
级别: 管理员
发帖
8532
金币
2762
威望
3231
贡献值
0
元宝
0
只看该作者 17楼 发表于: 2010-10-11
各种流行的编程风格

在过去的N年中,我遇到了很多使用囧然不同风格的开发者,下面是我所知道的一些,你还知道其它的吗?
散弹枪编程
这种编程风格是一种开发者使用非常随意的方式对待代码。“嗯,这个方法调用出错了……那么我会试着把传出的参数从 false 变成 true!”,当然依然出错,于是我们的程序员会这样:“好吧,那我就注释掉整个方法吧”,或是其它更为随意的处理方式,直到最后让这个调用成功。或是被旁边的某个程序员指出一个正确的方法。
如果我们把一个正规的程序员和一个撞大运的程序员放在一起做结对,那么,那个正规的程序可以马上变得发疯起来,并且,可以把正规的程序员的智商降到最低。两个撞大运的程序员不应该在一起做结对编程,这是因为他们的破坏性能造成的伤害会比只有一个还大。
撞大运编程
这是一种比散弹枪编程要温和一些的编程方式,我相信这种方式可能会是大多数程序员都会使用的方式。这种编程方式经常出现于程序员并不确切知道他们在干什么,也不知道所写的程序的本质和实际,但是可以让程序工作起来。他们以一种撞大运的方式在写程序,某些时候,他们根本就不知道某个错误的原因,就开始稀里糊涂地修改代码。一旦出现问题,他们会用两条路:1)停下来,理解一下程序,找到出错的原因。2)使用散弹枪编程方式开始解决问题。
测试驱动开发(Test Driven Development)是一种可以用来拯救上百万的撞大运编程的程序员。于是,他们有了一个更为NB的借口:只要我的程序通过测试了,你还有什么话好说?别骂我,测试驱动开发是一个不错的事物,其主要是用来控制撞大运开发所带来的问题。

Cargo-Cult 编程

关于Cargo Cults 这个词儿来自二战期间的某些太平洋上小岛里的土著人。在战争期间,美国利用这些小岛作为太平洋战场上的补给站。他们在这些小岛上修建自己的飞机跑道以用来运输战争物资。而那些小岛上的土著人从来没有见过飞机,当他们看到飞机的时候,觉得相当的牛,可以为那些白人带来各种各样的物品和食物。当二战结束后,那些土著人仿照着修建了飞机跑道,并用竹子修建了塔台。然后就在那期望着有飞机为他们送来物品和食物。
Cargo Cult 编程是一种非常流行的编程方法,使用这种方法的程序员会学习其它编程高手的编程方法,虽然他们并不知道为什么高手们要那样做,但是他们觉得那样做可以让程序工作起来。举个例子,当时有大量的程序员在J2EE出现的第一年中过度地使用了EJBs和Entity Beans。
刻舟求剑编程
刻舟求剑是一个很流行的寓言了。这种风格的编程在程序员的圈子里是非常常见的。比如,有一天,你发现了一个空指针的异常,于是你到了产生空指针异常的地方,简单地放上一个判断: if (p != NULL)。
是的,这样的fix可以让你的程序工作起来,但你并没有真正地解决问题。你只不过是在你的船边记下了剑掉下去的位置,这样做只不过把问题隐藏起来,最终只会让你的程序的行为变得神出鬼没。你应该找到为什么指针会为空的原因,然后再解决这个问题。
设计模式驱动型编程
正如这种编程的名字所说的,这种编程风格使用大量的设计模式,在你的程序中,四处都是设计模式,你的代码到处都是Facade,Observer ,Strategy,Adapter,等等等等。于是,你的程序要处理的业务逻辑被这些设计模式打乱得无法阅读,最后,也不知道是业务逻辑重要,还是设计模式重要,总之,实际业务需求的程序逻辑被各种设计模式混乱得不堪入目。
侦探型编程
在解决一个Bug的时候,侦探型程序员会调查这个Bug的原因。然后,则调查引发这个BUG的原因的原因。再然后,其会分析修正代码后是否会导致其它代码失败的因果关系。再然后然后,他会使用文本搜索查找所有使用这个改动的代码,并继续查找更上一级的调用代码。最后,这个程序员会写下30个不同的情形的测试案例,就算这些测试案例和那个Bug没有什么关系,最最后,这个程序员有了足够多的信心,并且精确地修正了一个拼写错误。
与此同时,其它一个正常的程序员修正了其它5个Bug。
屠宰式编程
使用这种风格的程序员,对重构代码有着一种难以控制的极端冲动。他们几乎会重构所有经手的代码。就算是在产品在Release的前夜,当他在修正几个拼写错误的bug同时,其会修改10个类,以及重构与这10个类有联系的另20个类,并且修改了代码的build脚本,以及5个部署描述符。
QQ: 378890364 微信:wwtree(省短信费) 紧急事宜发短信到0061432027638  本站微博:http://t.qq.com/wwtree QQ群:122538123
级别: 管理员
发帖
8532
金币
2762
威望
3231
贡献值
0
元宝
0
只看该作者 18楼 发表于: 2010-10-11
各种牛B的界面

UI可能是编程中最令人头痛的事了。设计UI通常对于程序员来说是一件很痛苦的事情。下面,让我们来看一看一些可怕的UI设计吧,前面几个UI都是出于咱们程序员自己之手,把他们放在这里,希望能引起大家的注意。(国内软件的UI嘛的我就不说了,省得得罪人)下面这个例子不知道你是否让你似曾相识,呵呵,记得我上大学时,用delphi,PB经常开发这样的界面,当时觉得自己特牛!现在看上去嘛,简直就是一个垃圾。(关于UI设计,你可以查看本站的《35个强大的UI设计教程》)

UI的恶梦

首先,我们先来看一个叫wGetGUI的小工具软件,这是一个100%由程序员设计的UI,如下所示:

 

wgetgui-screenshot

看到这样的界面,你会觉得怎么样?“高科技”还是“头晕”?相比起命令行的那个wget,真不知道这个图形界面的工具是怎么被设计出来。哎。这里是这个工具的网页:http://www.jensroesner.de/wgetgui/,网页上还有几张图,也是一样的。

不过,比起下面这个来,wGetGUI算不上什么了。下面这个软件叫做:FileMatrix,这个界面是前所未有的经典,那叫一个相当强大啊。估计可以节省很多对话框和tab页了,把软件的所有功能全部一次性陈列出来。这也是程序员的杰作。(点击图片,你可以慢慢欣赏下面这个UI的细节)

UI

当然,FileMatrix今天还在,其主页在这里。今天的FileMatrix的UI界面已经变得很简洁了,其还支持一些皮肤,不过它们还是很糟糕。如下所示:(更多的图片

marble

让我们再来看看历史上Windows 3.2的某个配色方案:hotdog(如下图所示),真不知道这是谁配的,真是——“红配黄,喜洋洋”啊。

windows-311-hotdog-stand-scheme

不要以为,以简洁著称的Google就没有问题,最近的Google Wave大家用过没有?那个滚动条啊,我实在是没有搞懂为什么设计成那个样子。可谓史上最无厘头的滚动条了。下面,左边是Mac的,右边是Google Wave的,他们俩干的都是一样的事,但Google Wave的太令人摸不着头脑了。

google-wave-scrollbars

对于Google Wave的滚动条,我只想说的是,根据《Don’t make me Think》的原则,这个滚动条和其它例子一样只站在了程序员的角度,而并没有考虑用户体验。

你以Google wave scrollbar作为关键词到Google里搜索吧,你可以看到大量的讨论和抱怨。以至于Google自己都要写个说明了。

好了,最后两个图片和设计者无关,设计者在开始的时候可能并没有想到UI能变成这样。下面是关于IE7浏览器的,这张图你可能并不陌生,这是一张当我们的IE被安装了各种工具条后(很多是流氓软件)后的样子。(点击大图细细欣赏)

    iemess2 

不要以为Firefox不会像IE一样,那是因为你的Firefox没有装插件,当安装上各种插件后,也是一样的。如下所示(点击图片,慢慢欣赏)。

ffToolbars

最后,让我们看一个现实生活中的UI吧,好像是一个飞机驾驶舱。

Blackhawk-Cockpit 

你有什么UI恐怖的经历吗?欢迎与我们分享。

QQ: 378890364 微信:wwtree(省短信费) 紧急事宜发短信到0061432027638  本站微博:http://t.qq.com/wwtree QQ群:122538123
描述
快速回复

您目前还是游客,请 登录注册
批量上传需要先选择文件,再选择上传