Phỏng vấn Ruby on Rails Developer

Lời mở đầu

Xin chào các bác.

Bài viết hôm nay được chia sẻ từ https://rubygarage.org/

Nó có thể hữu ích khi bạn cần phỏng vấn RoR developers vào công ty, hoặc giúp cho những ứng viên tham khảo, chuẩn bị trước.

Đối với bản thân mình, bài viết này cũng giống như một bài kiểm tra, giúp rà soát lại các kiến thức và bổ sung những gì còn thiếu (honho).

Bây giờ hãy nói về cấu trúc của bài phỏng vấn. Bỏ qua đoạn chào hỏi, nó sẽ được chia thành 4 phần riêng biệt:

  • Ruby.
  • Ruby on Rails.
  • Pair programming task;
  • Home task.

Các bác hãy thử xem mình trả lời được bao nhiêu câu nhé (dance2)

1. Những câu hỏi về Ruby

Tại sao ứng viên apply vị trí Ruby On Rails developers mà ta lại hỏi những câu về Ruby ?

Vì Rails là framework được viết trên Ruby. Điều đó đồng nghĩa với việc, khi ta viết code cho RoR, là chúng ta đã sử dụng Ruby.

Một vấn đề mà các nhà phỏng vấn thường xuyên gặp phải là các developer họ thực sự không nắm vững những kiến thức cơ bản của chính ngôn ngữ lập trình nền tảng.

Những câu hỏi về Ruby thường dựa trên Object Oriented Programming (OOP) và Object Oriented design patterns.

Các đặc tính trừu tượng, đóng gói, kế thừa, đa hình là những thứ mà tất cả lập trình viên không chỉ riêng RoR cần phải nắm vững.

Nếu ứng viên trả lời đúng list câu hỏi bên dưới, thì chúng ta mới tiếp tục. Vì vậy hãy chuẩn bị kỹ lưỡng, nếu họ không thể trả lời các câu hỏi đó một cách rõ ràng, thì chào thân ái và quyết thắng.

  • Class là gì?
  • Sự khác nhau giữa ClassModule?
  • Object là gì?
  • Làm thế nào để tạo và sử dụng Constructor trong Ruby?
  • Làm thế nào để tạo gettersetter method trong Ruby?
  • Miêu tả sự khác nhau giữa class variablesinstance variables?
  • 3 cấp độ truy cập method của class và ý nghĩa có nó là gì? (public, protected, private ế (yaoming)).
  • self là gì?
  • Giải thích câu "hầu hết tất cả mọi thứ đều là object" trong Ruby?
  • Singleton method là gì? Eigenclass là gì?
  • Mô tả Ruby method lookup path?
  • Miêu tả về các callbacks của Ruby. Ta sử dụng chúng như thế nào?
  • Sự khác nhau giữa ProcLambda là gì?

Business Applications

Nắm vững những kiến thức cơ bản là rất tốt, tuy nhiên nó là chưa đủ để làm việc trong dự án.

Một lập trình viên cần có kiến thức để viết code cho business applications.

Trong Rails app, Rack là một interface rất phổ biến, nên chúng tôi đặt ra những câu hỏi cụ thể về nó.

Dưới đây là 4 câu hỏi:

  • Rack là gì?
  • Giải thích về Rack application interface.
  • Hãy thử viết một Rack application đơn giản.
  • Rack middleware hoặt động như thế nào?

Ruby gems

Ruby là ngôn ngữ lập trình thông dụng, và với cộng đồng lớn mạnh, họ đã tạo ra rất nhiều các thư viện hữu ích.

Những đoạn Code được phát triển từ một bên thứ ba giúp chúng ta xây dựng web application nhanh hơn, nuột hơn.

Trong phần này, developer phải show ra những hiểu biết của mình về cấu trúc gem library.

Khi xây dựng 1 app, lập trình viên sẽ phải sử dụng nhiều gem khác nhau. Điều đó cũng giúp đánh giá xem họ có thể đọc và hiểu code được viết bởi lập trình viên khác hay không.

Chúng tôi đã xây dựng 4 câu hỏi về Ruby gems:

  • RubyGems là gì? Nó hoạt động như thế nào?
  • Làm thế nào để bạn tự xây dựng gem của riêng mình?
  • Giải thích cấu trúc của một Ruby gem.
  • Hãy lấy ví dụ về những gems yêu thích của bạn ngoài gem trong Rails.

2. Ruby on Rails

