Nguyên Tắc Kỹ Thuật Phần Mềm: Khám Phá Các Nguyên Tắc Cơ Bản

Tài liệu nghiên cứu Software engineering principles, tổng hợp lý thuyết và thực hành, cung cấp kiến thức chuyên sâu về ., phục vụ nghiên cứu và ứng dụng thực tiễn

Trường đại học

Wiley

Chuyên ngành

Kỹ Thuật Phần Mềm

Người đăng

Ẩn danh

Thể loại

sách

2007

560
3
0

Phí lưu trữ

135 Point

Mục lục chi tiết

1. Introduction

1.1. What is Software Engineering?

1.2. Phases in the Development of Software

1.3. Maintenance or Evolution

1.4. From the Trenches

1.5. The London Ambulance Service

1.6. Who Counts the Votes?

1.7. Software Engineering Ethics

2. Introduction to Software Engineering Management

2.1. Planning a Software Development Project

2.2. Controlling a Software Development Project

3. The Software Life Cycle Revisited

3.1. The Waterfall Model

3.2. Rapid Application Development and DSDM

3.3. The Rational Unified Process (RUP)

3.4. Intermezzo: Maintenance or Evolution

3.5. Software Product Lines

4. Configuration Management

4.1. Tasks and Responsibilities

4.2. Configuration Management Plan

5. People Management and Team Organization

5.1. Chief Programmer Team

5.2. Open Source Software Development

5.3. General Principles for Organizing a Team

6. On Managing Software Quality

6.1. On Measures and Numbers

6.2. A Taxonomy of Quality Attributes

6.3. Perspectives on Quality

6.4. The Quality System

6.5. Software Quality Assurance

6.6. The Capability Maturity Model (CMM)

6.7. Some Critical Notes

7. Cost Estimation

7.1. Function Point Analysis

7.2. COCOMO 2: Variations on a Theme

7.3. Guidelines for Estimating Cost

7.4. Distribution of Manpower over Time

8. Project Planning and Control

8.1. A Systems View of Project Control

8.2. A Taxonomy of Software Development Projects

8.3. Techniques for Project Planning and Control

9. Requirements Engineering

9.1. Requirements Engineering Paradigms

9.2. Requirements Elicitation Techniques

9.3. Goals and Viewpoints

9.4. Requirements Documentation and Management

9.5. Requirements Specification Techniques

9.6. Specifying Non-Functional Requirements

9.7. Verification and Validation

10. Modeling

10.1. Classic Modeling Techniques

10.2. Entity--Relationship Modeling

10.3. Finite State Machines

10.4. Data Flow Diagrams (DFD)

10.5. On Objects and Related Stuff

10.6. The Unified Modeling Language

10.7. The Class Diagram

10.8. The State Machine Diagram

10.9. The Sequence Diagram

10.10. The Communication Diagram

10.11. The Component Diagram

10.12. The Use Case

11. Software Architecture

11.1. Software Architecture and the Software Life Cycle

11.2. Architecture as a set of design decisions

11.3. Software Architecture Assessment

12. Software Design

12.1. Object-Oriented Metrics

12.2. Classical Design Methods

12.3. Data Flow Design (SA/SD)

12.4. Design based on Data Structures

12.5. Object-Oriented Analysis and Design Methods

12.6. The Booch Method

12.7. How to Select a Design Method

12.8. Object Orientation: Hype or the Answer?

12.9. Verification and Validation

13. Software Testing

13.1. Test Adequacy Criteria

13.2. Fault Detection Versus Confidence Building

13.3. From Fault Detection to Fault Prevention

13.4. Testing and the Software Life Cycle

13.5. Test-Driven Development (TDD)

13.6. Verification and Validation Planning and Documentation

13.7. Manual Test Techniques

13.8. Walkthroughs and Inspections

13.9. Coverage-Based Test Techniques

13.10. Control-Flow Coverage

13.11. Coverage-Based Testing of Requirements Specifications

13.12. Fault-Based Test Techniques

13.13. Error-Based Test Techniques

13.14. Comparison of Test Techniques

13.15. Comparison of Test Adequacy Criteria

13.16. Properties of Test Adequacy Criteria

13.17. Different Test Stages

13.18. Estimating Software Reliability

14. Software Maintenance

14.1. Maintenance Categories Revisited

14.2. Major Causes of Maintenance Problems

14.3. Reverse Engineering and Refactoring

14.4. Software Evolution Revisited

