C++博客 :: 首页 :: 联系 ::  :: 管理
  163 Posts :: 4 Stories :: 350 Comments :: 0 Trackbacks

常用链接

留言簿(48)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 393345
  • 排名 - 58

最新评论

阅读排行榜

评论排行榜

岸上的船儿如同海上的灯塔,无法移动。

—— 荷兰谚语

Een schip op het strand is een baken in zee.

[A ship on the beach is a lighthouse to the sea.]

DUTCH PROVERB

史前史中,没有别的场景比巨兽们在焦油坑中垂死挣扎的场面更令人震撼。上帝见证着恐龙、猛犸象、剑齿虎在焦油中挣扎。它们挣扎得越猛烈,焦油纠缠得就越紧,没有任何猛兽足够强壮或具有足够的技巧,能够挣脱束缚,它们最后都沉到了坑底。

过去几十年的大型系统开发就犹如这样一个焦油坑,很多大型和强壮的动物在其中剧烈地挣扎。他们中大多数开发出 了可运行的系统—— 不过只有极少数的项目满足了目标、进度和预算的要求。各种团队,大型的或小型的,庞杂的或精干的,一个接一个淹没在了焦油坑中。表面上看起来好像没有任何 一个单独的问题会导致困难,每个问题都能获得解决,但是当它们相互纠缠和累积在一起的时候,团队的行动就会变得越来越慢。对问题的麻烦程度,每个人似乎都 会感到惊讶,并且很难看清问题的本质。不过,如果我们想解决问题,就必须试图先去了解问题。

因此,首先让我们来认识一下系统开发这个职业,以及充满在这个职业中的乐趣和苦恼吧!

编程系统产品

报纸上经常会出现这样的新闻,讲述两个程序员如何在经过改造的简陋车库中,编出了超过大型团队工作量的重要程序。接着,每个编程人员准备相信这样的神话,因为他知道自己能以超过产业化团队的1 000代码行/年的生产率来开发任何程序。

为什么不是所有的产业化队伍都会被这种专注的二人组合所替代?我们必须看一下产出的是什么。

在图1-1的左上部分是程序(Program)。它本身是完整的,可以由作者在所开发的系统平台上运行。它通常是车库中产出的产品,以及作为单个程序员生产率的评估标准。

图1-1  编程系统产品的演进

有两种途径可以使程序转变成更有用的,但是成本更高的产物,这两种途径表现为图中的边界。

水平边界以下,程序转变成编程产品(Programming Product)。这是可以被任何人运行、测试、修复和扩展的程序。它可以在多种操作系统平台上运行,供多套数据使用。要成为通用的编程产品,程序必须按 照普遍认可的风格来编写,特别是输入的范围和形式必须广泛地适用于所有可以合理使用的基本算法。接着,对程序进行彻底测试,确保它的稳定性和可靠性,使其 值得信赖。这就意味着必须准备、运行和记录详尽的测试用例库,用来检查输入的边界和范围。此外,要将程序提升为程序产品,还需要有完备的文档,每个人都可 以加以使用、修复和扩展。经验数据表明,相同功能的编程产品的成本,至少是经过测试程序的3倍。

回到图中,垂直边界的右边,程序转变成编程系统(Programming System)中的一个构件单元。它是在功能上能相互协作、具有规范的格式、可以进行交互的程序集合,并可以用来组装和搭建整个系统。要成为编程系统构 件,程序必须按照一定的要求编制,使输入和输出在语法和语义上与精确定义的接口一致。同时程序还要符合预先定义的资源限制—— 内存空间、输入输出设备、计算机时间。最后,程序必须同其他系统构件单元一道,以任何能想像到的组合进行测试。由于测试用例会随着组合不断增加,所以测试 的范围必须广泛。因为一些意想不到的交互会产生许多不易察觉的bug,测试工作将会非常耗时,因此相同功能的编程系统构件的成本至少是独立程序的3倍。如 果系统有大量的组成单元,成本还会更高。

图1-1的右下部分代表编程系统产品(Programming Systems Product)。与以上的所有的简单的程序都不同的是,它的成本高达9倍。然而,只有它才是真正有用的产品,是大多数系统开发的目标。

职业的乐趣

编程为什么有趣?作为回报,它的从业者期望得到什么样的快乐?

首先,这种快乐是一种创建事物的纯粹快乐。如同小孩在玩泥巴时感到快乐一样,成年人喜欢创建事物,特别是自己进行设计。我想这种快乐是上帝创造世界的折射,一种呈现在每片独特、崭新的树叶和雪花上的喜悦。