Bây giờ là lúc để lao vào thế giới của framework Rails.

Một web developer nên làm quen với mô hình Model-View-Controller để xây dựng ứng dụng.

Các câu hỏi phỏng vấn của Ruby on Rails dành cho các lập trình viên được chia làm 3 nhóm.

Đầu tiên, chúng tôi sẽ hỏi chung chung liên quan đến Rails.

Nhóm thứ hai, chúng tôi muốn xem lập trình viên biết những gì về routing, controller, views - phần core của bất cứ business application nào.

Và cuối cùng, những câu hỏi về ActiveRecord giúp chúng tôi biết được lập trình viên hiểu phần Model đến đâu.

Các câu hỏi phỏng vấn về Ruby on Rails

  • ActiveJob là gì? Khi nào ta sử dụng chúng?
  • Asset Pipeline là gì?
  • Giải thích sự khác nhau giữa Page, Action, Fragment, Low-level, SQL caching.
  • Rails engine là gì?

Routing, Controllers và Views

  • Lấy ví dụ về RESTful routing và controller.
  • CRUD đại diện cho những từ nào và các actions của nó.
  • Làm thế nào để test routes?
  • Làm thế nào để sử dụng filters trong controller?
  • Strong Parameters là gì?
  • Chúng ta cần phải làm gì để test trong controller?
  • Làm thế nào để sử dụng content_for và yield?
  • Làm thế nào để sử dụng nested layouts?

Active Record

  • Giải thích về Active Record pattern?
  • Object-Relational Mapping là gì?
  • Miêu tả về conventions của Active Record.
  • Giải thích cơ chế Migrations.
  • Mô tả các loại associations trong Active Record.
  • Scopes là gì? Sử dụng như thế nào?
  • Giải thích sự khác nhau giữa optimisticpessimistic locking.

Security

Một ứng dụng tốt thì cần phải bảo mật. Lập trình viên cần có hiểu biết về các kiểu tấn công vào Ruby On Rails app.

Bên cạnh các kiểu tấn công, ta cũng cần biết mọi thứ về những method phòng chống hiện có và những tình huống sử dụng chúng chính xác.

Những câu hỏi đưa ra không chỉ đơn thuần nằm trong khuôn khổ của Rails, mà nó còn có những kiến thức về bảo mật chung khác.

  • Cơ chế của Sessions là gì. Nó hoạt động như thế nào?
  • Mô tả về các kiểu tấn công: Cross-site request forgery, cross-site scripting, session hijacking, session fixation attacks.
  • Sự khác biệt giữa SQL injectionCSS injection?
  • Bạn lưu trữ những thông tin bảo mật (vd: password) như thế nào?
  • Tại sao chúng ta cần sử dụng HTTPS thay cho HTTP?

Automated Test

Viết code mà không viết test thì không ổn chút nào, đặc biệt khi ta dùng ruby - ngôn ngữ mà bản thân nó đã expect developer phải viết test. Việc viết Automated Test giúp giảm tải phần lớn khối lượng công việc cho QA team, cải thiện workflow của dự án.

Tất cả web developers cần phải hiểu tại sao phải viết Test, khi nào cần viết, và sử dụng loại test nào. Dưới đây là một số câu hỏi về Automated Test.

  • Unit test là gì?
  • Những kỹ thuật chính khi viết test là gì?
  • Công cụ yêu thích khi viết unit test của bạn là gì?
  • Công cụ yêu thích khi viết feature test của bạn là gì?

Refactoring

Ngoài ra còn một số câu hỏi liên quan đến refactor code, bởi vì nó là một bước rất quan trọng khi phát triển bất kỳ ứng dụng nào.

Refactor có nghĩa rằng lập trình viên chỉnh sửa code đã viết, làm cho nó sạch và hiệu suất tốt hơn.

Chúng tôi muốn Rails programmers viết những dòng code chất lượng mà nó có thể dễ bảo trì và mở rộng.

Khi refactor, programmers phải tạo một cấu trúc code thích hợp, tăng cường hiệu năng của ứng dụng mà không làm thay đổi behavior của code.

  • Code thối là gì? (Code smell :v)
  • Công cụ mà bạn yêu thích, giúp tìm đoạn code thối và có khả năng sinh ra bug là gì?
  • Tại sao bạn nên tránh Fat controllers?
  • Tại sao bạn nên tránh Fat models?
  • Hãy giải thích về các kỹ thuật Value, Service, Form, View, Query, và Policy Objects.

