- Một tuần học 2 buổi. Mỗi buổi 2.5 tiếng online hoặc 3 tiếng với thực hành tại chỗ.
- Kết hợp dạy xen kẽ 14 buổi offline và 14 buổi online có ghi hình bài giảng.
- Giảng viên chính: Trịnh Minh Cường - Nguyễn Văn Thưởng (Docker)
- Trợ giảng chấm bài, hỗ trợ: Lục Thanh Ngọc - Đặng Quang Minh.
- Thiết kế giao diện ứng dụng đặt vé trực tuyến: Nguyễn Cao Hưng.
- Hỗ trợ kỹ thuật lập trình client side React: Đặng Quang Huy - Nguyễn Xuân Ba (không dạy chỉ trả lời hỏi đáp qua email, zalo).
- Trợ giảng, chấm bài từng buổi. Giảng viên chính hướng dẫn làm đồ án.
Giao diện dự án đặt vé xem phim qua mạng
Giảng viên code 30%, sinh viên hoàn thành nốt 70% còn lại
- Bổ xung kỹ thuật phân tích thiết kế hệ thống back end.
- Chuyên sâu lập trình REST API cho Client Side Rendering.
- Thêm phần Java Micro Benchmark để đánh giá tối ưu tốc độ thực thi.
- Bổ xung lập trình Socket Server sử dụng EzyFoxServer thay thế cho cho thư viện Socket chậm và khó lập trình của Spring Boot
- Bổ xung dự án mẫu API Gateway sử dụng Traefik để sinh viên so sánh với Spring Cloud Gateway
- Rút ngắn 1 buổi dạy JPA (giữ nguyên nội dung), để thêm 1 buổi dạy kết nối Redis server
- Rút 6 buổi dạy Docker xuống 4 buổi nhưng sẽ bổ xung nội dung Docker Swarm
Như vậy nội dung đào tạo tăng nhưng số buổi giữ nguyên. Do đó sinh viên sẽ phải chủ động nhiều hơn. Đặc biệt nếu sinh viên đã học lớp này thì nên làm dự án Spring Boot luôn, không nên tham gia dự án lập trình giao diện hay các công nghệ khác.
Chú ý: thứ tự buổi học có thể hoán đổi để phù hợp với khả năng tiếp thu của sinh viên. Những buổi học Docker dạy vào chiều thứ 7 hàng tuần.
- Mục tiêu khoá học, phương pháp học
- Giới thiệu yêu cầu, ý tưởng đồ án tốt nghiệp: web site bán hàng, web site đặt vé trực tuyến
- Tạo một dự án REST API Spring Boot Maven
- Kỹ thuật debug căn bản trên VSCode
- Tóm tắt lại cú pháp căn bản của Java thường xuyên dùng trong Spring Boot
- OOP: class, interface
- generics
- annotation
Bài tập
- Mô phỏng hướng đối tượng quan hệ: Lớp - Sinh viên - Sinh viên theo học lớp
- List - Map - Set - Queue (xếp theo tần suất sử dụng, các ví dụ căn bản)
- Phân tích thống kê tập dữ liệu 1000 người các thành phố khác nhau, nghề nghiệp, giới tính, độ tuổi khác nhau. Giảng viên chỉ ví dụ 50% các hàm.
Bài tập
- Sinh viên lập trình nốt 50% còn lại.
- Tại sao Java Stream và Lambda Expression giúp code clean hơn?
- Tóm tắt các nhóm hàm chính trong Java Stream API:
Stream.of
tạo stream- Chuyển đổi sang cấu trúc dữ liệu khác
.iterate
: duyệt.collect
: chọn.map
: ánh xạ.filter
: lọc, tìm kiếm.limit
: giới hạn.groupingBy
: nhóm.skip
: bỏ qua.distict
: loại phần tử lặp lại.sorted
: các phương pháp sort chuẩn, sort theo trường, hàm sort tự viết.findAny
vs.findFirst
: tìm
Bài tập
- Thực hiện lại bài tập lập trình buổi trước bằng Java Stream API
- Các annotation, hàm JUnit5
@BeforeAll, @BeforeEach, @AfterAll, @AfterEach
- AssertJ, FluentAPI
- Ví dụ viết unit test so sánh kết quả lập trình Java Stream API
Bài tập
- Bổ unit test kiểm tra stream API
- Lập trình theo interface
- Các Spring Boot quản lý Bean, Component
- Ba cơ chế DI phổ biến
- Giải thích - ví dụ sử dụng annotation
Bài tập
- Mô phỏng component gửi email nhưng có nhiều biến thể (implementation) khác nhau
- Ý nghĩa
@Controller
,@Service
,@Repository
- Demo sự khác biệt một ứng dụng CRUD sử dụng Thymeleaf vs sử dụng React
Bài tập
- Hoàn thiện nốt chức năng Xoá, Tìm kiếm của ứng dụng React --> Spring Boot
- Chữa bài tập buổi 2-3-4-5
- Các hiểu ý nghĩa annotation của Lombook qua các ví dụ
@AllArgsConstructor
,@NoArgsConstructor
,@RequiredArgsConstructor
,@Data
@Getter
,@Setter
@Cleanup
,@Value
,@With
@Log
Để học buổi này sinh viên đã phải biết lập trình Spring Boot căn bản
- Tóm tắt phương thức GET, POST, PUT, DELETE
- Request vs Response. Header vs Body
- URL parameters vs body parameters
- Document REST API sử dụng swagger
- Quản lý version REST API
Bài tập
- Thiết kế API để chọn đội bóng
- Thiết kế API quản lý mặt hàng web site bán trực tuyến
- Ý nghĩa HTTP Status code
- Try catch exception. Phân biện checked vs unchecked exceptiont trong Java
- Định nghĩa Custom Exception
- Trả về thông điệp có ý nghĩa
- Báo lỗi trong lúc development khác gì với báo lỗi ở production
- Logging
SFLog2J
Buổi này dùng để xử lý các thắc mắc của sinh viên, review bài tập và dạy thêm kỹ thuật benchmark tốc độ
- Tại sao cần đo đạc, tốc độ, hiệu năng hàm trong Java?
- Phân tích trọng số, loại bỏ yếu tố ngoại lai. Tối ưu quá sớm cùng không tốt - Premature optimization is evil
- Sử dụng Java Microbenchmark Harness để đo tốc độ thực thi.
- Ví dụ:
- So sánh tốc độ các phương pháp liệt kế số nguyên tố
- So sánh tốc độ khi không dùng và dùng Stream API
- Những câu hỏi nên đặt ra khi khảo sát yêu cầu khách hàng - người dùng
- Phân tích - phát triển yêu cầu: đối chiếu, xác nhận với khách hàng làm sao hiệu quả.
- Sử dụng Draw.io vẽ User story - diagram để khách hàng hiểu được ngay họ muốn gì.
- Thiết kế bảng dữ liệu quan hệ ERD ví dụ với CSDL Postgresql và công cụ DBeaver.
- Các quan hệ bảng căn bản: 1:1, 1:M, M:M, recursive, inheritance
Bài tập
- Phân tích thiết kế web site đặt vé xem phim trực tuyến
- Các ví dụ phổ biến:
{user, role}, {product, service, price, promotion}, {order, order_item, order_event}, {employe-manager}
- Các lỗi căn bản khi thiết kế bảng CSDL: không lưu lịch sử, quá khó truy vấn
- Sự kiện (event) khác gì với trạng thái (status). Quản lý sự kiện (event) - trạng thái (status) theo thời gian
Bài tập
- Viết lệnh DDL tạo bảng, quan hệ, và câu lệnh truy vấn thử nghiệm
- Tiếp tục hoàn thiện phân tích thiết kế web site đặt vé xem phim trực tuyến
- Định nghĩa Entity
- Primary key: sử dụng ID tự tăng hay chuỗi sinh ngẫu nhiên?
- Quan hệ 1:1, 1:M, M:M, M:M có cột trung gian
- Render JSON
- Các interface
JpaRepository, CRUDRepostory
- Giải thích 1-20 annotation căn bản của JPA Bài tập
- Mô hình qua toàn bộ web site đặt vé xem phim trực tuyến bằng JPA
- Thêm bản ghi và bản ghi liên quan
- Quản lý transaction trong JPA: Nested Transaction
- Giải thích 21-40 annotation nâng cao của JPA
- Derived query
- Custom query
- Custom Repository
- Giải thích 41-80 annotation nâng cao của JPA
Bài tập
- Hoàn thiện repo quản lý phim, rạp chiếu, lịch chiếu, suất chiếu, giữ chỗ, mua vé
- Fixed Rate
- Fixed Delay
- Cron Job
Bài tập
- Quét để huỷ lệnh giữ chỗ quá hạn thanh toán
- Công cụ quản lý Redis
- Các lệnh Rediscli căn bản
- publish - subscribe
- Redis stream
- Mô hình Request - Response khác gì với Publish - Subscribe
- Keep Connection Alive
- Ping - Pong
- Notify user vs Notify group
- Broad Cast All
Bài tập
- Lập trình kết nối từ Spring Boot tới EzyFox Server qua Redis stream
Sinh viên sẽ phải tự học React hoặc jQuery ở nhà. Giao diện tĩnh HTML cho sẵn.
- Thiết kế màn hình liệt kê phim, danh sách rạp, lịch chiếu, tìm kiếm phim theo tiêu đề
- Màn hình giữ chỗ trực quan đến từng vị trí ghế ngồi
- Hiển thị trạng thái giữ chỗ theo thời gian thực
- Axios vs RTK Query
Bài tập
- Sinh viên lập trình JavaScript trên mã nguồn web site tĩnh có sẵn HTML, CSS.
- Màn hình chính
- Màn hình liệt kê rạp, phân nhóm theo tỉnh - thành phố
- Màn hình liệt kê phim theo rạp
- Màn hình tìm kiếm
- Lập trình cập nhật trạng thái từng chỗ theo thời gian thực
- Đặt vé
- Xử lý thanh toán
- Docker căn bản:
docker pull, docker run, docker ps, docker image ls, docker inspect, docker exec, docker log
- Docker Compose
- Đóng gói ứng dụng Spring Boot vào Docker image
- Khởi động VM bằng Vagrant
- Docker Swarm
- Ví dụ API Gateway: Spring Cloud vs Traefik