#235 - Một cái nhìn sâu về Idempotence
Trong số này, chúng ta cùng tìm hiểu về:
Concurrency chưa chắc luôn luôn là nhanh nhất ở Go
So sánh giữa REST vs GraphQL vs gRPC
Một cái nhìn sâu về Idempotence
Lời giải bài Last Stone Weight II
Ngoài ra các bạn vẫn có thể tiếp tục đặt mua ấn phẩm Dijkstra tập 2 tại đây.
News
Hacktoberfest 2022 đã bắt đầu, và các bạn có 1 tháng để contribute vào các opensource repo tại Github và Gitlab nhé.
Những bài viết hay
Concurrency isn’t Always Faster in Go
(by lpv)
Một quan niệm sai lầm của nhiều người là tin rằng một giải pháp đồng thời (concurrent) luôn nhanh hơn một giải pháp tuần tự (sequential). Hiệu suất tổng thể của một chương trình phụ thuộc vào nhiều yếu tố, chẳng hạn như hiệu quả của code structure (concurrency), những phần nào có thể được xử lý song song và mức độ tranh chấp giữa các đơn vị tính toán. Trong bài viết này nhắc lại một số kiến thức cơ bản về đồng thời trong Go. Đi kèm với đó là những ví dụ cụ thể cho thấy một giải pháp concurrency không nhất thiết phải nhanh hơn.
API Showdown: REST vs. GraphQL vs. gRPC – Which Should You Use?
(by steven.do)
Bài talk với sự tham dự trao đổi của 3 khách mời là hiện là Software Engineer tại Netflix, MuleSoft và Twitter. Mở đầu bài talk sẽ giới thiệu sơ lược về lịch sử phát triển của 3 công cụ (RESTful, GraphQL, và gRPC). Các khách mời đã nêu một vài nhận định cá nhân so sánh ưu nhược điểm khi áp dụng các công cụ này vào giải quyết các vấn đề thực tế và các giới hạn của từng công cụ
gRPC sẽ phù hợp khi xây dựng một hệ thống phân tán yêu cầu độ trễ thấp, và có khả năng mở rộng cao.
GraphQL sẽ phù hợp với trường hợp một client application cần dùng nhiều data sources hoặc nhiều client application cùng dùng chung 1 data source.
RESTful khá phù hợp cho đa số trường hợp phổ biến tuy nhiên vẫn có những trường hợp cần cân nhắc khi áp dụng RESTful đó là khi xây dựng các ứng dụng phân tích & xử lý dữ liệu lớn cần tối ưu tốc độ xử lý và giao thức trao đổi dữ liệu.
Cuối bài talk, các khách mời đã đưa ra gợi ý hướng tiếp cận ban đầu khi áp dụng các công cụ này vào giải quyết vấn đề thực tế trong việc phát triển software và cả 3 vị khách mời đều cùng chung nhận định rằng không thể có một giải pháp nào tốt nhất có thể phù hợp với mọi vấn đề, tùy thuộc vào bài toán cụ thể mỗi giải pháp sẽ có các điểm phù hợp hoặc không phù hợp và cần mức độ trade-off trong khả năng chấp nhận được.
(by nhij)
Idempotence là một chủ đề vừa dễ lại vừa khó trong khoa học máy tính. Theo Wikipedia: “Idempotence là thuộc tính của các phép toán nhất định trong toán học và khoa học máy tính, theo đó chúng có thể được áp dụng nhiều lần mà không làm thay đổi kết quả ngoài ứng dụng ban đầu.”. Vậy “không làm thay đổi kết quả” ở đây có ý nghĩa như thế nào? Người viết đã chỉ ra hai cách chúng ta có thể hiểu nó:
Không quan trọng bạn gửi cùng một request bao nhiêu lần, bạn sẽ luôn nhận được cùng một kết quả.
Không quan trọng bạn gửi cùng một request bao nhiên lần, bạn sẽ không thay đổi trạng thái của hệ thống.
Hai nhận định này thoạt nhìn khá tương đồng và nhìn chung có vẻ đúng trên bề nổi. Tuy nhiên, nhận định thứ hai phù hợp hơn với ý nghĩa của Idempotence trong công nghệ phần mềm. Để chứng minh điều này, tác giả đã phân tích dựa trên các use case cụ thể và dễ hiểu trong bài viết gốc. Để kết thúc bài viết, tác giả đã chỉ ra tuy idempotence đem lại nhiều lợi ích về an toàn và chính xác trong những request dạng credit card transaction nhưng để xây dựng API đảm bảo idempotent phức tạp hơn nhiều so với các API thông thường và không phải API nào cũng cần phải đảm bảo điều này, ví dụ chúng ta không cần idempotency trong hệ thống logging (nếu hệ thống khởi động lại, việc có các log message lặp lại là điều chấp nhận được).
Góc Lập Trình
Đề ra tuần này: Add Bold Tag in String
(by phucnh)
Cho một string s
và một array chứa strings words
. Ta cần phải viết thêm bold tag <b> và </b> cho các substrings words
chứa trong s
. Nếu 2 substrings chồng lên nhau thì ta cần phải bọc chúng với chỉ một cặp bold tag. Nếu 2 substrings được bọc bởi các bold tags liền kề với nhau, ta cần phải kết hợp chúng lại.
Hãy trả lại s
với bold tags. Ví dụ:
Input: s = “abcxyz123”, words = [“abc”, “123”]
Output: “<b>abc</b>xyz<b>123</b>”
Lời giải đề bài tuần trước: Last Stone Weight II
(by phucnh)
Cách tiếp cận đầu tiên ta có thể nghĩ tới là lần lượt đập hai hòn đá bất kì, tuy nhiên giải thuật này sẽ có độ phức tạp về thời gian là 2^n
, với n
là số lượng hòn đá.
Để giải bài này một cách tối ưu hơn, ta cần có quan sát như sau: Giả sử ta có 4 hòn đá a, b, c, d, với khối lượng lần lượt là wa >= wb >= wc >= wd
, ta lần lượt đập 2 hòn đá vào nhau như đề bài, ta có thể thu được những kết quả sau:
(a - b) - (c - d)
(a - c) - (b - d)
(a - d) - (b - c)
Ta triển khai các kết quả lần lượt như sau:
(a - b) - (c - d) = a - b - c + d = (a + d) - (b + c)
(a - c) - (b - d) = a - c - b + d = (a + d) - (b + c)
(a - d) - (b - c) = a - d - b + c = (a + c) - (b + d)
Ta thấy rằng, ta luôn luôn có thể chia những hòn đá thành 2 nhóm, và kết quả cuối cùng là hiệu của tổng khối lượng đá ở mỗi nhóm. Và đề bài yêu cầu tìm hiệu nhỏ nhất.
Đây là một ứng dụng của bài toán tìm tập con trong mảng số nguyên dương có tổng cho trước, được giải bằng cách áp dụng lời giải của 0/1 Knapsack.
Thuật toán được thực hiện như sau: https://pastebin.com/v3nLYqmH
Giải thuật có độ phức tạp là O(n*total)
, với n
là số lượng hòn đá, total
là tổng khối lượng của tất cả các hòn đá.
Code & Tools
Media-To-Ascii - Một tool viết bằng Rust để chuyển đổi media files sang ASCII output.
pandas-gbg - Một python package chứa interface tới Google BigQuery API từ pandas
Feedback
Bạn đánh giá nội dung số newsletter này thế nào?
(1 = Rất tệ / 5 = Rất tốt)
(Việc đánh giá của các bạn là rất quan trọng, sẽ giúp chúng tôi liên tục cải thiện nội dung newsletter tốt hơn)
Grokking mang lại cho các bạn những kiến thức mới mẻ và hữu ích thông qua:
Tech Talk: Là một hoạt động thường xuyên của Grokking từ những ngày đầu thành lập. Tại đây các diễn giả chia sẻ kiến thức xoay quanh Computer Science và Software Engineer. Các buổi Tech Talk đều được record và upload lên kênh youtube của Grokking.
Grokking Knowledge Graph: Tập hợp những nguồn kiến thức phong phú với hơn 1000 bài viết chọn lọc, các đầu sách, khóa học, v.v… Các bài viết đều được gán nhãn để giúp bạn đọc dễ dàng tìm kiếm.
Webinar: Là chương trình kết nối các kỹ sư Việt Nam và các kỹ sư đang làm việc tại các công ty công nghệ hàng đầu thế giới.
Dijkstra: Một ấn phẩm được xuất bản bởi các thành viên của Grokking. Với những bài viết đào sâu vào kỹ thuật và kiến thức khoa học máy tính.
Kipalog: Nền tảng chia sẻ kiến thức dành cho các lập trình viên.
Newsletter: Những bài viết hay về công nghệ sẽ được gửi tới bạn hàng tuần qua email.
Chúc các bạn sẽ tìm được nhiều điều mới mẻ khi đến với Grokking và xin hẹn gặp lại các bạn vào tuần sau.
Quotes
Every programmer is an author.
- Sercan Leylek