Got It Recruitment — Những câu hỏi thường gặp khi phỏng vấn Engineer tại Got It

Thao Hoang
Got It Vietnam
Published in
10 min readJul 3, 2019

Bạn là sinh viên sắp ra trường và sắp sửa tham gia những cuộc phỏng vấn đầu tiên?

Bạn đã từng đi phỏng vấn nhưng với tâm thế mờ mịt, hoàn toàn không biết phải chuẩn bị điều gì?

Hay đơn giản là bạn muốn kiểm tra xem, những gì mình vẫn chuẩn bị liệu có khớp với những gì nhà tuyển dụng mong muốn?

Là một môi trường trẻ, hơn ai hết, Got It hiểu rất rõ những lo lắng này. Bởi chính chúng mình, không lâu trước, cũng đã từng trải qua cái cảm giác mờ mịt, lo lắng và hoang mang mỗi khi đi phỏng vấn. Vào những phút giây đó, mình đã nghĩ một chuyện rất… trẻ con rằng: ước gì có một cỗ máy thời gian của Doraemon để biết trước được buổi phỏng vấn sẽ như thế nào!

Và đó cũng chính là lí do bài viết này ra đời: Tuy không thể biến ra một cỗ máy thời gian, nhưng Got It sẽ giúp bạn biết mình sắp sửa “đối mặt” với điều gì khi phỏng vấn tại Got It.

Bạn đã sẵn sàng để trở thành thành viên của một team cực cool?

Như đã tiết lộ từ Phần 3. CV Review — Thế nào là một CV tiềm năng?, mỗi ứng viên khi ứng tuyển vào vị trí Engineer ở Got It đều sẽ “bị soi" cực kĩ hiểu biết về 6 mảng kiến thức cơ bản nhất của bộ môn Khoa học Máy tính (Computer Science). Và không phải chờ lâu thêm nữa, hãy đọc thật kĩ những câu hỏi sau đây, vì rất có thể bạn sẽ gặp chúng khi tham gia phỏng vấn Phone ScreenCompetency Interview ở Got It đấy nhé!

(Để thưởng cho những bạn đã cất công “ôn bài”, chúng mình đã hỏi các Engineers để đưa ra một vài gợi ý về câu trả lời rồi đó ;’)).

1. Data Structures and Algorithms (Cấu trúc dữ liệu và Giải thuật)

1. Name the differences between array and linked list in: storage allocation, order of the elements, accessing the element, insertion and deletion, searching, memory utilization and memory required.
(Kể ra sự khác nhau giữa mảng và danh sách liên kết về: phân bổ lưu trữ, thứ tự của các phần tử, truy cập phần tử, chèn và xóa, tìm kiếm, tối ưu bộ nhớ và cấp phát bộ nhớ.)

  • Gợi ý 1 (mức độ cơ bản):
    - Trong mảng, các phần tử nằm cạnh nhau trong bộ nhớ. Trong danh sách liên kết, chúng được kết nối với nhau thông qua các con trỏ.
    - Nhìn chung, độ phức tạp của không gian ở danh sách liên kết lớn hơn do có thêm con trỏ.
  • Gợi ý 2 (mức độ trung cấp):
    - Truy cập phần tử thông qua chỉ mục: O(1) trong mảng và O(n) trong danh sách liên kết.
    - Chèn và xóa khi đã biết vị trí: O(n) trong mảng và O(1) trong danh sách liên kết.
  • Gợi ý 3 (mức độ nâng cao):
    - Danh sách liên kết có nhiều lợi thế hơn khi bộ nhớ bị phân mảnh.
    - Mảng có nhiều lợi thế hơn khi cấu trúc dữ liệu thường được truy cập bằng chỉ mục.
    - Mảng có bộ nhớ đệm nội bộ (cache locality) tốt hơn.

2. Find reverse of a number. Example: 1234 -> 4321.
(Tìm đảo ngược của một số. Ví dụ: 1234 -> 4321.)

  • Gợi ý 1 (mức độ tốt):
    Có thể đưa ra cách giải mà không có bất kỳ gợi ý nào.
  • Gợi ý 2 (mức độ cơ bản):
    Có thể tìm ra cách giải sau khi được cung cấp một số gợi ý (ví dụ: suy nghĩ về phần còn lại).
  • Đáp án chưa tốt:
    Biến số thành chuỗi rồi đảo ngược (đây không phải một đáp án tốt, nhưng không quá tệ, có thể tạm chấp nhận).

3. Given a list of integers, how to check if a number exists in that list?
(Cho một danh sách các số nguyên, làm thế nào để kiểm tra liệu một số bất kỳ có tồn tại trong danh sách đó không?)

  • Gợi ý:
    Dùng Linear search (tìm kiếm tuyến tính) và Binary search (tìm kiếm nhị phân).

