Ачааллж байна...
Тавтай морил. Хэрэв та энэ хичээлийг уншиж байгаа бол Python-ийн анхан шатнаас эхэлж, ахисан түвшнийг дүүргэж, FastAPI-аар жинхэнэ web API бүтээж, Git, pytest, debugging зэрэг хөгжүүлэгчийн хэрэгслүүдийг өдөр тутмын дадал болгосон гэсэн үг. Энэ бол багагүй зам. Олон хүн эхний хэдэн долоо хоногт зогсдог бол та дөрвөн бүтэн сургалтыг давжээ. Энэ сургалт тэр бүх ажлын дээр босох тул эхний мөрөөс эхлэн таныг чадвартай, туршлагатай суралцагч гэж үзэж ярина. Гэхдээ тэвчээртэй, бүрэн тайлбарлах зарчим маань өөрчлөгдөхгүй, учир нь энэ сургалтын хамгийн хэцүү санаанууд хэнийг ч даруу болгодог.
Өмнөх сургалтууд голдуу “Python-оор юу хийж болох вэ” гэсэн асуултад хариулж ирсэн. Бид файл уншиж, class бичиж, API босгож, тест бичиж сурсан. Энэ сургалт өөр асуулт тавина: “Python өөрөө яг яаж ажилладаг вэ, тэр ажиллагааг би хэрхэн бүрэн эзэмших вэ?” Өөрөөр хэлбэл бид хэрэгслийг ашиглахаас гадна хэрэгслийн дотор орж харна. for loop-ийн ард юу болдог вэ, @ тэмдэг яг юу хийдэг вэ, with хэллэг яагаад файлыг заавал хаадаг вэ гэсэн, та өдөр бүр хэрэглэдэг атлаа дотор нь хэзээ ч ороогүй зүйлсийг бид нэг нэгээр нь задлах болно.
Энэ эхний хичээлд код байхгүй. Үүний оронд бид энэ сургалт юу амлаж, юу амлахгүй байгааг, таван түвшин ямар дарааллаар явахыг, мөн таны өмнөх дадлуудыг хэрхэн ашиглахыг тодорхой ярилцана. Сайн аялал эхлэхээс өмнө газрын зургаа харахтай адил энэ хичээл бол бидний газрын зураг юм.
Машин жолооддог хүн, машиныг ойлгодог хүн хоёрыг төсөөлөөд үзээрэй. Эхний хүн замын дүрэм мэддэг, хурдаа тохируулж, зогсоолд зөв тавьж чаддаг. Энэ бол жинхэнэ, үнэ цэнэтэй чадвар бөгөөд өдөр тутмын ихэнх аялалд хангалттай. Харин нэгэн өглөө хөдөлгүүрээс танихгүй дуу гарахад эхний хүн зөвхөн "ямар нэг юм болж байна" гэж мэднэ. Хоёр дахь хүн капотыг онгойлгож, дууг сонсоод "энэ бол оосор, энэ бол шахуурга" гэж ялгаж чадна. Хоёр дахь хүн илүү сайн жолооддог биш байж болох ч машин түүнд нууцгүй болсон байдаг.
Өмнөх дөрвөн сургалтаар та Python-ыг маш сайн жолооддог болсон. Энэ сургалтаар бид капотыг онгойлгоно. Гэхдээ зорилго маань механикч болж жолоодохоо болих биш, харин юу болж байгааг ойлгосноор илүү итгэлтэй, илүү ухаалаг жолоодох явдал юм. Капотын доорх зүйлсийг мэдэх тусам хачин алдаа гарахад айдас бага, шийдэл хурдан олддог. Шинэ хэрэгсэл, шинэ library-тай таарахад "энэ яаж бүтээгдсэн юм бол" гэж таамаглахын оронд бараг шууд ойлгох болно.
“Advanced” буюу "гүнзгий" гэдэг үгийг маш олон сургалт хэрэглэдэг ч ихэнхдээ тодорхой утгагүй хоосон шошго болдог. Тиймээс бид энэ үгэнд бодит, шалгаж болох утга өгье. Энэ сургалтыг дүүргэсний дараа та Python-ийн for loop-ийн ард юу болдгийг алхам алхмаар тайлбарлаж, өөрийн iterator class бичиж чадна. Мөн их хэмжээний өгөгдлийг санах ой дүүргэлгүй боловсруулах generator pipeline байгуулж чадна. Closure гэж юу болох, функц төрсөн орчноо хэрхэн үүрч явдгийг ойлгоно. Argument-тай decorator-ыг хуулахгүйгээр өөрөө эхнээс нь бичиж чадна. Энэ бүхнийг "мэддэг" гэхээс илүүтэй өөр хүнд тайлбарлаж чадахуйц ойлгоно.
Цааш нь та class-уудаа Python-ий жинхэнэ хэрэгсэл шиг ажилладаг болгох буюу + тэмдгээр нэмэгддэг, for loop-оор гүйгддэг, in-ээр асуугддаг болгож чадна. Нэрлэгдсэн design pattern-уудыг Python-ий хөнгөн хэв маягаар хэрэглэнэ. Type hint-ийг generic, Protocol хүртэл гүнзгийрүүлж, mypy-гаар шалгуулна. Кодын хурдыг таамаглахын оронд хэмжиж, хамгийн удаан хэсгийг нь олно. Эцэст нь threading, multiprocessing, asyncio гурвын аль нь аль ажилд тохирохыг зөв сонгож, тус бүрийг ажиллуулж чадна.
Энэ жагсаалт урт бөгөөд санаа зовоож магадгүй, гэхдээ нэг зүйлийг санаарай. Эдгээр бүгд өмнөх сургалтуудад таны аль хэдийн ашиглаж байсан зүйлс дээр тулгуурладаг. Та generator-ийг Course 2-т уулзсан, decorator-ыг хэрэглэж байсан, with-ийг FastAPI-д олон удаа бичсэн, async def-ийг уншсан. Энэ сургалт тэдгээр танил царайнуудыг танилцуулахаас илүүтэй бүрэн танихад зориулагдсан. Шинэ мэдлэгийн ихэнх нь хуучин мэдлэгийн гүн рүү ордог.
Шударга байх нь энэ сургалтын зарчим тул юу багтахгүйг ч тодорхой хэлье. Python-д metaclass ба descriptor гэх маш гүн механизмууд бий. Тэд class өөрөө хэрхэн бүтээгддэг, attribute-д хандах үед ард нь юу болдгийг удирддаг. Эдгээрийг бид заахгүй, харин сүүлийн хичээлд дараагийн тэнгэрийн хаяа болгон нэрлэж, хаана үргэлжлүүлэн судлахыг заана. Шалтгаан нь энгийн: ихэнх Python хөгжүүлэгчид тэдгээрийг бараг хэзээ ч өөрсдөө бичдэггүй, бичих шаардлага гарах үед энэ сургалтын суурь таныг бэлэн болгосон байх болно.
Мөн C хэл дээр Python extension бичих, Python санах ойг дотроос нь хэрхэн удирддаг тухай нарийн дотоод бүтэц, asyncio-ийн бүрэн экосистем (өөрийн server, stream гэх мэт) энэ сургалтад орохгүй. Python-д сүүлийн жилүүдэд “free-threading” буюу GIL-гүй ажиллах чиглэлд өөрчлөлтүүд гарч байгаа. Бид үүнийг threading-ийн бүлэгт нэг шударга догол мөрөөр, тухайн үеийн бодит байдлыг шалгасны дараа дурдана. Энэ бүхнийг дурдаж байгаа шалтгаан нь таныг айлгах биш, харин "гүнзгий" гэдэг үг "бүгдийг мэддэг" гэсэн утгагүйг харуулах явдал юм. Python-ийг бүтээгчид хүртэл түүний зарим булангаас шинэ зүйл сурсаар байдаг.
Сургалт таван түвшин, арван таван бүлэгт хуваагдана. Түвшин 1: Iteration-ийн эзэн нь for loop-ийн ард юу болдгоос эхэлнэ. Бид iterable ба iterator хоёрыг эцэст нь ялгаж, гараар next() дуудаж, өөрийн iterator class бичнэ. Дараа нь generator-ийн "түр зогсоох" чанарыг гүнзгий судалж, generator-уудыг хооронд нь конвейер шиг холбож, itertools ба functools-ийн хэрэгслүүдтэй танилцана. Түвшин маань том log файлыг санах ой дүүргэлгүй боловсруулдаг хэрэгслийн хамтарсан бүтээлээр төгсөнө.
Түвшин 2: Function-ийн эзэн нь closure-оос эхэлнэ. Энэ бол сургалтын хамгийн хэцүү санаануудын нэг бөгөөд бид түүнд маш тэвчээртэй хандана. Closure-ийг ойлгосны дараа decorator гэнэт ид шид биш энгийн логик болж хувирна. Бид decorator-ыг бүрэн эзэмшиж, argument-тай хувилбарыг ч бичнэ. Мөн with хэллэгийн ард байдаг context manager-уудыг өөрсдөө бүтээнэ. Энэ түвшин хэмжилт, давталт хийдэг жижиг хэрэгслийн сангаар төгсөнө.
Түвшин 3: OOP-ийн эзэн нь class-уудын гүнзгий хэрэгслүүд болох classmethod, staticmethod, dataclass-ийн нарийн боломжуудыг авч үзнэ. Дараа нь protocol-ууд, operator overloading-ийн тусламжтайгаар өөрийн class-уудыг Python-ий суурь төрлүүд шиг байгалийн мэт ажилладаг болгоно. Энэ түвшинд мөн design pattern-уудыг хий хоосон гоёлгүйгээр, Python маягаар судлаад, мэдэгдлийн систем бүтээж дуусгана.
Түвшин 4: Төрөл, алдаа, хурд нь гурван чухал мэргэжлийн сэдвийг нэгтгэнэ. Typing-ийг generic, Protocol хүртэл гүнзгийрүүлж, mypy-гаар шалгаж сурна. Exception-уудаа шатлал болгон зохион байгуулж, алдааны шалтгааны гинжийг уншиж сурна. Хамгийн гол нь кодын хурдыг таамаглахгүйгээр хэмжиж, удаан скриптийг хэмжилтэд тулгуурлан хурдасгана.
Түвшин 5: Зэрэгцээ ажиллагаа нь хамгийн сүүлд ирэх нь санаатай. Threading, GIL-ийн тухай үнэн, multiprocessing, эцэст нь asyncio-г бүрэн тайлбартайгаар судална. Энэ бол өмнөх бүх түвшний мэдлэг шаардагддаг сэдэв, учир нь generator, closure, context manager бүгд энд дахин гарч ирнэ. Сургалт маань хэд хэдэн эх сурвалжаас өгөгдлийг зэрэг татдаг async програмаар оргилдоо хүрнэ.
Course 4-т та Git болон pytest-ийг өдөр тутмын дадал болгосон. Энэ сургалт тэр дадлуудыг дахин заахгүй, харин зүгээр л ашиглана. Хамтарсан бүтээл бүрийг бид Git-ийн тусдаа branch дээр хийж, commit хийнэ. Хэд хэдэн хичээлд жижиг pytest тест бичигдэх бөгөөд энэ нь гэрийн даалгавар биш, харин тухайн кодыг үнэхээр ажиллаж байгаа эсэхийг харуулах арга юм. Тест бичигдэх үед бид түүнийг нэг богино догол мөрөөр тайлбарлаад цааш явна.
Мөн өмнөх шиг бүх код таны өөрийн компьютер дээр, таны өөрийн venv дотор ажиллана. Энэ сургалтын бүх хичээлд нэг venv, нэг Git repository ашиглахыг санал болгож байна, тэгвэл таны ажил нэг дор цугларч, эргэн харахад хялбар болно. Хэрэв Git эсвэл pytest-ийн аль нэг зүйл бүдэг санагдвал Course 4-ийн холбогдох хичээл рүү эргэж очих нь бүрэн хэвийн. Эдгээр нь танд үйлчилдэг хэрэгсэл, шалгалт биш.
Энэ сургалтын хамгийн хэцүү санаанууд нэг нийтлэг шинжтэй: тэд нүдэнд харагддаггүй. Generator түр зогсоход түүний доторх утгууд хаана хадгалагддаг вэ? Closure-ийн "үүргэвч" дотор яг юу байдаг вэ? Хоёр thread нэг хувьсагчид зэрэг бичихэд юу болдог вэ? Код ажиллахад эдгээр нь дэлгэц дээр хэвлэгдэхгүй тул бид тусгай арга хэрэглэнэ. Үүнийг trace буюу мөрдлөг гэж нэрлэнэ: эхлээд код, дараа нь алхам бүрийн дараа санах ойд юу байгааг Монгол хэлээр тодорхой бичсэн дараалал. Өмнөх сургалтуудад алдааны мессежийг Монгол хэлээр унших нь бидний гол арга байсан бол энэ сургалтад trace бол бидний гол арга юм.
Хоёр дахь хэв маяг нь хэмжилт. Энэ сургалтад "энэ арга илүү хурдан" гэсэн өгүүлбэр хэзээ ч хэмжилтгүйгээр гарахгүй. Хурд, санах ой, зэрэгцээ ажиллагааны тухай ямар ч мэдэгдэл код, хэмжих команд, өмнө ба дараах бодит тоонуудтай хамт ирнэ. Мөн тоонууд таны компьютер дээр өөр гарах нь хэвийн гэдгийг бид тэр болгон сануулна. Хэмжилт бол зөвхөн энэ сургалтын хэв маяг биш, мэргэжлийн хөгжүүлэгчийн хамгийн чухал дадлуудын нэг бөгөөд Түвшин 4-т бид үүнийг бүрэн дүрэм болгоно.
Өмнөх сургалтуудын дүрмүүд бүгд хэвээр. Шалгалт, тест, гэрийн даалгавар байхгүй. Сертификат нь хичээлүүдээ дүүргэснээр олгогдоно. Хичээл бүр нэг гол санаанд төвлөрч, түүнийг дор хаяж гурван жишээгээр бүрэн тайлбарлана. Iterator, closure, coroutine зэрэг техникийн нэр томьёонууд англиар үлдэх бөгөөд анх гарч ирэх үедээ Монгол хэлээр бүрэн тайлбарлагдана. Ингэснээр та англи хэл дээрх баримт бичиг, хариултуудыг ямар ч саадгүй уншиж чадна.
Хамгийн чухал нь хурдаа өөрөө сонгоно. Төлөвлөгөөгөөр долоо хоногт хоёр гурван хичээл үзвэл таван сар орчим болно, гэхдээ энэ бол зөвхөн нэг жишээ. Closure-ийн хичээлийг гурван удаа унших нь, эсвэл asyncio-гийн бүлэгт хэдэн долоо хоног зарцуулах нь бүрэн зөв. Ямар ч хурд зөв хурд.
Хүсвэл энэ сургалтад зориулж шинэ хавтас үүсгэж, дотор нь venv болон Git repository эхлүүлж болно. Ингэвэл дараагийн хичээлүүдийн бүх код нэг дор цугларна. Өөр нэг санаа бол Python-д та хэрэглэдэг атлаа дотор нь яг юу болдгийг тайлбарлаж чадахгүй гурван зүйлийг цаасан дээр бичих явдал. Жишээлбэл for loop, @ тэмдэг, with хэллэг байж болно. Сургалтын төгсгөлд тэр цаасыг дахин харахад нэг ч асуулт хариултгүй үлдээгүй байгаа нь сонирхолтой байх болно. Эдгээр нь зөвхөн санал бөгөөд дараагийн хичээлүүд та үүнийг хийсэн гэж огт үзэхгүй.
Энэ хичээлд код байхгүй тул алдааны мессеж ч байхгүй. Харин гүнзгий түвшний сургалтад хүмүүсийн түгээмэл гаргадаг хандлагын алдаанууд бий. Эхнийх нь хэцүү хичээлийг нэг уншаад бүрэн ойлгох ёстой гэж бодох. Closure, argument-тай decorator, race condition зэрэг сэдвүүдийг туршлагатай хөгжүүлэгчид ч хэд хэдэн удаа уншиж байж ойлгодог. Хоёр дахь удаагаа унших нь сул дорой байдал биш, энэ сэдвийн хэвийн зам юм.
Хоёр дахь алдаа нь trace-ийг алгасах. Trace-ууд урт, удаан санагдаж магадгүй бөгөөд кодыг харчихаад "ойлгосон" гэж цааш гүйх уруу таталт гарна. Гэвч энэ сургалтын үл харагдах санаануудыг ойлгох хамгийн найдвартай зам нь trace-ийг алхам алхмаар дагах явдал. Гурав дахь алдаа нь өөрийгөө бусадтай харьцуулах. Таны зорилго хэн нэгнээс хурдан дуусгах биш, харин сургалтын төгсгөлд "гүнзгий" гэдэг үгийг өөртөө шударгаар хэрэглэж чадах явдал.
Энэ сургалт Python-ийг ашиглахаас нэг алхам цааш, түүний дотоод ажиллагааг бүрэн эзэмших рүү чиглэнэ. Таван түвшинд бид iteration, function, OOP, төрөл ба хурд, эцэст нь зэрэгцээ ажиллагааг ээлжлэн судална. Metaclass, descriptor зэрэг хамгийн гүн механизмууд санаатайгаар орхигдсон бөгөөд сүүлийн хичээлд дараагийн алхам болгон нэрлэгдэнэ. Git болон pytest-ийн дадлууд хөнгөн байдлаар үргэлжилж, trace ба хэмжилт нь бидний хоёр шинэ гол хэрэгсэл болно. Шалгалт, гэрийн даалгавар байхгүй, хурдаа та өөрөө тогтооно.
Дараагийн хичээлээр бид капотыг анх удаа онгойлгоно. Таны мянга мянган удаа бичсэн энгийн for loop-ийн ард хоёр өөр ойлголт нуугдаж байдаг: iterable ба iterator. Өдөр тутмын ярианд эдгээрийг ихэвчлэн нэг утгаар хэрэглэдэг ч Python-ий хувьд тэд огт өөр зүйл юм. Яагаад list бол iterable боловч iterator биш вэ гэдгийг бид баталж харуулах бөгөөд энэ ялгааг ойлгосноор энэ түвшний бусад бүх хичээл байрандаа суух болно.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.