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.

軟件工程的歷史是一個發現到那些我們原以爲沒有限制的地方確實存在限制,理解這些限制背後的道理,然後尋找方法去拓展它們的過程。要繼續這個過程,我們還要繼續構建關於這些限制的科學知識,並尋找更好的方法去延展它們。

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