เรียนรู้ Python ในวันหยุดสุดสัปดาห์: จากศูนย์สู่โปรเจกต์ที่สมบูรณ์
เราจะเรียนรู้ภาษาโปรแกรมใหม่ได้อย่างรวดเร็วได้อย่างไร? ในบทความนี้ เราจะแบ่งปันประสบการณ์ในวันหยุดสุดสัปดาห์ของการเรียนรู้ Python โดยการสร้างโปรเจกต์ที่สมบูรณ์
เราจะเรียนรู้ภาษาโปรแกรมใหม่ได้อย่างรวดเร็วได้อย่างไร? ในบทความนี้ เราจะแบ่งปันประสบการณ์ในวันหยุดสุดสัปดาห์ของการเรียนรู้ Python โดยการสร้างโปรเจกต์ที่สมบูรณ์
Logto เป็นบริการเรียกใช้งานที่นำเสนอประสบการณ์ที่ราบรื่นในหลายภาษาโปรแกรมและกรอบงาน ไม่ว่าภาษาโปรแกรมจะอยู่นอกกองเทคโนโลยีและทีมของเราไม่คุ้นเคย การพัฒนา SDK ที่มีความแข็งแกร่งก็กลายเป็นความท้าทาย
Python เป็นความท้าทายสำหรับเรา ถึงแม้ว่าเราจะมีผู้ใช้ Python จำนวนมาก แต่เราขาด SDK ของ Python ซึ่งเป็นเรื่องที่กังวลใจ ฉันมุ่งมั่นที่จะแก้ไขช่องว่างนี้
แม้ว่าฉันจะมีประสบการณ์ในการเขียนโปรแกรมมาหลายปี แต่ Python ยังคงเป็นพื้นที่ใหม่สำหรับฉัน ขณะที่ฉันเคยได้เล่นกับ Python 2 เล็กน้อยสำหรับสคริปต์ง่าย ๆ มาหลายปีแล้ว ความรู้ของฉันยังล้าสมัย ถึงเวลาแล้วที่ฉันต้องลงมืออย่างจริงจัง!
จากประสบการณ์ของฉัน วิธีที่มีประสิทธิภาพที่สุดในการเรียนรู้ภาษาโปรแกรมใหม่คือสร้างโปรเจกต์ที่สมบูรณ์ โชคดี เป้าหมายของเราชัดเจน: สร้าง Logto Python SDK สำหรับแอพพลิเคชันเว็บ
แทนที่จะกระโดดไปเขียนโค้ด มาแบ่งมันวิเคราะห์กันก่อน นี่คือรายการ:
ดูเหมือนว่างานที่ 1 จะมีงานมากที่สุด ดังนั้นเราจำเป็นต้องยืนยันขอบเขตและดำเนินการต่อ การทำเช่นนี้เป็นสิ่งสำคัญเพื่อรักษาขอบเขตของโปรเจกต์ และหลีกเลี่ยงการขยายขอบเขตและการพัฒนามากเกินไป
งานก่อนหน้านี้โดยทีมของเราช่วยประหยัดเวลามาก:
อ้างอิงจากแหล่งข้อมูลเหล่านี้ ฉันสามารถเห็นภาพที่ชัดเจนว่าต้องทำอะไร แต่เฉพาะในบทความนี้ไม่ครอบคลุมเจาะลึก กระนั้น มาต่อไป
ฉันใช้ Mac ดังนั้น Python จึงติดตั้งไว้แล้ว อย่างไรก็ตาม ฉันสงสัยว่ามีวิธีที่ดีกว่าในการจัดการเวอร์ชันของ Python หรือไม่ (ฉันเคยได้ยินปัญหาความเข้ากันได้ของเวอร์ชันเช่นเดียวกัน) ทันทีที่ฉันพบ pyenv และเริ่มติดตั้งมันเลยทันที
ต่อไปในแผนงาน: การจัดการแพ็กเกจและการพึ่งพา โดยทั่วไปจะควบคู่กันไป แล้วทำไมไม่ใช้ pip (ค่าเริ่มต้นของ Python)? หากคุณเปิดดู requirements.txt, คุณจะพบว่ามันเป็นเพียงรายการของแพ็กเกจพร้อมเวอร์ชัน นี่ไม่เพียงพอสำหรับ SDK ที่อาจถูกใช้โดยโปรเจกต์อื่น ๆ เป็นต้นว่า เราอาจต้องเพิ่มบางแพ็กเกจสำหรับการพัฒนา แต่เราไม่ต้องการรวมพวกมันใน SDK สุดท้าย requirements.txt มันง่ายเกินไปที่จะจัดการกับเรื่องนี้
หนึ่งในประโยชน์เมื่อคุณมีภาษาโปรแกรมอื่นในกองเทคโนโลยีของคุณคือคุณสามารถค้นหา "เทียบเท่า Python" ได้ ดังนั้นฉันจึงค้นหา "เทียบเท่าของ Python สำหรับ package.json" และพบ Poetry, ผู้แข่งขันที่ยอดเยี่ยม:
pyproject.toml, คล้ายกับ package.json ใน Node.jsCLI ยุคใหม่มักจะมีคำสั่ง init ที่ออกแบบมาสำหรับโปรเจกต์ใหม่ Poetry ก็มีเช่นกัน ฉันรันคำสั่งและมันสร้างไฟล์ pyproject.toml ให้ฉันแล้ว
ในที่สุด ช่วงเวลาที่จะเขียนโค้ดก็มาถึง การเริ่มต้นด้วยโปรแกรม "Hello, World!" คลาสสิกเป็นทางเลือกที่ดีเสมอ เมื่อเรียนรู้ภาษาโปรแกรม ไม่จำเป็นต้องมี IDE ที่มีคุณสมบัติครบถ้วนเสมอไป; เครื่องมือแก้ไขที่ได้รับการสนับสนุนโดยชุมชนที่แข็งแกร่ง เช่น VS Code ก็เพียงพอแล้ว
เนื่องจาก SDK ของเรามุ่งเน้นไปที่แอพพลิเคชันเว็บ ฉันเริ่มต้นด้วยเซิร์ฟเวอร์เว็บอย่างง่ายที่ใช้กรอบงานยอดนิยมอย่าง Flask
การใช้ความสามารถของ Poetry, การติดตั้ง Flask สามารถทำได้ง่าย ๆ โดยการรัน poetry add flask. จากนั้น ปฏิบัติตามคู่มือเริ่มต้นเร็วของ Flask ฉันจัดทำไฟล์ ʻhello.py` พร้อมกับโค้ดอีกอีลเล็กน้อยตามนี้:
การเรียกใช้งานเซิร์ฟเวอร์ผ่าน flask --app hello run และนำทางไปที่ http://localhost:5000 บนเบราว์เซอร์ของฉันได้ตามที่คิดไว้ มันทำงานได้จริง!
ในฐานะผู้เริ่มต้น ฉันไม่ได้รีบเขียนโค้ดเพิ่มเติม แทนที่จะมีข้อมูลมากมายที่สามารถเรียนรู้ได้จากตัวอย่างโค้ด:
from x import y เพื่อดึงโมดูลหรือคลาสเข้าในไฟล์new@app.route ทำหน้าที่เป็นตัวประดับที่ลงทะเบียนฟังก์ชันเป็นตัวจัดการเส้นทาง
defตามที่คุณเห็น หากเราพยายามทำความเข้าใจทุกบรรทัดของโค้ดแทนที่จะให้มันทำงานได้เพียงอย่างเดียว เราสามารถเรียนรู้ได้มากจากมัน ในขณะเดียวกัน เอกสารอย่างเป็นทางการของ Flask ได้อธิบายตัวอย่างโค้ดเพิ่มเติมในรายละเอียด
ตอนนี้ถึงเวลาที่จะเริ่มโปรเจกต์ ฉันได้กำหนดคลาส LogtoClient และพยายามเพิ่มคุณสมบัติและวิธีการบางอย่างเพื่อสัมผัสภาษ:
จากนั้นรวมคลาสนี้กับ Flask:
มันเริ่มรู้สึกว่าเป็นโปรเจกต์จริง ๆ แต่ฉันรู้สึกว่ามีบางอย่างขาดหายไป: ระบบชนิดข้อมูล
เนื่องจากเป็น SDK, การรวมระบบชนิดข้อมูลจะช่วยให้ผู้ใช้เข้าใจ API และลดโอกาสในการเกิดข้อผิดพลาดเมื่อพัฒนา
Python นำเสนอ คำบอกชนิดข้อมูล ในเวอร์ชัน 3.5 ไม่ได้แข็งแกร่งเท่า TypeScript แต่ก็ดีกว่าไม่มีอะไรเลย ฉันจึงเพิ่มคำบอกชนิดข้อมูลสำหรับคลาส LogtoClient:
ดูดีขึ้นมาก แต่ความท้าทายมาเมื่อถึงคราวชนิดข้อมูลที่ซับซ้อนเช่นวัตถุที่มีคีย์ที่กำหนดล่วงหน้า สำหรับตัวอย่าง เราต้องกำหนดคลาส LogtoConfig เพื่อแสดงวัตถุ config:
มันดูโอเค แต่เดี๋ยวเราต้องเผชิญกับปัญหาของการเข้ารหัส การถอดรหัส และการตรวจสอบวัตถุจาก JSON
หลังจากการค้นคว้าบ้าง ฉันเลือก pydantic เป็นทางแก้ มันเป็นห้องสมุดการตรวจสอบข้อมูลที่ทำงานร่วมกับคำบอกชนิดข้อมูล มันรองรับฟังก์ชันต่าง ๆ ของ JSON โดยไม่ต้องสร้างโค้ดที่ซ้ำซากน่าเบื่อ
ดังนั้น คลาส LogtoConfig สามารถเขียนใหม่ได้เป็น:
มันยังสอนฉันเกี่ยวกับการสืบทอดคลาสใน Python โดยการเพิ่มวงเล็บหลังชื่อของคลาส
ใน Logto SDK เราต้องทำคำขอ HTTP ไปยังเซิร์ฟเวอร์ Logto หากคุณมีประสบการณ์กับ JavaScript, คำว่า "callback hell" อาจทำให้คุณระลึกถึงปัญหา มันเป็นปัญหาทั่วไปเมื่อจัดการกับการทำงานแบบอะซิงโครนัส ภาษาโปรแกรมยุคใหม่มีทางแก้ที่คล้ายกันเช่น Promise หรือ coroutine
โชคดีที่ Python มีการแก้ปัญหาที่สร้างไว้ล่วงหน้าของ async และ await ก่อนใช้มัน ให้แน่ใจว่ามันเข้ากันได้กับเฟรมเวิร์คยอดนิยม ใน Flask สามารถทำได้โดยการติดตั้ง async เสริมและใช้ async def แทนที่ def:
แล้วเราสามารถใช้ await เพื่อรอผลลัพธ์ของการทำงานแบบอะซิงโครนัส
คำขอ HTTP เป็นหัวข้อที่น่าสนใจ เกือบทุกภาษาโปรแกรมมีวิธีการแก้ไขที่เป็นคล่องตัว แต่บ่อยครั้งที่นักพัฒนามักใช้ห้องสมุดภายนอกเพื่อความง่ายในการใช้งาน ตัวอย่างเช่น:
XMLHttpRequest กับ fetch กับ axiosURLSession กับ AlamofireHttpURLConnection กับ OkHttpนี่ก็จริงสำหรับ Python การตัดสินใจของฉันคือใช้ aiohttp เนื่องจากมันสนับสนุน async และ await ร่วมกับความนิยมของมัน
ก่อน Copilot, เรามาถึงส่วนที่น่าเบื่อของการเขียนตรรกะธุรกิจแล้ว ด้วยการช่วยเหลือของมาตรฐาน SDK และ SDK อื่น ๆ ฉันสามารถเขียนความคิดเห็นเชิงบรรยายสำหรับแต่ละวิธีการก่อนที่เขียนโค้ด
มันเพิ่มความอ่านง่ายของโค้ดอย่างมาก และยังช่วยนักพัฒนาที่จะเข้าใจ API ได้ทันทีใน IDE หรือเครื่องมือแก้ไขผ่านความฉลาดของโค้ด
แนวทางตัวอย่างเช่น วิธีการ generateCodeChallenge, ความคิดเห็นสามารถเขียนได้เป็น:
นี้เป็นข้อเสนอใหญ่สำหรับโมเดลภาษาขนาดใหญ่ (LLMs): ประกอบด้วยคำนิยามวิธีโดยความคิดเห็นชัดเจน และ Copilot ไม่ทำให้ผิดหวัง:
อาจต้องการการปรับแต่งเล็กน้อย แต่นั่นไม่ใช่ปัญหา มันได้เปลี่ยนแปลงเกมแล้ว
นี่คือความก้าวหน้าที่ได้ทำสำเร็จในวันแรก มันเป็นวันที่ยาวนาน แต่ด้วยเครื่องมือและเทคโนโลยียุคใหม่ มันดีกว่าที่คาดไว้มากมาย
จากงานในวันแรก ตรรกะธุรกิจได้ถูกทำอย่างรวดเร็ว แต่สำหรับ SDK มันยังคงไม่เพียงพอ นี่คือภารกิจสำหรับวันที่สอง:
การทดสอบหน่วยช่วยเราได้หลายครั้ง ดังนั้นฉันจะไม่ข้ามมัน ข้อควรพิจารณาทั่วไปเมื่อเขียนการทดสอบหน่วยคือ:
ด้วยคำถามเหล่านี้ในใจ, ฉันพบว่ามอดูลในตัว unittest ไม่เพียงพอสำหรับบางกรณี. ดังนั้นฉันเลือก pytest เป็นแฟรมเวิร์คในการทดสอบ. มันรองรับการทดสอบแบบอะซิงโครนัสและดูเหมือนครบถ้วนพอ
การเดินทางได้เปิดเผยแนวคิดใหม่ที่น่าสนใจอย่าง fixture ให้ฉัน ซึ่งสามารถเป็นประโยชน์ต่อแนวคิดเมื่อเขียนโค้ดในภาษาอื่น
ทุกภาษามีรูปแบบการจัดรูปแบบโค้ดของตัวเอง ส่วนตัวแล้วการจัดรูปแบบที่สม่ำเสมอทำให้ฉันมีความสุขและสะดวกสบาย; นอกจากนี้ยังช่วยในการรีวิวโค้ดและการทำงานร่วมกันได้มาก ๆ
แทนที่จะถกเถียงเรื่องรูปแบบที่ "ดีที่สุด" ฉันตัดสินใจเลือกใช้อิมเมชั่นที่ตัดสินใจและติดตามมัน
Black ดูเหมือนเป็นตัวเลือกที่ดี ความไม่พอใจเดียวคือขนาดแท็บที่ไม่สามารถแก้ไขได้ แต่มันไม่ใช่เรื่องใหญ่ ฉันเลือกที่จะใช้มัน
ในฐานะ SDK, มันควรจะเข้ากันได้กับเวอร์ชัน Python ที่แพร่หลาย โดยการค้นหา "สถิติการใช้งานเวอร์ชัน python" ฉันตัดสินใจใช้ Python 3.8 เป็นเวอร์ชันขั้นต่ำ
คุณธรรมของการจัดการสภาพแวดล้อมเห็นได้ชัดเจน ฉันสามารถสลับเวอร์ชัน Python ได้ง่ายๆ โดยรัน pyenv local 3.8 และ poetry env use 3.8. จากนั้นฉันสามารถรันการทดสอบเพื่อตรวจสอบปัญหาความเข้ากันได้ได้
การรวมต่อเนื่องรับประกันคุณภาพของการเปลี่ยนแปลงโค้ดทุกครั้ง เนื่องจากที่เก็บของเราได้รับการประกอบบน GitHub, GitHub Actions ก็เป็นตัวเลือกที่เป็นธรรมชาติ
กระบวนการทำงานหลักตามหลักการที่ง่าย:
GitHub Actions มีชุมชนที่ดี, ดังนั้นมันใช้เวลาเพียงไม่กี่นาทีในการประกอบ เวิร์กโฟลว์.
โดยการใช้กลยุทธ์มาตรา, เราสามารถรันเวิร์กโฟลว์บนเวอร์ชัน Python ที่แตกต่างกันได้, แม้กระทั่งในระบบปฏิบัติการที่แตกต่างกัน
ขั้นตอนสุดท้ายคือการเผยแพร่ SDK สำหรับแพ็กเกจสาธารณะ, นี้สามารถทำได้โดยการส่งไปยังที่เก็บแพ็กเกจที่เกี่ยวข้องกับภาษานั้น เช่น npm สำหรับ Node.js, PyPI สำหรับ Python, และ CocoaPods สำหรับ Swift
Poetry เป็นดาวนำทางของฉัน แค่รัน poetry publish เพื่อส่งแพ็กเกจไปที่ PyPI มันง่ายแบบนั้น
มันเป็นการเดินทางที่น่าสนใจ โดยไม่ได้รับการช่วยเหลือจากชุมชนซอฟต์แวร์โอเพ่นซอร์ส มันจะยากกว่ามาก ขอเสียงปรบมือให้กับผู้ร่วมสร้างทุกคน!
นี่คือบางทับทั่วไปที่ได้รับ:
คุณสามารถหาโครงการสุดท้ายของเราได้ที่ ที่เก็บนี้. ด้วยกลยุทธ์เดียวกัน, ฉันยังสร้าง Logto PHP SDK ได้อย่างรวดเร็วเช่นกัน. อย่าลังเลที่จะบอกให้เราทราบหากคุณมีคำแนะนำใด ๆ.
หวังว่าบทความนี้จะเป็นประโยชน์สำหรับการเรียนรู้ภาษาโปรแกรมใหม่. สนุกกับการแฮก!