Chương 1
khoảng 7 phút đọc
<!doctype html>
<html lang="vi">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Các tính chất của phần mềm tốt</title>
<style>
* { box-sizing: border-box; }
body { margin: 0; color: #222; background: #f2f2f2; font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: 1.6; }
.report { width: min(850px, calc(100% - 32px)); margin: 30px auto; padding: 48px 58px; background: #fff; border-top: 7px solid #6d4aa2; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08); }
h1 { margin: 0 0 24px; color: #3f2c5f; font-size: 30px; text-align: center; }
.student-info { width: fit-content; margin: 0 auto 36px; }
.student-info p { margin: 2px 0; }
section { margin-top: 28px; }
h2 { margin: 0 0 8px; padding-bottom: 5px; color: #513879; border-bottom: 1px solid #cfc3dc; font-size: 21px; }
h3 { margin: 18px 0 5px; color: #3f2c5f; font-size: 17px; }
p { margin: 6px 0; }
ul { margin: 8px 0 0; padding-left: 24px; }
li { margin: 6px 0; }
code { padding: 1px 4px; color: #4c1d75; background: #f3edf8; font-family: Consolas, monospace; }
@media (max-width: 650px) {
.report { width: 100%; margin: 0; padding: 32px 22px; box-shadow: none; }
h1 { font-size: 25px; }
}
@media print {
body { background: #fff; font-size: 12pt; }
.report { width: 100%; margin: 0; padding: 24px 34px; border-top-width: 5px; box-shadow: none; }
section { break-inside: avoid; }
}
</style>
</head>
<body>
<main class="report">
<h1>Báo cáo: Các tính chất của phần mềm tốt</h1>
<div class="student-info">
<p><strong>Sinh viên:</strong> Võ Trúc Quỳnh</p>
<p><strong>MSSV:</strong> 24120427</p>
</div>
<section>
<h2>I. Các tính chất chung của phần mềm tốt</h2>
<h3>1. Đúng đắn (Correctness)</h3>
<p>Phần mềm phải thực hiện chính xác các chức năng đã được định nghĩa theo yêu cầu.</p>
<ul>
<li><strong>Ví dụ:</strong> Phần mềm máy tính tính đúng phép toán <code>2 + 2 = 4</code>.</li>
<li><strong>Phản ví dụ:</strong> Ứng dụng tính tiền siêu thị cộng dồn sai tổng hóa đơn của khách hàng.</li>
</ul>
<h3>2. Ổn định, đáng tin cậy (Reliability)</h3>
<p>Phần mềm đáng tin cậy có khả năng hoạt động ổn định, hạn chế lỗi và có thể xử lý hoặc phục hồi phù hợp khi sự cố xảy ra.</p>
<ul>
<li><strong>Ví dụ:</strong> Hệ thống chuyển tiền của ngân hàng hoạt động 24/7, nếu giao dịch gặp sự cố, hệ thống thông báo rõ ràng và không làm mất hoặc ghi nhận sai dữ liệu.</li>
<li><strong>Phản ví dụ:</strong> Ứng dụng xem phim bị văng liên tục khi người dùng nhấn vào nút toàn màn hình.</li>
</ul>
<h3>3. Hiệu quả (Efficiency)</h3>
<p>Tối ưu hóa tài nguyên phần cứng (CPU, RAM, pin, băng thông) khi chạy.</p>
<ul>
<li><strong>Ví dụ:</strong> Trình duyệt web tải trang nhanh, cuộn trang mượt và không tiêu thụ quá nhiều RAM hoặc pin so với chức năng mà nó cung cấp.</li>
<li><strong>Phản ví dụ:</strong> Một ứng dụng ghi chú đơn giản nhưng tiêu thụ quá nhiều RAM, khiến thiết bị nóng lên và phản hồi chậm.</li>
</ul>
<h3>4. Tiện dụng (Usability)</h3>
<p>Giao diện thân thiện, dễ sử dụng, phù hợp với người dùng.</p>
<ul>
<li><strong>Ví dụ:</strong> Ứng dụng đặt xe có giao diện trực quan, người lớn tuổi chỉ cần mở ứng dụng và thực hiện từ hai đến ba thao tác là có thể gọi được xe.</li>
<li><strong>Phản ví dụ:</strong> Phần mềm mua vé tàu hỏa có quá nhiều bước, nút bấm nhỏ xen kẽ và người dùng không biết phải bấm vào đâu để thanh toán.</li>
</ul>
<h3>5. Bảo mật (Security)</h3>
<p>Khả năng bảo vệ dữ liệu người dùng khỏi sự truy cập trái phép và các cuộc tấn công mạng.</p>
<ul>
<li><strong>Ví dụ:</strong> Ứng dụng ngân hàng yêu cầu xác thực mã OTP hoặc sinh trắc học trước khi thực hiện chuyển tiền.</li>
<li><strong>Phản ví dụ:</strong> Website lưu trữ mật khẩu của người dùng dưới dạng văn bản thuần trên cơ sở dữ liệu, hacker dễ dàng lấy được nếu hệ thống bị xâm nhập.</li>
</ul>
<h3>6. Dễ bảo trì (Maintainability)</h3>
<p>Phần mềm có cấu trúc mã nguồn rõ ràng sẽ giúp việc sửa lỗi hoặc cập nhật tính năng mới diễn ra nhanh chóng.</p>
<ul>
<li><strong>Ví dụ:</strong> Mã nguồn được chia thành các module có nhiệm vụ rõ ràng, tên biến và hàm dễ hiểu, có kiểm thử và tài liệu cần thiết.</li>
<li><strong>Phản ví dụ:</strong> Mã nguồn tổ chức rối, không có tài liệu kỹ thuật. Khi sửa một lỗi nhỏ ở giao diện lại làm hỏng luôn chức năng xử lý dữ liệu.</li>
</ul>
<h3>7. Tiến hóa/thích ứng (Evolutionary/Scalability)</h3>
<p>Phần mềm có khả năng tiếp tục mở rộng và thay đổi để đáp ứng số lượng người dùng, dữ liệu hoặc yêu cầu mới. Tính tái sử dụng và tính uyển chuyển giúp quá trình phát triển phần mềm thuận lợi hơn.</p>
<ul>
<li><strong>Khả năng mở rộng (Scalability):
</strong>
<ul>
<li><em>Ví dụ:</em> Hệ thống bán hàng trực tuyến có thể bổ sung máy chủ khi số lượng người dùng tăng cao mà vẫn duy trì tốc độ xử lý ổn định.</li>
<li><em>Phản ví dụ:</em> Một website hoạt động tốt với 100 người dùng nhưng thường xuyên quá tải và ngừng phản hồi khi có 1.000 người truy cập cùng lúc.</li>
</ul>
</li>
<li><strong>Tái sử dụng (Reusability):</strong>
<ul>
<li><em>Ví dụ:</em> Lập trình viên viết một thư viện xử lý đăng nhập bằng Google và sử dụng thư viện đó cho ba dự án khác nhau của công ty.</li>
<li><em>Phản ví dụ:</em> Trong mỗi dự án mới, lập trình viên đều phải viết lại phần kết nối cơ sở dữ liệu từ đầu thay vì đóng gói thành thành phần dùng chung.</li>
</ul>
</li>
<li><strong>Uyển chuyển (Flexibility):</strong>
<ul>
<li><em>Ví dụ:</em> Phần mềm bán hàng cho phép cấu hình nhiều phương thức thanh toán khác nhau mà không cần thay đổi toàn bộ hệ thống.</li>
<li><em>Phản ví dụ:</em> Phần mềm quản lý nhà hàng được thiết kế quá cứng nhắc nên khi chủ quán muốn bổ sung chức năng tích điểm thành viên, đội ngũ phát triển phải thay đổi phần lớn hệ thống lõi.</li>
</ul>
</li>
</ul>
</section>
<section>
<h2>II. Các tính chất quan trọng đối với nhà phát triển phần mềm</h2>
<h3>1. Dễ bảo trì (Maintainability)</h3>
<p>Dễ bảo trì giúp nhà phát triển dễ dàng tìm lỗi, sửa lỗi và cập nhật phần mềm mà không làm ảnh hưởng đến những chức năng khác.</p>
<ul>
<li><strong>Ví dụ:</strong> Mã nguồn được chia thành các module rõ ràng, có tên biến và tên hàm dễ hiểu nên lập trình viên có thể nhanh chóng xác định nơi cần sửa khi xảy ra lỗi.</li>
<li><strong>Phản ví dụ:</strong> Toàn bộ chức năng của phần mềm được viết trong một tệp lớn, các đoạn mã phụ thuộc vào nhau nên khi sửa một phần lại làm hỏng nhiều phần khác.</li>
</ul>
<h3>2. Tái sử dụng (Reusability)</h3>
<p>Tái sử dụng là khả năng dùng lại đoạn mã, chức năng đã có trong hệ thống hoặc trong những dự án khác. Điều này giúp nhà phát triển tiết kiệm thời gian và hạn chế việc viết lại mã nguồn.</p>
<ul>
<li><strong>Ví dụ:</strong> Một thành phần đăng nhập được xây dựng riêng và có thể sử dụng lại cho nhiều website của công ty.</li>
<li><strong>Phản ví dụ:</strong> Mỗi khi làm dự án mới, lập trình viên phải viết lại toàn bộ chức năng đăng nhập dù các dự án có yêu cầu gần giống nhau.</li>
</ul>
</section>
</main>
</body>
</html>