นักพัฒนา Python ต่างประสบปัญหากับโมดูล datetime ในไลบรารีมาตรฐานมาอย่างยาวนาน ซึ่งแม้จะมีอยู่มากว่าสองทศวรรษแล้ว แต่ก็ยังคงมีจุดบกพร่องและกรณีพิเศษมากมายที่สามารถทำให้แม้แต่โปรแกรมเมอร์ที่มีประสบการณ์สูงก็ยังสะดุดได้ ไลบรารีใหม่ชื่อ Whenever มีเป้าหมายที่จะแก้ปัญหาเหล่านี้โดยให้ทางเลือกที่มี type-safe และรองรับ DST (Daylight Saving Time) โดยได้แรงบันดาลใจจากไลบรารี datetime ที่ได้รับการยอมรับในภาษาอื่นๆ
การสนทนาเกี่ยวกับ Whenever ชี้ให้เห็นถึงจุดปวดหัวทั่วไปในระบบนิเวศของ Python: การจัดการ datetime นั้นเต็มไปด้วยพฤติกรรมที่ไม่คาดคิดซึ่งอาจนำไปสู่ข้อผิดพลาดเล็กๆ ในโค้ดที่ใช้งานจริง นักพัฒนาหลายคนแสดงความโล่งใจที่ได้พบไลบรารีที่แก้ไขปัญหาเหล่านี้โดยเฉพาะ โดยหลายคนได้แบ่งปันเรื่องราวการต่อสู้กับบั๊กที่เกี่ยวข้องกับ datetime ที่พวกเขาเคยพบ
ปัญหาของไลบรารีมาตรฐาน
โมดูล datetime ที่มีอยู่ในตัวของ Python ถูกวิจารณ์เรื่องการจัดการ Daylight Saving Time (DST) และการขาด type safety ปัญหาที่ถูกกล่าวถึงมากที่สุดคือ datetime ไม่สามารถคำนวณ DST อย่างถูกต้องเมื่อทำการคำนวณทางคณิตศาสตร์ภายในโซนเวลาเดียวกัน ตัวอย่างเช่น การเพิ่ม 8 ชั่วโมงให้กับเวลาเข้านอน 22:00 น. ในช่วงการเปลี่ยนแปลง DST จะให้ผลลัพธ์ที่ไม่ถูกต้องเป็น 6:00 น. แทนที่จะเป็น 7:00 น. เนื่องจากไลบรารีไม่ได้คำนึงถึงชั่วโมงที่หายไป
ข้อร้องเรียนสำคัญอีกประการหนึ่งคือระบบประเภทของ Python ไม่สามารถแยกแยะระหว่าง naive datetimes (ไม่มีข้อมูลโซนเวลา) และ aware datetimes (มีข้อมูลโซนเวลา) ทำให้เป็นไปไม่ได้ที่จะบังคับใช้ในระดับการตรวจสอบประเภทว่าฟังก์ชันคาดหวังอันไหน ซึ่งนำไปสู่ข้อผิดพลาดที่อาจเกิดขึ้นได้
ผมเป็นโปรแกรมเมอร์ที่มีประสบการณ์ แต่เมื่อใดก็ตามที่ต้องจัดการกับวัตถุ datetime ผมทำได้ดีที่สุดด้วยการทดสอบหน่วยแล้วก็แค่หวังว่าไม่มี 'กรณีพิเศษ' เหล่านี้จะเกิดขึ้นกับเรา นั่นหมายความว่า: ผมไม่รู้จริงๆ ว่ามันทำงานอย่างไรในระดับลึก
ไลบรารีทางเลือกและข้อจำกัด
ก่อนหน้า Whenever นักพัฒนาได้หันไปใช้ทางเลือกอื่นเช่น Arrow และ Pendulum แต่ไลบรารีเหล่านี้ไม่ได้แก้ไขปัญหาหลักอย่างครบถ้วน Arrow ยังคงมีปัญหาพื้นฐานเหมือนกับไลบรารีมาตรฐานและทำให้การตรวจสอบประเภทยากขึ้นโดยการลดทุกอย่างให้เป็นประเภท Arrow เพียงอย่างเดียว Pendulum พยายามแก้ไขจุดบกพร่องที่เกี่ยวข้องกับ DST บางส่วน แต่ประสิทธิภาพได้ลดลงเมื่อเวลาผ่านไปและดูเหมือนจะอยู่ในสภาวะการดูแลรักษาที่ไม่ชัดเจน โดยมีการปล่อยเวอร์ชันใหม่เพียงครั้งเดียวในช่วงสี่ปีที่ผ่านมา
ผู้แสดงความคิดเห็นหลายคนสังเกตว่าพวกเขาได้ลองใช้ไลบรารีต่างๆ แต่ยังรู้สึกไม่แน่ใจเกี่ยวกับกรณีพิเศษ นักพัฒนาคนหนึ่งกล่าวว่าเคยใช้ Arrow, Delorean และ Pendulum ก่อนที่จะตัดสินใจใช้ Whenever เพราะมันเหมาะกับสิ่งที่ฉันทำกับ datetimes มากกว่าและดูเหมือนจะได้รับการดูแลอย่างต่อเนื่องมากกว่า
การถกเถียงเรื่องการพึ่งพา
การประกาศ Whenever ได้จุดประกายการถกเถียงอย่างคึกคักเกี่ยวกับการใช้ไลบรารีของบุคคลที่สามหรือยึดติดกับไลบรารีมาตรฐาน นักพัฒนาบางคนแสดงความชอบที่จะหลีกเลี่ยงการพึ่งพาโดยสิ้นเชิง โดยโต้แย้งว่าพวกมันฆ่าโครงการและสร้างภาระในการบำรุงรักษา คนอื่นๆ โต้แย้งว่าสำหรับโดเมนที่ซับซ้อนเช่นการจัดการ datetime ไลบรารีที่ได้รับการดูแลอย่างดีที่สร้างโดยผู้เชี่ยวชาญในโดเมนนั้นคุ้มค่ากับต้นทุนการพึ่งพา
นักพัฒนาในวงการสาธารณสุขโดยเฉพาะเน้นย้ำว่าพวกเขาชอบที่จะใช้การพึ่งพาที่เชื่อถือได้มากกว่าเสี่ยงที่จะนำตรรกะ datetime ที่ซับซ้อนไปใช้เอง ความรู้สึกนี้ได้รับการสะท้อนโดยคนอื่นๆ ที่ชี้ให้เห็นว่าในขณะที่ไลบรารีมาตรฐานได้รับการทดสอบอย่างดี แต่ข้อบกพร่องในการออกแบบพื้นฐานไม่สามารถแก้ไขได้โดยไม่มีการเปลี่ยนแปลงที่ทำให้เกิดการแตกหัก
ประสิทธิภาพและการนำไปใช้
Whenever นำเสนอทั้งการใช้งาน Rust และ Python แบบบริสุทธิ์ โดยเวอร์ชัน Rust ให้ประโยชน์ด้านประสิทธิภาพที่สำคัญ ตามเกณฑ์วัดประสิทธิภาพที่ผู้สร้างแบ่งปัน การใช้งาน Rust มีประสิทธิภาพดีกว่าทั้งไลบรารีมาตรฐานและทางเลือกจากบุคคลที่สามอื่นๆ เวอร์ชัน Python บริสุทธิ์ช้ากว่าเวอร์ชัน Rust ประมาณ 10 เท่า แต่โดยทั่วไปยังคงเร็วกว่า Arrow และ Pendulum
ผู้ใช้บางคนแสดงความกังวลเกี่ยวกับความซับซ้อนของการใช้แพ็คเกจไบนารีหรือการสร้างจากซอร์ส โดยเฉพาะอย่างยิ่งเกี่ยวกับการใช้งาน Python บริสุทธิ์ซึ่งต้องใช้ตัวแปรสภาพแวดล้อมพิเศษในการติดตั้ง ผู้สร้างยอมรับข้อกังวลเหล่านี้แต่อธิบายการแลกเปลี่ยนที่เกี่ยวข้องในการตัดสินใจเกี่ยวกับแพ็คเกจ
มองไปข้างหน้า
การเกิดขึ้นของ Whenever สะท้อนให้เห็นถึงรูปแบบที่กว้างขึ้นที่เห็นในระบบนิเวศภาษาอื่นๆ Java เผชิญกับปัญหา datetime ที่คล้ายกันก่อนที่จะแนะนำ API ใหม่ใน Java 8 (JSR-310) ซึ่งได้รับแรงบันดาลใจจากไลบรารี Joda Time ที่ได้รับความนิยม JavaScript กำลังใช้งาน Temporal ซึ่งเป็น API datetime ใหม่ที่แก้ไขข้อกังวลที่คล้ายกัน
ผู้แสดงความคิดเห็นบางคนแสดงความหวังว่า Whenever อาจจะเดินตามเส้นทางที่คล้ายกัน ในที่สุดก็มีอิทธิพลต่อการปรับปรุงไลบรารีมาตรฐานของ Python อย่างไรก็ตาม ในขณะนี้ นักพัฒนาที่ทำงานกับ datetime ใน Python มีตัวเลือกใหม่ที่สัญญาว่าจะทำให้โค้ดของพวกเขาน่าเชื่อถือและบำรุงรักษาได้ดีขึ้น
ในขณะที่การจัดการ datetime ยังคงเป็นด้านที่ท้าทายของการพัฒนาซอฟต์แวร์ในทุกภาษา ไลบรารีเช่น Whenever ที่รวมบทเรียนจากระบบนิเวศอื่นๆ จึงเป็นเครื่องมือที่มีคุณค่าสำหรับนักพัฒนาที่ต้องการเขียนโค้ดที่ถูกต้อง มี type-safe โดยไม่ตกหลุมพรางทั่วไป
อ้างอิง: Whenever