Chuyển đến nội dung
MINH VO Ghi chép từ công việc
của một kỹ sư tại Việt Nam
Cơ bản13 phút đọc

Cân bằng kiến thức rộng và chiều sâu khi học full stack

Dùng lỗi cập nhật tồn kho để chọn trọng tâm học full stack, kiểm tra phép trừ nguyên tử và xác định việc nào nên để sau.

Tranh màu nước vẽ những cuốn sổ, một quyển sổ mở và bút chì trên nền màu kem

Tôi muốn kiến thức rộng giúp mình đặt câu hỏi tốt hơn về toàn bộ tính năng, đồng thời vẫn đủ hiểu sâu để đưa ra và kiểm chứng quyết định ở ít nhất một phần của nó. Với lập trình viên full stack, điều đó thường có nghĩa là chọn một vấn đề học tập chính và xem các công cụ xung quanh như kiến thức hỗ trợ. Cố học mọi tầng với mức độ như nhau có thể khiến câu hỏi quan trọng nhất vẫn chưa được giải đáp.

Chặng đường của tôi đi qua frontend, backend, DevOps, mobile, desktop, cloud và AI. Phạm vi đó khiến việc chọn ưu tiên trở nên cần thiết; học cùng lúc bảy framework mới sẽ để lại quá ít thời gian tìm hiểu kỹ từng cái. Một kế hoạch hữu ích hơn cần nói rõ cuối đợt học, bạn muốn giải thích được điều gì hoặc làm ra được kết quả nào.

Chọn vấn đề có trọng tâm rõ ràng

Hãy hình dung một lập trình viên có thể xây giao diện React nhưng chưa giải thích được vì sao hai yêu cầu trừ hàng đồng thời lại làm sai số lượng tồn kho. Vấn đề chính của họ là tính đúng đắn của thao tác ghi. Một thư viện CSS mới hay nhà cung cấp triển khai khác có thể thú vị, nhưng chưa giải quyết khoảng trống trước mắt.

Trong một tháng học tập giả định, hãy lấy dịch vụ tồn kho nhỏ làm trọng tâm. Ban đầu có mười sản phẩm. Hai yêu cầu cùng đọc được mười, rồi lần lượt tính số lượng sau khi trừ hai và trừ ba. Nếu mỗi yêu cầu ghi giá trị tự tính, lần ghi cuối để lại bảy hoặc tám thay vì năm. Phép tính rất đơn giản; thứ tự xen kẽ mới là điều cần học. Yêu cầu HTTP, giao dịch cơ sở dữ liệu và giao diện cơ bản là các chủ đề hỗ trợ vì chúng giúp tái hiện và giải thích hành vi đó.

Hiểu sâu ở đây là mô tả được một thứ tự xen kẽ, dự đoán kết quả theo quy tắc đã chọn và kiểm tra trạng thái được lưu. Nó không có nghĩa là đã đọc mọi chương về cơ sở dữ liệu. Hiểu rộng là nhận ra lúc nào giao diện, hợp đồng API hoặc cách triển khai làm thay đổi điều kiện của bài thực hành.

Viết điều kiện kết thúc trước danh sách công cụ

Kế hoạch dễ hoàn thành hơn khi có các mốc kết thúc quan sát được. Với bài tồn kho này, những bằng chứng sau giúp người khác đánh giá tiến độ:

Câu hỏi cần họcBằng chứng cho một câu trả lời ban đầu hữu ích
Cập nhật có thể bị mất ở đâu?Chuỗi hai lần đọc và hai lần ghi làm lộ xung đột
Ứng dụng dùng quy tắc nào?Hợp đồng yêu cầu và ví dụ trạng thái lưu khớp nhau
Người dùng thấy gì sau xung đột?Các bước trên giao diện cho thấy cách xử lý tiếp
Điều gì vẫn chưa rõ?Danh sách ngắn các trường hợp chưa thử, như ghi nhiều vùng hoặc hợp nhất khi ngoại tuyến

