Câu 1: Những vấn đề ảnh hưởng đến tốc độ chương trình
1. Cache
- Bộ nhớ máy tính lưu ở 3 nơi: ổ cứng (SSD), RAM và CPU --> cache lưu ở CPU
- Cache lưu ở đâu: Client(image, css, js) --> Proxy(file tĩnh..) --> Server Cache --> Database Cache
- Cache ở CPU có 3 cấp độ: L1 (chính) , L2 (thứ cấp), L3 (dự phòng cho L1, L2)
- Khi một chương trình khởi động trên máy tính của bạn, dữ liệu sẽ truyền từ RAM vào bộ đệm L3, rồi L2 và đến L1 sẽ rót trực tiếp dữ liệu cho các nhân CPU xử lý. Trong khi chương trình đang chạy, CPU tìm kiếm thông tin cần chạy, bắt đầu từ bộ đệm L1 và làm việc ngược từ đó.
2: Bound:
* Khi một thành phần hoạt động không theo kịp thành phần khác, khiến thành phần khác phải rảnh rỗi vì không có dữ liệu làm việc, thành phần chậm chạp kia trở thành một bottle-neck, kéo lùi hiệu năng của toàn bộ hệ thống -> gọi là bound.
- CPU Bound: Giới hạn bởi tốc độ xử lý của CPU
- Memory Bound: Giới hạn bởi dung lượng khả dụng và tốc độ truy cập của bộ nhớ
- Cache Bound: Giới hạn bởi số lượng ô nhớ và tốc độ của các thanh cache khả dụng
- I/O Bound: Tốc độ thực hiện tiến trình bị giới hạn bởi tốc độ của các tác vụ IO
Do tốc độ I/O thường rất chậm so với các thành phần còn lại, bottle-neck thường xuyên xảy ra ở đây
Câu 2. Kiến trúc NodeJS
- NodeJs được viết bằng Javascript và C++, 2 Dependencie lớn nhất là V8 và LibUV
- V8 bao gồm: call stack(LIFO: last in first out) và memory heap.
- LIBUV viết bằng C++, xử lý các tác vụ I/O không đồng bộ,
- LIBUV bao gồm: event-queue, event-loop(cho các tác vụ đơn giản) và thread pool(các tác vụ nặng)
- Khi có nhiều request được gửi từ nhiều client trong cùng một thời điểm, các request này sẽ được đưa vào event queue hoạt động theo cơ chế FIFO - First In First Out.
- Request được lấy ra ở event queue sẽ được đưa đến call stack để xử lý. Ở đây, trên server sẽ thực thi các hàm để có kết quả trả về cho request đó.
- Khi trong call stack thực thi một hàm của một request, hàm này cần phải query dữ liệu trong DB. Vì query vào DB là hoạt động I/O được quy định trong Node APIs. Do vậy nó không thể thực thi trên call stack được.
- Để kiểm tra hàm trong call stack có được Node APIs đảm nhiệm không, nó sẽ có một adapter chuyên check việc hàm đó có trong Node APIs hay không.
- Nếu hàm không thực thi một tác vụ liên quan đến I/O thì adapter sẽ trả về false. Ví dụ, request yêu cầu lấy thời gian của server, khi đó chỉ cần return new Date() rồi response về cho client. Như vậy hàm mà có return new Date() không liên quan đến Node APIs nên nó sẽ được xử lý ngay trong call stack với thời gian rất nhanh và trả về cho client luôn.
- Nếu nó thực thi một tác vụ liên quan đến I/O thì adapter sẽ trả về true. Ví dụ như việc query vào DB, sẽ cần một thời gian nhất định. Khi đó Node APIs biết mình cần phải xử lý cái hàm đó. Nó sẽ lấy ra khỏi call stack để cho call stack thực thi các hàm khác. Đồng thời phân cho 1 thread có trong thread pool để xử lý tác vụ I/O trong hàm vừa lấy ra.
- Thread này sẽ được xử lý trong handle thread, lấy dữ liệu trong DB, sau khi xong sẽ được đẩy xuống callback queue chờ ngày được lên lại call stack
- Thread pool cung cấp 4 thread(có thể config lên 128 thread) hoàn toàn tách biệt với signle thread trong event loop.
Khác
theo style phỏng vấn của mình thì tùy vào CV của bạn và yêu cầu công việc trong JD. Loanh quanh mấy cái đó + 1 số kiến thức phổ quát must have chứ không theo style đánh đố của nhiều bên. Vị trí nodejs thì chắc tuyển backend nên sẽ hỏi những thứ liên quan backend gồm thiết kế API, ngôn ngữ, database, deployment
- Nhiều chỗ sẽ bắt đầu hỏi từ REST, OOP, functional programing cho tới SOLID rồi mấy cái của lập trình nói chung. Mình thì ko hay hỏi mấy cái này lắm 😊)))
- Kiến thức phổ thông thì 1 số kiến thức liên quan tới node như bạn hiểu thế nào về promise, async await, event loop, single thread, engine v8,... hoặc kiến thức chung như http request, session, cookie, authen,... 1 trong những thứ mình rất thích hỏi và cũng thấy nhiều chỗ hỏi chính là việc bạn có hiểu sâu về cách website/http request hoạt động không, từ đó có hiểu quá trình authen/author như thế nào không hay chỉ biết dùng lib,...
- Database thì tùy xem bạn có kiến thức về db sâu tới đâu sẽ hỏi tới đó. Càng biết sâu thì người ta càng hỏi sâu thôi không có giới hạn gì cả. Từ cách thiết kế, modeling, index, query,... Chí ít thì cũng phải biết về sql, nosql, dùng được orm hoặc query builder, tránh được sql injection,...
- Deployment/tooling thì có thể sẽ hỏi bạn thường làm việc trong môi trường gì, deploy thế nào, có biết docker/k8s gì không (đây chỉ là điểm cộng thôi ko bắt buộc)
- Phần kiến thức này nói chung cũng chỉ xoay quanh những thứ mà JD yêu cầu thôi. Ví dụ công ty mình đang làm với node + mongo + aws thì sẽ hỏi xem bạn biết những thứ này tới đâu.
- Cái mà mình hay tập trung nghe là trong các dự án cũ bạn đã làm gì, học được gì, gặp khó khăn gì và vượt qua thế nào, có tâm đắc kiến thức gì không. Đây là đánh giá về quá khứ của bạn. Ngoài ra sẽ hỏi thêm cách bạn học tập và thu nạp kiến thức bên ngoài hoặc khi rảnh rỗi, đây là đánh giá về tương lai học hỏi của bạn.
1 năm kinh nghiệm thì mình nghĩ là sẽ không bị hỏi quá khó đâu vì quá trình học tập phía trước vẫn còn rất dài. Chỉ cần thể hiện được mình HIỂU những thứ mình đã TỪNG LÀM và khả năng học hỏi là được.
Với title Junior, có nghĩa là bạn có thể tự mình xử lý được các task cơ bản như dựng một API, viết middware, validate dữ liệu, gọi api của bên thứ 3, support integrate với FE, query database… Từ yêu cầu đấy có thể list ra một vài skill cơ bản như
- hiểu các layer của app nodejs, http, api…
- có kinh nghiệm với ít nhất 1 framwork nodejs nào đó, nắm được cách giải quyết vấn đề của framework đó
- năm rõ nodejs và một số lib phổ biến
- hiểu được cơ chế hoạt động của client - server: Restfull, stateless - statefull, websocket, jwt, graphql…
- thao tác thành thạo với db: repository, orm, sql query, mongo…
- hiểu cơ bản về workflow: nói chuyện với FE, gitflow, postman, swagget, chome debugger
- hiểu được cách chạy của node, ưu nhược điểm và một số ứng dụng cũng như design parterns với node…
Em mới đi phỏng vấn nodejs ở vccorp về đây.
Họ hỏi điểm mạnh điểm yếu của nodejs, kỹ thuật cache nhiều tầng ( nếu miss thì làm thế nào), hỏi chi tiết các thuật toán mã hóa, cách phân chia các replication trong mongodb sao cho miss ít nhất, chút kiến thức về hệ điều hành ... vv còn nhiều lắm, mà em không nhớ, ấn tượng mỗi là họ hỏi chi tiết mấy cái thuật toán mã hóa ( cái này lúc học trên trường có môn atbm thì em nhớ chứ giờ em quên cmnr, SHA, md5, tri-des .vv ).