14.5. Organizational and Managerial Issues

14.6. Organization of Maintenance Activities

14.7. Software Maintenance from a Service Perspective

14.8. Control of Maintenance Tasks

15. Software Tools

15.1. Language-Centered Environments

15.2. Integrated Environments and Workbenches

15.3. Integrated Project Support Environments

15.4. Process-Centered Environments

Bibliography

Tóm tắt

I. Tổng Quan Về Nguyên Tắc Kỹ Thuật Phần Mềm Hướng Dẫn Chi Tiết

Nguyên tắc kỹ thuật phần mềm là một lĩnh vực quan trọng trong phát triển phần mềm, giúp đảm bảo rằng các hệ thống phần mềm được xây dựng một cách hiệu quả và đáng tin cậy. Ngành này không chỉ bao gồm các phương pháp kỹ thuật mà còn cả các khía cạnh quản lý và tâm lý. Việc hiểu rõ về các nguyên tắc này là cần thiết để giải quyết các thách thức trong phát triển phần mềm hiện đại.

1.1. Nguyên Tắc Cơ Bản Trong Kỹ Thuật Phần Mềm

Nguyên tắc cơ bản trong kỹ thuật phần mềm bao gồm việc áp dụng các phương pháp có hệ thống và có thể đo lường được trong phát triển, vận hành và bảo trì phần mềm. Điều này giúp đảm bảo rằng phần mềm không chỉ hoạt động hiệu quả mà còn đáp ứng được các yêu cầu của người dùng.

1.2. Tầm Quan Trọng Của Kỹ Thuật Phần Mềm Trong Thế Giới Hiện Đại

Kỹ thuật phần mềm đóng vai trò quan trọng trong việc phát triển các ứng dụng phức tạp, từ ngân hàng điện tử đến hệ thống tự động hóa. Sự phát triển nhanh chóng của công nghệ yêu cầu các phương pháp và công cụ mới để quản lý sự phức tạp trong phát triển phần mềm.

II. Các Thách Thức Trong Nguyên Tắc Phát Triển Phần Mềm Giải Quyết Vấn Đề

Trong quá trình phát triển phần mềm, nhiều thách thức xuất hiện, từ việc quản lý yêu cầu đến kiểm thử và bảo trì. Những thách thức này có thể dẫn đến việc phần mềm không đáp ứng được kỳ vọng của người dùng hoặc phát sinh lỗi nghiêm trọng. Việc nhận diện và giải quyết những vấn đề này là rất quan trọng.

2.1. Vấn Đề Quản Lý Yêu Cầu Trong Phát Triển Phần Mềm

Quản lý yêu cầu là một trong những thách thức lớn nhất trong phát triển phần mềm. Việc không xác định rõ ràng yêu cầu có thể dẫn đến việc phát triển sai hướng và tốn kém thời gian và chi phí.

2.2. Thách Thức Trong Kiểm Thử Phần Mềm

Kiểm thử phần mềm là một bước quan trọng để đảm bảo chất lượng sản phẩm. Tuy nhiên, việc phát hiện và sửa lỗi trong giai đoạn kiểm thử có thể gặp nhiều khó khăn, đặc biệt là với các hệ thống phức tạp.

III. Phương Pháp Phát Triển Phần Mềm Hiệu Quả Hướng Dẫn Chi Tiết

Để phát triển phần mềm hiệu quả, cần áp dụng các phương pháp phù hợp. Các phương pháp này không chỉ giúp tối ưu hóa quy trình phát triển mà còn đảm bảo rằng sản phẩm cuối cùng đáp ứng được nhu cầu của người dùng.

3.1. Mô Hình Phát Triển Phần Mềm Waterfall

Mô hình Waterfall là một trong những phương pháp phát triển phần mềm truyền thống, nơi các giai đoạn phát triển được thực hiện tuần tự. Mô hình này giúp dễ dàng theo dõi tiến độ nhưng có thể gặp khó khăn trong việc thay đổi yêu cầu.

3.2. Agile Phương Pháp Phát Triển Linh Hoạt

Phương pháp Agile tập trung vào việc phát triển phần mềm theo từng giai đoạn ngắn, cho phép điều chỉnh nhanh chóng theo phản hồi của người dùng. Điều này giúp tăng cường sự linh hoạt và khả năng thích ứng của dự án.

IV. Ứng Dụng Thực Tiễn Của Nguyên Tắc Kỹ Thuật Phần Mềm Kết Quả Nghiên Cứu

