Nhập môn Công nghệ phần mềm - Trần Đình Quế

MỤC LỤC

MỤC LỤC . 3

CHƯƠNG 1: MỞ ĐẦU . 7

1.2 CÁC KIỂU PHẦN MỀM . 7

1.3 KHÍA CẠNH LỊCH SỬ . 7

1.4 KHÍA CẠNH KINH TẾ . 8

1.5 KHÍA CẠNH BẢO TRÌ . 8

1.6 KHÍA CẠNH PHÂN TÍCH VÀ THIẾT KẾ . 9

1.7 KHÍA CẠNH LẬP TRÌNH NHÓM . 10

1.8 PHƯƠNG PHÁP HƯỚNG ĐỐI TƯỢNG . 10

CHƯƠNG 2: CÁC PHA PHÁT TRIỂN PHẦN MỀM . 13

2.1 TIẾN TRÌNH THÀNH PHẦN . 13

2.2 SQA LÀ GÌ? . 14

2.3 PHA YÊU CẦU . 14

2.4 PHA ĐẶC TẢ . 14

2.5 PHA THIẾT KẾ . 15

2.6 PHA CÀI ĐẶT . 16

2.7 TÍCH HỢP . 16

2.8 CẢI TIẾN TIẾN TRÌNH PHẦN MỀM . 16

CHƯƠNG 3 . 21

CÁC MÔ HÌNH VÒNG ĐỜI PHẦN MỀM . 21

3.1 PHÁT TRIỂN PHẦN MỀM . 21

3.1.1 Theo lý thuyết phát triển phần mềm: . 21

3.1.2 Thực tế phát triển phần mềm . 21

3.1.3 Bài toán Winburg Mini . 21

3.2 MÔ HÌNH XÂY SỬA . 22

3.3 MÔ HÌNH TIẾN HÓA . 22

3.4 MÔ HÌNH BẢN MẪU NHANH . 23

3.5. MÔ HÌNH LẶP VÀ TĂNG . 24

3.6 MÔ HÌNH UP . 28

3.7 MÔ HÌNH XOẮN ỐC . 33

3.8 MÔ HÌNH MÃ NGUỒN MỞ . 34

CHƯƠNG 4: KIỂM THỬ . 37

4.1 VẤN ĐỀ CHẤT LƯỢNG PHẦN MỀM . 37

4.1.1 Đảm bảo chất lượng phần mềm (SQA) . 37

4.1.2. Độc lập trong quản lý . 37

4.2 KIỂM CHỨNG PHẦN MỀM . 38

4.3 CÁC PHƯƠNG PHÁP KIỂM CHỨNG . 38

4.3.1. Kiểm thử không có sự thực thi . 38

4.3.2 Kiểm thử có dựa trên sự thực thi . 42

4.4 NHỮNG VẤN ĐỀ TRONG KIỂM THỬ . 42

4.4.1 Cái gì nên được kiểm thử? . 42

4.4.2 Kiểm thử và sự kiểm chứng tính chính xác . 44

4.4.3 Sự kiểm chứng tính chính xác và kỹ nghệ phần mềm . 45

4.4.4 Ai thực hiện kiểm thử phần mềm . 46

4.4.5 Khi nào kiểm thử dừng . 46

CHƯƠNG 5: LẬP KẾ HOẠCH VÀ ƯỚC LƯỢNG . 48

5.1 VẤN ĐỀ LẬP KẾ HOẠCH VÀ ƯỚC LƯỢNG DỰ ÁN PHẦN MỀM . 48

5.2 ƯỚC LƯỢNG THỜI GIAN VÀ CHI PHÍ . 49

5.2.1 Thước đo kích cỡ của sản phẩm phần mềm . 49

5.2.2 Các kỹ thuật ước lượng chi phí . 52

5.2.3 COCOMO trung gian . 53

5.2.4 COCOMO II . 55

5.2.5 Theo dõi ước lượng thời gian và chi phí . 55

5.3 CÁC THÀNH PHẦN CỦA VIỆC LẬP KẾ HOẠCH PHÁT TRIỂN PHẦN MỀM . 57

5.3.1Khung kế hoạch quản lý dự án phần mềm(SPMP) . 57

5.3.2 Kế hoạch quản lý dự án phần mềm IEEE . 57

5.3.3 Việc lập kế hoạch kiểm thử . 58

