เรียนรู้ Python ในวันหยุดสุดสัปดาห์: จากศูนย์สู่โปรเจกต์ที่สมบูรณ์
เราจะเรียนรู้ภาษาโปรแกรมใหม่ได้อย่างรวดเร็วได้อย่างไร? ในบทความนี้ เราจะแบ่งปันประสบการณ์ในวันหยุดสุดสัปดาห์ของการเรียนรู้ Python โดยการสร้างโปรเจกต์ที่สมบูรณ์
บทนำ
Logto เป็นบริการเรียกใช้งานที่นำเสนอประสบการณ์ที่ราบรื่นในหลายภาษาโปรแกรมและกรอบงาน ไม่ว่าภาษาโปรแกรมจะอยู่นอกกองเทคโนโลยีและทีมของเราไม่คุ้นเคย การพัฒนา SDK ที่มีความแข็งแกร่งก็กลายเป็นความท้าทาย
Python เป็นความท้าทายสำหรับเรา ถึงแม้ว่าเราจะมีผู้ใช้ Python จำนวนมาก แต่เราขาด SDK ของ Python ซึ่งเป็นเรื่องที่กังวลใจ ฉันมุ่งมั่นที่จะแก้ไขช่องว่างนี้
แม้ว่าฉันจะมีประสบการณ์ในการเขียนโปรแกรมมาหลายปี แต่ Python ยังคงเป็นพื้นที่ใหม่สำหรับฉัน ขณะที่ฉันเคยได้เล่นกับ Python 2 เล็กน้อยสำหรับสคริปต์ง่าย ๆ มาหลายปีแล้ว ความรู้ของฉันยังล้าสมัย ถึงเวลาแล้วที่ฉันต้องลงมืออย่างจริงจัง!
วันแรก: วางรากฐาน
กำหนดเป้าหมาย
จากประสบการณ์ของฉัน วิธีที่มีประสิทธิภาพที่สุดในการเรียนรู้ภาษาโปรแกรมใหม่คือสร้างโปรเจกต์ที่สมบูรณ์ โชคดี เป้าหมายของเราชัดเจน: สร้าง Logto Python SDK สำหรับแอพพลิเคชันเว็บ
แทนที่จะกระโดดไปเขียนโค้ด มาแบ่งมันวิเคราะห์กันก่อน นี่คือรายการ:
- สร้าง Logto client สำหรับงานเช่น ลงชื่อเข้าและออก ข้อมูลผู้ใช้ และการจัดการโทเคน
- ให้คำสอนและโปรเจกต์ตัวอย่างที่แสดงการใช้งาน SDK
- เผยแพร่ SDK ไปที่บางที่เพื่อให้ผู้ใช้สามารถติดตั้งได้ง่าย
ดูเหมือนว่างานที่ 1 จะมีงานมากที่สุด ดังนั้นเราจำเป็นต้องยืนยันขอบเขตและดำเนินการต่อ การทำเช่นนี้เป็นสิ่งสำคัญเพื่อรักษาขอบเขตของโปรเจกต์ และหลีกเลี่ยงการขยายขอบเขตและการพัฒนามากเกินไป
งานก่อนหน้านี้โด ยทีมของเราช่วยประหยัดเวลามาก:
- มาตรฐาน SDK ที่อธิบายโครงสร้างและการออกแบบ API ของ SDKs
- SDKs ที่มีอยู่สำหรับภาษาต่าง ๆ ให้ข้อมูลเชิงลึกเกี่ยวกับแบบแผนและการปรับปรุงที่เป็นไปได้สำหรับ Python
อ้างอิงจากแหล่งข้อมูลเหล่านี้ ฉันสามารถเห็นภาพที่ชัดเจนว่าต้องทำอะไร แต่เฉพาะในบทความนี้ไม่ครอบคลุมเจาะลึก กระนั้น มาต่อไป
ตั้งค่าสภาพแวดล้อม
ฉันใช้ Mac ดังนั้น Python จึงติดตั้งไว้แล้ว อย่างไรก็ตาม ฉันสงสัยว่ามีวิธีที่ดีกว่าในการจัดการเวอร์ชันของ Python หรือไม่ (ฉันเคยได้ยินปัญหาความเข้ากันได้ของเวอร์ชันเช่นเดียวกัน) ทันทีที่ฉันพบ pyenv และเริ่มติดตั้งมันเลยทันที
ต่อไปในแผนงาน: การจัดการแพ็กเกจและการพึ่งพา โดยทั่วไปจะควบคู่กันไป แล้วทำไมไม่ใช้ pip
(ค่าเริ่มต้นของ Python)? หากคุณเปิดดู requirements.txt
, คุณจะพบว่ามันเป็นเพียงรายการของแพ็กเกจพร้อมเวอร์ชัน นี่ไม่เพียงพอสำหรับ SDK ที่อาจถูกใช้โดยโปรเจกต์อื่น ๆ เป็นต้นว่า เราอาจต้องเพิ่มบางแพ็กเกจสำหรับการพัฒนา แต่เราไม่ต้องการรวมพวกมันใน SDK สุดท้าย requirements.txt
มันง่ายเกินไปที่จะจัดการกับเรื่องนี้
หนึ่งในประโยชน์เมื่อคุณมีภาษาโปรแกรมอื่นในกองเทคโนโลยีของคุณคือค ุณสามารถค้นหา "เทียบเท่า Python" ได้ ดังนั้นฉันจึงค้นหา "เทียบเท่าของ Python สำหรับ package.json" และพบ Poetry, ผู้แข่งขันที่ยอดเยี่ยม:
- ทำงานเป็นแพ็กเกจเมเนเจอร์, การพึ่งพาเมเนเจอร์, และการจัดการสภาพแวดล้อมเสมือน
- มีไฟล์
pyproject.toml
, คล้ายกับpackage.json
ใน Node.js - ใช้ล็อคไฟล์เพื่อเระบุดำเนินการพึ่งพาอย่างชัดเจน
CLI ยุคใหม่มักจะมีคำสั่ง 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
เพื่อดึงโมดูลหรือคลาสเข้าในไฟล์ - ไม่มีเครื่องหมายเซมิโคลอนในการยุติแต่ละบรรทัด (อุ ou)
- เราสามารถกำหนดตัวแปรใหม่โดยการตั้งชื่อแบบสุ่มและกำหนดค่าให้กับมัน
- การสร้างอินสแตนซ์ของคลาสโดยไม่มีคีย์เวิร์ด
new
- Python รองรับตัวประดับ และ
@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
คำขอ HTTP เป็นหัวข้อที่น่าสนใจ เกือบทุกภาษาโปรแกรมมีวิธีการแก้ไขที่เป็นคล่องตัว แต่บ่อยครั้งที่นักพัฒนามักใช้ห้องสมุดภายนอกเพื่อความง่ายในการใช้งาน ตัวอย่างเช่น:
- JavaScript:
XMLHttpRequest
กับfetch
กับaxios
- Swift:
URLSession
กับAlamofire
- Java:
HttpURLConnection
กับOkHttp
นี่ก็จริงสำหรับ Python การตัดสินใจของฉันคือใช้ aiohttp เนื่องจากมันสนับสนุน async
และ await
ร่วมกับความนิยมของมัน
เวทมนตร์ของ Copilot
ก่อน Copilot, เรามาถึงส่วนที่น่าเบื่อของการเขียนตรรกะธุรกิจแล้ว ด้วยการช่วยเหลือของมาตรฐาน SDK และ SDK อื่น ๆ ฉันสามารถเขียนความคิดเห็นเชิงบรรยายสำหรับแต่ละวิ ธีการก่อนที่เขียนโค้ด
มันเพิ่มความอ่านง่ายของโค้ดอย่างมาก และยังช่วยนักพัฒนาที่จะเข้าใจ API ได้ทันทีใน IDE หรือเครื่องมือแก้ไขผ่านความฉลาดของโค้ด
แนวทางตัวอย่างเช่น วิธีการ generateCodeChallenge
, ความคิดเห็นสามารถเขียนได้เป็น:
นี้เป็นข้อเสนอใหญ่สำหรับโมเดลภาษาขนาดใหญ่ (LLMs): ประกอบด้วยคำนิยามวิธีโดยความคิดเห็นชัดเจน และ Copilot ไม่ทำให้ผิดหวัง:
อาจต้องการการปรับแต่งเล็กน้อย แต่นั่นไม่ใช่ปัญหา มันได้เปลี่ยนแปลงเกมแล้ว
สรุป
นี่คือความก้าวหน้าที่ได้ทำสำเร็จในวันแรก มันเป็นวันที่ยาวนาน แต่ด้วยเครื่องมือและเทคโนโลยียุคใหม่ มันดีกว่าที่คาดไว้มากมาย
วันที่สอง: ยกมาตรฐาน
จากงานในวันแรก ตรรกะธุรกิจได้ถูกทำอย่างรวดเร็ว แต่สำหรับ SDK มันยังคงไม่เพียงพอ นี่คือภารกิจสำหรับวันที่สอง:
- เพิ่มการทดสอบหน่วย
- บังคับใช้อิมเมชั่นโค้ด
- ตรวจสอบความเข้ากันได้ของเวอร์ชัน Python
- เพิ่มการรวมต่อเนื่อง
- เผยแพร่ SDK
การทดสอบหน่วย
การทดสอบหน่วยช่วยเราได้หลายครั้ง ดังนั้นฉันจะไม่ข้ามมัน ข้อควรพิจารณาทั่วไปเมื ่อเขียนการทดสอบหน่วยคือ:
- วิธีการจัดระเบียบและรันการทดสอบ?
- วิธีการยืนยันผลลัพธ์?
- วิธีการรันการทดสอบแบบอะซิงโครนัส? (มันฟังดูเป็นเรื่องธรรมดา แต่บางครั้งมันก็สร้างปัญหาในบางภาษา)
- วิธีการจำลองการพึ่งพา? (อย่าเจาะลึกหัวข้อนี้จนกว่าจำเป็น เนื่องจากมันสามารถนำไปสู่โพรงกระต่าย)
- วิธีการสร้างรายงานการครอบคลุมของโค้ด?
ด้วยคำถามเหล่านี้ในใจ, ฉันพบว่ามอดูลในตัว unittest
ไม่เพียงพอสำหรับบางกรณี. ดังนั้นฉันเลือก pytest เป็นแฟรมเวิร์คในการทดสอบ. มันรองรับการทดสอบแบบอะซิงโครนัสและดูเหมือนครบถ้วนพอ
การเดินทางได้เปิดเผยแนวคิดใหม่ที่น่าสนใจอย่าง fixture
ให้ฉัน ซึ่งสามารถเป็นประโยชน์ต่อแนวคิดเมื่อเขียนโค้ดในภาษาอื่น
อิทธิพลของการจัดรูปแบบโค้ด
ทุกภาษามีรูปแบบการจัดรูปแบบโค้ดของตัวเอง ส่วนตัวแล้วการจัดรูปแบบที่สม่ำเสมอทำให้ฉันมีความสุขและสะดวกสบาย; นอกจากนี้ยังช่วยในการรีวิวโค้ดและการทำงานร่วมกันได้มาก ๆ
แทนที่จะถกเถียงเรื่องรูปแบบที่ "ดีที่สุด" ฉันตัดสินใจเลือกใช้อิมเมชั่นที่ตัดสินใจและติดตามมัน
Black ดูเหมือนเป็นตัวเลือกที่ดี ความไม่พอใจเดียวคือขนาดแท็บที่ไม่สามารถแก้ไขได้ แต่มันไม่ใช่เรื่องให ญ่ ฉันเลือกที่จะใช้มัน
ความเข้ากันได้ของเวอร์ชัน Python
ในฐานะ SDK, มันควรจะเข้ากันได้กับเวอร์ชัน Python ที่แพร่หลาย โดยการค้นหา "สถิติการใช้งานเวอร์ชัน python" ฉันตัดสินใจใช้ Python 3.8 เป็นเวอร์ชันขั้นต่ำ
คุณธรรมของการจัดการสภาพแวดล้อมเห็นได้ชัดเจน ฉันสามารถสลับเวอร์ชัน Python ได้ง่ายๆ โดยรัน pyenv local 3.8
และ poetry env use 3.8
. จากนั้นฉันสามารถรันการทดสอบเพื่อตรวจสอบปัญหาความเข้ากันได้ได้
การรวมต่อเนื่อง
การรวมต่อเนื่องรับประกันคุณภาพของการเปลี่ยนแปลงโค้ดทุกครั้ง เนื่องจากที่เก็บของเราได้รับการประกอบบน GitHub, GitHub Actions ก็เป็นตัวเลือกที่เป็นธรรมชาติ
กระบวนการทำงานหลักตามหลักการที่ง่าย:
- ตั้งค่าสภาพแวดล้อม
- ติดตั้งการพึ่งพา
- สร้างโปรเจกต์ (แต่ไม่จำเป็นใน Python)
- รันการทดสอบ
GitHub Actions มีชุมชนที่ดี, ดังนั้นมันใช้เวลาเพียงไม่กี่นาทีในการประกอบ เวิร์กโฟลว์.
โดยการใช้กลยุทธ์มาตรา, เราสามารถรันเวิร์กโฟลว์บนเวอร์ชัน Python ที่แตกต่างกันได้, แม้กระทั่งในระบบปฏิบัติการที่แตกต่างกัน
เผยแพร่ SDK
ขั้นตอนสุดท้ายคือการเผยแพร่ SDK สำหรับแพ็กเกจสาธารณะ, นี้สามารถทำได้โดยการส่งไปยังที่เก็บแพ็กเกจที่เกี่ยวข้องกับภาษานั้น เช่น npm สำหรับ Node.js, PyPI สำหรับ Python, และ CocoaPods สำหรับ Swift
Poetry เป็นดาวนำทางของฉัน แค่รัน poetry publish
เพื่อส่งแพ็กเกจไปที่ PyPI มันง่ายแบบนั้น
การปิดท้าย
มันเป็นการเดินทางที่น่าสนใจ โดยไม่ได้รับการช่วยเหลือจากชุมชนซอฟต์แวร์โอเพ่นซอร์ส มันจะยากกว่ามาก ขอเสียงปรบมือให้กับผู้ร่วมสร้างทุกคน!
นี่คือบางทับทั่วไปที่ได้รับ:
- กำหนดเป้าหมายอย่างชัดเจนและทำการแยกย่อยเสมอ แล้วคอยรักษาเป้าหมายนี้ในใจเสมอ
- ตั้งค่าสภาพแวดล้อมพัฒนาที่เสถียรและสามารถทำซ้ำได้
- ใช้ (เครื่องมือที่ดี) ให้มากที่สุดเท่าที่จะทำได้
- ให้ความสำคัญกับวิธีการแก้ปัญหาที่มีอยู่หรือวิธีอื่นก่อน
- เข้าใจมาตรฐานของภาษาและทุกบรรทัดที่คุณเขียน
- อย่างไรก็ตาม, อย่ายึดติดกับเรื่องเล็กน้อย
- ใช้ Copilot สำหรับงานที่ชัดเจนแบบบรรยาย
คุณสามารถหาโครงการสุดท้ายของเราได้ที่ ที่เก็บนี้. ด้วยกลยุทธ์เดียวกัน, ฉันยังสร้าง Logto PHP SDK ได้อย่างรวดเร็ว เช่นกัน. อย่าลังเลที่จะบอกให้เราทราบหากคุณมีคำแนะนำใด ๆ.
หวังว่าบทความนี้จะเป็นประโยชน์สำหรับการเรียนรู้ภาษาโปรแกรมใหม่. สนุกกับการแฮก!