Hế lô anh em. Ở note trước, mình có note một số ý về Use Case, cũng như cách vẽ một Use Case Diagram. Anh em có thể xem lại ở đây. Kỳ này, mình sẽ note về cách viết đặc tả Use Case sao cho đơn giản, nhưng súc tích và hiệu quả nhất có thể nhé.
Ô kayyyy lét xờ gâuuuu 😎
1. Đặc tả Use Case là gì?
Giả dụ trường hợp ở đây: Anh em đã có Use Case Diagram, đã capture được tổng quan các requirement theo góc nhìn của người dùng. Đó là thứ để chúng ta bỏ vào các document như FRD hoặc SRS.
Tuy nhiên, Use Case Diagram khá là chung chung để các stakeholders có cái nhìn trực quan về những requirements được mô tả. Do đó, anh em cần phải diễn đạt nó một cách chi tiết hơn nữa.
Use Case Specification, hay nói cách khác là ĐẶC TẢ USE CASE sẽ giúp anh em làm chuyện đó.
2. Các thành phần có trong Use Case Specification
Đặc tả Use Case tồn tại dưới dạng một cái bảng ghi chú. Nó mô tả tất tần tật các thông tin về Use Case, giúp anh em đọc vào một phát là hiểu ngay Use Case Diagram nó vẽ vậy là ý gì.
Một cách tổng quan, Use Case Specification gồm 3 thành phần chính:
2.1. Summary
- Use Case Name: Tên Use Case
- Use Case ID: Mã Use Case
- Use Case Description: Tóm gọn nhanh sự tương tác được thể hiện trong Use Case là gì.
- Actor: Những đối tượng thực hiện sự tương tác trong Use Case.
- Priority: Mức độ ưu tiên của Use Case so với các Use Case còn lại trong dự án.
- Trigger: Điều kiện kích hoạt Use Case xảy ra.
- Pre-Condition: Điều kiện cần để Use Case thực hiện thành công.
- Post-Condition: Những thứ sẽ xuất hiện sau khi Use Case được thực hiện thành công.
2.2. Flow
- Basic Flow: luồng tương tác CHÍNH giữa các Actor và System để Use Case thực hiện thành công.
- Alternative Flow: luồng tương tác THAY THẾ giữa các Actor và System để Use Case thực hiện thành công.
- Exception Flow: luồng tương tác NGOẠI LỆ giữa các Actor và System mà Use Case thực hiện thất bại.
2.3. Additional Information
- Business Rule: các quy định về mặt Business mà hệ thống bắt buộc phải nghe theo, làm theo.
- Non-Funtional Requirement: Vì Use Case chỉ dùng để thể hiện Functional Requirement, nên anh em phải bổ sung các yêu cầu về Non-Functional ở đây luôn.
…………………………………………………………………..
Một số thông tin bổ sung thêm cho anh em.
Use Case Description chỉ cần mô tả ngắn gọn theo cú pháp của User Story: Là “Actor”, tui muốn làm “Use Case Name”, để đạt được “mục đích – lý do” gì đó. Đẹp là không quá 3 dòng cho phần tóm gọn Use Case này.
Business Rule là các quy định, hoặc các policy của khách hàng. Có sao ghi vậy. Vì đây là giai đoạn tài liệu hóa yêu cầu thông qua Use Case, nên anh em cứ liệt kê hết các Business Rule có liên quan trong này nhé.
3. Ví dụ về đặc tả Use Case
Anh em hãy cùng xét tới một Use Case đơn giản nhất, đó là Đăng nhập.
Ví dụ đối với diễn đàn Medium đi chẳng hạn. Chúng ta sẽ vẽ Use Case Diagram và viết đặc tả Use Case cho phân hệ quản lý xác thực người dùng như sau.
USE CASE SPECIFICATION
Use Case ID | UC-1.1 |
Use Case Name | Đăng nhập |
Description | Là người dùng, tôi muốn đăng nhập vào ứng dụng để sử dụng dịch vụ từ ứng dụng. |
Actor(s) | Khách hàng, Google, Facebook |
Priority | Must Have |
Trigger | Người dùng muốn đăng nhập vào ứng dụng Medium |
Pre-Condition(s): |
|
Post-Condition(s): |
|
Basic Flow | 1. Người dùng truy cập ứng dụng Medium.2. Người dùng chọn phương thức đăng nhập bằng tài khoản Medium
3. Người dùng nhập tài khoản Medium và chọn lệnh đăng nhập 4. Hệ thống xác thực thông tin đăng nhập thành công và cho phép người dùng truy cập ứng dụng 5. Hệ thống ghi nhận hoạt động đăng nhập thành công vào Activity Log. |
Alternative Flow | 2a. Người dùng chọn phương thức đăng nhập bằng tài khoản Gmail2a1. Hệ thống chuyển sang màn hình đăng nhập của Google
3a. Người dùng nhập tài khoản Google và chọn lệnh đăng nhập 4a. Google xác thực thông tin đăng nhập thành công và cho phép người dùng truy cập ứng dụng Use Case tiếp tục bước 5. 2b. Người dùng chọn phương thức đăng nhập bằng tài khoản Facebook 2b1. Hệ thống chuyển sang màn hình đăng nhập của Facebook 3b. Người dùng nhập tài khoản Facebook và chọn lệnh đăng nhập 4b. Facebook xác thực thông tin đăng nhập thành công và cho phép người dùng truy cập ứng dụng Use Case tiếp tục bước 5. |
Exception Flow | 4c. Hệ thống xác thực thông tin đăng nhập không thành công và hiển thị thông báo.4c1. Người dùng chọn lệnh hủy đăng nhập. Use Case dừng lại. 4c2. Người dùng chọn lệnh lấy lại mật khẩu 4c3. Người dùng chọn lệnh khóa tài khoản |
Business Rules | BR1.1-1: Người dùng nhập sai thông tin đăng nhập ở lần thứ 6 liên tiếp sẽ bị khóa tài khoản 30 phút. |
Non-Functional Requirement | NFR1.1-1: Time out cho màn hình đăng nhập dưới 60 giây.NFR1.1-2: Mật khẩu của người dùng phải được hash bằng MD5. |
Đó là đặc tả Use Case. Hi vọng ví dụ này đủ để anh em hình dung, mường tượng ra được chân tay mặt mũi của Use Case Specification.
Anh em có thể làm một Use Case Specification cho một Use Case (tức một hình Oval). Vậy ở ví dụ trên thì anh em sẽ có 1 sơ đồ Use Case Digram, gồm 5 Use Case, thì sẽ ứng với 5 Use Case Specification.
Tuy nhiên, có thể anh em sẽ thấy confuse ở một số chỗ…
4. Một số nhầm lẫn hay gặp
Thường khi làm đặc tả Use Case mình sẽ rất dễ bị nhầm lẫn ở hai chỗ:
- Trigger và Pre-Condition
- Alternative Flow và Exception Flow.
4.1. Trigger và Pre-Condition
Trigger nghĩa là một thứ gì đó để kích hoạt cho Use Case chạy, khởi xướng cho Use Case chạy. Còn Pre-Condition nghĩa là một thứ gì đó, mà phải có nó thì Use Case mới chạy được.
Use Case có thể có Pre-Condition hoặc không, nhưng Trigger thì thường phải có.
Ví dụ Use Case rút tiền tại máy ATM.
- Use Case: Khách hàng rút tiền
- Actor: Khách hàng
- Trigger: Khách hàng thực hiện lệnh rút tiền.
- Pre-Condition:
- Khách hàng đã đút thẻ vào máy ATM.
- Số dư lớn hơn 50,000đ.
Tức Use Case chỉ xảy ra khi ông khách hàng này ổng thực hiện lệnh rút tiền. Cụ thể thì có thể là ổng bấm cái nút “Rút tiền” trên màn hình. Đó là trigger để Use Case xảy ra.
Còn Pre-Condition là các điều kiện cần phải có để ông này ổng rút tiền thành công. Vì ổng không thể nào rút tiền được nếu trong tài khoản không còn tiện hoặc ổng chưa đút thẻ vô máy.
Hoặc Output (hoặc Post-Condition) của Use Case này có thể là trigger của Use Case khác.
Cũng ở ví dụ rút tiền tại máy ATM bên trên, Post-Condition ở đây có thể là:
- Khách hàng nhận được tiền mặt sau khi thực hiện rút tiền.
- Số dư của khách hàng đã bị trừ đi khoảng tiền đã rút.
Nếu những post-conditions này xảy ra thì Use Case: Rút tiền tại máy ATM đã được thực hiện xong. Và đồng thời nó cũng là trigger cho Use Case tiếp theo: Gửi tin nhắn SMS thông báo cho khách hàng.
…
Để phân biệt rõ hơn giữa Trigger và Pre-Condition thì anh em cứ tưởng tượng như thế này…
Trong giải điền kinh xóm chiếu mở rộng, ông Tèo là trọng tài, ông Tủn là vận động viên thi đấu. Cả 2 ông này đều là Actor. Một ông là Actor ở vai trò trọng tài, còn một ông là Actor ở vai trò vận động viên tham dự.
Use Case thì thể hiện sự tương tác của Actor trong một môi trường/ phạm vi cụ thể nào đó. Vậy ở đây, Use Case thể hiện sự tương tác chạy đua trong một giải điền kinh, mà cả Actor trọng tài và Actor vận động viên đều tham gia vào.
Vậy thì đâu là Trigger, và đâu là Pre-Condition?
Trigger chính là cò nổ của ông Tèo trọng tài. Ổng giơ súng lên trời, bắn cái đùng, là ông Tủn vận động viên bắt đầu chạy. Hay nói cách khác, khi cò nổ, thì là lúc Use Case bắt đầu.
Còn Pre-Condition là những điều kiện tiên quyết mà ông Tủn phải ô kê hết thì mới cho ổng tham dự giải đấu, ví dụ:
- Nặng trên 50km.
- Không có tiền sử trĩ hay táo bón kinh niên
- Đã vượt qua vòng loại ở giải trẻ cấp ao làng.
- ….
Ví dụ vậy, không đạt được những điều kiện này, ông Tủn không được phép tham gia chạy ở giải điền kinh xóm chiếu mở rộng. Hay nói cách khác, không đạt được những điều kiện này, Use Case sẽ không được thực hiện thành công.
Đó là sự khác biệt giữa Trigger và Pre-Condition.
Một điểm nữa là có thể anh em sẽ cảm thấy bối rối khi phân biệt đâu là Trigger và đâu là bước đầu tiên trong Basic Flow của Use Case. Vì có thể Trigger sẽ là bước đầu tiên của Basic Flow, hoặc không.
Tuy nhiên thực tế thì anh em cũng không cần quá quan tâm vấn đề này làm gì. Trigger trong Use Case có thể là bất kỳ thứ gì, có thể là tác động từ phía người dùng, hoặc tác động từ chính hệ thống. Miễn nó thể hiện được hình ảnh cò nổ để Use Case chạy là được.
4.2. Alternative Flow và Exception Flow
Flow là các luồng tương tác giữa các Actor và hệ thống với nhau. Basic Flow là luồng tương tác chính, là happy case đơn giản nhất có thể xảy ra.
Ví dụ chạy từ Quận 1 ra Quận 7 thì cứ men theo Cách Mạng Tháng 8 ra Hoàng Diệu, rồi cứ cắm đầu Nguyễn Văn Linh là ra. Đó chính là Basic Flow, là đường ngắn nhất, cơ bản nhất.
Nhưng thực tế còn rất nhiều đường khác mà anh em có thể đi: như quẹo qua Quận 8, đi Võ Văn Kiệt, Phạm Thế Hiển…. Hoặc thậm chí đi giữa đường xe bị lủng bánh, không có chỗ vá, phải dắt bộ ngược zề, và không qua được Quận 7 nữa, chuyến đi thất bại.
Những trường hợp đó mình sẽ gom hết lại, và quy nó thành Alternative Flow hoặc Exception Flow. Cụ thể:
- Alternative Flow: những hướng khác giúp anh em đi từ Quận 1 tới Quận 7 thành công, như các tuyến đường khác chẳng hạn.
- Exception Flow: những trường hợp mà nó ngăn chặn, khiến cho anh em không qua Quận 7 được, làm kế hoạch qua Quận 7 mình bị thất bại, như: lủng xe, hết xăng, bị công an giam xe…
Vậy xét qua lăng kính Use Case, đặc tính của 3 luồng tương tác này như sau:
BASIC FLOW | ALTERNATIVE FLOW | EXCEPTION FLOW | |
Ý ĐỒ THỂ HIỆN | Luồng đi đơn giản nhất | Các luồng đi khác | Các luồng đi khác |
KẾT QUẢ DẪN TỚI | Use Case xảy ra thành công | Use Case xảy ra thành công | Use Case xảy ra thất bại |
…
Ví dụ trong mô hình quản lý e-Learning, anh em có một Use Case: Hủy kích hoạt tài khoản học viên chẳng hạn. Use Case này sẽ có các Flow như sau.
BASIC FLOW
- Admin mở tài khoản học viên cần hủy kích hoạt
- Hệ thống hiển thị màn hình thông tin học viên
- Admin chọn lệnh hủy kích hoạt
- Hệ thống yêu cầu nhập mã OTP để xác nhận
- Admin nhập đúng mã OTP để xác nhận lệnh hủy kích hoạt
- Hệ thống kiểm tra mã OTP và tiến hành hủy kích hoạt
- Hệ thống hiển thị thông báo đã hủy kích hoạt.
ALTERNATIVE FLOW
1a. Admin chọn học viên cần hủy kích hoạt ở lưới học viên.
Use Case tiếp tục bước 3.
4a. Admin chọn phương thức xác nhận khác: Xác nhận qua reCaptcha
4a1. Hệ thống hiển thị mã reCaptcha và yêu cầu nhập mã reCaptcha để xác nhận
5a. Admin nhập đúng mã reCaptcha để xác nhận lệnh hủy kích hoạt
6a. Hệ thống kiểm tra mã reCaptcha và tiến hành hủy kích hoạt
Use Case tiếp tục bước 7.
EXCEPTION FLOW
5b. Admin nhập sai mã reCaptcha.
5b1. Hệ thống báo lỗi và hủy bỏ lệnh hủy kích hoạt học viên.
Use Case dừng lại.
5c. Admin nhập sai mã OTP.
5c1. Hệ thống báo lỗi và hủy bỏ lệnh hủy kích hoạt học viên.
Use Case dừng lại.
*Ghi chú:
Đối với luồng chính (Basic Flow), anh em sẽ đánh số thứ tự xuất hiện 1, 2, 3, 4, 5…., theo số nguyên. Còn đối với Alternative hay Exception Flow, anh em nên thêm các ký tự chữ cái a, b, c, d… bên cạnh để làm dấu cho dễ phân biệt.
Và để dễ hình dung và quản lý các steps có trong flow hơn, mình sẽ bonus thêm cho anh em phần sau đây, kaka 😎
4.3. Bonus: Mô tả Flow sao cho ngầu
Mình cá là 69% anh em lần đầu viết flow cho use case sẽ thấy hơi… rối bời, và không biết tổ chức các steps sao cho logic hết.
Để giải quyết vấn đề này, hãy vẽ nó. Một lần nữa, việc vẽ lên ngôi.
Dùng chữ khó quá thì chúng ta phải dùng hình. Anh em sẽ thể hiện Basic Flow, Alternative Flow và Exception Flow kèm hình vẽ như sau.
(Hình dưới có thể hiển thị không tốt lắm cho điện thoại, nên anh em xem trên laptop để có trải nghiệm tốt nhất nhé)
BASIC FLOW1. Admin mở tài khoản học viên cần hủy kích hoạt
2. Hệ thống hiển thị màn hình thông tin học viên 3. Admin chọn lệnh hủy kích hoạt 4. Hệ thống yêu cầu nhập mã OTP để xác nhận 5. Admin nhập đúng mã OTP để xác nhận lệnh hủy kích hoạt 6. Hệ thống kiểm tra mã OTP và tiến hành hủy kích hoạt 7. Hệ thống hiển thị thông báo đã hủy kích hoạt. |
ALTERNATIVE FLOW1a. Admin chọn học viên cần hủy kích hoạt ở lưới học viên. Use Case tiếp tục bước 3. 4a. Admin chọn phương thức xác nhận khác: Xác nhận qua reCaptcha 4a1. Hệ thống hiển thị mã reCaptcha và yêu cầu nhập mã reCaptcha để xác nhận 5a. Admin nhập đúng mã reCaptcha để xác nhận lệnh hủy kích hoạt 6a. Hệ thống kiểm tra mã reCaptcha và tiến hành hủy kích hoạt |
EXCEPTION FLOW5b. Admin nhập sai mã reCaptcha.
5b1. Hệ thống báo lỗi và hủy bỏ lệnh hủy kích hoạt học viên. 5c. Admin nhập sai mã OTP. 5c1. Hệ thống báo lỗi và hủy bỏ lệnh hủy kích hoạt học viên. |
Đó là những gì mình dùng để mô tả Flow, một cách rõ ràng, logic và sáng sủa nhất có thể.
Các step ở Basic Flow, Alternative Flow hay Exception Flow nó đều đối xứng với nhau, thể hiện rõ thằng nào là thay thế của thằng nào, và thằng nào là Exception của thằng nào.
Riêng luồng tương tác nào Exception thì anh em để dạng nét đứt cho dễ phân biệt.
Các step bắt đầu (có thể là Trigger hoặc không) và kết thúc anh em hãy tô màu đen, để các Stakeholder có thể nắm được độ phức tạp của Use Case một cách nhanh nhất.
Còn đối với các Exception Flow – những flow làm fail Use Case, anh em hãy tô đỏ các step cuối cùng mà Use Case xảy ra không thành công (chẳng hạn step 5b1 hoặc 5c1).
.
.
.
TÓM GỌN
Đặc tả Use Case về bản chất rất đơn giản vì nó mang ngôn ngữ tự nhiên của người dùng. Vấn đề chỉ nằm ở một số điểm hay nhầm lẫn và cách chúng ta tổ chức các Use Case như thế nào cho logic và hiệu quả mà thôi 🙂
5. Chốt lại: làm Use Case được lợi ích gì?
Mình sẽ tóm gọn giá trị của Use Case (cả Diagram và Specification) qua 2 bài notes về Use Case như sau:
- Use Case giúp anh em thể hiện được rõ Requirement theo góc nhìn của người dùng cuối (rất quan trọng, vì nó giúp mình hiểu rõ bản chất vấn đề hơn).
- Theo đó, những gì được thể hiện trong Use Case rất tự nhiên, ai đọc vô cũng hiểu hết trơn.
- Use Case có thể chia nhỏ phạm vi theo nhiều phân hệ, hoặc cụm tính năng. Và nó cũng có thể nhìn dưới góc độ high-level. Do đó, dễ hơn cho mình rất nhiều để cover đủ các yêu cầu trong một dự án lớn.
- Use Case là bước đệm tuyệt vời giữa việc mô tả tổng quát và mô tả chi tiết sự tương tác thông qua Sequence Diagram (con nhà UML).
- Use Case được dùng để tạo các Epic, và các User Stories trong dự án Scrum, làm mọi thứ được nhất quán và rất chặt chẽ.
- Use Case còn được dùng để tạo các Test Case sau này.
…
Hi vọng anh em đã hiểu rõ hơn về Use Case, về bản chất cũng như cách ứng dụng nó vào thực tế sao cho hiệu quả. Nếu có gì cần trao đổi thì cứ còm men bên dưới cho mình nhé!
Bái bai và hẹn gặp lại 😎
06/06/2019 at 10:58 chiều
cho em hỏi 1 usecase có thể có nhiều actor tham gia không, ví dụ use case hoadon thì theo ý em có 2 actor tham gia là khách hàng và nhân viên
15/06/2019 at 8:00 sáng
Được nhé em. Nhưng thực tế vẽ Use Case thì các Actor thường ít bị overlap hành vi như vậy lắm. Có thể do cách em chia Use Case chưa rõ. Lưu ý là User case phải là hành động như bài trên anh có note nhé. Ví dụ: In hóa đơn hay Xuất hóa đơn hay ABC hóa đơn. Nếu chia rõ như vầy thì khả năng overlap sẽ ko có nhé em, việc ai người nấy làm. Nên simplify quy trình lại.
11/07/2019 at 7:27 sáng
Anh Thịnh ơi, anh dùng phần mềm nào để vẽ use case vậy anh? Đặc biệt là các ký hiệu flow á anh?
13/07/2019 at 2:35 chiều
Hi Vũ, anh dùng Draw.IO nhé
14/07/2019 at 3:24 chiều
Em cảm ơn anh nhiều
09/09/2019 at 11:10 sáng
Anh Thịnh ơi, em vẫn chưa hiểu lắm về Non-Functional Requirement, anh có thể giúp em hiểu chi tiết hơn được chứ ạ!!
14/09/2019 at 2:15 chiều
Hi Trường, a có note 2 bài về Non-functional Req., em xem thêm ở đây nhé: https://thinhnotes.com/chuyen-nghe-ba/non-functional-requirements-va-chuyen-ve-cai-xo-be/
14/09/2019 at 10:26 chiều
em cảm ơn anh nhaaa!!!
15/09/2019 at 10:56 sáng
Anh ơi, cái hình vẽ minh hoạ cho đặc tả Use Case “Hủy kích hoạt tài khoản học viên”, phần Exception Flow, bước <5c. Admin nhập sai mã OTP.>, theo em thì phải đi ra từ bước <5. Admin nhập mã OTP ...> của Basic Flow ( chứ không phải là từ bước <4a1...> của Alternative Flow ). Cho em hỏi có đúng vậy không anh?
15/09/2019 at 4:11 sáng
Sr em a vẽ bị nhầm chỗ đó, a sửa lại rồi, cảm ơn em nhé ^^
15/09/2019 at 2:12 chiều
Anh ơi làm sao để kết nối với anh ạ. Em có inbox anh trên fb. Anh check tin nhắn em với nhé ạ <3
15/09/2019 at 7:38 sáng
Ok em nhé
15/09/2019 at 2:22 chiều
Thịnh ơi, các exceptional flow là để thể hiện việc use case diễn ra không thành công. Mình có cần ghi rõ việc hệ thống sẽ hủy/ngăn không cho user thực hiện được mục tiêu của họ ko ? (Ngăn tạo, sửa, xóa, đặt hàng…)
15/09/2019 at 3:30 sáng
Hi Thông, mình chưa hiểu ý bạn lắm. Mình thể exceptional flow khi mình muốn diễn tả ngữ cảnh của mình có trường hợp là user làm cái đó thì use case sẽ bị fail. Còn việc bạn có chặn k cho user làm hay không thì lại là 1 chức năng bạn cần mô tả trong doc, bạn có thể mô tả bằng Bpmn hoặc bằng business rules gì đó là tuỳ 🙂 Nếu còn có gì chưa rõ thì cứ nhắn mình nhé!
03/12/2019 at 8:40 sáng
Anh ơi, cho em hỏi là nếu có exception của normal flow tại bước 5 vs alternative flow bước 5a thì mình ghi exception của normal flow không hay là cả 2 ạ ?
07/12/2019 at 9:34 sáng
Hi em, anh vẫn chưa hiểu ý e hỏi là gì, em note rõ hơn hoặc vẽ hình cho rõ nhé.
07/12/2019 at 8:13 chiều
em có inbox trên fb cho anh rồi ấy ạ.
25/01/2020 at 9:28 sáng
Hôm nào viết riêng 1 series về User Flow đi Thịnh ơi 😀
25/01/2020 at 9:30 sáng
User Flow tổng thể ấy, có cái UFD thì phải
27/01/2020 at 1:30 chiều
Cái này cũng hay, để mai mốt e chiêm nghiệm thử xem có gì hay ho ko, viết ra chém gió vs anh em xem góp ý chơi haha
28/01/2019 at 6:02 chiều
Hehe, ngóng ngóng :3 Kể ra thì nhìn cái BPMN là rõ ràng kha khá về UFD đó, cơ mà nếu đào sâu chắc có nhiều chỗ vi diệu 😀
29/04/2020 at 10:23 sáng
Hay quá ạ. Rất hữu ích.
Cảm ơn anh nha 😁
02/05/2020 at 11:06 sáng
Cảm ơn Chi nhé 🙂
17/07/2020 at 9:01 sáng
Em biết tới web anh Thịnh tầm 1 năm trước, mà h đọc lại mới thấy thấm =)))
18/07/2020 at 11:56 chiều
Cố gắng đọc nhiều vô để a lên view nha em :))))
27/05/2022 at 10:31 chiều
Anh Thịnh cho em hỏi với ạ.
Em có UC1. tạo chứng từ kế toán rồi gen ra template là ủy nhiệm chi, thì ủy nhiệm chi là 1 UC là include hay extend ạ?
Em có UC2. Tại các bước phê duyệt đều phải ký số. Ký số lặp lại ở nhiều role khác nhau thì vẽ ntn để tận dụng mà không overlap ạ?
Em có UC3. Hạch toán thanh toán chi phí có hóa đơn và tìm kiếm các khoản chi có hóa đơn đó. Vậy tìm kiếm là 1 chức năng hay 1 UC ạ?
Em có UC4. Tích hợp giữa nhiều hệ thống với nhau thì vẽ ntn ạ?
VD: Nhập liệu trên BPM tích hợp ESB để truyền dữ liệu sang hệ thống Flexcube. Chiều ngược lại, từ Flexcube trả kết quả về ESB rồi ESB truyền về BPM.
28/05/2022 at 2:56 chiều
Hi Oanh, Use Case phải là 1 sự “TƯƠNG TÁC” giữa các actor với nhau nhé em, chứ k phải 1 danh từ hay 1 object.
VD1: Tạo chứng từ kế toán là UC1. Xuất ủy nhiệm chi là UC2. UC2 là optional, có thể có hoặc có thể không với UC1, nên UC2 extend của UC1.
VD2: Ký điện tử là UC3. Ở bất kỳ các tương tác nào khác mà có ký điện tử thì em đều vẽ nó quan hệ include/ extend với UC3 này (tùy vào ký điện tử có bắt buộc với quy trình mà e đang mô tả hay không)
VD3: Do em chưa hiểu rõ bản chất UC nên mới hỏi câu này. UC phải là 1 sự tương tác giữa các actor nhé. Map vào góc nhìn hệ thống thì nó là 1 chức năng tìm kiếm của hệ thống. Còn vẽ UC thì Tìm kiếm cũng là 1 UC riêng biệt hẳn hoi, có thể dùng để utilize lại nhiều lần.
VD4: UC mô tả tương tác giữa các actor. Actor ko chỉ là người mà còn có thể là system, giữa các system với nhau. Nên sự tương tác ở đây là gì thì cứ vẽ như bình thường thôi em (như ví dụ e có nói)
12/08/2020 at 2:32 chiều
Bài viết rõ ràng và dễ hiểu quá anh ạ. Cảm ơn anh nhiều nha 😀
Nếu có thể, hôm nao anh viết thêm về Business Rules được không ạ?
12/08/2020 at 4:58 chiều
Cảm ơn Tan nhiều, mốt có thời gian a viết về Biz Rules sau nhé 😀
14/09/2020 at 4:37 sáng
Cám ơn bạn rất nhiều, bài viết đọc cái hiểu ngay, nội dung cực hữu ích bạn ạ
14/09/2020 at 4:54 chiều
Cảm ơn Nam
14/09/2020 at 1:42 chiều
bài viết rất hay và cụ thể
14/09/2020 at 4:17 sáng
Cảm ơn Vũ nhé 🙂
14/09/2020 at 2:35 chiều
hay, quá hay anh ạ, mong anh tiếp tục có những bài viết mang tính hướng dẫn như này đối với các biểu đồ khác ạ
14/09/2020 at 4:56 sáng
Cảm ơn Tuyển, để mình xem cái nào hay dùng, đc thì mình note lại cho ae
14/09/2020 at 11:41 chiều
Bosch có tuyển BA ngoài hà nội bạn ới mình với nhé! Cảm ơn bạn
15/10/2020 at 3:04 sáng
Anh ui khi em viết Usecase specification thì phát hiện ra thêm khái niệm Recovery Flow rất hữu ích từ bài viết sau, anh có thể đọc tham khảo để bổ sung cho bài viết của mình để nó hay hơn ạ.
https://www.batimes.com/articles/use-case-goals-scenarios-and-flows.html
15/10/2020 at 7:57 sáng
Cảm ơn Vĩ, để anh đọc nhé 🙂
11/11/2020 at 11:24 sáng
Cảm ơn anh về bài viết, anh cho em hỏi thêm, trong tài liệu của em có cả activity diagram và usecase đều có mô tả chi tiết. Vậy ở usecase em có thể bỏ đi alternative flow và exception flow vì trong activity đã thể hiện rõ được không? Vì em thấy nếu ghi nhận đủ thì tài liệu khá dài dòng ạ
22/11/2020 at 2:56 chiều
Hi Liên, thoải mái em nhé, làm sao coi ổn là được :)) Miễn activity diagram của em cover được nhiều trường hợp có thể xảy ra là ok 😀
22/04/2021 at 3:59 chiều
Cảm ơn anh nhiều về bài viết, rất hay và rất dễ hiểu ạ, Monng anh có thể ra thêm về phần Class Diagram ạ :<
22/04/2021 at 6:26 chiều
Cảm ơn em nhé. A có bài note về ERD em xem tham khảo thay cho Class Diagram nhé
21/05/2021 at 10:21 chiều
Hi anh,
Anh có thể cho e xin 1 mẫu tài liệu SRS được ko ạ?
Nếu có thể thì em muốn được biết về quy trình phân tích 1 hệ thống phần mềm và các tài liệu mô tả từ đầu đến cuối. không biết anh có thể chia sẻ được ko ạ. nếu có anh giúp em gửi vào địa chỉ: [email protected] ạ
Em xin chân thành cảm ơn!
22/05/2021 at 12:20 chiều
Hi Minh, tài liệu thì mỗi nơi mỗi kiểu, tùy dự án tùy giai đoạn nên có xin template cũng không apply hiệu quả được đâu em. Vả lại nếu đi theo template, mindset của mình thường có xu hướng strictly follow theo các-phần-cần-phải-có-trong-tempalte, mà không đi theo nhu cầu thực tế của dự án.
Sắp tới anh có note 1 bài về chuyện docs này, sẽ note rõ các mục “thường có” trong các docs dự án và các cách mình có thể tùy cơ ứng biến, em theo dõi để tham khảo thêm nhé 🙂
27/07/2021 at 8:51 chiều
anh ơi em muốn hỏi là em làm use case đăng nhập có cả facebook và google thig phần use case đăng kí em có cho 2 actor này vào không
27/07/2021 at 11:10 sáng
Tùy nhé em, thêm hay không cũng ko sao, cũng ko ảnh hưởng gì, quan trọng là Use Case đăng nhập em có note rõ trong Use Case Specification là có authen qua social networks nào là được.
03/08/2021 at 2:22 sáng
Anh viết bài hay và dễ hiểu quá. Lại là fan chè xanh nữa chứ <3
17/08/2021 at 5:44 chiều
thanks em 🙂
03/08/2021 at 2:34 sáng
cho em hỏi với 1 uc mà bao gồm 4 thao tác crud ví dụ như “manage customer” (bao gồm create/read/update) giống như ví dụ ở phần 3.4 ở bài viết về uc diagram của anh. viết flow thì mình sẽ viết như nào ạ? phải viết cả 4 thao tác crud flow sẽ chạy như nào không ạ?
17/08/2021 at 4:49 sáng
Em cũng làm UC Specs như bình thường là được nhé, riêng các mục flow không cần note nhiều, đơn giản thôi là được. Mà thường object nào cũng đều CRUD được, nhưng theo security roles. Nên em có thể gom vô mục đặc tả role để mô tả nhé.
Ví dụ trong những Use Case, mà thể hiện: ở OBJECT đó, users có thể CRUD, thì mình sẽ cho Use Case đó kế thừa từ một Use Case khác được định nghĩa từ trước.
Đơn cử Use Case đó có thể là: Manage data by Role “X” (CRUD hoặc chỉ CRU…, và sẽ đi theo từng role khác nhau).
Hoặc đơn giản và súc tích hơn thì cho link tới 1 Use Case Phân quyền. BA cần định nghĩa phân quyền đó được CRUD những object nào theo roles nào => mình sẽ define một bảng ROLE MATRIX riêng cho Use Case này.
Một cách detail nhất thì Role Matrix có thể được define như sau:
– Cột: thể hiện các quyền có thể làm ví dụ: C, R, U, D, Append, Append To, Attachment…
– Dòng: thể hiện các Object có trong system, ví dụ: Lead, Customer, Bank, Opportunity, Product…
Mỗi bảng như vậy sẽ ứng với 1 ROLE.
Với mỗi điểm giao giữa QUYỀN và OBJECT => Mình sẽ quy định ROLE đó có thể thực hiện “QUYỀN” đó ở mức độ như thế nào đối với “OBJECT” đó theo từng cấp độ Business Unit.
Ví dụ: đối với role Salesperson: Quyền Update object Customer. Nếu thêm 1 layer về Business Unit nữa thì mình phải note rõ: anh Sales ở BU nào thì chỉ có thể update customer của BU đó, hay được update customer của BU ngang cấp hay cao hơn?
Hoặc simple hơn: Cột thể hiện các action có thể làm, Dòng thể hiện các process của Modules đó. Nhưng vẫn cần layer Business Unit để đảm bảo security cho các roles.
03/08/2021 at 6:20 sáng
Cảm ơn ad nhiều nhiều, vì bài viết rất chi tiết và dễ hiểu.Mong ad ra nhiều bài hơn nữa nhé ạ :))
25/12/2021 at 3:27 chiều
Thanks bạn
10/08/2021 at 5:47 sáng
Trường hợp mình tạo ra 1 UC là Quản lý người dùng & có note các tính năng CRUD của UC đó, vậy khi viết đặc tả cho UC, mình sẽ đặc tả cho UC Quản lý người dùng nói chung hay chi tiết ra từng UC như trong note? Nếu chi tiết ra thì việc đánh mã UC cho các UC trong note sẽ thực hiện như thế nào vậy Thịnh? Cám ơn bạn!
17/08/2021 at 1:44 chiều
Hi Lan Anh, thường trong những Use Case, mà thể hiện: ở OBJECT đó, users có thể CRUD, thì mình sẽ cho Use Case đó kế thừa từ một Use Case khác được định nghĩa từ trước.
Ví dụ Use Case đó có thể là: Manage data by Role “X” (CRUD hoặc chỉ CRU…, và sẽ đi theo từng role khác nhau).
Hoặc đơn giản và súc tích hơn thì mình cho link tới 1 Use Case Phân quyền. BA cần định nghĩa phân quyền đó được CRUD những object nào theo roles nào => mình sẽ define một bảng ROLE MATRIX riêng cho Use Case này.
Một cách detail nhất thì Role Matrix có thể được define như sau:
– Cột: thể hiện các quyền có thể làm ví dụ: C, R, U, D, Append, Append To, Attachment…
– Dòng: thể hiện các Object có trong system, ví dụ: Lead, Customer, Bank, Opportunity, Product…
Mỗi bảng như vậy sẽ ứng với 1 ROLE. Với mỗi điểm giao giữa QUYỀN và OBJECT => Mình sẽ quy định ROLE đó có thể thực hiện “QUYỀN” đó ở mức độ như thế nào đối với “OBJECT” đó theo từng cấp độ Business Unit.
Ví dụ: đối với role Salesperson: Quyền Update object Customer. Nếu thêm 1 layer về Business Unit nữa thì mình phải note rõ: anh Sales ở BU nào thì chỉ có thể update customer của BU đó, hay được update customer của BU ngang cấp hay cao hơn?
Hoặc simple hơn: Cột thể hiện các action có thể làm, Dòng thể hiện các process của Modules đó. Nhưng vẫn cần layer Business Unit để đảm bảo security cho các roles.
10/08/2021 at 12:48 chiều
anh có thể ra 1 phần nói cụ thể hơn về business rules được không ạ, em cảm ơn anh
17/08/2021 at 3:41 sáng
Hi em, phần này chắc anh sẽ gom vào ví dụ trong bài note về cách viết tài liệu của BA luôn nhé
31/05/2022 at 10:49 sáng
anh nhớ ra bài này nhé ạ, em mong mãi luôn
07/09/2021 at 4:34 sáng
A ơi a làm về DFD đi ạ
17/08/2021 at 8:16 chiều
DFD anh ít dùng lắm Trinh ơi, nếu nhiều bạn hỏi thì anh note về diagram này nhé
07/09/2021 at 8:23 sáng
comment ủng hộ để ad tiếp tục ra bài mới nhé
14/09/2021 at 3:38 chiều
Thanks Tùng
14/09/2021 at 9:42 sáng
Cho mình hỏi cái này với
4c. Hệ thống xác thực thông tin đăng nhập không thành công và hiển thị thông báo.
4c1. Người dùng chọn lệnh hủy đăng nhập.
Use Case dừng lại.
4c2. Người dùng chọn lệnh lấy lại mật khẩu
Use Case tiếp tục Use Case UC1-3
4c3. Người dùng chọn lệnh khóa tài khoản
Use Case tiếp tục Use Case UC1-4
Giả sử bước 4c2 có nhiều hơn 1 bước thì viết thế nào vậy
4c1.1 hay sao vậy bạn
14/09/2021 at 1:53 chiều
Hi Bảo, tùy cách mình thể hiện nhé. Bạn có thể để 4.1, 4.1.1, hoặc 4.1.1.1…, hoặc chèn a, b, c gì thì tùy. Miễn sao thuận mắt người đọc và dễ cho mình control và tổng hợp các trường hợp nhé!
03/10/2021 at 4:41 sáng
rất có ích
17/10/2021 at 4:37 chiều
Cảm ơn bạn
28/11/2021 at 4:44 sáng
bài viết hay
25/12/2021 at 3:28 chiều
Thanks bạn
23/12/2021 at 2:00 chiều
Cảm ơn anh nhiều nhiều
25/12/2021 at 3:28 chiều
Thanks e nhé
29/12/2021 at 11:46 sáng
Hello anh, anh có cần phải viết đặc tả API và test API không ạ?
01/01/2022 at 11:03 sáng
Hi Mai, thường cái đó team dev sẽ handle nhé em. BA chỉ cần mô tả rule hoặc business logic cho từng function bằng Use Case hoặc note theo Acceptance Criteria. Sau đó, việc implement rule/ business logic đó bằng API hay solution nào khác thì sẽ do team dev làm & họ sẽ mô tả lại ở doc technical design nhé em.
12/02/2022 at 12:26 sáng
Anh ơi, cho em hỏi. Việc viết đặc tả use case khác với user story như thế nào ạ?
Em đang thắc mắc là: Ví dụ như em có use: Là 1 người vận hành, tôi muốn tạo đơn hàng trên hệ thống vận hành.
Với use case này thì sẽ có nhập thông tin người nhận hàng (tên, sđt, địa chỉ). Thêm thông tin sp, phí ship, apply voucher (nếu có),…
Ngoài đặc tả như trên thì những requirement như chỉ nhập tối đa bao nhiêu, rồi apply voucher như thế nào… thì sẽ thể hiện ra sao ạ?
Em cảm ơn!
Các bài viết của anh rất hay và hóm hỉnh
09/08/2022 at 10:13 chiều
Hi Hà, em đọc seri bài notes này của anh nhé: https://thinhnotes.com/chuyen-nghe-ba/ba-viet-fs-nhu-nao/
06/03/2022 at 11:22 sáng
Hello Thịnh, rất cám ơn bạn về bài viết này.
Thịnh cho mình hỏi thêm là Business Rules và Non-Functional Requirement trong UseCase và FS thì có giống và khác nhau như thế nào?
Vì mình thấy trong UseCase cũng có 2 mục trên và trong FS tổng quản cũng có 2 mục này, mình chưa hiểu lắm vì sao lại như vậy, bạn có thể giải thích thêm hộ mình không?
https://thinhnotes.com/chuyen-nghe-ba/ba-viet-fs-nhu-nao/
https://thinhnotes.com/chuyen-nghe-ba/fs-kieu-truyen-thong/
19/03/2022 at 12:02 chiều
Hi Tùng, Biz Rule là các điều kiện để Use Case của mình hoạt động đúng theo các quy định của công ty, tổ chức… Mình có thể mô tả rule ở tầng rất high level (như quy định tài khoản free của thành viên sẽ bị ngắt hoạt động nếu quá 3 tháng không hoạt động). Hoặc thấp hơn là mô tả rule ở tầng UI – Giao diện người dùng (có thể chọn gì, không chọn gì…). Hoặc thấp hơn nữa là mô tả rule ở tầng back-end (các logic xử lý bên dưới, check ra sao, chạy như thế nào…)
Còn Non-Functional Req thì mô tả để “quality of services” của cái sản phẩm mình làm. Nó nghiêng nhiều đến các yếu tố UX. Mình có viết 1 bài về Non-Functional Requirement, Tùng đọc thêm ở đây nhé: https://thinhnotes.com/chuyen-nghe-ba/non-functional-requirements-va-chuyen-ve-cai-xo-be/
15/03/2022 at 10:09 chiều
Đỉnh quá, cảm ơn Anh . Bài viết rất bổ ích cho em
19/03/2022 at 12:21 chiều
Thanks em
22/06/2022 at 11:24 sáng
Hi Thịnh, cảm ơn bài viết của bạn. Bạn chia sẻ về Use case rất dễ hiểu và dễ áp dụng.
Mình có một thắc mắc như thế này, khi hệ thống validate input của actor theo format (number of digits, type of data, case sensitive, etc.) thì thường hệ thống sẽ show các error messages để thông báo cho user biết và sửa đổi cho đúng với format, vậy các validation này được coi là alternative flow hay exception flow?
Mình thấy 1 course mình xem trên Udemy, giáo viên có hướng dẫn rằng nếu error này là permanent, thì nó sẽ thuộc về exception flow, còn nó là temporary thì nó là alternative flow. Ví dụ mà giáo viên đang đề cập, là 1 code được actor input, nếu nó sai về format, thì việc xử lý bằng show error message ở đây là Alternative Flow, còn code đó invalid (có 1 3rd party library để validate code này) thì show error message ở đây là Exception flow. Tuy nhiên, ở phía mình, thì mình thấy cả 2 lỗi này đều không chặn người dùng thực hiện use case và mình vẫn cho phép actor input một code valid khác để thực hiện mục đích của use case, thì cả 2 đều nên là Alternative Flow chứ nhỉ? Mình rất mong muốn được lắng nghe ý kiến từ Thịnh, cảm ơn bạn nhiều.
09/08/2022 at 10:12 chiều
Hi Huyền, các case này thường mình đưa vào Business Rule hoặc Validation Rule. Mình nên làm 1 table để mô tả các rules này trong từng Function riêng
08/07/2022 at 4:56 chiều
Em chào anh Thịnh ạ. Anh ơi em có thắc mắc chỗ ở Ví dụ Use Case Specification ạ. Ở mục Exception Flow, 4c2 Người dùng lấy lại mật khẩu sau đó phải là Use Case tiếp tục UC 1-2 chứ ạ. Và thiếu 1 cái 4c4 Người dùng tạo tài khoản mới => Use case tiếp tục UC 1-3.
Em có chút thắc mắc hy vọng được anh giải đáp ạ.
Em cảm ơn anh nhiều ạ
09/08/2022 at 10:16 chiều
Anh viết lâu quá rồi nên không nhớ lại nổi Phương ơi, em cứ suy nghĩ theo luồng tự nhiên dễ hiểu nhé. Từ bước nào tới bước nào là do mình define cho hợp lý thôi, có thể hình trên anh bị nhầm đâu đó ở bước em nói.
25/08/2022 at 6:37 chiều
Em chào anh!
Anh cho em hỏi là ví dụ em có các Use case như: Gửi tin nhắn cho khách hàng, kết thúc trò chuyện, xoá tin chưa đọc thì lúc vẽ use case diagram em có cần vẽ extend trường hợp trả lời tin nhắn khách bằng dạng gửi text, gửi hình ảnh, gửi emoji icon ko ạ. Vì nếu e ghi chung lại thì dưới chỗ Basic flow em không biết trình bày như thế nào ạ? Còn nếu tách ra thì chỗ kết thúc trò chuyện với thu hồi tin nhắn em định để include với ” Gửi tin nhắn cho KH ” mà thấy như vậy thì phải nối luôn với cái gửi hình ảnh vs emoji ạ ?
Em cám ơn anh nhiều ạ!!
27/08/2022 at 8:16 sáng
Hi Kiều, những chi tiết đó thì ko cần thể hiện ở Use Case nhé em. Đơn giản e có thể ghi use case trả lời tin nhắn là: “Trả lời tin nhắn cơ bản” hoặc “Trả lời tin nhắn cơ bản 1” gì đó. Rồi chi tiết bên dưới e mới đặc tả các feature trong trả lời tin nhắn này gồm những gì: emoji, image, text….. Sau này muốn enhance lên thành trả lời tin nhắn bằng voice thì tạo 1 use case mới, đặt tên là “Trả lời tin nhắn bằng voice” rồi mô tả detail tương tự vậy thôi
15/11/2022 at 11:45 sáng
Cảm ơn bạn, bài viết rất rõ ràng mạch lạc. Đọc phát hiểu luôn 🙂
18/02/2023 at 11:07 sáng
Cảm ơn bạn
16/11/2022 at 10:19 sáng
Thịnh có thể cho mình xin địa chỉ Facebook và Zalo của bạn được ko?
18/02/2023 at 11:06 sáng
Có gì bạn cứ email cho mình [email protected] hoặc connect LinkedIn nhé in/nghphuthinh
29/03/2023 at 7:44 chiều
Em chào a Thịnh, bài viết của a rất hay và dễ hiểu. E là sinh viên theo IT và đang học 2 môn là CNPM và OOAD, việc tìm được blog của a như ánh sáng cuối đường hầm tối tăm vậy :)))
Em có một vài câu hỏi như sau:
– 1 use case A include use case B, tức là trong Flow của A sẽ tồn tại Flow của B, vậy thì em sẽ trình bày nó như thế nào trong đặc tả use case A? Ở đặc tả use case B e đã viết hết flow của B ra, tuy nhiên đến đặc tả use case A, trong Flow của A, liệu e có thể nói một câu đơn giản như “Kích hoạt Use Case B” hay là phải viết lại Flow của B (sẽ là thảm hoạ lặp nếu flow của B rất dài như trg hợp của e).
P/s: thằng Extend nó có cái gọi là Extension Point, sử dụng Extension Point em có thể hướng Alternative Flow hoặc Exception Flow sang Use Case khác như cách a làm với
“4c2. Người dùng chọn lệnh lấy lại mật khẩu
Use Case tiếp tục Use Case UC1-3
4c3. Người dùng chọn lệnh khóa tài khoản
Use Case tiếp tục Use Case UC1-4”
Hay là em cũng có thể trình bày tương tự như thế này, chỉ khác là nó sẽ nằm ở Basic Flow?
04/04/2023 at 5:01 chiều
Theo như em tìm hiểu thì không tồn tại định nghĩa về “Inclusion Point” trong Basic Flow (hay cả Alternative Flow lẫn Execution Flow).
18/06/2023 at 10:49 chiều
Hi em,
UC A include UC B không có nghĩa là flow B nằm trong flow A.
Mục đích của UC Diagram là làm đơn giản hoá một chùm những thứ, mà user có thể tương tác với hệ thống (hay trong ngữ cảnh câu hỏi của e thì gọi nôm na là Tính năng đi cho đơn giản). Việc mình tách nhỏ ra từng Use Case là để dễ dàng quản lý và có cái nhìn sáng tỏ hơn về toàn bộ tính năng của system.
Mỗi UC là 1 tính năng độc lập, nó nên satisfy được 1 cái goal nào đó của user. Ví dụ UC “Đặt hàng” là để đáp ứng được goal mua hàng online tiện ích của user. UC “Đánh giá sản phẩm” là để thoả mãn nhu cầu được đánh giá, được lên tiếng, được nói về món hàng mình đã mua, đã xài của user.
Let say, phải mua hàng xong thì mới được đánh giá, lúc này UC “Đánh giá sản phẩm” sẽ include UC “Đặt hàng”, nhưng không có nghĩa là lúc mô tả UC Specs cho UC “Đánh giá sản phẩm” thì mình phải mô tả luôn luồng của UC “Đặt hàng” trong đó. Vậy thì việc tách riêng toàn bộ tính năng của system ra thành từng cục UC nhỏ mới có ý nghĩa. Mỗi UC đều có một flow từ start đến end riêng em nhé.
Còn nếu muốn diễn tả rỏ hơn về tổng quan quy trình thì em có thể dùng BPMN: https://thinhnotes.com/chuyen-nghe-ba/bpmn-va-su-loi-hai-cua-no/
Về câu thứ 2 thì em cứ xài cái nào cho đơn giản, dễ hiểu là được. UC nó chỉ là tool, nó phục vụ mình. Mình xài nó xong, thì output của mình phải đơn giản, dễ đọc, dễ hiểu. Nên em thấy xài như thế nào cho hợp lý, dễ dàng với em thì cứ chơi cái đó thôi. Cái nào không có trong chuẩn thì ghi cái note dưới là người ta đọc vào sẽ hiểu.
Đừng quá quan trọng đúng hay sai, quan trọng là nó có giúp em “facilitate” ý đồ của mình dễ dàng hơn hay không thôi nhé.
25/05/2023 at 10:48 chiều
Mình tình cờ xem dc trang web của bạn, nma mình thấy bạn viết đầy đủ rõ ràng và bổ ích quá ???? Cảm ơn ạ!
18/06/2023 at 10:37 chiều
Cảm ơn Khoa nhé
26/07/2023 at 1:01 chiều
Anh ơi viết Business rules là như thế nào á
25/10/2023 at 4:43 chiều
Comment này để khen chủ blog đẹp trai giỏi giang tuyệt vời – idol
19/11/2023 at 8:26 sáng
Cho mình hỏi, ở phần Priority óc những mức độ nào ạ?
23/07/2024 at 9:26 sáng
Em có câu hỏi là cái UC 1.5 anh không dùng trong bản đặc tả thì bỏ nó đi được không