4. What are the differences between Stack and Queue?
(Sự khác biệt giữa Stack và Queue là gì?)

5. What is the difference between a tree and a graph?
(Sự khác biệt giữa cây và đồ thị là gì?)

6. An HTML website contains many <a> tags, and each tag has an `href` attribute that contains the url link that navigates to the destination website. A web crawler will fetch the HTML content from a website and analyze its content to detect the url links which will be crawled next. This process will repeat until there is no new link for crawling.
Design the algorithm to build a web crawler.
- Input: URL link of a web site
- Output: A list of all the links that will be crawled.

(Cho một trang web HTML chứa nhiều thẻ <a>, mỗi thẻ có một thuộc tính`href`chứa liên kết URL điều hướng đến trang web đích. Trình thu thập dữ liệu web sẽ tìm nạp nội dung HTML từ trang web và phân tích nội dung của nó để phát hiện liên kết URL nào sẽ được thu thập thông tin tiếp theo. Quá trình này sẽ lặp lại cho đến khi không có liên kết mới để thu thập thông tin.
Thiết kế thuật toán để xây dựng trình thu thập dữ liệu web.
- Đầu vào: Liên kết URL của một trang web
- Đầu ra: Một danh sách tất cả các liên kết được thu thập thông tin.)

2. Object Oriented Programming (Lập trình hướng đối tượng)

1. What is OOP? Why should we use OOP?
(OOP là gì? Vì sao chúng ta nên sử dụng OOP?)

  • Gợi ý:
    - Ứng viên có thể kể tên 4 tính chất: tính đóng gói (encapsulation), tính đa hình (polymorphism), tính kế thừa (inheritance) và tính trừu tượng (abstraction).
    - Ứng viên có thể giải thích từng tính chất.

2. (Interface) Given a game where we have set of animals of difference races (Example: Dog, Bird, Cat, Lion). How to make all of the animal in the set expose a method named “fly” so we can ask them to fly even if they are not birds?
((Giao diện) Cho một trò chơi, trong đó ta có các loài động vật khác nhau (ví dụ: chó, chim, mèo, sư tử). Làm thế nào để gán cho tất cả các con vật một phương thức có tên là “fly” để ta có thể yêu cầu chúng bay ngay cả khi chúng không phải là chim?)

  • Gợi ý:
    Ứng viên có thể thử sử dụng tính chất kế thừa (inheritance). Nhưng đây là một tình huống không thực tế. Ta không thể tạo ra một con chó thừa hưởng các đặc tính và phương pháp của bất kỳ chủng tộc nào khác có thể bay. Giải pháp chính xác là tạo ra một interface có tên là “flyable”.

What is composition? Compare composition vs inheritance.
(Composition là gì? So sánh composition và inheritance.)

Explain class constructor.
(Giải thích khái niệm class constructor.)

Explain Interface vs Abstract class.
(Giải thích Interface và Abstract class.)

Tell the differences between Override vs Overload.
(Phân biệt Override và Overload.)

Explain polymorphism concept.
(Giải thích khái niệm đa hình.)

Trở thành một Got It-ian quả không dễ dàng chút nào đúng không? Cùng tiếp tục nhé!

3. Design Patterns (Mẫu thiết kế phần mềm)

What are design patterns? Why should we use design patterns?
(Design patterns là gì? Vì sao chúng ta nên sử dụng design patterns?)

Describe the Singleton pattern.
(Hãy mô tả Singleton pattern.)

(Observer pattern) Given a Controller which has a property named “view” representing a view it controls. How does view notify the controller when a certain event occurs?
((Observer pattern) Cho một Trình điều khiển có thuộc tính có tên là “view” thể hiện một khung nhìn mà nó điều khiển. Làm thế nào để xem thông báo cho bộ điều khiển khi một sự kiện nhất định xảy ra?)

(Architectural pattern) Explain microservices vs monolithic.
((Architectural pattern) Hãy giải thích hai khái niệm microservice và monolithic.)

(Dependency injection) Given a class A which needs to use an instance of class B. How do you implement this idea without creating a direct dependency between 2 classes?
((Dependency injection) Cho một lớp A cần sử dụng một dữ kiện của lớp B. Làm thế nào để thực hiện ý tưởng này mà không tạo ra sự phụ thuộc trực tiếp giữa 2 lớp?)

(Architectural pattern) Describe MVC. Provide a solution to solve the “Massive controller” issue.
((Architectural pattern) Hãy mô tả MVC. Đưa ra cách giải quyết vấn đề “Massive controller”.)

4. Databases (Cơ sở dữ liệu)