Các mục tiêu này chủ động để trường hợp nâng cao ngoài dự án đầu tiên. Một bài thực hành có phạm vi rõ sẽ hữu ích hơn khi nêu được giới hạn, thay vì âm thầm xem mình đã bao quát toàn bộ “hệ thống phân tán”.

Mục tiêu trung tâm là ghi đúng dữ liệu, được hỗ trợ bởi kiến thức HTTP, giao diện và triển khai, kèm bằng chứng kết thúc cụ thểMở ảnh kích thước đầy đủ ↗

Phần trung tâm của sơ đồ nên nhận phần lớn công sức tìm hiểu. Các chủ đề xung quanh cần đủ để bài kiểm tra chính đáng tin cậy. Nếu triển khai chiếm hết cả tháng, hãy giảm phần đó xuống một môi trường đơn giản hơn và ghi nó thành vấn đề học tập riêng trong tương lai.

Luyện tập để biết mình còn nhớ gì

Bài tổng quan nghiên cứu của Dunlosky và cộng sự bàn về những phương pháp như tự kiểm tra và phân bố các buổi ôn tập theo thời gian. Đây là tổng quan nghiên cứu học tập, không phải lời bảo đảm rằng một lịch học sẽ phù hợp với mọi nhiệm vụ kỹ thuật. Một sản phẩm thực hành nhỏ giúp bạn kiểm tra khả năng nhớ lại và áp dụng sau một khoảng thời gian.

Sau khi tìm hiểu sai lệch tồn kho, hãy đóng tài liệu và vẽ lại hai chuỗi yêu cầu. Dự đoán ứng dụng sẽ lưu gì trước khi chạy thử. Nếu dự đoán sai, ghi rõ giả định nào không đúng. Về sau, thay một điều kiện, chẳng hạn làm chậm phản hồi, rồi xem lời giải thích còn đứng vững hay không.

Việc này đòi hỏi nhiều hơn nhận ra thuật ngữ quen thuộc trong bài hướng dẫn. Nó cũng tạo điểm bắt đầu cụ thể cho buổi tiếp theo. Bạn quay lại một mô hình còn câu hỏi chưa giải đáp, thay vì mở lại một danh sách dài các tab.

Bảo vệ chiều sâu khỏi việc mở rộng không cần thiết

Hướng dẫn review của Google đề nghị xem xét thiết kế, chức năng, độ phức tạp và kiểm thử. Tôi thấy các nhóm câu hỏi đó cũng hữu ích cho dự án học tập. Mình có giải thích được thiết kế không? Tính năng có hoạt động đúng dự định không? Mình có thêm độ phức tạp mà bài toán chưa cần không? Các bước kiểm tra có bao quát hành vi mình đang khẳng định không?

Giả sử dự án bỗng có vẻ cần một hệ thống chuyển thông điệp, dịch vụ xác thực riêng và bộ công cụ quan sát mới. Hãy hỏi mỗi phần bổ sung đang giải quyết câu hỏi nào chưa có lời đáp. Nếu chưa có câu hỏi như vậy, đưa ý tưởng vào danh sách để sau. Bạn vẫn có thể học các hệ thống đó sau này. Thêm ngay có thể khiến việc xác định quy tắc ghi ban đầu đúng hay sai trở nên khó hơn.

Thu hẹp quá mức cũng có giá của nó. Bài cơ sở dữ liệu không bao giờ đi qua ranh giới API có thể bỏ qua cách máy khách thử lại yêu cầu. Hãy đưa vào đủ hành vi xung quanh để bộc lộ rủi ro chính, rồi dừng khi bằng chứng đã đủ cho câu hỏi đã chọn.

Cuối tháng, giữ lại ứng dụng, các chuỗi bước đã dự đoán và những giả định từng sai. Chúng cho biết công việc có tạo ra lời giải thích dùng được hay không. Chủ đề tiếp theo có thể xuất phát từ điều chưa rõ, thay vì danh sách công nghệ dài nhất trên hồ sơ của người khác.

Dùng sai lệch tồn kho để kiểm tra mức độ hiểu sâu