3. Pair Programming task

Trong phần tiếp theo của cuộc phỏng vấn, chúng tôi sẽ test kỹ năng lập trình khi làm việc nhóm với một senior web developer khác ở bên tôi.

Không quan trọng cuộc phỏng vấn là trực tuyến qua Hangouts, Skype hay trực tiếp, chúng tôi chỉ cần yêu cầu người phỏng vấn share màn hình của họ và bắt đầu giải quyết công việc.

Vậy mục đích của pair programming test là gì?

Điều đầu tiên, nó giúp chúng tôi thấy được mindset của lập trình viên. Một khi developer nhận task, họ sẽ suggest những phương pháp để giải quyết vấn đề đó.

Thứ hai, Pair Programming giúp nhà tuyển dụng thấy được năng lực làm việc nhóm của developer khi hoạt động trong team.

Dưới đây là một số task có thể đưa ra trong cuộc phỏng vấn.

Tìm khoảng cách nhị phân (Binary gap)

Khoảng cách nhị phân với số nguyên dương N là số chữ số 0 liền nhau lớn nhất được bao quanh bởi số 1.

Ví dụ:

  • Số 9 khi chuyển sang hệ nhị phân là 1001 -> có hai số 0 liên nhau bao quanh bởi số 1 -> Khoảng cách nhị phân = 2
  • Số 529 khi chuyển sang hệ nhị phân là 1000010001, -> có 2 khoảng cách nhị phân = 4 và 5 -> lấy số lớn hơn = 5.
  • Số 15 chuyển sang nhị phân là 1111, -> khoảng cách nhị phân = 0

Hãy viết function binary_gap(n) với n là số nguyên dương truyền vào, return lại binary gap của số đó.

Scope:

  • n là số integer nằm trong khoảng: [1..2_147_483_647]

Độ phức tạp:

  • Độ phức tạp của trường hợp tệ nhất là O(log(N)).
  • Độ phức tạp của trường hợp tệ nhất là O(1).

4. Home task

Đây là task cuối cùng chúng tôi giao cho lập trình viên. Chúng tôi muốn kiểm tra xem lập trình viên có thể sử dụng nhiều công nghệ, kỹ thuật hay không kể cả frontend và backend.

Dù là backend developer, nhưng cũng nên am hiểu nhiều frontend tools, bao gồm cả Javascript, các framework, thư viện liên quan.

Chúng tôi còn có thể đánh giá khả năng viết autotests bằng cách sử dụng các công cụ như Rspec, Capypara, ....

Nội dung của task có thể thay đổi tùy thuộc vào vị trí mà developer đó sẽ làm việc, có thể liên quan tới React, Ember, Backbone,...

Nội dung

Trong công việc tôi rất chú trọng năng suất làm việc. Vì vậy tôi muốn quản lý các tasks của mình hiệu quả hơn. Tôi cần một tool giúp quản lý task flow.

Chức năng yêu cầu:

  • Sign in/ Sign up bằng email/password hoặc Facebook.
  • Có thể Create/Update/Delete projects.
  • Add task vào projects.
  • Update/Delete tasks.
  • Có đặt độ ưu tiên cho mỗi task.
  • Đánh dấu task đã "Done".
  • Add comments cho Task.
  • Delete comments.
  • Đính kèm file vào task.

Yêu cầu về mặt kỹ thuật:

  • Sử dụng web application:
    • Về phía client: áp dụng HTML5, CSS3, Bootstrap, JS, AngularJS, và Jquery.
    • Về phía server: dùng Ruby on Rails.
  • Cần có validate cả 2 phía client và server.
  • Nó nên hoạt động giống như Single-Page Web app và sử dụng AJAX.
  • Cần có giải pháp cho User authentication, user chỉ access được vào projects và task của họ.
  • Cần viết automated tests (models - RSpec, controllers - RSpec, acceptance/functional tests - RSpec + Capybara)

Post 1 cái screen sample cho dễ hiểu, nó sẽ trông như sau:

Túm cái váy lại

Còn có rất nhiều câu hỏi khác để phỏng vấn RoR developers trước khi thuê họ. Những câu hỏi chúng tôi đưa ra được thiết kế để phân tích kỹ năng lập trình viên đầy đủ nhất có thể.

Hãy hỏi đúng câu hỏi để tìm được mảnh ghép thích hợp cho team của bạn.

Nguồn: