ขอให้วิศวกรซอฟต์แวร์ตรวจสอบส่วนสำคัญของโค้ดการผลิต และพวกเขาจะชี้ให้เห็นสามสิ่งที่จำเป็นต้องได้รับการปรับโครงสร้างใหม่อย่างหลีกเลี่ยงไม่ได้ แล้วเหตุใดโค้ดที่แย่ เปราะ หรือเข้าใจผิดจำนวนมากจึงยังคงทำงานอยู่ในการใช้งานจริง
คำตอบนั้นง่ายมาก:วิศวกรกลัวที่จะสัมผัสมัน งานการปรับโครงสร้างใหม่จะได้รับการระบุและเพิ่มลงใน Backlog แต่ไม่ค่อยได้เข้าสู่ Sprint ปัจจุบัน
มีเหตุผลหลายประการสำหรับเรื่องนี้ รหัสอาจถูกเขียนโดยวิศวกรที่ออกจากทีมเมื่อหลายปีก่อน และไม่มีใครเข้าใจรหัสนี้อย่างถ่องแท้ ในกรณีอื่นๆ ความสามารถมีความสำคัญต่อธุรกิจ ไม่มีใครอยากรับผิดชอบต่อการหยุดทำงานที่อาจเกิดขึ้นหรือการสูญเสียรายได้
ในโพสต์นี้ เราจะตรวจสอบว่าคุณสามารถใช้ Scientist เพื่อโยกย้าย ปรับโครงสร้าง และเปลี่ยนแปลงโค้ดการผลิต Ruby ที่สำคัญได้อย่างมั่นใจได้อย่างไร
แต่ก่อนอื่น คุณอาจถามว่า เราใช้การทดสอบเพื่อขุดปัญหาโค้ดไม่ได้หรือ
นี่คือสิ่งที่การทดสอบ Rails มีไว้เพื่อใช่ไหม
ใช่และไม่ใช่ มักจะเป็นเรื่องยากที่จะได้รับความมั่นใจอย่างสมบูรณ์ในการเปลี่ยนแปลงโค้ดก่อนที่จะปรับใช้ ผ่านการทดสอบตัวเครื่องและระบบ ไปได้ดีใช่ไหม
ความจริงก็คือว่าไม่มีอะไรมาทดแทนโลกแห่งความเป็นจริงได้ เช่น การผลิต จะเกิดอะไรขึ้นหากคุณภาพของข้อมูลไม่ดีหรือการทดสอบหายไป คุณจะรู้ได้อย่างไรว่าซอฟต์แวร์ใหม่จะทำงานได้ดีพอที่จะรองรับปริมาณงานการผลิตหรือไม่
บางครั้งทีมงานที่ให้บริการสาธารณะพบว่าจำเป็นต้องจัดการกับปัญหา "ความเข้ากันได้ของข้อบกพร่อง" เมื่อมีข้อบกพร่องในการผลิตมาระยะหนึ่งแล้ว ไคลเอนต์อาจเขียนโค้ดในลักษณะที่ขึ้นอยู่กับพฤติกรรมที่ไม่ถูกต้องที่สอดคล้องกัน ลูกค้ามักใช้ซอฟต์แวร์ในลักษณะที่ไม่คาดคิด
สังเกตการเปลี่ยนแปลงการผลิตใน Ruby และ Rails กับนักวิทยาศาสตร์
หากการผลิตเป็นสถานที่ที่ดีที่สุดในการได้รับความมั่นใจในการเปลี่ยนแปลง ให้พิจารณาสังเกตว่าโค้ดทำงานอย่างไร สิ่งนี้อาจฟังดูน่ากลัวในตอนแรก เนื่องจากแนวคิดในการ "ทดสอบในการใช้งานจริง" ขัดแย้งกับแนวปฏิบัติด้านวิศวกรรมซอฟต์แวร์แบบคลาสสิก
อย่างไรก็ตาม ข่าวดีก็คือว่า การทำดังกล่าวใน Ruby และ Rails นั้นทำได้ง่ายและปลอดภัยโดยใช้อัญมณีนักวิทยาศาสตร์ ชื่อของนักวิทยาศาสตร์นั้นขึ้นอยู่กับวิธีการทางวิทยาศาสตร์ในการทำการทดลองเพื่อตรวจสอบสมมติฐานที่กำหนด ในกรณีนี้ สมมติฐานของเราคือโค้ดใหม่ใช้งานได้
เหตุผลที่เราใช้วิธีการนี้ได้อย่างปลอดภัยนั้นเกิดจากการที่การทดลองยังคงใช้ผลลัพธ์ของโค้ดที่มีอยู่ รหัสใหม่ได้รับการประเมินเพื่อวัตถุประสงค์ในการสังเกตและการเปรียบเทียบเท่านั้น ทั้งเพื่อความถูกต้องและประสิทธิภาพ เราบรรเทาความกังวลเกี่ยวกับความครอบคลุมของการทดสอบที่กล่าวถึงก่อนหน้านี้โดยการประเมินประสิทธิภาพโดยใช้ข้อมูลและพารามิเตอร์ในโลกแห่งความเป็นจริง โดยทั่วไปแล้ว การทดลองจะประเมินอัตราตัวอย่างที่เลือกของคำขอเพื่อลดผลกระทบต่อการผลิต อย่างไรก็ตาม คุณสามารถประเมินทุกคำขอได้หากต้องการ
ตอนนี้เรามาดูกันคร่าวๆ ว่านักวิทยาศาสตร์ทำงานอย่างไรในสาขาหนึ่งโดยวิธีนามธรรม
สาขาตามรูปแบบนามธรรมในนักวิทยาศาสตร์ของ Ruby
แนวทางของนักวิทยาศาสตร์เริ่มต้นด้วยรูปแบบ Branch by Abstraction ที่ Martin Fowler บรรยายว่าเป็น "การเปลี่ยนแปลงครั้งใหญ่ต่อระบบซอฟต์แวร์อย่างค่อยเป็นค่อยไป"
เราแนะนำเลเยอร์นามธรรมเพื่อแยกโค้ดที่กำลังอัปเดต เลเยอร์นี้ตัดสินใจว่าจะใช้การดำเนินการใดเพื่อให้การทดสอบโปร่งใสกับส่วนที่เหลือของระบบ เทคนิคนี้เกี่ยวข้องกับการใช้แฟล็กคุณลักษณะที่กำหนดเส้นทางโค้ด
อัญมณีนักวิทยาศาสตร์ซึ่งมีต้นกำเนิดจาก Github นำรูปแบบนี้ไปใช้โดยใช้การทดลอง รหัสที่มีอยู่เรียกว่าตัวควบคุม และการใช้งานใหม่คือตัวเลือก เส้นทางรหัสทั้งสองทำงานตามลำดับแบบสุ่ม แต่จะส่งคืนเฉพาะผลลัพธ์การควบคุมไปยังไคลเอนต์
การใช้นักวิทยาศาสตร์เพื่อปรับโครงสร้างบริการ Ruby
พิจารณาบริการ Ruby ที่ส่งคืนตัวประกอบเฉพาะที่ใหญ่ที่สุดสำหรับจำนวนที่กำหนด สมมติว่าเราได้ระบุการเพิ่มประสิทธิภาพเพื่อตัดชุดผู้สมัครที่จำเป็น ซึ่งจะทำให้บริการเร็วขึ้น
อย่างไรก็ตาม เจ้าของบริการต้องการให้แน่ใจว่าไม่มีข้อบกพร่องเกิดขึ้น พวกเขายังต้องการสังเกตการปรับปรุงประสิทธิภาพด้วย แนะนำรหัสต่อไปนี้ การปรับเปลี่ยนไคลเอนต์เพื่อเรียกใช้เมธอดนี้:
ณ จุดนี้ เฉพาะ use นิพจน์ (ควบคุม) ถูกเรียกใช้ เพื่อให้การทดสอบคุ้มค่า ให้กำหนด Experiment ที่กำหนดเอง คลาสเพื่อเปิดใช้งาน (100% ของเวลาด้านล่าง) และเผยแพร่ผลลัพธ์ (ในกรณีนี้ เพียงบันทึก) นักวิทยาศาสตร์สร้างข้อมูลที่ยอดเยี่ยมแต่ไม่ได้ทำอะไรกับมันตามค่าเริ่มต้น ส่วนนั้นขึ้นอยู่กับคุณ
ผลลัพธ์ของการทดสอบจะถูกบันทึก และเราสามารถปรับปรุงเมื่อเวลาผ่านไปตามความคิดเห็นที่ได้รับ เมื่อโค้ดใหม่ตรงตามข้อกำหนดและมีความมั่นใจในระดับสูง ให้ตัดส่วนการใช้งานใหม่ให้สำเร็จโดยเพียงแค่แทนที่โค้ดวิทยาศาสตร์ด้วยการมอบหมายสิทธิ์ให้กับการใช้งานใหม่
LabTech ทำให้การทดลองของนักวิทยาศาสตร์ง่ายขึ้นใน Ruby on Rails
คุณสามารถใช้ LabTech gem ในแอปพลิเคชัน Rails ของคุณเพื่อกำหนดค่านักวิทยาศาสตร์และจัดการผลลัพธ์ได้อย่างง่ายดาย
แอปพลิเคชันที่ใช้ AppSignal สามารถใช้ Appsignal.instrument เครื่องมือช่วยแบบกำหนดเองเพื่อติดตามว่ากิจกรรมของนักวิทยาศาสตร์ใช้เวลานานเท่าใดจึงจะเสร็จสิ้น ล้อมรอบบล็อกโค้ดการทดสอบต่างๆ เพื่อดูเหตุการณ์ปรากฏในไทม์ไลน์ประสิทธิภาพ
ตอนนี้ กลับไปที่ LabTech — หน้าเว็บด้านล่างเพียงยอมรับตัวเลขที่จะแยกตัวประกอบ

