【外刊IT评论】复杂是大敌

标签: 复杂度 批评评论 debug 调试 | 发表时间:2011-05-10 00:53 | 作者:admin Keen
出处:http://www.aqee.net
本文是从 Complexity is the enemy 这篇文章翻译而来。

差不多在Google工作有7个年头了(!)。我在这学到了很多东西,写都写不完。然而不管怎样,我至少要向你们分享一条只有在我有了更多经验后才得到的东西。

复杂是软件的死神。你无法用数字评估它所造成的代价,它会悄悄慢慢的出现,就像是用小火在煮你,让软件变得越来越糟,你很难察觉到,而当你察觉到时,那已经太晚了。在另一方面,你经常的会很容易的看到增加复杂度带来的好处:增加一个新的扩展层,你可以实现新功能X,或把本来运行在一个机器上的进程分成两个,用来解决当前系统的扩展瓶颈。但现在你的大脑里必须想着这个新增加的层,或这还要实现一个远程调用层来管理这两台机器。

基本上,程序员老手和新手一样都很容易出现上面的情况。我认为这些年我在这个行业里学到的只是更擅长在两者之前取得平衡;何时复杂一点是合理的,何时必须要拒绝。我经常回想起一个朋友在Ken Thompson写的Go语言编译器上的一句评论:它很快,因为它没有做多少事,代码直接明了。

事实表明,就像你能很容易的写出一篇很长的博客但把相同的观点叙述的简明扼要却很难,你很难把软件写的简单明了。在编程语言的设计上你最容易看出这一点;新手设计出的语言总是包含大量的功能特征,而很少像C语言那样清爽明晰。如今的程序,动不动就牵涉多少个对象;这在分布式系统里就意味这你要移动多少的东西。

另外一个用来描述这个问题的词是“才智”:引用另外一个C程序员的话,“调试纠错程序比第一次编写出这程序要困难两倍,如果你是用尽了你所有的聪明才智写出这程序,那根据这定义,你就没有最够的才智去调试debug它了。”

建议吗?我怀疑只有通过经验才能理解这个道理——有一个事很刺激我,太多的项目里都有人认为元数据编程很酷。我发现制定一个详细的设计目标来评估新代码是否有必要,这很有帮助。如果你可以说“这些代码不能帮助项目的最初设计目标上解决任何问题”,你就能很容易的拒绝这些代码。在Google,用来描述一个新项目的设计方案的文档模板上,在其右上角有个区域专门列着目标外内容:对项目的合理扩展将会被拒绝。

很讽刺的是,我发现使用弱智的工具或语言能帮助我们抵制复杂。你很难写出一个很复杂的C程序,因为它里面没有太多的东西。C程序大多用大量的数组,因为你只能用它,但结果却证明,数组是非常好的东西——紧凑的内存使用,O(1)次的数据访问,很好的数据存储。但我从来没有倡导过特意的使用一种弱智的工具。相反,我的心得是:像C一样编写Python程序。


本文原始地址:复杂是大敌

相关 [it 复杂] 推荐:

微信有多复杂?

- - 最新更新 – Solidot
腾讯旗下的微信从一个通信工具变成了一个庞大的平台,那么这个平台究竟有多复杂. 它的开发者写的论文 透露了部分细节:微信的后端包含了 3000 多个移动服务,包括即时通讯、社交网络、移动支付和第三方授权. 每天的外部请求有 10^10-10^11 个,每一个请求都能触发更多的内部微服务请求. 总体上说微信后端每秒需要处理数亿的请求.

【外刊IT评论】复杂是大敌

- Keen - 外刊IT评论
本文是从 Complexity is the enemy 这篇文章翻译而来. 差不多在Google工作有7个年头了(!). 我在这学到了很多东西,写都写不完. 然而不管怎样,我至少要向你们分享一条只有在我有了更多经验后才得到的东西. 你无法用数字评估它所造成的代价,它会悄悄慢慢的出现,就像是用小火在煮你,让软件变得越来越糟,你很难察觉到,而当你察觉到时,那已经太晚了.

EXT.NET复杂布局(二)——报表