Quay lại ví dụ mười sản phẩm và viết lịch sử riêng cho từng yêu cầu. A đọc mười, tính còn tám sau khi trừ hai. B đọc mười, tính còn bảy sau khi trừ ba. Nếu A ghi trước, B ghi sau, giá trị lưu là bảy. Đảo thứ tự ghi sẽ để lại tám. Không kết quả nào phản ánh cả hai lần trừ đã được chấp nhận, vốn phải để lại năm.

Bây giờ hãy xác định kiến thức còn thiếu. Phép tính không sai. Vấn đề là mỗi yêu cầu tính một giá trị thay thế từ dữ liệu có thể đã cũ khi đến lúc ghi. Một tính năng cơ sở dữ liệu, khóa ở ứng dụng hoặc hợp đồng cập nhật khác có thể xử lý tương tác này, nhưng phải hiểu bảo đảm thực tế của từng cách trước khi chọn.

Dùng tình huống này để tự giải thích. Bạn có vẽ được thứ tự xen kẽ mà không nhìn ghi chú không? Có giải thích được vì sao đổi sang framework frontend khác không làm thay đổi kết quả lưu không? Có chỉ ra được điểm cần phối hợp giữa các yêu cầu không? Nếu chưa rõ, việc học thêm cơ sở dữ liệu và xử lý đồng thời đã có mục đích trực tiếp.

Hướng dẫn giao dịch của PostgreSQL là điểm bắt đầu để hiểu cách nhóm các thao tác cơ sở dữ liệu. Chỉ có ranh giới giao dịch chưa đủ giải thích hành vi đồng thời; thao tác bên trong và mức cô lập vẫn quan trọng. Đó là câu hỏi nghiên cứu tiếp theo có ích, còn các thay đổi hạ tầng không liên quan có thể để sau.

Bài học tồn kho nối kết quả sai với chuỗi xen kẽ, quy tắc phối hợp đã chọn và cách kiểm tra hành vi khôi phụcMở ảnh kích thước đầy đủ ↗

Hình bổ sung mô tả bằng chứng về sự hiểu biết, không phải số giờ đã học. Một người có thể dành nhiều buổi cho chủ đề nhưng vẫn cần trợ giúp để giải thích lỗi chính. Người khác có thể đã biết nguyên lý và chỉ cần học cách một cơ sở dữ liệu cụ thể thể hiện nó.

So sánh ghi đè từ dữ liệu cũ với phép trừ nguyên tử

Một phương án cụ thể là để cơ sở dữ liệu tính phép trừ từ chính dòng nó cập nhật. Trong PostgreSQL, câu lệnh có tham số cho một dòng tồn kho có thể vừa thay số lượng vừa đặt điều kiện không để tồn kho âm:

UPDATE inventory
SET stock = stock - $2
WHERE item_id = $1 AND stock >= $2
RETURNING stock;

Ở đây $1 là mã sản phẩm, còn $2 là số lượng đã được kiểm tra là số nguyên dương. Bên gọi phải xem có dòng nào được trả về không; không được báo phép trừ thành công nếu không có dòng trả về. Ứng dụng xung quanh vẫn cần kiểm tra quyền và phản hồi phù hợp khi sản phẩm không tồn tại hoặc không đủ hàng.

Theo hành vi Read Committed của PostgreSQL, một thao tác cập nhật có thể chờ thao tác khác trên cùng dòng hoàn tất, sau đó áp dụng phép tính lên dòng mới và kiểm tra lại điều kiện. Tài liệu mức cô lập giao dịch mô tả quy tắc đó. Bắt đầu từ mười, hai lần trừ hai và ba được chấp nhận sẽ để lại năm bất kể thứ tự. Nếu bắt đầu từ mười và thử trừ tám cùng với ba, lần trừ được chấp nhận trước để lại không đủ cho lần còn lại; không được báo cả hai đều thành công.