5.3.4 Yêu cầu đào tạo . 58

5.3.5 Các chuẩn tài liệu . 58

5.3.6 Công cụ CASE cho việc lập kế hoạch và ước lượng . 59

5.4 KIỂM THỬ VIỆC LẬP KẾ HOẠCH . 59

5.5 LẬP KẾ HOẠCH CHO CÁC DỰ ÁN PHẦN MỀM HƯỚNG ĐỐI TƯỢNG . 59

CHƯƠNG 6: PHA XÁC ĐỊNH YÊU CẦU . 60

6.1 XÁC ĐỊNH YÊU CẦU CỦA KHÁCH HÀNG . 60

6.2 TỔNG QUAN VỀ LUỒNG CÔNG VIỆC XÁC ĐỊNH YÊU CẦU . 60

6.2.1 Hiểu lĩnh vực ứng dụng . 61

6.2.2 Mô hình nghiệp vụ . 61

6.2.3 Các use case . 63

6.2.4 Các yêu cầu ban đầu . 65

6.3 PHA XÁC ĐỊNH YÊU CẦU CỔ ĐIỂN . 65

6.4 BẢN MẪU NHANH . 66

6.5 NHÂN TỐ CON NGƯỜI . 66

6.6 SỬ DỤNG LẠI BẢN MẪU NHANH . 67

6.7 CÁC CÔNG CỤ CASE CHO XÁC ĐỊNH YÊU CẦU . 67

6.8 CÁC THƯỚC ĐO CHO XÁC ĐỊNH YÊU CẦU . 68

6.9 NHỮNG THỬ THÁCH CHO PHA XÁC ĐỊNH YÊU CẦU . 68

6.10 CASE STUDY CHO PHA XÁC ĐỊNH YÊU CẦU . 68

6.10.1 Bài toán . 68

6.10.2 Xây dựng sơ đồ use case tổng quan. 70

6.10.3 Mô tả các use case . 71

CHƯƠNG 7: CÁC PHƯƠNG PHÁP PHÂN TÍCH TRUYỀN THỐNG. 75

7.1 YÊU CẦU TÀI LIỆU ĐẶC TẢ . 75

7.2 CÁC PHƯƠNG PHÁP ĐẶC TẢ . 76

7.2.1 Đặc tả phi hình thức . 76

7.2.2 Phân tích hướng cấu trúc . 77

CHƯƠNG 8: PHƯƠNG PHÁP PHÂN TÍCH HƯỚNG ĐỐI TƯỢNG . 79

8.1 LUỒNG CÔNG VIỆC PHÂN TÍCH . 79

8.2 VIỆC TRÍCH RÚT CÁC LỚP THỰC THỂ . 79

8.3 PHÂN TÍCH HƯỚNG ĐỐI TƯỢNG CHO BÀI TOÁN THANG MÁY . 80

8.4 MÔ HÌNH HÓA CHỨC NĂNG . 80

8.5 MÔ HÌNH HÓA LỚP THỰC THỂ . 82

8.5.1 Trích rút danh từ . 82

8.5.2 CRC Cards . 84

8.7 KIỂM THỬ TRONG PHÂN TÍCH HƯỚNG ĐỐI TƯỢNG. 86

8.8 CÁC CÔNG CỤ CASE CHO PHÂN TÍCH HƯỚNG ĐỐI TƯỢNG . 90

8.9 CASE STUDY CHO PHA PHÂN TÍCH HƯỚNG ĐỐI TƯỢNG . 90

8.9.1. Các scenario . 90

8.9.2 Trích các lớp thực thể . 94

8.9.3 Viết lại các scenario . 96

CHƯƠNG 9: PHA THIẾT KẾ . 97

9.1 TỔNG QUAN VỀ PHA THIẾT KẾ . 97

9.1.1 Dữ liệu và các hành động . 97

9.1.2 Thiết kế và trừu tượng . 97

9.1.3 Thiết kế . 98

9.1.4 Kiểm thử trong pha thiết kế . 99

9.1.5 Kỹ thuật hình thức cho thiết kế chi tiết . 100

9.1.6 Kỹ thuật thiết kế hệ thống thời gian thực . 100

9.1.7 Công cụ CASE cho thiết kế . 101

9.1.8 Thước đo cho thiết kế . 101

9.1.9 Những thách thức của pha thiết kế . 102

9.2 THIẾT KẾ HƯỚNG HÀNH ĐỘNG . 102

9.3 PHÂN TÍCH VA THIẾT KẾ DÒNG DỮ LIỆU . 103

9.3.1 Phân tích dòng dữ liệu . 103

9.3.2 Thiết kế dòng dữ liệu . 108

9.4 THIẾT KẾ HƯỚNG ĐỐI TƯỢNG . 108

9.5 CASE STUDY CHO PHA THIẾT KẾ . 111

9.5.1 Thiết kế cơ sở dữ liệu . 112

9.5.2 Thiết kế dùng bean thay cho control . 114

9.5.3 Thiết kế dùng control DAO và thực thể thuần . 122

9.5.4 Thiết kế theo MVC cải tiến, dùng control DAO và thực thể thuần . 129

CHƯƠNG 10: PHA CÀI ĐẶT VÀ TÍCH HỢP . 136

10.1 CÁC PHƯƠNG PHÁP CÀI ĐẶT VÀ TÍCH HỢP . 136

10.1.1 Luồng công việc cài đặt . 136

10.1.2 Tích hợp . 145

10.2 KIỂM THỬ PHA CÀI ĐẶT VÀ TÍCH HỢP . 149

10.2.1 Luồng công việc kiểm thử cài đặt . 149

10.2.2 Kiểm thử tích hợp . 162

10.4 KIỂM THỬ CHẤP NHẬN . 163

10.5 CASE STUDY CHO PHA CÀI ĐẶT: VIẾT TEST CASE . 163

10.5.1 Test case cho modul thêm phòng mới của khách sạn. 163

10.5.2 Test case cho modul sửa thông tin phòng của khách sạn . 166

10.5.3 Test case cho modul đặt phòng . 168

CHƯƠNG 11: PHA BẢO TRÌ . 177

11.1 PHA BẢO TRÌ SAU KHI CHUYỂN GIAO . 177

11.1.1 Tại sao bảo trì sau khi chuyển giao là cần thiết . 177

11.1.2 Người lập trình bảo trì sau khi chuyển giao yêu cầu những gì? . 177

11.1.3 Quản lý bảo trì sau khi chuyển giao . 179

11.1.4 Bảo trì sau khi chuyển giao với kỹ năng phát triển . 181

11.1.5 Kỹ nghệ ngược . 181

11.1.6 Công cụ CASE cho bảo trì sau khi chuyển giao. 182

10.1.7 Thước đo của bảo trì sau khi chuyển giao . 182

10.1.8 Những thách thức của bảo trì sau khi chuyển giao . 182

11.2 BẢO TRÌ HỆ PHẦN MỀM HƯỚNG ĐỐI TƯỢNG. 183

pdf185 trang | Chuyên mục: Công Nghệ Phần Mềm | Chia sẻ: dkS00TYs | Lượt xem: 3528 | Lượt tải: 5download
Tóm tắt nội dung Nhập môn Công nghệ phần mềm - Trần Đình Quế, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
huyển giao là một khía cạnh thử thách nhất của phần mềm và bạc 
bẽo nhất 
 Những người quản lý phải chỉ định công việc bảo trì cho những người lập trình giỏi nhất 
và 
 Trả lương cho họ phù hợp 
11.1.3 Quản lý bảo trì sau khi chuyển giao 
 Các vấn đề khác nhau về mặt quản lý bảo trì sau khi chuyển giao cần được xem xét 
 Trước tiên, người lập trình bảo trì nên xem xét tệp bản ghi khuyết điểm 
 Nó bao gồm 
o Tất cả các lỗi đã được ghi lại mà chưa sửa và 
o Những đề nghị về các công việc sẽ thực thiện về những khuyết điểm đó 
 Trong một thế giới lý tưởng 
o Sửa tất cả mọi lỗi ngay lập tức 
o Sau đó chúng ta công bố phiên bản phần mềm mới ở mọi vị trí 
 Trong thế giới thực 
o Phân bố các bản ghi lỗi ở tất cả các vị trí 
o Không có nhân viên để bảo trì ngay lập tức 
o Thực hiện nhiều thay đổi ở cùng một lúc sẽ rẻ hơn, đặc biệt nếu có nhiều vị trí cài 
đặt 
a- Các bản ghi khuyết điểm 
 Cần một cơ chế đối với việc thay đội sản phẩm phần mềm 
 Nếu sản phẩm phần mềm xuất hiện một chức năng không đúng, thì người dùng đưa ra 
