AI ได้เปลี่ยนแปลงสิ่งที่วิศวกรควรบันทึกไว้เอง GitHub Copilot, Cursor, และ Mintlify สามารถสร้างเอกสารเบื้องต้นได้: คำอธิบายพารามิเตอร์, สรุปฟังก์ชัน, และโครงสร้าง README สิ่งที่พวกเขาไม่สามารถเขียนได้คือ ชั้นเจตนา: การตัดสินใจที่ทำ, ข้อแลกเปลี่ยนที่ยอมรับ, ข้อจำกัดที่สำคัญ, และทางเลือกที่ทีมปฏิเสธ
โค้ดแสดงพฤติกรรม แต่มันแทบไม่รักษาเหตุผลไว้ เหตุผลนั้นมักจะอยู่ในเธรด Slack, ความคิดเห็นในตั๋ว, การทบทวนเหตุการณ์ หรือความทรงจำของใครบางคน
การสำรวจนักพัฒนาประจำปี 2024 ของ Stack Overflow พบว่า61% ของนักพัฒนาอาชีพใช้เวลาเกิน 30 นาทีต่อวันในการค้นหาคำตอบในที่ทำงาน โดยหนึ่งในสี่ใช้เวลาเกินหนึ่งชั่วโมง แน่นอนว่าการค้นหาบางอย่างไม่สามารถหลีกเลี่ยงได้ แต่สิ่งที่เสียไปอย่างแท้จริงคือบริบทของสปรินต์ที่ไม่เคยถูกบันทึกไว้ในเอกสาร
คู่มือนี้แสดงสิ่งที่วิศวกรควรเขียนด้วยตัวเอง สิ่งที่ AI สามารถช่วยได้ และวิธีทำให้เอกสารโค้ดมีประโยชน์หลังจากสิ้นสุดสปรินต์
สรุปสั้น
AI สามารถร่างเอกสารในระดับกลไกได้ เช่น docstrings, ประเภทพารามิเตอร์, สรุปฟังก์ชัน และโครงร่าง README อย่างไรก็ตาม วิศวกรยังคงต้องเขียนเอกสารในระดับเจตนา ได้แก่ การตัดสินใจ, ข้อแลกเปลี่ยน, ข้อจำกัด และตัวเลือกที่ถูกปฏิเสธที่อยู่เบื้องหลังโค้ด
วิศวกรควรยังคงเขียนสิ่งนั้นด้วยตัวเองในบันทึกการตัดสินใจทางสถาปัตยกรรม, คำอธิบาย PR และความคิดเห็นเกี่ยวกับเหตุผลที่แนบมากับโค้ด การป้องกันในชั้นเจตนาจะป้องกันไม่ให้ผู้พัฒนาคนต่อไปต้องย้อนกลับการตัดสินใจจากชื่อตัวแปร, ข้อความการคอมมิต และ PR เก่า AI สามารถร่างส่วนที่เป็นกิจวัตรได้: ประเภทพารามิเตอร์, คำอธิบายการคืนค่า และสรุปฟังก์ชันพื้นฐาน
เอกสารประกอบโค้ดควรอธิบายอะไรบ้าง?
เอกสารประกอบโค้ดควรช่วยให้ผู้พัฒนาคนต่อไปเข้าใจว่าโค้ดทำอะไร ใช้อย่างไรอย่างปลอดภัย และทำไมจึงถูกสร้างขึ้นในลักษณะนั้น เอกสารนี้จะปรากฏในสองที่: ภายในไฟล์ซอร์สโค้ดในรูปแบบของความคิดเห็นและ docstrings และภายนอกไฟล์ซอร์สโค้ดในรูปแบบของ READMEs, เอกสารอ้างอิง API, runbooks และบันทึกเกี่ยวกับสถาปัตยกรรม
โค้ดเบสส่วนใหญ่มักจะอ่านยากขึ้นเมื่อบริบทของการตัดสินใจหายไป นักพัฒนาคนแรกอาจได้ทำการแลกเปลี่ยนที่ชาญฉลาดไว้ แต่ผู้พัฒนาคนถัดไปจะเห็นเพียงผลลัพธ์เท่านั้น ไม่ใช่เหตุผลเบื้องหลัง
ผลลัพธ์: สมาชิกทีมใหม่ทุกคนต้องถอดรหัสเจตนาจากชื่อตัวแปร ข้อความคอมมิต และ PR เก่า ซึ่งทำให้การเรียนรู้งาน การตรวจสอบ การแก้ไขข้อผิดพลาด และการเปลี่ยนแปลงในอนาคตในพื้นที่เดียวกันช้าลง
เอกสารที่ดีจะตอบคำถามสี่ข้อ:
- โค้ดนี้สำหรับใคร? นักพัฒนาภายใน ผู้ร่วมพัฒนาโอเพนซอร์ส ผู้ใช้บริการ API ภายนอก หรือผู้ใช้ปลายทาง
- มันแก้ปัญหาอะไร? ความต้องการทางธุรกิจหรือทางเทคนิคที่อยู่เบื้องหลังโมดูล
- ทำไมถึงเลือกแนวทางนี้? ทางเลือกที่พิจารณาและข้อแลกเปลี่ยนที่ยอมรับ
- ชิ้นส่วนที่เกี่ยวข้องอยู่ที่ไหน? โมดูลที่พึ่งพา, บริการต้นน้ำ, การตัดสินใจด้านสถาปัตยกรรม, ตั๋วงาน, และคู่มือการดำเนินงาน
คำถามว่า "ทำไม" สมควรได้รับความสนใจจากความเป็นมนุษย์มากที่สุด
การค้นหาเป็นภาระงานความรู้ที่สำคัญนอกเหนือจากงานวิศวกรรมอยู่แล้ว การสำรวจการจัดการความรู้ของ ClickUp พบว่า 57% ของพนักงานเสียเวลาในการค้นหาเอกสารภายในหรือฐานความรู้เพื่อหาข้อมูลที่เกี่ยวข้องกับงาน เมื่อพวกเขาไม่สามารถหาสิ่งที่ต้องการได้ 1 ใน 6 คนจะหันไปใช้ทางแก้ปัญหาส่วนตัว: การค้นหาอีเมลเก่า บันทึก หรือภาพหน้าจอ
เอกสารประกอบโค้ดมีปัญหาในลักษณะเดียวกัน: หากนักพัฒนาไม่สามารถหาคำอธิบายได้ คำอธิบายนั้นก็เหมือนกับไม่มีอยู่เลย
ต้นทุนของการทำผิดพลาดนั้นสูงมากผู้แสดงความคิดเห็นใน r/AskProgrammingคนหนึ่งได้อธิบายถึงกระบวนการทำงานของ RPA ที่ปุ่มซึ่งไม่ได้มีการบันทึกไว้เกือบจะทำให้เกิดการเรียกเก็บเงินอัตโนมัติจากธนาคารและจดหมายแจ้งลูกค้า
การค้นหาเป็นภาระงานความรู้ที่สำคัญนอกเหนือจากงานวิศวกรรมอยู่แล้ว การสำรวจการจัดการความรู้ของ ClickUp พบว่า 57% ของพนักงานเสียเวลาในการค้นหาเอกสารภายในหรือฐานความรู้เพื่อหาข้อมูลที่เกี่ยวข้องกับงาน เมื่อพวกเขาไม่สามารถหาสิ่งที่ต้องการได้ 1 ใน 6 คนจะหันไปใช้ทางแก้ปัญหาส่วนตัว: การค้นหาอีเมลเก่า บันทึก หรือภาพหน้าจอ
เอกสารประกอบโค้ดมีปัญหาในลักษณะเดียวกัน: หากนักพัฒนาไม่สามารถหาคำอธิบายได้ คำอธิบายนั้นก็เหมือนกับไม่มีอยู่เลย
ต้นทุนของการทำผิดพลาดนั้นสูงมากผู้แสดงความคิดเห็นใน r/AskProgrammingคนหนึ่งได้อธิบายถึงกระบวนการทำงานของ RPA ที่ปุ่มซึ่งไม่ได้มีการบันทึกไว้เกือบจะเรียกเก็บค่าธรรมเนียมอัตโนมัติจากธนาคารและส่งผลให้ต้องส่งจดหมายถึงลูกค้า
ประเภทหลักของเอกสารประกอบโค้ดมีอะไรบ้าง?
ประเภทหลักทั้งห้าคือ ความคิดเห็นแบบอินไลน์, docstrings, ไฟล์ README,วิกิภายใน, และเอกสารประกอบ API ภายนอก แต่ละประเภทมีผู้อ่านที่แตกต่างกันและใช้ในช่วงเวลาที่ต่างกัน การผสมผสานพวกมันเข้าด้วยกันทำให้เอกสารยากต่อการเขียนและยากต่อการใช้งาน ไฟล์ README ที่อ่านเหมือน docstring จะทำให้ผู้ร่วมงานใหม่ลดลง ส่วน docstring ที่อ่านเหมือนหน้าวิกิจะกลายเป็นภาระในไฟล์ต้นฉบับ
ความคิดเห็นในบรรทัดและเอกสารประกอบ
ความคิดเห็นแบบอินไลน์ควรอธิบายเหตุผลที่ไม่ชัดเจน ความคิดเห็นที่กล่าวซ้ำว่า x = x + 1 ว่า "เพิ่ม x" ไม่ได้เพิ่มข้อมูลใหม่ ความคิดเห็นที่ระบุว่า "ออฟเซ็ตสำหรับ API ที่ใช้ดัชนีเป็นศูนย์" มีประโยชน์เพราะโค้ดไม่สามารถแสดงข้อจำกัดภายนอกนั้นได้ เก็บความคิดเห็นแบบอินไลน์ไว้สำหรับตรรกะที่ไม่ชัดเจนภายในตัวฟังก์ชันเท่านั้น
Docstrings คือคำอธิบายที่มีโครงสร้างซึ่งแนบอยู่กับฟังก์ชัน, คลาส, หรือโมดูล พวกมันครอบคลุมถึงพารามิเตอร์, ค่าที่คืนกลับ, ข้อยกเว้น, และตัวอย่างการใช้งาน แต่ละภาษาจะมีกฎเกณฑ์ของตัวเอง ให้ปฏิบัติตามกฎเกณฑ์ที่ภาษาของคุณคาดหวังไว้: PEP 257 สำหรับ docstrings ของ Python, Javadoc สำหรับ Java, และ JSDoc สำหรับ JavaScript และ TypeScript
เปรียบเทียบสองสิ่งนี้:
เอกสารประกอบฟังก์ชันไม่เพียงพอ:
เอกสารประกอบโค้ดที่ชัดเจน:
ชื่อที่สองระบุฟังก์ชันอย่างชัดเจน เอกสารพารามิเตอร์ของมัน และแสดงสมมติฐาน: กระบวนการเช็คเอาต์ใช้ภาษีในอัตรา 8.25%
เอกสาร README, วิกิ และเอกสารภายนอก
ไฟล์ README ควรตอบคำถามห้าข้อตามลำดับ: โครงการนี้ทำอะไร? ฉันจะติดตั้งมันได้อย่างไร? ฉันจะใช้มันได้อย่างไร? ฉันจะช่วยเหลือได้อย่างไร? ฉันจะขอความช่วยเหลือได้ที่ไหน? หากผู้ช่วยเหลือใหม่ไม่สามารถหาเส้นทางติดตั้งได้อย่างรวดเร็ว แสดงว่าไฟล์ README นั้นมีข้อมูลมากเกินไปหรือจัดลำดับไม่ดี
วิกิและฐานความรู้ทำงานได้ดีที่สุดสำหรับเนื้อหาที่ครอบคลุมหลายแหล่งข้อมูลหรือบริการ: การตัดสินใจด้านสถาปัตยกรรม, คู่มือการเริ่มต้นใช้งาน, และคู่มือการดำเนินงาน วิกิที่ไม่มีใครลิงก์จากโค้ดจะกลายเป็นปัญหาการค้นหาครั้งที่สอง
เอกสารภายนอกครอบคลุมถึงเอกสารอ้างอิง API, คู่มือ SDK, และเอกสารที่ผู้ใช้สามารถมองเห็นได้ เอกสารเหล่านี้มีไว้สำหรับผู้ใช้โค้ดของคุณ ไม่ใช่ผู้ช่วยเหลือในการพัฒนา เอกสารภายนอกต้องการรายละเอียดการตั้งค่าเพิ่มเติม ขั้นตอนการตรวจสอบสิทธิ์ที่ชัดเจนขึ้น และโครงสร้างแบบอ้างอิง เนื่องจากผู้อ่านอาจไม่รู้จักโค้ดของคุณเลย
หากทีมยังไม่มีโครงสร้าง ให้เริ่มต้นด้วยเทมเพลตเอกสารทางเทคนิคสำหรับสถาปัตยกรรมและบันทึกการตั้งค่า หรือเทมเพลตเอกสารโครงการสำหรับเป้าหมาย เจ้าของงาน หลักชัย และการตัดสินใจ ปรับเปลี่ยนส่วนต่างๆ แทนที่จะคิดรูปแบบขึ้นมาใหม่ทั้งหมด
| ประเภท | กลุ่มเป้าหมายหลัก | ความถี่ในการอัปเดต | ตำแหน่งทั่วไป |
|---|---|---|---|
| ความคิดเห็นแบบอินไลน์ | นักพัฒนาที่กำลังอ่านเส้นทางโค้ดเฉพาะ | เมื่อพฤติกรรมของโค้ดเปลี่ยนแปลง | ไฟล์ต้นฉบับ |
| เอกสารประกอบฟังก์ชัน | นักพัฒนาที่เรียกใช้ฟังก์ชัน, คลาส, หรือโมดูล | เมื่ออินเทอร์เฟซเปลี่ยนแปลง | ไฟล์ต้นฉบับ |
| อ่านก่อนใช้งาน | ผู้ร่วมสมทบและผู้ประเมินใหม่ | ต่อการออกเวอร์ชันหลักหรือการเปลี่ยนแปลงโครงการ | รากของที่เก็บ |
| วิกิหรือฐานความรู้ | ทีมภายในและผู้มีส่วนได้ส่วนเสียข้ามทีม | เมื่อการตัดสินใจหรือกระบวนการเปลี่ยนแปลง | วิกิหรือฐานความรู้ที่ใช้ร่วมกันของคลังข้อมูล |
| เอกสาร API ภายนอก | ผู้ใช้ API และผู้ใช้ปลายทาง | ต่อเวอร์ชันการปล่อยหรือเวอร์ชัน API | แพลตฟอร์มเอกสาร |
คุณเขียนเอกสารอย่างไรในปัจจุบัน?
ใช้ AI สำหรับส่วนที่สามารถร่างได้ ใช้เวลาของมนุษย์ในการตัดสินใจ ข้อจำกัด และการแลกเปลี่ยน
ขณะนี้ AI สามารถร่างงานเชิงกลไกส่วนใหญ่ได้แล้ว เช่น ประเภทพารามิเตอร์ คำอธิบายการคืนค่า และสรุปฟังก์ชันพื้นฐาน งานเอกสารของมนุษย์แบ่งออกเป็นสองประเภท
เขียนโค้ดที่บันทึกตัวเองไว้ก่อน
เอกสารที่ดีที่สุดคือโค้ดที่แทบไม่ต้องการเอกสารประกอบ ชื่อที่อธิบายชัดเจน ฟังก์ชันที่มีวัตถุประสงค์เดียว และมาตรฐานที่ใช้อย่างสม่ำเสมอ จะช่วยลดภาระในการเขียนเอกสารได้ก่อนที่คุณจะเขียนคอมเมนต์แม้แต่บรรทัดเดียว
โค้ดที่มีการบันทึกตัวเองช่วยให้พฤติกรรมของโค้ดอ่านง่ายขึ้น แต่มักไม่ได้อธิบายเหตุผลเบื้องหลังพฤติกรรมนั้น ชื่อช่วยให้นักพัฒนาสามารถระบุได้ว่าสิ่งนั้นทำอะไร เอกสารประกอบควรอธิบายเหตุผลที่การตั้งชื่อไม่สามารถครอบคลุมได้
ก่อนที่จะเพิ่มความคิดเห็น ให้พิจารณาว่าการเปลี่ยนชื่อตัวแปรหรือการแยกฟังก์ชันจะทำให้ความคิดเห็นนั้นไม่จำเป็นหรือไม่ หากคำตอบคือใช่ ให้ทำการปรับปรุงโครงสร้างก่อน ชื่อที่ชัดเจนจะช่วยกำจัดความคิดเห็นที่เพียงแค่แปลชื่อที่ไม่ดี
ก่อน:
หลังจาก:
เวอร์ชันที่ปรับโครงสร้างใหม่สื่อสารข้อมูลเดียวกันผ่านการตั้งชื่อเพียงอย่างเดียว ความคิดเห็นที่มีประโยชน์เพียงอย่างเดียวในตอนนี้คืออธิบายว่าทำไมบทบาทบางอย่างจึงถูกยกเว้น ซึ่งเป็นการตัดสินใจเชิงนโยบายที่โค้ดไม่สามารถแสดงออกได้ด้วยตัวเอง
เขียนชั้นเจตนา (ส่วนที่ AI ไม่สามารถทำได้)
การนำไปใช้สามารถมองเห็นได้ในโค้ด ความตั้งใจจะหายไปหากไม่มีใครบันทึกไว้ โค้ดมักไม่เก็บรักษาเหตุผลว่าทำไมจึงมีการตัดสินใจแลกเปลี่ยน ข้อจำกัดใดที่ผลักดันการออกแบบ หรือทางเลือกใดที่ถูกปฏิเสธ
กฎทั่วไปของนักพัฒนาที่สะท้อนสิ่งนี้ได้ดีคือ: จดบันทึกเหตุผล ไม่ใช่แค่ผลลัพธ์ความคิดเห็นที่ได้รับโหวตสูงสุดใน r/coding:
ฉันสามารถอ่านได้ว่าเงื่อนไขนี้เป็นการแยกเส้นทางระหว่างผู้ใช้สีแดงกับผู้ใช้สีน้ำเงิน กรุณาบอกเหตุผลว่าทำไมผู้ใช้ถึงถูกจัดประเภทในลักษณะนี้ และทำไมเราจึงแยกเส้นทางระหว่างทั้งสองกลุ่ม
ฉันสามารถอ่านได้ว่าเงื่อนไขนี้ทำการแยกเส้นทางระหว่างผู้ใช้สีแดงกับผู้ใช้สีน้ำเงิน กรุณาบอกเหตุผลว่าทำไมผู้ใช้ถึงถูกจัดประเภทในลักษณะนี้ และทำไมเราจึงแยกเส้นทางระหว่างกลุ่มผู้ใช้ทั้งสอง
ข้อความในการคอมมิตอาจช่วยในระหว่างการตรวจสอบ แต่ไม่ใช่ที่เก็บเหตุผลในการออกแบบที่ดีในระยะยาว เพราะผู้อ่านในอนาคตมักจะไม่พบมันในช่วงเวลาที่พวกเขาต้องการ
วิล ลาร์สัน อดีตประธานเจ้าหน้าที่ฝ่ายเทคโนโลยีของ Calm และผู้เขียนหนังสือ An Elegant Puzzle ได้เขียนเกี่ยวกับคุณค่าของบันทึกการตัดสินใจด้านสถาปัตยกรรม (Architecture Decision Records) เนื่องจากบันทึกเหล่านี้ช่วยรักษาเหตุผลทางวิศวกรรมไว้ภายนอกฐานโค้ด
ADR มีประโยชน์เพราะให้เหตุผลในการออกแบบมีที่อยู่อันมั่นคง หากทีมของคุณไม่มีรูปแบบ ให้ยืมเทมเพลต ADR ที่เบา: การตัดสินใจ, บริบท, ตัวเลือกที่พิจารณา, ข้อแลกเปลี่ยน, และผลกระทบ
ให้เอกสารของคุณมุ่งเน้นไปที่หมวดหมู่ต่อไปนี้:
- การตัดสินใจในการออกแบบและทางเลือก: "เราเลือกใช้แคชแบบเขียนผ่าน (write-through cache) แทนแคชแบบเขียนกลับ (write-back cache) เนื่องจากความสอดคล้องของข้อมูลมีความสำคัญมากกว่าความล่าช้าในการเขียนสำหรับกระบวนการชำระเงินนี้"
- ข้อจำกัดที่ทราบ: หนี้ทางเทคนิค, ข้อจำกัดในการขยาย, การแก้ไขชั่วคราว, หรือพื้นที่ที่ต้องการการปรับปรุงในอนาคต
- สมมติฐาน: รูปแบบข้อมูลที่คาดหวัง ข้อกำหนดของสภาพแวดล้อม หรือความพึ่งพาจากระบบต้นทางที่โค้ดไม่ได้บังคับใช้
- เอกสารอ้างอิง: ลิงก์ไปยังตั๋วที่เกี่ยวข้อง, RFCs, หรือบันทึกการตัดสินใจทางสถาปัตยกรรม (ADRs) ที่อธิบายบริบทที่กว้างขึ้น
บริบทที่แตกต่างกันต้องการบ้านที่แตกต่างกัน Docstrings จับความตั้งใจในระดับฟังก์ชัน ความคิดเห็นในโค้ดจัดการเหตุผลในระดับบรรทัด คำอธิบาย PR ให้บริบทในระดับการเปลี่ยนแปลง ADR จัดการการตัดสินใจในระดับระบบ ข้อความ commit ช่วยได้เช่นกัน แต่ไม่ควรเป็นบันทึกเดียวของการตัดสินใจที่สำคัญ
รูปแบบที่ไม่พึงประสงค์ที่พบบ่อย: การบันทึกวิธีการทำงานของอัลกอริทึมการเรียงลำดับทีละบรรทัด คำถามที่แท้จริงคือทำไมจึงเลือกใช้การเรียงลำดับแบบกำหนดเองแทนที่จะใช้ไลบรารีมาตรฐาน สำหรับเส้นทางโค้ดที่กำหนดเอง ให้บันทึกการตัดสินใจที่อยู่เบื้องหลังการดำเนินการ
อะไรคือแนวทางปฏิบัติที่ดีที่สุดในการจัดทำเอกสาร?
การปฏิบัติห้าประการช่วยให้เอกสารมีแนวโน้มที่จะยังคงมีประโยชน์หลังจากสิ้นสุดสปรินต์ คำแนะนำเกี่ยวกับเอกสารส่วนใหญ่ขึ้นอยู่กับนิสัยเหล่านี้ที่ทำงานก่อน
- บันทึกขณะที่คุณเขียนโค้ด ไม่ใช่หลังจากนั้น บริบทเสื่อมสลายอย่างรวดเร็ว ภายในสปรินต์ถัดไป คุณอาจลืมไปแล้วว่าเลือกไม่ใช้อะไรและเพราะเหตุใด ให้เขียนเหตุผลไว้ในคอมมิตเดียวกันกับโค้ด มิฉะนั้นคุณอาจไม่ได้เขียนมันเลย
- ใช้คู่มือสไตล์ที่สอดคล้องกัน เลือกฟอร์แมต docstring แบบใดแบบหนึ่ง เช่น สไตล์ Google, NumPy, Javadoc หรือ JSDoc และบังคับใช้ในกระบวนการตรวจสอบโค้ดหรือการตรวจสอบด้วยเครื่องมือ linting ความสม่ำเสมอสำคัญกว่าการเลือกฟอร์แมตใดฟอร์แมตหนึ่ง คู่มือสไตล์ที่ใช้ร่วมกันจะช่วยขจัดคำถามที่ว่า "ควรจัดรูปแบบนี้อย่างไร?" และทำให้การตรวจสอบด้วยเครื่องมือ linting เป็นไปโดยอัตโนมัติ
- ให้เอกสารเป็นส่วนหนึ่งของการตรวจสอบโค้ด เพิ่มการตรวจสอบเอกสารลงในรายการตรวจสอบ PR ของคุณ หาก PR มีการเปลี่ยนแปลงพฤติกรรม ผู้ตรวจสอบควรตรวจสอบให้แน่ใจว่าเอกสารสะท้อนถึงการเปลี่ยนแปลงนั้น เอกสารแนวทางปฏิบัติทางวิศวกรรมของ Google ขอให้ผู้ตรวจสอบตรวจสอบว่าโค้ดได้รับการบันทึกไว้อย่างเหมาะสมหรือไม่ ใช้กฎเดียวกันภายในองค์กร: หาก PR มีการเปลี่ยนแปลงพฤติกรรม ผู้ตรวจสอบควรตรวจสอบว่าความคิดเห็น, docstrings, READMEs และ runbooks ยังคงตรงกัน
- ลบเอกสารที่ล้าสมัย เอกสารที่ล้าสมัยสร้างความเสียหายจริงเพราะทำให้ผู้อ่านนำไปใช้ในวิธีที่ไม่ถูกต้อง หรือใช้ API หรือกระบวนการที่ไม่เหมาะสม ควรตรวจสอบเอกสารทุกไตรมาสหรือก่อนการปล่อยเวอร์ชันหลักทุกครั้ง มอบหมายผู้รับผิดชอบเพื่อให้เอกสารไม่ใช่ความรับผิดชอบของทุกคนและไม่มีใครรับผิดชอบ
- เก็บตัวอย่างให้สามารถรันได้ ตัวอย่างโค้ดควรคัดลอก รัน และทดสอบได้ง่าย นั่นคือวิธีที่ปลอดภัยที่สุดในการตรวจจับความคลาดเคลื่อนก่อนที่ผู้ใช้จะพบ
เครื่องมือใดที่คุณควรใช้เพื่อสร้างเอกสารประกอบโค้ด?
เครื่องมือเอกสารสามารถแบ่งออกเป็นสองกลุ่ม: ตัวสร้างแบบดั้งเดิมและผู้ช่วย AI. พวกมันทำหน้าที่ต่างกัน.
ตัวสร้างแบบดั้งเดิม จะแยกวิเคราะห์ความคิดเห็นที่มีโครงสร้างในแหล่งข้อมูลของคุณและสร้างการอ้างอิงที่สามารถเรียกดูได้ ตัวสร้างที่เหมาะสมมักขึ้นอยู่กับภาษาของคุณ
| เครื่องมือ | ภาษา/ระบบนิเวศ | สิ่งที่มันสร้างขึ้น |
|---|---|---|
| จาเวด็อก | Java | อ้างอิง API จากความคิดเห็นในเอกสาร |
| JSDoc | JavaScript/TypeScript | อ้างอิง API จากความคิดเห็นที่มีการอธิบาย |
| สฟิงซ์ | Python (รองรับอื่นๆ ผ่านปลั๊กอิน) | เว็บไซต์เอกสารฉบับสมบูรณ์จาก reStructuredText หรือ Markdown |
| ด็อกซีเจน | C, C++, Java, Python และอื่นๆ | เอกสารอ้างอิงข้ามภาษา |
| กอดอค | ไป | เอกสารแพ็กเกจจากความคิดเห็นในซอร์สโค้ด |
คุณภาพของผลลัพธ์ขึ้นอยู่กับ docstrings ของคุณทั้งหมด พวกมันจัดรูปแบบและเผยแพร่สิ่งที่คุณเขียน พวกมันไม่ได้สร้างเจตนาที่ขาดหายไป
ผู้ช่วยที่ขับเคลื่อนด้วย AI เพิ่มชั้นที่สอง GitHub Copilot, Cursor และ Windsurf สามารถร่างความคิดเห็นและ docstrings ภายในตัวแก้ไข Mintlify สามารถช่วยสร้างและรักษาเอกสารสำหรับนักพัฒนาจากโค้ดและเอกสารที่มีอยู่ Swimm มุ่งเน้นในการรักษาเอกสารภายในให้สอดคล้องกับการเปลี่ยนแปลงของโค้ด ReadMe และ GitBook ช่วยทีมเผยแพร่เอกสารอ้างอิง API และเอกสารสำหรับนักพัฒนา ซึ่งมักจะมีคุณสมบัติการค้นหาหรือการเขียนที่ช่วยด้วย AI
การศึกษาของ Stack Overflow พบว่าเอกสารประกอบเป็นหมวดหมู่ที่ ผู้พัฒนาขอความช่วยเหลือจากระบบอัตโนมัติด้วย AI บ่อยที่สุด โดยถูกอ้างถึงประมาณ33.9% ของคำตอบแบบเปิดจากนักพัฒนา เครื่องมือเหล่านี้มีประสิทธิภาพสูงสุดเมื่อซอร์สโค้ดได้เปิดเผยพฤติกรรมไว้อย่างชัดเจนแล้ว
AI จะอ่อนแอลงเมื่อคำอธิบายขึ้นอยู่กับการตัดสินใจที่ทำนอกฐานโค้ด: เช่น กระทู้ใน Slack, การประชุมวางแผน, ตั๋วงาน, หรือการทบทวนเหตุการณ์ AI สามารถสรุปฟังก์ชันได้ แต่ไม่สามารถรู้ได้ว่าข้อจำกัดใดที่สามารถเจรจาต่อรองได้, ตัวเลือกใดที่ถูกปฏิเสธ, หรือเหตุใดจึงยอมรับการแลกเปลี่ยนนั้น
ขั้นตอนการทำงานที่เป็นรูปธรรม:
- ให้ AI ร่างโครงสร้างเบื้องต้น: สรุปฟังก์ชัน, พารามิเตอร์, ค่าที่ส่งคืน และข้อยกเว้นทั่วไป
- ตรวจสอบเทียบกับพฤติกรรมของโค้ดจริง
- เพิ่มเหตุผล: การตัดสินใจ ข้อจำกัด สมมติฐาน หรือทางเลือกที่ถูกปฏิเสธ
- เขียน ADR สำหรับการตัดสินใจในระดับระบบ
- ห้ามเผยแพร่เอกสารที่สร้างโดย AI โดยไม่ผ่านการตรวจสอบ
ที่ที่ ClickUp เหมาะสมและที่ที่มันไม่เหมาะ
ClickUpไม่ใช่เครื่องมือสร้างเอกสารในระดับโค้ด มันจะไม่แทนที่ Javadoc, Sphinx, JSDoc หรือ Godoc แต่มันช่วยในการจัดทำเอกสารที่เกี่ยวข้องกับโค้ด: READMEs, runbooks, คู่มือการเริ่มต้นใช้งาน, ADRs และบันทึกการตัดสินใจที่ควรเชื่อมโยงกับงาน, ตั๋ว และสปรินต์ที่สร้างขึ้น
ClickUp Docsช่วยให้คุณร่างเอกสารเหล่านี้ไปพร้อมกับงานด้านวิศวกรรมของคุณ และClickUp Brainสามารถร่างเอกสารจากบริบทของงานหรือโครงการ จากนั้นนักพัฒนาสามารถเพิ่มเหตุผลในการตัดสินใจ ข้อจำกัด และการแลกเปลี่ยนต่างๆ ได้

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

