Cover image source: Source
Lời mở đầu
Hi, xin chào tất cả các bạn. Bài viết đầu tiên trên blog này mình xin chia sẻ một số “kỹ năng chuyên môn” mà mình nghĩ là sẽ rất cần thiết để giúp mọi người có thể làm được việc trong môi trường doanh nghiệp một cách tốt hơn. Đây là những kỹ năng mà mình đã đúc rút trong suốt quá trình hơn 5 năm làm việc tại hai công ty product, cũng như một vài dự án cá nhân(bao gồm cả freelance) mà mình đã trải qua. Okay không lan man thêm nữa, cùng xem những khái niệm này là gì nhé.
Quy trình phát triển phần mềm - SDLC
Khái niệm đầu tiên mình đề cập đến chính là quy trình phát triển phần mềm hay còn được viết tắt là SDLC(Software development life cycle). Vì sao mình đề cập đến khái niệm này đầu tiên, bởi lẽ tất cả các công ty về phần mềm từ product đến outsouring đều có cho mình một, hoặc nhiều quy trình phát triển phần mềm. Mỗi công ty, tổ đội sẽ có thể có cách thức áp dụng các quy trình này khác nhau, chỉnh sửa chúng để phù hợp với mỗi tổ chức. Tuy nhiên, chung quy lại một quy trình phát triển phần mềm sẽ gồm có 7 giai đoạn chính như hình bên dưới.
1. Analysis & Planning - Phân tích và lập kế hoạch
Mục tiêu của giai đoạn này
Giai đoạn này là bước khởi đầu cho bất kỳ dự án nào. Mục tiêu là hiểu rõ yêu cầu của khách hàng, xác định phạm vi dự án, đánh giá khả thi và lập kế hoạch cho các bước tiếp theo.
Bạn không chỉ dừng lại ở việc “ghi nhận yêu cầu,” mà cần phải đào sâu để xác định những vấn đề mà khách hàng có thể chưa nhận ra. Đây là cơ hội để bạn đóng vai trò như một nhà tư vấn thay vì chỉ là một kỹ sư phần mềm.
Thách thức trong thực tế
- Yêu cầu mơ hồ: Khách hàng không luôn biết chính xác họ cần gì, hoặc không diễn đạt rõ ràng.
- Phạm vi thay đổi liên tục: Đặc biệt là với các dự án lớn, yêu cầu thường bị bổ sung hoặc thay đổi.
- Hạn chế tài nguyên: Cần cân nhắc ngân sách, nhân lực và thời gian để đảm bảo tính khả thi.
Công việc cụ thể bạn cần làm
- Thu thập yêu cầu: Tổ chức các buổi họp với khách hàng và các bên liên quan. Đặt nhiều câu hỏi “tại sao” để hiểu được động cơ thật sự.
- Phân tích: Vẽ sơ đồ luồng dữ liệu, quy trình hiện tại và xác định các điểm “thắt cổ chai.”
- Lập kế hoạch: Chia nhỏ dự án thành các giai đoạn cụ thể với mốc thời gian rõ ràng.
Công cụ hỗ trợ
- Jira, Trello: Quản lý backlog và các yêu cầu.
- Lucidchart, Miro: Vẽ sơ đồ luồng dữ liệu hoặc các quy trình nghiệp vụ.
- Confluence: Ghi chú và chia sẻ tài liệu giữa các thành viên.
2. Design & Prototyping - Thiết kế và tạo nguyên mẫu
Mục tiêu của giai đoạn này
Thiết kế là lúc bạn chuyển đổi những yêu cầu kinh doanh thành kiến trúc hệ thống và các bản vẽ chi tiết. Đây chính là bản “blueprint” để đảm bảo đội ngũ phát triển có hướng đi rõ ràng và nhất quán.
Thách thức trong thực tế
- Quá nhiều ràng buộc kỹ thuật: Việc lựa chọn công nghệ hoặc kiến trúc sai sẽ dẫn đến khó khăn trong mở rộng và bảo trì.
- Thiếu sự đồng thuận: Các bên liên quan (business, IT) có thể không đồng ý với bản thiết kế.
Công việc cụ thể bạn cần làm
- Thiết kế hệ thống: Lên kiến trúc (monolithic, microservices) phù hợp với dự án.
- Tạo nguyên mẫu (prototype): Dành cho các dự án có yếu tố giao diện người dùng (UI/UX).
- Phác thảo cơ sở dữ liệu: Thiết kế bảng, quan hệ, và các chỉ mục tối ưu.
Công cụ hỗ trợ
- Figma, Adobe XD: Thiết kế UI/UX.
- Draw.io, Lucidchart: Vẽ sơ đồ kiến trúc hoặc thiết kế dữ liệu.
- ER/Studio: Lập kế hoạch cho cơ sở dữ liệu.
3. Software Development - Phát triển phần mềm
Mục tiêu của giai đoạn này
Giai đoạn này tập trung vào việc biến ý tưởng thành hiện thực qua mã nguồn. Tuy nhiên, nó không chỉ là việc viết code, mà còn phải đảm bảo rằng mọi thứ được xây dựng có cấu trúc rõ ràng, hiệu quả và dễ bảo trì.
Thách thức trong thực tế
- Tương thích hệ thống: Các module phải kết nối và hoạt động hài hòa.
- Khả năng bảo trì: Code không chỉ chạy được mà còn cần sạch sẽ, rõ ràng để người khác dễ tiếp cận.
Công việc cụ thể bạn cần làm
- Tuân thủ coding standards: Viết code dễ đọc, dễ bảo trì.
- Viết test unit: Đảm bảo tính ổn định của từng chức năng.
- Tích hợp module: Làm việc chặt chẽ với các thành viên khác để tích hợp các thành phần lại với nhau.
Công cụ hỗ trợ
- Visual Studio, VS Code: IDE phổ biến cho phát triển .NET.
- Git (GitHub, GitLab): Quản lý phiên bản.
- SonarQube: Phân tích chất lượng code.
4. Testing - Kiểm thử
Mục tiêu của giai đoạn này
Testing không chỉ đơn giản là tìm lỗi. Mục tiêu của kiểm thử là đảm bảo phần mềm hoạt động đúng như kỳ vọng, đáp ứng đầy đủ yêu cầu của khách hàng, và vận hành ổn định trong mọi tình huống, kể cả khi gặp phải điều kiện bất thường.
Giai đoạn này không phải việc riêng của tester hay QA, mà tất cả các thành viên trong nhóm phát triển đều phải tham gia để đảm bảo chất lượng sản phẩm.
Thách thức trong thực tế
- Độ phủ kiểm thử chưa đủ: Nhiều lỗi không được phát hiện do thiếu kịch bản hoặc kiểm thử không toàn diện.
- Môi trường không đồng nhất: Hệ thống chạy tốt trên máy phát triển nhưng gặp vấn đề trong môi trường thực tế.
- Kiểm thử tự động chưa được tối ưu: Thời gian và tài nguyên cần thiết để viết các script kiểm thử tự động có thể lớn hơn dự kiến.
Công việc cụ thể bạn cần làm
- Viết test cases: Bao gồm các kịch bản kiểm thử chức năng, phi chức năng và các tình huống góc cạnh (edge cases).
- Kiểm thử đơn vị (Unit Test): Đảm bảo từng hàm hoặc module hoạt động đúng.
- Kiểm thử tích hợp (Integration Test): Đảm bảo các thành phần của hệ thống kết nối và trao đổi dữ liệu chính xác.
- Kiểm thử tự động (Automation Testing): Tăng tốc độ kiểm thử với các framework như Selenium, NUnit, hoặc xUnit.
- Kiểm thử tải (Load Testing): Đo lường khả năng chịu tải của hệ thống khi có nhiều người dùng.
Công cụ hỗ trợ
- Postman, Swagger: Kiểm thử API.
- Selenium, Puppeteer: Kiểm thử tự động UI.
- xUnit, NUnit: Viết Unit Test cho dự án .NET.
- JMeter: Kiểm thử hiệu năng.
5. Deployment - Triển khai
Mục tiêu của giai đoạn này
Mục tiêu của việc triển khai là đưa phần mềm từ môi trường phát triển lên môi trường sản xuất, nơi nó sẽ được sử dụng bởi khách hàng thực tế. Một quá trình triển khai tốt cần phải nhanh chóng, an toàn, và hạn chế tối đa các gián đoạn cho hệ thống hiện tại.
Thách thức trong thực tế
- Hạn chế thời gian downtime: Đặc biệt với các hệ thống đang chạy live, việc cập nhật phải đảm bảo không làm gián đoạn người dùng.
- Khả năng rollback: Nếu có sự cố trong bản cập nhật, phải có phương án quay lại phiên bản cũ một cách nhanh chóng.
- Đồng bộ hóa môi trường: Đảm bảo môi trường triển khai giống hệt môi trường kiểm thử.
Công việc cụ thể bạn cần làm
- Chuẩn bị môi trường: Tạo môi trường staging và production với cấu hình tương tự nhau.
- Tự động hóa triển khai: Sử dụng các công cụ CI/CD để giảm thiểu lỗi thủ công.
- Giám sát hậu triển khai: Đảm bảo hệ thống hoạt động ổn định và xử lý nhanh các vấn đề phát sinh.
- Rollback plans: Lập kế hoạch chi tiết để quay về phiên bản cũ nếu xảy ra lỗi.
Công cụ hỗ trợ
- Azure DevOps, GitHub Actions: Hỗ trợ pipeline CI/CD.
- Docker, Kubernetes: Triển khai và quản lý container.
- Terraform: Tự động hóa quản lý hạ tầng.
- Datadog, ELK Stack: Giám sát và phân tích log sau triển khai.
6. Operations & Maintenance - Vận hành và bảo trì
Mục tiêu của giai đoạn này
Phần mềm không kết thúc tại thời điểm triển khai. Mục tiêu của giai đoạn vận hành và bảo trì là duy trì sự ổn định, xử lý các lỗi phát sinh, và cải tiến sản phẩm liên tục dựa trên phản hồi từ người dùng.
Thách thức trong thực tế
- Lỗi không mong muốn: Một số lỗi chỉ xuất hiện khi hệ thống chạy ở quy mô lớn hoặc gặp dữ liệu thực tế.
- Yêu cầu thay đổi: Khách hàng thường yêu cầu thêm tính năng hoặc chỉnh sửa để phù hợp với nhu cầu kinh doanh mới.
- Đảm bảo bảo mật: Các lỗ hổng bảo mật cần được phát hiện và xử lý kịp thời để tránh rủi ro.
Công việc cụ thể bạn cần làm
- Giám sát hệ thống: Theo dõi hiệu suất, log, và các lỗi trong quá trình vận hành.
- Cập nhật bảo mật: Vá các lỗ hổng hoặc nâng cấp công nghệ để tăng cường an toàn.
- Hỗ trợ người dùng: Đáp ứng yêu cầu hỗ trợ kỹ thuật từ khách hàng hoặc bộ phận vận hành.
- Tối ưu hóa: Cải thiện hiệu suất hoặc sửa lỗi từ phản hồi thực tế.
Công cụ hỗ trợ
- Grafana, Kibana: Giám sát hiệu suất và log hệ thống.
- Azure Monitor, New Relic: Theo dõi hiệu năng ứng dụng.
- Jira Service Desk: Quản lý yêu cầu hỗ trợ.
- Dependabot: Tự động cập nhật các dependencies trong dự án.
Kết luận
Quy trình phát triển phần mềm không chỉ là một chuỗi các bước, mà là cả một hệ sinh thái công việc liên kết chặt chẽ, đòi hỏi sự hợp tác giữa tất cả các vai trò trong nhóm. Dù bạn là một lập trình viên, QA, hay một kiến trúc sư phần mềm, việc hiểu rõ từng giai đoạn trong SDLC sẽ giúp bạn làm việc hiệu quả hơn, và quan trọng nhất là tạo ra giá trị bền vững cho sản phẩm và tổ chức. Hy vọng bài viết đã mang lại cho bạn những thông tin hữu ích. Nếu có bất kỳ câu hỏi hoặc đóng góp nào, đừng ngần ngại để lại bình luận nhé!