Skip to main content

Kinh nghiệm phỏng vấn (p2)



Chào các bạn, hôm nay có một chuyện khá thú vị mà lần đầu tiên mình gặp phải khi đi làm phần mềm, mà chắc các bạn cũng sẽ có lần phải trải qua đó là onsite interview, thực chất đó là bên onsite sẽ phỏng vấn để có quyết định thuê người bên mình hay không.

1. Em so sánh thế nào về 2 ngôn ngữ Objective C và Swift.
TL: Bản chất thì hai ngôn ngữ không khác nhau quá nhiều, một bạn học Objective C thì có thể chuyển qua làm Swift nhanh chóng và ngược lại. Quan trọng là Swift là ngôn ngữ mới được Apple suggest, nó có cấu trúc đơn giản, tường mình hơn để giảm effort của lập trình viên nên em cũng hướng đến phát triển ứng dụng trên Swift nhiều hơn.
2. Em có dùng design pattern nào khi lập trình không
TL: Design pattern thì vô cùng quan trọng trong việc phát triển phần mềm. Với mỗi ngôn ngữ lập trình thì sẽ có các cách implement khác nhau nhưng về bản chất khi giống nhau. Các design pattern em thường sử dụng là singleton(vô cùng phổ biến), delegate pattern, observer pattern, repository, MVC, MVVM... Và còn rất là nhiều nữa :))
3. Em phân biệt block(closure) với delegate
TL: Block là cơ chế để xử lý callback trong lập trình iOS với cú pháp ngắn gọn, dễ hiểu. Trong khi delegate là một pattern. Nó sử dụng một protocol(tương tự như interface để phản hồi lại đối tượng khác). Điểm khác nhau là khi dử dụng delegate sẽ giảm tính kết nối giữa 2 thành phần do thành phần cha chỉ cần implement 1 protocol. Trong khi block lại giải quyết tốt bài toán truyền dữ liệu giữa nhiều thành phần, dễ testing sau này. Do đó tuỳ từng trường hợp mà chúng ta sẽ chọn cách thích hợp. Ngoài ra để xử lý callback chúng ta có thể sử dụng observer pattern, mà trong iOS thì đã có NSNotification implement sẵn cho mình. Ưu điểm của observer là thực thi đơn giản, không tạo kết nối chặt chẽ giữa 2 đối tượng tương tác như block hay delegate. Nhưng nhược điểm của nó là khó kiểm soát do thiếu tính liên kết chặt chẽ.
4. Em phân biệt strong reference với weak reference
TL: Vấn đề này liên quan đến quản lý con trỏ trong ngôn ngữ lập trình. Nếu bạn muốn 2 đối tượng của bạn liên kết mạnh với nhau thì sử dụng strong, ngược lại thì sẽ dùng weak. Một đối tượng chỉ có thể giải phóng khi nó không còn tồn tại liên kết mạnh nào.
5. Các giao thức khi em làm việc với RestAPI
TL: GET: lấy dữ liệu, POST: thêm 1 bản ghi mới, PUT, PATCH: cập nhật 1 bản ghi, DELETE: xoá 1 bản ghi
6. Ngoài ra còn có các câu hỏi khác ngoài lề cũng khá thú vị như khi anh giao một task cho em gồm 1 file spec và 1 file design, em sẽ làm như thế nào?
TL: Mục đích đầu tiên khi nhận 1 task là phải hiểu rõ yêu cầu được giao. Tuỳ theo mục đích mỗi công việc mà sẽ có các bước thực hiện khác nhau. Thông thường em sẽ mở file design để nhìn tổng quan về app trước. Sau đó sẽ đi vào đọc spec để hiểu rõ chi tiết từng module, chức năng. Sẽ liệt kê ra list các chức năng chính, focus vào những cái nào, các công nghệ nào mình đã làm, đã biết, những cái nào chưa làm. Sau đó sẽ đi tìm hiểu từng và xử lý từng phần nhỏ. Cuối cùng là liên kết tất cả các module đó lại.

Trên đây là list các câu hỏi và câu trả lời mình đã trả lời. Có thể có nhiều chỗ chưa đúng do là kiếm thức cũng như quan điểm cá nhân của mình. Mong anh em chỉ giáo :))

Comments

Popular posts from this blog

Alamofire vs URLSession

Alamofire vs URLSession: a comparison for networking in Swift Alamofire and URLSession both help you to make network requests in Swift. The URLSession API is part of the foundation framework, whereas Alamofire needs to be added as an external dependency. Many  developers  doubt  whether it’s needed to include an extra dependency on something basic like networking in Swift. In the end, it’s perfectly doable to implement a networking layer with the great URLSession API’s which are available nowadays. This blog post is here to compare both frameworks and to find out when to add Alamofire as an external dependency. Build better iOS apps faster Looking for a great mobile CI/CD solution that has tons of iOS-specific tools, smooth code signing, and even real device testing? Learn more about Bitrise’s iOS specific solutions! This shows the real power of Alamofire as the framework makes a lot of things easier. What is Alamofire? Where URLSession...

Swift Tool Belt, Part 1: Adding a Border, Corner Radius, and Shadow to a UIView with Interface Builder

During my iOS work, I’ve assembled a set of code that I bring with me on every iOS project. I’m not talking about large frameworks or CocoaPods here. These are smaller Swift extensions or control overrides that are applicable to many projects. I think of them as my tool belt. In this post, I’ll show you an extension that will add a border, a corner radius, and a shadow to any UIView, UIButton, or UILabel and allow you to preview what it will look like in Interface Builder. Back in 2014, I wrote a blog post on Expanding User-Defined Runtime Attributes in Xcode where I added a border, corner radius, and shadow to a UIView using Interface Builder’s user-defined runtime attributes. This solution had no type checking—you had to type the property you wanted to modify by hand and often had to look up what it was called. You also had to run your project in order to see the effect of the runtime attribute. Starting with Xcode 6 , there is a new mech...

Frame vs Bounds in iOS

This article is a repost of an answer I wrote on Stack Overflow . Short description frame = a view’s location and size using the parent view’s coordinate system ( important for placing the view in the parent) bounds = a view’s location and size using its own coordinate system (important for placing the view’s content or subviews within itself) Details To help me remember frame , I think of a picture frame on a wall . The picture frame is like the border of a view. I can hang the picture anywhere I want on the wall. In the same way, I can put a view anywhere I want inside a parent view (also called a superview). The parent view is like the wall. The origin of the coordinate system in iOS is the top left. We can put our view at the origin of the superview by setting the view frame’s x-y coordinates to (0, 0), which is like hanging our picture in the very top left corner of the wall. To move it right, increase x, to move it down increase y. To help me remember bound...