một bản ghi khuyết điểm 
o Bản ghi đó phải đủ thông tin để cho phép người lập trình bảo trì tái tạo lại vấn đề 
 Theo lý tưởng, mỗi khuyết điểm nên được cố định ngay lập tức 
o Trong thực tế, tốt nhất chúng ta có thể làm là nghiên cứu sơ bộ ngay lập tức 
 Nếu khuyết điểm đã được ghi lại trước đó: Đưa thông tin trong tệp bản ghi khuyết điểm 
tới người dùng 
 Nếu nó là một khuyết điểm mới: 
o Người lập trình bảo trì nên cố gắng tìm 
 Nguyên nhân, 
 Cách để sửa khuyết điểm đó, và 
 Cách làm việc xung quanh vấn đề đó 
o Khuyết điểm mới được ghi lại vào tệp tường trình phát hiện lỗi, cùng với tài liệu 
 Dánh sách (Listings) 
 Thiết kế (Designs) 
 Sổ tay (Manuals) 
P
T
I
T
Chương 11: Pha bảo trì 
180 
o Tệp bản ghi khuyết điểm cũng nên chứa những yêu cầu cảu khách hàng để bảo trì 
thích hợp và hoàn thiện chức năng 
 Nội dung của tệp phải được định độ ưu tiên bởi khách hàng 
 Những chỉnh sửa tiếp theo là một trong những nội dung có độ ưu tiên cao 
nhất trong tệp 
o Các bản sao của bản ghi khuyết điểm phải lưu hành tới tất cả 
 Bao gồm: ước lượng khi nào khuyết điểm được sửa 
o Nếu cùng thất bại xảy ra ở một vị trí khác, người dùng có thể xác định 
 Khả năng làm việc xung quanh khuyết điểm 
 Thời gian mà khuyết điểm được sửa 
b- Cho phép thay đổi phần mềm 
 Bảo trì sửa lỗi 
o Chỉ định một người lập trình bảo trì xác định lỗi và nguyên nhân của lỗi, sau đó 
sửa lỗi đó 
o Kiểm thử sửa chữa, kiểm thử toàn bộ phẩn mềm (kiểm thử hồi quy) 
o Cập nhật tài liệu để phản ánh những thay đổi đã thực hiện 
o Cập nhật những lời giải thích ban đầu để phản ánh 
 Những gì đã thay đổi, 
 Tại sao nó được thay đổi, 
 Ai thực hiện thay đổi, và 
 Khi nào 
 Bảo trì thích hợp và hoàn thiện 
o Giống với bảo trì sửa lỗi, ngoại trừ không có bản ghi khuyết điểm 
o Thay vì có thay đổi trong yêu cầu 
 Điều gì sẽ xảy ra nếu người lập trình không kiểm thử những lỗi đã được sửa một cách 
thích đáng? 
o Trước khi phần mềm được phân phối, thì phần mềm phải được kiểm thử bởi nhóm 
SQA 
 Bảo trì sau khi chuyển giao là cực kỳ khó 
 Kiểm thử là khó và tiêu tốn thời gian 
o Được thực hiện bởi nhóm SQA 
 Kỹ thuật phiên bản cơ sở và các bản sao riêng phải được sử dụng 
 Người lập trình thực hiện các thay đổi đối với các bản sao chép riêng của các mô đun mã 
và kiểm thử chúng 
 Người lập trình đóng băng phiên bản trước đó, và đưa ra phiên bản chỉnh sửa cho nhóm 
SQA để kiểm thử 
 SQA thực hiện kiểm thử trên phiên bản cơ sở của tất cả các mô đun mã 
c- Bảo đảm việc bảo trì 
 Bảo trì không là sự cố gắng một lần (Maintenance is not a one-time effort) 
 Phải lập kế hoạch cho bảo trì xuyên suốt toàn bộ vòng đời phần mềm 
o Luồng công việc thiết kế - sử dụng kỹ thuật ẩn dấu thông tin 
o Luồng cài đặt – lựa chọn đặt tên có ý nghĩa để thuận tiện cho những người lập 
trình trong tương lai 
P
T
I
T
Chương 11: Pha bảo trì 
181 
o Tài liệu phẩi được hoàn thiện và chính xác và phản ánh đúng phiên bản hiện thời 
của mỗi mô đun mã 
 Trong suốt quá trình bảo trì sau khi chuyển giao, bảo trì không phải giàn 
o Luôn luôn biết rõ việc bảo trì trong tương lai là không thể tránh được 
d- Vấn đề của bảo trì lặp 
 Việc thay đổi những yêu cầu phần mềm gây nhiều khó khăn cho đội phát triển 
 Việc thay đổi thường xuyên thường gây bất lợi cho việc bảo trì phần mềm 
Thay đổi bài toán đích 
 The problem is exacerbated during postdelivery maintenance 
 Càng nhiều thay đổi 
o Thì sản phẩm phần mềm càng khác xa so với thiết kế ban đầu 
o Việc thay đổi trong tương lai càng trở nên khó hơn 
o Tài liệu trở nên kém tin cậy hơn bình thường 
o Các file kiểm thử hồi quy không được cập nhật 
o Viết lại toàn bộ có thể cần thiết đối với bảo trì trong tương lai 
 Giải pháp hiển nhiên 
o Đóng băng các đặc tả khi chúng được ký đến tận khi chuyển giao sản phẩm phần 
mềm 
o Sau mỗi yêu cầu của bảo trì hoàn thiện, đóng băng các đặc tả trong 3 tháng hoặc 1 
năm 
 Trong thực tế 
o Khách hàng có thể đưa ra những thay đổi ngay ngày hôm sau 
o Nếu bằng lòng với giá cả, thì khách hàng có thể đưa ra những thay đổi hàng ngày 
 “Ai trả tiền thì người ấy có tiền”(“He who pays the piper calls the tune”) 
11.1.4 Bảo trì sau khi chuyển giao với kỹ năng phát triển 
 Những kỹ năng cần thiết cho bảo trì gồm 
o Khả năng xác định nguyên nhân gây ra lỗi của một phần mềm lớn 
 Cũng cần thiết trong suốt quá trình tích hợp và kiểm thử sản phẩm 
o Khả năng thực hiện chức năng có hiệu quả mà không cần có tài liệu chính xác 
 Tài liệu hiếm khi được hoàn thiện đến tận khi chuyển giao 
o Kỹ năng phân tích, thiết kế, cài đặt và kiểm thử 
 Tất cả bốn hoạt động được thực thi trong suốt quá trình phát triển 
 Những kỹ năng cần thiết cho bảo trì sau khi chuyển giao giống với những kỹ năng của tất 
cả các luồng công việc khác 
 Điểm chính 
o Người lập trình bảo trì không phải chỉ có kỹ năng rộng ở mọi lĩnh vực mà những 
kỹ năng đó phải ở trình độ cao 
o Sự chuyên môn hóa không thể có ở những người lập trình bảo trì 
11.1.5 Kỹ nghệ ngược 
 Khi nào tài liệu duy nhất đối với bảo trì sau khi chuyển giao là mã nguồn thì 
