เรซูเม่ในรูปแบบโค้ด: ความสง่างามของ RenderCV
หากคุณเป็นวิศวกรหรือนักวิชาการ การเขียนเรซูเม่ใน MS Word คือฝันร้ายของการจัดรูปแบบ และเทมเพลต LaTeX แบบกำหนดเองก็มักจะเวิ่นเว้อเกินกว่าจะดูแลรักษาได้ง่ายๆ
เมื่อไม่นานมานี้ ฉันบังเอิญไปพบกับโปรเจกต์ Python ที่ยอดเยี่ยมชื่อว่า RenderCV มันช่วยให้คุณเขียนเนื้อหาเรซูเม่ของคุณในไฟล์ YAML ที่สะอาดและมีโครงสร้างที่เป็นระเบียบ จากนั้นจะสร้าง PDF ที่จัดรูปแบบอย่างสวยงามด้วยไทโปกราฟีที่สมบูรณ์แบบโดยใช้ Typst เป็นตัวขับเคลื่อนเบื้องหลัง มันปฏิบัติกับเรซูเม่ของคุณเหมือนโค้ด ซึ่งหมายความว่าคุณสามารถควบคุมเวอร์ชัน (version-control) ได้ มุ่งเน้นไปที่เนื้อหาอย่างแท้จริง และปล่อยให้เครื่องมือจัดการเรื่องระยะขอบหน้า การจัดตำแหน่ง และสไตล์
อย่างไรก็ตาม RenderCV ถูกออกแบบมาเพื่อใช้งานผ่าน Command-line interface (CLI) เป็นหลัก ทุกครั้งที่คุณทำการเปลี่ยนแปลง คุณต้องรัน rendercv render John_Doe_CV.yaml ตรวจสอบผลลัพธ์ เปิดโปรแกรมดู PDF และเช็คการจัดตำแหน่ง หากคุณทำผิดพลาดในการตรวจสอบความถูกต้องหรือ स्कीमा (schema) คุณต้องนั่งอ่าน CLI compiler tracebacks ที่ชวนปวดหัว
ฉันต้องการเชื่อมช่องว่างนี้ด้วยการเพิ่ม Live Web Editor—เว็บแอปพลิเคชันหน้าเดียวแบบโลคัลที่มีโปรแกรมแก้ไข Monaco แบบเคียงข้างกัน พรีวิว PDF แบบเรียลไทม์ ตรวจสอบความถูกต้องของสคีมาทันที และการสลับธีม/ส่วนการทำงานแบบโต้ตอบได้
ด้วยความช่วยเหลือของ Gemini ฉันสร้างและรวมเว็บอินเตอร์เฟสนี้เข้ากับ RenderCV ได้โดยตรงสำเร็จแล้ว! และนี่คือวิธีที่เราทำกัน
เทคโนโลยีและสถาปัตยกรรม
เพื่อให้เว็บเอดิเตอร์นี้มีน้ำหนักเบา รวดเร็ว และพึ่งพาโมดูลภายนอกน้อยที่สุด เราจึงเลือก:
- Backend: FastAPI + Uvicorn — เหมาะอย่างยิ่งสำหรับการเขียน API ประสิทธิภาพสูงและให้บริการไฟล์สแตติก
- Frontend: Vanilla HTML5 + Modern CSS + Javascript — หลีกเลี่ยงขั้นตอนการบิลด์ที่ยุ่งยาก (เช่น Webpack หรือ Vite) สำหรับเครื่องมือช่วยในเครื่อง เราใช้ Monaco Editor (ผ่าน CDN) เพื่อประสบการณ์การเขียน YAML ระดับเดียวกับ VS Code และใช้ Lucide Icons สำหรับองค์ประกอบภาพที่ราบรื่น
- Rendering: RenderCV Python API — เรียกใช้โมเดลภายในของไลบรารีโดยตรงเพื่อแยกวิเคราะห์ ตรวจสอบความถูกต้อง และสร้างเอกสาร Typst และ PDF ในหน่วยความจำหรือในโฟลเดอร์ชั่วคราว
1. การออกแบบ FastAPI Backend (web_app.py)
หัวใจของเซิร์ฟเวอร์คือเอนด์พอยต์ /api/render เมื่อผู้ใช้พิมพ์ YAML ในเว็บ UI ส่วนหน้าจะส่งข้อมูลไปยังเอนด์พอยต์นี้ แบ็คเอนด์จะจัดการงานหลักสามงาน:
- การเรนเดอร์ PDF: เราคอมไพล์สตริง YAML โดยใช้ฟังก์ชันการคอมไพล์ภายในของ RenderCV และส่งคืนไฟล์ไบต์ PDF ดิบ
- การสลับเปิด/ปิดส่วนการแสดงผล: RenderCV ช่วยให้คุณสามารถซ่อนหรือแสดงส่วนต่างๆ ของ CV ได้ เราจะแยกวิเคราะห์ YAML ที่ส่งเข้ามา ระบุส่วนของ CV ที่มีอยู่ทั้งหมด ตัดส่วนที่ผู้ใช้เลือกซ่อนในดรอปดาวน์ UI ออก และคอมไพล์เอกสารสุดท้าย
- การจับคู่ข้อผิดพลาดอย่างมีโครงสร้าง: เมื่อการตรวจสอบความถูกต้องล้มเหลว RenderCV จะส่งข้อผิดพลาด
RenderCVUserValidationErrorออกมา เราจะดักจับข้อผิดพลาดนี้ ดึงหมายเลขบรรทัดและคอลัมน์ที่แน่นอนของฟิลด์ YAML ที่ไม่ถูกต้อง และส่งคืนการตอบกลับข้อผิดพลาด JSON ที่สะอาด เพื่อให้ Monaco แสดงเส้นหยักสีแดงในตำแหน่งที่เกิดข้อผิดพลาดได้อย่างแม่นยำ!
นี่คือหน้าตาของเอนด์พอยต์ /api/render ในภาษาไพธอน:
1 |
|
2. เว็บอินเตอร์เฟสระดับพรีเมียม (index.html)
สำหรับส่วนติดต่อผู้ใช้ เราต้องการบางสิ่งที่ให้ความรู้สึกระดับพรีเมียม ตอบสนองรวดเร็ว และใช้งานง่ายสุดๆ Gemini ช่วยฉันโค้ดเลย์เอาต์ที่ทันสมัยและสวยงามซึ่งมีคุณสมบัติ:
- HSL Dark Theme: พื้นหลังสีเทาเข้ม, โอเวอร์เลย์กึ่งโปร่งใส (
backdrop-filter: blur), และลูกเล่นไล่โทนสีม่วงสดใส - แบ่งหน้าจอเคียงข้างกัน: Monaco Editor อยู่ทางซ้าย, หน้าจอพรีวิว PDF สด (ใช้
<iframe>ที่โหลดด้วย Blob URL ท้องถิ่น) อยู่ทางขวา - การควบคุมแบบไดนามิก:
- ตัวเลือกสลับธีมที่จะโหลดเทมเพลต (classic, engineering, moderncv, ฯลฯ) และรวมข้อมูล CV ปัจจุบันของคุณเข้ากับเทมเพลตเหล่านั้นโดยอัตโนมัติ
- เมนูดรอปดาวน์ของส่วน CV ซึ่งสืบค้นส่วนหัวจากแบ็คเอนด์และสร้างเช็คลิสต์เพื่อซ่อน/แสดงส่วนต่างๆ ของเรซูเม่แบบไดนามิก (เช่น ซ่อนส่วน “Projects” หรือ “References” เมื่อต้องการส่งออกเวอร์ชันที่ปรับให้เหมาะกับเป้าหมายที่เฉพาะเจาะจง)
- คอนโซลบันทึกการตรวจสอบความถูกต้องที่ด้านล่างของเอดิเตอร์ซึ่งขยายเพื่อแสดงรายละเอียดข้อผิดพลาดได้ การคลิกที่ข้อผิดพลาดจะโฟกัสไปที่บรรทัดนั้นใน Monaco Editor โดยอัตโนมัติ
ในการคอมไพล์ ผู้ใช้สามารถคลิกปุ่ม “Render PDF” หรือใช้คีย์ลัด Cmd + Enter PDF คอมไพล์เสร็จในเวลาน้อยกว่าหนึ่งวินาที!
3. การรวมเข้ากับ CLI (web_command.py)
เพื่อให้ผู้ใช้เริ่มต้นใช้งานได้ง่ายที่สุด เราจึงเพิ่มคำสั่งใหม่ให้กับ RenderCV CLI ที่ทำงานด้วย Typer:
1 | rendercv web |
นี่จะเปิดใช้งานเซิร์ฟเวอร์ Uvicorn FastAPI ในเครื่อง และเปิดเว็บเบราว์เซอร์ของคุณโดยอัตโนมัติ:
1 |
|
สะท้อนความคิดจากการโค้ดร่วมกับ Gemini
การสร้างฟีเจอร์นี้ด้วย Gemini ทำได้รวดเร็วอย่างเหลือเชื่อ สิ่งที่ปกติแล้วอาจต้องใช้เวลาหลายวันในการอ่านซอร์สโค้ดภายในและกำหนดค่า Monaco API สามารถแก้ไขได้ภายในไม่กี่ชั่วโมง:
- การทำความเข้าใจไลบรารี AST/YAML: Gemini ระบุอย่างถูกต้องว่าเราควรใช้
ruamel.yamlในการแยกวิเคราะห์ไฟล์ YAML เพื่อรักษาเครื่องหมายคำพูด ความคิดเห็น และโครงสร้างเดิมของผู้ใช้เมื่อสลับธีม - การจับคู่พิกัดข้อผิดพลาด: Gemini รู้วิธีการเข้าถึงพิกัดข้อผิดพลาดของ
RenderCVUserValidationErrorและสร้างโครงสร้างสำหรับ Monaco model markers (monaco.editor.setModelMarkers) ทำให้ตัวเอดิเตอร์ทำงานประสานกับการตรวจสอบความถูกต้องของ Pydantic ได้อย่างสมบูรณ์แบบ - ขัดเกลา UX: มันออกแบบตัวแปร CSS และการจัดวางที่สวยงาม ปรับขนาดเข้ากับหลายความละเอียดหน้าจอได้อย่างยอดเยี่ยม และตอบสนองได้อย่างไหลลื่น
หากคุณต้องเขียนเรซูเม่ ลองไปศึกษา RenderCV และทดลองใช้คำสั่ง rendercv web เพื่อสัมผัสประสบการณ์แก้เรซูเม่แบบสดๆ ด้วยตัวคุณเองได้เลย!
ขอให้สนุกกับการเขียนโค้ดนะ!