Những ai đã lập trình Spring Boot hoặc học lập trình Spring Boot đâu đó 1 tháng thế nào cũng đến phần JPA. Rồi sẽ biết thế nào là LomBok annotation. Đã bao giờ bạn hỏi ai là người ra viết ra LomBok và thực sự cơ chế hoạt động của LomBok là gì chưa?

Cách đây độ 2 tuần, tôi tình cờ đọc được một bản tin tuyển dụng trên group, một công việc quá đỗi hấp dẫn "Vị trí lập trình viên Java cho một team sản phẩm nhỏ của Mỹ, lương tối thiểu 2500$/tháng net nhận về, yêu cầu hiểu sâu về Java - Spring Boot, có thể làm việc từ xa, không yêu cầu bằng cấp hay giới hạn tuổi tác". Tôi hăm hở gửi email kèm CV apply ngay vị trí này. Chỉ 15 phút sau đã có phản hồi từ nhân sự, mời chiều đi phỏng vấn luôn. Tôi đến một phòng họp nhỏ nhưng bài trí cực đẹp trong một coworking space. Đúng là một team product ở nước ngoài đến Việt nam kiếm dev cứng rồi. Buổi phỏng vấn có một người nước ngoài ngồi nói chuyện trực tiếp và 2 người nữa họp qua Zoom.

Sau một hồi, tôi trình bày về kinh nghiệm và dự án phần mềm đã làm. Bộ ba gật gù mỗi khi nghe đến những từ khoá công nghệ quen thuộc. Tôi nghĩ bụng "Chém công nghệ lúc phỏng vấn hoá ra dễ nhỉ, nhẩm nhẩm lương 2500 USD quy ra tiền Việt, cỡ 57 triệu đồng cũng khá". Tưởng như cuộc phỏng vấn sắp đến phần chốt hạ thoả thuận lương, cũng như bàn chi tiết về dự án. Thì một người trong nhóm, chưa hỏi câu nào, lên tiếng hỏi tôi: "Do you know Lombok? Can you explain how it works and how it is built? What behind the scene?".

Oài tưởng gì, tôi dùng Lombok nhiều rồi các bạn. Cứ định nghĩa model, entity là xài Lombok annotation thôi. Tôi nói rõ là phải cài thêm extension Lombok Annotation vào VSCode hay  IntelliJ để khi biên dịch Lombok sẽ tạo ra những đoạn code lặp đi lặp lại (boilerplate code).

Người đàn ông đó có vẻ không hài lòng với câu trả lời của tôi. Ông ta tiếp tục hỏi "Can you explain how Lombok annotations work behind the scene: compile time and run time?"

Câu hỏi này khiến tôi bối rối và bực mình. Từ trước đến giờ thấy Lombok tiện thì dùng, chứ tôi có quan tâm Lombok được viết thế nào, nó chạy ra làm sao đâu.

Cuối cùng ông ta giới thiệu về dự án sắp làm. Tôi dịch lại để các bạn đọc cho nhanh "Chúng tôi không xây dựng ứng dụng Java với Spring Boot, mà chúng tôi xây dựng các thư viện (dependencies) giúp cho việc xây dựng ứng dụng microservice trở nên đơn giản hơn nhờ các annotation cấu hình. Lombok hay JPA là 2 ví dụ giống với những thứ chúng tôi đang làm".

Ngay đến đây tôi cũng chỉ biết gật gù, thực sự mơ hồ không biết tôi có đủ trình để tham gia team không. Ba hôm sau, tôi nhận được email thông báo tôi đã không đạt, và team tiếp tục di chuyển sang Trung Quốc để tìm ứng viên. Boom ! mất ngay job thơm.

Bài này tôi tạm dừng ở đây.  Ít nhất cũng chia sẻ được với các bạn về kinh nghiệm phỏng vấn một job Java lương tốt thì khoai thế nào. Bài sau tôi sẽ chia sẻ tìm hiểu chi tiết của tôi về Lombok thực sự hoạt động như thế nào. Cáy cú trượt phỏng vấn thì ít nhưng tôi thực sự cũng muốn hiểu bản chất Lombok hay JPA đã được viết ra sao?

Code sử dụng Lombok annotation

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Book {
  private String title;
  private String author;
}

Không có Lombok sẽ viết dài dòng như thế này 

public class Book {
  private String title;
  private String author;

  public Book() {}
  public Book(String title, String author) {
    this.title = title;
    this.author = author;
  }
  public String getTitle() {
    return title;
  }
  public void setTitle(String title) {
    this.title = title;
  }
  public String getAuthor() {
    return author;
  }
  public void setAuthor(String author) {
    this.author = author;
  }
  
  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((author == null) ? 0 : author.hashCode());
    result = prime * result + ((title == null) ? 0 : title.hashCode());
    return result;
  }
  @Override
  public boolean equals(Object obj) {
    if (this == obj)
      return true;
    if (obj == null)
      return false;
    if (getClass() != obj.getClass())
      return false;
    Book other = (Book) obj;
    if (author == null) {
      if (other.author != null)
        return false;
    } else if (!author.equals(other.author))
      return false;
    if (title == null) {
      if (other.title != null)
        return false;
    } else if (!title.equals(other.title))
      return false;
    return true;
  }
}