- 華 - 博客园-首页原创精华区
前面提到过工作台(《EXT.NET复杂布局(一)——工作台》)了,不知道各位看过之后有什么感想. 这次就介绍介绍使用EXT.NET画几个报表. 看图写作从小学就开始了,如图:. 各位看官,不要以为这报表画起来很难,其实使用EXT.NET来画的话,还是挺简单方便的. 这个报表实现,本人采用的是最原始的手写代码(之所以这么说,是因为没怎么偷懒,老老实实的写的,因为这是刚接触EXT.NET的时候画的).

放弃复杂对焦方式

- liangges - 摄影之友
单点对焦是最基础的对焦方式,只要掌握以下拍摄技巧,只用单点对焦,也能搞定风光、人像、静物三大经典场景中的对焦问题.. 在拍摄风光时,我们基本上都是利用三脚架确定构图后再拍摄,这时选择单点自动对焦是方便操作的办法. 当我们需要使用大光圈利用浅景深来突出花朵、树木等主体时,即使是完全相同的构图,由于焦点的不同也可得到画面风格、主题思想等完全不同的2张作品.

把复杂事物简明化

- 勇丞 - 左岸读书_blog
管理就是把复杂的问题简单化,混乱的事情规范化. 最容易不过的是忙碌,最难不过的是有成效地工作. 而化繁为简、善于把复杂的事物简明化,是防止忙乱、事半功倍的法宝. 工作中,我们经常看到有的人善于把复杂的事物简明化,办事又快又好,效率高;而有的人却把简单的事情复杂化,迷惑于复杂纷繁的现象之中,使复杂的事物更复 杂,结果只能陷入其中走不出来,工作忙乱被动,办事效率极低.

Google 复杂的招聘流程

- Desmond - 爱范儿 · Beats of Bits
去 Google 工作想必是许多人的梦想. 还记得以前有位老兄 Matthew Epstein 吗. 他专门制作了一个 googlepleasehireme 网站,想以此混进 Google. 虽然 Techcrunch 的编辑好心的预言他会被雇佣,但最终结果还是碰了壁. Google 之所以有吸引力不仅因为它的庞大,它的野心和梦想,而且因为那里的环境非常人性化.

Eclipse:使用Metrics 测量复杂度

- - CSDN博客推荐文章
Metrics可以进行许多有用的代码度量,包括圈复杂度度量,它用于测量方法中惟一路径的数目. 在Eclipse中安装和使用Metrics步骤 . Elipse中安装Metrics插件 . 打开Help->Install new Software,点击Add,添加Repository. 选择相应的版本插件,继续随后的安装 .

CXF+JAXB处理复杂数据

- - 博客园_首页
CXF+JAXB处理复杂数据. JAXB 来实现对象和XML之间的映射. 前面的例子 中,使用CXF发布的Webservice,其方法的参数和返回值都是简单类型. 本文讨论对象复杂性的分级,验证对于各种复杂度JAXB的支持情况,以及使用JAXB时对于Map,循环引用,继承等情况的处理办法. 文中的例子没有直接调用JAXB的API,而是用CXF发布webservice的形式验证对象到xml的marshal和unmarshal, 所以本文也可以作为使用CXF的参考资料.

复杂性和用户体验[译]

- - UX 一淘体验中心
       【译者按】每一个交互设计师应该都怀有一颗追求简单的心——轻盈的操作,简易的流程,干净的界面. 每每提及复杂性,必然会想到其对立面——简单. 所谓简单,就是要去除不必要的干扰,让用户直达目标.        UX的使命之一就是:将复杂的流程简单化. 其间,纠结一个Button的摆放、大小、颜色,又或者研究各类用户群体的“脾气”.

复杂性和用户体验设计

- - ITeye资讯频道
每一个交互设计师应该都怀有一颗追求简单的心——轻盈的操作、简易的流程、干净的界面. 每每提及复杂性,必然会想到其对立面——简单. 所谓简单,就是要去除不必要的干扰,让用户直达目标. UX的使命之一就是:将复杂的流程简单化. 其间,纠结一个Button的摆放、大小、颜色,又或者研究各类用户群体的“脾气”.