การเริ่มต้นใช้งานนั้นง่ายดายหากคุณสามารถเข้าถึงคอนโซลได้ ขั้นแรก เพิ่ม LabTech gem ลงใน Gemfile ของคุณแล้วรัน bundle install .
ตารางจะจัดเก็บผลลัพธ์และการกำหนดค่าการทดลอง ดังนั้นให้ดำเนินการย้ายฐานข้อมูล
เลเยอร์นามธรรมจะเหมือนกัน ยกเว้นว่าจะใช้โมดูล LabTech รหัสเต็มมีอยู่ใน GitHub
ณ จุดนี้ การทดลองถูกปิดใช้งาน ดังนั้นให้ใช้คอนโซลเพื่อเปิดใช้งานในทุกกรณีหรือเป็นเปอร์เซ็นต์ของเวลา
ขณะนี้เราทำการทดสอบได้แล้ว และการทดสอบจะได้รับการประเมิน สำหรับการดูผลลัพธ์ที่เป็นข้อความ ให้ใช้คำสั่งอย่างใดอย่างหนึ่งต่อไปนี้จากคอนโซล Rails
หลังจากดำเนินการสำเร็จไม่กี่ครั้งและเกิดข้อผิดพลาดขึ้นหนึ่งครั้ง ต่อไปนี้คือตัวอย่างลักษณะของสรุปผลลัพธ์ มีภาพรวมของความสำเร็จและความล้มเหลว รวมถึงแผนภูมิ ASCII ที่แสดงความแตกต่างของประสิทธิภาพ
Blazer gem เป็นวิธีที่ดีในการวิเคราะห์ผลลัพธ์ได้อย่างง่ายดาย ติดตั้งง่ายและอนุญาตให้เรียกใช้คำสั่ง SQL กับตารางได้ ข้อความค้นหาที่นี่แสดงให้เห็นว่าการใช้งานของผู้สมัครนั้นเร็วกว่าต้นฉบับอย่างมาก

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