其次,这种快乐来自于开发对他人有用的东西。内心深处,我们期望我们的劳动成果能够被他人使用,并能对他们有所帮助。从这一角度而言,这同小孩用粘土为“爸爸的办公室”捏制铅笔盒没有任何本质的区别。

第三,快乐来自于整个过程体现出的一股强大的魅力—— 将相互啮合的零部件组装在一起,看到它们以精妙的方式运行着,并收到了预先所希望的效果。比起弹球游戏机或自动电唱机所具有的迷人魅力,程序化的计算机毫不逊色。

第四,这种快乐是持续学习的快乐,它来自于这项工作的非重复特性。人们所面临的问题总有这样那样的不同,因而解决问题的人可以从中学习新的事物:有时是实践上的,有时是理论上的,或者兼而有之。

最后,这种快乐还来自于在易于驾驭的介质上工作。程序员,就像诗人一样,几乎是仅仅工作在单纯的思考中。程序 员凭空地运用自己的想像,来建造自己的“城堡”。很少有创造介质如此灵活,如此易于精炼和重建,如此容易实现概念上的设想(不过我们将会看到,容易驾驭的 特性也有它自己的问题)。

然而程序毕竟同诗歌不同:它是实实在在的东西;它可以移动和运行,能独立产生可见的输出;它能打印结果,绘制图形,发出声音,移动支架。神话和传说中的魔术在我们的时代已变成了现实。在键盘上键入正确的咒语,屏幕会活动、变幻,显示出前所未有的也不可能存在的事物。

编程的快乐在于它不仅满足了我们内心深处进行创造的渴望,而且还唤醒了每个人内心的情感。

职业的苦恼

然而这个过程并不全都是快乐。我们只有事先了解一些编程固有的苦恼,这样,当它们真的出现时,才能更加坦然地面对。

首先,苦恼来自追求完美。因为计算机是以这样的方式来变戏法的:如果咒语中的一个字符、一个停顿,没有与正确 的形式一致,魔术就不会出现(现实中,很少的人类活动要求完美,所以人类对它本来就不习惯)。实际上,我认为,学习编程最困难的部分,是将做事的方式向追 求完美的方向调整[1]

其次,苦恼来自由他人来设定目标、供给资源和提供信息。编程人员很少能控制工作环境和工作目标。用管理的术语 来说,个人的权威和他所承担的责任是不相配的。不过,似乎在所有的领域中,对要完成的工作,很少能提供与责任相一致的正式权威。而现实情况中,实际(相对 于形式)的权威来自于每次任务的完成。

对于系统编程人员而言,对其他人的依赖是一件非常痛苦的事情。他依靠其他人的程序,而往往这些程序设计得并不 合理、实现拙劣、发布不完整(没有源代码或测试用例)、或者文档记录得很糟。所以,系统编程人员不得不花费时间去研究和修改,而它们在理想情况下本应该是 可靠完整的。

下一个苦恼—— 概念性设计是有趣的,但寻找琐碎的bug却只是一项重复性的活动。伴随着创造性活动的,往往是枯燥沉闷的时间和艰苦的劳动。程序编制工作也不例外。

另外,人们发现调试和查错往往是线性收敛的,或者更糟糕的是,具有二次方的复杂度。结果,测试一拖再拖,寻找最后一个错误比第一个错误将花费更多的时间。

最后一个苦恼,有时也是一种无奈—— 当投入了大量辛苦的劳动,产品在即将完成或者终于完成的时候,却已显得陈旧过时。可能是同事和竞争对手已在追逐新的、更好的构思;也许替代方案不仅仅是在构思,而且已经在安排了。

现实情况比上面所说的通常要好一些。当产品开发完成时,更优秀的新产品通常还不能投入使用,而仅仅是为大家谈论而已。另外,它同样需要数月的开发时间。事实上,只有实际需要时,才会用到最新的设想,因为所实现的系统已经能满足要求,并体现了回报。

诚然,产品开发所基于的技术在不断地进步。一旦设计被冻结,在概念上就已经开始陈旧了。不过,实际产品需要一 步一步按阶段实现。实现落后与否的判断应根据其他已有的系统,而不是未实现的概念。因此,我们所面临的挑战和任务是在实际的进度和有效的资源范围内,寻找 解决实际问题的切实可行方案。

这,就是编程,一个许多人痛苦挣扎的焦油坑以及一种乐趣和苦恼共存的创造性活动。对于许多人而言,其中的快乐远远大于苦恼。本书的以下章节将试图搭建一些桥梁,为通过这样的焦油坑提供一些指导。


posted on 2007-12-14 16:25 sdfasdf 阅读(363) 评论(0)  编辑 收藏 引用 所属分类: 软件工程

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理