• Mục lục

    Để tiện theo dõi, tôi xin giới thiệu danh mục các chủ đề và bài viết quan trọng

    Và còn nhiều clip đi sâu về kỹ thuật khác.

    Các chủ đề cũ hơn:

  • Góc Microservices.vn: Thêm Circuit Breaker playground

    Mục mới cho phép bạn thiết lập các thông số và giả lập một Circuit Breaker (CB) để hiểu cách nó hoạt động.

    Các bạn có thể thử bật chế độ Auto-fire để client gửi các request đến API gateway, API gateway sẽ forward lại request cho dịch vụ bên dưới, nếu số lỗi xảy ra đạt đến một ngưỡng tỷ lệ nhất định (Ngưỡng tỉ lệ lỗi), CB sẽ mở ra và gateway sẽ ngay lập tức trả về lỗi cho client. Sau một khoảng thời gian (reset timeout), gateway sẽ chuyển sang chế độ half-open, tức là sẽ thử forward lại, nếu vẫn lỗi nó sẽ tiếp tục chuyển sang open, ngược lại (thành công) sẽ, mạch sẽ được đóng lại và các request sẽ được chuyển tiếp đến service.

    Nếu không có Circuit Breaker, hệ thống sẽ tiếp tục forward request đến các dịch vụ vốn đang bị lỗi, từ đó tạo thêm gánh nặng với chúng, tăng thời gian phản hồi, thời gian giữ tài nguyên… và có thể làm lỗi từ một dịch vụ lan truyền ra toàn hệ thống.

    Ngưỡng tỉ lệ lỗi và Reset Timeout có thể được tùy chỉnh.

    https://www.microservices.vn/simulator/circuit-breaker

  • Code thời AI

    Đây là một phần trong một project tay trái làm từ 2009 (chuyển sang git từ 2016).

    Hàng ngàn giờ code và hàng ngàn commit (trong hình chỉ thể hiện thông tin về một project trong solution), chuyển từ .NET Framework với EF thô sơ đời đầu, SQL viết tay… sang một dự án .NET 10 “hiện đại” 😵 ngày nay, mà bởi chỉ làm một mình nên tồn tại vô số bug, vô số rác và vô số nợ kỹ thuật.

    Vậy là quyết định thử dùng Claude để hiện đại hóa, định hướng là sẽ làm một cách triệt để, tức là giải quyết các vấn đề về kiến trúc, phụ thuộc, thư viện trước, sau đó sẽ build mới lại từng project con luôn. Và vì vẫn đang có người dùng nên quá trình này phải đảm bảo thông suốt với thời gian chuyển đổi ngắn nhất có thể, và đặt ra mục tiêu là người dùng hoàn toàn không nhận ra hệ thống đang/đã được nâng cấp.

    (more…)
  • Tại sao phải học thuật toán?

    Nếu không học thuật toán + cấu trúc dữ liệu (hai cái không thể tách rời), bạn sẽ không thể hiểu được:

    – Tại sao code bạn chạy chậm chỉ vì xin cấp phát nhiều vùng nhớ nhỏ thay vì ít vùng nhớ lớn.

    – Tại sao đôi khi không nên dùng index trên các bảng dữ liệu nhỏ.

    – Tại sao đôi khi bộ nhớ còn trống nhưng vẫn không xin cấp phát được.

    – Tại sao khi copy nhiều file nhỏ lại chậm hơn copy 1 file lớn.

    – Làm sao các cơ sở dữ liệu hỗ trợ được ACID.

    – Tại sao khi gọi hàm đệ quy nhiều quá sẽ bị stack overflow.

    – Làm sao tránh trùng dữ liệu trên các hệ phân tán.

    – Tại sao các thư viện về List lại hay dùng Array ở bên dưới thay vì Linked List.

    Và vô số ví dụ khác.

    (more…)
  • Thời AI, học thế nào?

    Hai tuần rồi mình code khá ít, chủ yếu đi dự seminar và họp hành, tài khoản Claude phải cố nghĩ ra thứ để dùng 😅, tuần này bắt đầu rảnh nên lại viết bài chia sẻ một chút.

    Mình cũng có cơ hội nói chuyện với nhiều đồng nghiệp, nhất là với “đám” senior, thú thật là trong đám senior ở công ty thì mình thuộc hàng trẻ nhất 🥹, vì thường để lên senior thì phải nắm vai trò quan trọng trong một dự án nào đó ảnh hưởng lớn đến doanh thu, hơn là năm kinh nghiệm hay tuổi tác. Tất nhiên chủ đề AI luôn xuất hiện, mọi người đều khá thích thú, và hầu hết đều nói rằng hiện nay chỉ còn code 10-20% so với trước kia. Nói như vậy để các bạn thấy rằng những “ông già” chưa bao giờ chậm hơn các “ông trẻ” cả, chỉ là họ ít nói về nó hơn, bởi đã nhìn thấy những thứ tương tự trước đây, điều đó khiến họ không cảm thấy quá phấn khích.

    Vậy nếu muốn học để đi làm thì làm sao? Bây giờ bạn lên mạng mà hỏi về việc nên học thế nào trong thời đại này thì chắc chắn sẽ có không ít còm men xui đi học nghề khác hay chỉ cần học vibe code là được. Vậy ý kiến của một người đã học từ thời còn màn hình trắng đen, làm từ khi mấy cái IDE “stupid” hơn bây giờ nhiều, trải qua nhiều trend khác nhau… sẽ là thế nào?

    (more…)
  • Các cờ (flag) liên quan đến các phép tính toán học trong bộ xử lý x86

    Các cờ (flag) liên quan đến các phép tính toán học trong bộ xử lý x86

    Thanh ghi cờ là một thanh ghi đặc biệt trong bộ xử lý, nó chứa nhiều bit phản ánh kết quả của các phép tính, cũng như trạng thái của bộ xử lý. Trong đó có 5 cờ liên quan đến các phép toán số học, chúng sẽ được bật hoặc tắt dựa trên kết quả của lệnh tính toán trước đó. Các cờ đó là:

    1. Carry flag (CF): bằng 1 nếu phép tính có mượn. Hay nói cách khác, CF bằng 1 nếu (A + B) có kết quả lớn hơn số bit có thể chứa, hoặc nếu A < B nếu là phép trừ.
    2. Parity flag (PF): bằng 1 nếu tổng số bit 1 trong byte thấp nhất của kết quả là chẵn. Ví dụ kết quả là 0b_00001111 thì PF = 1 (số bit 1 là 4).
    3. Auxiliary Carry flag (AF): Bằng 1 nếu có xảy ra “nhớ” với 4 bit thấp nhất (Tương tự CF nhưng chỉ áp dụng cho 4 bit thấp nhất).
    4. Zero flag (ZF): Bằng 1 nếu kết quả bằng 0.
    5. Sign flag (SF): bằng 1 khi bit dấu (bit lớn nhất) của kết quả là 1, biểu thị đây là một kết quả âm.

    Các cờ được sử dụng trong các phép nhảy có điều kiện, các lệnh kiểu như JZ (Jump if Zero), JNZ (Jump if Not Zero), JC (Jump if Carry), JG (Jump if Greater), JE (Jump if Equal)… đều dựa trên các cờ tương ứng để quyết định.

    Note: mỗi nhóm 4 bit (biểu thị bằng một số hệ 16) còn được gọi là 1 nibble (Mỗi byte có 2 nibble).

  • Tổng hợp các mã lệnh được dùng trong bài tập 1 khóa học Kiến trúc máy tính và Assembly

    Tổng hợp các mã lệnh được dùng trong bài tập 1 khóa học Kiến trúc máy tính và Assembly

    Bài tập: nhập hai số nguyên, tính tổng và in ra màn hình.

    Video 1: https://youtu.be/JJTuWwFW2nc

    Video 2: https://youtu.be/rKNuJ7QJt4Q

    Video 3: https://youtu.be/cdmgwjOI5Rc

    MOV – Di chuyển dữ liệu

    Sao chép giá trị từ nguồn sang đích mà không làm thay đổi giá trị nguồn.

    Ví dụ: `mov rax, 1` gán giá trị 1 vào thanh ghi rax.

    Lưu ý là chúng ta không thể thực hiện một lệnh mov từ bộ nhớ đến bộ nhớ, để làm vậy bạn cần hai lệnh mov riêng biệt và dùng một thanh ghi làm nơi chứa giá trị trung gian.

    Không phải thanh ghi nào cũng có thể được thay đổi giá trị bằng lệnh mov.

    SYSCALL – Gọi hệ thống

    Thực hiện lời gọi hệ thống của Linux.

    Lệnh syscall chuyển điều khiển cho hệ điều hành, đồng thời đưa CPU về kernel mode, bạn cần gán giá trị thanh ghi rax bằng mã chức năng mà bạn muốn gọi.

    Xem chi tiết trong bài: https://youtu.be/gefL014dGz8

    (more…)
  • Vì sao nên nắm vững Kiến trúc máy tính và ngôn ngữ Assembly

    Vì sao nên nắm vững Kiến trúc máy tính và ngôn ngữ Assembly

    Đối với người học lập trình phần mềm chuyên sâu, đặc biệt là sinh viên, việc hiểu rõ kiến trúc máy tính là yêu cầu bắt buộc để có thể hiểu sâu vào những gì diễn ra bên trong máy tính. Do vậy đây là một môn học bắt buộc, không hiểu rõ những kiến thức nền tảng này sẽ khiến bạn không thể đào sâu những khái niệm liên quan như đa luồng, bất đồng bộ, các kỹ thuật tối ưu, cách sử dụng bộ nhớ hiệu quả… Và hiển nhiên bạn không thể trở thành một chuyên gia nếu chỉ biết những kiến thức cơ bản, và trong ngành này, việc không thể trở thành chuyên gia khiến bạn chỉ có thể cạnh trạnh bằng sức khỏe, một thứ mà theo thời gian sẽ ngày càng kém đi.

    Assembly là ngôn ngữ lập trình sát với phần cứng nhất, khi viết bằng ngôn ngữ này, chúng ta kiểm soát chương trình đến từng byte, từng mã lệnh. Hai môn học Kiến trúc máy tính và ngôn ngữ Assembly luôn đi cùng với nhau, bởi phải có kiến thức về Kiến trúc máy tính mới có thể viết chương trình Assembly, ngược lại, viết chương trình bằng Assembly sẽ giúp bạn có một môi trường thực hành, bạn có thể “nhìn thấy” những thứ trong lý thuyết được áp dụng vào thực tế.

    (more…)
  • Domain Event và Integration Event

    Domain Event và Integration Event

    Event là gì?

    Một event là một sự kiện gì đó đã xảy ra trong quá khứ.

    Khi bạn viết một phần mềm, chung quy lại tất cả mọi thứ chỉ để phục vụ cho mục đích cuối cùng là quản lý các đối tượng có trong hệ thống. Một phần mềm quản lý nhân sự sẽ quản lý danh sách và trạng thái của các nhân sự, một hệ cơ sở dữ liệu quản lý danh mục các bảng và dữ liệu bên trong chúng, một hệ điều hành quản lý các tiến trình và các thiết bị ngoại vi…

    Lưu ý là “trạng thái” biểu thị giá trị hiện tại của tất cả các thuộc tính, ví dụ tên hay địa chỉ của nhân sự, giá trị của các dòng trong một bảng hay ID của một tiến trình…

    Mỗi một sự thay đổi trạng thái sẽ dẫn đến một sự kiện, hay nói cách khác mỗi một sự kiện đại diện cho một sự thay đổi trạng thái nào đó. Vì sự kiện luôn là một thứ đã diễn ra trong quá khứ nên giá trị của nó không thể thay đổi và được đặt tên ở thì quá khứ, ví dụ như PersonNameChanged, RowAdded hay OrderDelivered. Tất nhiên chúng ta sẽ thấy rằng trong một phần mềm sẽ có rất nhiều sự kiện xảy ra, việc mô hình hóa hay viết ra tất cả các event là không thể, và thực ra là không cần thiết, chúng ta chỉ cần định nghĩa các sự kiện có ảnh hưởng đến bài toán cần giải quyết.

    (more…)
  • Sự khác nhau giữa file .h và file .cpp

    Câu hỏi:

    Trả lời:

    Ai cũng biết là ta có thể viết code trong nhiều file .c/.cpp khác nhau, các trình biên dịch cho phép điều này nhằm giúp ta tổ chức mã nguồn dễ hơn, hãy thử tưởng tượng những khó khăn nếu mỗi chương trình phải viết trong một file, chưa kể đến quá trình merge code, team tầm 5 người thì có lẽ thời gian merge còn lâu hơn thời gian code nữa.

    (more…)
  • Hướng dẫn học .NET

    👉 Tìm hiểu về .NET: Bạn ít nhất phải biết .NET là gì (không biết thì đọc ở đây: https://daohainam.com/2023/10/18/gioi-thieu-ve-net/), cách nó chạy chương trình như thế nào, rồi tiếp đến tìm hiểu cách viết, dịch và chạy chương trình. Ít nhất bạn phải biết bạn làm được gì với nó, cách tải và cài đặt Visual Studio (dùng hẳn bản Visual Studio nhé, đừng dùng Visual Studio Code, tập đạp xe thì cứ kiếm cái xe bình thường mà tập, đừng bắt đầu bằng xe một bánh), cách tạo project, biên dịch, chạy và debug.

    Bạn có thể học .NET bằng cách theo dõi các video bài học của một tác giả có hơn 20 năm kinh nghiệm .NET tại đây: https://www.youtube.com/playlist?list=PLRLJQuuRRcFlaITD5F6XKQJxOt8QgCNAg

    👉 Học ngôn ngữ lập trình: C# là ngôn ngữ chính thống nhất và đầy đủ nhất trên .NET, cú pháp đơn giản, thân thiện với người đã biết C++, Java nên học rất nhanh. Bắt đầu bằng các chương trình console, giải các bài tập đơn giản để quen với cú pháp của nó.

    Bạn nên lập ra một danh sách các bài tập cần viết trước khi bắt đầu, đặt mục tiêu hoàn thành là khi bạn làm hết các bài đó. Danh sách bài tập có thể tham khảo từ các sách học ngôn ngữ khác.

    (more…)