o Bắt đầu với mã 
o Tái tạo lại thiết kế 
o Tái tạo lại các đặc tả (cực kỳ khó) 
o Công cụ CASE có thể trở giúp ((flowcharters, các mục đích trực quan khác) 
P
T
I
T
Chương 11: Pha bảo trì 
182 
 Kỹ nghệ lại 
o Kỹ nghệ ngược, được sinh ra bởi kỹ nghệ tiên tiến (Reverse engineering, followed 
by forward engineering) 
o Mức độ thấp hơn tới cao hơn tới thấp hơn của trừu tượng (Lower to higher to 
lower levels of abstraction) 
 Xây dựng lại 
o Việc cải thiện sản phẩm phần mềm mà không có thay đổi chức năng phần mềm 
o Ví dụ: 
 Cải thiện việc bảo trì 
 Xây dựng lại(XP, agile processes) 
 Điều gì sẽ xảy ra nếu chúng ta chỉ có mã thực thi? 
o Xem xét phần mềm như hộp đen 
o Suy luận những đặc tả từ hành vi của phần mềm hiện thời 
11.1.6 Công cụ CASE cho bảo trì sau khi chuyển giao 
 Công cụ điểu khiển cấu hình là cần thiết 
o Công cụ thương mại 
 CCC 
o Công cụ mã nguồn mở 
 cvs 
 Các công cụ kỹ nghệ lại 
o Các công cụ thương mại 
 IBM Rational Rose, Together 
o Các công cụ mã nguồn mở 
 Doxygen 
 Các công cụ theo dõi – phát hiện 
o Công cụ thương mại 
 IBM Rational ClearQuest 
o Công cụ mã nguồn mở 
 Bugzilla 
10.1.7 Thước đo của bảo trì sau khi chuyển giao 
 Về bản chất, các hoạt động của bảo trì sau khi chuyển giao là những hoạt động của quá 
trình phát triển 
o Các thước đo đối với luồng công việc phát triển 
 Các thước đo bản ghi khuyết điểm (Defect report metrics) 
o Sự phân loại khuyết điểm 
o Trạng thái khuyết điểm (Defect status) 
10.1.8 Những thách thức của bảo trì sau khi chuyển giao 
 Chương này miêu tả rất nhiều thách thức 
 Thách thức khó nhất cần giải quyết 
o Bảo trì khó hơn phát triển, nhưng 
o Những người phát triển có xu hướng nhìn xuống (tend to look down) những người 
bảo trì và 
o Thường xuyên được trả tiền lương nhiều hơn 
P
T
I
T
Chương 11: Pha bảo trì 
183 
11.2 BẢO TRÌ HỆ PHẦN MỀM HƯỚNG ĐỐI TƯỢNG 
 Bề ngoài, mô hình hướng đối tượng khuyến kích việc bảo trì theo bốn cách 
o Phần mềm bao gồm các đơn vị độc lập 
o Đóng gói (độc lập về mặt khái niệm) 
o Ẩn giấu thông tin (độc lập về mặt vật lý) 
o Truyền tham số là các giao tiếp duy nhất (Message-passing is the sole 
communication) 
 Thực thế hơi khác (The reality is somewhat different) 
 Ba cản trở 
Một là: Cây phân cấp kế thừa có thể lớn 
 Để hình dung ra những gì displayNode làm trong BalancedBinaryTreeClass, chúng 
ta phải kiểm tra tỉ mỉ cây hoàn thiện 
o Cây hoàn thiện có thể trải rộng toàn bộ phần mềm 
o Khác xa “những đơn vị độc lập ” (A far cry from “independent units” ) 
o Giải pháp 
o Công cụ CASE có thể dàn mỏng cây kế thừa (A CASE tool can flatten the 
inheritance tree) 
Hai là:Hậu quả của liên kết động và đa hình 
P
T
I
T
Chương 11: Pha bảo trì 
184 
 Hệ thống không hoạt động khi gọi myFile.open () 
 Phiên bản nào của open có chứa lỗi? 
o Công cụ CASE không thể trợ giúp (công cụ tĩnh) 
o Chúng ta phải theo dõi (kiểm tra) 
 Liên kết động và đa hình có thể có 
o Ảnh hưởng tích cực tới đội phát triển nhưng 
o Ảnh hưởng tiêu cực đối với bảo trì 
Ba là: Hậu quả của kế thừa 
 Tạo một lớp mới qua kế thừa 
 Lớp con mới 
o Không ảnh hưởng tới lớp cha, và 
o Không ảnh hưởng tới bất cứ lớp con 
o Chỉnh sửa lớp con mới này 
o Một lần nữa, không ảnh hưởng 
o Chỉnh sửa lớp cha 
o Tất cả các lớp con kế thừa đều bị ảnh hưởng 
o “Fragile base class problem” 
 Kế thừa có 
o Ảnh hưởng tích đối với người phát triển, nhưng 
o Ảnh hưởng tiêu cực đối với bảo trì 
11.3 KIỂM THỬ PHA BẢO TRÌ 
 Người bảo trì xem xét phần mềm như một tập các thành phần có liên quan lỏng lẻo 
o Chúng không liên quan đến sự phát triển phần mềm 
 Kiểm thử hồi quy là cần thiết 
o Lưu giữ các trường hợp kiểm thử và đầu ra của chúng, chỉnh sửa nếu cần thiết 
P
T
I
T

File đính kèm:

  • pdfNhập môn Công nghệ phần mềm - Trần Đình Quế.pdf