Chinaunix首页 | 论坛 | 博客
  • 博客访问: 947079
  • 博文数量: 134
  • 博客积分: 7443
  • 博客等级: 少将
  • 技术积分: 1411
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-10 20:18
文章分类

全部博文(134)

文章存档

2012年(7)

2011年(29)

2010年(16)

2009年(6)

2008年(18)

2007年(58)

分类: 项目管理

2009-04-08 13:07:51

接上文:软件设计中的多维度的平衡。

软件设计中要考虑很多方面,如:简单,完备,巧妙,易懂,紧凑,透明,通用,这些特性,有时相互统一,有时又相互矛盾,要实现理想的设计,必须在各种矛盾寻找到一个理想的平衡点。这可以想象成,在一个多维的空间区域中寻找一个中心点,但这个多维的空间是一个曲折的空间,并且没有办法进行直接测度,所以你不要指望使用折中的方法。

你必须深入思考,把握最关键的部分,并把相互关联的多个问题综合起来,形成整体的,直观的认知,这样才有可能摆脱“解决一个问题又产生两个问题”的怪圈。思考过程中,会有各种各样的念头。某个念头在进一步的思考中被否决,也不能马上放弃它,因为它可能引向一个正确念头。仿佛在最后一刻,突然的灵感被你抓住,就可能得到一个理想的方案。理想的方案让设计人员感到满足,获得成就感。这就像艺术家在抓住灵感后的喜悦。

然而,"凡事有违经而合道者,亦有反道而适权者"。在某些特殊的场景下,产品的某一特性有决定生死的重要性,追求多个特性之间平衡的思路已经不能适用。这种情况下,你必须极端地追求某一特性,不虑其他。

去年,我设计了一个流量采集汇总的程序:接收网络设备发送过来的流量数据(NetFlow或NetStream),根据配置的多个规则,实时地对这些数据进行过滤,分组,求和,并可根据预先设置的阈值进行告警。因为流量数据的量特别大,而且对数据处理的实时性有很高的要求,而现实中的许多客户又不能为这个需求,配置一天特别的高性能服务器。设计的主要挑战就是可配置性和性能。这个产品的前一版本,是把大量的原始数据直接插入到数据库中,使用定时运行的SP(存储过程)进行汇总操作,这对数据库的性能压力非常大,实时性也不理想。这次设计新的版本,就是要实现高效的,实时的数据处理。

除了设计出巧妙的配置汇总规则的方法。为了追求吞吐量和实时性的极限,这个产品中使用了很多特别的设计,这些特别的设计常被我们的程序员称为“变态的追求性能”。比如:(1)保存处理规则的数据结构中,不保存属性的名称,而是保存获取这个属性的成员函数指针,这样在进行数据处理时就没有了匹配名称的操作;(2)使用lex+yacc生成的代码,把条件表达式,直接翻译成具有过滤数据功能的代码,在数据处理时直接调用这些代码;(3)数据处理线程中,杜绝一切直接的I/O操作和费时间的系统调用等等。许多这样的设计,其实是增加了产品的复杂性的,对编码人员的要求也更高。可是为了追求性能,不得不这样做。

这让我想起了SR-71

SR-71“黑鸟”(BlackBird),美国空军高空高速侦察机。飞行高度达到30000米,最大速度达到3.5倍音速,这称之为“双三”。因此SR-71比现有绝大多数战斗机和防空导弹都要飞得高、飞得快,因此出入敌国领空如入无人之境;在以色列上空侦察以色列核设施时,以军F-4战斗机向它发射了AIM-9“响尾蛇”空空导弹,但是导弹飞得却还比SR-71慢。
因为SR-71在高速飞行时,机体长度会因为热胀伸长30多厘米;油箱管道设计巧妙,采用了弹性的箱体,并利用油料的流动来带走高温部位的热量。尽管采用了很多措施,但SR-71在降落地面后,油箱还是会因为机体热胀冷缩而发生一定程度的泄漏。实际上,SR-71起飞时通常只带少量油料,在爬高到巡航高度后再进行空中加油。 
由于SR-71的飞行高度和速度都超出人体可承受的范围,两名成员必须穿着全密封的飞行服,看上去外观与宇航员类似。

阅读(2099) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-04-13 16:15:21

飞行员可承受的加速度基本是常数,这点SR-71与F15没多少区别。 穿密封衣应该是对付高空氧气稀薄及低气压的问题

cuichaox2009-04-13 12:41:03

对,是加速度。 正因为速度太高,飞机在变向,爬升等时刻的加速度才大。要说的准确,应该这样解释下。

chinaunix网友2009-04-13 12:24:07

物理没学好,人体对速度没有承受范围,那个叫加速度

chinaunix网友2009-04-09 12:04:11

Lex 和 Yacc 是 UNIX 下的工具,好像比较复杂,不是很了解。 按照多种不同的规则对数据进行处理的情况,是否可以考虑宿主语言(C/C++)中嵌入脚本语言(perl/python/js/lua)的方式,灵活性会很好,调试很方便。性能上可能会差些,但如果规划设计得当的话应该也没有什么问题,比如netcool中通过rules文件处理告警数据的方式。