#132 - Làm sao để tăng chất lượng code review?
Grokking Meetup là một hoạt động diễn ra thường xuyên với sự tham gia giữa các thành viên Grokking và các khách mời. Đây là một buổi seminar với các chủ đề hấp dẫn về kỹ thuật.
Đặc biệt, các bạn ở xa cũng có thể tham gia online mà không cần tới trực tiếp. Grokking vẫn thường xuyên mời các bạn bên ngoài đăng ký để tham gia nhưng với số lượng có hạn.
Để có thể đăng ký và nhận được invite tham gia trực tiếp và dễ dàng hơn, các bạn có thể tham gia vào group trên facebook: https://www.facebook.com/groups/300419931101401
Những bài viết hay
Làm sao để tăng chất lượng Code Review?
Code review đóng một vai trò quan trọng trong việc đảm bảo chất lượng cho quá trình phát triển sản phẩm. Trong đó, nhiệm vụ người thực hiện review cũng quan trọng không kém người yêu cầu.
Nếu không có một tư duy, thái độ và cách tiếp cận chính xác, người reviewer sẽ làm cho quá trình code review trở nên kém chất lượng, tốn thời gian, thậm chí gây ra những sự khó chịu cho các dev. Điều này rõ ràng sẽ ảnh hưởng đến chất lượng và deadline của sản phẩm.
Một quy trình Code Review tốt góp phần quan trọng trong việc xây dựng và nâng cao chất lượng Engineering của một team. Trong bài viết, tác giả có nhiều gợi ý chi tiết để chúng ta có thể thực hiện công việc code review hiệu quả hơn:
- Coi mỗi Pull Request là 1 blackbox để khám phá: cần hiểu tại sao PR được tạo ra, cần biết về cấu trúc và thiết kế của code.
- Hãy đọc ghi chú của mỗi commit. Tất nhiên các dev trong team phải có một thói quen commit với ghi chú rõ ràng.
- Hãy có 1 danh sách ưu tiên những việc cần làm khi review
- Review theo giai đoạn nếu cần thiết
- Hãy để lại những comment mang tính gợi ý thay vì phàn nàn, thuyết phục thay vì ra lệnh, tóm tắt thay vì tràn lan.
- Hãy có 1 buổi live review nếu cần thiết
Garbage collecting unhealthy JVMs, a proactive approach
Các team data của Netflix có rất nhiều ứng dụng chạy trên nền JVM, ví dụ như Cassandra hay ElasticSearch. Trong quá trình hoạt động, các databases này rất khó để tránh khỏi những trường hợp trở nên quá tải hoặc OOM, gây ra bởi lỗi hệ thống hay đơn giản là bởi các query lỗi. Khi bộ nhớ bị tiêu tốn quá nhiều, Garbage Collector (GC) sẽ được kích hoạt. Vậy làm thể nào để GC chạy hiệu quả nhất?
ầu tiên, Netflix sử dụng jvmkill. Jvmkill chạy trong JVM. Khi JVM chạy hết bộ nhớ hoặc không thể tạo thread mới, jvmkill sẽ can thiệp bằng cách kill toàn bộ process. Sau đó process sẽ được khởi động lại bởi systemd. Jvmkill được sử dụng kết hợp với flag XX:HeapDumpOnOutOfMemoryError để dump toàn bộ nhớ jvm heap trước khi process bị killed, giúp việc phân tích tình trạng quá tải của ứng dụng và debug lỗi dễ dàng hơn.
Tuy nhiên jvmkill vẫn có vấn đề hạn chế. Trong trường hợp ứng dụng chạy rất chậm, nhưng JVM chưa chạy hết 100% resource, jvmkill không thể phát hiện ra vấn đề này. Do vậy, Netflix đã giải quyết vấn đề này bằng cách thế kế giải phát riêng của họ với jvmquake. Cơ chế hoạt động của jvmquake rất đơn giản nhưng hiệu quả: với bất kì process nào, JVM sẽ dành 1 phần tỷ lệ thời gian để chạy chương trình chính mà không phải dừng lại cho quá trình Garbage Collecting, nếu tỷ lệ này dưới một mức giới hạn trong một khoảng thời gian xác định đủ lâu, thì JVM sẽ được coi là unhealthy và bị killed.
Với giải pháp này, Netflix cũng cải thiện cơ chế heap dump. Với jvmkill, cơ chế này được thực hiện bởi flag XX:HeapDumpOnOutOfMemoryError, tuy nhiên việc này lại dump bộ nhớ heap của JVM ra đĩa lưu trữ của máy và có thể gây nên tình trạng bộ nhớ đĩa bị đầy. Để giải quyết vấn đề này, Netflix sử dụng cơ chế cơ chế core dump của Linux kernel. Đây là cơ chế được sử dụng phổ biến trong các ngôn ngữ như node.js hay Python. Core dump sẽ giúp viết lữu trữ trong heap ra 1 pipe. Việc còn lại của Netflix là viết 1 script để kết nối đến pipe này, đọc toàn bộ thông tin và upload chúng lên S3. Việc phân tích và debug sau đó sẽ được thực hiện trên files lưu trữ ở S3.
Rebuilding messaging: How we bootstrapped our platform
Linkedin mới đây đã migrate backend của hệ thống messaging của họ. Trước đó backend theo kiểu monolith, không có tách biệt rõ ràng giữa business và data logic. Điều đó dẫn tới việc thay đổi business logic sẽ dẫn tới thay đổi cả data access. Ngoài ra những legacy code cũng làm cho service khó upgrade, thêm features hơn.
New-system không những migrate qua dùng 1 giải pháp storage khác, mà còn thay đổi khá nhiều về cấu trúc lưu trữ dữ liệu messages. Old-system chọn lưu dữ liệu ở dạng denormalized, còn new system thì normalize những dữ liệu này. Và tất nhiên ở scale level của linkedin, downtime là điều không thể chấp nhận được. Engineer team sẽ phải migrate hàng tỉ messages từ hệ thống cũ qua hệ thống mới, đồng thời đảm bảo không ảnh hưởng tới trải nghiệm của người dùng.
Giải pháp được chọn là dual-writing tới cả new-system và old-system. Toàn bộ quá trình migrate được chia làm 3 giai đoạn:
- Dual write: mỗi update vào old-system sẽ đc replicate in real-time vào new-system.
- ID generation and mapping: Bởi vì new-system sẽ normalize data, tức là ngược với old-system nên giai đoạn này sẽ đảm bảo sự đồng bộ về dữ liệu giữa 2 systems.
- Transform and bulk upload: ETL process, run một loạt các Map Reduce jobs để transform old schema thành schema ở new-system.
Effort bỏ ra để migrate toàn bộ dữ liệu là gần 6 tháng. Sự kĩ lưỡng trong việc lên kế hoạch chắc chắn là chìa khóa đảm bảo cho quá trình này thành công.
Sản phẩm của người Việt
ruby_jard: Just another ruby debugger. Provide a better experience while debugging Ruby
Bạn có bao giờ cảm giấy khó khăn khi debug Ruby? Bạn phải nhớ quá nhiều, gõ quá nhiều, mất nhiều công sức để navigate, nhưng đôi khi không biết mình đang ở đâu trong source code? Bạn quên mất method này được gọi từ đâu, hay chương trình "nhảy" đến nơi không muốn?
Grokking xin giới thiệu một debugger - Ruby Jard - để giải quyết các vấn đề này. Ruby Jard hiện đang ở bản Alpha cung cấp một số feature chính:
- Visualize được source code, variables, backtrace, và threads trên cùng một màn hình, ngay trên terminal.
- Kiểm soát program flow tốt hơn, cho phép đi lên xuống, và inspect variables ở từng frame trong stacktrace.
- Keybinding để kiểm soát việc debug.
- REPL Console, hỗ trợ syntax highlighting, pagers, và hàng loạt tính năng hữu dụng khác.
- Nhiều color scheme để bạn lựa chọn
- Jard được xây dựng trên Byebug và Pry, nên hỗ trợ tất cả những gì byebug làm được
Trong tương lai, Ruby Jard sẽ sớm hỗ trợ thêm các feature khác như hỗ trợ chuột, hệ thống inspect variable tốt hơn, hỗ trợ debug multi-thread và multi-process, nhiều tool mạnh để tăng tốc việc debug (như hex viewer, memory inspection), integrate với Vim/Emacs/VS Code, etc.
Hi vọng Ruby Jard sẽ hỗ trợ mọi người tốt hơn trọng công việc hàng ngày, và mong mọi người ủng hộ sản phẩm của các bạn dev Việt.
Code & Tools
Chúng ta đều biết tốc độ try suất của RAM nhanh hơn ổ cứng, nhưng con số thực tế là bao nhiêu? Upper/Lower limit, Latency là bao nhiêu?
Hãy cùng tác giả bắt đầu từ một vấn đề cụ thể, có những tìm hiểu, so sánh thú vị về memory bandwith. Để từ đó có thêm một cách tư duy khác về các vấn đề: Thinking about bytes-per-second or bytes-per-frame.
A short shell script that returns you your IPv4 address and its geolocation.
Tin tức khác
Lỗ hổng trên Zoom bị khai thác để phá mật khẩu cuộc họp trong vài phút
Ứng dụng họp trực tuyến Zoom vừa cập nhật bản vá một lỗ hổng an ninh mới có thể cho phép tin tặc phá mã passcode dùng để bảo mật các cuộc họp riêng tư.