注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天地不仁,以万物为Googol!

天行有常,不以物喜,不以己悲……

 
 
 

日志

 
 

软件难做  

2008-09-01 22:07:00|  分类: 积累 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
恩,这篇开题有点大了,我紧着忽悠吧……

“软件难做”是高纳德老头子的一句名言,是怹在耗费10年精力为他自己的书写完排版软件TeX之后,说的一句话。这句话很好的体现了软件业的特点。

一般人很难想象为什么软件难做,尤其是刚刚接触程序设计(包括网页设计,流程设计,office脚本等)。他们觉得,计算机这么听话,让做啥就做啥,甚至还有这样那样别人已经做好的类库,完成一件事情如此简单,有啥难的?

好吧,我从一个例子讲一下这个区别。如果你让一个人帮你递一个杯子,你是怎么描述这个任务的呢?“帮忙把杯子递过来。”这样一句话,就能很好的达到目的了。

但是,你敢把这句话输到计算机里,让计算机完成这任务么?(假设计算机连着一个机器人)如果你真这么做,计算机一般直接回你一句“bad command or file name”……

计算机的行为过分精确,导致对给其的任务描述要细之又细,细到要告诉他什么时候拿东西(获取资源),什么时候要放回去(释放资源)。计算机到现在为止依旧没有足够的资源供挥霍(考虑一下365x7x24小时持续运转的软件有内存泄露……),而其自己又并不能很好的管理资源(没错,有内存的自动管理——垃圾收集。但锁呢?共享内存呢?IPC通道呢?Socket链接呢?)这些都为已经很复杂的任务套上了一层更加复杂的描述约束。

另一方面,用户广泛接触的电脑软件,都是单点运行,依靠一个或者两个cpu完成全部功能。即便是可以并行完成的事情,如果没有在程序中显式描述出来,运行就依旧只能是前后关系(CPU层面的乱序和超线程与此处的并行不是一个概念,而且乱序和超线程不能跨CPU)。如果程序的某一点出现没有意料到的错误(你会意识到在让人家拿杯子时,提醒对方杯子里是热水,小心别烫到么?),这种错误,轻则导致程序立刻崩溃(相信我,这是最轻的表现了,虽然可能会让用户很迷惑,甚至造成重大损失,但至少告诉用户”我错了“),重则错误随着程序的持续运行而扩散,整个任务以一种奇妙的方式扭曲了(过了10天,你发现之前保存的文件一团糟,原因是软件在识别文字编码上出了个小错误……)。

单点错误导致整体崩溃,这个很少在人完成的任务中出现。一方面,人可以利用已有知识和环境反馈对出现的偶然错误纠错(恩……也有真的纠”错“了的时候……),另一方面,对于多人合作完成的任务,人与人间的互动可以阻止错误向其他模块传播(恩……也有不负责任的人……)。不过计算机既不会纠偶发事件的错,也没有”责任心“,而且,由于之前写过的描述的复杂性,任何一点的闪失都会让整个程序轰然倒塌。谁敢说自己用到的类库一个错误都没有?

有没有解决办法?可以说,在资源有限的今天,没有完整的解决办法。自然界依靠万年的时间和无数的实验才形成了今天的人类,或许软件的完善也需要这么长的时间进化?等到CPU便宜到论斤撮,内存充足到随便送的时候,软件业可以依靠进化和自组织的方式,尝试解决这些问题吧。

一口气写了这么多,似乎还是没有把想说的说尽。不过,很多东西可能不经历是感觉不到的。另外,由于经验不够,对于在软件设计时如何避免这些问题有些想法,但还不成体系。或许哪天会写下来吧。
  评论这张
 
阅读(354)| 评论(13)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017