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

Explore
MikeDaDev's Blog

#vietnamese

Things I've written about #vietnamese
  • ChainDrop: con worm npm đi qua cổng chính, mang theo cả provenance

    Sáng 4/8/2026, tài khoản GitHub của maintainer Keyv bị chiếm, và chỉ vài giờ sau hàng trăm package npm khác cũng chứa mã độc chạy ngay lúc npm install. Bài này mổ xẻ ChainDrop, một biến thể họ Shai-Hulud: cách nó đánh cắp token rồi tự publish lại, vì sao bản độc vẫn có provenance hợp lệ, cách rà máy dev và CI, và những thứ nên đổi trong quy trình cài dependency.

  • Cisco ISE zero-day CVE-2026-76460: CVSS 10 và cánh cổng của cả mạng

    CVE-2026-76460 là lỗi bypass xác thực CVSS 10.0 trên Cisco Identity Services Engine, bị khai thác thật và vào CISA KEV ngay ngày công bố 16/09/2026. Bài này đối chiếu advisory của Cisco với NVD, giải thích vì sao ISE là mục tiêu béo bở, phân biệt cái đã xác nhận với cái mới là suy đoán, rồi đi qua cách kiểm tra, vá và rà dấu hiệu bị xâm nhập.

  • Zero-day Citrix NetScaler CVE-2026-88771: log bị đầu độc thành root shell

    Cuối tháng 9/2026, Citrix vá hai zero-day trên NetScaler ADC và Gateway đang bị khai thác thật: CVE-2026-88771 là command injection không cần đăng nhập, nằm trong một script Perl xử lý log của packet engine; CVE-2026-88772 là tràn bộ nhớ khi bật DTLS. Bài này mổ xẻ cơ chế của lỗi, dòng thời gian, cách kiểm tra thiết bị của mình, dấu hiệu đã bị xâm nhập, và vì sao thiết bị biên kiểu này cứ dính lỗi hoài kể từ thời CitrixBleed.

  • Node2Shell (CVE-2026-111497): lỗi Brotli trong Node.js và bài học về runtime

    Node2Shell (CVE-2026-111497) là lỗi ghi tràn bộ nhớ trong bộ giải nén Brotli mà Node.js đóng gói sẵn bên trong. Bài này mổ xẻ vì sao một giá trị trả về bị hiểu nhầm lại thành lỗ hổng thực thi mã từ xa, ứng dụng Express và Next.js nào dính, cách kiểm tra, vá, giảm thiểu tạm thời, và vì sao `npm audit` không cứu được bạn trong vụ này.

  • PHP2Shell: hai lỗ hổng RCE CVE-2026-109618 và CVE-2026-109619

    Ngày 21/10/2026 PHP phát hành 8.5.12, 8.4.27, 8.3.36 và 8.2.35 để vá hai lỗ hổng RCE không cần xác thực, CVSS v4 9.2, được gọi chung là PHP2Shell. Bài này mổ xẻ cơ chế (out-of-memory làm hỏng dữ liệu khởi tạo dở, và state cũ sống sót sang request sau), cách kiểm tra máy chủ, container, PHP-FPM sau CDN/WAF có dính không, cách vá, biện pháp tạm thời và những điều nguồn gốc chưa nói rõ.

  • CVE-2026-119977: bấm Update Now cũng có thể là lúc WordPress bị chiếm

    CVE-2026-119977 là lỗi race condition (TOCTOU) trong chính quy trình nâng cấp core của WordPress: trong vài giây bản mới được giải nén vào một thư mục đoán được và truy cập được từ web, kẻ tấn công không cần đăng nhập có thể chen vào. Lỗi đã bị khai thác thật, CISA đưa vào KEV ngày 3/11/2026. Bài này mổ xẻ cơ chế, phiên bản bị ảnh hưởng, cách kiểm tra bằng wp-cli, biện pháp tạm thời và dấu hiệu bị xâm nhập.

  • Thiết kế hệ thống lưu trữ tài liệu trong thời đại số hoá

    Ảnh CCCD lúc mở tài khoản, hợp đồng vay ký điện tử, sao kê tháng: mỗi ngày một ngân hàng vài chục triệu khách sinh ra hàng triệu file, và file nào cũng phải giữ đúng người xem, đúng thời hạn, không được mất. Bài này dựng một kiến trúc tham chiếu cho nền tảng lưu trữ tài liệu cỡ đó: ước lượng tải, upload chia chunk, lưu theo tầng nóng ấm lạnh, phân quyền RBAC kết hợp ABAC, mã hoá envelope, và những kiểu hỏng hay gặp khi chạy thật.

  • Kinh nghiệm phỏng vấn tại công ty A*

    Bài test viết gồm 5 câu của một công ty fintech mình tạm gọi là A*: đa luồng cho n chiếc xe xuất phát cùng lúc, chuỗi con dài nhất không lặp ký tự, thiết kế API 3 tầng có mã hoá bất đối xứng, SDLC và mô hình OSI. Mình đi qua từng câu, chỗ dễ mất điểm, code đã chạy thử, rồi tổng hợp các vòng phỏng vấn thường gặp phía sau và cách chuẩn bị.

  • Claude Code template cho Spring Boot: mổ xẻ repo của Piotr Mińkowski

    Repo claude-ai-spring-boot gói sẵn CLAUDE.md, 6 agent và 7 skill để Claude Code viết Spring Boot 4 theo đúng chuẩn. Bài này mở từng phần ra xem nó vận hành thế nào, rồi chạy thử code mẫu trong skill trên Spring Boot 4.1.1: chỗ nào compile không qua, chỗ nào Kubernetes sẽ âm thầm bỏ qua preStop hook, file quyền nào đi theo khi clone, và cách sửa trước khi đem về dùng cho team.

  • 12 tính năng Claude Code mà kỹ sư nào cũng nên biết

    Nhiều người dùng Claude Code mỗi ngày mà chỉ xài mỗi ô chat. 12 tính năng dưới đây được giải thích theo đúng cách chúng vận hành bên dưới: CLAUDE.md được nạp ra sao, vì sao context là tài nguyên quý nhất, plan mode, các chế độ quyền, checkpoint, skills chỉ nạp khi cần, subagent cô lập context, hooks và ý nghĩa của exit code 2, MCP, chạy headless trong CI, chạy song song và lên lịch tự động.

  • in ai / llm

    Netflix dạy LLM gợi ý phim để bạn xem mãi không dừng

    Từ cuộc thi Netflix Prize một triệu đô năm 2006 tới việc coi lịch sử xem phim như một câu văn và huấn luyện model kiểu LLM để đoán bộ phim tiếp theo. Những gì Netflix đã chia sẻ công khai: hệ thống gợi ý cổ điển và giới hạn của nó, foundation model cho gợi ý, cách đưa vào sản phẩm, GenRec, bài toán đo "hài lòng lâu dài", và những gì một team nhỏ học được từ đó.

  • in ai / llm

    Agentic RAG hoạt động thế nào?

    RAG cổ điển tra cứu một lần rồi trả lời, nên hay trật với câu hỏi cần nhiều bước, nhiều nguồn. Agentic RAG giao việc tra cứu cho một agent biết tự lên kế hoạch, chọn công cụ, chấm kết quả và tìm lại. Mổ xẻ những chỗ RAG cổ điển hỏng, hybrid search với rerank, các bước tiến hoá HyDE, Self-RAG, CRAG, rồi dựng thử một vòng lặp agent, tính chi phí, điểm mặt các kiểu hỏng trong production và cách đánh giá.

  • in ai / llm

    Red teaming LLM: tự tấn công ứng dụng AI của mình trước khi người khác làm

    Phòng thủ chưa từng bị đánh thử thì chỉ là phòng thủ trên giấy. Red teaming ứng dụng LLM của chính mình: các họ kỹ thuật tấn công từ GCG, PAIR, Crescendo tới many-shot và Best-of-N, vì sao phải đo bằng tỉ lệ chứ không phải "lọt hay không", cần chạy bao nhiêu lần, dùng canary để chấm tự động, cạm bẫy khi dùng LLM làm giám khảo, và cách đưa tất cả vào CI.

  • in ai / llm

    Bảo mật LLM cơ bản: vẽ bản đồ mối đe doạ trước khi viết code

    Prompt injection chưa có thuốc chữa, nên câu hỏi đúng không phải "làm sao để model không bị lừa" mà là "bị lừa rồi thì mất gì". Cách làm threat model cho chatbot, RAG và agent: tài sản, kẻ tấn công, ranh giới tin cậy, lethal trifecta, mổ xẻ vụ EchoLeak trong Microsoft 365 Copilot, và những kiến trúc như CaMeL hay Rule of Two giúp giới hạn thiệt hại ngay từ thiết kế.

  • in ai / llm

    Vì sao LLM cứ đồng ý với bạn, kể cả khi bạn sai?

    Bạn hỏi lại một câu "chắc chưa?", model xin lỗi rồi đổi luôn đáp án đúng thành sai. Tật này có tên là sycophancy. Bài này mổ xẻ nó từ gốc: reward model học khẩu vị con người ra sao, vì sao tối ưu càng mạnh thì càng nịnh, sự cố GPT-4o năm 2025, các phòng lab đo và chữa nó thế nào, và cách hỏi để AI chịu cãi lại bạn.

  • in ai / llm

    The best local LLM models free to run in 2026

    Máy mình thế này thì chạy model nào? Bài này giải thích cách đọc thông số (tham số, MoE, quantization, VRAM) trước khi tải, gợi ý model theo phần cứng từ laptop 8GB tới máy 64GB, điểm qua Qwen 3.5/3.6/3.8, Gemma 4, gpt-oss, Muse Glimmer, Nemotron, và chỉ cách chạy bằng Ollama rồi gọi từ code.

  • in ai / llm

    Chuyện gì xảy ra bên dưới khi bạn prompt xong và nhấn Enter?

    Theo chân một prompt từ lúc bạn nhấn Enter tới khi chữ đầu tiên hiện lên: ghép system prompt, tokenize, xếp hàng chờ GPU, prefill, decode, KV cache, sampling, streaming. Nắm được luồng này là hiểu vì sao output đắt hơn input, vì sao context dài lại chậm, và nên tối ưu chi phí ở đâu.

  • Herdr là gì? Quản lý cả team AI Agent trong một cửa sổ

    Herdr là một terminal multiplexer viết bằng Rust, làm riêng cho dân chạy AI coding agent: liếc một cái là biết agent nào đang chạy, agent nào đang đứng chờ mình duyệt, rớt SSH cũng không mất việc, lại còn cho agent điều khiển agent khác qua CLI. Bài này đi từ cơ bản cho người mới tới kiến trúc, cách Herdr đoán trạng thái agent, viết script điều phối và mấy kinh nghiệm khi chạy nhiều agent cùng lúc.

  • in ai / llm

    How LLMs work? LLM thật ra hoạt động thế nào

    Mổ xẻ LLM từ con số 0: token là gì, embedding là gì, attention làm gì, model được dạy ra sao, và vì sao nó trả lời trơn tru mà thỉnh thoảng vẫn bịa như thật. Người mới đọc để hiểu bản chất, dân làm AI đọc để ôn lại cho có hệ thống.

  • xây dựng đội nhân viên AI cho team IT

    Dựng một đội agent AI đóng vai Developer, PM, QC, DevOps, ngày nào cũng tự chạy trên một máy luôn bật, bạn không cần ngồi canh. Bước nào cũng có script, copy về là chạy được.

  • vận hành database cluster & tính Idempotent

    Script bảo trì hay nâng cấp database phân tán đang chạy thì đứt kết nối, giờ chạy lại có sao không? Bài này nói về cách tự động hoá vận hành cluster, cách thiết kế State Machine cho từng node và vì sao Idempotent là nguyên tắc SRE không được bỏ qua.

  • Critical Thinking

    Mấy cách tư duy phản biện và giải quyết vấn đề mình thấy dùng được trong công việc: khung Cynefin để biết mình đang ở loại bối cảnh nào, tư duy nguyên lý đầu tiên (First Principles), chia vấn đề theo cây MECE và cách đặt lại câu hỏi theo mục tiêu (Goal-Oriented Reframing).

  • Discord: từ Cassandra sang ScyllaDB

    Nhìn lại chặng đường Discord lưu hàng nghìn tỷ tin nhắn: từ lúc MongoDB hết chịu nổi, qua Apache Cassandra, rồi chuyển hẳn sang ScyllaDB với mô hình thread-per-core, hết JVM GC pause, p99 latency đọc còn khoảng 15ms và số node giảm từ 177 xuống 72.

  • Figma: scale PostgreSQL với Horizontal Sharding

    Figma làm Horizontal Sharding cho PostgreSQL thế nào: nhóm bảng theo colo, hash shard key để tránh hotspot, proxy DBProxy định tuyến bằng SQL AST, shard "logic" bằng view trước khi tách vật lý, và lần failover đầu tiên chỉ mất khoảng 10 giây sẵn sàng một phần.

  • Foundations of Project Management

    Những kiến thức nền cho nghề Quản lý Dự án: phân biệt Project với Operations, cân tam giác Triple Constraint, giữ Scope Creep trong tầm tay, tính Earned Value Management (EVM) và chia vai bằng ma trận RACI.

  • Java 27: Compact Object Headers

    Từ Java 27, Compact Object Headers (Project Lilliput) được bật mặc định: header của object trên HotSpot co từ 12 xuống 8 bytes. Bài mổ xẻ 64 bit header được sắp ra sao, class pointer nén còn 22 bit thế nào, lock và GC xoay xở thế nào, lợi gì cho CPU cache và các cờ JVM cần biết.

  • Spring AI: Dynamic Tool Calling

    Dynamic Tool Calling trong Spring AI: bài toán chi phí token khi nhét hết tool vào Context Window, cách viết CallAdvisor để chọn tool theo ngữ nghĩa qua Vector Store, và cách tự động lập chỉ mục các @Tool bean.

  • Team Leadership Essentials

    Những thứ một Frontline Leader cần nắm: phân biệt Leadership và Management, ủy quyền theo tình huống, phản hồi kiểu Radical Candor, giữ an toàn tâm lý cho team và cách xử lý thành viên underperform.

  • 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.

  • Feature Flags với Unleash & Spring Boot

    Feature Flags với Unleash trong Spring Boot 3: 4 nhóm toggle theo cách chia của Pete Hodgson, cách Unleash đánh giá flag ngay trong bộ nhớ phía client và đồng bộ qua Server-Sent Events, chuyện MurmurHash3 chia user khi gradual rollout, và dùng Strategy Pattern để thoát khỏi đống if-else.

  • Java Memory Model & happens-before

    Đào vào Java Memory Model (JSR-133): giao thức MESI, Store Buffer, 4 loại Memory Barrier, quan hệ Happens-Before, chuyện False Sharing (@Contended), và Acquire/Release với VarHandle từ Java 9.

  • in ai / rag

    RAG vs Fine-tuning

    Khi nào nên dùng RAG, khi nào nên Fine-tuning? Hiểu sai hai cách này là có thể đốt cả trăm ngàn USD tiền GPU. Mô hình "nhớ" kiến thức ra sao, 7 trục đánh đổi khi chọn kiến trúc, bài toán TCO và cách ghép RAG với một SLM fine-tune riêng để chạy production.

  • cạm bẫy Virtual Threads trong production

    Bật Virtual Threads trong Java 21 xong ứng dụng production lại treo? Bài này đi qua 4 chỗ hay dính: pinning carrier thread do synchronized (và chuyện JDK 24 đã sửa nó), ThreadLocal làm phình bộ nhớ, pool thread không cần thiết và connection pool bị đè bẹp, kèm cách xử lý cho từng cái.

  • bảo mật LLM & OWASP Top 10

    Bảo mật cho hệ thống Generative AI và Agentic Workflows: vì sao Code Plane và Data Plane lẫn vào nhau trong LLM, các kiểu tấn công theo OWASP Top 10 for LLM, mô hình Dual-LLM Sandbox, Zero-Trust Tool Broker và Guardrails nhiều lớp (Defense-in-Depth) cho production.

  • transactional outbox & idempotent consumer

    Xử lý bài toán Dual-Write cho đúng: Transactional Outbox với Debezium SMT, kỹ thuật SELECT FOR UPDATE SKIP LOCKED, vì sao Kafka transaction không cứu được bạn ở đây, và cách làm Idempotent Consumer chạy được trên production với RDBMS (kèm Redis làm lớp lọc nhanh).

  • in ai / slm

    Small Language Models (SLM)

    Nhìn Small Language Models (1B - 8B) từ góc độ người làm kiến trúc: tính VRAM và KV-Cache, chọn kiểu lượng tử hoá (AWQ hay GGUF), chạy Dynamic Multi-LoRA trên vLLM, ghép SLM với LLM thành Compound AI, và bài toán TCO, ROI.

  • 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ì.

  • Database Sharding system design

    Lúc nào thì một node SQL không còn gánh nổi tải? Bài này nói về cách ước tính dung lượng nhanh (back-of-the-envelope), cách chọn sharding key, chuyện transaction phân tán và kinh nghiệm từ các hệ thống tài chính.

  • 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.

  • zero-downtime database migration

    Làm Zero-Downtime Migration cho database: ma trận lock như AccessExclusiveLock, chiến lược Expand-Contract 5 pha, Shadow Reads (dark launching), Throttled Keyset Backfill và so sánh gh-ost với pg_repack.

  • 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ế.

  • case study Shopify: Redis to MySQL

    Black Friday 2025 đạt đỉnh 5.1 triệu USD/phút, và đó cũng là mùa đầu tiên Shopify giữ chỗ tồn kho bằng MySQL thay cho Redis. Vì sao bỏ Redis, vì sao câu UPDATE trừ số lượng quen thuộc không đủ, và thiết kế một dòng cho mỗi đơn vị hàng với SKIP LOCKED chạy ra sao.

  • Rate Limiting với Bucket4j trong Spring Boot

    Vì sao chỉ rate limit ở Nginx là chưa đủ? Mổ xẻ thuật toán Token Bucket, cách Bucket4j xử lý concurrency không cần lock, và cách dựng rate limiting phân tán với Redis trong Spring Boot để chạy production.

  • RestClient & Fluent API trong Spring Boot 3

    Vì sao RestTemplate bị cho vào chế độ bảo trì rồi sắp bị deprecate? Bài này nói về RestClient và JdbcClient, hai món mới theo kiểu Fluent API từ Spring Framework 6.1 / Spring Boot 3.2, viết gọn hơn, đọc dễ hơn và ít chỗ truyền nhầm tham số hơn.

  • 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.

  • CDC với Debezium & cache invalidation

    Change Data Capture (CDC) với Debezium nhìn từ bên trong: PostgreSQL logical decoding (pgoutput) chạy ra sao, vì sao dual-write dính partial failure và race condition, cách dùng Outbox Event Router (SMT), chống cache stampede và canh replication slot trên production.

  • jOOQ vs Hibernate JPA

    Vì sao nhiều team làm hệ thống tài chính cân nhắc jOOQ bên cạnh Hibernate? Chi phí ngầm của ORM, Type-safe SQL của jOOQ, những chỗ Hibernate 6 đã bắt kịp, và kiến trúc Hybrid dùng cả hai.

  • 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.

  • map vs flatmap

    map và flatMap trong Java nhìn từ gốc là Monadic Bind: flatMap cấp phát bộ nhớ thế nào trong Stream, thay bằng mapMulti (Java 16) để đỡ GC Churn, thenCompose trong CompletableFuture, và cái bẫy mất thứ tự khi dùng flatMap trong Reactive Streams.

  • 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.

  • leetcode: two sum

    Two Sum nhìn từ góc độ low-latency: Autoboxing và pointer chasing làm HashMap O(N) chậm cỡ nào trên phần cứng thật, khi nào Two-Pointer thắng, cách tự viết Primitive Open-Addressing Hash Map, SIMD Vector API giúp được gì và không giúp được gì, kèm số đo JMH.

  • 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.

  • spring ai và kiến trúc rag

    Mổ kiến trúc Spring AI 1.x: ChatClient Fluent API, chuỗi Advisors, RAG với VectorStore và PgVector, Function Calling, Observability với Micrometer/OpenTelemetry và mấy pattern resilience để sống sót qua rate-limit.

  • 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.

  • in aws / cloud

    amazon S3

    Ghi chú dùng Amazon S3 cho hệ thống lớn: Strong Read-After-Write Consistency là gì, dùng Presigned Multipart Upload để backend khỏi gánh băng thông, bảo mật với SSE-KMS và IRSA trên Kubernetes, và cái bẫy tốn tiền mang tên AbortIncompleteMultipartUpload.

  • 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.

  • multi-module spring boot

    Mổ xẻ kiến trúc Multi-Module Spring Boot cho production: chia module theo Hexagonal/Clean Architecture, tách riêng JPA/DataSource cho từng module, tránh mở connection pool tràn lan, xử lý cái bẫy bytea của JDBC PostgreSQL và dùng ArchUnit để giữ ranh giới module.

  • kiến trúc RabbitMQ

    Dựng RabbitMQ cho production cần biết gì: Erlang OTP/BEAM bên dưới, ghép nhiều Channel trên một TCP Connection, bỏ Mirrored Queues để chuyển sang Quorum Queues (Raft), không mất message nhờ Producer Confirms và Manual ACK, cùng Dead Letter Queue (DLQ) kèm retry exponential backoff.

  • kiến trúc API Gateway

    Mổ kiến trúc API Gateway trong hệ thống microservices cỡ lớn: đặt Kong, Spring Cloud Gateway và Envoy lên bàn cân, làm distributed rate limiting kiểu token bucket bằng Redis Lua, mô hình BFF và circuit breaker để hệ thống tự hồi phục.

  • 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.

  • kiến trúc observability với grafana

    Kiến trúc Observability với Grafana và LGTM Stack (Loki, Grafana, Tempo, Mimir): 4 Golden Signals, RED/USE, cảnh báo Error Budget Multi-Window Multi-Burn-Rate theo kiểu Google SRE, và cách tránh bẫy bùng nổ Cardinality trong PromQL.

  • 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.

  • in sql / oracle

    tối ưu SQL trong Oracle

    Ghi chép tối ưu Oracle SQL cho Database Architect và Principal Engineer: Cost-Based Optimizer (CBO) chạy ra sao, 5 kiểu Index Access Path, Hash Join tràn PGA, cách đọc DBMS_XPLAN với ALLSTATS LAST, và cách khoá Plan bằng SQL Plan Management (SPM).

  • in sql / oracle

    oracle ROWNUM

    ROWNUM trong Oracle chạy bên trong thế nào: vì sao ROWNUM > 1 luôn ra rỗng, COUNT STOPKEY trong execution plan giúp dừng quét sớm ra sao, và nên chọn subquery ROWNUM, window function ROW_NUMBER() hay cú pháp ANSI OFFSET-FETCH của Oracle 12c+.

  • 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.

  • docker & container

    Mổ xẻ container và Docker từ bên trong: Linux Namespaces, Cgroups v2, OverlayFS; viết Dockerfile multi-stage, layered, chạy distroless non-root; xử lý dứt điểm chuyện PID 1 và graceful shutdown; cấu hình JVM nhận biết container để khỏi dính OOMKilled.

  • 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.

  • visitor pattern

    Visitor Pattern trong Java hoạt động ra sao: cơ chế Double Dispatch để lách giới hạn Single Dispatch của JVM, dùng để duyệt cây cú pháp (AST), và đặt cạnh Pattern Matching trên Sealed Types của Java 21 xem bên nào hơn.

  • iterator pattern

    Đào sâu Iterator Pattern trong Java: fail-fast hoạt động nhờ biến modCount ra sao, CopyOnWriteArrayList đổi bộ nhớ lấy an toàn thế nào, Spliterator giúp chạy song song ra sao, và cách tự viết cursor iterator để stream hàng triệu bản ghi mà không OOM.

  • command pattern

    Command Pattern nhìn từ góc độ kiến trúc: biến động từ thành danh từ (Objectifying Actions), Undo/Redo dùng hai stack kết hợp Memento, đường tiến hóa sang CQRS (Command Query Responsibility Segregation) và Compensating Transactions trong Saga.

  • 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.

  • strategy pattern

    Nhìn Strategy Pattern bằng con mắt Solution Architect: Strategy khác State và Template Method ở đâu, dùng Functional Interface của Java để khỏi đẻ ra cả đống class thừa, và dựng một Dynamic Promotion Engine bằng Spring Boot.

  • observer pattern

    Đi từ Observer Pattern kinh điển tới Event-Driven Architecture (EDA): vì sao java.util.Observable bị deprecate từ Java 9, quản lý transaction với @TransactionalEventListener AFTER_COMMIT, xử lý backpressure trong Reactive Streams và so sánh với Apache Kafka.

  • facade pattern

    Nhìn Facade Pattern bằng con mắt Solution Architect: nó liên quan gì tới Law of Demeter, khác Adapter, Proxy, Decorator ở đâu, và lớn lên thành Anti-Corruption Layer (ACL trong DDD) ra sao khi phải bọc một hệ thống Core Banking legacy.

  • abstract factory pattern

    Abstract Factory Pattern nhìn từ góc độ kiến trúc hệ thống: dùng nó để thoát vendor lock-in khi chạy multi-cloud, dựng lớp trừu tượng cho Blob Storage, Message Queue và Secret Manager trên AWS/GCP, và cái giá phải trả gọi là Lowest Common Denominator.

  • decorator pattern

    Decorator Pattern nhìn từ góc Solution Architect: vì sao kế thừa gây Class Explosion, Decorator thủ công khác gì Spring AOP Proxies (JDK vs CGLIB), bẫy Self-Invocation trong AOP và ví dụ Resilient Caching Decorator kèm những điểm cần lưu ý trước khi đem lên production.

  • adapter pattern

    Adapter Pattern trong Java, từ bản chất OOP tới kiến trúc Lục Giác (Ports and Adapters), cách dựng Anti-Corruption Layer (ACL) để bảo vệ Domain Model trước hệ thống Legacy, và phân biệt Adapter với Facade, Proxy, Decorator.

  • 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.

  • prototype pattern

    Prototype Pattern trong Java: vì sao Cloneable bị coi là lỗi thiết kế của JDK, khác nhau giữa Shallow Copy và Deep Copy, và so sánh 4 cách nhân bản object dùng được trên production (Copy Constructor, Jackson, Kryo, Record Withers).

  • builder pattern

    Đào sâu Builder Pattern trong Java: vì sao JavaBeans Pattern và Telescoping Constructor dễ gây lỗi, cách dùng Staged Builder để thiếu trường bắt buộc là compile không qua, và khi nào nên dùng Lombok @Builder hay Java Records.

  • 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.

  • factory pattern

    Nhìn lại Factory Pattern từ góc độ kiến trúc: vì sao Factory kiểu switch-case kinh điển lại vi phạm chính Open/Closed Principle, cách inject Map bean trong Spring Boot để bỏ hẳn if-else, Functional Factory với Java Supplier, và phân biệt Factory Method với Abstract Factory qua ví dụ multi-cloud.

  • singleton pattern

    Singleton Pattern nhìn kỹ hơn một chút: vì sao việc đảo lệnh của JIT và CPU buộc Double-Checked Locking phải có volatile, 4 cách phá Singleton (Reflection, Serialization, Clone, ClassLoader) và vì sao dự án Spring nên để IoC Container quản lý singleton.

  • 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.

  • multi-module Spring Boot với Gradle

    Dựng Multi-Module Spring Boot 3 với Gradle hiện đại: bỏ anti-pattern subprojects/allprojects, dùng Convention Plugins để tái sử dụng cấu hình, quản lý dependency tập trung bằng Version Catalog (libs.versions.toml), hiểu compile avoidance giữa api và implementation, và xử lý xung đột bootJar vs jar.

  • 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.

  • functional interfaces & lambda trong java

    Lambda và Functional Interface chạy thế nào bên trong JVM: vì sao lambda không phải Anonymous Inner Class, invokedynamic và LambdaMetafactory làm gì, tại sao biến phải effectively final, và cách dựng một Policy Engine bằng hàm.

  • 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.

  • CORS & CSRF

    Hiểu cho đúng mấy cơ chế bảo mật của trình duyệt: Same-Origin Policy thật ra là gì, preflight OPTIONS tốn thêm bao nhiêu, cái bẫy Access-Control-Allow-Origin dùng wildcard, và vì sao nên gom cấu hình CORS về API Gateway.

  • 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).

  • in java / jvm

    Optional trong Java

    Nhìn kỹ Java Optional: mỗi instance tốn 16-24 bytes heap và khi nào thì chuyện đó thật sự đáng lo, 6 anti-pattern hay gặp, khác biệt quan trọng giữa orElse và orElseGet, và cách làm null-safety bài bản hơn với JSpecify.

  • arraylist vs linkedlist

    Vì sao ArrayList gần như luôn nhanh hơn LinkedList trong Java: chuyện CPU Cache Line và spatial locality, chỗ hao bộ nhớ của Node header, cái hiểu lầm sách giáo khoa về tốc độ chèn của LinkedList, và ArrayDeque, lựa chọn nên dùng thay thế.

  • 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.

  • hibernate ORM

    Hibernate ORM bên trong chạy thế nào: 4 trạng thái vòng đời của Entity (Transient, Persistent, Detached, Removed), Dirty Checking tự động qua Loaded Snapshots, First-Level vs Second-Level Cache, và cách tiết kiệm bộ nhớ với @Transactional(readOnly = true).

  • 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.

  • custom annotations trong java

    Annotation trong Java chạy thế nào bên trong JVM: bytecode attribute, dynamic proxy, meta-annotation của Spring (@AliasFor), rồi tự viết một custom annotation dùng Spring AOP và SpEL để làm rate limiting phân tán dùng được cho production.

  • Spring Security annotations

    Kiến trúc bảo mật của Spring Security: hai lớp phòng thủ FilterChain và AOP Method Security, SpEL trong @PreAuthorize, bẫy Side-Effect của @PostAuthorize, vấn đề hiệu năng của @PostFilter và cách thiết lập Role Hierarchy cho production.

  • Criteria API trong Hibernate

    Viết dynamic query trong Java enterprise cho đàng hoàng: Hibernate 6 SQM chạy bên dưới ra sao, JPA Metamodel Generator, Spring Data Specification, cái bẫy fetch join với N+1 và phân trang, kèm bảng so sánh Criteria API, Specification, QueryDSL và jOOQ.

  • spring profiles và externalized config

    Quản lý cấu hình trong Spring Boot cho bài bản: nguyên tắc 12-Factor Config, thứ tự ưu tiên giữa các PropertySource, spring.config.import (Spring Boot 2.4+), kết hợp HashiCorp Vault & Kubernetes ConfigMaps, và reload nóng với @RefreshScope.

  • 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 Boot Auto-configuration

    Spring Boot Auto-Configuration chạy thế nào bên dưới: AutoConfigurationImportSelector, bộ lọc sớm dựa trên metadata sinh lúc build, ASM đọc annotation mà không nạp class, thứ tự của DeferredImportSelector, chuyển từ spring.factories sang AutoConfiguration.imports, và cách viết một Custom Starter dùng được trên production.

  • 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.

  • @ManyToMany trong JPA

    @ManyToMany trong JPA/Hibernate hoạt động ra sao: vì sao Hibernate xóa sạch bảng nối rồi insert lại (Write Amplification), vì sao không thêm được thuộc tính phụ (metadata), và cách làm dùng được trên production: tách thành hai @OneToMany qua Explicit Join Entity với @EmbeddedId và @MapsId.

  • @OneToMany & @ManyToOne trong JPA

    Mấy cái bẫy hay gặp với @OneToMany và @ManyToOne trong JPA/Hibernate: EAGER ngầm, N+1 query và cách xử lý bằng EntityGraph hay BatchSize, lỗi MultipleBagFetchException do Cartesian Product, và StackOverflowError vì lỡ dùng Lombok @Data.

  • Spring IoC & Dependency Injection

    Mổ xẻ bên trong Spring IoC Container: DIP, IoC và DI khác nhau ra sao, vòng đời của một bean trong ApplicationContext, cách Spring gỡ circular dependency bằng cache 3 tầng (three-level cache), và vì sao field injection với @Autowired bị loại khỏi code enterprise.

  • java records

    Hiểu Java Records cho đúng: "transparent carrier" nghĩa là gì, vì sao serialization của Record an toàn hơn, Pattern Matching với Sealed Types, Shallow vs Deep Immutability và mấy cái bẫy khi đem Record dùng với JPA / Hibernate.

  • @OneToOne trong JPA

    Đào sâu quan hệ @OneToOne trong Hibernate & JPA: vì sao FetchType.LAZY "tịt" ở Non-Owning side và kéo theo N+1, cách dùng chung khoá chính với @MapsId, Bytecode Enhancement, và vì sao gắn Lombok @Data lên Entity là anti-pattern.

  • in java / jvm

    java reflection

    Mổ xẻ Java Reflection bên trong JVM: cơ chế inflation từ JNI sang bytecode accessor (tới JDK 17) và bản viết lại bằng method handle từ JDK 18, vì sao reflection khó cho JIT inline, chuyện setAccessible bị chặn từ JDK 16/17, và vì sao MethodHandles cùng code sinh lúc compile hợp với GraalVM AOT hơn.

  • java stream API

    Nhìn vào bên trong Java Stream API: pipeline được dựng thế nào, Loop Fusion chạy qua interface Sink ra sao, Stateless khác Stateful operation chỗ nào, và vì sao parallelStream xài chung ForkJoinPool có thể làm treo cả hệ thống.

  • in java / jvm

    string vs stringbuilder vs stringbuffer

    Chuỗi ký tự trong JVM hoạt động thế nào: Compact Strings (JEP 254), việc toán tử + chuyển từ StringBuilder sang invokedynamic StringConcatFactory (JEP 280), so sánh String, StringBuilder, StringBuffer và chuyện JIT bỏ lock của StringBuffer nhờ Escape Analysis.

  • in java / jvm

    java string pool

    Đi sâu vào StringTable native trong HotSpot JVM: vì sao String Pool dời từ PermGen sang Java Heap, bảng băm C++ từng tụt từ O(1) về O(N) ra sao và JDK 11 sửa thế nào, cái bẫy của String.intern(), và String Interning khác String Deduplication (JEP 192) chỗ nào.

  • threadpool executor pool size

    ThreadPoolExecutor nhìn từ góc kiến trúc: biến bit ctl, Định luật Little & công thức Goetz để tính Pool Size, cái bẫy Unbounded Queue gây OOM, Thread Starvation Deadlock và so sánh với Virtual Threads.

  • 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).