Quần Cam Blog

My engineering life

#programming #random

Đầ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!


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

Code Đức

Là một developer tất nhiên bạn phải chuyên nghiệp với nghề của mình. Thế nhưng chuyên nghiệp là như thế nào? Và bạn, một developer, sẽ phải hành xử ra sao mới được xem là chuyên nghiệp?

[Elixir RSS Reader] Phần 1 - HTTP client

Đây là phần 1 của loạt bài viết hướng dẫn học Elixir của mình qua việc viết một RSS reader. Ở phần này mình sẽ viết về GenServer.

Git LFS - Chí Phèo và nồi cháo hành của Thị Nở

Hắn vừa push vừa chửi. Bao giờ cũng thế, cứ rượu vào push code là hắn chửi. Bắt đầu hắn chửi Linus Torvalds. Có hề gì? Linux có của riêng nhà nào? Rồi hắn chửi Mark Zuckerberg…