Tới nội dung chính
caltalys.dev

Bài viết

41 bài. Tìm theo nội dung hoặc lọc theo mạch đọc.

Glyph bài 3.3: một khung chứa bản kể gọn gàng cạnh một đường viền chưa đóng, hai kiểu chỗ hỏng trên cùng một hình
Người Trong Cuộc Vô Hình - bài 3

"Trước đây ai phân hồ sơ cho chuyên viên?" - cả phòng im lặng

Hai bản mô tả chính xác ghép vừa khít mà vẫn hụt một bước. Trong lời kể, chỗ hết phần việc của tôi nghe hệt chỗ hết quy trình.

Đồ hình trừu tượng của tập 5.4 trong Quyển Một
Lớp Trung Gian Vô Hình - tập 21

return user; - một dòng code, bốn tầng trung gian, và một vòng tròn khép lại

Bài cuối: bốn khuôn mặt của lớp trung gian xếp thẳng hàng trong đúng một dòng return, và vì sao nổ StackOverflowError lại là điều may mắn.

Glyph bài 3.2: một khung chứa bản kể gọn gàng, những dòng nằm ngoài thì không nối vào
Người Trong Cuộc Vô Hình - bài 2

Tám người, tám câu chê giống nhau. Mình cho là quá đều nên không tin.

Biết một lời kể được kể trong hoàn cảnh nào thì mới chỉ biết thêm về hoàn cảnh. Nghi ngờ cũng là một kết luận, và nó cũng cần bằng chứng.

Đồ hình trừu tượng của tập 5.3 trong Quyển Một
Lớp Trung Gian Vô Hình - tập 20

Thêm một dependency - và cấu hình Jackson của tôi lặng lẽ chết

Auto-configuration nấu sau và chỉ nấu nếu thiếu. Một bean lạ xuất hiện là độc giả duy nhất của spring.jackson.* lặng lẽ rút lui.

Glyph bài 3.1: một khung chứa bản kể gọn gàng, những dòng nằm ngoài thì không nối vào
Người Trong Cuộc Vô Hình - bài 1

Buổi phỏng vấn tốt nhất mình từng làm. Và bốn tháng sau nghiệp vụ vẫn tắc.

Mọi lời kể đều được kể từ một chỗ nào đó. Câu hỏi định hình cái gì được kể ra, và người ngồi nghe định hình cái gì được ghi lại.

Đồ hình trừu tượng của tập 5.2 trong Quyển Một
Lớp Trung Gian Vô Hình - tập 19

application.properties của tôi bị ignore hoàn toàn

Environment không giữ một file mà giữ một List các nguồn. Nguồn đầu tiên có key thì thắng, vòng for dừng, không ai phía sau được hỏi.

Glyph bài 2.6: một đường viền chưa đóng, hai khung đóng nó theo hai cách khác nhau
Người Cùng Gật Vô Hình - bài 6

Một câu, năm người, năm việc khác nhau bắt đầu ngay sáng thứ Hai

Năm người rời cùng một cuộc họp và làm ra năm sản phẩm khác nhau. Thứ quyết định thiệt hại là quãng đường trước khi có ai đặt chúng cạnh nhau.

Đồ hình trừu tượng của tập 5.1 trong Quyển Một
Lớp Trung Gian Vô Hình - tập 18

BeanCurrentlyInCreationException - và cái cờ mà Spring khóa lại vì lý do chính đáng

Đổi sang field injection thì hết lỗi, bật allow-circular-references thì chạy thật. Nhưng lúc mở cái cờ mà Spring chủ động khoá lại, bạn đang mở cái gì?

Glyph bài 2.5: một đường viền chưa đóng, hai khung đóng nó theo hai cách khác nhau
Người Cùng Gật Vô Hình - bài 5

Bản mơ hồ duyệt trong mười lăm phút. Bản rõ ràng mất ba buổi và vẫn chưa xong.

Mơ hồ không phải một câu chưa viết xong. Nó là chỗ chứa một cuộc đàm phán chưa diễn ra, và làm rõ là gọi cuộc đàm phán ấy về hiện tại.

Đồ hình trừu tượng của tập 4.4 trong Quyển Một
Lớp Trung Gian Vô Hình - tập 17

