8 ชั่วโมงกับการที่ไม่คิด design ให้ดีๆ

ช่วงนี้นั่งเขียนโปรแกรม เจอโจทย์เกี่ยวกับการ clean up resources ต่างๆ เช่น authentication cache หรือ reply message tracker ซึ่งโดย happy path พวกนี้จะถูก remove จาก cache ไปเอง (ตัวอย่างเช่น ถ้า user logout ตาม step ที่เราให้ไว้ authentication token ก็จะ clear ออกจาก cache แต่ในความเป็นจริง โอกาสที่ user จะปิด browser ไปเลยมีเยอะกว่า :s )

เมื่อวานเลยนั่งเขียนโปรแกรมเพื่อจะ clean up พวกนี้ ภาพใต้ concept ชื่อ Chore Keeper ซึ่งใช้ 1 active thread ในการเรียก Cleanup() ใน "Chore" ตามความถี่ที่กำหนด เช่น Chore1 ให้โดนเรียกทุกๆ 300ms, Chore2 ให้โดนเรียกทุก 500ms

ตอนแรกนึกว่าง่าย เขียนเอาจริงมันมี corner case ที่ต้องคิดมากอยู่ เช่น ถ้า Chore ทำให้เกิด exception ต้องไม่ทำให้ chore อื่นหยุด, หรือการใช้ thread เพื่อ schedule งานมันต้อง spin check แต่ทำอย่างไรถึงจะไม่ spin check บ่อยเกินไปจนเปลือง CPU utilization ซึ่งถ้าคิดเร็วๆ คำตอบก็จะเป็นแนว spin check ที่ความถี่ที่ต่ำที่สุดจาก chore ทั้งหมด ... แต่เอาจริง จากตัวอย่างข้างบน schedule มันจะต้องเป็น

  • 300ms แรก -> Chore1
  • 200ms ถัดมา -> Chore2
  • 100ms ถัดมา -> Chore1
  • 300ms ถัดมา -> Chore1
  • 100ms ถัดมา -> Chore2
  • so on... จะเห็นว่ามันไม่ใช่แค่ minimum frequency อย่างเดียว

เลยใช้เวลาไป 7-8 ชั่วโมงสำหรับนั่งเขียนโค้ดและเขียนเทส ซึ่งเทสเองก็เกี่ยวพันกับ thread ทำให้เขียนเทสยากเข้าไปอีก เมื่อวานกะว่าจะได้ซัก 4 งาน เจอตัวนี้ไป จบไปที่ 2 งาน...


เมื่อเช้านอนไม่หลับ เลยนอนนึกถึงเรื่อง Chore keeper แล้วก็นึกถึงว่า code ที่เขียนไปมันก็ based บน Thread pool แล้ว... ทำไมเราไม่ใช้ Threadpool Timer นะ?!

เท่านั้นก็สลดทันที เพราะนึกไปแล้ว ไอ้ที่เราเขียนมันก็คือ Timer ดีๆ(หรือเปล่านะ)ที่ run บน Threadpool นั่นเอง >_<~~ ถ้าใช้ Timer clean up resource ของใครของมันไปเลย น่าจะใช้เวลาแค่ 1-2 ชั่วโมงในการทำ (ซึ่งตั้งใจว่าจะเปลี่ยนไปใช้ Timer แหละมัน simple กว่าเยอะ)

นอนนึกต่อว่ามันเกิดอะไรขึ้นถึงทำให้เสียเวลาไปอย่างนั้น... ข้อแก้ตัวที่หาได้ คิดว่า

  1. การนั่งเขียน/คิดโปรแกรมคนเดียว ขาดคนวิจารณ์ design ที่จะทำ
  2. เคยท่องไว้ในใจ (ทั้งบอกคนอื่นเอง :D) ว่าการ design ต้องมีอย่างน้อยซัก 2 design แล้วค่อยเลือก แต่อันนี้คิดแล้วเลือกเลย
  3. ใช้เวลาในการวิเคราะห์ปัญหาน้อยไป คล้ายๆข้อ 2 นะ

มีใครจะเพิ่มเติมอะไรมั้ย? ^^;