กรณีการใช้งานและข้อจำกัดของนักวิทยาศาสตร์
กรณีการใช้งานที่เหมาะสมที่สุดสำหรับนักวิทยาศาสตร์ ได้แก่ การค้นหา การคำนวณ และโค้ดที่ไม่มีผลข้างเคียง โค้ดที่มีการอัพเดตธุรกรรมหรือการบูรณาการภายนอก เช่น อีเมลไม่เข้ากับโมเดลอย่างสมบูรณ์ เนื่องจากความสามารถถูกรันสองครั้ง (ทั้งการใช้งานเก่าและใหม่)
นี่ไม่ใช่ข้อจำกัดเล็กๆ น้อยๆ เนื่องจากจะขจัดกรณีการใช้งานหลายประการ อย่างไรก็ตาม มีวิธีแก้ไขชั่วคราวหากการทดสอบมีความสำคัญต่อความสำเร็จของคุณ พิจารณาว่าผลข้างเคียงมีความเกี่ยวข้องหรือว่าปัญหาที่ซ้ำซ้อนหรือไม่ ตัวอย่างเช่น ในบางกรณีอาจมีการส่งอีเมลสองฉบับในระหว่างการประเมินหรือไม่ อีกทางเลือกหนึ่งคือให้โค้ดใหม่กำหนดผลลัพธ์แต่ไม่ต้องคงอยู่ วิธีนี้จะช่วยป้องกันการเปรียบเทียบประสิทธิภาพที่มีความหมาย อย่างไรก็ตาม มันจะช่วยให้คุณสามารถตรวจสอบความถูกต้องได้
ข้อจำกัดอื่นๆ เกิดจากการที่นักวิทยาศาสตร์ให้ความสำคัญกับค่าที่ส่งคืน ในบางกรณี ผลลัพธ์ที่ถูกต้องอาจแสดงความแตกต่างเมื่อเวลาผ่านไป ไม่ว่าจะเป็นเพียงการประทับเวลาในการตอบสนองหรือปัจจัยบางอย่างอาจแตกต่างกันไป ในหลายกรณี เราสามารถเขียนตรรกะการเปรียบเทียบที่กำหนดเองในการทดสอบเพื่อตรวจสอบความถูกต้องมากกว่าการเปรียบเทียบสตริงพื้นฐาน
สุดท้ายนี้ ข้อจำกัดของ LabTech ก็คือยังไม่ได้ถูกย้ายไปยัง Rails 7 ณ เวลาที่เขียน
แนวทางปฏิบัติที่ดีที่สุดสำหรับการทดลองของนักวิทยาศาสตร์ที่มีประสิทธิภาพใน Rails
พิจารณารายการเหล่านี้เมื่อดำเนินการทดสอบของคุณ:
- ในโครงการ Rails นักวิทยาศาสตร์สามารถกำหนดค่าในเครื่องมือเริ่มต้นหรือ wrapper เช่น Rails LabTech gem แอปพลิเคชัน Rails ส่วนใหญ่มีฐานข้อมูลอยู่แล้ว ดังนั้น LabTech จึงใช้ประโยชน์จาก ActiveRecord เพื่อจัดเก็บผลลัพธ์
- เพื่อหลีกเลี่ยงการชะลอการพัฒนาและการทดสอบ ให้เปิดใช้การทดสอบเฉพาะในสภาพแวดล้อมชั่วคราวและการใช้งานจริงเท่านั้น
- เพื่อลดผลกระทบที่อาจเกิดขึ้นกับการใช้งานจริง ให้ทำการทดสอบตามเปอร์เซ็นต์ของคำขอเท่านั้น LabTech รองรับสิ่งนี้ทันทีเป็นพารามิเตอร์ทางเลือกเมื่อคุณเปิดใช้งานการทดสอบ (ในตอนแรกจะถูกปิดใช้งานโดยค่าเริ่มต้น) การใช้นักวิทยาศาสตร์ล้วนๆ ทำให้ตรรกะนี้เขียนโค้ดได้ง่ายใน
enabled?ของการทดลอง วิธีการ. - ตรรกะบางอย่างต้องใช้ทรัพยากรมาก ดังนั้นอัตราการสุ่มตัวอย่างต่ำอาจเป็นจุดเริ่มต้นที่ดี เมื่อคุณมั่นใจในผลลัพธ์แล้ว ให้เพิ่มเปอร์เซ็นต์คำขอที่ได้รับการประเมิน
- คุณสามารถเพิ่มแอตทริบิวต์บริบทเพื่อให้ได้ประโยชน์สูงสุดจากผลลัพธ์ของคุณ บริบทการทดสอบสามารถตั้งค่าเป็นแฮชที่คีย์สัญลักษณ์ของข้อมูลที่เผยแพร่แล้วในผลลัพธ์ที่เผยแพร่ เช่น:
สรุป:สังเกตและติดตามแอป Ruby ของคุณกับนักวิทยาศาสตร์
ในโพสต์นี้ เราได้สำรวจวิธีการใช้อัญมณีนักวิทยาศาสตร์เพื่อเปลี่ยนแปลง โยกย้าย และปรับโครงสร้างโค้ด Ruby ในการใช้งานจริง
เราตรวจสอบต้นกำเนิดของนักวิทยาศาสตร์ในสาขาด้วยรูปแบบนามธรรม จากนั้นจึงดำดิ่งลงสู่การปรับโครงสร้างใหม่ ต่อไป เราได้เห็นว่า LabTech สามารถช่วยรวบรวมผลลัพธ์และโครงร่างนักวิทยาศาสตร์ของคุณได้อย่างไร
จากนั้น เราได้กล่าวถึงข้อจำกัดบางประการของนักวิทยาศาสตร์ ก่อนที่จะสรุปแนวทางปฏิบัติที่ดีที่สุดบางประการในที่สุด
คุณต้องสังเกตและติดตามสิ่งที่เกิดขึ้นในระบบของคุณ รวมนักวิทยาศาสตร์เข้ากับกระบวนการพัฒนาของคุณเพื่อทำการเปลี่ยนแปลงที่สำคัญในโค้ด Ruby ของคุณด้วยความมั่นใจมากขึ้น
ขอให้สนุกกับการเขียนโค้ด!
ปล. หากคุณต้องการอ่านโพสต์ Ruby Magic ทันทีที่เผยแพร่ สมัครรับจดหมายข่าว Ruby Magic ของเราและไม่พลาดแม้แต่โพสต์เดียว! ป>
ดาร์เรน บรอมเมอร์
ดาร์เรนสนุกกับการสร้างแรงบันดาลใจผ่านคำเขียนและทำให้สิ่งที่ซับซ้อนเข้าใจง่าย ความสนใจของเขารวมถึงวิทยาศาสตร์และฟิสิกส์ และมีคณิตศาสตร์เพียงพอที่จะเข้าใจทั้งสองอย่าง เขาสร้างโซลูชันเนื้อหาและเทคโนโลยีคุณภาพสูง และทวีตเกี่ยวกับเนื้อหาดังกล่าวเป็นครั้งคราว
บทความทั้งหมดโดย Darren Broemmer