Đố các coder Việt trả lời được 2 câu cảnh sát Mỹ hỏi kỹ sư Nigeria lúc nhập cảnh?

    L.G.V.H,  

    Chúng tôi không định đưa ra câu trả lời cho bạn. Nhưng phải làm phần mềm bạn mới hiểu được 2 câu hỏi này bi hài ở chỗ nào.

    Chủ nhật ngày 26/2, Celestine Omin từ ngôi nhà của mình tại Lagos, Nigeria trở về nước Mỹ. Trong suốt 6 tháng vừa qua, Omin làm việc tại Andela, một startup việc làm IT có sự hậu thuẫn của Mark Zuckerberg và vợ. Hiện tại, vai trò của Omin là phát triển ứng dụng JavaScript cho công ty fintech (công nghệ tài chính) First Access.

    Đến Mỹ, Omin bất ngờ bị hải quan tại sân bay JFK (New York) giữ lại trong phòng kín. Sau một giờ chờ đợi, anh bắt đầu được một nhân viên hải quan Mỹ thẩm tra.

    "Visa của anh nói anh là kỹ sư phần mềm. Có đúng vậy không"?.

    Rồi người này đưa cho anh một tờ giấy, một chiếc bút và yêu cầu trả lời 2 câu hỏi:

    1. Viết một hàm để kiểm tra nếu một cây tìm kiếm nhị phân có cân bằng hay không.

    2. Abstract class là gì, tại sao bạn lại cần abstract class?

    Có quá nhiều điều bi hài đằng sau hai câu hỏi này.

    Celestine và đồng nghiệp tại Andela.
    Celestine và đồng nghiệp tại Andela.

    Câu thứ nhất, có lẽ ít nhất 50% kỹ sư phần mềm... giỏi sẽ không trả lời được. Cây tìm kiếm nhị phân là một khái niệm có lẽ bất cứ ai học phần mềm chính quy đều đã được học qua, nhưng cây tìm kiếm nhị phân cũng giống như tích phân của toán học hay bài toán tính số mol trong hỗn hợp 2 peptit mạch hở: không phải lúc nào trong cuộc sống bạn cũng cần kể vanh vách những khái niệm phức tạp kiểu đánh đố/khó nhớ.

    Nhìn sâu hơn, bạn không cần phải hiểu sâu về cây tìm kiếm nhị phân mà vẫn có thể là một kỹ sư phần mềm giỏi. Phần lớn các hệ thống phần mềm không cần dùng đến những thuật toán phức tạp, những khái niệm cao siêu mà chỉ cần giải các bài toán thực tiễn. Người coder giỏi sẽ cố gắng hết sức để code của họ mạch lạc, dễ hiểu, để người bảo trì sau này không tốn quá nhiều công sức. Dùng binary search tree, một khái niệm với nhiều người là không quen, chưa chắc đã là lựa chọn tốt.

    Quan trọng hơn là tư tưởng giải quyết vấn đề. Để giải một bài toán lớn, người coder chia nhỏ bài toán đó thành nhiều bài toán nhỏ - nhiều class, nhiều hàm... Để giải bài toán nhỏ trong từng hàm, từng lớp, người coder chỉ cần hiểu mỗi ngôn ngữ sẽ cung cấp những công cụ gì, phải dùng các công cụ đó để giải bài toán (nhỏ) của mình thế nào cho hợp lý.

    Có những người code nhiều năm mà không thèm biết binary search tree là gì.
    Có những người code nhiều năm mà không "thèm" biết binary search tree là gì.

    Công dụng của cây tìm kiếm nhị phân là để lưu trữ, sắp xếp, tìm kiếm các biến/object có thể sắp xếp. Đặt ngược lại vấn đề, ngôn ngữ nào cũng có nhiều giải pháp sẵn có để lưu trữ, sắp xếp, tìm kiếm các biến/object.

    Khi phải đối mặt với bài toán này, một coder cũng chỉ cần gọi ra các giải pháp sẵn có đó mà không cần biết tác giả đã thực thi giải pháp đó như thế nào bằng mã nguồn của riêng họ. Dĩ nhiên, coder cần phải biết mỗi giải pháp sẽ có ưu và nhược điểm gì, nhưng câu hỏi lớn nhất mà anh ta cần hỏi là "Cái này làm được gì cho tôi" chứ không phải là "Cái này làm cái điều đó như thế nào". Kiểm tra cây nhị phân cân bằng hướng vào câu hỏi thứ 2 hơn là câu hỏi thứ nhất.

    Tệ hơn nữa, nếu nói "viết một hàm" thì mỗi ngôn ngữ đều sẽ có cách viết khác nhau. Hàm Ruby sẽ rất khác hàm Java, hàm Java nhìn sẽ rất khác hàm Javascript. Chỉ có kỹ sư phần mềm thật giỏi mới có thể nhìn qua ranh giới của các ngôn ngữ lập trình để nhận ra thuật toán. Khả năng một nhân viên hải quan hiểu được câu trả lời của Omin (rất có thể viết bằng Javascript) là rất, rất thấp.

     Lớp chó mở rộng lớp động vật, một câu nói không tồn tại trong đời thường.

    "Lớp chó mở rộng lớp động vật", một câu nói không tồn tại trong đời thường.

    Câu hỏi thứ hai bi hài theo một cách khác. Abstract class (lớp trừu tượng) thực chất là một khái niệm rất cơ bản của lập trình hướng đối tượng. Nhưng vì là một khái niệm cơ bản nên mỗi coder đều sẽ hiểu abstract class theo một cách khác nhau. Mỗi người sẽ trả lời theo một cách khác nhau nên sẽ không có câu trả lời nào là đúng hoàn toàn hay sai hoàn toàn.

    Chưa dừng lại ở đây, "abstract class" là một khái niệm không tồn tại trong ngôn ngữ "tủ" của Omin là Javascript. Ngôn ngữ này thực thi (implement) các khái niệm OOP theo cách rất khác biệt với C hay Java.

    2 kỹ sư phần mềm nếu nói chuyện với nhau về abstract class chắc chắn sẽ mất thời gian. Omin làm thế nào để giải thích cho một nhân viên hải quan bình thường? Nghề của anh chàng không giống như bác sĩ, vốn lúc nào cũng có thể giải thích cho người khác về bệnh lao phổi; cũng chẳng giống như kỹ sư xây dựng, có thể lý giải vì sao xây cầu lại cần để ra khoảng trống giữa hai thanh thép. Abstract class, binary search tree đơn giản là không tồn tại trong cuộc sống hàng ngày.

    Omin đã từng xuất hiện khá nhiều trên các trang tin công nghệ.
    Omin đã từng xuất hiện khá nhiều trên các trang tin công nghệ.

    Cũng may cho Omin là anh chàng này được cho phép nhập cảnh – kể cả khi anh đã "trả lời sai" (theo lời nhân viên hải quan Mỹ) 2 câu hỏi được những người có lẽ là không có hiểu biết về phần mềm tìm kiếm trên Google. Tại thời điểm viết bài, câu tweet của Omin về sự kiện hy hữu này đã nhận được gần 6.800 lượt retweet (chia sẻ) và hơn 5.700 lượt thích.

    Tin cùng chuyên mục
    Xem theo ngày