Batch insert không batch, chậm gấp 10 - và tôi đã bật đúng cờ

Bật đủ mọi cờ batch mà Hibernate vẫn insert từng dòng, vì chiến lược sinh id đã quyết định xong trước khi cờ của bạn kịp có ý nghĩa.

Glyph bài 2.4: một đường viền chưa đóng cạnh chồng bảng đi qua khe, hai kiểu chỗ hỏng trên cùng một hình
Người Cùng Gật Vô Hình - bài 4

"Ai đồng ý bỏ bước này?" - và trong phòng không ai trả lời được

Mọi người hiểu giống nhau, biên bản ghi đúng, chữ ký đủ. Cái thiếu không phải sự thống nhất, mà là đường làm cho nó có hiệu lực.

Đồ hình trừu tượng của tập 4.3 trong Quyển Một
Lớp Trung Gian Vô Hình - tập 16

MultipleBagFetchException - cái chuông báo cháy mà ai cũng chỉ lo tắt chuông

Hibernate ném exception không phải để làm khó bạn mà để chặn một tích Descartes. Đổi List sang Set là tắt chuông chứ không phải chữa cháy.

Glyph bài 2.3: một đường viền chưa đóng, hai khung đóng nó theo hai cách khác nhau
Người Cùng Gật Vô Hình - bài 3

Hai bên đối chiếu suốt một buổi. Không tìm ra chỗ nào hiểu khác nhau.

Phép đối chiếu tìm ra mâu thuẫn, không tìm ra khoảng trống. Khi một phía không có khái niệm tương ứng thì chẳng còn gì để đặt cạnh nhau.

Đồ hình trừu tượng của tập 4.2 trong Quyển Một
Lớp Trung Gian Vô Hình - tập 15

N+1: app chậm dần đều mà không một dòng lỗi

Một trăm linh một câu SELECT cho hai mươi đơn hàng, và không một dòng lỗi nào để bạn lần theo.

Glyph bài 2.2: một đường viền chưa đóng, hai khung đóng nó theo hai cách khác nhau
Người Cùng Gật Vô Hình - bài 2

Email báo tài khoản sắp bị khoá. Tài khoản vẫn đăng nhập bình thường.

Một định nghĩa được sửa đúng quy trình ở một chỗ, trong khi nó đang sống ở bảy chỗ. Thay đổi thì có người làm, lan truyền thì không.

Đồ hình trừu tượng của tập 4.1 trong Quyển Một
Lớp Trung Gian Vô Hình - tập 14

Set cả hai chiều mà FK trong DB vẫn null

Java có hai field, DB chỉ có một cột. Chỉ owning side cầm bút ký, bên mappedBy chỉ là tấm gương, và cuốn sổ không bao giờ nhìn gương.

Glyph bài 2.1: một đường viền chưa đóng, hai khung đóng nó theo hai cách khác nhau
Người Cùng Gật Vô Hình - bài 1

"Còn ai có ý kiến gì không?" - và bốn giây im lặng đó tốn ba tuần

Không ai phản đối thì coi như đã thống nhất. Ba tuần sau, ba người mang ba nghĩa khác nhau của cùng một dòng biên bản tới buổi demo.

Đồ hình trừu tượng của tập 3.4 trong Quyển Một
Lớp Trung Gian Vô Hình - tập 13

Save entity xong, tìm trong HashSet không thấy nó đâu

size() bằng 1, iterate thì nhìn thấy nó, mà contains() trả false. Chuyện danh tính của entity khi id được cấp sau lúc nó vào Set.

Đồ hình trừu tượng của tập 3.3 trong Quyển Một
Lớp Trung Gian Vô Hình - tập 12

LazyInitializationException: failed to lazily initialize a collection - no Session

Tắt open-in-view làm app nổ mười bảy chỗ, vì cả mười bảy chỗ đó lâu nay sống nhờ một cái filter mở sổ hộ bạn mà không ai biết.

Đồ hình trừu tượng của tập 3.2 trong Quyển Một
Lớp Trung Gian Vô Hình - tập 11

"detached entity passed to persist" - người bị gạch tên xin quay lại văn phòng

Vì sao một entity từng được quản lý lại thành tội đồ ở request sau, và merge thật ra làm gì với nó.

