top of page
ค้นหา
รูปภาพนักเขียนSathit Jittanupat

How should you count days?

อัปเดตเมื่อ 23 ธ.ค. 2567


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


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


หนึ่งวินาทีของ CPU ทำอะไรได้มากมาย แต่สำหรับมนุษย์เป็นแค่ชั่วพริบตา

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


โปรเจคท์แต่ละแห่งมีสถานะต่างกัน 

ระบบที่ใช้มานานแล้วจะนิ่งลงตัวไม่ค่อยเปลี่ยน 

แตกต่างจากระบบใหม่ยังต้องปรับตั้งค่าอยู่บ่อยๆ

บางครั้งอาจมีการปรับแก้กลับไปกลับมาหลายครั้ง

กว่าจะทดสอบว่าใช้งานได้ตามต้องการ


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


เบื้องต้นผมตั้งสมมติฐานเอาง่ายๆ ว่า หากการแก้ไขเกิดขึ้นภายใน 1 วันให้ถือว่ากำลังทำเรื่องเดียวกันติดพัน โปรแกรมจะถามแค่ครั้งแรกของวันพอ ว่ากำลังแก้ไขเกี่ยวกับอะไร การแก้ไขต่อเนื่องหลังจากนั้นจะไม่เซ้าซี้ถามอีก



ระบบนี้ขยายเพิ่มจากการเก็บ log ของโปรแกรม ตรวจจับเฉพาะส่วนของการตั้งค่า เพิ่มเก็บค่า dif ที่เทียบส่วนที่เปลี่ยนแปลง ช่วยให้ดูง่ายกว่า log ปกติ ทุกครั้งที่บันทึก ก็จะเก็บเวลาที่เป็นค่า timestamp ซึ่งเป็นตัวเลขระดับ millisecond (1/1000 วินาที)


คณิตศาสตร์ของ timestamp นั้นง่ายมาก การคำนวณหาเวลาห่างจากปัจจุบันเท่าไหร่ เพียงแค่เอาค่า timestamp ของปัจจุบัน ลบกับ ค่า timestamp ครั้งก่อน ก็จะได้จำนวน millisecond ที่ต่างกัน

หลังจากนั้นก็ใช้สูตรแปลงหน่วยเวลาพื้นฐานที่ท่องจำตั้งแต่ประถม เช่น 


  • คำนวณ วินาที second = millisecond / 1000

  • คำนวณ นาที minute = second / 60


ดังนั้นเงื่อนไข "ภายใน 1 วัน" ก็สามารถคำนวณหาคำตอบที่เป็นหน่วย "วัน" ได้ โดยนับจากเวลาที่ตั้งค่าครั้งหลังสุดกับเวลาปัจจุบัน ว่าห่างกันเกิน 1 วันหรือยัง โดยการทดหน่วยจาก วินาที → นาที → ชั่วโมง → วัน ตามมาตราวัดเวลา


หลังจากทดลองใช้งานอยู่สอง-สามวัน ก็รู้สึกทะแม่ง เมื่อพบเคสในการทำงานจริง


เช่น เมื่อวานนี้คนในทีมทำงานจนถึงห้าโมงเย็น (17:00) จนเสร็จ แล้ววันนี้มีเรื่องใหม่ให้ทำอีก สมมติว่าเริ่มทำตอนบ่ายโมง (13:00) 


เห็นไหมว่าเวลาต่างกันไม่ถึง 24 ชั่วโมง


ถ้าคิดตามสูตรเวลาข้างต้น ระยะเวลาห่างกัน 1 วัน ควรเท่ากับ 24 ชม. ดังนั้นระหว่าง 17:00 ถึง 13:00 ของอีกวันหนึ่ง จึงยังไม่ครบเงื่อนไข "ภายใน 1 วัน"


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


เพราะฉะนั้น "ภายใน 1 วัน" ในมิติของมนุษย์อาจไม่ได้หมายถึงภายใน 24 ชั่วโมง แต่หมายถึง "วัน" ที่เป็นรอบวัฏจักรกลางวันกลางคืน


ขณะที่ตรรกะประมวลผลในคอมพิวเตอร์อาจมองเวลาเป็นความต่อเนื่อง เพราะตรงไปตรงมาสอดคล้องกับระบบบันทึกเวลาที่เป็น timestamp


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


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


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


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


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


ดู 1 ครั้ง0 ความคิดเห็น

โพสต์ล่าสุด

ดูทั้งหมด

Comments


Post: Blog2_Post
bottom of page