Topic 16 พลังของ Plain Text

ในฐานะ Pragmatic Programmer วัตถุดิบพื้นฐานของเราไม่ใช่ไม้หรือเหล็ก แต่มันคือความรู้ (knowledge) เราเก็บรวบรวม Requirement ในรูปแบบของความรู้ แล้วถ่ายทอดความรู้นั้นออกมาผ่าน Design, Implementation, Test และ Document และเราเชื่อว่า Format ที่ดีที่สุดสำหรับการเก็บรักษาความรู้อย่างถาวรก็คือ Plain Text เพราะมันช่วยให้เราจัดการกับความรู้ได้ ทั้งแบบ Manual และแบบ Programmatic โดยใช้เครื่องมือแทบทุกอย่างที่มีอยู่

ปัญหาของ Binary Format ส่วนใหญ่คือ Context ที่จำเป็นต่อการเข้าใจข้อมูลนั้นถูกแยกออกมาต่างหากจากตัวข้อมูลเอง กลายเป็นการพยายามแยกข้อมูลออกจากความหมายของมัน ซึ่งข้อมูลนั้นอาจจะเหมือนถูกเข้ารหัสไว้เลยก็ได้ เพราะมันจะไม่มีความหมายอะไรเลยหากขาด Application Logic มาใช้ Parse มัน แต่ถ้าเป็น Plain Text คุณสามารถสร้าง Data Stream ที่อธิบายตัวเองได้ (self-describing) และไม่ยึดติดกับ Application ตัวที่สร้างมันขึ้นมา

Plain Text คืออะไร?

Plain Text ประกอบไปด้วยตัวอักษรที่พิมพ์ได้ (printable characters) ในรูปแบบที่สื่อสารข้อมูลได้ มันอาจจะเป็นอะไรที่เรียบง่ายอย่างรายการซื้อของ:

* นม
* ผักกาดหอม
* กาแฟ

หรืออาจจะซับซ้อนอย่าง Source ของหนังสือเล่มนี้ (ใช่ครับ มันเขียนด้วย Plain Text จนทำให้สำนักพิมพ์ต้องหงุดหงิด เพราะเขาอยากให้เราใช้ Word Processor มากกว่า)

ประเด็นสำคัญคือความหมาย (information) สิ่งที่เห็นข้างล่างนี้ไม่ใช่ Plain Text ที่มีประโยชน์:

hlj;uijn bfjxrrctvh jkni'pio6p7gu;vh bjxrdi5rgvhj

หรืออย่างอันนี้:

Field19=467abe

ผู้อ่านไม่มีทางรู้เลยว่า 467abe หมายถึงอะไร เราชอบให้ Plain Text ของเราสื่อสารออกมาเพื่อให้คนเข้าใจได้

Tip 25 เก็บรักษาความรู้ไว้ใน Plain Text

พลังของ Text

Plain Text ไม่ได้แปลว่า Text นั้นจะต้องไม่มี Structure นะครับ ทั้ง HTML, JSON, YAML และอื่น ๆ ล้วนเป็น Plain Text ทั้งสิ้น เช่นเดียวกับ Protocol พื้นฐานส่วนใหญ่บนอินเทอร์เน็ต อย่าง HTTP, SMTP, IMAP และอื่น ๆ ซึ่งมีเหตุผลดี ๆ รองรับอยู่:

  • ประกันความเสี่ยงจากการตกรุ่น (Obsolescence)
  • ใช้ประโยชน์จากเครื่องมือที่มีอยู่ (Leverage existing tools)
  • ทดสอบได้ง่ายขึ้น (Easier testing)

ประกันความเสี่ยงจากการตกรุ่น

ข้อมูลในรูปแบบที่มนุษย์อ่านออก (Human-readable) และอธิบายตัวเองได้ (Self-describing) จะมีอายุยืนยาวกว่าข้อมูลรูปแบบอื่นและ Application ที่สร้างมันขึ้นมาเสมอ ตราบใดที่ข้อมูลยังอยู่ คุณก็ยังมีโอกาสที่จะนำมันมาใช้งานได้ แม้ในเวลาต่อมา Application ดั้งเดิมที่สร้างมันจะเลิกใช้ไปนานแล้วก็ตาม

คุณสามารถ Parse ไฟล์ลักษณะนี้ได้โดยใช้ความรู้เกี่ยวกับ Format เพียงบางส่วนเท่านั้น แต่สำหรับ Binary File ส่วนใหญ่ คุณต้องรู้รายละเอียดทั้งหมดของ Format นั้น ถึงจะ Parse มันได้สำเร็จ

สมมติว่าคุณได้รับไฟล์ข้อมูลจากระบบ Legacy [24] คุณแทบจะไม่รู้อะไรเลยเกี่ยวกับ Application ดั้งเดิม สิ่งที่สำคัญเพียงอย่างเดียวคือคุณรู้ว่ามันมีการเก็บรายการเลขประกันสังคม (Social Security Number) ของลูกค้า ซึ่งคุณจำเป็นต้องค้นหาและดึงข้อมูลนั้นออกมา ท่ามกลางข้อมูลต่าง ๆ คุณจะเห็น:

<FIELD10>123-45-6789</FIELD10>
...
<FIELD10>567-89-0123</FIELD10>
...
<FIELD10>901-23-4567</FIELD10>

ด้วยการระบุรูปแบบของเลขประกันสังคมได้ คุณจึงเขียนโปรแกรมเล็ก ๆ ขึ้นมาเพื่อดึงข้อมูลนั้นได้อย่างรวดเร็ว แม้คุณจะไม่มีข้อมูลอื่น ๆ เกี่ยวกับสิ่งที่อยู่ในไฟล์นั้นเลยก็ตาม

แต่ลองจินตนาการดูว่าหากไฟล์นั้นถูก Format มาแบบนี้แทน:

AC27123456789B11P
...
XY43567890123QTYL
...
6T2190123456788AM

คุณอาจจะนึกความหมายของตัวเลขเหล่านี้ไม่ออกง่าย ๆ นี่คือความแตกต่างระหว่าง "ข้อมูลที่มนุษย์อ่านออก" (Human Readable) กับ "ข้อมูลที่มนุษย์เข้าใจได้" (Human Understandable)

ในขณะเดียวกัน FIELD10 ก็ไม่ได้ช่วยอะไรมากนัก แต่อะไรที่ดูเหมือนเป็นอย่างตัวอย่างนี้:

| ​ | <SOCIAL-SECURITY-NO>123-45-6789</SOCIAL-SECURITY-NO> |

จะช่วยให้การทำแบบนี้เป็นเรื่องง่ายแบบไม่ต้องใช้ความคิดอะไรเลย แถมยังช่วยให้ข้อมูลมีอายุยืนยาวกว่าโปรเจกต์ที่สร้างมันขึ้นมาอีกด้วย

การใช้ประโยชน์ (Leverage)

เครื่องมือแทบทุกอย่างในโลกคอมพิวเตอร์ ตั้งแต่ระบบ Version Control ไปจนถึง Editor และเครื่องมือ Command-line ต่างก็สามารถทำงานกับ Plain Text ได้