#241 - Có nên thay thế C/C++ bằng những ngôn ngữ khác?
Chúng ta sẽ bắt đầu số newsletter tuần này bằng một vài tin tức không mấy tích cực.
Amazon một công ty tưởng chừng như đứng ngoài làn sóng freeze hiring/layoff khi vẫn có những đợt tuyển dụng ở khắp nơi (kể cả ở Việt Nam) cũng đang lên kế hoạch sa thải 10000 nhân viên. Đợt sa thải này chủ yếu nhắm vào các nhân viên cho bộ phận thiết bị, trợ lý ảo Alexa vốn đông nhân viên và có biên lợi nhuận thấp.
Bên cạnh đó với tình hình tài chính không mấy khả quan, Shopee cũng đang tiến hành bắt đầu vòng cắt giảm nhân sự thứ 3 trong năm.
Tại Việt Nam một số công ty lớn cũng đã có những động thái nhất định trong việc tinh giản bộ máy nhân sự sau nhiều năm mở rộng hoặc thua lỗ. Một số công ty có tài chính tốt cũng đã dè chừng hơn trong việc tuyển dụng và mở rộng nhân sự (mà chúng tôi không tiện nêu tên tại đây cho lắm).
Một tin vui liên quan tới Grokking là Ấn phẩm Dijkstra tập 2 đã bán được gần 1000 cuốn (thật mừng là không lỗ 😰).
Hiện trong kho chỉ còn vài cuốn nữa thôi nên các bạn có thể nhanh tay đặt hàng những cuốn cuối cùng tại đây nhé. Sau đợt này các bạn sẽ phải chờ tới tháng 2 năm sau nếu có nhu cầu muốn đặt hàng tập 2.
Ban biên soạn Grokking Dijkstra rất cảm ơn sự ủng hộ của các bạn độc giả. Hy vọng sang năm sẽ có thể đủ khả năng để tiếp tục phát hành tập 3.
News
(by lpv)
Amazon Is Said to Plan to Lay Off Approximately 10,000 Employees — www.nytimes.com
Amzon đang lên kế hoạch sa thải 10000 nhân viên.
Sea e-commerce arm Shopee cuts jobs in third round of layoffs this year, including in Singapore
Shopee tiếp tục vòng layoff thứ 3 trong năm.
NSA urges orgs to use memory-safe programming languages — www.theregister.com
NSA đưa ra lời khuyên nên chuyển từ C/C++ sang những ngôn ngữ an toàn hơn. Điều này cũng đã nhanh chóng mang tới khá nhiều tranh cãi. Các bạn có thể đọc chi tiết báo cáo của NSA tại đây.
Những bài viết hay
High Performance Networking in Chrome
Ra mắt lần đầu vào 2008, tới nay Chrome đã trở thành trình duyệt được sử dụng rộng rãi nhất trên mọi nền tảng. Trước Google Chrome, phần lớn các trình duyệt đều được phát triển theo dạng monolithic, single process application. Các page đều chia sẻ cùng một vùng nhớ, do đó một lỗi trên một trang sẽ có nguy cơ gây ảnh hưởng tới toàn bộ trình duyệt. Chrome phát triển với mô hình multi-process, qua đó mỗi tab sẽ chạy trên các process và vùng nhớ riêng biệt. Qua đó giúp Chrome mang lại hiệu suất đang kể so với các đối thủ, đặc biệt là trong thế giới multi-core. Các trình duyệt khác cũng lần lượt chuyển đổi sang kiến trúc tương tự.
Trong bài viết này chúng ta cùng tìm hiểu về những thiết kế bên trong Chrome giúp mang lại hiệu năng đáng kể, qua đó trở thành trình duyệt hàng đầu thế giới.
(by lpv)
Góc Lập Trình
Đề ra tuần này: Maximize the Confusion of an Exam
(by phucnh)
Cho trước một chuỗi ký tự “answerKey” chỉ gồm 2 ký tự “T” và “F”, và một số nguyên k.
Được phép thực hiện hoán đổi mỗi ký tự từ T thành F hoặc ngược lại nhiều nhất k lần, tìm chiều dài lớn nhất có thể của chuỗi con liên tiếp gồm toàn ký tự T hoặc F.
Ví dụ:
Input: answerKey = "TTFTTFTT", k = 1
Output: 5
Giải thích: có thể biến đổi chuỗi ban đầu thành “TTTTTFTT” hoặc “TTFTTTTT”.
Lời giải tuần trước: Repeated DNA Sequences
(by ndaadn)
Ta có thể giải quyết bài toán bằng cách sử dụng 2 bảng băm (tạm gọi là “seen” và “result”) và thực hiện duyệt chuỗi DNA theo chuỗi con 10 phần tử liên tục. Ứng với mỗi chuỗi con, ta kiểm tra xem chuỗi này đã xuất hiện trong “seen” hay chưa, nếu chưa thì ta lưu chuỗi vào “seen”, nếu đã xuất hiện thì ta thêm chuỗi vào bảng băm “result”. Kết quả cuối cùng chính là các chuỗi DNA được thêm vào result.
Với N là tổng chiều dài của chuỗi DNA ban đầu, độ phức tạp thuật toán của giải thuật trên là O(10*N).
Mặc dù ta có thể xem độ phức tạp của thuật toán là O(N), do chuỗi chỉ có 10 phần tử, nhưng việc sử dụng hàm substring ở mỗi vòng lặp thực ra khá tốn kém.
Một hướng tiếp cận khác để giải bài toán đó là giải thuật Rabin Karp (còn gọi là rolling hash).
Bạn đọc có thể tìm hiểu kỹ hơn về giải thuật thông qua trang wiki Rabin–Karp algorithm.
Đối với bài toán này, ta tính giá trị băm cho chuỗi 10 phần tử đầu tiên. Sau đó ở mỗi bước lặp, ta sẽ tính lại giá trị hàm băm của chuỗi mới bằng cách trừ đi giá trị băm của phần tử bị loại bỏ, và cộng thêm giá trị băm của phần tử mới thêm vào. Công thức cho hàm băm như sau:
hash = 4^k * v
Với k là vị trí của phần tử trong chuỗi 10 phần tử. v là giá trị được gán cho mỗi phần tử.
Cài đặt tham khảo: https://pastebin.com/mgGZPsym
Độ phức tạp thuật toán cho giải thuật trên là O(N).
Code & Tools
Xây dựng một Text Editor bằng C++ chỉ với hơn 1000 dòng code.
History
Có lẽ không có nhiều người có cơ hội sử dụng hệ điều hành MS-DOS. Nhưng tìm hiểu về những thiết kế bên trong hệ điều hành này cũng sẽ mang lại cho bạn những điều thú vị để khám phá.
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.
Xin hẹn gặp lại các bạn vào tuần sau.
Quotes
"Theory and practice sometimes clash. And when that happens, theory loses. Every single time." - Linus Torvalds