Các nguyên tắc kỹ thuật phần mềm đã được áp dụng rộng rãi trong nhiều lĩnh vực, từ ngân hàng đến y tế. Những ứng dụng này không chỉ giúp cải thiện hiệu suất mà còn nâng cao độ tin cậy của hệ thống.

4.1. Ứng Dụng Trong Ngành Ngân Hàng

Trong ngành ngân hàng, việc áp dụng các nguyên tắc kỹ thuật phần mềm giúp cải thiện quy trình giao dịch và bảo mật thông tin. Các hệ thống ngân hàng hiện đại yêu cầu độ tin cậy cao và khả năng xử lý giao dịch nhanh chóng.

4.2. Ứng Dụng Trong Ngành Y Tế

Ngành y tế cũng đã áp dụng các nguyên tắc kỹ thuật phần mềm để phát triển các hệ thống quản lý bệnh nhân và hồ sơ y tế điện tử. Điều này giúp cải thiện chất lượng dịch vụ và giảm thiểu sai sót trong quá trình điều trị.

V. Kết Luận Về Nguyên Tắc Kỹ Thuật Phần Mềm Tương Lai Của Ngành

Nguyên tắc kỹ thuật phần mềm sẽ tiếp tục phát triển và thích ứng với những thay đổi trong công nghệ và nhu cầu của người dùng. Việc áp dụng các phương pháp mới và cải tiến quy trình phát triển sẽ là chìa khóa để đạt được thành công trong tương lai.

5.1. Xu Hướng Tương Lai Trong Kỹ Thuật Phần Mềm

Các xu hướng như trí tuệ nhân tạo và học máy đang dần trở thành một phần quan trọng trong phát triển phần mềm. Những công nghệ này hứa hẹn sẽ mang lại những cải tiến đáng kể trong quy trình phát triển và chất lượng sản phẩm.

5.2. Tầm Quan Trọng Của Đổi Mới Trong Ngành

Đổi mới là yếu tố then chốt để ngành kỹ thuật phần mềm phát triển bền vững. Việc áp dụng các công nghệ mới và cải tiến quy trình sẽ giúp nâng cao hiệu quả và đáp ứng tốt hơn nhu cầu của thị trường.

25/07/2025

Trích đoạn nội dung tài liệu

Software Engineering: Principles and Practice Hans van Vliet (c) Wiley, 2007 Contents 1 Introduction 1 Chapter 1 Introduction 1 1.1 What is Software Engineering? .2 Phases in the Development of Software .3 Maintenance or Evolution .4 From the Trenches .3 The London Ambulance Service .4 Who Counts the Votes? .5 Software Engineering Ethics. 30 I Software Management 33 2 Introduction to Software Engineering Management 34 Chapter 2 Introduction to Software Engineering Management 34 2.1 Planning a Software Development Project .2 Controlling a Software Development Project. 43 3 The Software Life Cycle Revisited 45 Chapter 3 The Software Life Cycle Revisited 45 3.1 The Waterfall Model .3 Rapid Application Development and DSDM .3 The Rational Unified Process (RUP) .4 Intermezzo: Maintenance or Evolution .5 Software Product Lines. 76 4 Configuration Management 78 Chapter 4 Configuration Management 78 4.1 Tasks and Responsibilities .2 Configuration Management Plan.

88 5 People Management and Team Organization 89 Chapter 5 People Management and Team Organization 89 5.3 Chief Programmer Team .6 Open Source Software Development .7 General Principles for Organizing a Team. 105 6 On Managing Software Quality 107 Chapter 6 On Managing Software Quality 107 6.1 On Measures and Numbers .2 A Taxonomy of Quality Attributes .3 Perspectives on Quality .4 The Quality System .5 Software Quality Assurance .6 The Capability Maturity Model (CMM) .7 Some Critical Notes. 141 7 Cost Estimation 144 Chapter 7 Cost Estimation 144 7.4 Function Point Analysis .5 COCOMO 2: Variations on a Theme .2 Guidelines for Estimating Cost .3 Distribution of Manpower over Time. 174 8 Project Planning and Control 176 Chapter 8 Project Planning and Control 176 8.1 A Systems View of Project Control .2 A Taxonomy of Software Development Projects .4 Techniques for Project Planning and Control.

