By Arnon Puitrakul - 22 เมษายน 2021
มีปัญหามากมายเกิดขึ้นเมื่อเราเริ่มเอามือวางไว้บน Keyboard และจะเขียน Code จนกลายเป็น Quote ประมาณว่า ถ้าการ Debug คือการเอาบัคออก การเขียน Code ก็คงเป็นการเอาบัคใส่เข้าไปแหละ ใช่แล้ว ฮ่า ๆ เพื่อให้การ Debug ทำได้ง่ายขึ้น สิ่งนึงที่เราทำได้คือ การเขียน Code ให้ดูเรียบร้อย โดยที่ปัญหาที่วันนี้เราจะมาโฟกัสเป็นปัญหาที่คนเขียน Code มือใหม่มักจะเจอ และอาจจะยังไม่รู้ตัวว่ามันทำให้เกิดความชิบหายตอนเราจะ Debug หรือแก้ไขได้ขนาดไหน นั่นคือการใช้ Conditional ซ้อนกันเยอะ ๆ นั่นเอง
if condition_1 :
if condition_2 :
if condition_3:
do_sth_1()
else:
do_sth_2()
else:
do_sth_3()
else:
do_end_case()
จาก Code ด้านบนเป็นปัญหาที่เรามักจะพบได้บ่อยมาก ๆ ในโปรแกรมหลาย ๆ ตัวที่ไม่ได้ผ่านการทำ Refactor มาก่อน ซึ่งส่วนใหญ่แล้ว จะเกิดจากมือใหม่นี่แหละที่อาจจะยังมีวิธีการวาง Logic ที่ยังไม่มีประสิทธิภาพมากนัก ปัญหาคือ เมื่อเราต้องทำงานกับมัน อาจจะเป็นการ Debug หรือมานั่งแก้ เราจะพบว่า มันน่าปวดหัวมาก ๆ เอ๊ะ Condition Block นี้มันอยู่ตรงไหนนะ อันนี้ของใครอะไรยังไง ทำให้เสี่ยงต่อการเกิดข้อผิดพลาดได้สูงขึ้นเป็นเงาตามตัวนั่นเอง
หลาย ๆ ครั้งที่เราเจอ Code แบบนี้ เราจะไปถามคนที่เขียนว่า เขาคิดอะไรอยู่ ทำไมถึงเขียน Code แบบนี้ออกมา หลาย ๆ ครั้งเราได้คำตอบว่า ก็เขาคิดออกมาเป็นแบบนี้ เขาก็เลยเขียนมาเป็นแบบนี้ตรง ๆ เลย อะไรแบบนั้น แต่อาจจะยังไม่ได้คิดถึงผลลัพธ์ที่จะตามมานั่นเอง
if condition_1 :
return do_sth_3()
if condition_2:
return do_sth_2()
if condition_3:
return do_sth_1()
return do_end_case()
จากเดิมที่เราใช้ Indent กว้างสุดลูกหูลูกตา ยาวจนจอ Ultra Super Wide ไม่พอ เราก็ปรับมันให้มาอยู่ในรูปแบบที่อ่านง่ายขึ้นอย่าง Guard Causes ง่าย ๆ ก็คือ เราแยก Condition จากกันไปเลย แทนที่เราจะเขียนซ้อน ๆ กัน ทำให้มันอ่านง่ายขึ้น ก็ทำให้ดูแลง่ายขึ้นด้วยเช่นกัน
วิธีการที่เราจะ Extract ออกมาเป็น Guard Causes คือ เราจะต้องแรก Logic การทำงานออกมาก่อน จากเดิม เราติดทุกอย่างไว้ใน Conditional Block เดียวกันเลย เราต้องแยกออกมาตามเงื่อนไขการทำงาน ค่อย ๆ ไล่ลงไปทีละเคส เราก็จะได้ Conditional Block ของแต่ละเคสออกมา และเราก็เอามาจัดเรียงเพื่อให้มันได้เงื่อนไขตรงกับ Nested-Conditional ของเราก่อนหน้าก็เรียบร้อยแล้ว เพื่อความชัวร์ บางทีมึนก็เขียน Test Case ไว้ก็ทำให้เราจัดการกับเรื่องพวกนี้ได้ง่ายขึ้น ลดความกังวลว่าจะเขียน Logic ผิดอีกต่อไปเลย
Guard Causes เป็นวิธีการ Refactoring ง่าย ๆ ที่ใคร ๆ ก็ทำได้ แถมยังทำให้ Code ของเรามันดูดีขึ้น ดูแลง่ายขึ้นมาก เมื่อก่อน ตอนเราเขียนโปรแกรมใหม่ ๆ เราก็ไม่เข้าใจนะว่า ทำไมต้องทำ Refactoring ด้วย Code เราก็รันได้นิอะไรแบบนั้น แต่พอเอาเข้าจริงทำงานจริง ๆ มันเป็นของที่ต้องทำ เพราะโปรแกรมเราเขียนวันนี้ก็เหมือนคบแฟน คบมันก็ดูแลกันไปนาน ๆ โปรแกรมก็เช่นกัน ฮิ้ววววว
เราเป็นคนที่อ่านกับซื้อหนังสือเยอะมาก ปัญหานึงที่ประสบมาหลายรอบและน่าหงุดหงิดมาก ๆ คือ ซื้อหนังสือซ้ำเจ้าค่ะ ทำให้เราจะต้องมีระบบง่าย ๆ สักตัวในการจัดการ วันนี้เลยจะมาเล่าวิธีการที่เราใช้ Obsidian ในการจัดการหนังสือที่เรามีกัน...
หากเราเรียนลงลึกไปในภาษาใหม่ ๆ อย่าง Python และ Java โดยเฉพาะในเรื่องของการจัดการ Memory ว่าเขาใช้ Garbage Collection นะ ว่าแต่มันทำงานยังไง วันนี้เราจะมาเล่าให้อ่านกันว่า จริง ๆ แล้วมันทำงานอย่างไร และมันมีเคสใดที่อาจจะหลุดจนเราต้องเข้ามาจัดการเองบ้าง...
ก่อนหน้านี้เราเปลี่ยนมาใช้ Zigbee Dongle กับ Home Assistant พบว่าเสถียรขึ้นเยอะมาก อุปกรณ์แทบไม่หลุดออกจากระบบเลย แต่การติดตั้งมันเข้ากับ Synology DSM นั้นมีรายละเอียดมากกว่าอันอื่นนิดหน่อย วันนี้เราจะมาเล่าวิธีการเพื่อใครเอาไปทำกัน...
เมื่อหลายวันก่อนมีพี่ที่รู้จักกันมาถามว่า เราจะโหลด CSV ยังไงให้เร็วที่สุด เป็นคำถามที่ดูเหมือนง่ายนะ แต่พอมานั่งคิด ๆ ต่อ เห้ย มันมีอะไรสนุก ๆ ในนั้นเยอะเลยนี่หว่า วันนี้เราจะมาเล่าให้อ่านกันว่า มันมีวิธีการอย่างไรบ้าง และวิธีไหนเร็วที่สุด เหมาะกับงานแบบไหน...