หนึ่งในสกิลที่เหล่า Developer ควรจะมีติดตัวไว้ ยิ่งในยุคที่ AI เข้ามาแทนที่งานหลาย ๆ อย่างของเหล่า dev ไปด้วยแล้วนั้น ก็คือสกิลในการ Debugging …
คุยกันเพิ่มนิดนึงว่าแล้วเราได้ประโยชน์อะไรจากการเราสามารถ debug ได้บ้างล่ะ ? เอาแบบเป็นหัวข้อใหญ่ ๆ ที่เราพอจะเห็นภาพได้
- แก้ไขปัญหาได้รวดเร็ว
- รู้จัก framework ในเชิงลึก
- ยกระดับวิธีการคิดในการแก้ไขปัญหา
- แก้ไขปัญหาที่ซับซ้อนได้ ซึ่งเหนือสิ่งอื่นใด พอเราสามารถทำได้ทุกข้อที่กล่าวมาแล้วนั้น ก็ส่งผลให้ value ของตัวเองมากยิ่งขึ้นตามไปด้วย ซึ่งก็จะส่งผลโดยตรงต่อการต่อรองทั้งเรื่อง ตำแหน่งหน้าที่เพิ่มมากขึ้น รวมไปถึงค่าตอบแทนที่เหมาะสม เพราะสกิลที่เพิ่มขึ้นของเราด้วยนั่นแหละ
เอาล่ะ . . ทีนี้การ debug ให้ได้เริ่มน่าสนใจขึ้นมาอีกขั้นแล้วยังล่ะครับ ?
ไป debug กัน
ซึ่งวันนี้ผมจะยกตัวอย่างการ Debug ใน stack ที่ต้องทำงานกับ Docker ซึ่งการ Debug ก็จะไม่ได้ config แบบปกติแล้วล่ะ
แล้วต้องรู้อะไรบ้างล่ะ ? โจทย์ : Debug odoo ที่รันอยู่บน docker service โดยใช้ python pdb ในการ debugging
ขั้นแรกเราต้องเปิดให้ odoo service สามารถรับ io และสามารถ connect เข้าไปได้ โดยเราจะต้องเพิ่ม attributes ไปที่
docker-compose.yml
stdin_open: true tty: true
ถ้าเรามาดูที่ไฟล์
docker-compose.yml
กันก็จะได้หน้าตาประมาณนี้services: web-data: image: odoo:14.0 depends_on: - db ports: - "8069:8069" volumes: - odoo-web-data:/var/lib/odoo stdin_open: true tty: true
ถ้าทำตามนี้เรียบร้อย
เราก็จะได้ docker container ที่พร้อมสำหรับการ connect เข้าไปเรียบร้อย อ๊ะ ๆ แต่อย่าลืมครับ ว่าตอนนี้เรากำลังจะ debug สิ่งหนึ่งที่ต้องทำก่อนจะสามารถ debug ได้ ก็คือ add Breakpoint ลงไปในจุดที่เราต้องการจะ debug เพื่อให้ตัวโปรแกรมหยุดการทำงาน ตอนที่เจอ breakpoint
ซึ่งการเรียกใช้ pdb ก็ไม่ได้ซับซ้อนอะไร แค่เรียก
import pdb; pdb.set_trace()
คั่นไว้ในส่วนที่เราต้องการ
- จากนั้นเราก็สั่ง
docker compose up -d
docker ps
เพื่อเอา id หรือ ชื่อ container มาใช้ในการเข้าไป debug ใน odoo service- เมื่อได้ container id จากข้อ 2 แล้ว เราก็ใช้
docker attach <container_id>
มาถึงตรงนี้ก็สลับกลับไปที่หน้า application แล้วก็ทำการเรียก action ที่จะทำให้ฟังก์ชันที่เราต้องการ debug ถูกเรียกขึ้นมา
หลังจากนั้นหน้า application จะหยุดโหลดค้างไป ในจังหวะที่ไปเข้า breakpoint ให้เรากลับไปที่ console ก็จะเห็นว่ามันเข้า pdb ไปเรียบร้อย
ส่วน pdb จะไปยังไงต่อ ลองดูพวก pdb shortcut ต่าง ๆ หรือ cheat sheet นี้ก็ได้ครับ Ref: https://kapeli.com/cheat_sheets/Python_Debugger.docset/Contents/Resources/Documents/index
ตัวอย่างในการใช้ pdb
a = 1 b = 2 c = a + b d = a * b * c import pdb; pdb.set_trace() e = a + a * b
ถ้าเราทำการ execute ฟังก์ชันนี้ breakpoint จะไปหยุดอยู่ตรงบรรทัดก่อนหน้าตัวแปร e ซึ่งเราจะสามารถ print ค่าต่าง ๆ ที่อยู่ก่อนหน้านั้นออกมาได้ทั้งหมด เพื่อจะได้รู้ว่า ตัวแปรต่าง ๆ ที่เราเรียกใช้ในจังหวะที่ breakpoint อยู่ตรงนี้ มีค่าเป็นเท่าไร
(pdb)$: a 1 (pdb)$: c 3 (pdb)$: d 6
ซึ่งพอเราสามารถรู้ค่าของแต่ละตัวแปรในจังหวะที่ breakpoint อยู่ ก็ช่วยให้สามารถวิเคราะห์ปัญหาได้ดีมากยิ่งขึ้น หรือเรียกได้ว่าไม่ต้องเดา เพราะ debugging ออกมาให้เห็นได้เลยว่าตัวแปรนั้น มีค่าเป็นเท่าไร
ก็จะเห็นได้ว่าการ Debugging เป็นสกิลนึงที่ช่วยให้เราสามารถรู้ปัญหาได้ตรงจุด รู้ลึกไปถึงว่าในจังหวะที่เราเรียก breakpoint ตัวแปรที่มีปัญหา มีค่าเป็นยังไง ได้ผลลัพธ์ตามที่เราต้องการหรือไม่ได้ ? ซึ่งก็ส่งผลให้สามารถแก้ไขปัญหาได้ถูกจุด แบบไม่ต้องเดา รวมถึงสามารถรู้ได้ด้วย ว่าปัญหาที่เกิด แท้จริงแล้วเป็นปัญหามาจากอะไร ซึ่งหลายต่อหลายครั้ง มักจะเกิดจากการที่เราเรียกตัวแปรไป ณ จุดใดจุดหนึ่ง แล้วมันดันวิ่งไปเข้า function อื่น ๆ ของตัว framework ต่อ จนเกิดการ override หรือเรียกวนซ้ำจนทำให้ผลลัพธ์ที่เราต้องการมันผิดไปจากที่เราตั้งใจไว้
ก็เชิญชวนฮะ ว่าอย่างน้อยก็ลอง debug กันดูเถอะครับ จะได้ยกระดับการแก้ไขปัญหา รวมถึง code quality ของเราก็จะสูงยิ่งขึ้นไปด้วย
>_JV