Đồ hình trừu tượng của tập 3.1 trong Quyển Một
Lớp Trung Gian Vô Hình - tập 10

Tôi không gọi save() mà DB vẫn UPDATE

Có một cuốn sổ đang theo dõi bạn kể cả khi bạn không gọi save. Chuyện dirty checking và thời điểm flush của persistence context.

Glyph bài 1.8: bốn chỗ rụng trên một trang, ba kiểu chỗ hỏng, ba màu
Bản Nén Vô Hình - bài 8

Một trang tài liệu, bốn chỗ rụng, bốn chữ ký

Một trang đặc tả đi qua ba vòng rà soát và bốn chữ ký. Không dòng nào sai khi đọc một mình, vì chỗ hỏng nằm ở quan hệ giữa các dòng.

Đồ hình trừu tượng của tập 2.3 trong Quyển Một
Lớp Trung Gian Vô Hình - tập 9

readOnly=true mà tôi vẫn insert được

readOnly không phải cái khoá, nó là lời nhắn - và chỉ những ai chịu nghe mới nghe. Bài này hé lộ cuốn sổ của Hibernate.

Glyph bài 1.7: thanh còn nguyên, cái đỡ nó đã trượt đi
Bản Nén Vô Hình - bài 7

Mười bốn lần đổi yêu cầu. Không lần nào có ai đổi ý.

Mười bốn phiếu thay đổi, không phiếu nào do ai đổi ý. Câu trả lời không sai đi, nó hết hạn, và không có khoảnh khắc nào để chỉ vào.

Đồ hình trừu tượng của tập 2.2 trong Quyển Một
Lớp Trung Gian Vô Hình - tập 8

Hai method, hai @Transactional - mà chỉ một transaction để chết chung

@Transactional không nói mở transaction, nó nói method này cần chạy trong một transaction. Quyền quyết định nằm ở cái vỏ, và cái vỏ thò tay vào túi của thread.

Glyph bài 1.6: có thang đo nhưng không điểm nào đặt trên thang
Bản Nén Vô Hình - bài 6

"Hệ thống phải nhanh" - câu đó không nói gì, và không ai phát hiện ra suốt tám tháng

Một tính từ trong bản cam kết không mô tả mức chất lượng. Nó hoãn việc xác định mức ấy lại, và việc bị hoãn thì chờ tới bàn nghiệm thu.

Đồ hình trừu tượng của tập 2.1 trong Quyển Một
Lớp Trung Gian Vô Hình - tập 7

Ném exception mà dữ liệu vẫn được commit

Cái vỏ có đó, lời gọi có đi qua nó, mà vẫn không rollback: bảng luật mặc định của Spring chỉ rollback với unchecked exception.

Glyph bài 1.5: một con số đi tiếp, các thủ tục đo ở lại phía sau
Bản Nén Vô Hình - bài 5

Con số 12% ai cũng trích. Không ai biết ai đã đo.

Một con số ai cũng trích và không ai truy được ai đã đo. Con số đi tiếp vào mọi tài liệu sau, còn thủ tục đẻ ra nó thì ở lại.

Đồ hình trừu tượng của tập 1.4 trong Quyển Một
Lớp Trung Gian Vô Hình - tập 6

@Cacheable không cache - rồi khi cache được, nó trả nhầm đồ của người khác

Cache cũng chỉ là một cái Map, và khoá mặc định của nó chỉ gồm tham số. Hai method khác nhau cùng cacheNames là cùng một ô.

Glyph bài 1.4: chiều ngược của phép nén, bản rút gọn đi tới còn bản đầy đủ ở lại
Bản Nén Vô Hình - bài 4

"Em muốn có nút export" - và bài toán biến mất ngay trong câu đó

Một cái nút bị từ chối vì không khả thi, trong khi bài toán thật giải được trong nửa ngày. Nhu cầu đã được dịch thành giải pháp trước khi bạn nghe thấy.

Đồ hình trừu tượng của tập 1.3 trong Quyển Một
Lớp Trung Gian Vô Hình - tập 5

@Async của tôi chạy tuần tự như thường

Thiếu một dòng bật tính năng thì annotation chỉ còn là lời khai không ai đọc. Và khi nó chạy được rồi, exception lại chết ở một thread khác.