195 II The Software Life Cycle 197 9 Requirements Engineering 199 Chapter 9 Requirements Engineering 199 9.1 Requirements Engineering Paradigms .2 Requirements Elicitation Techniques .3 Goals and Viewpoints .2 Requirements Documentation and Management .3 Requirements Specification Techniques .1 Specifying Non-Functional Requirements .4 Verification and Validation. 243 10 Modeling 246 Chapter 10Modeling 246 10.1 Classic Modeling Techniques .1 Entity--Relationship Modeling .2 Finite State Machines .3 Data Flow Diagrams (DFD) .2 On Objects and Related Stuff .3 The Unified Modeling Language .1 The Class Diagram .2 The State Machine Diagram .3 The Sequence Diagram .4 The Communication Diagram .5 The Component Diagram .6 The Use Case. 274 11 Software Architecture 276 Chapter 11Software Architecture 276 11.1 Software Architecture and the Software Life Cycle .1 Architecture as a set of design decisions .5 Software Architecture Assessment. 311 12 Software Design 313 Chapter 12Software Design 313 12.6 Object-Oriented Metrics .2 Classical Design Methods .2 Data Flow Design (SA/SD) .3 Design based on Data Structures .3 Object-Oriented Analysis and Design Methods .1 The Booch Method .4 How to Select a Design Method .1 Object Orientation: Hype or the Answer? .7 Verification and Validation.

389 13 Software Testing 394 Chapter 13Software Testing 394 13.1 Test Adequacy Criteria .2 Fault Detection Versus Confidence Building .3 From Fault Detection to Fault Prevention .2 Testing and the Software Life Cycle .5 Test-Driven Development (TDD) .3 Verification and Validation Planning and Documentation .4 Manual Test Techniques .2 Walkthroughs and Inspections .5 Coverage-Based Test Techniques .1 Control-Flow Coverage .3 Coverage-Based Testing of Requirements Specifications .6 Fault-Based Test Techniques .7 Error-Based Test Techniques .8 Comparison of Test Techniques .1 Comparison of Test Adequacy Criteria .2 Properties of Test Adequacy Criteria .9 Different Test Stages .10Estimating Software Reliability. 449 14 Software Maintenance 453 Chapter 14Software Maintenance 453 14.1 Maintenance Categories Revisited .2 Major Causes of Maintenance Problems .3 Reverse Engineering and Refactoring .4 Software Evolution Revisited .5 Organizational and Managerial Issues .1 Organization of Maintenance Activities .2 Software Maintenance from a Service Perspective .3 Control of Maintenance Tasks. 492 15 Software Tools 494 Chapter 15Software Tools 494 15.2 Language-Centered Environments .3 Integrated Environments and Workbenches .4 Integrated Project Support Environments .4 Process-Centered Environments. 512 Bibliography 514 1 Introduction LEARNING OBJECTIVES  To understand the notion of software engineering and why it is important  To appreciate the technical (engineering), managerial, and psychological aspects of software engineering  To understand the similarities and differences between software engineering and other engineering disciplines  To know the major phases in a software development project  To appreciate ethical dimensions in software engineering  To be aware of the time frame and extent to which new developments impact software engineering practice 2 INTRODUCTION Software engineering concerns methods and techniques to develop large software systems.

The engineering metaphor is used to emphasize a systematic approach to develop systems that satisfy organizational requirements and constraints. This chapter gives a brief overview of the field and points at emerging trends that influence the way software is developed. Computer science is still a young field. The first computers were built in the mid 1940s, since when the field has developed tremendously.

Applications from the early years of computerization can be characterized as follows: the programs were quite small, certainly when compared to those that are currently being constructed; they were written by one person; they were written and used by experts in the application area concerned. The problems to be solved were mostly of a technical nature, and the emphasis was on expressing known algorithms efficiently in some programming language. Input typically consisted of numerical data, read from such media as punched tape or punched cards. The output, also numeric, was printed on paper.

Programs were run off-line. If the program contained errors, the programmer studied an octal or hexadecimal dump of memory. Sometimes, the execution of the program would be followed by binary reading machine registers at the console. Independent software development companies hardly existed in those days.

Software was mostly developed by hardware vendors and given away for free. These vendors sometimes set up user groups to discuss requirements, and next incorporated them into their software. This software development support was seen as a service to their customers. Present-day applications are rather different in many respects.

Present-day pro- grams are often very large and are being developed by teams that collaborate over periods spanning several years. These teams may be scattered across the globe. The programmers are not the future users of the system they develop and they have no expert knowledge of the application area in question. The problems that are being tackled increasingly concern everyday life: automatic bank tellers, airline reservation, salary administration, electronic commerce, automotive systems, etc.

