#254 - Làm thế nào để trở thành Senior Software Engineer?
Những thông tin công nghệ mới nhất trong tuần qua
📻News
(by lpv)
Tình hình layoff mới nhất tại Meta và một số công ty khác
Meta đã thông báo cho nhân viên trong một bảng tin nội bộ rằng việc cắt giảm sẽ bắt đầu vào sáng thứ Tư, có thể ảnh hưởng đến khoảng 4.000 nhân viên, qua đó tổng số nhân sự bị cắt giảm của Meta kể từ tháng 11 có thể tăng lên tới 21.000.
The state of startup funding
Tác giả đã thu thập dữ liệu từ nhiều nguồn khác nhau để biết được xu hướng tài trợ cho các công ty khởi nghiệp đang diễn ra như thế nào. Cho đến nay, nó đi xuống. Điều này có ý nghĩa gì đối với công nghệ?
Angel and seed rounds have hit a 2.5-year low in the US. Source: PitchBook-NVCA Venture Monitor Q1 2023
GitHub Accelerator: our first cohort and what’s next
Gặp gỡ các dự án tạo nên nhóm GitHub Accelerator đầu tiên và tìm hiểu về cách GitHub đang giúp biến tầm nhìn của họ thành hiện thực.
📰Những bài viết hay
Load Balancing
(by nhij)
Thuật ngữ load balancing không còn xa lạ với các kỹ sư phần mềm, khi bạn triển khai ứng dụng trên nhiều hơn một server và cần phân phối các request tới các server đó. Trong bài viết này, tác giả giới thiệu về các thuật toán để phân phối request từ mức cơ bản đến nâng cao một cách dễ hiểu cùng các hình biểu diễn trực quan, mời bạn đọc tham khảo thêm tại bài viết gốc tại đây.
Real-time Messaging at Slack
(by nhij)
Mỗi ngày, Slack phải xử lý hàng triệu tin nhắn gửi qua hàng triệu channel ở thời gian thực (channel trong Slack giống như group chat ở các ứng dụng khác). Để xử lý lưu lượng lớn như vậy một cách hiệu quả, họ đã xây dựng nhiều service khác nhau trong hệ thống messaging. Trong bài viết này, tác giả giới thiệu một số service chính:
Channel Servers (CS) lưu trữ tin nhắn của các channel. Mỗi channel có một ID được hash và map tới một CS duy nhất. Slack sử dụng consistent hashing để gán channel vào các CS, nhờ đó mà việc thêm/bớt server trong hệ thống có thể thực hiện dễ dàng và tối ưu việc phải resharding.
Gateway Servers (GS) đặt giữa Slack client (web/desktop/mobile client) và Channel Servers. Các server này là stateful server, lưu giữ thông tin người dùng đang theo dõi các channel nào. Người dùng sẽ kết nối với GS để đăng ký nhận tin nhắn từ các channel, vì lý do này mà các servers được deploy trên nhiều vùng khác nhau, từ đó người dùng có thể kết nối với gateway gần nhất với họ.
Presence Servers (PS) lưu trữ trạng thái online của người dùng. Slack client có thể gửi query tới PS thông qua GS. Bằng cách này, client có thể lấy được thông tin trạng thái của người dùng và cập nhật trên giao diện.
Trong bài viết, tác giả giới thiệu cách các service kể trên hoạt động cùng nhau trong một số trường hợp như khi một slack client kết nối vào server, hay khi một người dùng gửi một tin nhắn trong một channel. Để hiểu rõ và chi tiết hơn, mời bạn đọc tham khảo bài viết gốc tại đây.
Junior to Senior: An action plan for engineering career success
(by nhij)
Để trở thành Senior Software Engineer sẽ có rất nhiều kỹ năng mà bạn cần trau dồi, bao gồm kỹ năng cứng và kỹ năng mềm. Trong bài viết này, tác giả chia sẻ một số lời khuyên cho các bạn Software Engineer trẻ về cách học tập và trau dồi năng lực trên hành trình phát triển chuyên môn, gồm một số ý chính như:
Các năng lực kỹ thuật quan trọng mà cấp trên thường ghi nhận khi xét duyệt thăng chức.
Các kỹ năng giao tiếp cần có của một senior developer.
Tư duy phát triển phần mềm nhằm giải quyết được các yêu cầu của business đặt ra.
👨💻Góc lập trình
(by ndaadn and phucnh)
Đề ra tuần này: Lexicographical Numbers
Cho một số nguyên n
, trả về tất cả các số trong phạm vi [1, n]
được sắp xếp theo thứ tự từ điển.
Bạn hãy cố gắng giải quyết bài toán với độ phức tạp O(n) về thời gian và sử dụng O(1) bộ nhớ dùng thêm.
Lời giải tuần trước: Course Schedule
Đề bài cho một danh sách các khóa học và danh sách các mối quan hệ giữa chúng. Nếu xem mỗi khóa học là một đỉnh của đồ thị và mối quan hệ giữa các khóa học là các cạnh của đồ thị, ta có thể đưa bài toán trở thành bài toán xác định xem đồ thị có chu trình hay không.
Một cách để giải quyết bài toán này là sử dụng thuật toán DFS (duyệt đồ thị theo chiều sâu). Trong quá trình duyệt, nếu chúng ta tìm thấy một đỉnh đã được duyệt trước đó và chưa được kết thúc, thì có nghĩa là chúng ta đã tìm thấy một chu trình.
Dưới đây là cài đặt tham khảo bằng ngôn ngữ Java cho giải thuật.
public boolean canFinish(int numCourses, int[][] prerequisites) {
List<Integer>[] g = new List[numCourses];
for (int i = 0; i < numCourses; i++) {
g[i] = new ArrayList<>();
}
for (int[] v : prerequisites) {
g[v[0]].add(v[1]);
}
// Mảng visited dùng để đánh dấu dường đi ở mỗi vòng lặp
boolean[] visited = new boolean[numCourses];
// Mảng checked dùng để đánh dấu một đỉnh đã được duyệt qua ở các vòng lặp trước
boolean[] checked = new boolean[numCourses];
for (int i = 0; i < numCourses; i++) {
if (dfs(g, visited, checked, i)) {
return false;
}
}
return true;
}
// Hàm DFS trả về true nếu đồ thị có chu trình
private boolean dfs(List<Integer>[] g, boolean[] visited, boolean[] checked, int v) {
if (checked[v]) {
return false;
}
if (visited[v]) {
return true;
}
if (g[v].size() == 0) {
return false;
}
visited[v] = true;
for (int v1 : g[v]) {
if (dfs(g, visited, checked, v1)) {
return true;
}
}
visited[v] = false;
checked[v] = true;
return false;
}
📆History
(by lpv)
Có bao giờ bạn tự hỏi, thứ đầu tiên được giao dịch trực tuyến là gì không?
Vào năm 1972, rất lâu trước eBay hay Amazon, các sinh viên từ Đại học Stanford ở California và MIT ở Massachusetts đã thực hiện giao dịch trực tuyến đầu tiên. Sử dụng tài khoản Arpanet tại phòng thí nghiệm trí tuệ nhân tạo của họ, các sinh viên Stanford đã bán cho đối tác của họ một lượng *** ** nhỏ. Các bạn có thể đọc bài viết để biết thứ đã được bán là gì nhé ;)
🛠️Code & Tools
Tổng hợp một số playground trên web cho một số ngôn ngữ và công cụ, link.
Quotes
To keep on going, you have to keep up the rhythm.
Haruki Murakami
bài viết thú vị quá :>