






Preview text:
  lOMoAR cPSD| 58833082
Khung câu hỏi vấn đáp tiểu luận CNPM   
1. Bạn có thể tóm tắt quy trình phát triển phần mềm mà bạn áp dụng trong bài tiểu  luận của mình? 
Nhóm đã thực hiện dự án qua các bước chính gồm khảo sát hiện trạng, phân tích yêu cầu người 
dùng, thiết kế hệ thống, lập kế hoạch phát triển, kiểm thử và triển khai hệ thống. Ban đầu, nhóm 
xác định các nhu cầu cơ bản của một cửa hàng nhỏ trong quản lý thông tin khách hàng và đơn 
đặt hàng. Tiếp đó, nhóm phân tích hệ thống thông qua các sơ đồ Use Case và ERD, rồi tiến 
hành thiết kế giao diện và chức năng chính của website, đảm bảo các bước phát triển được tuần  tự và logic 
2. Dự án phần mềm của bạn có áp dụng các phương pháp quản lý dự án nào không? 
Nếu có, hãy giải thích. 
Dự án của nhóm áp dụng phương pháp Agile linh hoạt, cho phép nhóm điều chỉnh nhanh chóng 
khi có thay đổi từ yêu cầu hoặc phản hồi từ người dùng. Dù không áp dụng hoàn toàn các 
phương pháp như Scrum hay Kanban, nhóm thực hiện chia dự án thành các giai đoạn nhỏ, 
tương tự như các “nước rút” trong Scrum, ưu tiên hoàn thành từng chức năng trước khi chuyển 
sang phần tiếp theo. Bằng cách này, nhóm đã đảm bảo sự linh hoạt và có thể giải quyết các vấn 
đề kịp thời trong từng giai đoạn phát triển, một cách tiếp cận đặc biệt quan trọng khi nhóm phải 
thêm các chức năng mới như quản lý giỏ hàng 
3. Bạn có thể giải thích cách bạn phân tích yêu cầu người dùng trong dự án của mình? 
Dự án được xây dựng nhằm đáp ứng nhu cầu của các cửa hàng nhỏ, đặc biệt là giúp họ quản lý 
thông tin khách hàng, theo dõi đơn hàng, và thống kê doanh thu. Nhóm xác định các yêu cầu 
này qua trao đổi với người dùng giả định và phân tích nhu cầu cụ thể cho từng loại người dùng, 
như Quản trị viên (Admin), Khách hàng, và Người xem (Viewer) trên website 
4. Bạn đã thiết kế hệ thống phần mềm như thế nào để đáp ứng các yêu cầu kỹ thuật? 
Để đảm bảo hệ thống đáp ứng đúng yêu cầu, nhóm thiết kế sơ đồ Use Case cho các chức năng 
chính và phân rã chức năng để dễ dàng triển khai. Bên cạnh đó, nhóm đã xây dựng sơ đồ ERD 
nhằm xác định quan hệ giữa các bảng dữ liệu như Khách hàng, Đơn hàng và Sản phẩm, đảm 
bảo rằng các dữ liệu quan trọng được lưu trữ một cách logic và dễ quản lý 
5. Trong dự án, bạn có phải xử lý sự thay đổi yêu cầu từ khách hàng không? Bạn đã 
giải quyết điều đó như thế nào? 
Trong quá trình phát triển, nhóm gặp phải một số thay đổi về yêu cầu như thêm chức năng quản 
lý giỏ hàng và cải tiến giao diện giỏ hàng để dễ sử dụng hơn. Nhóm đã áp dụng cách tiếp cận      lOMoAR cPSD| 58833082
linh hoạt, cập nhật và điều chỉnh hệ thống nhanh chóng dựa trên những thay đổi mới, đồng thời 
tối ưu hóa mã nguồn để dễ dàng sửa đổi khi cần 
6. Bạn đã áp dụng những nguyên tắc thiết kế phần mềm nào trong bài tiểu luận của  mình? 
Nhóm áp dụng một số nguyên tắc thiết kế phần mềm nhằm tối ưu hiệu quả và dễ bảo trì mã  nguồn:  - 
KISS (Keep It Simple, Stupid): Nhóm giữ cho các phần thiết kế đơn giản, tập trung vào 
những chức năng cốt lõi của website, như quản lý đơn hàng và giỏ hàng, tránh các tính năng  không cần thiết.  - 
DRY (Don't Repeat Yourself): Trong suốt quá trình phát triển, nhóm đã giảm thiểu việc 
viết lại các đoạn mã trùng lặp, áp dụng các hàm dùng chung cho những tính năng tương tự. -  
SOLID: Nhóm tuân theo các nguyên tắc thiết kế SOLID để đảm bảo mã nguồn dễ mở 
rộng và bảo trì, đặc biệt chú trọng vào việc thiết kế các lớp và chức năng sao cho dễ dàng cập 
nhật mà không ảnh hưởng đến toàn bộ hệ thống 
7. Hãy giải thích cách bạn thực hiện kiểm thử phần mềm trong dự án của mình. 
Nhóm thực hiện kiểm thử chức năng thông qua các trường hợp như đăng ký, đăng nhập, quản 
lý giỏ hàng, và thanh toán. Với từng chức năng, nhóm kiểm tra các tình huống khác nhau (như 
sai mật khẩu khi đăng nhập hoặc không điền đủ thông tin khi đăng ký) để đảm bảo hệ thống 
phản hồi đúng như mong đợi và không xảy ra lỗi trong quá trình sử dụng 
8. Bạn có thể chia sẻ kinh nghiệm của mình trong việc triển khai một phần mềm thực  tế không? 
Nhóm đã triển khai thử nghiệm các chức năng chính trên hệ thống thực tế của website bán hàng 
và tiếp nhận phản hồi từ người dùng thử nghiệm. Qua đó, nhóm học cách xử lý các lỗi phát sinh 
sau khi triển khai và đảm bảo hệ thống hoạt động ổn định, đặc biệt là ở các tính năng quan trọng 
như thanh toán và quản lý giỏ hàng 
9. Hãy giải thích cách bạn quản lý các rủi ro trong quá trình phát triển phần mềm. 
Nhóm giảm thiểu rủi ro bằng cách phân công công việc chi tiết và xây dựng kế hoạch cụ thể. 
Các rủi ro như lỗi phần mềm hoặc chậm tiến độ được dự đoán trước và lên kế hoạch khắc phục, 
như thường xuyên kiểm tra mã nguồn và có các buổi thảo luận định kỳ để giải quyết các vấn đề  kịp thời 
10.Bạn đã sử dụng công nghệ hoặc công cụ nào để hỗ trợ quá trình phát triển phần 
mềm trong bài tiểu luận? 
Nhóm sử dụng nhiều công nghệ như SQL Server cho cơ sở dữ liệu, Java và React JS cho phần 
lập trình ứng dụng, Apache Tomcat và Spring Boot cho phần backend, và Tailwind CSS để xây 
dựng giao diện. Các công nghệ này giúp hệ thống đạt hiệu suất cao và dễ dàng mở rộng      lOMoAR cPSD| 58833082
11.Hãy mô tả cách bạn thiết kế cơ sở dữ liệu cho dự án phần mềm của mình. 
1. Sơ đồ cơ sở dữ liệu (ERD - Entity Relationship Diagram): 
 Đầu tiên, tôi đã xây dựng một sơ đồ ERD để minh họa mối quan hệ giữa các 
bảng chính như: users, orders, products, brands, order_details, carts, và 
roles. Các mối quan hệ chính bao gồm: 
 users và roles có quan hệ nhiều-một (một người dùng có một vai trò duy 
nhất, nhưng một vai trò có thể áp dụng cho nhiều người dùng). 
 users và orders có quan hệ một-nhiều (một người dùng có thể tạo nhiều đơn  hàng). 
 orders và order_details có quan hệ một-nhiều (một đơn hàng có thể chứa  nhiều sản phẩm). 
 products và brands có quan hệ nhiều-một (một thương hiệu có thể có nhiều 
sản phẩm, nhưng mỗi sản phẩm chỉ thuộc về một thương hiệu). 
 carts liên kết users và products để quản lý các sản phẩm mà người dùng 
thêm vào giỏ hàng trước khi đặt hàng. 
2. Mô tả chi tiết các bảng và các thuộc tính: 
 Bảng users: Quản lý thông tin người dùng với các thuộc tính như id, full_name, 
email, password, phone, address, và role_id (liên kết với bảng roles). 
 Bảng roles: Quản lý vai trò của người dùng, bao gồm các vai trò như  ROLE_USER và ROLE_ADMIN. 
 Bảng products: Chứa thông tin chi tiết về sản phẩm bao gồm id, name, price, 
description, brand_id, quantity, sold_quantity, discount, và các thuộc tính khác. 
 Bảng brands: Lưu thông tin về các thương hiệu với id và name. 
 Bảng orders: Lưu thông tin đơn hàng, gồm các trường id, order_code, create_date,  status, total, và user_id. 
 Bảng order_details: Chứa các chi tiết của mỗi đơn hàng, với các thuộc tính như 
id, order_id, product_id, quantity, và price. 
 Bảng carts và cart_details: Quản lý các sản phẩm người dùng đã thêm vào giỏ 
hàng. carts lưu tổng quan giỏ hàng của từng người dùng, trong khi cart_details lưu 
chi tiết từng sản phẩm trong giỏ. 
3. Quy tắc nghiệp vụ (Business Rules): 
 Một người dùng chỉ có một vai trò (role_id), và không thể tồn tại người dùng  không có vai trò. 
 Mỗi sản phẩm thuộc về một thương hiệu duy nhất (brand_id). 
 Đơn hàng phải có ít nhất một order_detail. 
 Số lượng sản phẩm trong kho không thể là số âm. 
 Mỗi sản phẩm trong đơn hàng có một giá bán riêng, tính theo thời điểm đặt hàng. 
4. Xử lý dữ liệu lớn:      lOMoAR cPSD| 58833082
 Để tối ưu hóa hiệu suất truy vấn dữ liệu lớn, tôi đã thiết lập các chỉ mục trên các 
trường thường xuyên được tìm kiếm như user_id trong orders, product_id trong 
order_details, và brand_id trong products. 
 Sử dụng phân mảnh bảng (partitioning) và caching ở các bảng lớn như orders và 
order_details để giảm tải cho cơ sở dữ liệu. 
 Đối với các báo cáo thống kê, sử dụng bảng tổng hợp để lưu dữ liệu theo thời gian 
thực nhằm giảm tải khi cần lấy số liệu. 
5. Khả năng mở rộng: 
 Thiết kế cơ sở dữ liệu của tôi đảm bảo dễ dàng mở rộng khi cần thiết. Ví dụ, nếu 
cần thêm tính năng mới như mã giảm giá hoặc quản lý khuyến mãi, tôi có thể tạo 
thêm các bảng discounts hoặc promotions và liên kết chúng với bảng products hoặc 
orders mà không ảnh hưởng đến các chức năng hiện tại. 
 Hệ thống cũng có thể mở rộng để tích hợp với các phương thức thanh toán khác 
nhau hoặc bổ sung các chức năng như đánh giá sản phẩm, nhờ vào kiến trúc  modular. 
6. Biện pháp bảo mật bổ sung: 
 Mật khẩu của người dùng được mã hóa bằng chuẩn Bcrypt để tăng cường bảo mật. 
 Thông tin nhạy cảm như chi tiết thanh toán sẽ được mã hóa trước khi lưu trữ. 
 Các quyền truy cập được quản lý chặt chẽ thông qua vai trò người dùng (roles), và 
chỉ người dùng có quyền mới có thể truy cập vào một số thông tin nhất định. 
 Ràng buộc kiểm tra tính hợp lệ của dữ liệu đầu vào để ngăn chặn các lỗi nhập dữ 
liệu hoặc tấn công SQL Injection. 
12.Bạn có sử dụng các phương pháp Agile hoặc Scrum trong dự án không? Hãy giải  thích. 
Nhóm không áp dụng một cách toàn diện các phương pháp như Scrum hay Agile, nhưng thực 
hiện quản lý công việc theo từng giai đoạn nhỏ, ưu tiên hoàn thành từng chức năng trước khi 
chuyển sang bước tiếp theo, giúp nhóm làm việc linh hoạt và xử lý vấn đề kịp thời trong từng  giai đoạn phát triển 
13.Trong quá trình phát triển, bạn có gặp khó khăn nào về việc phối hợp giữa các 
thành viên nhóm không? 
Do thiếu kinh nghiệm trong việc tổ chức dự án, nhóm gặp khó khăn trong việc phân bổ thời 
gian hợp lý và phối hợp công việc giữa các thành viên, dẫn đến một số chức năng chưa hoàn 
thiện đúng thời hạn. Nhóm đã cải thiện qua các buổi họp để điều chỉnh lại cách làm việc và tăng 
cường phối hợp để nâng cao hiệu quả 
14.Bạn có thể mô tả cách bạn triển khai phần mềm của mình vào môi trường thực tế? 
Nhóm đã triển khai các chức năng quản lý đơn hàng, khách hàng và giỏ hàng trên hệ thống 
website thực tế, thử nghiệm trực tiếp các tính năng để đảm bảo rằng chúng hoạt động ổn định.      lOMoAR cPSD| 58833082
Nhóm cũng kiểm tra tương thích trên nhiều trình duyệt khác nhau để cải thiện trải nghiệm  người dùng 
15.Hãy giải thích cách bạn sử dụng các công cụ kiểm soát phiên bản (version control) 
trong quá trình phát triển. 
Sử dụng Git trong quản lý phiên bản dự án 
Trong quá trình phát triển dự án, tôi sử dụng Git như là công cụ kiểm soát phiên bản chính để 
quản lý mã nguồn một cách hiệu quả và hệ thống. Dưới đây là các bước chi tiết tôi thực hiện  với Git: 
1. Khởi tạo Git Repository: 
 Tôi khởi tạo một repository Git cho dự án, giúp theo dõi tất cả các thay đổi của mã 
nguồn. Thông thường, repository được lưu trữ trên các nền tảng như GitHub hoặc 
GitLab để tiện cho việc quản lý từ xa và hợp tác làm việc. 
2. Quản lý các nhánh (Branches): 
 Để duy trì tính tổ chức và kiểm soát các thay đổi, tôi sử dụng các nhánh khác nhau 
cho từng chức năng hoặc tính năng. Ví dụ, các nhánh có thể là feature/login, 
feature/cart, hoặc bugfix/order-status. 
 Nhánh main (hoặc master) được sử dụng để chứa mã ổn định, đã được kiểm tra kỹ 
càng và sẵn sàng để triển khai. Nhánh develop chứa mã đang trong giai đoạn phát 
triển và tích hợp các tính năng mới. 
3. Commit thường xuyên và chi tiết: 
 Tôi commit thường xuyên sau mỗi thay đổi hoặc hoàn thành một phần công việc 
nhỏ, với các thông điệp commit rõ ràng như "Add login authentication" hoặc "Fix 
cart calculation bug". Điều này giúp tôi theo dõi từng thay đổi cụ thể và dễ dàng 
quay lại các phiên bản trước khi cần. 
4. Pull Requests (PR) và Code Review: 
 Sau khi hoàn thành một tính năng, tôi tạo Pull Request (PR) để hợp nhất nhánh tính 
năng vào nhánh develop hoặc main. Trước khi hợp nhất, mã được review để kiểm 
tra tính đúng đắn và tối ưu hóa hiệu suất. 
 PR giúp đảm bảo rằng mã mới được kiểm tra kỹ càng trước khi đưa vào nhánh 
chính, tránh gây lỗi cho toàn bộ dự án. 
5. Giải quyết xung đột (Conflict Resolution): 
 Trong trường hợp nhiều nhánh phát triển song song gây ra xung đột khi hợp nhất, 
tôi sử dụng git merge hoặc git rebase để xử lý xung đột một cách cẩn thận. Quy 
trình này đảm bảo rằng mã sau khi hợp nhất hoạt động ổn định và chính xác. 
6. Theo dõi lịch sử và hoàn tác thay đổi: 
 Nhờ vào lịch sử commit của Git, tôi có thể dễ dàng xem lại các thay đổi trong quá 
khứ, hiểu rõ hơn về lý do thay đổi và tác động của chúng.      lOMoAR cPSD| 58833082
 Nếu cần hoàn tác thay đổi, tôi có thể dùng git revert hoặc git reset để quay lại trạng 
thái trước đó, giúp khắc phục lỗi mà không ảnh hưởng đến các phần khác của dự  án. 
7. Sử dụng file .gitignore: 
 Để giữ cho repository gọn gàng, tôi sử dụng file .gitignore để loại bỏ các file 
không cần thiết hoặc chứa thông tin nhạy cảm như thông tin môi trường, thư viện 
bên thứ ba. Điều này giúp giảm dung lượng của repository và bảo mật thông tin  quan trọng. 
8. Tagging và phiên bản phát hành: 
 Tôi sử dụng Git tags để đánh dấu các phiên bản quan trọng của dự án, chẳng hạn 
như các bản phát hành lớn (v1.0, v2.0). Các tags này giúp tôi dễ dàng theo dõi và 
quay lại các phiên bản cụ thể khi cần. 
9. Tích hợp CI/CD (Continuous Integration/Continuous Deployment): 
 Khi repository được lưu trữ trên GitHub/GitLab, tôi thiết lập CI/CD để tự động 
kiểm tra mã và triển khai dự án khi có thay đổi mới. Điều này đảm bảo dự án luôn 
ở trạng thái hoạt động tốt mà không phải kiểm tra thủ công từng phần. 
16.Bạn đã thiết kế giao diện người dùng (UI) cho phần mềm của mình như thế nào? 
Giao diện của website bao gồm các trang chủ, giỏ hàng, thanh toán, và quản lý tài khoản người 
dùng, được thiết kế với sự chú trọng vào tính trực quan và đơn giản. Các tính năng như tìm 
kiếm sản phẩm, thêm vào giỏ hàng và thanh toán được bố trí dễ thấy, giúp người dùng thao tác  dễ dàng 
17.Dự án phần mềm của bạn có áp dụng các tiêu chuẩn bảo mật nào không? 
Các tiêu chuẩn bảo mật áp dụng trong dự án 
Trong dự án RosWatch, tôi đã áp dụng các biện pháp bảo mật sau để bảo vệ dữ liệu người dùng 
và đảm bảo an toàn hệ thống: 
1. Mã hóa dữ liệu nhạy cảm: Mật khẩu người dùng được mã hóa bằng thuật toán BCrypt  trước khi lưu trữ. 
2. Xác thực và phân quyền với JWT: Sử dụng JWT để xác thực người dùng và phân 
quyền truy cập. Mỗi yêu cầu từ client sẽ kèm theo JWT để đảm bảo tính bảo mật và đúng  quyền hạn. 
3. Kết nối bảo mật qua HTTPS: Sử dụng HTTPS để mã hóa dữ liệu truyền qua mạng, 
ngăn chặn rò rỉ và các cuộc tấn công nghe lén. 
4. Phân quyền dựa trên vai trò (RBAC): Các vai trò như admin và user được phân quyền 
cụ thể, đảm bảo mỗi người dùng chỉ truy cập tính năng phù hợp. 
5. Phòng chống SQL Injection: Sử dụng Prepared Statements và ORM để ngăn ngừa các 
cuộc tấn công SQL Injection.      lOMoAR cPSD| 58833082
6. Bảo mật cấu hình với .gitignore: Thông tin nhạy cảm được quản lý trong các file cấu 
hình cục bộ và loại khỏi repository bằng .gitignore. 
7. Kiểm tra bảo mật định kỳ: Sử dụng các công cụ như SonarQube để phát hiện và khắc 
phục lỗ hổng bảo mật trong mã nguồn và thư viện. 
18.Bạn có thể mô tả cách phần mềm của bạn được bảo trì sau khi triển khai không? 
Nhóm xác định hướng phát triển tương lai bao gồm nâng cấp giao diện, tối ưu hóa tốc độ tải 
trang và thêm các chức năng như thanh toán trực tuyến qua ngân hàng và ví điện tử. Những cải 
tiến này nhằm duy trì tính ổn định và đáp ứng tốt hơn cho nhu cầu kinh doanh 
19.Hãy chia sẻ kinh nghiệm của bạn trong việc làm việc với khách hàng hoặc các bên 
liên quan trong dự án. 
Nhóm đã trao đổi với các bên liên quan để xác định rõ nhu cầu và yêu cầu cụ thể, như chức 
năng quản lý khách hàng và đơn đặt hàng. Qua đó, nhóm hiểu thêm về cách xây dựng hệ thống 
quản lý đáp ứng đúng nhu cầu của cửa hàng, đảm bảo dễ sử dụng và hiệu quả 
20.Bạn có thể áp dụng những gì học được từ dự án này vào thực tiễn làm việc trong 
ngành công nghệ phần mềm không? 
Thông qua dự án, nhóm học được nhiều kỹ năng quan trọng, từ việc phân tích yêu cầu, thiết kế 
hệ thống, đến phát triển giao diện người dùng và kiểm thử phần mềm. Những kỹ năng này giúp 
nhóm hiểu rõ quy trình phát triển phần mềm thực tế, như cách quản lý và tổ chức cơ sở dữ liệu 
hiệu quả, làm việc với framework và các công cụ phát triển hiện đại như Java, React JS, SQL 
Server. Hơn nữa, nhóm còn nắm bắt được quy trình làm việc nhóm, cách xử lý lỗi và cải tiến hệ 
thống sau khi nhận phản hồi từ người dùng. Đây là những kinh nghiệm quý giá có thể áp dụng 
vào thực tế công việc sau này trong ngành công nghệ phần mềm, đặc biệt là trong các dự án liên 
quan đến phát triển hệ thống quản lý và thương mại điện tử