#255 - Attention is all you need
Công việc Software Engineer sẽ thay đổi thế nào sau 3-4 năm nữa?
Trong vài năm gần đây, sự xuất hiện của những phần mềm như StableDiffusion, Dall-E, Copilot và đặc biệt là ChatGPT đã mang đến nhiều đột biến cho giới công nghệ - một lĩnh vực vốn dĩ đã rất biến động. Hàng trăm, hàng nghìn phần mềm AI được tạo ra chỉ trong một thời gian ngắn khiến ai cũng thấy háo hức về việc tăng năng suất lao động—nhưng đi kèm với nó là nỗi lo ngại rằng nhiều loại công việc sẽ bị AI thay thế.
Trong newsletter kỳ này, ban biên tập Grokking muốn đặt ra một 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?”
Hãy reply email này (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
Fixing duplicate stories in Medium’s For You feed
(by quangle)
Vài tháng trước, đội ngũ kỹ sư tại Medium nhận được nhiều báo cáo (3-4k lượt/ngày) liên quan đến vấn đề trùng lặp bài viết ở chuyên mục For You feed trên các thiết bị mobile apps bao gồm iOS và Android.
Giải thích ngắn gọn thì để truy xuất các bài viết ở For You feed, hệ thống sẽ chuyển tiếp các requests của users từ Medium’s GraphQL API đến rex service (recommendation - service được xây dựng bằng Go, đáp ứng việc tính toán, truy vấn các bài viết) và trả kết quả về cho users. Trong đó rex service có áp dụng một số kỹ thuật như phân trang, caching ở redis theo key `$userId:HOMEPAGE` với TTL 30 phút.
Qua quá trình rà soát, các kỹ sư phát hiện hai vấn đề dẫn đến lỗi trên và khắc phục như sau:
1- Khắc phục trình trạng context bị hủy trước khi dữ liệu được lưu vào cache
Khi user request feed, rex service tạo một bản feed cho người dùng (gọi là bản A) và lưu vào cache thông qua cơ chế background goroutine.. Nhưng việc sử dụng chung request context đã phát sinh vấn đề, ngay khi request được hoàn thành thì request context cũng sẽ bị hủy.
Nếu tiến trình hủy context xảy ra trước tiến trình lưu vào cache sẽ khiến cho việc lưu bản feed vào cache không được hoàn thành, bản A sẽ không được lưu vào cache. Sau đó, nếu người dùng tiếp tục request feed, do bản feed trước đó không được lưu vào cache, nên rex service tiến hành tạo một bản feed mới (gọi là bản B) và gửi về cho người dùng. Do bản A và bản B có khả năng có bài trùng nhau nên người dùng sẽ thấy trùng lặp bài viết trên feed của họ.
2 - Đảm bảo dữ liệu cache được tái sử dụng
Nếu trước đây, khi user request một page từ For You feed, hệ thống sẽ nhận hai tham số: limit (bắt buộc) và cursor (không bắt buộc) và luôn trả về kết quả của current feed instance thì giờ đây, nhóm cải tiến bằng cách sử dụng thêm một tầng caching qua feedId với key `$userId:HOMEPAGE:$feedId` và điều chỉnh TTL cho các cached key này.
Điều chỉnh này giúp đảm bảo cặp giá trị feed InstanceID và feed value phải đi cùng nhau, nếu không thỏa phải generate feed instance mới để caching cùng feed value, hướng tiếp cận giúp giải quyết bài toán duplicate feed.
Để tìm hiểu chi tiết hơn về từng cách giải quyết bài toán cũng như những trade-off mà team Medium gặp phải, mời bạn đọc cùng tham khảo bài viết.
The Ultimate Deliberate Practice Guide
(by chatGPT + n^4)
Thực hành có chủ đích (deliberate practice) là cách để cải thiện mình ở mọi mặt trong cuộc sống bằng cách liên tục rèn luyện và nhận phản hồi. Các chuyên gia trong mọi lĩnh vực đều biết rõ điều này và sử dụng nó để xây dựng kiến thức chuyên môn của mình.
Bài báo này giải thích rằng thực hành có chủ đích đòi hỏi một mục tiêu cụ thể và phản hồi liên tục để bạn biết mình đang làm gì và đang tiến bộ như thế nào. Không chỉ làm việc một cách siêng năng mà còn cần tập trung vào những điểm yếu cần cải thiện. Đó là cách làm thông minh và hiệu quả hơn. Mời các bạn cùng tham khảo bài báo để hiểu thêm về Thực hành có chủ đích cũng như ứng dụng nó để học hỏi và rèn luyện kỹ năng hiệu quả hơn.
Attention is all you need
(by chatGPT + n^4)
Trong thế giới hiện đại của chúng ta, công nghệ trí tuệ nhân tạo nói chung và lĩnh vực ngôn ngữ tự nhiên (NLP) nói riêng đang phát triển với tốc độ nhanh chóng và nhiều cách tiếp cận mới liên tục được phát minh ra. Trong bài viết này, chúng ta sẽ tìm hiểu thêm một kiến trúc mới Transformer đang được ứng dụng ngày càng rộng rãi trong 4-5 năm trở lại đây. Kiến trúc này được giới thiệu trong bài báo "Attention Is All You Need" của nhóm tác giả tại Google Brain được xuất bản trên trang arXiv vào tháng 6 năm 2017.
Trong bài báo, các tác giả giới thiệu một mô hình NLP tái cấu trúc mới gọi là Transformer. Kiến trúc Transformer đã đạt được kết quả tốt hơn so với các phương pháp trước đây trong nhiều tác vụ NLP quan trọng như dịch máy và sinh văn bản.
Kiến trúc Transformer được thiết kế dựa trên cơ chế attention, một kỹ thuật trong NLP cho phép mô hình tập trung vào các phần quan trọng của câu để phân tích. Điểm đáng chú ý của Transformer là nó không sử dụng các lớp RNN (mạng nơ-ron tái cấu trúc) như các mô hình NLP trước đây, mà thay vào đó sử dụng các lớp attention để tập trung vào các phần quan trọng của dữ liệu đầu vào. Kiến trúc Transformer bao gồm hai phần chính: encoder và decoder. Mỗi phần sử dụng nhiều lớp attention và các lớp kết nối đầy đủ để học cách mã hóa và giải mã thông tin trong các tác vụ NLP.
Các mô hình dựa trên kiến trúc Transformer đã đạt được nhiều kết quả ấn tượng trong nhiều lĩnh vực. Một số mô hình nổi bật bao gồm: BERT của Google, GPT-4 của OpenAI, RoBERTa của Facebook.
Mời các bạn cùng đọc lại bài báo “Attention Is All You Need” để hiểu thêm về kiến trúc này.
P/S: Chữ GPT trong phần mềm ChatGPT phổ biến hiện này là viết tắt của Generative Pre-training Transformer.
👨💻Góc lập trình
(by ndaadn and phucnh)
Đề ra tuần này: Find the Duplicate Number
Cho một mảng số nguyên "nums" có độ dài n + 1. Mảng "nums" chứa số nguyên dương trong khoảng [1, n]. Mảng "nums" chỉ tồn tại duy nhất 1 cặp số trùng nhau. Hãy tìm số bị trùng mà không thay đổi giá trị của mảng và giải thuật có độ phức tạp không gian là O(1).
Lời giải tuần trước: Lexicographical Numbers
Cách tiếp cận đầu tiên ta có thể dễ dàng nhận thấy là thực hiện chuyển đổi số sang chuỗi, sắp xếp danh sách chuỗi theo thứ tự từ điển, cuối cùng, ta chuyển đổi chuỗi về số nguyên. Độ phức tạp thời gian của giải thuật sẽ là O(n*logn), trong đó n là độ dài của mảng đầu vào, độ phức tạp không gian của giải thuật là O(n).
Dựa trên hướng tiếp cận trên, ta cũng có thể sử dụng cấu trúc dữ liệu Trie để tìm kiếm mảng đã được sắp xếp theo thứ tự từ điển bằng phương pháp duyệt cây theo chiều sâu (DFS).
Nếu bạn đọc vẽ cấu trúc dữ liệu Trie và thực hiện tìm kiếm theo chiều sâu, bạn đọc có thể nhận thấy: ở mỗi nút "current", ta có tìm nút tiếp theo "next" như sau:
Giả sử với n = 999
với current = 11, next = current * 10 = 110
với current = 110, next = current + 1 = 111
Ta tiếp tục bước 2 cho tới khi current = 119, lúc này next = current / 10 + 1 = 12.
Lưu ý, nếu số current có kết thúc với nhiều hơn một số 9, ví dụ 199, số tiếp theo là 2.
Bằng cách này, ta không thực sự cần phải sử dụng cấu trúc dữ liệu Trie mà có thể thực hiện như sau:
class Solution {
public List<Integer> lexicalOrder(int n) {
List<Integer> ans = new ArrayList<>(n);
int curr = 1;
for (int i = 1; i <= n; i++) {
ans.add(curr);
if (curr * 10 <= n) {
curr *= 10;
} else if (curr % 10 != 9 && curr + 1 <= n) {
curr++;
} else {
while ((curr / 10) % 10 == 9) {
curr /= 10;
}
curr = curr / 10 + 1;
}
}
return ans;
}
}
Giải thuật trên có độ phức tạp thời gian là O(n), độ phức tạp không gian là O(1).
📅Góc sự kiện
Ngày 15/4 vừa qua, tại văn phòng KMS đã diễn ra sự kiện Grokking Techtalk #47 với sự chia sẻ của hai diễn giả là Trung Nguyễn (Principal Software Engineer @ KMS Healthcare) và Thái Tăng (Lead Machine Learning Engineer @ MoMo).
Các bạn có thể xem lại zoom record nội dung thuyết trình ở đây.
💭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. Các bạn nào có kinh nghiệm hoặc thủ thuật gì hay cũng cứ chia sẻ đến với nhóm biên tập bạn nhé.
Chào các anh chị, em đã đọc newsletter của Grokking đã lâu và cũng đã tiếp cận nhiều bài viết hay. Tuy nhiên cho tới giờ em thấy Grokking chỉ chia sẻ nội dung về kỹ thuật chủ yếu mà ít thấy chia sẻ các bài viết hoặc nội dung liên quan đến Softskill. Em nghĩ Grokking cũng nên tổng hợp thêm các nội dung này vì Softskill emthấy cũng quan trọng không kém kỹ năng chuyên môn.
Gần đây em có được biết đó là kênh youtube của thầy Dũng, hiệu phó trường đại học Bách Khoa khá hay nói về tư duy phản biện và các vấn đề xã hội. Grokking có thể tham khảo: kênh youtube.
Quotes
If we want to improve a skill, we need to know what exactly has to change and what might get us there. Otherwise, we plateau.
FS Blog
Đó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.