Rants về Hack Codegen của Facebook
code
39
White

cpplover viết ngày 21/08/2015

https://code.facebook.com/posts/1624644147776541/writing-code-that-writes-code-with-hack-codegen/

Facebook vừa có bài viết giới thiệu về Hack Codegen, một thư viện tự động tạo ra mã Hack. Tác giả bài viết đưa ra "motivations" cho việc viết thư viện là code của ngôn ngữ Hack hiện tại không hỗ trợ "Kiểu dữ liệu" và IDE không hỗ trợ autocomplete. Hàm setter của object (dùng để set các fields trong objects) thì không được khai báo rõ ràng mà được "hack" thông qua việc ghi đè hàm __call của ngôn ngữ.

Tác giả đưa ra lý do không rõ ràng là mã rất boiler-plate, không rõ ràng. Vì vậy tác giả muốn có 1 thư viện sinh mã (codegen) để đọc khai báo schema và tự động sinh mã, và đấy là lý do ra đời của thư viện. Trước đó, nhóm phát triển có vẻ cũng có giải pháp concat string nhưng theo họ giải pháp không có scale.

Vấn đề

Đọc xong tớ thấy có rất nhiều vấn đề xung quanh cách tiếp cận này:

1. Ví dụ không thuyết phục.

Mã mô tả không hoàn toàn là 1 tầng abstract hơn mã được sinh ra. Ví dụ trong bài viết:

hack_builder()
  ->startForeachLoop('$users', '$id', '$user')
  ->startIfBlock('$id === $search')
  ->addReturn('$id')
  ->endIfBlock()
  ->endForeachLoop();

sẽ sinh ra mã:

foreach ($users as $id => $user) {
  if ($id === $search) {
    return $id;
  }
}

Mã mô tả dài hơn cả mã được sinh ra. Nếu ai hỏi mã nào trực quan hơn thì mình cá là mã sau trực quan và dễ hiểu hơn.

2. Tầng abstract không rõ ràng

Nếu như ở thrift hay protobuf, bạn mô tả giao thức và framework sẽ hỗ trợ sinh ra mã liên lạc RPC hỗ trợ giao thức của bạn. Tầng abstract rất rõ ràng và lập trình viên tiết kiệm rất nhiều thời gian viết mã. Ở trường hợp của bài viết của Facebook, tớ không có nhìn thấy tầng abstract này ở đâu cả. Do vậy, việc sinh code này chỉ như là viết mã 1 kiểu và mã thực sự ra 1 kiểu khác. Điều này có hại nhiều hơn là lợi vì đơn giản việc abstract này không khái quát vấn đề cần giải quyết để giải quyết 1 lớp bài toán, mà chỉ đơn giản thêm 1 tầng "gián tiếp chuyển đổi". Tầng gián tiếp này làm ảnh hưởng đến việc maintain code sau này. Thử tưởng tượng bạn phải đào sâu vào mã của thư viện codegen chỉ để hiểu là biến này được set như nào trong khi việc đào sâu đấy không giúp giải quyết vấn đề là biến đấy dùng ở đâu, làm gì.

Một nhược điểm nữa của việc thêm "tầng gián tiếp" này là khi codegen không được maintain cẩn thận, sẽ có sự không khớp giữa framework và codegen. Sự vênh này sẽ ảnh hưởng đến việc phát triển trong tương lai.

Hiểu ra

Có 1 ý nữa là việc lập trình viên phải nghĩ ra 1 thư viện kiểu này để tránh viết Hack trực tiếp cho thấy bản thân hack không phải là ngôn ngữ tốt. Vì Hack không là ngôn ngữ tốt nên người viết cảm thấy thiếu trực quan khi viết bằng ngôn ngữ này, dẫn tới họ phải phát minh ra 1 thư viện gián tiếp sinh ra code.

Túm lại là không có nên dùng Hack. Rant thêm tí là ngoài Facebook ra chắc chả ai dùng Hack cả, dùng rằng Facebook opensource nó. Không phải cái gì được làm bởi công ty to cũng tốt :D.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

cpplover

12 bài viết.
46 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
17 5
C++ 11 có chức năng lambda. Vì là ngôn ngữ "static type" nên C++ lambda function nhìn khó hơn lambda trong các ngôn ngữ dynamic type khác nhưng pyt...
cpplover viết gần 3 năm trước
17 5
White
16 2
Giới thiệu Cách duy nhất để học C++ trong 21 ngày là dành hơn 14611 ngày để nghiên cứu và thay thế chính bạn ở ngày số 21 (Ảnh) C++ là một ngôn ...
cpplover viết hơn 3 năm trước
16 2
White
16 0
Lang thang hacker news tìm được một phần nhỏ (Link) của một bác ở Anh tổng hợp về stack mà google đã tạo và sử dụng. Chi tiết về các stack được tổ...
cpplover viết 3 năm trước
16 0
Bài viết liên quan
White
53 23
Luận về comment code (Phong cách kiếm hiệp) Comment code luôn là vấn đề gây tranh cãi sứt đầu mẻ trán trong giới võ lâm. Xưa kia, thuở còn mài đít...
Huy Hoàng Phạm viết gần 3 năm trước
53 23
White
9 1
Đón đọc những bài viết đặc sắc ở blog https://giaosucan.blogspot.com (Ảnh) Dựa trên một câu chuyện có thật, tuy nhiên tên nhân vật đã được thay đ...
Giaosucan viết hơn 1 năm trước
9 1
White
11 0
Bản quyền thuộc Fsoft Potato Tech Mag Đón đọc những bài viết đặc sắc ở blog https://giaosucan.blogspot.com Khi tham gia một dự án, chắc chắn ai c...
Giaosucan viết hơn 1 năm trước
11 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
12 bài viết.
46 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!