Ba giờ chiều, một ngày thứ Năm nào đó, chừng chín năm trước.
Hai người ngồi trước một màn hình. Người trẻ hơn đã ngồi đó từ sáng - bốn tiếng, một con bug, dữ liệu trả về sai lác đác, không theo quy luật nào. Cậu ta đã đọc lại đoạn code ấy đủ nhiều lần để thuộc lòng nó, đã thêm log ở mọi dòng, đã đọc tài liệu, đã tìm trên Stack Overflow và thử ba cách sửa mà người ta gợi ý. Không cách nào ăn thua.
Người kia đi ngang qua, đứng lại nhìn màn hình chừng hai mươi giây, rồi hỏi một câu.
“Em có chắc là dòng này nó chạy không?”
Người trẻ hơi bực. Tất nhiên là nó chạy - chính cậu viết ra nó, nó nằm ngay đó, và đây là câu hỏi của người chưa đọc kỹ. Cậu định nói vậy. Rồi cậu dừng lại. Rồi cậu bỏ ra ba phút để kiểm tra một điều mà suốt bốn tiếng qua cậu chưa một lần nghĩ tới việc phải kiểm.
Con bug đóng lại sau mười phút.
Chuyện này không hiếm. Bạn đã chứng kiến nó, hoặc bạn đã ở một trong hai cái ghế đó. Và câu hỏi mình muốn bắt đầu bộ sách này không phải là “con bug ấy là gì” - nó tầm thường, bạn sẽ gặp nó trong quyển đầu tiên.
Câu hỏi là: hai người ấy khác nhau ở chỗ nào?
Câu trả lời dễ nhất là người kia biết nhiều hơn. Nhưng nếu bạn ngồi xuống kiểm tra thật, câu đó thường sai. Cả hai đều biết bean là gì. Cả hai đều đã đọc cùng một trang tài liệu. Nếu bạn cho họ làm một bài kiểm tra về Spring, điểm có thể ngang nhau, đôi khi người trẻ còn cao hơn - cậu ta vừa đọc lại tài liệu sáng nay.
Senior không nhất thiết biết thêm một API. Họ biết giả định nào đáng bị hỏi trước.
Người kia không biết thêm một API nào. Anh ta chỉ hỏi một câu khác.
Và cái câu ấy, nếu bạn để ý, có một hình dạng rất lạ. Nó không đi tìm câu trả lời. Nó đi tìm một giả định. Người trẻ đã dành bốn tiếng để trả lời câu hỏi “code này sai ở đâu” - một câu hỏi hoàn toàn hợp lý, và hoàn toàn vô ích, bởi vì code không sai. Người kia không đi tìm cái sai. Anh ta đi tìm cái mà người trẻ đang tin mà không kiểm - và anh ta biết chỗ để tìm, vì anh ta đã từng tin nhầm đúng chỗ đó, nhiều năm trước, và đã trả giá.
Đó là toàn bộ khác biệt. Không phải kiến thức. Là danh sách những chỗ đáng nghi ngờ.
Cái danh sách ấy không có trong tài liệu nào. Tài liệu chính thức viết rất tốt về cái gì xảy ra; nó không viết về những chỗ mà người đọc nó thường hiểu nhầm. Các bài hướng dẫn thì lại càng không - chúng chỉ cho bạn con đường đã dọn sẵn, và im lặng về những chỗ bạn sẽ ngã. Nên gần như tất cả chúng ta xây cái danh sách đó theo cùng một cách: ngã, rồi nhớ. Mỗi mục trong danh sách là một đêm mất ngủ, một lần production hỏng, một buổi chiều thứ Sáu bị hủy.
Bộ sách này là một nỗ lực để rút ngắn con đường đó. Không phải bằng cách đưa cho bạn cái danh sách - danh sách thì bạn đọc xong sẽ quên, y như mọi danh sách. Mà bằng cách cho bạn đi qua ba mươi sáu lần ngã, mỗi lần một chỗ khác nhau, cho tới lúc bạn tự nhận ra rằng ba mươi sáu chỗ ấy không phải ba mươi sáu chỗ.
Nói ngay cho rõ bộ sách này không làm gì, để bạn khỏi mất thời gian.
Nó không dạy bạn dùng Spring. Nó không có bảng tra annotation, không có danh mục cấu hình, không có “những mẹo tối ưu hiệu năng”. Nó cũng không dạy bạn viết code cho đúng ngay từ đầu - mình không tin lắm vào chuyện đó, và bạn cũng vậy, nếu bạn đã đi làm đủ lâu.
Nó làm đúng một việc: cho bạn xem những chỗ mà thứ bạn tin và thứ đang thực sự diễn ra không khớp nhau - và cho bạn cách tự đi đo cái khoảng cách đó, trên hệ thống của chính bạn, bằng những lệnh bạn gõ được ngay chiều nay.
Ba quyển. Mỗi quyển phá đúng một giả định, và cả ba giả định ấy đều êm ái tới mức bạn chưa từng nghe thấy mình đang đặt chúng.
Quyển Một phá cái này: cái tôi nhìn thấy trong code, chính là cái đang chạy.
Quyển Hai phá cái này: code chạy đúng thì hệ thống chạy đúng.
Quyển Ba phá cái cuối cùng, và là cái đắt nhất: cái luật tôi viết ra, chính là cái luật đang chạy.
Ba lần, và bạn sẽ thấy chúng có cùng một hình dạng. Cái hình dạng đó mới là thứ mình muốn để lại - không phải ba mươi sáu con bug.
Một lời dặn về cách đọc, chỉ một thôi.
Mỗi bài trong bộ sách này, ở khoảng giữa, sẽ bảo bạn dừng đọc và tự chạy một thứ gì đó trên hệ thống của mình. Vài dòng lệnh, hoặc một đoạn code ngắn dán vào chạy thử. Cái đó không phải minh họa, và cũng không phải bài tập cho có.
Nó ở đó vì một lý do: bạn không nên tin mình. Mình có thể viết rất thuyết phục về một con bug mà hệ thống của bạn không hề có, hoặc có ở một hình dạng khác. Cách duy nhất để bạn biết chắc là tự tay bật nó lên, nhìn nó hỏng, rồi tắt nó đi và nhìn nó lành lại. Cái khoảnh khắc bạn thấy nó hỏng trên máy của chính mình - đó mới là lúc bạn học được gì đó. Phần chữ nghĩa còn lại chỉ là để dẫn bạn tới khoảnh khắc ấy.
Ba mươi sáu con bug đang chờ ở phía trước. Không con nào hiếm, không con nào cần một hệ thống đặc biệt để gặp; tất cả đều đang xảy ra ở đâu đó, ngay lúc bạn đọc dòng này, trong một dự án Spring nào đó trên đời.
Còn thứ mình thật sự muốn để lại thì không nằm trong ba mươi sáu bài ấy. Nó nằm ở một buổi chiều nào đó vài năm sau, khi bạn đi ngang qua bàn của một người đang bực bội với một con bug, trong một dự án mà mình chưa từng nhìn thấy, viết bằng một framework có khi còn chưa ra đời lúc mình gõ những dòng này.
Bạn dừng lại hai mươi giây. Rồi bạn hỏi một câu.
Và cậu ta hơi bực.