Software Engineering: A Look Back and A Path to the Future

 翻译这篇文章的想法最初来源于医学信息学论坛(http://bbs.miforum.net/8772.html)上转载的一篇文章Software Engineering: A Look Back and A Path to the Future(这篇文章的原始出处可能是http://sunnyday.mit.edu/cacm.html),这还是偶第一次翻译(除了在学校里老师布置的英文作业以外),仅为练习,并请多多指教。

其中的想法可能会给我们一些启发,不仅仅是关于可用性(usability)和人机交互方面的陈词滥调,而是对认知工程的一个提法,和对人类如何用自己漏洞百出的简单心智来研制和控制那些处处存在风险的复杂系统的一种思考。在作者所提到的心理学方法之外,对复杂自适应系统本身的研究也是一种可能的途径,比如我们可以精心设计一个人类可理解的简单规则,迭代出可能完全出乎意料的复杂系统。

---

Software Engineering: A Look Back and A Path to the Future
Nancy G. Leveson 
50th Anniversary issue of the CACM (February 1997).

Trying to predict the future of our field, as others have discovered, is risky: Our technology is changing so fast that the information necessary to make good predictions is simply not available. Instead, I thought I would look at the past and current state of software engineering and use this viewpoint to formulate some hypotheses about what the future should hold, that is, some of the paths I would like to see us take.

众所周知,预言这个领域的未来是一件有风险的事情:我们的技术变化太快了,以致于我们无法获得必要的信息来作出一个好的预测。因此,我想还不如回顾一下软件工程过去和现在的状况,并由此出发来阐述一下对我所希望看到的未来的一些臆测。

Software engineering has come a long way since the sixties and the first attempts to make our field into an engineering discipline. In fact, the first steps included the name itself, which reflected the goal of introducing engineering discipline into the software development process. Our achievements toward this goal include a greater understanding of the role of abstraction and separation of concerns in software engineering, the introduction of modularity and the notions of a software life cycle, process, measurement, abstract specifications and notations, etc.

从六十年代开始到现在,软件工程已经获得了长足的发展。它首先是把软件这个领域带入工程的范畴。包括软件工程这个名字本身,就反映了将工程实践引入软件开发过程的目标。在朝着这个目标前进的道路上,我们获得了诸多成果,包括对抽象和分离软件工程关注点的更深刻的认识,模块化的引入,以及软件生命周期,过程,度量,抽象的规约和符号等等。

Most of these ideas come directly from engineering, although they needed to be adapted to the unique problems that arise in working with different and more abstract materials. Although hardware engineers are also involved in design, they are guided and limited by the natural laws of the materials with which their designs must be implemented. Software appears not to have these same types of natural limits, but to be infinitely flexible and malleable. In reality, the limits exist but are simply less obvious and more related to limitations in human abilities than limitations in the physical world.

这些思想主要还是直接来源于传统的工程领域,虽然其中必须做一些订制,因为软件领域需要处理的是一些更加抽象的材料。跟软件领域一样,硬件工程师也需要进行设计工作,但他们需要受到材料的自然规律的指导的限制。软件好像不仅不会受到这些自然规律的限制,而且灵活性和延展性近乎无限。然而,在现实世界中,对软件的限制依旧存在,这些限制并不明显而且并非跟物理世界,而是跟人类的能力有关。

Thus the first fifty years may be characterized as our learning about the limits of our field, which are intimately bound up with the limits of complexity with which humans can cope. Our tools and techniques are used to assist us in dealing with this complexity, that is, to help make our systems intellectually managable. We do this by imposing on the software development process the discipline that nature imposes on the hardware engineering process. We have been learning what types of discipline are necessary and how to best enforce them.

于是,可以说刚开始的五十年我们都是在学习软件领域的这些限制,这些限制主要跟人类所能应付的复杂性有关。我们的工具和技术帮助我们处理这些复杂性,以实现软件系统的智力可掌控。我们借助于软件开发过程,象自然规律约束硬件工程那样来约束软件开发。我们一直在学习如何选择必要的过程模型,以及如何把他们用到及至。

Besides engineering and management discipline, we have also been learning how to apply mathematical rigor and discipline to software development. To this end, many of the pioneers of our field have shown the relationship of software with mathematics and the use of mathematics in solving our problems. These achievements include the axiomatization of programming languages and data types, formal verification, and formal specification and analysis.

除了工程和管理方面之外,我们还学着将数学的精确性引入软件开发。朝着这个目标,软件领域的很多先行者为我们揭示了软件和数学之间的关系,并用数学来解决我们的实际问题。这些贡献包括编程语言和数据类型的公理化,形式验证,形式规约与分析。

Although we have come a long way in building the engineering and mathematical foundations of software engineering and in improving our ability to build complex software, at the same time the problems we are attempting to solve have been getting more difficult: Man's reach always seems to exceed his grasp. The problems are also changing in their fundamental nature. The earlier emphasis on efficiency has shifted to an emphasis on correctness and utility as we become increasingly dependent on computers in applications where losses due to computer errors are potentially huge. Economic considerations have increased the emphasis on reuse and reusable components. And although our early days were filled with building new software, we are more and more consumed with the problems of maintaining and evolving existing software. In addition, as our systems grow bigger and require large teams of designers, we have started to examine the ways humans collaborate and to devise ways to assist them to work together effectively.

虽然我们在建立软件领域的工程和数学基础以及提高我们构建复杂软件的能力上取得了长足的进步,但是我们试图解决的问题也正在变得越来越困难:人们的期望总是超越自己的极限。一些问题本身也在发生着变化。随着我们对计算机依赖性的日益加强,计算机的错误将可能会导致巨大的损失,人们的关注点从早期的效率转移到正确性和效用上面来。基于经济性地考虑,人们也更加关注重用和可重用的组件。而且早期可能我们一直忙于创建新的软件,现在我们越来越需要考虑如何维护和改进现有的软件。另外,更大规模的系统和设计团队,又迫使我们去研究人际协作的方式,使得他们可以在一起更有效率地工作。

These same trends will continue in the next fifty years, with perhaps even less emphasis on coding and more on the other aspects of the software engineering process. But there will be new challenges and perhaps new approaches and directions that will be required to solve the problems of the next century. To address these challenges, we may need to shift our emphases and follow some new paths.

在未来的五十年里,这些趋势将继续存在,期间对编码的关注将会被弱化,而更加强调软件工程过程中的其他方面。同时也会有新的挑战,以及可能的新方法和研究方向,来解决下个世纪的新问题。为了迎接这些挑战,我们可能需要转移我们的关注点,并遵循一些新的途径。

If our problems in building and interacting with complex systems are really rooted in intellectual managability and human limits in managing complexity, then we will need to stretch these limits to build ever more complex systems. But basic human ability is not changing. To successfully build and operate ever more complex systems, we will need to find ways to augment human ability, both in terms of system designers and system users. Achieving this goal, I believe, will require augmenting our engineering and mathematical foundations with ideas from cognitive psychology and the social sciences.
While our first 50 years have seen us develop our concepts of software as an engineered product and a mathematical object, less attention has been focused on software as a human product and on computers as devices that interact with and assist humans (as opposed to replacing them). Software engineering is a problem-solving activity and software engineering techniques and tools are used to assist humans in this activity---the effectiveness of our tools could be greatly increased if we based their design on scientific knowledge about how humans solve problems. Our software products are also used or monitored by humans, and the way that our software is designed to interact with humans is a critical factor in whether the software is useful to or usable by them.

如果我们在创建复杂系统以及与之交互方面遇到的问题真的来源于智力可掌控性以及人类在管理复杂性方面的能力极限的话,那么要建造更复杂的系统,我们就必须进一步拓展这些极限。然而,人类的基本能力并没有改变。要成功地建造更复杂的系统,我们必须设法拓展人类(包括系统设计者和使用者)的能力。为了达到这个目的,我相信,我们需要运用来自认知心理学和社会科学方面的思想来增强我们的工程和数学基础。我们前五十年是将软件作为一个工程产品和数学对象来开发,而很少注意到软件应该是一种人类产品,以及计算机应该是一种与人交互并为之辅助的设备(而不是取代人类)。软件工程是一种解决问题的活动,软件工程技术和工具应该被用来辅助人类来解决问题——如果我们能基于对人类是如何解决问题的认识来设计这些工具,它们必将会发挥更大的效力。同时,软件产品也是被人类使用和监控的,软件与人之间交互方式的设计将是决定这个软件是否有用的关键因素。

When creating new software engineering methods and tools, we often inadvertently enforce particular problem-solving strategies, often the one preferred by the designer of the method or tool. We need to learn more about human problem solving, particularly with respect to software engineering tasks, and give our students a better grounding in cognitive psychology. For example, psychologists have found that not only do problem-solving strategies vary among individuals, but individuals vary their strategies dynamically during a problem-solving activity. To design more effective and usable software engineering methods and tools, we need to ensure they do not limit or assume certain problem-solving strategies but instead support multiple strategies and allow for shifting among strategies during problem solving.

在创造新的软件工程方法和工具的时候,我们常常会不经意间过分强调某一种特定的问题解决策略,而这种策略通常只是设计者对某种方法和工具的偏好。我们需要更多地了解人类是任何解决问题的,尤其是从事软件工程活动的时候;并让我们的学生有更好的认知心理学的基础。比如,心理学家发现不仅不同的人会有不同的问题解决策略,而且人们在解决问题的过程中也会动态地选择不同的策略。要设计更有效的软件工程方法和工具,我们必须确保这些方法和工具不能去限制或者是假设使用者去采用那种问题解决策略,而是支持多种策略,并允许他们在解决问题的过程中在不同的策略之间进行切换。

Our techniques and tools not only have an effect on our problem-solving ability, they also affect the errors we make while solving those problems. Thus, our tools and methods should also reflect human limitations and capabilities, which will require our learning more about human errors and limitations in performing software engineering tasks and in using our tools and products.

我们的技术和工具不仅会影响我们解决问题的能力,而且会影响我们解决问题的过程中可能犯的错误。因此,我们的工具和方法应该根据人类的能力和局限性来进行设计,这就需要我们更多地了解人们在从事软件工程活动以及使用我们的工具和产品的时候是如何犯错误的。

In addition to these new challenges in making our software engineering techniques more human-centered, important problems are starting to arise in designing human-software interfaces and interactions. In the engineering world, the challenges in building high-tech systems composed of humans and machines have necessitated augmenting traditional human factors approaches to consider the capabilities and limitations of the human element in complex systems. Cognitive engineering is a term that has come to denote the combination of ideas from systems engineering, cognitive psychology, and human factors to cope with these challenges. With computers playing more and more important roles in these systems, computer science and especially software engineering needs to be integrated with these other concerns.

为了使得我们的软件工程技术更加的人性化,除了上面这些新的挑战以外,更重要的问题开始在人机界面和交互设计领域出现。在工程领域,构建高科技系统时遇到的人机方面的挑战,迫使人们更多地从人因工程方面考虑复杂系统中人类因素能力和局限性。认知工程这个术语揭示了我们可以将系统工程、认知心理学和人因工程结合起来应对这些挑战。随着计算机在这些系统中扮演越来越重要的角色,计算机科学尤其是软件工程必须跟其他这些学科结合起来。

I believe that many of the problems arising in our attempts to build complex systems are rooted in the lack of integration of software engineering, system engineering, and cognitive engineering. We need to build more bridges between these three disciplines. The problems in building complex systems today often arise in the interfaces between the components---where the components may be hardware, software, or human. One example is the recent glass cockpit aircraft accidents where the events have been blamed on human error, but more properly reflect difficulties in the collateral design of the aircraft, the avionics systems, and the demands placed on the pilots. We need methodologies that ease coordinated design of the components and the interfaces and interactions between the components and that provide seamless transitions and mappings between the disciplines involved.

我相信我们构建复杂系统的时候遇到的很多问题都是因为没有把软件工程、系统工程和认知工程结合起来。我们需要在这三个领域之间建立更多的桥梁。如今复杂系统的问题通常产生于组件之间的接口,这些组件可能包括硬件、软件或者人。比如我们把近来发生在有玻璃驾驶舱的飞机上的事故归因于人为失误,但更确切地说这反映了飞机设计中的困难,比如电子系统,以及对飞行员的各种要求。我们需要新的方法论来缓解这些组件及其交互设计中的困难,让它们能够进行平滑地交互和不同规则之间的映射。

Another example of the important questions we need to tackle is the reasonableness of our goals in terms of replacing humans (such as pilots, nurses, factory workers) by computers. Aside from the moral and philosophical questions, there are technical ones: Have we oversold (albeit inadvertently) the ability of computers to replace human intelligence and ability? Often, we simply automate what can be automated while leaving humans with an assortment of miscellaneous tasks that may be harder to do correctly in isolation. At the same time, we ask humans to perform what are often impossible monitoring or backup tasks and then blame them when the inevitable accidents occur. Do we increase risk or simply change it by using computers to provide control of potentially dangerous systems rather than assisting humans in doing a better job of controlling them? The latter is more difficult because it requires a deep understanding of human capabilities and limitations, but will it get us farther in the end? These are some of the new issues I believe software engineers will have to confront. To solve them will require recognizing the important role of psychology in software engineering, augmenting our foundations with appropriate knowledge, and building links with cognitive engineering.

关于我们需要解决的这些重要问题的另一个例子就是用计算机来取代人类(比如飞行员、护士和工人)这个目标的合理性。撇开道德和哲学的问题不谈,单看技术方面:我们是否过度夸大了(虽然是不经意间)计算机的能力?通常我们只是简单地把那些可以自动化的工作让机器来完成,而把那些可能难以让机器正确完成的杂七杂八的工作留给人类。同时,我们还让人类去做那些通常是不可能的监控和备份的工作,然后在不可避免的事故发生的时候把责任归咎于他们。我们让计算机来控制那些存在潜在危险的系统,而不是来辅助人类更好地控制它们,这样做是否会引入更多的风险?要实现后者当然会更加困难,因为我们需要对人类的能力和局限性有深刻的理解,但这也会让我们取得更大的进步。我想这些都会是软件工程师需要面对的新问题。这些问题的解决需要我们意识到心理学在软件工程中的重要性,用相关学科的知识增强我们的工程基础,并与认知工程建立联系。

Our links with the social sciences also need to be strengthened. Truly understanding and advancing a technology requires understanding its history, scientific basis, and the cultural and social milieu in which it operates. Technology does not exist outside of the context of a human society:

We pretend that technology, our technology, is something of a life force, a will, and a thrust of its own, on which we can blame all, with which we can explain all, and in the end by means of which we can excuse ourselves.
[T. Cuyler Young in Man in Nature edited by Louis D. Levine, Royal Ontario Museum, Toronto, 1975].

我们跟社会科学的联系也需要加强。要真正理解和推进一种技术需要理解它的历史、科学基础以及它所应用于的文化和社会环境。技术不会脱离于人类社会而存在:

我们欣欣然以为技术,我们的技术,是一种生活的动力,一种愿望,以及它自身的一种推进力量,我们可以把一切都归咎于它,用它来解释万物,并最后用它来对我们的所作所为进行辩护。

We need to place more emphasis on understanding the effects of the technology we create on the world. We have had a tremendous effect on human life and human society, but only a few computer scientists seem to be considering these effects to any degree. While caught up in the fervor and excitement of developing a new and revolutionary new technology with the potential to change the world in profound ways, we might be excused for concentrating on the technical to the exclusion of the social. But we have now matured to the point where we need to start assuming responsibility for what we do. A basic precept in most engineering professional codes of conduct is that engineers shall hold paramount the safety, health, and welfare of the public in the performance of their professional duties. As a maturing field, we will need to develop our own standards and codes of professional conduct and more fully accept our responsibility for the uses and potential misuses of our inventions, for the effect we have on society and human life, and for our role in those events.

我们需要更加注重探究我们所创造的技术对世界的影响。我们已经对人类的生活和人类社会造成了巨大的影响,但只有少数计算机科学家在一定程度上考虑过这些影响。当我们沉迷于开发一个可能对世界影响深远的革命性的新技术所带来的激动和热情之中的时候,我们可能要为我们太过关注于技术而把社会因素置之度外而感到惭愧。但我们现在已经变得成熟,足以开始意识到要为我们的作为承担责任。在大多数工程职业的规范和操守中有一个基本的规则,就是工程师在履行它们的专业职责的时候,应该把安全、健康和公众的福利放在首位。作为一个成熟的领域,我们需要制定我们自己的职业操守标准和规范,并对使用和误用我们的创造承担更全面的责任。

The history of software engineering has been one of coming to see that what originally seemed to be limitless actually does have limits, understanding the nature of those limits, and then searching for ways to expand them. To continue our progress, we will need to continue building our scientific knowledge about those limits and searching for new and different ways to stretch them.

软件工程的历史是一个发现到那些我们原以为没有限制的地方确实存在限制,理解这些限制背后的道理,然后寻找方法去拓展它们的过程。要继续这个过程,我们还要继续构建关于这些限制的科学知识,并寻找更好的方法去延展它们。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章