• 人月神话阅读笔记-03


    另外一面

    • 目的。主要的功能是什么?开发程序的原因是什么?
    • 环境。程序运行在什么样的机器、硬件配置和操作系统上?
    • 范围。输入的有效范围是什么?允许显示的合法范围是什么?
    • 实现功能和使用的算法。精确地阐述它做了什么。
    • 输入-输出格式。必须是确切和完整的。
    • 操作指令。包括控制台及输出内容中正常和异常结束的行为。
    • 选项。用户的功能选项有哪些?如何在选项之间进行挑选?
    • 运行时间。在指定的配置下,解决特定规模问题所需要的时间?
    • 精度和校验。期望结果的精确程度?如何进行精度的检测?

    没有银弹——软件工程中的根本和次要问题

    没有任何技术或管理上的进展,能够独立地许诺十年内使生产率、可靠性或简洁性获得数量级上的进步。所有软件活动包括根本任务——打造由抽象软件实体构成的复杂概念结构,次要任务——使用编程语言表达这些抽象实体,在空间和时间限制内将它们映射成机器语言。

    软件工程领域的根本难题在于复杂度,一致性,可变性和不可见性。值得注意的是,文章末尾提出了一些可能的银弹,比如面向对象编程,只能解决软件工程中的非本质困难,而对于软件工程根本的问题于事无补。就是说,我们某种程度上能够解决使用编程语言表达抽象的实体,或者将其变得结构化,构建起完整的概念结构,但是仍然没有解决软件工程的根本难题——复杂度、一致性、可变性和不可见性。
    因此,现在的技术中最有希望的,并且解决了软件的根本而非次要问题的技术,是开发作为迭代需求过程的一部分——快速原型化系统的方法和工具。
    快速原型之所以可以解决根本问题,是因为快速原型有助于澄清软件工程的概念结构,从而降低了后期变更的幅度。基于快速原型进行增量开发,目前已经成为实际开发的标准流程。

    再论《没有银弹》

    Brooks在这篇文章里面再次讨论了很多潜在的银弹。因为自从《没有银弹》发表以后,遭到了大量的误解、批评和质疑,Brooks专门写了这篇文章来继续解释他的观点和回应批评。

    首先一个可能的银弹是Harel提出的一种叫做Vanilla的框架,有助于程序的概念设计和图形化呈现,看上去确实直面软件工程开发的根本困难:复杂性和不可见性。Brooks甚至也赞同如果Vanilla框架得到发展应用,也许就是银弹。但是今天看来,20年过去了似乎Vanilla已经遭人遗忘。显然它并非软件开发的银弹。

    另一个可能的银弹是定制软件包的开发。基本上今天的开源社区已经这样做了。大量的公共库被开发出来,确实提高了通用需求的开发效率。Brooks也承认,他低估了软件包客户化的程度和重要性。

    面向对象编程,被称为“铜制子弹”。但是面向对象技术“不会加快首次或第二次的开发,产品族中第五个项目的开发才会异乎寻常的迅速”。不过经过20年再来看,面向对象虽然发展缓慢,但是的确已经统治了软件开发行业,称得上一颗“铜制子弹”。

    大多数有丰富经验的程序员拥有自己的私人开发库,可以使他们使用大约30%的重用代码来开发软件。公司级别的重用能提供70%的重用代码量,它需要特殊的开发库和管理支持。公司级别的重用代码也意味着需要对项目中的变更进行统计和度量,从而提高重用的可信程度。

    但是重用面临一个问题,就是重用所带来的好处,必须大于其代价,才得以实施。比如一个数学库函数,如果不重用,那么程序员自己需要学习大量的相关知识才能写得出来。而对于项目中的某个功能,与其花费很多功夫寻找重用的模块,可能程序员直接重新实现一次是更快捷的做法。

    重用是一件说起来容易,做起来难的事情。它同时需要良好的设计和文档。即使我们看到了并不十分常见的优秀设计,但如果没有好的文档,我们也不会看到能重用的构件。

    软件重用的另一个问题是学习的成本。越复杂的功能,学习成本越高。高级语言比机器语言功能强大,但是也更加复杂。而重用一个模块,则需要学习相应该模块的成本。这种成本今天已经在各类专门开发职业中体现出来,如后台程序员,Web前段或者手机客户端,不同类别的程序员差别就在于其对某一重用模块的专门知识的掌握。

    20年后的人月神话

    今天,我比以往更加确信。概念完整性是产品质量的核心。拥有一位结构式是迈向概念完整性的最重要一步。这个原理不仅限于软件系统,它适用于所有的复杂事物。

    如果要我用一个词语来概括人月神话,我想我会说“沟通代价”;如果可以有两个词,那就加上“概念完整性”。

    20年后的人月神话有些结论得到验证,有些情况已经变化,下面是这些情况的简单概括:

    • 第二系统定律得到验证:开发第二个系统总是因为盲目的功能导致易用性、甚至是可用性的灾难。
    • 图形界面的成功
    • 瀑布模型被证明是错的了,因为没有构建舍弃原型。事实上增量开发与快速迭代才是理想的开发方式。
    • 增量开发和快速原型,渐进地精华,让软件像生物进化那样逐渐演化成更为复杂的结构,演化出更多的功能。
    • 信息隐藏:Parnas是正确的,我是错误的。20年前关于信息隐藏的两大观念,其一是Brooks主张的,所有的程序员应该了解所有的材料。而Parnas则认为代码模块应该采用定义良好的接口来封装,这些模块内部结构应该是程序员的私有财产。Brooks承认,Parnas所主张的方案确实更符合实际。
    • 对人月神话实际研究发现,向进度落后的项目中添加人手会增加项目的成本,但是不一定会使项目更加落后。如果在项目早期添加额外的人比在后期添加额外的人更安全些。
    • 人就是一切。这一点可以从《人件:高生产率的项目和团队》可以见出。
    • 放弃权利的力量——公司通过将权利下放到具体的团队,事实上使得组织机构变得更加“融洽和繁荣”。
    • 最令人惊讶的新事物——数百万的计算机
    • 使用塑料包装的成品软件包作为构建:成熟的模块和对象组合提升了软件复用的层次。

    软件工程的未来

    软件工程的焦油坑在将来很长一段时间内会继续地使人们举步维艰,无法自拔。软件系统可能是人类创造中最错综复杂的事物,只能期待人们在力所能及的或者刚刚超越力所能及的范围内进行探索和尝试。这个复杂的行业需要:进行持续的发展;学习使用更大的要素来开发;新工具的最佳使用;经论证的管理方法的最佳应用;良好判断的自由发挥;以及能够使我们认识到自己不足和容易犯错的——上帝所赐予的谦卑。
  • 相关阅读:
    编译i386 Linux 内核并基于 QEMU 运行
    在 Linux 上编译运行并测试 LwIP 协议栈性能
    gdb 重定位源文件目录
    SkyWalking 分布式追踪系统
    微服务化的基石——持续集成(二)
    微服务容器化的分工与合作,促进DevOps (一)
    预订餐位
    单词记录1.26
    What do you do on weekends
    make a travel plan(LC)
  • 原文地址:https://www.cnblogs.com/chenyuchun/p/10415896.html
Copyright © 2020-2023  润新知