หากปัญหาของคุณคือ "การอ้างอิง API ของเราล้าสมัย" นั่นเป็นปัญหาของตัวสร้างและการตรวจสอบ Sphinx, Javadoc, JSDoc หรือ Godoc จะช่วยได้มากกว่าเครื่องมือในเวิร์กสเปซ อย่าสับสนระหว่างสองสิ่งนี้
อะไรจะเปลี่ยนแปลงเมื่อ AI เขียนเอกสารส่วนใหญ่?
มีมุกตลกที่วนเวียนอยู่บ่อยครั้งในกระทู้ r/developersIndia, r/webdev และ r/AskProgramming เกี่ยวกับเอกสารทางวิศวกรรม เมื่อมีคนถามว่าทีมจัดการเอกสารอย่างไร คำตอบยอดนิยมมักจะประมาณว่า "ฉันคือเอกสาร"
มันตลกเพราะมันจริง หลายปีที่ผ่านมา วิธีแก้ปัญหาเอกสารที่ขาดหายไปก็คือวิศวกรที่บังเอิญจำได้
AI เปลี่ยนมาตรฐานพื้นฐาน มันสามารถร่างเอกสารที่เป็นกิจวัตรได้อย่างรวดเร็ว ซึ่งทำให้การตัดสินใจที่ไม่มีการบันทึกยากที่จะหาข้อแก้ตัว เมื่อ AI สามารถสร้างโครงสร้างพื้นฐานของเอกสารของคุณได้ในไม่กี่วินาที คำว่า "ฉันจะจำไว้เอง" จะไม่สามารถยอมรับได้อีกต่อไปในฐานะระบบบันทึกข้อมูลหลัก
นั่นทำให้หน้าที่ของวิศวกรเปลี่ยนไปสู่เจตนา การตัดสินใจ และการแลกเปลี่ยน: ส่วนของไวยากรณ์เพียงอย่างเดียวไม่สามารถอธิบายได้
คำแนะนำในเอกสารเก่าส่วนใหญ่ถูกเขียนขึ้นสำหรับกระบวนการทำงานก่อนยุคปัญญาประดิษฐ์ (AI) โดยเน้นอย่างมากที่การอธิบายพารามิเตอร์ ลักษณะของฟังก์ชัน และบันทึกการตั้งค่าอย่างละเอียดถี่ถ้วน
ขณะนี้ AI สามารถร่างงานส่วนใหญ่ได้ หากวิศวกรใช้เวลาส่วนใหญ่ในการจัดทำเอกสารไปกับการสรุปเชิงกล พวกเขากำลังใช้ความสนใจของมนุษย์กับชั้นที่มีคุณค่าต่ำที่สุด
ใช้เวลาไปกับเจตนา: ทำไมฟังก์ชันนี้ถึงมีอยู่, คุณเลือกตัวเลือกไหน, และสมมติฐานใดที่โค้ดนี้พึ่งพาอยู่. นั่นคือบันทึกที่ทีมในอนาคตของคุณ, ตัวช่วยเขียนโค้ด AI, และวิศวกรที่จะรับช่วงต่อโค้ดในปี 2027 จะต้องการ.
หากปัญหาเอกสารของคุณคือการกระจายบริบท ClickUp สามารถช่วยเก็บประวัติการตัดสินใจให้ใกล้กับงาน เอกสาร และโครงการที่สร้างขึ้นได้
คำถามที่พบบ่อยเกี่ยวกับเอกสารประกอบโค้ด
README คืออะไร?
ไฟล์ README ผ่านการทดสอบแรกเมื่อผู้ร่วมงานสามารถหาข้อมูลห้าอย่างได้อย่างรวดเร็ว: โครงการนี้ทำอะไร, ติดตั้งอย่างไร, ใช้อย่างไร, มีส่วนร่วมอย่างไร, และขอความช่วยเหลือได้ที่ไหน หากการตั้งค่าถูกซ่อนอยู่ใต้เหรียญตรา, บันทึกสถาปัตยกรรม, หรือรายละเอียดการเปลี่ยนแปลง ไฟล์ README นั้นจัดลำดับไม่ดี
ความแตกต่างระหว่างความคิดเห็นในโค้ดกับเอกสารประกอบคืออะไร?
ความคิดเห็นในโค้ดจะอยู่ภายในไฟล์ต้นฉบับและอธิบายบรรทัดหรือบล็อกเฉพาะ ส่วนเอกสารประกอบมักจะอยู่นอกไฟล์ต้นฉบับ เช่น ในไฟล์ README วิกิ เว็บไซต์อ้างอิงที่สร้างขึ้น หรือเอกสาร API ความคิดเห็นช่วยให้ผู้พัฒนาคนถัดไปที่อ่านฟังก์ชันของคุณเข้าใจได้ง่ายขึ้น ส่วนเอกสารประกอบช่วยให้ผู้ที่ต้องการใช้งาน รัน หรือมีส่วนร่วมในโปรเจกต์ของคุณเข้าใจและใช้งานได้อย่างถูกต้อง
ชั้นเจตนาในเอกสารประกอบโค้ดคืออะไร?
ชั้นเจตนา เป็นส่วนหนึ่งของเอกสารโค้ดที่บันทึกเหตุผลว่าทำไมโค้ดถึงมีอยู่ ไม่ใช่ สิ่งที่ มันทำ: การตัดสินใจที่ทำขึ้น, การแลกเปลี่ยนที่ยอมรับ, ข้อจำกัดที่ผลักดันการออกแบบ, และทางเลือกที่ทีมปฏิเสธ. โค้ดแสดงพฤติกรรม; ชั้นเจตนารักษาเหตุผลไว้. เครื่องมือ AI เช่น GitHub Copilot และ Mintlify สามารถร่างชั้นเชิงกลไก (ประเภทพารามิเตอร์, สรุปฟังก์ชัน) ได้ แต่ไม่สามารถอนุมานชั้นเจตนา (Intent Layer) จากไวยากรณ์ได้ โดยปกติแล้วชั้นนี้จะอยู่ในบันทึกการตัดสินใจทางสถาปัตยกรรม (Architecture Decision Records), คำอธิบาย PR หรือความคิดเห็นที่อธิบาย เหตุผล มากกว่า สิ่งที่ ทำ
ควรอัปเดตเอกสารประกอบโค้ดบ่อยแค่ไหน?
อัปเดตเอกสารใน pull request เดียวกับการเปลี่ยนแปลงพฤติกรรมพื้นฐาน หากมีการเปลี่ยนแปลงใน signature ของฟังก์ชัน ให้แก้ไข docstring ใน PR นั้นด้วย สำหรับ README และเอกสารสถาปัตยกรรม ให้ตรวจสอบอย่างน้อยหนึ่งครั้งต่อการออกเวอร์ชันหรือทุกไตรมาส เอกสารที่ล้าสมัยเป็นอันตรายเพราะจะสอนพฤติกรรม, API หรือกระบวนการที่ผิดให้กับผู้อ่าน
เอกสารประเภทใดบ้างที่มีสี่ประเภท?
กรอบการทำงาน Diátaxisที่ได้รับการยอมรับอย่างแพร่หลาย แบ่งเอกสารออกเป็นสี่ประเภท: บทเรียน (เน้นการเรียนรู้ สำหรับผู้เริ่มต้น), คู่มือการใช้งาน (เน้นการทำตามขั้นตอน สำหรับผู้ใช้ที่ต้องการแก้ปัญหาเฉพาะ), เอกสารอ้างอิง (เน้นข้อมูล สำหรับผู้ใช้ที่ต้องการค้นหาข้อมูลรายละเอียด) และคำอธิบาย (เน้นความเข้าใจ สำหรับผู้ใช้ที่ต้องการบริบท) การผสมผสานประเภทเหล่านี้เข้าด้วยกันจะสร้างเอกสารที่ไม่มีใครสามารถใช้ได้ ไฟล์ README ที่พยายามจะเป็นคู่มือแบบสมบูรณ์อาจทำให้เส้นทางติดตั้งถูกฝังอยู่ ส่วนหน้าอ้างอิงที่เขียนเหมือนเรียงความอาจซ่อนการเรียกใช้ API ไว้
คุณบันทึกโค้ดด้วย AI อย่างไร?
ใช้ AI สำหรับชั้นเชิงกลไกและเขียน ชั้นเจตนา ด้วยตัวเอง เครื่องมืออย่าง GitHub Copilot, Cursor และ Mintlify สามารถร่างเอกสารประกอบฟังก์ชัน คำอธิบายพารามิเตอร์ ค่าที่ส่งคืน และสรุปฟังก์ชันได้โดยตรงในตัวแก้ไขของคุณ ตรวจสอบร่างกับพฤติกรรมของโค้ดจริง จากนั้นเพิ่มส่วนที่ AI ไม่สามารถอนุมานได้: เหตุผลในการตัดสินใจ ข้อจำกัดที่ขับเคลื่อนมัน ตัวเลือกที่คุณปฏิเสธ และสมมติฐานใดๆ ที่โค้ดขึ้นอยู่กับ สำหรับการตัดสินใจในระดับระบบ ให้เขียนบันทึกการตัดสินใจด้านสถาปัตยกรรม ห้ามเผยแพร่เอกสารที่สร้างโดย AI โดยเด็ดขาดหากไม่ผ่านการตรวจสอบจากมนุษย์
เอกสารที่สร้างโดย AI น่าเชื่อถือหรือไม่?
เอกสารที่สร้างโดย AI มีประโยชน์สำหรับงานด้านกลไก เช่น คำอธิบายพารามิเตอร์ ค่าที่ส่งคืน และสรุปฟังก์ชันพื้นฐาน แต่ยังคงต้องการการตรวจสอบจากมนุษย์ เครื่องมืออย่าง GitHub Copilot, Cursor, Codeium และ Mintlify สามารถจัดการกับงานเหล่านี้ได้ดี AI ไม่สามารถอนุมานได้ว่าทำไมจึงมีการตัดสินใจแลกเปลี่ยน มีทางเลือกใดที่ถูกปฏิเสธ หรือข้อจำกัดด้านผลิตภัณฑ์ ธุรกิจ หรือโครงสร้างพื้นฐานใดที่ส่งผลต่อการออกแบบ ใช้ AI สำหรับร่างแรกเท่านั้น เพิ่มเจตนาและบริบทด้วยตนเอง
ทุกฟังก์ชันจำเป็นต้องมี docstring หรือไม่?
ไม่. API สาธารณะและฟังก์ชันใด ๆ ที่นักพัฒนาคนอื่นจะเรียกใช้ต้องมี docstrings. ตัวช่วยส่วนตัวที่ใช้ในไฟล์เดียวโดยทั่วไปไม่จำเป็นต้องมี ยกเว้นหากตรรกะไม่ชัดเจน. การจัดทำเอกสารมากเกินไปสำหรับโค้ดที่ง่ายเกินไปจะสร้างภาระในการบำรุงรักษาโดยไม่เพิ่มความชัดเจน. ปรับความลึกของเอกสารให้เหมาะกับผู้ชมของฟังก์ชันนั้น.
เครื่องมือที่ดีที่สุดสำหรับการสร้างเอกสารประกอบโค้ดคืออะไร?
เครื่องมือที่เหมาะสมขึ้นอยู่กับภาษาของคุณ ทีมที่ใช้ Java ใช้ Javadoc ทีมที่ใช้ JavaScript และ TypeScript ใช้ JSDoc ทีมที่ใช้ Python ใช้ Sphinx ทีมที่ใช้ Go ใช้ Godoc และ Doxygen จัดการกับภาษา C, C++ และภาษาอื่นๆ อีกหลายภาษา เครื่องมือที่ช่วยด้วย AI เช่น Mintlify, Swimm, Copilot และ Cursor สามารถช่วยร่างหรือดูแลเอกสารในส่วนต่างๆ ของเวิร์กโฟลว์ได้ แต่ไม่สามารถทดแทนตัวสร้างเอกสารที่รองรับภาษาโดยตรงได้
README ควรมีความยาวเท่าไร?
ยาวพอที่จะตอบคำถามพื้นฐานได้อย่างรวดเร็ว: โครงการนี้ทำอะไร, ติดตั้งอย่างไร, ใช้อย่างไร, มีส่วนร่วมอย่างไร, และขอความช่วยเหลือได้ที่ไหน. รายละเอียดเกี่ยวกับการตั้งค่า, สถาปัตยกรรม, และ API ที่ลึกกว่าให้ไว้ในเอกสารที่เชื่อมโยงหรือในไดเรกทอรีย่อย.

