Welcome to MikeDaDev's Blog – notes on Java, backend & system design.

Explore
MikeDaDev's Blog

#software-development

Things I've written about #software-development
  • jev engineering: make ai intelligent more like human

    Sao phải đốt tiền gọi LLM cồng kềnh chỉ để kiểm tra một điều kiện Boolean? Bài này nói về Jev Engineering: mô hình AI System 1 phi tự hồi quy (Non-autoregressive), rẽ nhánh theo ngữ nghĩa với độ trễ cỡ 70-500ms, rẻ hơn LLM nhiều lần theo công bố của TypeSafe, và đầu ra luôn đúng kiểu.

  • in ai / llmops

    llm evaluation & observability

    Đưa AI lên production rồi thì đo độ chính xác và theo dõi nó kiểu gì? LLM-as-a-Judge, RAG Triad (Context Relevance, Faithfulness, Answer Relevance), Prompt Drift và tracing đầu cuối với Langfuse & OpenTelemetry.

  • in ai / llm

    reasoning models & test-time compute

    DeepSeek-R1 làm cả ngành AI giật mình vì cho thấy năng lực của model không chỉ tăng nhờ pre-training mà còn nhờ cho model nghĩ lâu hơn lúc suy luận (test-time compute). Bài này nói về chuyện đó: scaling law, cách DeepSeek dùng Reinforcement Learning với GRPO, kiến trúc MoE/MLA, và dev phần mềm rút ra được gì.

  • in ai / agent

    langgraph & stateful multi-agent

    Vì sao Chain tuyến tính (DAG) không đủ cho AI Agent phức tạp? Bài này nói về kiến trúc LangGraph, tư duy State Machine, cơ chế time-travel và mấy mẫu phối hợp multi-agent hay gặp.

  • in ai / llm

    vLLM & PagedAttention

    Model chỉ nặng vài chục GB mà GPU cứ báo hết VRAM? Thủ phạm là KV Cache. Bài này mổ xẻ chuyện KV Cache phình to, cách PagedAttention mượn ý tưởng bộ nhớ ảo của hệ điều hành để xử lý nó, và vì sao vLLM đẩy throughput suy luận lên cao gấp nhiều lần (tới 24 lần so với HuggingFace Transformers, theo số đo của nhóm tác giả).

  • kỹ sư phần mềm trong kỷ nguyên AI

    AI viết 1.000 dòng code trong vài giây, vậy giá trị thật của một Software Engineer còn nằm ở đâu? Bài này nói về nghịch lý năng suất, cái bẫy mai một kỹ năng, chuyện review code ngày càng quá tải và cách tự định vị lại bản thân để không bị thay thế.

  • in ai / rag

    graph rag & advanced rag

    Vì sao vector search kiểu truyền thống bó tay trước câu hỏi nhiều bước (multi-hop)? Bài này mổ xẻ kiến trúc GraphRAG, cách kết hợp Knowledge Graph với Hybrid Search để đưa hệ thống RAG lên mức dùng được cho doanh nghiệp.

  • in ai / n8n

    AI agent workflows với n8n

    Từ chỗ viết cả trăm dòng code nối API tới chỗ dựng hẳn một hệ thống AI Agent tự động hoá. Bài này đi qua kiến trúc AI Agent trong n8n, LangChain node, Vector Store, Tool Calling và mấy kinh nghiệm khi đưa lên production.

  • T24 core banking

    T24 (Temenos Transact) là hệ thống core banking, nơi mọi giao dịch tài chính của ngân hàng chạy qua. Chia module rõ ràng, xử lý realtime, nó đang làm xương sống cho nghiệp vụ chính của khoảng một nghìn ngân hàng. Bài này ghi lại những gì dev cần biết khi phải làm việc với nó.

  • activiti 8

    Activiti 8 là engine BPM/workflow mã nguồn mở, làm ra để chạy tốt trên môi trường cloud-native. Nó chạy được BPMN chuẩn, gắn chặt với Spring Boot, nên hay được dùng làm "nhạc trưởng" điều phối microservices, nhất là khi phải quản lý mấy luồng giao dịch phân tán rắc rối theo kiểu Saga.

  • backbase - digital banking platform

    Backbase là một nền tảng ngân hàng số (Engagement Banking Platform) giúp ngân hàng làm mới trải nghiệm khách hàng trên mọi kênh mà không phải thay cả hệ thống core banking cũ. Nó nằm như một lớp tương tác phía trên các hệ thống sẵn có, phục vụ cả ngân hàng bán lẻ, doanh nghiệp lẫn quản lý tài sản.

  • BPMN 2.0

    BPMN 2.0 (Business Process Model and Notation) là chuẩn quốc tế về ký hiệu đồ họa để vẽ và thiết kế quy trình nghiệp vụ. Nó là "ngôn ngữ chung" giữa business analyst, dev và ban quản lý, và model vẽ ra có thể chạy trực tiếp trên workflow engine. Bài này đi qua events, activities, gateways, process variables, listeners, error handling, tích hợp Activiti với Spring Boot và các best practice.

  • clean architecture

    Clean Architecture là kiểu kiến trúc chia hệ thống thành các vòng tròn đồng tâm, với một luật phụ thuộc rất chặt: lớp bên trong (chứa logic nghiệp vụ) không bao giờ được phụ thuộc vào lớp bên ngoài (UI, Database, Framework). Nhờ vậy nghiệp vụ không dính vào công nghệ cụ thể nào, dễ test, dễ bảo trì và dễ mở rộng.

  • RabbitMQ căn bản

    RabbitMQ là gì, vì sao nên dùng, kiến trúc bên trong và cách tích hợp với Spring Boot, kèm các pattern đảm bảo reliability cho production.

  • java advanced performance techniques

    Các kỹ thuật tối ưu hiệu năng Java ở cấp hệ thống: branchless programming, autoboxing, EnumSet, Virtual Threads, bẫy Hibernate/JPA, Caffeine cache, GraalVM Native Image, data locality, lock-free và SIMD.

  • java comparison

    Những cặp khái niệm Java/Spring hay bị hỏi khi phỏng vấn Senior mà cũng dễ dùng sai trên production: == vs equals(), HashMap vs ConcurrentHashMap, synchronized vs ReentrantLock, PUT vs PATCH...

  • Saga pattern trong Microservices

    Saga Pattern là cách xử lý transaction phân tán trong microservices: chia một quy trình dài thành chuỗi local transaction. Bước nào lỗi thì chạy compensating transaction để hoàn tác các bước trước, nhờ vậy dữ liệu vẫn nhất quán (eventual consistency) mà không phải lock cả hệ thống.

  • high-performance java techniques

    Mấy kỹ thuật tối ưu hiệu năng Java ít người để ý: object pooling, primitive arrays, lock-free, batch, zero-copy, viết code dễ cho JIT, kèm ví dụ, cơ chế bên dưới và lúc nào không nên dùng.

  • multithreading vs parallel stream

    So sánh Multithreading truyền thống (Thread, ExecutorService, CompletableFuture) với Parallel Stream trong Java: khác nhau về mô hình, mức kiểm soát, khi nào nên dùng cái nào, các lỗi hay gặp và chỗ Virtual Threads (Java 21+) chen vào.

  • java 25 LTS

    A close look at Java 25 LTS: Compact Object Headers (JEP 519), Stream Gatherers (JEP 485), Flexible Constructor Bodies (JEP 513), Scoped Values (JEP 506) and Generational ZGC, with notes on what they change for high-throughput cloud services.

  • acid in sql

    Nếu database SQL là cái két sắt thì ACID (Atomicity, Consistency, Isolation, Durability) là bộ khoá giữ cho mọi giao dịch an toàn. Nhờ nó, dù hệ thống sập nguồn hay gặp lỗi bất ngờ, thao tác dữ liệu hoặc chạy trọn vẹn, hoặc hoàn tác hết, dữ liệu không bao giờ rơi vào trạng thái nửa vời.

  • mdc tracing

    MDC hoạt động ra sao, cách gắn traceId vào log và chuyền nó qua HTTP, RabbitMQ, Kafka, gRPC, thread pool; khi nào nên để Micrometer Tracing làm thay, và cách xuất log JSON cho dễ tìm.

  • in java / kafka

    kafka advance

    Phần hai của loạt Kafka: những thứ bạn sẽ cần khi hệ thống lớn dần, từ Kafka Connect, Schema Registry, bảo mật, exactly-once, testing, chạy Kafka trên K8s cho tới playbook xử lý sự cố.

  • gRPC trong Spring Boot

    gRPC chạy thế nào bên dưới, Protobuf và HTTP/2 giúp nó nhanh ra sao. Kèm cách dựng gRPC với Spring Boot cho production và mấy bài học mình rút ra khi đưa nó lên chạy thật.

  • model context protocol

    Model Context Protocol (MCP) là một chuẩn mở giúp trợ lý AI kết nối thẳng và an toàn tới nguồn dữ liệu, API hay môi trường làm việc bên ngoài. Có một giao thức chung như vậy, AI đọc được ngữ cảnh của người dùng mà không cần ai ngồi viết connector riêng cho từng ứng dụng.

  • maven dependencies

    Thoát khỏi Dependency Hell bằng cách quản lý dependency cho gọn. Đi qua cấu trúc POM, BOM, dependency scope, multi-module và vòng đời build trong project Java.

  • in java / grpc

    grpc

    grpc là gì, tại sao google tạo ra nó, cách hoạt động bên trong, so sánh với REST và GraphQL và hướng dẫn xây dựng gRPC service với Java & Spring Boot.

  • ai agentic systems

    AI agent là bước chuyển lớn của AI: từ chatbot thụ động chỉ biết "hỏi - đáp" sang những "nhân viên số" tự lên kế hoạch, tự hành động để giải quyết việc phức tạp. Bài này đi qua cấu tạo của agent, vòng lặp ReAct, cách lập kế hoạch, multi-agent và mấy kinh nghiệm khi xây agent.

  • nâng cấp java 25 LTS

    Nhìn Java 25 LTS từ góc độ người làm kiến trúc: so với Java 21/17 thì hơn ở đâu. Compact Object Headers (JEP 519), Stream Gatherers (JEP 485), Flexible Constructor Bodies (JEP 513), Generational ZGC & Shenandoah, Scoped Values (JEP 506), và cách tính bài toán ROI khi nâng cấp hệ thống cloud-native.

  • rabbitmq pattern

    Các pattern hay dùng của RabbitMQ trong Spring Boot: publisher confirm, manual ack, DLQ, retry, idempotent consumer, giữ thứ tự message, và cách giữ dữ liệu nhất quán bằng Outbox và Saga.

  • redis pattern

    Redis đâu chỉ để làm cache. Bài này gom lại các chiến lược caching, cách cấu hình cho đỡ tốn bộ nhớ và mấy pattern phân tán hay dùng với Redis trong hệ thống Backend.

  • jmeter

    Apache JMeter là phần mềm mã nguồn mở để kiểm thử hiệu năng (performance testing) và kiểm thử chịu tải (load testing) cho ứng dụng web, API hoặc cơ sở dữ liệu. Nó giả lập hàng ngàn người dùng ảo truy cập cùng lúc, để bạn đo thời gian phản hồi, tìm lỗi và biết máy chủ chịu được tới đâu.

  • in java / solid

    solid principles

    SOLID là 5 nguyên tắc thiết kế hướng đối tượng giúp code dễ đọc, dễ mở rộng, dễ test và dễ sửa về sau.

  • prometheus

    Prometheus không chỉ là mấy con số khô khan, nó là trung tâm của hệ sinh thái Observability. Bài này nói về kiến trúc, cách nghĩ khi thiết kế metrics và cách tích hợp với Spring Boot.

  • bitwise operations in java

    Bitwise thoạt nhìn hơi khó chịu vì phải nghĩ bằng số nhị phân thay vì thập phân như mọi khi. Nhưng nắm được quy luật rồi thì thấy nó chạy rất nhanh, tốn ít bộ nhớ, và xuất hiện khắp nơi từ permission, HashMap cho tới câu hỏi phỏng vấn.

  • jenkins

    Ghi chép về Jenkins: kiến trúc Controller/Agent, Pipeline as Code, Shared Libraries và các best practice khi vận hành CI/CD.

  • in java / kafka

    kafka basic

    kafka là gì, sao lại chọn kafka mà không phải rabbitmq? bài này đi qua kiến trúc kafka, cách dùng với spring boot, mấy pattern hay gặp ngoài đời và checklist trước khi lên production.

  • câu hỏi phỏng vấn java senior

    Các câu hỏi phỏng vấn nâng cao cho Senior & Staff Software Engineer: False Sharing & Cache Line 64-byte, bẫy Carrier Pinning trong Virtual Threads, Parent-Child Connection Starvation trong HikariCP, Zero-Allocation trên đường dẫn hiệu năng cao và thiết kế Idempotency.

  • mongodb

    Không dừng ở định nghĩa NoSQL, bài này đi vào kiến trúc MongoDB, cách thiết kế dữ liệu (Embed hay Reference), chiến lược đánh index, và cách dùng MongoDB cho đúng trong microservices với Spring Boot.

  • java functional extends

    JDK chỉ có sẵn Function và BiFunction, tối đa 2 tham số. Bài này tự viết TriFunction tới DecaFunction (3 đến 10 tham số) kèm andThen, ví dụ chạy được, và bàn khi nào nên dùng, khi nào nên gom tham số vào một record.

  • redis

    Redis làm được nhiều hơn một bộ nhớ đệm. Bài này nói về kiến trúc bên trong, cách tối ưu bộ nhớ và các pattern phân tán dùng Redis trong hệ thống Backend.

  • cqrs pattern

    CQRS là pattern tách hẳn phần đọc dữ liệu (Query) ra khỏi phần ghi, thay đổi dữ liệu (Command). Tách ra rồi thì mỗi bên tự tối ưu hiệu năng, bảo mật và database theo cách của mình, rất đáng dùng cho những hệ thống phức tạp mà lượng đọc và ghi chênh nhau nhiều.

  • coding convention và chuẩn mực java

    Ghi chú về coding convention cho team Java: dùng chuẩn Google, bỏ package-by-layer để chuyển sang Vertical Slice, chặn NullPointer bằng JSpecify & NullAway, và kiểm tra ranh giới kiến trúc tự động trong CI/CD bằng ArchUnit.

  • stack & queue

    Ghi chú về cách chọn và dùng Stack, Queue, Deque trong Java: khi nào dùng ArrayDeque, PriorityQueue, BlockingQueue hay ConcurrentLinkedQueue cho hệ thống chịu tải cao.

  • dependency injection

    Dependency Injection (DI) là pattern dùng để hiện thực nguyên tắc Inversion of Control (IoC). Object không tự `new` mấy thứ nó cần nữa, mà để một bên quản lý chung (như Spring Container) "tiêm" (inject) dependency vào qua constructor, setter hoặc field. Nhờ vậy các class ít dính chặt vào nhau (loose coupling), code linh hoạt, dễ sửa và nhất là dễ viết unit test.

  • solid principles - tổng quan

    **SOLID** là 5 nguyên tắc thiết kế cơ bản của lập trình hướng đối tượng: Single Responsibility, Open-Closed, Liskov Substitution, Interface Segregation và Dependency Inversion. Áp dụng đúng thì code có cấu trúc rõ ràng, các phần ít dính vào nhau, nên dễ mở rộng, dễ test và dễ bảo trì về lâu dài.

  • postgre-sql

    Đi một vòng PostgreSQL: MVCC, WAL chạy ra sao, đánh index thế nào cho đúng, và mấy kinh nghiệm tối ưu hiệu năng "xương máu" khi dùng chung với Spring Boot.

  • chữ ký số trong java

    Chữ ký số (digital signature) trong Java, dùng qua class java.security.Signature, giúp xác thực dữ liệu đến từ đâu và chắc chắn nó chưa bị ai sửa. Cơ chế dựa trên mã hoá bất đối xứng: người gửi dùng private key để ký, người nhận dùng public key tương ứng để kiểm tra lại.

  • spring security với jwt

    Spring Security kết hợp JWT (JSON Web Token) là cách phổ biến để bảo mật RESTful API. Thay vì stateful (Session/Cookie lưu trên server), xác thực chuyển sang stateless: mọi thông tin nằm trong token, nên hệ thống dễ scale hơn và đỡ tốn bộ nhớ trên server.

  • session, cookies & jwt

    Cookie là mấy mẩu dữ liệu nhỏ nằm ngay trên trình duyệt. Khi làm đăng nhập, Session giữ trạng thái trên server và dùng cookie để mang Session ID qua lại, còn JWT thì stateless: nhét luôn thông tin người dùng đã ký vào token, server đỡ phải nhớ gì.

  • java concurrency

    Concurrency trong Java 21 & Spring Boot 3.x: Virtual Threads, ScopedValue và các pattern xử lý bất đồng bộ trong hệ thống phân tán hiệu năng cao.

  • http abstractions

    Các class và interface HTTP của Spring (ResponseEntity, HttpHeaders, MediaType, RestTemplate, WebClient, RestClient...) gói HTTP thô thành object dễ dùng, giúp code độc lập với web server bên dưới và dễ unit test hơn.

  • java virtual threads

    Virtual Threads trong Java 21: vì sao thread truyền thống khó scale, virtual thread chạy thế nào bên dưới, cách dùng cơ bản và mấy chỗ cần để ý (pinning, ThreadLocal, giới hạn tài nguyên).

  • logback & mdc in spring

    A practical guide to building observable Spring microservices with Logback, MDC and distributed tracing: the patterns that work, the traps teams fall into, and fixes that held up in production.

  • map in java

    Mổ xẻ bên trong các loại Map của Java, mỗi loại tốn kém ở đâu, và chọn loại nào cho đúng khi hệ thống chịu tải cao

  • list in java

    Đào xuống tầng low-level xem ArrayList, LinkedList chạy thế nào, vì sao lý thuyết nói một đằng mà hiệu năng thực tế một nẻo, và mấy cái bẫy dễ dính khi chạy đa luồng.

  • project Lombok

    Lombok can thiệp vào Abstract Syntax Tree (AST) thế nào dù JSR 269 không cho phép, những cái bẫy hay gặp trên Production (JPA @Data, @EqualsAndHashCode với kế thừa, @Builder với Jackson, @SneakyThrows) và cách thay bằng Java Records & MapStruct.

  • spring test annotations

    Ghi chú về các Spring Test annotations để viết Unit Test và Integration Test trong Spring Boot: @SpringBootTest, test slices, @MockitoBean/@MockitoSpyBean (thay @MockBean/@SpyBean), Testcontainers.

  • ioc container & application context

    IoC Container là phần lõi của Spring Framework: tự khởi tạo, nối và quản lý vòng đời của các object (Beans) thông qua Dependency Injection. **Application Context** là bản mở rộng (interface) của IoC Container, ngoài các tính năng cơ bản còn có thêm event, đa ngôn ngữ (i18n), tích hợp AOP và nhiều thứ khác.

  • spring data jpa

    Spring Data JPA là module của Spring Framework, nằm trên Java Persistence API (JPA). Thay vì viết boilerplate code để làm việc với database, bạn chỉ cần khai báo interface (kế thừa `JpaRepository`), Spring sẽ tự cung cấp phần implement cho các thao tác CRUD cơ bản. Điểm hay nhất là tự sinh câu SQL từ tên method (ví dụ `findByEmailAndStatus`), và hỗ trợ sẵn phân trang, sắp xếp, auditing.

  • spring jackson annotations

    Các annotation của Jackson (có sẵn trong Spring Boot) cho phép kiểm soát chi tiết việc chuyển đổi (serialization và deserialization) giữa object Java và JSON. Với @JsonProperty (đổi tên trường), @JsonIgnore (bỏ dữ liệu nhạy cảm khi trả về), @JsonFormat (định dạng ngày tháng) hay @JsonInclude (lọc giá trị null), bạn tùy biến được cấu trúc dữ liệu qua API mà không phải đụng vào logic.

  • @Transactional & Spring AOP

    @Transactional và Spring AOP (Aspect-Oriented Programming) là hai thứ đứng sau cơ chế quản lý transaction tự động của Spring. Nhờ chúng mà business logic tách được khỏi mấy việc kỹ thuật lặp đi lặp lại (cross-cutting concerns) như mở transaction, commit hay rollback.

  • spring data core annotations

    Spring Data có một loạt annotation như `@Id`, `@Query`, `@Repository`, `@Transient` để map class Java (entity) vào database và lo phần truy xuất dữ liệu. Nhờ chúng mà bớt được cả đống boilerplate: khai báo khoá chính, quan hệ giữa các bảng hay query tuỳ chỉnh đều gọn, dễ đọc, dễ bảo trì.

  • spring web bind annotations

    Spring Web Bind Annotations là nhóm annotation trong Spring MVC và Spring WebFlux, đóng vai trò cầu nối: tự lấy dữ liệu từ các phần của HTTP Request (URL, Body, Headers) rồi gán (bind) vào tham số của method trong Controller.

  • java ThreadPoolExecutor

    Mổ ThreadPoolExecutor từ bên trong: biến ctl gói bit thế nào, vì sao mấy static factory của Executors là quả bom OOM, vì sao Worker tự dựng khoá không tái nhập trên AQS, 4 cách xử lý backpressure và quy trình graceful shutdown 2 pha để chạy production.

  • biến, kiểu dữ liệu và toán tử trong java

    Biến, kiểu dữ liệu và toán tử trong Java, giải thích cho người mới: từ hình ảnh "chiếc hộp dán nhãn", 8 kiểu nguyên thuỷ cộng String, các phép toán số học và logic, tới mấy cái bẫy hay gặp khi đi làm như chia số nguyên, so sánh chuỗi và sai số khi tính tiền.

  • in java / jvm

    kiến trúc JVM

    Đi một vòng bên trong HotSpot JVM cho dân làm phần mềm: file bytecode 0xCAFEBABE trông ra sao, ClassLoader uỷ quyền theo Parent Delegation Model thế nào, các vùng nhớ Runtime Data Areas (Stack Frame, Metaspace, Heap), và JIT biên dịch phân tầng (Tiered Compilation C1/C2).