Trong lĩnh vực lập trình, kiến thức đóng vai trò là nền tảng, nhưng kinh nghiệm từ những trải nghiệm thực tế chính là điểm cốt yếu để bạn trở thành một Backend Developer giỏi. Trong bài viết này, ITviec sẽ gợi ý các ý tưởng dự án thực hành giúp bạn nâng cao kỹ năng lập trình trong lộ trình học backend của mình.
Ở phần 1, chúng ta đã cùng tìm hiểu về Lộ trình học Backend toàn diện A-Z cho người mới bắt đầu, bao gồm:
- Tìm hiểu về cách hoạt động của Internet
- Tìm hiểu thêm các ngôn ngữ lập trình backend
- Tìm hiểu thêm về Version Control Systems và Repo Hosting Service
- Tìm hiểu thêm về Relational Database
- Tìm hiểu thêm về API
- Tìm hiểu thêm về Catching
- Tìm hiểu thêm về Database
- Tìm hiểu thêm về bảo mật web
- Tìm hiểu sâu các công nghệ Testing
- Tìm hiểu về CI/CD
- Tìm hiểu Scaling Database
Đọc Phần 2 sau đây để hiểu rõ hơn về:
- 4 cách thực hành học backend tốt nhất
- 8 ý tưởng thực hành lập trình backend
- Các tài liệu học backend
- Các câu hỏi thường gặp về học backend
4 cách thực hành học backend tốt nhất
Lưu ý: Đây chỉ là một số best practice cơ bản. Để trở thành một Backend Developer giỏi, bạn cần không ngừng học hỏi và tìm hiểu thêm về các công nghệ mới, các pattern thiết kế và các best practice khác.
Xác thực dữ liệu và bảo mật
Việc xác thực dữ liệu đầu vào là hàng rào bảo vệ đầu tiên chống lại các cuộc tấn công như injection (SQL injection, XSS). Nó giúp đảm bảo rằng dữ liệu được nhập vào ứng dụng luôn hợp lệ và an toàn.
Cách thực hiện:
- Kiểm tra kiểu dữ liệu: Đảm bảo dữ liệu có đúng kiểu (số, chuỗi, boolean,…) như mong đợi.
- Kiểm tra độ dài: Hạn chế độ dài của các chuỗi để tránh overflow và các vấn đề liên quan.
- Kiểm tra định dạng: Đảm bảo dữ liệu tuân thủ các định dạng đã định sẵn (email, số điện thoại,…).
- Sử dụng thư viện xác thực: Tận dụng các thư viện như Joi (Node.js) để đơn giản hóa quá trình xác thực. Đảm bảo chỉ những người dùng được phép mới truy cập và thực hiện các hành động trên hệ thống.
- Bảo vệ chống lại các cuộc tấn công: Ngoài SQL injection và XSS, cần đề cập đến các loại tấn công khác như CSRF, clickjacking.
- Quét và vá lỗ hổng: Thường xuyên quét hệ thống để phát hiện và vá các lỗ hổng bảo mật.
- Mã hóa: Ngoài xác thực dữ liệu đầu vào, cần mã hóa dữ liệu nhạy cảm như mật khẩu trước khi lưu trữ.
Xử lý lỗi (Error Handling)
Xử lý lỗi tốt giúp ứng dụng chạy ổn định, dễ dàng debug và cung cấp thông tin hữu ích cho người dùng.
Cách thực hiện:
- Sử dụng try-catch: Bắt các ngoại lệ có thể xảy ra và xử lý chúng một cách thích hợp.
- Logging: Ghi lại các lỗi vào log để dễ dàng theo dõi và phân tích.
- Trả về các mã lỗi HTTP: Sử dụng các mã lỗi HTTP phù hợp để thông báo cho client về lỗi xảy ra.
- Custom error: Tạo các loại lỗi tùy chỉnh để mô tả chi tiết hơn về lỗi.
Tách các lớp (Separation of Concerns)
Tách rõ các lớp giúp code dễ đọc, dễ bảo trì và dễ mở rộng.
Cách thực hiện:
- MVC: Mô hình MVC (Model-View-Controller) là một cách phổ biến để tách riêng các lớp.
- Các lớp khác: Ngoài MVC, có thể sử dụng các pattern khác như Repository pattern, Service pattern,…
Viết test case
Viết test cases giúp đảm bảo chất lượng code, phát hiện lỗi sớm và tăng sự tự tin khi refactor code.
Cách thực hiện:
- Unit tests: Kiểm tra từng đơn vị code nhỏ nhất.
- Integration tests: Kiểm tra sự tương tác giữa các thành phần khác nhau của hệ thống.
- End-to-end tests: Kiểm tra toàn bộ luồng xử lý của ứng dụng.
8 ý tưởng dự án thực hành nâng cao kỹ năng lập trình backend
Catching Proxy
Bạn được yêu cầu phát triển một công cụ CLI khởi động máy chủ proxy lưu trữ đệm, nó sẽ chuyển tiếp các yêu cầu đến máy chủ thực tế và lưu trữ đệm các phản hồi.
Nếu yêu cầu đó được thực hiện một lần nữa, nó sẽ trả về phản hồi đã lưu trữ đệm thay vì chuyển tiếp yêu cầu đến máy chủ.
Broadcast Server
Mục tiêu của dự án này là giúp bạn hiểu sâu hơn về WebSocket, một công nghệ cốt lõi cho các ứng dụng real-time. Bạn sẽ được trải nghiệm trực tiếp cách xây dựng một hệ thống đơn giản cho phép nhiều người dùng giao tiếp với nhau tức thì. Đây cũng là nền tảng vững chắc để bạn phát triển các ứng dụng phức tạp hơn như chat, bảng tin trực tuyến, game online,…
Với dự án này, bạn cần xây dựng một ứng dụng dòng lệnh (CLI) có khả năng hoạt động ở cả hai chế độ: máy chủ và máy khách. Dưới đây là các lệnh cơ bản:
- broadcast-server start: Khởi động máy chủ, lắng nghe các kết nối từ các máy khách trên một cổng đã định trước.
- broadcast-server connect: Kết nối một máy khách đến máy chủ đang chạy.
Khi một máy khách gửi tin nhắn, máy chủ sẽ nhanh chóng truyền đạt tin nhắn đó đến tất cả các máy khách đã kết nối khác. Ứng dụng cần đảm bảo:
- Xử lý đồng thời nhiều kết nối: Máy chủ phải có khả năng phục vụ nhiều máy khách cùng lúc mà không gây ảnh hưởng đến hiệu suất.
- Quản lý kết nối: Máy chủ cần theo dõi các máy khách đã kết nối và xử lý các trường hợp ngắt kết nối một cách trơn tru.
- Giao thức WebSocket: Sử dụng giao thức WebSocket để đảm bảo truyền tải dữ liệu nhanh chóng và hiệu quả giữa máy chủ và các máy khách.
Dịch vụ rút ngắn URL
Với dự án này, bạn sẽ phát triển một API RESTful để tạo ra những liên kết ngắn, dễ nhớ và theo dõi hiệu quả. Các chức năng cốt lõi bao gồm:
- Chuyển đổi một URL dài thành một URL ngắn.
- Lấy lại URL dài ban đầu từ một URL ngắn đã biết.
- Cho phép người dùng cập nhật hoặc xóa các URL ngắn đã tạo.
- Cung cấp thông tin chi tiết về số lần một URL ngắn được truy cập.
Khi thực hiện ý tưởng dự án này, bạn cần:
- Tạo giao diện đơn giản để người dùng tương tác trực tiếp với API.
- Đảm bảo khi truy cập vào URL ngắn, người dùng sẽ được tự động chuyển hướng đến URL gốc một cách nhanh chóng và chính xác.
- Lựa chọn một cơ sở dữ liệu phù hợp để lưu trữ thông tin về các URL ngắn, URL gốc và số liệu thống kê.
- Áp dụng các biện pháp bảo mật cần thiết để bảo vệ dữ liệu người dùng và ngăn chặn các cuộc tấn công.
E-commerce API
Mục tiêu của dự án này là giúp bạn hiểu cách xây dựng một ứng dụng nặng về logic với các mô hình dữ liệu phức tạp. Bạn cũng sẽ học cách tương tác với các dịch vụ bên ngoài và xử lý xác thực người dùng.
Dưới đây là các yêu cầu mà bạn cần đáp ứng khi thực hiện dự án này:
- Khả năng cho phép người dùng đăng ký và đăng nhập.
- Khả năng thêm sản phẩm vào giỏ hàng.
- Khả năng xóa sản phẩm khỏi giỏ hàng.
- Khả năng xem và tìm kiếm sản phẩm.
- Khả năng cho phép người dùng thanh toán và mua sản phẩm.
Bạn cũng nên có một bảng quản trị mà chỉ bạn mới có thể thêm sản phẩm, đặt giá, quản lý hàng tồn kho,…
Bắt đầu bằng cách xây dựng API trước rồi đến frontend; Bạn có thể sử dụng các công cụ như Postman để tương tác với API của mình. Hoặc xây dựng một frontend đơn giản với HTML, CSS và một số công cụ tạo mẫu như Jinja hoặc EJS.
Hệ thống đặt chỗ xem phim
Với ý tưởng này, bạn sẽ xây dựng hệ thống backend cho dịch vụ đặt chỗ xem phim. Dịch vụ này cho phép người dùng đăng ký, đăng nhập, duyệt phim, đặt chỗ cho các suất chiếu cụ thể và quản lý việc đặt chỗ.
Sản phẩm của bạn cần đáp ứng được các yêu cầu sau:
Về xác thực và ủy quyền người dùng:
- Người dùng có thể đăng ký và đăng nhập.
- Phân chia vai trò cho người dùng, chẳng hạn quản trị viên và người dùng thông thường. Quản trị viên phải có khả năng quản lý phim và giờ chiếu.
Về quản lý phim:
- Người quản trị có thể thêm, cập nhật và xóa phim.
- Mỗi bộ phim phải có tiêu đề, mô tả và hình ảnh áp phích.
- Phim nên được phân loại theo thể loại.
- Phim phải có giờ chiếu.
Về quản lý đặt phòng:
- Người dùng có thể nhận được phim và thời gian chiếu của một ngày cụ thể.
- Người dùng có thể đặt chỗ cho buổi chiếu phim, xem những chỗ ngồi còn trống và chọn chỗ ngồi họ muốn.
- Người dùng có thể xem các đặt chỗ của mình và hủy chúng.
- Người quản trị có thể xem tất cả lượt đặt chỗ, sức chứa và doanh thu.
Bảng xếp hạng theo thời gian thực
Dự án này yêu cầu bạn phải xây dựng một hệ thống bảng xếp hạng thời gian thực dựa trên điểm số của người dùng trong nhiều trò chơi hoặc hoạt động khác nhau. Hệ thống phải đáp ứng các yêu cầu sau:
- Người dùng phải có thể đăng ký và đăng nhập vào hệ thống.
- Người dùng có thể nộp điểm của mình cho các trò chơi hoặc hoạt động khác nhau.
- Hiển thị bảng xếp hạng toàn cầu cho thấy những người dùng đứng đầu trong tất cả các trò chơi.
- Người dùng có thể xem thứ hạng của mình trên bảng xếp hạng.
- Tạo báo cáo về những người chơi hàng đầu trong một khoảng thời gian cụ thể.
Với dự án này, bạn có thể sử dụng Redis để quản lý và truy vấn bảng xếp hạng một cách hiệu quả.
Database Backup Utility
Bạn sẽ phát triển một tiện ích giao diện dòng lệnh (CLI) để sao lưu bất kỳ loại cơ sở dữ liệu nào. Tiện ích này sẽ hỗ trợ nhiều hệ thống quản lý cơ sở dữ liệu (DBMS) như MySQL, PostgreSQL, MongoDB, SQLite và các hệ thống khác. Công cụ này sẽ có tính năng lập lịch sao lưu tự động, nén tệp sao lưu, tùy chọn lưu trữ (cục bộ và đám mây) và ghi nhật ký các hoạt động sao lưu.
Sản phẩm đầu ra của bạn cần đáp ứng được các yêu cầu sau:
Về kết nối cơ sở dữ liệu:
- Cung cấp hỗ trợ kết nối với nhiều loại cơ sở dữ liệu khác nhau (ví dụ: MySQL, PostgreSQL, MongoDB).
- Cho phép người dùng chỉ định các tham số kết nối cơ sở dữ liệu. Các tham số có thể bao gồm máy chủ, cổng, tên người dùng, mật khẩu và tên cơ sở dữ liệu.
- Xác thực thông tin đăng nhập dựa trên loại cơ sở dữ liệu trước khi tiến hành các hoạt động sao lưu.
- Triển khai xử lý lỗi cho lỗi kết nối cơ sở dữ liệu.
Về hoạt động sao lưu:
- Hỗ trợ kiểu sao lưu đầy đủ, gia tăng và khác biệt dựa trên loại cơ sở dữ liệu và tùy chọn của người dùng.
- Nén các tệp sao lưu để giảm dung lượng lưu trữ.
Về tùy chọn lưu trữ:
- Cho phép người dùng lưu trữ các tệp sao lưu cục bộ trên hệ thống.
- Cung cấp các tùy chọn để lưu trữ các tệp sao lưu trên các dịch vụ lưu trữ đám mây như AWS S3, Google Cloud Storage hoặc Azure Blob Storage.
Về ghi nhật ký và thông báo:
- Ghi nhật ký các hoạt động sao lưu, bao gồm thời gian bắt đầu, thời gian kết thúc, trạng thái, thời gian thực hiện và bất kỳ lỗi nào gặp phải.
- Tùy chọn gửi thông báo slack khi hoàn tất hoạt động sao lưu.
Về khôi phục hoạt động:
- Thực hiện thao tác khôi phục để phục hồi cơ sở dữ liệu từ tệp sao lưu.
- Cung cấp tùy chọn khôi phục có chọn lọc các bảng hoặc bộ sưu tập cụ thể nếu được DBMS hỗ trợ.
Nền tảng E-commerce mở rộng
Tạo ra một nền tảng thương mại điện tử linh hoạt và mạnh mẽ với kiến trúc microservices và Docker. Bạn sẽ xây dựng một hệ thống thương mại điện tử hiện đại, có khả năng mở rộng để đáp ứng nhu cầu kinh doanh ngày càng tăng. Mỗi tính năng của nền tảng sẽ được đóng gói thành một dịch vụ độc lập (microservice), giúp cho quá trình phát triển, triển khai và bảo trì trở nên dễ dàng và hiệu quả hơn.
Sau đây là lộ trình hướng dẫn bạn thực hiện dự án trên:
- Thiết lập Docker và Docker Compose: Tạo Dockerfile cho từng microservice. Sử dụng Docker Compose để xác định và quản lý các ứng dụng đa container.
- Phát triển các dịch vụ vi mô: Bắt đầu với một MVP đơn giản cho mỗi dịch vụ, sau đó lặp lại bằng cách thêm nhiều tính năng hơn.
- Tích hợp dịch vụ: Sử dụng REST API hoặc gRPC để giao tiếp giữa các dịch vụ vi mô. Triển khai API Gateway để xử lý các yêu cầu bên ngoài và định tuyến chúng đến các dịch vụ phù hợp.
- Triển khai khám phá dịch vụ: Sử dụng Consul hoặc Eureka để kích hoạt khám phá dịch vụ động.
- Thiết lập Giám sát và Ghi nhật ký: Sử dụng các công cụ như Prometheus và Grafana để giám sát. Thiết lập ngăn xếp ELK để ghi nhật ký tập trung.
- Triển khai nền tảng: Sử dụng Docker Swarm hoặc Kubernetes để triển khai sản xuất. Triển khai tự động mở rộng quy mô và cân bằng tải.
- Tích hợp CI/CD: Tự động hóa thử nghiệm và triển khai bằng Jenkins hoặc GitLab CI.
Các tài liệu học backend
Các khóa học trực tuyến
- Coursera, edX, Udemy: Các nền tảng này cung cấp rất nhiều khóa học về lập trình backend, từ cơ bản đến nâng cao. Bạn có thể tìm kiếm các khóa học về ngôn ngữ lập trình (Python, Java, Node.js, PHP…), framework (Django,Express.js, Laravel…), cơ sở dữ liệu (SQL, NoSQL)…
- FreeCodeCamp: Một cộng đồng học lập trình miễn phí lớn với rất nhiều bài tập thực hành và dự án nhỏ.
- YouTube: Có vô số kênh YouTube dạy lập trình backend chất lượng cao, như Traversy Media, The Net Ninja,freeCodeCamp.org,… Bạn có thể tìm kiếm theo ngôn ngữ hoặc framework mà bạn muốn học.
Sách hướng dẫn học backend
- “Clean Code” của Robert C. Martin: Cuốn sách kinh điển về viết code sạch, giúp bạn viết code hiệu quả và dễ bảo trì hơn.
- “Designing Data-Intensive Applications” của Martin Kleppmann: Giới thiệu về các hệ thống xử lý dữ liệu lớn,rất hữu ích cho việc thiết kế các hệ thống backend phức tạp.
- “The Pragmatic Programmer” của Andrew Hunt và David Thomas: Cuốn sách cung cấp những tư duy và kỹ năng cần thiết để trở thành một lập trình viên chuyên nghiệp.
- “Refactoring: Improving the Design of Existing Code” của Martin Fowler: Hướng dẫn cách cải thiện cấu trúc mã hiện có.
- “Clean Architecture” của Robert C. Martin: Mô hình kiến trúc phần mềm giúp xây dựng các hệ thống phần mềm bền vững.
- “Domain-Driven Design” của Eric Evans: Phương pháp thiết kế phần mềm tập trung vào mô hình hóa miền vấn đề.
Các nguồn tài liệu học backend khác
- Tài liệu chính thức của từng ngôn ngữ lập trình và từng framework: Đây là nguồn tài liệu đáng tin cậy nhất để học về một công nghệ cụ thể.
- Stack Overflow: Một diễn đàn lớn để hỏi đáp và tìm kiếm giải pháp cho các vấn đề lập trình.
- GitHub: Nơi bạn có thể tìm thấy rất nhiều dự án mã nguồn mở để tham khảo và học hỏi.
- Các blog kỹ thuật: Theo dõi các blog của các chuyên gia trong lĩnh vực để cập nhật kiến thức mới.
Các câu hỏi thường gặp về học backend
Mất bao lâu để hoàn thành các dự án trên?
Không nhất thiết phải hoàn thành các dự án trong khoảng thời gian nhất định.
Tuỳ thuộc khả năng kiến thức, bạn có thể thực hiện với tốc độ nhanh hoặc chậm tuỳ ý, miễn là trong lúc thực hành và sau khi hoàn thành, bạn đã có thể rút ra những kinh nghiệm lập trình dựa trên kiến thức đã học.
Cần phải học ngôn ngữ lập trình backend nào để thực hiện các dự án trên?
Bạn có thể sử dụng ngôn ngữ lập trình backend đã học để thực hiện các dự án trên. Các ngôn ngữ lập trình đó có thể là JavaScript, Golang, C#, Python,… Khi có thời gian, bạn cũng có thể thực hiện các dự án bằng nhiều ngôn ngữ để có thể đánh giá sự khác biệt.
Tổng kết học backend
Với những ý tưởng dự án thực hành kể trên, hy vọng bạn sẽ sớm hoàn thành và đúc kết được nhiều kinh nghiệm trong lập trình backend. Nếu gặp khó khăn trong lúc thực hiện, hãy thử tìm kiếm tài liệu hoặc nhờ đến sự trợ giúp từ cộng đồng nhé.