Glyph bài 1.3: thang bước trong khung văn bản, đường thật ngắn hơn nằm ngoài
Bản Nén Vô Hình - bài 3

Hệ thống chạy đúng quy trình. Tuần đầu, hồ sơ tồn gấp bốn.

Hệ thống làm đúng mười bốn bước trong văn bản, và tới cuối tuần đầu hồ sơ tồn gấp bốn. Cái đang giữ cho công việc chạy thì không nằm trong quy trình.

Một biểu mẫu vận đơn dày đặc dòng ở bên trái, các sợi dữ liệu đi qua những tấm chắn xếp lớp rồi thu lại thành một đường mảnh, kết thúc bằng một chấm tròn nhỏ giữa nền giấy trống
Bài lẻ

Khi một boolean cố đóng vai bằng chứng

Một trải nghiệm thiết kế phân quyền: cùng một lỗi quay lại bốn lần, ở bốn chất liệu khác nhau, và mỗi lần nó im lặng theo một kiểu riêng.

Đồ hình trừu tượng của tập 1.2 trong Quyển Một
Lớp Trung Gian Vô Hình - tập 4

@Transactional gọi từ chính class mình lại không chạy

Lời gọi từ trong chính class không đi ra ngoài cái vỏ, nên không ai kịp làm gì cả. Bài này giải thích vì sao đừng bao giờ tin this.

Nhiều artifact đi qua một checkpoint hẹp trước khi trở thành tín hiệu đã kiểm định
Bài lẻ

Khi code trở nên rẻ, phán đoán trở thành điểm nghẽn

AI làm đầu ra phần mềm tăng nhanh, nhưng review, ngữ cảnh và trách nhiệm không tăng cùng tốc độ. Vậy chuyên môn hóa còn lại gì?

Glyph bài 1.2: một đường viền chưa đóng, hai khung đóng nó theo hai cách khác nhau
Bản Nén Vô Hình - bài 2

Hai con số lệch nhau 8%. Không ai tính sai.

Hai báo cáo lệch nhau 8%, không ai tính sai. Một chữ đi qua ranh giới hai phòng ban thì chỉ có chữ đi được; cái neo nghĩa của nó thì ở lại.

Đồ hình trừu tượng của tập 1.1 trong Quyển Một
Lớp Trung Gian Vô Hình - tập 3

getClass() của tôi in ra `$$SpringCGLIB$$`, tôi có làm hỏng gì không?

Vật được trao không phải vật bạn tưởng: vì sao Spring Boot đúc proxy bằng CGLIB kể cả khi đã có interface, và vì sao method final làm @Transactional bốc hơi.

Glyph bài 1.1: một chồng bảng đi qua một khe hẹp, ra một thanh đặc đóng kín
Bản Nén Vô Hình - bài 1

Tài liệu của mình đúng từng chữ. Và không ai dùng nó.

Một tài liệu đúng, đủ, nộp sớm nửa ngày - và không ai mở lại. Vì cái task bạn nhận là bản nén của một quyết định, và bản nén thì không báo lỗi.

Đồ hình trừu tượng của tập 0.2 trong Quyển Một
Lớp Trung Gian Vô Hình - tập 2

Tôi POST JSON lên, mọi field đều null - và Spring vẫn trả 200?

Dãy quầy có người nhận-tất: vì sao thiếu một annotation thì Spring nhìn thấy request nhưng không ai đọc body, và không ai báo cho bạn biết.

Đồ hình trừu tượng của tập 0.1 trong Quyển Một
Lớp Trung Gian Vô Hình - tập 1

@Value của tôi bị null, và Spring không hề báo lỗi?

Kẻ đến quá sớm thì không được phục vụ - chuyện cái List được đổ đầy sau lưng bạn, và vì sao @Transactional trong @PostConstruct cũng im lặng vì cùng một lý do.

Đồ hình trừu tượng về những mảnh ý tưởng đi qua nhiều lớp kiểm chứng rồi kết nối thành các hướng tiếp nối
Bài lẻ

Vì sao là Caltalys?

Một cái tên viết sai, một cách làm nghề và nguyên tắc đứng sau những câu chuyện trên blog.