Trong thế giới phát triển phần mềm ngày càng phức tạp, việc đảm bảo ứng dụng hoạt động đúng như mong đợi là điều không thể thiếu. Đây chính là lúc Functional Testing phát huy sức mạnh. Vậy Functional Testing là gì và vì sao nó lại quan trọng đến vậy? Bài viết này sẽ giúp bạn hiểu rõ khái niệm, vai trò và quy trình thực hiện kiểm thử chức năng – một phần không thể thiếu để mang đến trải nghiệm người dùng mượt mà và ổn định.
1. Functional Testing là gì?
Functional Testing là một phương pháp kiểm thử phần mềm nhằm đảm bảo các tính năng của hệ thống hoạt động đúng như mong đợi. Thay vì kiểm tra cách hoạt động bên trong của phần mềm, Functional Testing tập trung vào đầu vào và đầu ra, mô phỏng cách người dùng tương tác với ứng dụng.
Functional Testing là kiểm thử chức năng phần mềm theo yêu cầu
Mục tiêu chính là xác nhận rằng mỗi chức năng được xây dựng đúng theo yêu cầu và mang lại trải nghiệm nhất quán. Ngoài ra, việc phân biệt giữa Functional và Non-Functional Testing giúp các nhóm phát triển chọn đúng chiến lược kiểm thử phù hợp với mục tiêu dự án.
2. Các loại Functional Testing phổ biến
Khi nhắc đến Functional Testing, không thể bỏ qua các loại hình kiểm thử phổ biến giúp đảm bảo chất lượng phần mềm từ nhiều góc độ:
Unit Testing, nơi từng đơn vị mã nguồn được kiểm tra độc lập.
Integration Testing, kiểm tra sự kết nối giữa các module.
System Testing đánh giá toàn bộ hệ thống trong môi trường thực tế.
User Acceptance Testing (UAT) – bước xác nhận cuối cùng từ người dùng để đảm bảo phần mềm đáp ứng đúng nhu cầu sử dụng.
Để kiểm thử chức năng diễn ra hiệu quả, việc tuân thủ một quy trình rõ ràng là rất quan trọng. Dưới đây là các bước cơ bản trong quá trình thực hiện Functional Testing:
Quy trình Functional Testing gồm phân tích, test và kiểm thử lại
Phân tích yêu cầu: Trước tiên, tester cần đọc kỹ tài liệu yêu cầu (requirement) để hiểu rõ phần mềm cần làm gì. Đây là bước nền tảng giúp xác định phạm vi kiểm thử và đảm bảo không bỏ sót chức năng nào.
Thiết kế test case: Từ những yêu cầu đã phân tích, tester sẽ viết các test case cụ thể để kiểm tra từng chức năng. Mỗi test case gồm đầu vào, các bước thực hiện và kết quả mong đợi – giúp đảm bảo mọi thao tác đều được kiểm tra một cách logic và đầy đủ.
Chuẩn bị dữ liệu kiểm thử: Dữ liệu là yếu tố không thể thiếu để chạy test case. Tester cần chuẩn bị các bộ dữ liệu đầu vào phù hợp để mô phỏng tình huống sử dụng thực tế và phát hiện lỗi tiềm ẩn.
Thực hiện kiểm thử: Đây là bước tiến hành chạy các test case đã xây dựng. Tester sẽ thao tác trực tiếp trên phần mềm hoặc dùng công cụ tự động (nếu có) để kiểm tra đầu ra có khớp với mong đợi không.
Ghi nhận và báo cáo lỗi: Nếu có lỗi xảy ra, tester sẽ ghi lại chi tiết và báo cáo cho đội ngũ phát triển để xử lý. Việc báo cáo rõ ràng sẽ giúp tiết kiệm thời gian sửa lỗi và tránh hiểu nhầm giữa các bên.
Kiểm thử lại sau khi sửa lỗi: Sau khi dev sửa lỗi, tester sẽ tiến hành kiểm thử lại (re-test) để đảm bảo lỗi đã được xử lý triệt để và không ảnh hưởng đến các chức năng khác.
Functional Testing giúp phát hiện lỗi sớm và đảm bảo phần mềm hoạt động đúng
Functional Testing không chỉ là một bước kỹ thuật, mà còn là chiếc “khiên chắn” bảo vệ chất lượng sản phẩm. Dưới đây là những lợi ích nổi bật mà phương pháp này mang lại:
Đảm bảo phần mềm hoạt động đúng chức năng: Mỗi tính năng đều được kiểm tra kỹ lưỡng để đảm bảo hoạt động như kỳ vọng, từ đó mang đến trải nghiệm người dùng ổn định và đáng tin cậy.
Phát hiện lỗi sớm trong quá trình phát triển: Functional Testing giúp phát hiện lỗi ngay từ giai đoạn đầu, giảm thiểu rủi ro khi sản phẩm đã triển khai hoặc đưa vào sử dụng.
Nâng cao chất lượng và độ tin cậy của sản phẩm: Một phần mềm được kiểm thử chức năng kỹ lưỡng sẽ có ít lỗi hơn, dễ bảo trì hơn và tăng sự hài lòng từ người dùng cuối – điều mà bất kỳ dự án nào cũng hướng tới.
5. Công cụ hỗ trợ Functional Testing
Functional Testing được hỗ trợ bởi các công cụ như Selenium, JUnit, TestNG và Postman
Để quá trình kiểm thử diễn ra nhanh chóng và hiệu quả, việc sử dụng các công cụ chuyên dụng là vô cùng cần thiết. Dưới đây là một số công cụ phổ biến thường được sử dụng trong Functional Testing:
Selenium
Ưu điểm: Mã nguồn mở, hỗ trợ kiểm thử tự động trên nhiều trình duyệt và nền tảng khác nhau.
Nhược điểm: Cần kiến thức lập trình, không thân thiện lắm với người mới.
Phù hợp với: Các dự án web cần kiểm thử đa trình duyệt, kiểm thử tự động ở mức giao diện.
JUnit
Ưu điểm: Đơn giản, tích hợp tốt với môi trường Java, phù hợp cho Unit Testing.
Nhược điểm: Chủ yếu dùng cho Java, không hỗ trợ kiểm thử giao diện.
Phù hợp với: Dự án Java muốn kiểm thử chức năng ở mức đơn vị.
TestNG
Ưu điểm: Hỗ trợ kiểm thử song song, phân nhóm test case, báo cáo chi tiết.
Nhược điểm: Chủ yếu dành cho Java, cần cài đặt thêm thư viện.
Phù hợp với: Dự án lớn, cần kiểm thử chức năng phức tạp với cấu trúc kiểm thử rõ ràng.
Postman
Ưu điểm: Giao diện trực quan, dễ sử dụng, hỗ trợ tốt cho kiểm thử API.
Nhược điểm: Không phù hợp để kiểm thử giao diện web.
Phù hợp với: Dự án có nhiều API, cần kiểm tra chức năng của các endpoint.
Hãy chọn công cụ phù hợp với ngôn ngữ lập trình, quy mô dự án và mục tiêu kiểm thử để đạt hiệu quả cao nhất. Đôi khi, sự kết hợp giữa các công cụ sẽ mang lại kết quả toàn diện hơn là chỉ dùng một công cụ đơn lẻ.
6. Kết luận
Functional Testing là gì? Đó là một phần không thể thiếu trong quá trình đảm bảo chất lượng phần mềm. Bằng cách tập trung vào việc kiểm tra xem phần mềm có hoạt động đúng như yêu cầu hay không, Functional Testing giúp phát hiện lỗi sớm, tăng độ tin cậy và giảm rủi ro trong triển khai.
Dù bạn là sinh viên mới học kiểm thử hay là QA kỳ cựu đang dẫn dắt dự án lớn, việc áp dụng Functional Testing đúng cách sẽ giúp sản phẩm của bạn không chỉ hoạt động tốt mà còn ghi điểm trong mắt người dùng. Đừng chờ đến khi phần mềm gặp sự cố mới nghĩ đến kiểm thử – hãy đưa Functional Testing vào ngay từ những bước đầu trong quy trình phát triển!
Bạn có bao giờ thắc mắc làm sao những phần mềm từ đơn giản đến phức tạp lại hoạt động mượt mà và ổn định như vậy? Bí quyết nằm ở các kỹ thuật kiểm thử phần mềm, những phương pháp, quy trình giúp các lập trình viên xây dựng và duy trì sản phẩm công nghệ chất lượng. Trong bài viết này, chúng ta sẽ cùng khám phá các kỹ thuật phần mềm phổ biến và hiệu quả nhất, giúp bạn hiêu rõ cách các “bộ não” công nghệ vận hành và làm thế nào để áp dụng vào dự án của mình một cách dễ dàng hơn.
1. Vai trò và phân loại các kỹ thuật kiểm thử phần mềm
Kỹ thuật kiểm thử phần mềm là tập hợp các phương pháp, quy trình và công cụ giúp các lập trình viên phát triển phần mềm một cách khoa học, hiệu quả và bền vững. Thay vì chỉ viết code một cách ngẫu hứng, kỹ thuật phần mềm giúp đảm bảo sản phẩm cuối cùng hoạt động đúng như mong muốn, dễ bảo trì và nâng cấp trong tương lai.
Nói cách khác, kỹ thuật kiểm thử phần mềm giúp bạn:
Thiết kế test case thông minh hơn, ít nhưng chất lượng.
Tập trung đúng chỗ dễ phát sinh lỗi.
Tiết kiệm thời gian, công sức mà vẫn đảm bảo chất lượng.
Nâng cao kỹ năng phân tích hệ thống
Các loại kỹ thuât kiểm thử phổ biến hiện này:
Kỹ thuật kiểm thử không phải là một khái niệm trừu tượng mà được chia thành các nhóm rõ ràng, tùy theo cách bạn tiếp cận hệ thống.
1.1 Kiểm thử hộp đen (black-bõ testing)
Kiểm thử hộp đen là nhóm kỹ thuật mà bạn không quan tâm đến code bên trong, chỉ tập trung vào đầu vào – đầu ra của hệ thống. Đa số các kỹ thuật như phân vùng tương đương, giá trị biên, bảng quyết định hay chuyển đổi trạng thái đều nằm trong nhóm này.
→ Dành cho tester, QA, hoặc cả dev muốn kiểm thử logic mà không cần đọc code.
1.2 Kiểm thử hộp trắng (white-box testing)
Ngược lại với hộp đen, kiểm thử hộp trắng yêu cầu bạn phải hiểu luồng code, logic điều kiện, vòng lặp, hàm gọi nhau như thế nào để test. Ví dụ như kiểm thử tất cả các nhánh if-else, vòng lặp for…
→ Thường áp dụng bởi lập trình viên, hoặc tester có kiến thức về code.
1.3 Kiểm thử dựa trên kinh nghiệm (experience-based testing)
Nhóm này không theo công thức cụ thể, mà dựa vào trực giác, kinh nghiệm của người kiểm thử để phán đoán các chỗ có thể gây lỗi – ví dụ như những phần hệ thống từng lỗi nhiều lần, những input đặc biệt, hoặc flow người dùng hay quên điền thông tin.
→ Kỹ thuật đoán lỗi (Error Guessing) là ví dụ tiêu biểu.
2. Các kỹ thuật kiểm thử phần mềm
Bây giờ chúng ta sẽ đi vào phần chính của chủ đề này, 5 kỹ thuật kiểm thử phần mềm phổ biến và cực kỳ hữu ích trong thực tế. Các kỹ thuật kiểm thử phần mềm này không chỉ giúp bạn viết test case dễ dàng hơn, mà còn nâng cao khả năng phát hiện lỗi trong kiểm thử phần mềm, ngay cả khi hệ thống còn đang trong giai đoạn phát triển.
Đừng lo nếu bạn chưa từng nghe tới các tên như “phân tích giá trị biên” hay “bảng quyết định”. Chúng ta sẽ đi từng kỹ thuật một cách dễ hiểu nhất, có ví dụ minh họa cụ thể, và gợi ý cách áp dụng vào công việc hàng ngày.
Các kỹ thuật kiểm thử phần mềm phổ biến
Dưới đây là 5 kỹ thuật bạn cần nắm vững nếu muốn kiểm thử phần mềm một cách khoa học, logic và tiết kiệm thời gian:
2.1 Phân vùng tương đương (Equivalence Partitioning)
Nếu bạn đang viết test case cho một input số tuổi từ 18 đến 60 và bạn tính test từng con số từ 1 đến 100 thì…. Thay vào đó, phân vùng tương đương sẽ giúp bạn “nhóm” các giá trị đầu vào lại thành các phần tương đương, để chỉ cần test một đại diện là đủ.
Phân vùng tương đương là một kỹ thuật kiểm thử thuộc nhóm kiểm thử hộp đen. Mục tiêu của kỹ thuật này là:
“Chia đầu vào của chương trình thành các vùng dữ liệu mà tại đó hệ thống được cho là xử lý giống nhau.”
Nói đơn giản: Nếu hệ thống xử lý các giá trị 20, 25, 30 giống nhau → ta chỉ cần test 1 trong số đó.
Có 2 loại lớp tương đương chính:
Lớp hợp lệ (Valid Partition): là những giá trị đầu vào mà hệ thống cho phép.
Lớp không hợp lệ (Invalid Partition): là những giá trị không hợp lệ, hệ thống phải từ chối hoặc báo lỗi.
Các áp dụng phân vùng tương đương:
Phân tích yêu cầu đầu vào.
Xác định các phạm vi hoặc loại dữ liệu hợp lệ.
Chia thành các lớp dữ liệu khác nhau (hợp lệ & không hợp lệ).
Chọn ít nhất một đại diện cho mỗi lớp để viết test case.
Ví dụ minh họa để giúp bạn hình dung rõ hơn về kỹ thuật kiểm thử phân vùng tương đương:
Yêu cầu: Hệ thống chỉ chấp nhận độ tuổi từ 18 đến 60 để đăng ký tài khoản.
→ Ta có thể chia đầu vào thành các lớp:
Loại lớp
Miêu tả
Đại diện
Hợp lệ
18 ≤ tuổi ≤ 60
25
Không hợp lệ
Tuổi < 18
16
Không hợp lệ
Tuổi > 60
65
→ Vậy là bạn chỉ cần viết 3 test case thay vì kiểm tra tất cả các độ tuổi từ 1 đến 100.
Vậy khi nào nên dùng kỹ thuật này?
Khi bạn cần test các input có thể chia thành các nhóm rõ ràng, ví dụ như độ tuổi, số lượng, số tiền, trạng thái đơn hàng…
Phân vùng tương đương và phân tích giá trị biên
2.2 Phân tích giá trị biên (Boundary Value Analysis)
Bạn còn nhớ kỹ thuật “phân vùng tương đương” không? Nó giúp chia đầu vào thành các nhóm. Nhưng có một sự thật thú vị là: lỗi thường không nằm giữa các nhóm, mà nằm ngay ở ranh giới
Ví dụ như tuổi 18 hay tuổi 60, chứ không phải 25 hay 40.
Đó chính là lý do chúng ta cần đến kỹ thuật phân tích giá trị biên – một trong những “vũ khí lợi hại” nhất trong kiểm thử phần mềm.
Phân tích giá trị biên (Boundary Value Analysis – BVA) là kỹ thuật kiểm thử tập trung vào các giá trị cận trên và cận dưới của một phạm vi hợp lệ hoặc không hợp lệ. Vì sao? Vì những chỗ này rất dễ bị lỗi kiểu như: thiếu dấu =, thiếu kiểm tra biên, off-by-one (ví dụ code chỉ cho tuổi > 18 thay vì ≥ 18)…
Ví dụ về phân tích giá trị biên:
Xác định dải giá trị đầu vào hợp lệ (ví dụ: 18 đến 60).
Lấy các giá trị ở biên:
Cận dưới: 18 → test các giá trị: 17 (dưới), 18 (biên), 19 (trên biên)
Cận trên: 60 → test các giá trị: 59 (dưới biên), 60 (biên), 61 (trên)
Viết test case dựa vào những giá trị này.
Ví dụ minh họa: Yêu cầu hệ thống cho phép đăng ký nếu tuổi từ 18 đến 60.
→ Ta sẽ test:
Trường hợp
Giá trị
Dưới cận dưới
17
Tại cận dưới
18
Trên cận dưới
19
Dưới cận trên
59
Tại cận trên
60
Trên cận trên
61
Vậy chúng ta sẽ có tổng cộng 6 test case, vừa đủ để hệ thống có xử lý đúng không.
Vậy khi nào nên dùng kỹ thuật này?
Khi đầu vào có giới hạn rõ ràng, ví dụ: giới hạn độ tuổi, chiều dài password, số lượng item…
Khi bạn nghi ngờ hệ thống dễ bị lỗi ở biên, nhất là khi dev viết logic điều kiện như >=, <=.
2.3 Bảng quyết định kiểm thử (Decision Table Testing)
Nếu bạn từng kiểm thử một chức năng mà có quá nhiều điều kiện ràng buộc nhau (kiểu như “nếu A đúng và B sai thì làm C, còn nếu A sai mà B đúng thì làm D…”), thì bảng quyết định kiểm thử sẽ là “cứu tinh” của bạn.
Đây là cách tuyệt vời để biến logic phức tạp thành bảng đơn giản, dễ nhìn – dễ test – dễ hiểu.
Decision Table Testing là kỹ thuật kiểm thử hộp đen dùng để xử lý các tình huống có nhiều điều kiện và nhiều hành động xảy ra. Mỗi hàng trong bảng thể hiện một điều kiện hoặc một hành động, còn mỗi cột là một kịch bản cụ thể.
Cấu trúc bảng quyết định gồm:
Hàng điều kiện (Condition rows): các điều kiện logic cần kiểm tra.
Hàng hành động (Action rows): kết quả hoặc hành động tương ứng.
Các cột (Rules): mỗi cột là một tổ hợp điều kiện dẫn đến hành động tương ứng.
Ví dụ minh họa: yêu cầu hệ thống cấp voucher giảm giá như sau:
Nếu là khách hàng thân thiết và mua > 1 triệu → giảm 10%
Nếu không thân thiết nhưng mua > 2 triệu → giảm 5%
Các trường hợp còn lại → không giảm
Điều kiện
Rule 1
Rule 2
Rule 3
Khách hàng thân thiết
Có
Không
Không
Mua > 2 triệu
Có
Có
Không
Hành động: Giảm 10%
✅
❌
❌
Hành động: Giảm 5%
❌
✅
❌
Hành động: Không giảm
❌
❌
✅
→ Từ bảng này, bạn dễ dàng viết ra 3 test case đại diện và không bỏ sót logic nào.
Vậy khi nào nên dùng kỹ thuật này?
Khi bạn test các chức năng có nhiều “nhánh” quyết định (kiểu: nếu – thì – và – hoặc…)
Khi làm việc với các yêu cầu nghiệp vụ có nhiều luật ràng buộc.
2.4 Đoán lỗi (Error Guessing)
Bạn có bao giờ trong đầu bỗng nghĩ “Chắc cái chỗ này sẽ bị lỗi” và… đúng là lỗi thiệt không? Đó chính là cảm giác khi bạn sử dụng đoán lỗi trong kiểm thử (Error Guessing) – một kỹ thuật kiểm thử phần mềm dựa vào kinh nghiệm cá nhân và trực giác nghề nghiệp.
Dù nghe có vẻ “cảm tính”, nhưng đây lại là kỹ thuật được nhiều tester lão làng áp dụng rất hiệu quả trong thực tế.
Đoán lỗi là kỹ thuật kiểm thử không dựa vào một công thức cụ thể nào. Thay vào đó, tester sẽ dựa vào kinh nghiệm, trực giác, và hiểu biết về hệ thống để suy đoán những chỗ dễ phát sinh lỗi – từ đó viết test case kiểm tra kỹ hơn ở những điểm đó.
Ví dụ thực tế:
Bạn đang kiểm thử một form nhập email, bạn sẽ:
Thử nhập email thiếu @ → “abc.com”
Thử nhập email có 2 dấu @ → “a@@b.com”
Copy-paste email từ Word xem có lỗi khoảng trắng không
Nhập email rất dài → kiểm tra độ dài tối đa
Khi nào nên dùng?
Khi bạn đã hoàn thành các test case chính nhưng vẫn có thời gian để “khám phá”.
Khi kiểm thử các chức năng có input phức tạp, ít quy định chặt chẽ.
Khi bạn từng gặp lỗi ở những chỗ tương tự ở dự án khác (kinh nghiệm là vàng
2.5 Chuyển đổi trạng thái phần mềm (State Transition Testing)
Bạn có bao giờ kiểm thử một hệ thống mà hành vi phụ thuộc vào trạng thái hiện tại không? Ví dụ:
Tài khoản chưa kích hoạt thì không đăng nhập được
Đơn hàng đã huỷ thì không thể chuyển sang “đang giao”
Người dùng đang bị khóa thì không thể reset mật khẩu
Đó chính là những tình huống điển hình để áp dụng kỹ thuật chuyển đổi trạng thái phần mềm (State Transition Testing).
Chuyển đổi trạng thái phần mềm là một kỹ thuật kiểm thử hộp đen, được dùng khi hành vi của hệ thống thay đổi tùy theo trạng thái hiện tại. Kỹ thuật này mô phỏng hệ thống như một máy trạng thái (state machine) – nơi có:
Các trạng thái: hệ thống đang ở đâu? (VD: “mới tạo”, “đang xử lý”, “đã huỷ”)
Các sự kiện: điều gì khiến trạng thái thay đổi? (VD: “bấm thanh toán”, “admin huỷ đơn”)
Chuyển đổi: từ trạng thái này → trạng thái khác khi có sự kiện xảy ra.
Cách thực hiện kỹ thuật chuyển đổi trạng thái:
Xác định các trạng thái có thể có của đối tượng (user, đơn hàng, tài khoản…)
Liệt kê các sự kiện dẫn đến thay đổi trạng thái.
Xây dựng sơ đồ hoặc bảng chuyển đổi trạng thái.
Viết test case để kiểm tra:
Chuyển đổi hợp lệ
Chuyển đổi không hợp lệ (phải báo lỗi)
Kỹ thuật kiểm thử phần mềm chuyển đổi trạng thái
Ví dụ minh họa: Ứng dụng đặt hàng có 4 trạng thái đơn hàng
Mới tạo
Đang giao
Đã giao
Đã huỷ
Trạng thái hiện tại
Sự kiện
Trạng thái mới
Mới tạo
Xác nhận đơn
Đang giao
Đang giao
Giao thành công
Đã giao
Mới tạo
Huỷ đơn
Đã huỷ
Đang giao
Huỷ đơn
❌ Không cho phép
Đã giao
Huỷ đơn
❌ Không cho phép
→ Bạn có thể viết test case để kiểm tra:
Người dùng có thể huỷ đơn khi đơn ở trạng thái “Mới tạo”.
Người dùng không thể huỷ đơn khi đơn đang được giao hoặc đã giao.
3. So sánh và lựa chọn kỹ thuật kiểm thử phù hợp
Vậy khi nào nên dùng kỹ thuật nào? Có cần dùng hết không? Hay chỉ cần chọn 1-2 cái cho nhanh?
Câu trả lời là: Không có kỹ thuật nào là tốt nhất cho mọi tình huống cả, mà bạn cần chọn kỹ thuật phù hợp với ngữ cảnh. Ở phần này, Stepmedia sẽ giúp bạn so sánh nhanh các kỹ thuạt và gợi ý cách lựa chọn thông minh.
Kỹ thuật
Mục đích chính
Khi nào nên dùng
Ưu điểm nổi bật
Phân vùng tương đương
Rút gọn số lượng test case
Khi đầu vào có thể chia thành các nhóm tương tự
Tiết kiệm thời gian test
Giá trị biên
Kiểm tra lỗi ở ranh giới dữ liệu
Khi có điều kiện biên, ví dụ min/max, độ dài input
Phát hiện lỗi “cận biên” rất tốt
Bảng quyết định
Kiểm thử logic phức tạp
Khi có nhiều điều kiện và hành động kết hợp
Trực quan, tránh bỏ sót tổ hợp điều kiện
Đoán lỗi
Dựa vào kinh nghiệm để bắt bug
Khi cần kiểm thử linh hoạt, khám phá thêm
Phát hiện lỗi khó đoán, tăng độ bao phủ kiểm thử
Chuyển đổi trạng thái
Kiểm thử hệ thống có luồng trạng thái
Khi chức năng phụ thuộc vào trạng thái hiện tại
Hiểu rõ logic luồng hoạt động của hệ thống
Gợi ý cách để chọn một trong các kỹ thuật kiểm thử phần mềm phù hợp:
Nếu bạn mới bắt đầu viết test case: hãy bắt đầu với phân vùng tương đương và giá trị biên. Đây là hai kỹ thuật dễ học, dễ áp dụng mà hiệu quả rất cao.
Nếu hệ thống có nhiều trạng thái (ví dụ như đơn hàng, tài khoản, luồng xử lý) → ưu tiên dùng chuyển đổi trạng thái.
Nếu yêu cầu có nhiều luật ràng buộc phức tạp (ví dụ giảm giá, điều kiện phê duyệt) → bảng quyết định sẽ giúp bạn tổ chức test case logic và dễ nhìn hơn.
Nếu bạn là tester có kinh nghiệm thực chiến → đừng quên áp dụng đoán lỗi để “soi” những bug mà tài liệu không nói tới.
Trong thực tế, kết hợp 2-3 kỹ thuật thường mang lại hiệu quả cao hơn là chỉ dùng một kỹ thuật.
Kết hợp phân vùng tương đương + giá trị biên → test hiệu quả và chính xác.
Kết hợp bảng quyết định + đoán lỗi → vừa test logic chuẩn vừa tìm bug ngoài dự đoán.
4. Kết luận
Việc hiểu và áp dụng đúng các kỹ thuật kiểm thử phần mềm không chỉ giúp bạn viết test case hiệu quả hơn mà còn giúp nâng cao tư duy kiểm thử, tiết kiệm thời gian, và phát hiện ra những lỗi quan trọng trước khi phần mềm đến tay người dùng.
Trong bài viết này, chúng ta đã cùng tìm hiểu các kỹ thuật kiểm thử phổ biến và được sử dụng rộng rãi trong thực tế.
Không phải dự án nào cũng cần áp dụng tất cả các kỹ thuật cùng lúc. Tuy nhiên, việc hiểu và biết cách sử dụng từng kỹ thuật đúng lúc sẽ giúp bạn trở thành một tester chuyên nghiệp, kiểm thử một cách thông minh và có chiến lược hơn.
Cuối cùng, dù bạn là một tester mới bắt đầu, một QA nhiều kinh nghiệm, hay một developer quan tâm đến chất lượng sản phẩm, thì việc nắm vững những kỹ thuật này sẽ là nền tảng vững chắc để bạn phát triển sự nghiệp và tạo ra những sản phẩm phần mềm chất lượng cao.
Máy tính và thiết bị thông minh trở thành trụ cột trong đời sống và công việc. Tuy nhiên, đã bao giờ bạn tự hỏi: Điều gì khiến máy tính có thể vận hành?
Câu trả lời nằm ở phần mềm hệ thống – “người hùng thầm lặng” đứng sau mọi tác vụ. Bài viết này sẽ giúp bạn hiểu rõ phần mềm hệ thống là gì, các loại phổ biến, chức năng cốt lõi, vai trò quan trọng, và sự khác biệt giữa nó với phần mềm ứng dụng.
1. Phần mềm hệ thống là gì?
Phần mềm hệ thống là tập hợp các chương trình được thiết kế để điều khiển, quản lý và điều phối hoạt động của phần cứng máy tính, đồng thời tạo môi trường để phần mềm ứng dụng vận hành.
Hiểu đơn giản, nếu phần cứng là “thân xác” của thiết bị thì phần mềm hệ thống chính là “bộ não” và hệ thần kinh” giúp toàn bộ cấu trúc này hoạt động hài hòa.
Phần mềm hệ thống không chỉ giúp thiết bị hoạt động ổn định, mà còn tối ưu hiệu suất, bảo vệ dữ liệu và mở rộng khả năng kết nối giữa các thành phần máy tính.
Bạn đã nhầm lẫn phần mềm hệ thống và ứng dụng? Đừng lo! Ở phần sau, chúng ta sẽ làm rõ các loại phần mềm hệ thống phổ biến và sự khác biệt rõ ràng giữa hai khái niệm này.
2. Các loại phần mềm hệ thống phổ biến nhất hiện nay
Phần mềm hệ thống không chỉ có hệ điều hành. Thực tế, nó bao gồm nhiều thành phần riêng biệt, mỗi loại đóng vai trò cụ thể để giúp hệ thống vận hành ổn định và hiệu quả. Dưới đây là 4 nhóm phần mềm hệ thống phổ biến bạn nên biết.
Các loại phần mềm hệ thống
2.1 Hệ điều hành (Operating System – OS)
Đây là trung tâm điều khiển của cả hệ thống máy tính. Hệ điều hành giúp:
Quản lý bộ nhớ, CPU, thiết bị đầu vào/đầu ra (I/O).
Điều phối các tiến trình đang chạy.
Tổ chức hệ thống tệp.
Cung cấp giao diện người dùng (giao diện đồ họa hoặc dòng lệnh).
Ví dụ hệ điều hành phổ biến:
Microsoft Windows: hệ điều hành phổ biến nhất thế giới cho PC.
macOS: phát triển bởi Apple cho các dòng máy Mac.
Linux: mã nguồn mở, có nhiều bản phân phối như Ubuntu, Fedora.
Android: hệ điều hành di động phổ biến nhất.
iOS: hệ điều hành di động của Apple.
2.2 Trình điều khiển thiết bị (Device Drivers)
Drivers là các phần mềm giúp hệ điều hành “giao tiếp” với phần cứng như chuột, bàn phím, card đồ họa, máy in… Nếu không có driver, phần cứng sẽ không hoạt động đúng cách, hoặc thậm chí không hoạt động.
Ví dụ: Sau khi cài Windows mới, bạn cần cài driver card mạng để có thể kết nối Internet.
2.3 Phần mềm tiện ích (Utility Software)
Là những công cụ giúp duy trì, tối ưu hoặc bảo vệ hệ thống.
Chức năng chính:
Quét và diệt virus.
Dọn dẹp rác hệ thống, chống phân mảnh ổ đĩa.
Sao lưu và phục hồi dữ liệu.
Ví dụ: CCleaner, Windows Defender, Acronis Backup…
2.4 Bộ xử lý ngôn ngữ (Language Processors)
Dành cho lập trình viên, các trình biên dịch và thông dịch có nhiệm vụ:
Dịch mã nguồn (ngôn ngữ lập trình) sang mã máy.
Giúp phần mềm mới có thể chạy trên hệ thống.
Gồm 3 loại chính:
Compiler (trình biên dịch): Biên dịch toàn bộ chương trình, ví dụ: C++, Java.
Interpreter (trình thông dịch): Dịch từng dòng, ví dụ: Python, JavaScript.
Assembler (trình hợp ngữ): Dịch ngôn ngữ máy thấp (assembly).
3. Chức năng cốt lõi của phần mềm hệ thống
Phần mềm hệ thống không chỉ đơn thuần giúp máy tính “chạy được” — mà còn là bộ máy vận hành tỉ mỉ, đồng bộ và thông minh đằng sau mọi chức năng. Dưới đây là các chức năng cốt lõi của phần mềm hệ thống mà bạn cần biết:
Chức năng cốt lõi của phần mềm hệ thống
3.1 Quản lý tài nguyên (Resource Management)
Phần mềm hệ thống có nhiệm vụ phân bổ và theo dõi việc sử dụng CPU, RAM, ổ cứng, và thiết bị I/O một cách tối ưu. Ví dụ, khi bạn mở nhiều ứng dụng cùng lúc, hệ điều hành sẽ phân chia tài nguyên để mọi ứng dụng đều hoạt động mượt mà.
3.2 Quản lý tiến trình (Process Management)
Mỗi chương trình bạn chạy đều là một tiến trình. Phần mềm hệ thống điều phối thời điểm khởi chạy, dừng, tạm dừng hoặc ưu tiên tiến trình nào để đảm bảo độ mượt và ổn định hệ thống.
3.3 Quản lý tệp tin (File Management)
Tất cả dữ liệu trong máy tính đều được lưu dưới dạng tệp. Phần mềm hệ thống:
Tổ chức tệp theo cấu trúc thư mục.
Quy định quyền truy cập (ai được đọc, ghi, sửa…).
Đảm bảo an toàn cho dữ liệu trong quá trình lưu trữ và truy xuất.
3.4 Cung cấp giao diện người dùng (User Interface – UI)
Phần mềm hệ thống chính là thứ cho phép bạn tương tác với máy tính qua:
Giao diện đồ họa (GUI): biểu tượng, cửa sổ, chuột.
Giao diện dòng lệnh (CLI): ví dụ: Terminal, Command Prompt.
GUI khiến máy tính trở nên thân thiện với người dùng, còn CLI lại mạnh mẽ với lập trình viên.
3.5 Quản lý thiết bị (Device Management)
Khi bạn cắm USB, kết nối máy in hay sử dụng webcam, chính phần mềm hệ thống đảm bảo thiết bị được phát hiện, kích hoạt và quản lý đúng cách thông qua driver.
3.6 Bảo mật hệ thống (System Security)
Phần mềm hệ thống cũng là lớp phòng thủ đầu tiên:
Kiểm soát đăng nhập và quyền truy cập.
Cách ly tiến trình nghi ngờ.
Hạn chế chương trình độc hại làm ảnh hưởng tới toàn hệ thống.
3.7 Đảm bảo ổn định và khôi phục hệ thống
Nếu một phần mềm gặp lỗi hoặc treo, phần mềm hệ thống sẽ:
Tự động đóng tiến trình lỗi.
Ghi nhật ký lỗi.
Hỗ trợ khởi động lại an toàn để đảm bảo tính ổn định lâu dài cho hệ thống
4. Vai trò không thể thiếu của phần mềm hệ thống trong thế giới số
Trong kỷ nguyên số hiện nay, phần mềm hệ thống không chỉ là công cụ vận hành mà còn là nền tảng sống còn cho mọi thiết bị thông minh. Dù bạn sử dụng điện thoại, laptop, máy tính bảng hay thậm chí là tivi thông minh — thì mọi thao tác đều đi qua bàn tay “đạo diễn” của phần mềm hệ thống.
Vai trò của phần mềm hệ thống
Dưới đây là những vai trò cốt lõi và không thể thay thế:
4.1 Nền tảng vận hành bắt buộc
Không có phần mềm hệ thống, thiết bị chỉ là một khối kim loại vô tri. Nó giúp máy khởi động, kết nối với phần cứng, và tạo môi trường cho phần mềm ứng dụng hoạt động. Hệ điều hành chính là trung tâm đầu não điều hành mọi thứ.
4.2 Cầu nối giữa phần cứng và người dùng
Thông qua phần mềm hệ thống, người dùng không cần biết lập trình hoặc hiểu về cấu trúc phần cứng mà vẫn có thể sử dụng thiết bị dễ dàng. Từ nhấn nút nguồn, mở ứng dụng, cho tới in tài liệu — tất cả đều được phần mềm hệ thống xử lý mượt mà.
4.3 Đảm bảo hiệu suất và độ ổn định hệ thống
Một phần mềm hệ thống được tối ưu tốt sẽ giúp:
Tăng tốc độ xử lý chương trình.
Giảm nguy cơ treo máy hoặc xung đột tài nguyên.
Giữ hệ thống hoạt động ổn định trong thời gian dài.
Đây là yếu tố then chốt với cả cá nhân lẫn doanh nghiệp, đặc biệt trong các hệ thống lớn như máy chủ, trung tâm dữ liệu…
4.4 Hỗ trợ bảo mật từ lớp nền tảng
Phần mềm hệ thống bảo vệ thiết bị từ “bên trong”:
Quản lý người dùng và quyền truy cập.
Ngăn chặn phần mềm độc hại tác động tới hệ thống.
Cho phép phục hồi khi gặp sự cố (safe mode, recovery tools…).
4.5 Tạo môi trường cho đổi mới công nghệ
Từ AI, IoT đến điện toán đám mây, tất cả các công nghệ mới đều cần nền tảng phần mềm hệ thống mạnh mẽ, ổn định để triển khai và vận hành. Không có hệ điều hành, AI không thể học, cloud không thể mở rộng, và robot không thể hoạt động trơn tru.
5. Phân biệt phần mềm hệ thống và phần mềm ứng dụng
Rất nhiều người dùng máy tính hoặc thiết bị thông minh nhầm lẫn giữa phần mềm hệ thống và phần mềm ứng dụng. Tuy cả hai đều là phần mềm, nhưng chúng có chức năng, vai trò và cách hoạt động hoàn toàn khác nhau.
Tiêu chí
Phần mềm hệ thống
Phần mềm ứng dụng
Mục đích chính
Vận hành, điều phối phần cứng và môi trường cho ứng dụng
Hỗ trợ người dùng thực hiện tác vụ cụ thể
Tác động đến hệ thống
Trực tiếp kiểm soát tài nguyên hệ thống
Dựa trên nền tảng hệ thống để hoạt động
Tương tác chính với
Phần cứng và phần mềm ứng dụng
Người dùng cuối
Mức độ thiết yếu
Bắt buộc – không có thì máy không hoạt động
Tùy chọn – có thể cài hoặc không tùy theo nhu cầu
Ví dụ
Hệ điều hành (Windows, macOS), Driver, phần mềm tiện ích
Microsoft Word, Google Chrome, Zalo, Photoshop
Khởi chạy khi bật máy?
Có – tự động hoạt động từ đầu
Không – chỉ khi người dùng chủ động mở
6. Kết luận
Qua bài viết này, chắc hẳn bạn đã hiểu rõ phần mềm hệ thống là gì, gồm những loại nào, có chức năng ra sao và khác biệt như thế nào với phần mềm ứng dụng.
Dù thường bị “ẩn mình” trong nền, nhưng phần mềm hệ thống chính là trái tim vận hành của mọi thiết bị thông minh hiện đại — từ điện thoại, laptop, cho tới hệ thống máy chủ và trung tâm dữ liệu.
Thiết kế phần mềm không chỉ đơn thuần là việc vẽ sơ đồ hay tạo mô hình, mà còn là bước nền tảng quan trọng quyết định chất lượng và tuổi thọ của sản phẩm. Nó giúp định hình rõ ràng cách hệ thống vận hành, cách các module tương tác với nhau, đảm bảo tính linh hoạt, khả năng mở rộng, và tối ưu hiệu suất tổng thể.
Bài viết này sẽ giải đáp rõ ràng cho câu hỏi thiết kế phần mềm là gì Phân tích các nguyên tắc thiết kế phần mềm, đặc biệt là bộ nguyên tắc SOLID trong thiết kế phần mềm, đồng thời nhấn mạnh lợi ích thiết kế phần mềm đối với cả kỹ sư lẫn doanh nghiệp.
1. Thiết kế phần mềm là gì?
Thiết kế phần mềm là quá trình lên kế hoạch và định nghĩa cách tổ chức các kiến trúc phần mềm, module, giao diện, và dữ liệu để xây dựng một hệ thống phần mềm hoàn chỉnh, phù hợp với yêu cầu đã được phân tích trước đó.
Quá trình này bao gồm hai cấp độ:
Thiết kế cấp cao (High-level design) – Tập trung vào mô tả cấu trúc tổng thể, các module lớn, mối quan hệ giữa chúng và cách chúng tương tác với nhau.
Thiết kế cấp thấp (Low-level design) – Đi sâu vào chi tiết từng module, từng lớp, cách triển khai các chức năng cụ thể và xử lý dữ liệu nội bộ.
Thiết kế là bước chuyển tiếp quan trọng từ ý tưởng đến thực thi, giúp các kỹ sư phần mềm và lập trình viên hiểu rõ mình cần làm gì trước khi bắt tay vào viết mã nguồn.
1.1. Vai trò của thiết kế trong vòng đời phát triển phần mềm (SDLC)
Trong vòng đời phát triển phần mềm (SDLC), giai đoạn thiết kế xuất hiện ngay sau bước phân tích yêu cầu và trước khi lập trình (coding). Điều này giúp định hướng rõ ràng cho nhóm phát triển, tránh hiểu sai yêu cầu, đồng thời hạn chế coupling quá mức giữa các phần của hệ thống.
Thiết kế tốt giúp:
Xác định các thành phần cần xây dựng.
Phân tách nhiệm vụ rõ ràng.
Tăng tính dễ đọc và khả năng refactoring của mã sau này.
Góp phần nâng cao khả năng bảo mật và tối ưu chi phí phát triển.
1.2. Phân biệt thiết kế phần mềm với kiến trúc phần mềm và coding
Nhiều người dễ nhầm lẫn giữa thiết kế phần mềm và kiến trúc phần mềm. Tuy cùng là các bước đầu của quy trình phát triển, nhưng vai trò và phạm vi khác nhau:
Kiến trúc phần mềm là cái nhìn tổng thể, mang tính chiến lược, xác định cấu trúc lớn, cách thức tương tác giữa các phần quan trọng.
Thiết kế phần mềm đi sâu hơn, trình bày chi tiết cách các thành phần vận hành và phối hợp với nhau.
Coding là bước sau cùng, nơi các lập trình viên hiện thực hóa thiết kế đã đề ra bằng clean code tuân thủ các design patterns và nguyên tắc solid.
Thiết kế là cầu nối giữa tư duy hệ thống và hiện thực kỹ thuật, là công cụ giúp các nhóm kỹ thuật như Google, Microsoft, Amazon, IBM, và Oracle xây dựng nên những sản phẩm mạnh mẽ và dễ mở rộng.
Trong quá trình thiết kế phần mềm, việc tuân thủ các nguyên tắc nền tảng giúp tạo ra hệ thống dễ bảo trì, dễ mở rộng và hạn chế tối đa lỗi phát sinh trong quá trình phát triển. Dưới đây là các nguyên tắc thiết kế phần mềm phổ biến, được áp dụng rộng rãi trong thực tiễn bởi các kỹ sư phần mềm và lập trình viên ở nhiều cấp độ.
2.1. Nhóm nguyên tắc chung, dễ áp dụng
KISS DRY YAGNI trong thiết kế phần mềm
Các nguyên tắc dưới đây mang tính cơ bản, dễ hiểu và có thể áp dụng cho hầu hết dự án phần mềm từ nhỏ đến lớn:
KISS (Keep It Simple, Stupid): Hãy luôn giữ cho thiết kế đơn giản nhất có thể. Thiết kế càng đơn giản thì càng dễ đọc, dễ hiểu, giảm thiểu chi phí phát triển và bảo trì phần mềm về sau.
DRY (Don’t Repeat Yourself): Tránh lặp lại mã nguồn và logic trong nhiều phần của hệ thống. Việc trùng lặp sẽ khiến hệ thống khó cập nhật, dễ lỗi và làm giảm tính linh hoạt.
YAGNI (You Aren’t Gonna Need It): Chỉ nên triển khai những gì thực sự cần thiết ở thời điểm hiện tại. Đừng dự đoán và phát triển những tính năng mà có thể sẽ không bao giờ sử dụng đến, điều này giúp tiết kiệm tài nguyên và tăng hiệu suất phát triển.
2.2. Nhóm nguyên tắc SOLID trong thiết kế phần mềm
Bộ nguyên tắc SOLID là tập hợp 5 nguyên tắc quan trọng trong công đoạn thiết kế phần mềm, giúp xây dựng hệ thống tính dễ đọc cao, có khả năng thay đổi mà không ảnh hưởng đến toàn bộ hệ thống. Đây là nền tảng quan trọng trong lập trình hướng đối tượng, thường xuyên được áp dụng bởi các doanh nghiệp lớn như Amazon, Microsoft, Google, IBM, và Oracle.
S – Single Responsibility Principle (Nguyên tắc Trách nhiệm Duy nhất): Một lớp hoặc module chỉ nên có một lý do duy nhất để thay đổi. Điều này giúp giảm coupling và tăng cohesion – một yếu tố quan trọng trong kiến trúc phần mềm bền vững.
O – Open/Closed Principle (Nguyên tắc Mở/Đóng): Các thành phần phần mềm nên mở để mở rộng, nhưng đóng để chỉnh sửa. Khi có yêu cầu mới, ta nên mở rộng bằng cách kế thừa hoặc thêm lớp mới, thay vì chỉnh sửa trực tiếp phần cũ – tránh ảnh hưởng đến các phần đã ổn định.
L – Liskov Substitution Principle (Nguyên tắc Thay thế của Liskov): Lớp con có thể thay thế lớp cha mà không làm thay đổi tính đúng đắn của chương trình. Vi phạm nguyên tắc này thường gây ra lỗi nghiêm trọng trong hệ thống, đặc biệt khi làm việc với design patterns phức tạp.
I – Interface Segregation Principle (Nguyên tắc Phân tách Giao diện): Không nên tạo ra những giao diện lớn mà bắt client phải sử dụng những phương thức họ không cần. Thay vào đó, nên chia nhỏ giao diện để tăng tính linh hoạt và dễ bảo trì.
D – Dependency Inversion Principle (Nguyên tắc Đảo ngược Phụ thuộc): Module cấp cao không nên phụ thuộc trực tiếp vào module cấp thấp; cả hai nên phụ thuộc vào abstraction. Điều này giúp giảm sự ràng buộc giữa các phần trong hệ thống và thúc đẩy khả năng kiểm thử phần mềm hiệu quả hơn.
Việc hiểu và áp dụng đúng các nguyên tắc thiết kế phần mềm không chỉ giúp sản phẩm đạt chất lượng cao mà còn tiết kiệm đáng kể chi phí và thời gian trong toàn bộ vòng đời dự án. Đây chính là nền tảng cho việc xây dựng phần mềm hiện đại, hiệu quả và bền vững.
3. Lợi ích vượt trội khi áp dụng nguyên tắc thiết kế phần mềm
Kiến trúc đơn giản giúp mở rộng và bảo trì dễ dàng.
Việc áp dụng đúng các nguyên tắc thiết kế phần mềm không chỉ là một lựa chọn kỹ thuật mà còn là chiến lược dài hạn giúp doanh nghiệp và đội ngũ kỹ thuật phát triển phần mềm chất lượng, hiệu quả và linh hoạt. Dưới đây là những lợi ích rõ rệt mà bạn sẽ nhận được khi đầu tư nghiêm túc ở công đoạn thiết kế phần mềm.
3.1. Cải thiện chất lượng mã nguồn: Dễ đọc, dễ hiểu, ít lỗi hơn
Khi thiết kế được thực hiện đúng cách, mã nguồn sẽ có cấu trúc rõ ràng, tách biệt các thành phần theo đúng nguyên tắc thiết kế phần mềm, từ đó nâng cao tính dễ đọc và dễ hiểu cho cả lập trình viên mới và các thành viên lâu năm. Điều này giúp giảm thiểu lỗi lập trình, tăng tính ổn định của hệ thống, đồng thời tạo tiền đề tốt cho việc mở rộng và refactoring sau này.
3.2. Tăng khả năng bảo trì và mở rộng (scalability)
Một trong những yếu tố sống còn của dự án phần mềm là khả năng thích ứng với các thay đổi trong tương lai. Áp dụng các nguyên tắc solid và tư duy clean code giúp hệ thống dễ dàng thêm mới tính năng, sửa lỗi mà không ảnh hưởng đến toàn bộ cấu trúc. Đây cũng là cách hiệu quả để giảm thiểu technical debt và đảm bảo khả năng mở rộng về sau.
3.3. Giảm thiểu bug và chi phí phát triển/bảo trì
Thiết kế tốt giúp dự báo và xử lý sớm các rủi ro kỹ thuật trước khi bước vào giai đoạn coding. Nhờ đó, đội ngũ kỹ sư phần mềm có thể tránh được những lỗi nghiêm trọng khó khắc phục về sau. Việc giảm bug đồng nghĩa với việc tiết kiệm đáng kể chi phí phát triển, bảo trì phần mềm và kiểm thử phần mềm.
3.4. Nâng cao hiệu suất làm việc nhóm
Khi mọi thành viên trong nhóm cùng hiểu và tuân thủ cùng một cấu trúc thiết kế, việc phối hợp giữa các thành viên sẽ trở nên dễ dàng hơn. Hệ thống được tổ chức logic sẽ giúp các project manager, tech lead và lập trình viên làm việc hiệu quả hơn, giảm thời gian trao đổi và hạn chế hiểu sai yêu cầu. Đây là một lợi thế lớn trong các mô hình phát triển linh hoạt như phát triển phần mềm agile.
3.5. Dễ dàng kiểm thử và refactoring
Một hệ thống được thiết kế tốt với các design patterns phù hợp sẽ giúp việc viết unit test dễ dàng và logic hơn. Từ đó, việc kiểm thử phần mềm trở nên hiệu quả, tăng độ tin cậy của sản phẩm. Ngoài ra, khả năng refactoring cũng được nâng cao, cho phép cải tiến mã mà không lo phá vỡ cấu trúc chung.
4. Kết luận
Thiết kế phần mềm là yếu tố then chốt trong mọi dự án phần mềm, giúp nâng cao hiệu suất, khả năng mở rộng và giảm chi phí bảo trì phần mềm. Việc áp dụng đúng nguyên tắc thiết kế phần mềm, đặc biệt là nguyên tắc solid, sẽ giúp sản phẩm bền vững và dễ phát triển lâu dài.
Hãy xem thiết kế là một kỹ năng cốt lõi mà mọi kỹ sư phần mềm và lập trình viên nên rèn luyện. Bắt đầu học và áp dụng ngay hôm nay để tạo ra phần mềm chất lượng như cách các công ty lớn như Google, Amazon, hay Microsoft đang thực hiện.