Kết luận này hẹp hơn câu “giao dịch giải quyết vấn đề đồng thời”. Nó dựa vào hành vi cơ sở dữ liệu đã nêu, thao tác trên một dòng và cách ứng dụng xử lý khi điều kiện không còn khớp. Nó không làm cho việc gửi lại yêu cầu sau khi mất phản hồi trở nên an toàn, cũng không thiết lập bất biến trên nhiều dòng tồn kho. Đó là các câu hỏi học tập riêng. Mục tiêu hiểu sâu là giải thích chính xác câu lệnh đã loại bỏ lỗi ghi đè từ dữ liệu cũ nào và còn để lại những vấn đề gì.

Phân bổ việc hỗ trợ theo câu hỏi nó trả lời

Giả sử bạn có một quỹ thời gian cố định cho dự án. Đừng chia đều cho mọi công nghệ có tên trong kiến trúc. Dành phần lớn nhất để tái hiện và giải thích tương tác tồn kho. Làm giao diện đủ rõ để biết yêu cầu nào được chấp nhận, và dành công cho triển khai đủ để thử cùng hợp đồng bên ngoài môi trường phát triển nếu đó là một phần mục tiêu.

Hoạt động hỗ trợLý do đưa vào ngayLý do để sau
Hiển thị mã yêu cầuNối thao tác trên màn hình với thao tác được lưuKhông nên bỏ nếu thiếu nó sẽ không đọc được chuỗi sự kiện
Đổi thư viện giao diệnGiao diện hiện tại cản trở tương tác cần kiểm traThay đổi chỉ làm bài thực hành trông khác đi
Môi trường triển khaiLỗi phụ thuộc vào nhiều tiến trình ứng dụng đang chạyCâu hỏi hiện tại vẫn tái hiện được trong mô hình cục bộ nhỏ
Công cụ tạo tảiCần chủ động điều khiển các lần thử đồng thờiVài chuỗi xen kẽ tường minh đã làm lộ quy tắc còn thiếu
Hệ quản trị cơ sở dữ liệu mớiCông cụ đang dùng không thể biểu đạt hợp đồng cần cóChưa tìm hiểu kỹ công cụ hiện có

Đây là bảng quyết định cho ví dụ, không phải công thức chia thời gian áp dụng ở mọi nơi. Giá trị của nó là mỗi công cụ thêm vào phải trả lời một câu hỏi hiện tại. Kế hoạch vẫn có thể dành chỗ cho khám phá vì tò mò, miễn là rõ hoạt động đó phục vụ một mục tiêu khác.

Kiểm tra khả năng áp dụng khi điều kiện thay đổi

Sau khi giải thích được xung đột đầu tiên, đổi một điều kiện. Cho A trừ hai còn B cộng một sản phẩm được trả lại. Dự đoán tổng đúng và các kết quả có thể xuất hiện nếu ghi giá trị tính từ dữ liệu cũ. Hoặc giữ nguyên số lượng nhưng làm mất phản hồi của A sau khi cập nhật đã được chấp nhận. Hãy hỏi bên gọi nhận biết bằng cách nào rằng thử lại có thể trừ thêm một lần nữa.

Hai biến thể kiểm tra các ranh giới khác nhau. Biến thể đầu xem bạn có hiểu tương tác ngoài việc nhớ bộ số ban đầu không. Biến thể sau đưa vào danh tính thao tác và kết quả chưa rõ đối với bên gọi. Nó có thể đáng được tách thành bài thực hành sau thay vì lập tức mở rộng toàn bộ cách triển khai hiện tại.

Viết câu hỏi áp dụng và kết quả mong đợi trước khi chạy thử. Nếu mô hình chưa giải thích được ca mới, sửa lời giải thích. Nếu ca mới cần cơ chế khác, ghi rõ ranh giới đó thay vì khẳng định lời giải đầu đã bao quát tất cả. Nhờ vậy, kiến thức rộng có thể phát triển từ một lần tìm hiểu sâu mà không biến dự án thành danh sách tích hợp mất kiểm soát.

Nguồn tham khảo & đọc thêm

  1. Dunlosky et al.: improving students learning with effective learning techniques
  2. Google Engineering Practices: what to look for in a review
  3. PostgreSQL: transactions
  4. PostgreSQL: transaction isolation
← Về trang bài viết

Hình minh họa

100%