วิศวกรซอฟต์แวร์ถกเถียงว่าทักษะการทดสอบสำคัญกว่าความรู้อัลกอริทึมสำหรับความสำเร็จในอาชีพหรือไม่

ทีมชุมชน BigGo
วิศวกรซอฟต์แวร์ถกเถียงว่าทักษะการทดสอบสำคัญกว่าความรู้อัลกอริทึมสำหรับความสำเร็จในอาชีพหรือไม่

การถกเถียงที่ร้อนแรงได้เกิดขึ้นในชุมชนวิศวกรรมซอฟต์แวร์เกี่ยวกับว่านักพัฒนาควรให้ความสำคัญกับการเรียนรู้วิธีการทดสอบมากกว่าความรู้เชิงลึกเกี่ยวกับโครงสร้างข้อมูลและอัลกอริทึม ( DSA ) หรือไม่ การถกเถียงนี้มุ่งเน้นไปที่ทักษะใดที่สำคัญที่สุดสำหรับงานเขียนโปรแกรมในแต่ละวันและการก้าวหน้าในอาชีพ

ความแตกแยกครั้งใหญ่: การพัฒนาโครงสร้างพื้นฐานเทียบกับการพัฒนาแอปพลิเคชัน

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

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

การอภิปรายแสดงให้เห็นว่าประสบการณ์หล่อหลอมมุมมองอย่างมาก วิศวกรที่เคยทำงานกับเอนจิ้นฐานข้อมูล คอมไพเลอร์ หรือเครื่องมือการคำนวณทางวิทยาศาสตร์มอง DSA เป็นพื้นฐาน ผู้ที่สร้างแอปพลิเคชันที่หันหน้าเข้าหาลูกค้า เว็บไซต์อีคอมเมิร์ซ หรือซอฟต์แวร์ทางธุรกิจพบว่าวิธีการทดสอบมีประโยชน์มากกว่า

ผลกระทบต่อสายอาชีพแยกตามประเภทการพัฒนา:

  • Infrastructure/Systems: ความรู้ DSA เชิงลึกมีความสำคัญอย่างยิ่ง การทดสอบมีความสำคัญแต่เป็นรองลงมา
  • Web Applications: ทักษะการทดสอบเป็นหลัก ความเข้าใจ DSA ในระดับพื้นฐานก็เพียงพอ
  • Scientific Computing: ทั้ง DSA และการทดสอบมีความสำคัญเท่าเทียมกัน
  • Enterprise Software: منهجية การทดสอบมีคุณค่ามากที่สุด การปรับปรุงประสิทธิภาพเป็นเรื่องเป็นครั้งคราว
  • Game Development: ความรู้ DSA ที่เน้นประสิทธิภาพมีความจำเป็นอย่างยิ่ง

การทดสอบเป็นความจริงประจำวันเทียบกับ DSA เป็นความต้องการเป็นครั้งคราว

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

แนวทางการพัฒนาสมัยใหม่ยังเปลี่ยนภูมิทัศน์ด้วย ภาษาการเขียนโปรแกรมส่วนใหญ่ในปัจจุบันมีไลบรารีมาตรฐานที่แข็งแกร่งพร้อมโครงสร้างข้อมูลที่ปรับให้เหมาะสม ความจำเป็นในการใช้งาน hash table หรืออัลกอริทึมการเรียงลำดับตั้งแต่เริ่มต้นได้หายไปส่วนใหญ่สำหรับนักพัฒนาส่วนใหญ่

การทดสอบไม่เพียงแต่ให้ความมั่นใจในโค้ดของคุณมากขึ้น แต่ยังช่วยให้คุณเขียนโค้ดที่ดีกว่าตั้งแต่แรก

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

ทักษะการทดสอบที่สำคัญสำหรับการพัฒนาอาชีพ:

  • การทดสอบหน่วยย่อยและการพัฒนาแบบขับเคลื่อนด้วยการทดสอบ ( TDD )
  • การทดสอบแบบบูรณาการและการทดสอบแบบครบวงจร
  • การวิเคราะห์ความครอบคลุมของโค้ดและเมตริกการทดสอบที่มีความหมาย
  • รูปแบบการออกแบบการทดสอบและแนวทางปฏิบัติที่ดี
  • วิธีการดีบักและแก้ไขปัญหา
  • เทคนิคการทดสอบแบบ property-based และ fuzz testing

ความไม่ตรงกันระหว่างการจ้างงานและการศึกษา

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

สิ่งนี้สร้างวงจรที่น่าหงุดหงิดที่นักพัฒนาใหม่ใช้เวลาหลายเดือนในการฝึกฝนเว็บไซต์ท้าทายการเขียนโค้ดแทนที่จะเรียนรู้ทักษะปฏิบัติเช่นการพัฒนาแบบ test-driven เทคนิคการดีบัก หรือหลักการออกแบบระบบที่จะให้บริการพวกเขาได้ดีกว่าในอาชีพ

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

ความรู้ DSA ที่จำเป็นสำหรับนักพัฒนาส่วนใหญ่:

  • โครงสร้างข้อมูลพื้นฐาน: arrays, hash tables, linked lists, trees
  • ความเข้าใจเรื่อง time complexity (สัญกรณ์ Big O)
  • การแลกเปลี่ยนระหว่างโครงสร้างข้อมูลที่แตกต่างกัน
  • เมื่อไหร่ควรใช้การใช้งานแบบ built-in เทียบกับ custom implementations
  • ผลกระทบด้านประสิทธิภาพของการเลือกใช้อัลกอริทึม

การหาสมดุลที่เหมาะสม

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

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

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

อ้างอิง: Testing is better than DSA