Quần Cam Blog

My engineering life

Đầu tiên tui xin cáo lỗi vì ba tuần vừa rồi không có bài mới nào cả. Lý do không viết bài là bởi vì tui đang tập trung viết XML parser.

Hôm nay tui muốn kế cho các bạn nghe một câu chuyện phiếm về đời engineering.

1. Một ý tưởng chưa thành hiện thực

a) Journals

Chừng 3 tuần trước, tui có ý tưởng viết journals (daily blog) linh tinh trên Medium. Sau đó đọc RSS feed và hiển thị lại trên blog hqc.io.

Từ đó tui tìm hiểu các Elixir library liên quan và chọn được feeder_ex. Lý do chọn nó khá là đơn giản: nó có nhiều star nhất 🙈. Tuy nhiên sau khi dùng feeder_ex được một thời gian thì thấy nó không phù hợp vì:

b) Việt

Do đó, tui tự viết lại Việt, RSS parser của riêng tui (chưa 100% production-ready).

Có một số yêu cầu tui tự đặt cho mình khi viết Việt:

  • Dùng SAX parser của erlsom.
  • Hiện thực theo spec.
  • Hỗ trợ các RSS feed không theo spec. Sự thật phũ phàng là chắc phải đến 50% các RSS feeds không tương thích với spec ở trên, nên dù muốn hay không vẫn phải hỗ trợ chúng nó.
  • Native Elixir library.

Và rồi thì tui cũng viết xong Việt.

c) FML

Tuy nhiên việc khiến nhiều người không thích SAX parser là bởi vì handle các node khó hơn (tui sẽ viết một bài về SAX parser sau). Tui cũng vậy, vì thế trong quá trình viết Việt, tui có abstract ra một cái module để giúp việc handle SAX events dễ dàng hơn.

Tên của em ấy là FML.

Giả sử bạn có một XML document như sau:

<?rss version="1.0" encoding="UTF-8" standalone="yes" ?>
<document>
  <accounts>
    <account>
      <name>Cam Huynh</name>
    </account>
    <account>
      <name>John Cena</name>
    </account>
    <account>
      <name>Cristiano Ronaldo</name>
    </account>
  </accounts>
  <shops>
    <shop>
      <name>Hello Kitty</name>
    </shop>
  </shops>
</document>

Với SAX events bình thường thì việc handle node <name> sẽ khá lẳng nhằng, bởi bạn không phân biệt được node đó là con của <account> hay của <shop>, vì SAX chỉ cho bạn node name và node attributes đang được duyệt.

FML sẽ giúp bạn handle việc đó dễ hơn. Khi bạn duyệt node <name>, FML sẽ cung cấp thêm parent stack bên cạnh node name và node attributes.

def on_start_element({'name', _, _}, [{'account', _, _} | _parents], state) do
  # Code eaten by the Internet
end

FML đánh đổi chút memory so với SAX event ban đâu, với max items trong stack = độ sâu nhất của một node con, nhưng bù lại, bạn có thể handle các node dễ hơn.

d) Saxy

Sau khi sử dụng erlsom một hồi tui lại phát hiện có vẻ như erlsom cũng fail một số XML rules được cung cấp bởi tổ chức W3.

Và … tui lại tiếp tục tự viết XML parser.

Tình hình là nó vẫn chưa viết xong (nhưng rất gần rồi), nhưng tui nghiệm ra được cả núi thứ mà trước giờ đọc Dragon book không tài nào hiểu nổi.

  • Lexer khác gì so với Parser.
  • LL khác gì LR.
  • Stream Tokenizer và kĩ thuật push back.
  • Vì sao bạn cần Finite State Automaton (FSA) khi tokenize.

2. Bài viết này giúp tui tăng lương thế nào?

Thật ra thì tăng bao nhiêu lương thì vợ bạn cũng giữ hết thôi, nhưng tui rút ra được mấy thứ hy vọng sẽ có ích cho đời engineering của bạn.

a) Làm là cách học tốt nhất

Trước có nghe một anh nói về điều này, lúc đó tui hơi ngờ vực chút.

Nhưng giờ thì tui nghĩ rằng đó là cách học và nhớ tốt nhất, vì lúc này kiến thức đã được liên kết với một cái gì đó có thực. Sau này khi nhắc đến kiến thức đó, bạn ngay lập tức nhớ nó được áp dụng như thế nào và giải quyết vấn đề gì.

Như trong bài viết đã nêu, tui bắt đầu hiểu các lý thuyết về parser và ứng dụng của chúng khi thực sự viết parser.

Nhờ vậy mà rất khó để bạn quên.

b) Học bằng phương thức bóc vỏ củ hành

Tui thấy nhiều bạn hay học bằng cách chọn lấy một môn Computer Science thật khó, và nhào vào học nó.

Cách học này khá ổn, nhưng nếu bạn thấy nó không hiệu quả, có thể thử học với phương pháp bóc củ hành.

Ví dụ bạn muốn tìm hiểu về Git Internals. Bạn có bóc từng lớp của củ hành này, từ ngoài vào trong, như sau:

  • bắt đầu bằng cách đọc chương Internals của Git book. Chương này giới thiệu những thứ hết sức về data structure và protocol của Git.
  • sau đó bạn có thể chơi với libgit2 một chút, để thực tập các lý thuyết vừa mới học.
  • tìm hiểu sâu hơn chút về diff algorithm của Git và cách ứng dụng nó vào commit, merge command thế nào.
  • bắt đầu implement lại Git của riêng bạn.
  • một cách tự nhiên, bạn sẽ vẽ ra được các bước tiếp theo.

Lợi thế của cách học này là bạn từng bước nắm chắc các lớp của củ hành, và ở từng bước, bạn biết mình học thứ đó để làm gì.

c) Đi chơi

Sau khi học quá nhiều thì việc đi chơi một chút sẽ giúp bạn thư giản đầu óc, giảm bớt căng thằng.

Vì vậy tui xin thông báo là tui lại đóng bàn phím một tháng để đi chơi. Hẹn gặp lại các bạn sau 1 tháng!


NGUY HIỂM! KHU VỰC NHIỀU GIÓ!
Khuyến cáo giữ chặt bàn phím và lướt thật nhanh khi đi qua khu vực này.
Chức năng này hỗ trợ markdown và các thứ liên quan.
ltpquang chém vào lúc

FML == F$ckMyLife ạ? :)))) Btw, link FML bị die rồi ạ :D

qcam chém vào lúc

@ltpquang

> FML == F$ckMyLife ạ?

Ờ, 🙊, cơ mà đó là tên ở nhà, tên giấy tờ là Functional XML nhóe.

Link vẫn hoạt động mà nhỉ? https://github.com/qcam/fml

Bài viết cùng chủ đề

[Web nhà nghèo] Tui đã viết tính năng “chém gió” như thế nào?

Trình bày cách tui xây dựng chức năng comment cho blog thay cho Disqus mà không tốn một đồng nào cả.

Trứng lòng đào và các vấn đề đồng hồ trong lập trình

Vì sao đồng hồ lại không đáng tin cậy? Dùng đồng hồ trong máy tính như thế nào thì hợp lý?

IO data và Vectored IO

Bài viết giới thiệu về IO data, Vectored I/O và tối ưu hóa hệ thống dùng Elixir bằng cách tận dụng Vectored I/O.