Putting a man on the moon was not conceivable without computers. In the 1960s, people started to realize that programming techniques had lagged behind the developments in software both in size and complexity. To many people, programming was still an art and had never become a craft. An additional problem was that many programmers had not been formally educated in the field.

They had learned by doing. On the organizational side, attempted solutions to problems often involved adding more and more programmers to the project, the so-called ‘million-monkey’ approach. As a result, software was often delivered too late, programs did not behave as the user expected, programs were rarely adaptable to changed circumstances, and many errors were detected only after the software had been delivered to the customer. This 3 became known as the ‘software crisis’.

This type of problem really became manifest in the 1960s. Under the auspices of NATO, two conferences were devoted to the topic in 1968 and 1969 (Naur and Randell, 1968), (Buxton and Randell, 1969). Here, the term ‘software engineering’ was coined in a somewhat provocative sense. Shouldn’t it be possible to build software in the way one builds bridges and houses, starting from a theoretical basis and using sound and proven design and construction techniques, as in other engineering fields? Software serves some organizational purpose.

The reasons for embarking on a software development project vary. Sometimes, a solution to a problem is not feasible without the aid of computers, such as weather forecasting, or automated bank telling. Sometimes, software can be used as a vehicle for new technologies, such as typesetting, the production of chips, or manned space trips. In yet other cases software may increase user service (library automation, e-commerce) or simply save money (automated stock control).

In many cases, the expected economic gain will be a major driving force. It may not, however, always be easy to prove that automation saves money (just think of office automation) because apart from direct cost savings, the economic gain may also manifest itself in such things as a more flexible production or a faster or better user service. In either case, it is a value-creating activity. Boehm (1981) estimated the total expenditure on software in the US to be $40 billion in 1980.

This is approximately 2% of the GNP. In 1985, the total expenditure had risen to $70 billion in the US and $140 billion worldwide. Boehm and Sullivan (1999) estimated the annual expenditure on software development in 1998 to be $300-400 billion in the US, and twice that amount worlwide. So the cost of software is of crucial importance.

This concerns not only the cost of developing the software, but also the cost of keeping the software operational once it has been delivered to the customer. In the course of time, hardware costs have decreased dramatically. Hardware costs now typically comprise less than 20% of total expenditure (figure 1. The remaining 80% comprise all non-hardware costs: the cost of programmers, analysts, management, user training, secretarial help, etc.

An aspect closely linked with cost is productivity. In the 1980s, the quest for data processing personnel increased by 12% per year, while the population of people working in data processing and the productivity of those people each grew by approximately 4% per year (Boehm, 1987a). This situation has not fundamentally changed (Jones, 1999). The net effect is a growing gap between demand and supply.

The result is both a backlog with respect to the maintenance of existing software and a slowing down in the development of new applications. The combined effect may have repercussions on the competitive edge of an organization, especially so when there are severe time-to-market constraints. These developments have led to a shift from producing software to using software. We’ll come back to this topic in section 1.

The issues of cost and productivity of software development deserve our serious attention. However, this is not the complete story. Society is increasingly dependent 4 INTRODUCTION Figure 1.1 Relative distribution of hardware/software costs. Boehm, Software Engineering, IEEE Transactions on Computers, 1976 IEEE.

The quality of the systems we develop increasingly determines the quality of our existence. Consider as an example the following message from a Dutch newspaper on June 6, 1980, under the heading ‘Americans saw the Russians coming’: For a short period last Tuesday the United States brought their atomic bombers and nuclear missiles to an increased state of alarm when, because of a computer error, a false alarm indicated that the Soviet Union had started a missile attack. Efforts to repair the error were apparently in vain, for on June 9, 1980, the same newspaper reported: For the second time within a few days, a deranged computer reported that the Soviet Union had started a nuclear attack against the United States. Last Saturday, the DoD affirmed the false message, which resulted in the engines of the planes of the strategic air force being started.

It is not always the world that is in danger. On a smaller scale, errors in software may have very unfortunate consequences, such as transaction errors in bank traffic; reminders to finally pay that bill of $0.00; a stock control system that issues orders too late and thus lays off complete divisions of a factory. WHAT IS SOFTWARE ENGINEERING? 5 The latter example indicates that errors in a software system may have serious financial consequences for the organization using it.

Nội dung được bảo vệ bản quyền — Tải xuống đầy đủ