How do you represent the n-n relationship in a relational database?
(Bạn mô tả n-n relationship trong trong cơ sở dữ liệu quan hệ như thế nào?)

  • Gợi ý:
    Sử dụng một bảng kết hợp (association table) với khóa ngoại (foreign key) trỏ vào hai bảng.

What is index used for?
(Chỉ mục được dùng để làm gì?)

Compare primary key and foreign key. Does a table has to have primary key?
(Hãy so sánh khóa chính và khóa ngoại. Một bảng có nhất định phải có khóa chính không?)

Compare SQL and noSQL databases.
(Hãy so sánh hai cơ sở dữ liệu SQL và noSQL.)

How do you represent key-value structure in a relational database?
(Bạn mô tả key-value structure trong cơ sở dữ liệu quan hệ như thế nào?)

What is database normalization? Why should we need to normalize when designs a new database?
(Chuẩn hóa cơ sở dữ liệu là gì? Vì sao chúng ta cần chuẩn hóa khi thiết kế một cơ sở dữ liệu mới?)

Stay tune! Chỉ còn 2 phần nữa thôi!!

5. Networking (Mạng máy tính)

Compare UDP vs TCP.
(Hãy so sánh UDP và TCP.)

Compare GET vs POST, POST vs PUT.
(Hãy so sánh GET và POST, POST và PUT.)

What happens from when we enter a domain (“google.com” for example) into browser to when the page is rendered?
(Điều gì sẽ xảy ra từ khi nhập một tên miền (ví dụ: “google.com”) vào trình duyệt đến khi trang được hiển thị?)

Name some of the protocols belong to the application layer (OSI) that you know.
(Kể tên một số giao thức thuộc tầng ứng dụng (OSI) mà bạn biết.)

Describe the format of HTTP request and response.
(Mô tả định dạng request và response của HTTP.)

Name layers of OSI Model.
(Kể tên các tầng của Mô hình OSI.)

6. Operating Systems (Hệ điều hành)

Compare thread vs process.
(So sánh luồng và tiến trình.)

Explain the term “Deadlock”.
(Giải thích thuật ngữ “deadlock”.)

Define “cache”. Why do we need to use cache?
(Hãy định nghĩa “bộ nhớ đệm”. Vì sao ta cần sử dụng bộ nhớ đệm?)

Which criteria can be used to classify Operating Systems?
Những tiêu chí nào có thể được sử dụng để phân loại Hệ điều hành?

What does 32-bit mean in Window 32-bit OS?
(32-bit có nghĩa là gì trong Hệ điều hành Window 32-bit?)

What is round robin scheduling ?
(Round-robin scheduling là gì?)

Trên đây là một vài câu hỏi mẫu mà chúng mình nghĩ bạn có thể gặp trong buổi phỏng vấn Engineering với Got It. Tuy nhiên, vẫn còn rất nhiều câu hỏi về Computer Science và cả những lĩnh vực khác sẽ được đề cập tới mà chúng mình không thể gói gọn chỉ trong một bài viết. Chúng mình đã tổng hợp các câu hỏi đó ở đường link bit.ly/GotIt-InterviewQuestions, bạn có thể tham khảo để chuẩn bị kĩ lưỡng hơn cho Engineering Interview ở Got It nhé.

Quả thật có rất nhiều kiến thức đúng không? Cũng bởi vậy nên mỗi chúng mình đều cực kỳ tự hào khi vượt qua biết bao cửa ải và trở thành một Got It-ian. Vượt qua các vòng phỏng vấn khó nhằn không chỉ đơn thuần là đáp ứng được yêu cầu của nhà tuyển dụng. Đó còn là khi bạn thử thách chính mình, tự nhìn lại và kiểm tra xem những kiến thức mình có đang ở đâu so với nhu cầu của thị trường, và so với mục tiêu mà bạn hướng đến.

At Got It, we're building global scale products while having fun!

Chúng mình rất mong rằng khi đọc xong bài viết này, dù có quyết định apply vào Got It hay không, bạn cũng có thể phần nào hiểu hơn về bản thân, để khi bước chân khỏi cánh cổng đại học, bạn đã không còn quá non nớt và bỡ ngỡ. Còn nếu bạn muốn tiếp tục con đường phía trước với chúng mình, hãy nhớ rằng Got It luôn chào đón bạn vào bất cứ thời điểm nào bạn cảm thấy sẵn sàng nhé!

Bạn có thể xem các vị trí đang tuyển dụng của Got It tại: bit.ly/gotithanoi và đọc thêm về quy trình tuyển dụng tại đây.

Để tìm hiểu thêm về các sản phẩm và văn hoá của Got It, mời bạn ghé thăm trang web chính thức www.got-it.ai hoặc vn.got-it.ai nhé.

--

--