#263 - Building and operating a pretty big storage system called S3
📰Những bài viết hay
Should I change job?
(by nhij)
“Ở bất cứ công việc nào, bạn nên hoặc có thể học hỏi được điều gì đó hoặc kiếm được tiền. Bất cứ điều nào cũng ổn. Tốt nhất là có cả hai. Nhưng nếu không có bất cứ điều nào, hãy nghỉ việc.”
Bài viết này xây dựng dựa trên ý tưởng của câu nói trên và giải thích mối liên hệ giữa học hỏi và kiếm tiền. Học hỏi sẽ giúp bạn gia tăng khả năng kiếm tiền trong tương lai bằng cách mở cánh cửa đưa bạn tới một vị trí cao hơn và cơ hội tốt hơn. Trong khi đó, kiếm được nhiều tiền hơn có thể giúp bạn đảm bảo được nguồn tài chính bền vững từ sớm, cho phép bạn có thể mạo hiểm chịu rủi ro tài chính để đổi lại cơ hội học hỏi, như chấp nhận giảm lương để làm ở một vị trí cao hơn tại một startup. Tác giả không thể giúp bạn trả lời câu hỏi trên tựa đề, mà chỉ có bạn có thể trả lời câu hỏi đó cho bản thân. Bạn đọc có thể đọc tại bài viết gốc để hiểu sâu hơn góc nhìn của tác giả về vấn đề này.
Building and operating a pretty big storage system called S3
(by nhij)
Bài viết đăng lại những chia sẻ của Andy Warfield, VP của Amazon S3, nhìn lại sự phức tạp và quy mô hoạt động lớn của hệ thống phần mềm lưu trữ của Amazon (Amazon’s Storage Software System). Andy bàn về sự quan trọng của việc nhận biết và giảm thiểu các vấn đề về quy mô tổ chức, tương đồng với việc tối ưu hóa hệ thống. Ông cũng bàn về cách tiếp cận của quản lý để thúc đẩy sự tự chủ của nhóm trong việc giải quyết vấn đề thay vì chỉ thực thi các giải pháp có sẵn, điều này đã đem lại những kết quả kỹ thuật hiệu quả hơn. Bạn đọc có thể đọc tại bài viết gốc để hiểu sâu hơn về những chia sẻ của Andy Warfield về những câu chuyện xung quanh S3.
Incident at DataDog: Infrastructure connectivity issue affecting multiple regions
(by n^4)
Vào ngày 8/3/2023, DataDog - một cloud service dùng để monitor và theo dõi độ ổn định của các hệ thống, gặp sự cố ở diện rộng khiến chất lượng dịch vụ ảnh hưởng nghiêm trọng trong khoảng thời gian từ 06:03 UTC đến 06:25 UTC 10/3/2023 mới chính thức hồi phục. Là một trong các nhà cung cấp dịch vụ monitoring lớn với hàng chục nghìn server (x0.000 servers) vận hành đồng thời, team DataDog đã có nhiều cơ chế để đảm bảo hệ thống vận hành thông suốt thông qua nhiều cơ chế như blue/green deployment, roll-over deployment cho tuần tự từng node, cluster, region, … nhưng vẫn đề vẫn phát sinh. Vậy nguyên nhân do đâu? Làm thế nào để ngăn chặn vấn đề tương tự trong tương lai?
Bạn có thể đọc bài viết để hiểu rõ thêm chi tiết về sự cố này cũng như cách team DataDog phân tích và giải quyết sự cố nhé.
💭Góc bạn đọc - Một tuần làm việc của EM (p3)
Thứ tư - ngày không họp hành
Qua hai ngày đầu tuần thì hẳn các bạn sẽ đặt dấu hỏi, ủa, vậy EM thấy họp suốt ngày vậy thì còn làm gì khác không? Thật ra thì cũng có đấy. Ngoài các khoảng nghỉ giữa các cuộc họp thì EM sẽ có những tasks của riêng mình, và những tasks này thường sẽ tận dụng các khoảng thời gian rảnh giữa các meeting, hoặc là tận dụng no-meeting day để hoàn thành.
(1) Làm các tasks liên quan đến engineering. Cụ thể là viết thinking document hoặc design document để nêu hoặc phân tích một vấn đề nào đó. Các vấn đề phân tích mà vai trò EM phụ trách thường sẽ mang tính tổng quan hoặc chiến lược hơn so với các bài toán vận hành hàng ngày. Ví dụ như một vài vấn đề mình sẽ phải viết gần đây:
Chia sẻ quan điểm về vai trò của low-code platform trong tổ chức? Có nên dùng hay không? Nếu dùng thì nên dùng như thế nào?
Bài toán workflow automation là bài toán của ai (trong tổ chức lớn hơn), nên được giao cho ai?
Đề xuất cho một platform khác có liên quan đề platform của mình
(2) Thực hiện vai trò giám sát và coaching. Một trong những trách nhiệm lớn nhất của EM là phải giám sát và chịu trách nhiệm cho sự phát triển của team mình. Để thực hiện vai trò này thì bản thân cần liên tục theo dõi các kênh thông tin của team mình trên Slack để xem các thành viên đang trao đổi về vấn đề gì, có thể nhảy vào cùng trao đổi và tìm cách đưa cuộc thảo luận theo đúng hướng (nếu bản thân thấy chưa đúng hướng).
Ngoài ra cũng sẽ dùng các nội dung trao đổi này để mang ra thảo luận với từng cá nhân trong quá trình 1:1 để góp ý và chia sẻ quan điểm của mình. Sẽ có những tình huống bản thân thấy một thành viên A nào đó phản hồi chưa hợp lý, hoặc chưa trọn vẹn, ví dụ như bạn ấy đang giải thích về một vấn đề cho một người dùng non-tech nhưng lại dùng quá nhiều thuật ngữ kỹ thuật. Trong những tình huống như vậy thì mình sẽ cần ghi nhận và thảo luận với bạn ấy trong những buổi gặp mặt để bạn lưu ý hơn.
Bên cạnh đó, EM cũng sẽ cần phải giúp các thành viên phát triển thông qua việc thảo luận về career path, cũng như xác định độ ưu tiên cho các thành viên và cân bằng giữa nhu cầu phát triển bản thân và nhu cầu của công ty. Bên công ty mình thì trong thời gian gần đây có triển khai một hoạt động gọi là Plan & Priority, trong đó mỗi thành viên sẽ cần tự đặt ra các mục tiêu phát triển bản thân cũng như các ưu tiên trong sự nghiệp hiện tại. EM sẽ dựa vào nhu cầu của từng thành viên để từ đó có sự phân công các tasks phù hợp.
Ví dụ như nếu một bạn trong 6 tháng tới muốn đầu tư nhiều quanh hệ thống Data, vậy thì EM cần tìm cách để đưa bạn vào nhóm làm task liên quan đến Data nhiều hơn. Hoặc một bạn quan tâm đến DevOps thì EM cần tìm cách phân các tasks liên quan đến DevOps nhiều hơn cho bạn, …
(3) Thực hiện vai trò lên kế hoạch. Lập và thực thi kế hoạch là một trong những vai trò quan trọng mà EM cần phải đảm đương, đặc biệt là việc lên kế hoạch dài hạn với chu kỳ 3-6 tháng trở lên. Trong một tổ chức lớn như nơi bản thân đang làm việc, việc có những chiến lược và kế hoạch dài hạn 2-3 năm là cần thiết vì nhiều lý do. Nhiệm vụ của EM lúc này là phải hiểu được platform hoặc team mình đang phụ trách đang đứng ở đâu trong bức tranh toàn cảnh của công ty, phòng ban của mình để tự đó đưa ra được các kế hoạch phù hợp.
Trong vai trò này, bản thân sẽ cần phải tham gia chuẩn bị những thứ như
Budget planning. Dự toán xem hạ tầng của team đang quản lý cần kinh phí bao nhiêu trong 6 tháng - 1 năm tới.
OKR planning. Mỗi 6 tháng một lần, sẽ phải thống nhất OKR của team để review với các manager cùng các stakeholders liên quan.
Vision and Strategy docs. 1 năm một lần sẽ cần phải review lại về chiến lược dài hơi của team, platform để coi team đang ở đâu và cần phát triển theo hướng nào.
Execution plan. Tham gia vào soạn thảo các kế hoạch thực thi ở phía engineering từ một kế hoạch lớn ảnh hưởng đến nhiều bộ phận khác nhau.
(4) Các task khác lặt vặt không tên. Tùy vào quy mô và quy trình của tổ chức mà số lượng task lặt vặt có thể nhiều hoặc ít, nhưng sẽ có kha khá các tasks có thể kể tên như: review và approve request xin quyền từ team, support một bạn user của platform, xin budget engagement, …
(còn tiếp)
👨💻Góc lập trình
(by ndaadn and phucnh)
Đề ra tuần này: Minimum Number of People to Teach
Trên một mạng xã hội có m người dùng, hai người dùng có thể giao tiếp với nhau nếu họ biết một ngôn ngữ chung.
Cho trước một số nguyên n, một mảng languages, và một mảng friendships, cụ thể là:
Có n ngôn ngữ đánh số từ 1 đến n.
languages[i] là tập các ngôn ngữ mà người dùng thứ i biết.
friendships[i] = [u_i, v_i] biểu diễn một mối quan hệ bạn bè giữa người dùng u_i và v_i.
Bạn có thể chọn một ngôn ngữ và dạy nó cho một số người để từ đó tất cả mọi người có thể liên lạc với nhau. Trả về số người dùng ít nhất mà bạn phải dạy.
Lưu ý friendships không mang tính bắc cầu, tức là x là bạn của y, y là bạn của z không có nghĩa là x là bạn của z.
Ví dụ:
Input: n = 2, languages = [[1],[2],[1,2]], friendships = [[1,2],[1,3],[2,3]]
Output: 1
Giải thích: Bạn có thể chọn dạy người dùng 1 ngôn ngữ số 2, hoặc người dùng 2 ngôn ngữ số 1.
Lời giải tuần trước: Queue Reconstruction by Height
Đề bài
Cho một mảng people biểu diễn một hàng người, với people[i] = [hi, ki], trong đó người ở vị trí thứ i có chiều cao hi, và có chính xác ki người đứng phía trước với chiều cao bằng hoặc cao hơn hi.
Ví dụ: people[1] = [5, 2] nghĩa là người ở vị trí số 1 có chiều cao là 5, và có 2 người đứng phía trước.
Hiện nay các phần tử trong mảng people đang bị xáo trộn, bạn đọc hãy sắp xếp lại mảng people sao cho giá trị của các phần tử là đúng với yêu cầu trên.
Ví dụ:
Input: people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]
Output: [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]
Giải thích:
Người ở vị trí số 0 có chiều cao 5, và có 0 người đứng trước có chiều cao >= 5.
Người ở vị trí số 1 có chiều cao 7, và có 0 người đứng trước có chiều cao >= 7.
Người ở vị trí số 2 có chiều cao 5, và có 2 người đứng trước có chiều cao >= 5.
Người ở vị trí số 3 có chiều cao 6, và có 1 người đứng trước có chiều cao >= 6.
Người ở vị trí số 4 có chiều cao 4, và có 4 người đứng trước có chiều cao >= 4.
Người ở vị trí số 5 có chiều cao 7, và có 1 người đứng trước có chiều cao >= 7.
Lời giải
Đầu tiên ta xem xét cách sắp xếp cho trường hợp từng nhóm người có chiều cao bằng nhau. Dễ thấy rằng phải sắp xếp hai người có cùng chiều cao theo thứ tự giá trị k tăng dần.
Với ví dụ đề bài đã cho, ta có các nhóm: [5,0], [5,2]; [7,0], [7,1]; [4,4]; [6,1];
Tiếp theo cần tìm cách để gộp các nhóm trên lại với nhau thỏa mãn đề bài.
Ví dụ, với nhóm người cao nhất [7,0], [7,1], nhận thấy ta có thể chèn bất kì người nào vào vị trí giữa hai người này mà vẫn thỏa mãn đề bài. Tức là những người cao hơn sau khi đã được sắp xếp vào đúng vị trí thì không cần quan tâm đến họ nữa.
Từ đó ý tưởng giải quyết bài toán này là
+ Chọn từng người để sắp xếp, theo thứ tự chiều cao giảm dần, với hai người có cùng chiều cao thì ta chọn theo thứ tự tăng dần của k.
+ Đặt người đó vào vị trí có giá trị đúng bằng giá trị k của họ.
Với ví dụ đề bài cho:
Sắp xếp danh sách các cặp (h_i, k_i) theo thứ tự giảm dần của h và tăng dần của k.
Ta có [[7,0], [7,1], [6,1], [5,0], [5,2], [4,4]]
Duyệt qua mảng đã sắp xếp, lần lượt chèn từng người vào mảng mới (cũng là mảng kết quả) tại vị trí bằng giá trị k của người đó.
[7,0] -> Chèn vào vị trí 0 trong danh sách kết quả: [[7,0]]
[7,1] -> Chèn vào vị trí 1 trong danh sách kết quả: [[7,0], [7,1]]
[6,1] -> Chèn vào vị trí 1 trong danh sách kết quả: [[7,0], [6,1], [7,1]]
[5,0] -> Chèn vào vị trí 0 trong danh sách kết quả: [[5,0], [7,0], [6,1], [7,1]]
[5,2] -> Chèn vào vị trí 2 trong danh sách kết quả: [[5,0], [7,0], [5,2], [6,1], [7,1]]
[4,4] -> Chèn vào vị trí 4 trong danh sách kết quả: [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]
class Solution {
public int[][] reconstructQueue(int[][] people) {
Arrays.sort(people, (o1, o2) -> o1[0] == o2[0] ? o1[1] - o2[1] : o2[0] - o1[0]);
List<int[]> reconstructedQueue = new ArrayList<>();
for(int[] p : people){
reconstructedQueue.add(p[1], p);
}
return reconstructedQueue.toArray(new int[people.length][2]);
}
}
Thuật toán sắp xếp có độ phức tạp O(NlogN), tuy nhiên vòng lặp for để chèn với hàm add có tổng độ phức tạp O(N^2) nên độ phức tạp thời gian của giải thuật là O(N^2), với N là độ dài mảng people đã cho trước.
Quotes
“The only thing that stands between you and your dream is the will to try and the belief that it is actually possible.”