#256 - Hãy đặt câu hỏi đúng
Nếu bạn đặt ra đúng câu hỏi, việc giải quyết vấn đề sẽ dễ dàng hơn nhiều
Ở kỳ trước, nhóm biên tập có đặt ra câu hỏi “Bạn nghĩ công việc của Software Engineer sẽ thay đổi như thế nào sau 3-4 năm nữa?“ và nhận được một số ý trả lời từ các bạn đọc. Các bạn có thể tham khảo ở mục Góc bạn đọc bên dưới. Xin cảm ơn các bạn đã nhiệt tình đóng góp ý tưởng.
Trong newsletter kỳ này, nhóm biên tập xin đặt ra câu hỏi khác: “Theo bạn trong 3-4 năm nữa, một buổi phỏng vấn Software Engineer sẽ diễn ra như thế nào? Nó sẽ khác gì với cách chúng ta đang phỏng vấn hiện tại?”
Hãy reply email này trước khi số newsletter tiếp theo được gửi đi (hoặc gửi câu trả lời đến newsletter@grokking.org) để chia sẻ ý kiến của mình nhé! Ban biên tập sẽ chọn ra những câu trả lời hay nhất để trao tặng phần quà là một quyển Dijkstra tập 2 (bản in). Mong nhận được nhiều góp ý từ các bạn.
P/S: Các bạn nhớ gửi kèm theo thông tin liên hệ để Ban biên tập có thể tiện gửi quà nhé.
📰Những bài viết hay
Data versioning at scale
(by Bing and n^4)
Einat Orr, một trong những thành viên sáng lập của Treeverse, đã có một bài thuyết trình mang tên “Data Versioning at Scale: Chaos and Chaos Management” tại QCon New York.
Trong bài thuyết trình này, Einat thảo luận về cách dữ liệu thay đổi theo thời gian do các yếu tố khác nhau, chẳng hạn như lỗi, cập nhật, ước tính và nguồn mới. Sự thay đổi này sẽ ảnh hưởng đến chất lượng, độ tin cậy và tính nhất quán của các quyết định dựa trên dữ liệu. Einat cũng giải thích các thách thức trong việc quản lý phiên bản dữ liệu (version control), chẳng hạn như sự hợp tác, kế thừa dữ liệu (lineage), khả năng tái sản xuất (reproducibility), tính nhất quán giữa các bảng (cross-collection consistency), và sự cần thiết phải có hạ tầng có thể xử lý được sự phức tạp và hỗn loạn của dữ liệu.
Bên cạnh đó, Einat xem xét một số giải pháp hiện có cung cấp version control và làm nổi bật các ưu nhược điểm của mỗi phương pháp.
Git là giải pháp versioning phổ biến được sử dụng trong lĩnh vực phát triển phần mềm. Tuy nhiên, Git không được thiết kế để quản lý dữ liệu lớn và phân tán. Điều này có thể gây ra những vấn đề về hiệu suất và khả năng mở rộng khi sử dụng Git để quản lý dữ liệu lớn.
Một giải pháp khác là DVC (Data Version Control), một công cụ versioning mã nguồn mở được thiết kế đặc biệt cho việc quản lý dữ liệu lớn và phân tán. DVC cung cấp các tính năng như versioning, lineage tracking và data sharing. Tuy nhiên, DVC không hỗ trợ các tính năng như merge và conflict resolution.
Ngoài ra, LakeFS là một giải pháp versioning dữ liệu mới nhất được thiết kế để quản lý các data lake trên các hệ thống đám mây. LakeFS cung cấp các tính năng như versioning, lineage tracking và data sharing. Nó cũng hỗ trợ các tính năng như merge và conflict resolution.
Understand Linux namespace by creating a docker like engine
(by n^4)
Trong khảo sát StackOverflow năm 2022, Docker đã trở thành một công cụ quan trọng cho các nhà phát triển phần mềm và đã trở nên rất phổ biến. Đã có nhiều bài viết giới thiệu về cơ chế hoạt động của Docker rồi, nhưng trong bài viết này, một bạn kỹ sư ở Zalopay chia sẻ cách để hiểu cơ chế hoạt động thông qua quá trình tạo ra một hệ thống quản lý container mới. Hy vọng bài viết sẽ hữu ích cho các bạn mới bắt đầu làm quen với docker nói riêng và linux nói chung.
Technical leadership and gluework
(by Bing + n^4)
Bạn đã làm senior trong 4-5 năm, sắp tới bạn được thăng chức trở thành trưởng nhóm. Tuy nhiên, bạn nhận ra công việc trưởng nhóm không giống như bạn nghĩ vì hóa ra bạn phải làm những việc không tên tưởng chừng chẳng liên quan đến coding như tạo tài liệu quy trình, viết báo cáo, giới thiệu cho các thành viên mới trong nhóm…
Tuy nhiên, hóa ra những công việc ít liên quan này lại góp phần quan trọng trong việc thành bại của một dự án phần mềm, và cũng là đòi hỏi không thể thiếu của một người leader/manager. Thay vì né tránh, chúng ta sẽ cần phải học cách làm những công việc này một cách hiệu quả.
Bài thuyết trình này sẽ giúp bạn hiểu rõ hơn về những công việc mang bản chất giúp “kết dính” (glue work) và cách phân bổ công việc này một cách hợp lý để đảm bảo sự thành công của nhóm. Diễn giả là Tanya Reilly, một kỹ sư phần mềm chính tại Squarespace và từng làm việc tại Google trong 12 năm.
👨💻Góc lập trình
(by ndaadn and phucnh)
Đề ra tuần này: Jump Game
Cho trước một mảng số nguyên nums
. Bắt đầu từ vị trí đầu tiên, xác định xem có thể di chuyển đến vị trí cuối cùng hay không, biết tại mỗi vị trí i
, khoảng cách xa nhất có thể di chuyển là nums[i]
Ví dụ:
Input: nums = [2,3,1,1,4]
Output: true
Giải thích: Nhảy từ vị trí đầu tiên đến vị trí thứ hai (giá trị 3), sau đó nhảy từ vị trí thứ hai đến vị trí cuối cùng (giá trị 4).
Lời giải tuần trước: Find the duplicate number
Một cách tiếp cận đơn giản để giải quyết bài toán này là sử dụng một bảng đánh dấu để lưu lại việc xuất hiện của các số. Với ngôn ngữ Java thì ta có thể sử dụng Map hoặc Set. Tuy nhiên, giải pháp này yêu cầu sử dụng thêm O(n) không gian và không đáp ứng được yêu cầu của bài toán.
Thay vào đó, chúng ta có thể sử dụng thuật toán Floyd (hay còn gọi là thuật toán "thỏ và rùa") để giải quyết bài toán này.
Thuật toán Floyd là một thuật toán được sử dụng để tìm kiếm chu kỳ trong một danh sách liên kết, và nó cũng có thể được sử dụng để giải quyết bài toán này.
Các bước giải quyết bài toán "find-the-duplicate-number" bằng thuật toán Floyd như sau:
Khởi tạo hai biến "tortoise" và "hare" ban đầu trỏ đến phần tử đầu tiên trong mảng.
Với mỗi bước, "tortoise" đi một bước và "hare" đi hai bước.
Nếu "tortoise" và "hare" gặp nhau, chúng ta đã tìm thấy một chu kỳ trong mảng
Tiếp theo, ta sẽ khởi tạo một con trỏ "ptr" trỏ đến phần tử đầu tiên trong mảng và di chuyển con trỏ "tortoise" và "ptr" cùng một bước mỗi lần cho đến khi chúng gặp nhau.
Phần tử mà chúng ta gặp lại trong quá trình di chuyển "tortoise" và "ptr" chính là phần tử trùng lặp.
Độ phức tạp của thuật toán này là O(n), trong đó n là kích thước của mảng. Dưới đây là cài đặt tham khảo của bài toán này sử dụng thuật toán Floyd bằng ngôn ngữ Java.
class Solution {
public int findDuplicate(int[] nums) {
int tortoise = nums[0];
int hare = nums[0];
while (true) {
tortoise = nums[tortoise];
hare = nums[nums[hare]];
if (tortoise == hare) {
break;
}
}
int ptr = nums[0];
while (tortoise != ptr) {
tortoise = nums[tortoise];
ptr = nums[ptr];
}
return ptr;
}
}
💭Góc bạn đọc
Góc bạn đọc kỳ này có một chia sẻ từ một bạn đọc gửi đến nhóm biên tập. Rất cảm ơn bạn Q.Hương đã đóng góp, mong nhận được nhiều sự đóng góp hơn từ phía bạn.
Bạn nghĩ công việc của Software Engineer sẽ thay đổi như thế nào sau 3-4 năm nữa?
Công việc của kỹ sư phần mềm sẽ tiếp tục thay đổi trong tương lai với sự phát triển của trí tuệ nhân tạo (AI) và các công nghệ liên quan. Một số thay đổi có thể bao gồm:
1/ Tăng cường sử dụng trí tuệ nhân tạo: Với sự ra đời của các công nghệ AI như chatbot, image recognition, và natural language processing, kỹ sư phần mềm sẽ cần phải trang bị kỹ năng và kiến thức mới để phát triển, triển khai và tối ưu hóa các ứng dụng sử dụng trí tuệ nhân tạo.
2/ Sự phát triển của các nền tảng phát triển low-code và no-code: Các công cụ này đang ngày càng trở nên phổ biến, giúp cho những người không có kinh nghiệm lập trình cũng có thể tạo ra các ứng dụng phần mềm. Điều này có thể ảnh hưởng đến việc cần thiết của kỹ sư phần mềm trong các công ty và tổ chức.
3/ Tăng cường quản lý dữ liệu: Sự phát triển của công nghệ đám mây và big data sẽ tạo ra nhiều cơ hội cho kỹ sư phần mềm phát triển các ứng dụng dựa trên dữ liệu. Tuy nhiên, đồng thời cũng đặt ra thách thức về quản lý, an toàn và bảo mật dữ liệu.
4/ Sự tăng cường về bảo mật và an ninh mạng: Khi các mối đe dọa mạng ngày càng phức tạp hơn, kỹ sư phần mềm sẽ phải trở thành chuyên gia về bảo mật và an ninh mạng. Các công nghệ bảo mật mới sẽ cần được phát triển và triển khai để bảo vệ các ứng dụng phần mềm.
Tổng thể, công việc của kỹ sư phần mềm sẽ tiếp tục thay đổi để đáp ứng với sự phát triển của công nghệ. Kỹ sư phần mềm cần phải tập trung vào các kỹ năng và kiến thức mới để trở thành người chủ chốt trong việc phát triển các ứng dụng phần mềm thông minh, an toàn và hiệu quả.-Q.H-
Bên cạnh những ý bạn Hương đã nêu ra, một bạn đọc tên L cũng có bổ sung thêm một số ý tưởng sau:
1/ Nâng cao khả năng đặt câu hỏi và mô tả yêu cầu. Tôi tin vào quan điểm được nhiều người đề cập đó là đặt ra đúng câu hỏi sẽ khó hơn là tìm kiếm câu trả lời. Việc phổ biến của các LLM cùng các ứng dụng generation sẽ khiến cho công việc của kỹ sư phần mềm tập trung vào khía cạnh problem solving và đặt ra vấn đề nhiều hơn. Tôi tin là khi bạn đặt ra đúng câu hỏi, các hệ thống AI và assistant của tương lai sẽ giải quyết vấn đề giúp bạn một cách dễ dàng.
2/ Kiến thức nền tảng chuyên sâu và khả năng ra quyết định. Việc các hệ thống AI thông minh hơn sẽ khiến cho việc xây dựng phần mềm mới và vận hành ít tốn nhân lực hơn. Tuy nhiên, dựa trên kinh nghiệm bản thân làm oncall cho các hệ thống thì tôi thấy con người vẫn nên là những lúc ra quyết định lúc khẩn cấp. Ví dụ như khi một hệ thống quan trọng trong công ty bị lỗi nghiêm trọng dẫn đến thất thoát doanh thu, AI sẽ giúp chúng ta có được thông tin nhanh và kịp thời nhất. Nhưng làm sao để xử lý vấn đề trước mắt vẫn là thứ cần con người ra quyết định. Và trong những lúc khẩn cấp như thế này, bạn cần phải có kiến thức nền tảng và lượng kinh nghiệm sâu để hiểu rõ bản chất sự cố và ra quyết định càng nhanh càng tốt chứ không thể ngồi hỏi AI tới lui được.
Rất cảm ơn hai bạn đã đóng góp ý tưởng. Các bạn đọc khác có ý tưởng bổ sung vẫn cứ tham gia đóng góp nhé.
💡Quotes
“A lot of times the question is harder than the answer. If you can properly phrase the question, then the answer is the easy part.”
💁🏻Đóng góp nội cho Grokking Newsletter
Bạn có thể gửi nội dung đóng góp đến nhóm biên tập newsletter thông qua email newsletter@grokking.org. Các nội dung các bạn có thể đóng góp:
Nếu bạn có một bài viết muốn chia sẻ, bạn có thể gửi link bài viết kèm một đoạn giới thiệu ngắn bằng tiếng Việt.
Nếu bạn có vài suy nghĩ muốn chia sẻ đến cộng đồng, bạn có thể gửi nội dung trực tiếp đến chuyên mục Góc dành cho bạn đọc.
Nếu bạn có câu hỏi và muốn các bạn đọc của Grokking cùng tham gia góp ý, bạn cũng có thể gửi đến Grokking nhé. Câu hỏi của bạn có thể được đăng dưới dạng ẩn danh.
Nếu công ty bạn có tổ chức sự kiện techtalk và muốn giới thiệu rộng rãi hơn đến cộng đồng, các bạn gửi link sự kiện cùng hình ảnh banner và nội dung chia sẻ. Nhóm sẽ giúp chia sẻ lên newsletter và fanpage nếu nội dung phù hợp.
Bài giải find duplicate không tối ưu. Đơn giản là tính tổng dãy số và trừ đi n(n-1)/2 là sẽ ra số bị duplicate, thuật toán O(n) bộ nhớ O(1)