GK - Câu hỏi nhập cảnh của hải quan Mẽo khiến lập trình viên bó tay

Thảo luận trong 'Thư Giãn Express - Bản Tin Cuối Ngày' bắt đầu bởi Nô., 1/3/17.

  1. Nô.

    Nô. For the Horde! GVN CHAMPION ‍ ⚚ Mystic Mage ⚚ Lão Làng GVN

    Tham gia ngày:
    3/3/07
    Bài viết:
    11,748
    Nơi ở:
    Nowhere
    Đố 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?

    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.



    [​IMG]
    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ý.



    [​IMG]
    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.

    [​IMG]

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



    [​IMG]
    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.
     
    Yukawa thích bài này.
  2. gaulilom

    gaulilom Youtube Master Race

    Tham gia ngày:
    6/1/12
    Bài viết:
    63
    Nơi ở:
    Gầm bàn Nest by AIA
    hiểu gì... chết liền
     
  3. kuronkuroni

    kuronkuroni Dragon Quest GameOver

    Tham gia ngày:
    14/11/16
    Bài viết:
    1,316
    ??? :D ??
     
  4. hanhnn13

    hanhnn13 Mr & Ms Pac-Man

    Tham gia ngày:
    5/8/09
    Bài viết:
    235
    Mọi đen làm màu
     
  5. ConChymBay

    ConChymBay Tears of the Kingdom

    Tham gia ngày:
    23/3/15
    Bài viết:
    25,497
    thằng CA bày đặt thử thách kiến thức trong khi bản thân nó đéo biết câu trả lời đúng
     
  6. vinhtidus2006

    vinhtidus2006 C O N T R A Lão Làng GVN

    Tham gia ngày:
    12/1/07
    Bài viết:
    1,948
    hóng các trùm IT vào giải thích đơn giản hơn :2onion58:
     
  7. Hồng Sư Vượn

    Hồng Sư Vượn T.E.T.Я.I.S GameOver

    Tham gia ngày:
    15/1/17
    Bài viết:
    633
    summon HD2M aka @tructruc vào giải đáp
     
  8. TrươngGiaPhong

    TrươngGiaPhong Thường cho em ✡ Shine Wizard ✡ Lão Làng GVN

    Tham gia ngày:
    21/3/07
    Bài viết:
    5,939
    Mình ko phải dân IT nhưg đọc qua loa thì là ntn:
    Câu 1: Nó quá cao siêu ko mấy khi áp dụng thực tế nên éo cần nhớ
    Câu 2: Khái niệm đa dạng kiểu cái nào cũng đúng hoặc sai
    À mà mình cũng rảnh thật :3cool_angry:
    5 phút đời người :((
     
  9. darkbik

    darkbik T.E.T.Я.I.S

    Tham gia ngày:
    23/3/10
    Bài viết:
    525
    Nơi ở:
    SG
    Lần đầu biết Mỹ đen học giỏi, tụi này chơi thể thao trâu bò là chính
     
  10. Lezard.V

    Lezard.V SPARTAN John-117 Lão Làng GVN

    Tham gia ngày:
    18/10/08
    Bài viết:
    11,148
    Nơi ở:
    Tp.HCM
    Muốn gây khó dễ thì hải quan Vịt hỏi gì giờ ?:-?
    Đồ Sơn có cave không, yes or no?
     
  11. Jaelse

    Jaelse Dragon Quest

    Tham gia ngày:
    1/1/16
    Bài viết:
    1,449
    hỏi khái niệm abtract class với 1 người chuyên javascript, sao ko hỏi Michael Jordan sút bóng thế nào cho đúng =))
     
  12. Vouu3

    Vouu3 Liu Kang, Champion of Earthrealm

    Tham gia ngày:
    6/12/16
    Bài viết:
    5,367
    Thế tau có mấy cọng lông koo :3cool_shame:
     
  13. kokoronokuukyo

    kokoronokuukyo T.E.T.Я.I.S

    Tham gia ngày:
    17/6/15
    Bài viết:
    609
    Nơi ở:
    TP. HCM
    Câu 1 theo cái hình minh họa thì kiểu như tìm 1 số nào đó trong đống số đó... Thì mỗi node sẽ có 0, 1 hoặc 2 con (những thằng nằm dưới và được nói với nó)... Thằng con bên trái luôn nhỏ hơn node, còn thằng node lại nhỏ hơn bên phải, và những thằng con của thằng con bên trái nó luôn nhỏ hơn những thằng con của thằng con bên phải... Mấy bác có thể thấy từ 7 rẽ ra 2 nhánh thì mọi số bên phải luôn lớn hơn bên trái...
    Vậy với cách sắp xếp đóa nếu số cần tìm bằng với giá trị thằng đang xét thì nó cho kết quả là node đang xét... Còn nếu không thì so sánh số cần tìm với node đó, nhỏ hơn rẽ qua trái, lớn hơn rẽ phải, lập lại vậy đến khi tìm ra hoặc đến thằng không có con thì tìm không ra...
    Thay vì kiểm tra n thằng thì sắp thế này nó giúp số lần kiểm tra chỉ còn log hệ số 2 của n...
     
  14. kyuwan88

    kyuwan88 Fire in the hole! Lão Làng GVN

    Tham gia ngày:
    21/4/07
    Bài viết:
    2,533
    tưởng CA mẽo thế nào, hoá ra cũng hơn gì East Laos đâu :4cool_doubt:
     
  15. các hạ tuổi gì

    các hạ tuổi gì Mario & Luigi

    Tham gia ngày:
    1/5/16
    Bài viết:
    748
    Vậy Hải quan Vịt sẽ hỏi câu gì ?
     
  16. TrươngGiaPhong

    TrươngGiaPhong Thường cho em ✡ Shine Wizard ✡ Lão Làng GVN

    Tham gia ngày:
    21/3/07
    Bài viết:
    5,939
    Đồng tiền Việt Nam có chữ gì chung?
     
  17. Aiden Fox Pearce

    Aiden Fox Pearce C O N T R A

    Tham gia ngày:
    17/11/16
    Bài viết:
    1,519
    Nơi ở:
    TP gió
    Chữ đồng
     
  18. departed101

    departed101 Mr & Ms Pac-Man Lão Làng GVN

    Tham gia ngày:
    26/4/07
    Bài viết:
    135
    nhiều nhà tuyển dụng lập trình ở vn còn hỏi những câu chó chết hơn thế này nhiều.
     
  19. rekkhan

    rekkhan Dragon Quest

    Tham gia ngày:
    22/7/05
    Bài viết:
    1,302
    hửi d** 2 phút?
     
  20. Ninjakyo

    Ninjakyo Fire in the hole!

    Tham gia ngày:
    29/1/09
    Bài viết:
    2,734
    Cái này thật ra đơn giản nhưng không phải lập trình viên nào cũng thèm biết bạn à. Vì cơ bản trong lúc làm việc chẳng khi nào đụng tới. Đặc biệt là trong thời đại ngôn ngữ lập trình cấp cao như hiện nay. Tất cả các thứ đó đc giấu sau library hết rồi.
     

Chia sẻ trang này