Хөгжүүлэлтийн орчин ба Хэрэгслүүд
Хөгжүүлэлтийн орчин (development environment) гэдэг нь код бичихдээ өдөр бүр ашигладаг tool-уудын багц юм. Голд нь текст засах workflow байна; үүн дээр syntax highlighting, type checking, formatter, autocomplete зэрэг зүйлс нэмэгдэнэ. VS Code зэрэг IDE (Integrated Development Environment) эдгээрийг нэг app дотор багтаадаг. Харин Terminal төвтэй workflow-д tmux, Vim, Zsh, мөн тухайн хэлний CLI tool-ууд болох Ruff (Python linter/formatter), Mypy (Python type checker) зэрэг ордог.
IDE болон Terminal төвтэй workflow хоёр хоёулаа давуу, сул талтай. GUI-тэй IDE сурахад амар, AI autocomplete зэрэг integration нь ихэвчлэн шууд бэлэн байдаг. Terminal workflow харин хөнгөн, remote server эсвэл GUI байхгүй орчинд бараг цорын ганц сонголт болох үе бий. Аль алиных нь суурийг мэдээд, ядаж нэгийг нь сайн эзэмшээрэй. Одоогоор дуртай IDE байхгүй бол VS Code-оос эхлэхэд зүгээр.
Энэ лекцээр бид дараах зүйлсийг үзнэ:
- Текст редактор ба Vim
- Code intelligence ба хэлний серверүүд
- AI-д суурилсан хөгжүүлэлт
- Өргөтгөлүүд болон IDE-ийн бусад боломжууд
Текст редактор ба Vim
Код бичих үед цагийн ихэнх нь урт текст тасралтгүй бичихэд биш, код дотор хурдан шилжих, хэсэг хэсгээр нь унших, жижиг засваруудыг зөв газарт нь хийхэд зарцуулагддаг. Vim яг ийм төрлийн ажилд маш сайн таарсан текст редактор.
Vim-ийн философи. Vim-ийн гол санаа нь энгийн хэрнээ хүчтэй: интерфейс нь өөрөө текст дотор шилжих, засах жижиг “хэл” шиг ажилладаг. Товчлуурууд нь command, command-уудыг хооронд нь compose хийж болно. Vim mouse-оос зайлсхийдэг, сумтай товчлуураас ч аль болох татгалздаг, учир нь гарын байрлалаа байнга өөрчлөх нь удаан. Дасчихвал editor бараг бодсон хурдаар чинь хөдөлж байгаа мэт мэдрэмж төрдөг.
Бусад програм дахь Vim-ийн дэмжлэг. Энэ санааг ашиглахын тулд заавал цэвэр Vim дээр амьдрах албагүй. Текст засдаг олон tool built-in байдлаар эсвэл plugin-аар “Vim mode” дэмждэг. VS Code-д VSCodeVim, Zsh-д Vim emulation-ийн built-in support, Claude Code-д хүртэл Vim editor mode-ийн built-in support бий. Таны хэрэглэдэг editor эсвэл текст оруулдаг tool Vim mode дэмждэг байх магадлал өндөр.
Модал горимоор засварлах
Vim бол модал засварлагч (modal editor) юм: энэ нь өөр өөр төрлийн ажлуудад зориулагдсан өөр өөр горимуудтай.
- Normal (Хэвийн): файл дотор шилжих болон засвар хийхэд зориулагдсан
- Insert (Оруулах): текст бичихэд зориулагдсан
- Replace (Орлуулах): текстийг дээрээс нь дарж бичихэд зориулагдсан
- Visual (ердийн, мөр мөрөөр, эсвэл блок): текстийг сонгоход зориулагдсан
- Command-line (Command line): command ажиллуулахад зориулагдсан
Товчлуурууд нь өөр өөр горимд өөр өөр утгатай байдаг. Жишээлбэл, Insert горимд x үсгийг дарахад зүгээр л “x” тэмдэгт бичигдэх бол Normal горимд энэ нь курсор доор байгаа тэмдэгтийг устгана, харин Visual горимд сонгосон текстийг устгах болно.
Эхний тохиргоогоор Vim одоогийн горимыг зүүн доод буланд харуулдаг. Анхны горим нь Normal горим байна. Та цагийнхаа ихэнх хэсгийг Normal болон Insert горимуудын хооронд шилжиж зарцуулна.
Та дурын горимоос Normal горим руу буцахдаа <ESC> товчлуурыг дарж шилжинэ. Normal горимоос Insert горим руу орохдоо i, Replace горим руу орохдоо R, Visual горим руу орохдоо v, Visual Line горим руу орохдоо V, Visual Block горим руу орохдоо <C-v> (Ctrl-V эсвэл ^V), харин Command-line горим руу орохдоо : дараарай.
Vim-ийг ашиглах үед та <ESC> товчлуурыг маш их дарах болно: тиймээс Caps Lock товчлуурыг Escape болгож солих (macOS заавар) эсвэл энгийн товчны хослолоор <ESC> товчлуурын өөр холбоос үүсгэх талаар бодоорой.
Үндсэн ойлголт: Текст оруулах
Normal горимоос i дарахад Insert горимд шилжинэ. Одоо Vim нь таныг буцаад Normal горимд шилжихээр <ESC> дарах хүртэл бусад ердийн текст редакторид шиг ажиллах болно. Энэ нь дээр дурдсан үндсэн ойлголтуудын хамт Vim ашиглан файлыг засварлаж эхлэхэд хангалттай (гэхдээ Insert горимоос бүх зүйлийг хийгээд байвал тийм ч үр дүнтэй биш байх болно).
Vim-ийн интерфейс бол програмчлалын хэл юм
Vim-ийн интерфейс бол програмчлалын хэл юм. Товчлуурууд (цээжлэхэд хялбар нэрстэй) нь command-ууд бөгөөд тэдгээр нь хамт ажиллаж (compose) чаддаг. Энэ нь кодоор хурдан шилжих болон засварлахад туслах бөгөөд гарны байрлалыг сурсны дараа бичих үйлдэл үр дүнтэй болдог шиг эдгээр command-ууд таны булчингийн санах ойд орох үед маш өндөр бүтээмжтэй болно.
Шилжилт
Та ихэнх цагаа Normal горимд өнгөрөөж, кодоор шилжихийн тулд шилжих command-уудыг ашиглах хэрэгтэй. Vim дэх шилжилтүүдийг текстийн хэсгийг заадаг тул “нэр үг” (nouns) гэж нэрлэж болно.
- Үндсэн шилжилт:
hjkl(зүүн, доош, дээш, баруун) - Үгсээр:
w(дараагийн үг),b(үгний эхлэл),e(үгний төгсгөл) - Мөрөөр:
0(мөрний эхлэл),^(эхний хоосон биш тэмдэгт),$(мөрний төгсгөл) - Дэлгэцээр:
H(дэлгэцийн дээд хэсэг),M(дэлгэцийн дунд хэсэг),L(дэлгэцийн доод хэсэг) - Гүйлгэх:
Ctrl-u(дээш),Ctrl-d(доош) - Файлаар:
gg(файлын эхлэл),G(файлын төгсгөл) - Мөрний дугаараар:
:{number}<CR>эсвэл{number}G({number} дахь мөр)<CR>нь carriage return буюу enter товчлуурыг илэрхийлнэ
- Бусад:
%(хаалт зэрэг таарч буй хос тэмдэгт рүү шилжих) - Тэмдэгт хайх:
f{character},t{character},F{character},T{character}- одоогийн мөрөн дээрх {character} тэмдэгтийг урагш/ухрааж хайх
- таарсан хэсгүүдээр шилжихэд
,/;ашиглана
- Хайлт:
/{regex}, таарсан хэсгүүдээр шилжихэдn/Nашиглана
Сонгох
Visual горимууд:
- Visual:
v - Visual Line (Мөрөөр сонгох):
V - Visual Block (Блокчлон сонгох):
Ctrl-v
Текстийг сонгохдоо дээрх шилжилтийн товчлууруудыг ашиглаж болно.
Засварлах
Урьд нь хулганаар хийдэг байсан бүх зүйлээ одоо гарнаас, шилжилтийн command-уудтай хамтран ажилладаг засварлах command-уудыг ашиглан хийнэ. Эндээс л Vim-ийн интерфейс програмчлалын хэл шиг харагдаж эхэлнэ. Vim-ийн засварлах command-ууд нь нэр үг дээр үйлдэл хийдэг тул тэдгээрийг “үйл үг” (verbs) гэж нэрлэдэг.
iInsert горимд шилжих- гэхдээ текстийг устгах, өөрчлөхдөө backspace-ээс илүү зүйлийг ашиглах хэрэгтэй
o/Oдоор / дээр шинэ мөр нээж Insert горимд орохd{motion}{motion} шилжилтээр устгах- жишээ нь,
dwүг устгах,d$мөрний төгсгөл хүтель устгах,d0мөрний эхлэл хүртэл устгах
- жишээ нь,
c{motion}{motion} шилжилтийн текстийг өөрчлөх- жишээ нь,
cwүгийг өөрчлөх - энэ нь
d{motion}хийгээд дараа ньiдарахтай адил үйлдэл юм
- жишээ нь,
xтэмдэгтийг устгах (dlcommand-тай адил)sтэмдэгтийг орлуулах (clcommand-тай адил)- Visual горим + үйлдэл
- текстийг сонгоод, устгахын тулд
d, өөрчлөхийн тулдcдарна
- текстийг сонгоод, устгахын тулд
uүйлдлийг буцаах,<C-r>үйлдлийг дахин хийхyхуулах / “yank” (устгахdзэрэг зарим command-ууд текстийг мөн хуулдаг)pхуулсан текстийг буулгах- Сурах зүйл маш олон: жишээ нь,
~нь үсгийн томоор бичсэнийг жижиг, жижгийг том болгоно, харинJнь мөрүүдийг нэгтгэнэ.
Тоолох
Та нэр үг болон үйл үгийг тоотой хослуулан ашиглаж болох бөгөөд ингэснээр тухайн үйлдлийг заасан тоогоор давтан хийнэ.
3w3 үг урагш шилжих5j5 мөр доош шилжих7dw7 үг устгах
Хувиргагчид (Modifiers)
Та нэр үгний утгыг өөрчлөхийн тулд хувиргагчийг ашиглаж болно. Зарим хувиргагчид нь доторх гэсэн утгатай i (inner эсвэл inside) болон тойрсон гэсэн утгатай a (around) юм.
ci(хаалт доторх агуулгыг өөрчлөхci[дөрвөлжин хаалт доторх агуулгыг өөрчлөхda'хашилттай тэмдэгт мөрийг хашилттай нь хамт устгах
Бүгдийг нэгтгэх нь
Доор алдаатай бичигдсэн fizz buzz програмыг харуулав:
def fizz_buzz(limit):
for i in range(limit):
if i % 3 == 0:
print("fizz", end="")
if i % 5 == 0:
print("fizz", end="")
if i % 3 and i % 5:
print(i, end="")
print()
def main():
fizz_buzz(20)
Бид дараах command-ын дарааллыг ашиглан Normal горимоос эхлэн алдааг засах болно:
- Main функцыг хэзээ ч дуудаагүй байна
Gдарж файлын төгсгөлд очноoдарж доор нь шинэ мөр нээнэif __name__ == "__main__": main()гэж бичнэ- Хэрэв таны засварлагч Python хэлийг дэмждэг бол Insert горимд автоматаар догол мөр үүсгэж магадгүй
<ESC>дарж Normal горимдоо буцна
- Давталт 1-ээс биш 0-ээс эхэлж байна
/дараадrangeгэж бичиж Enter (<CR>) дарж “range” үгийг хайнаwwдарж хоёр үг урагшилна (та2wашиглаж болох ч амьдрал дээр цөөн тоогоор шилжихэд товчлуурыг давтан дарах нь элбэг байдаг)iдарж Insert горимд шилжиж,1,гэж нэмнэ<ESC>дарж Normal горимдоо буцнаeдарж дараагийн үгний төгсгөл рүү шилжинэaдарж текст нэмж бичих горимд шилжээд,+ 1гэж нэмнэ<ESC>дарж Normal горимдоо буцна
- 5-д хуваагдах тоонд “fizz” гэж хэвлэж байна
:6<CR>ажиллуулж 6 дахь мөрөнд очноci"ажиллуулж хашилтын доторхыг өөрчлөөд"buzz"болгоно<ESC>дарж Normal горимдоо буцна
Vim сурах нь
Vim-ийг сурах хамгийн сайн арга бол үндсэн ойлголтуудыг (энэ хүртэл үзсэн зүйлс) сураад, дараа нь өөрийн бүх програм дээр Vim горимыг идэвхжүүлж практикт шууд ашиглаж эхлэх юм. Хулгана болон сумтай товчлуурыг ашиглах хэрэгцээг гаргахгүй байхыг хичээгээрэй; зарим засварлагчид зөв дадал суулгахын тулд сумтай товчлуурын холбоосыг идэвхгүй болгож болно.
Нэмэлт эх сурвалжууд
- Өмнөх жилийн Vim лекц — бид тэнд Vim-ийг илүү гүнзгийрүүлэн авч үзсэн
vimtutorбол Vim-тэй хамт суудаг зааварчилгаа програм юм — хэрэв Vim суулгасан бол та shell-ээсээvimtutorгэж ажиллуулан нээж болно- Vim Adventures бол Vim сурах тоглоом юм
- Vim Tips Wiki
- Vim Advent Calendar нь янз бүрийн Vim зөвлөмжүүдтэй
- VimGolf бол Vim-ийн интерфейсийг ашиглан уралддаг code golf тоглоом юм
- Vi/Vim Stack Exchange
- Vim Screencasts
- Practical Vim (ном)
Кодын оюун ухаан ба Хэлний серверүүд
IDE-үүд нь ерөнхийдөө Language Server Protocol-ийг хэрэгжүүлдэг хэлний серверүүдтэй (language servers) холбогдох IDE өргөтгөлүүдээр дамжуулан кодыг семантик байдлаар ойлгож, тухайн хэлэнд зориулсан дэмжлэгүүдийг санал болгодог. Жишээлбэл, VS Code-д зориулсан Python extension нь Pylance дээр суурилдаг бөгөөд Go extension нь gopls-ийг ашигладаг. Хөгжүүлэлт хийж буй хэлнийхээ өргөтгөл болон хэлний серверийг суулгаснаар та өөрийн IDE дээр дараах боломжуудыг идэвхжүүлэх боломжтой:
- Код автоматаар нөхөх. Илүү сайн автомат нөхөлт болон зөвлөмжүүд, тухайлбал
object.гэж бичсэний дараа тухайн объектын талбарууд болон аргуудыг харах боломж. - Шууд баримт бичиг. Курсороо аваачихад болон автомат нөхөлтийн явцад тайлбар баримтыг харах.
- Тодорхойлолт руу шилжих. Кодын хэрэглэгдэж буй хэсгээс түүний тодорхойлолт руу шууд үсрэх (jump-to-definition), жишээ нь
object.fieldгэсэн лавлагаанаас уг талбарын анх тодорхойлогдсон хэсэг рүү шилжих. - Лавлагааг олох. Дээрх үйлдлийн эсрэгээр, тухайн талбар эсвэл төрөл кодын хаана хаана ашиглагдаж байгааг олох (find references).
- Импортыг цэгцлэх. Импортыг зохион байгуулах, ашиглагдаагүй импортыг устгах, дутуу импортыг тэмдэглэх.
- Кодыг форматлагч. Эдгээр хэрэгслүүдийг дангаар нь ажиллуулж болохоос гадна энэ боломжийг хэлний серверүүд мөн санал болгодог. Кодыг форматлагч нь кодыг автоматаар догол мөр үүсгэн форматлаж, төрөл шалгагч болон линтерүүд нь таныг бичиж байх явцад кодын алдааг олж харуулдаг. Бид эдгээр функцийг Кодын чанар лекц-ээр илүү дэлгэрэнгүй үзэх болно.
Хэлний серверийг тохируулах
Зарим хэлний хувьд танд зөвхөн өргөтгөл болон хэлний серверийг суулгахад л хангалттай байх болно. Бусад хэлний хувьд хэлний серверийг бүрэн дүүрэн ашиглахын тулд IDE-д өөрийн ажиллаж буй орчныг зааж өгөх шаардлагатай болдог. Жишээлбэл, VS Code-д өөрийн Python-ий ажиллах орчныг зааж өгснөөр хэлний сервер таны суулгасан багцуудыг олж харж болно. Орчны талаар манай Кодыг тээвэрлэх ба суулгах лекц-ээр илүү дэлгэрэнгүй үзэх болно.
Тухайн хэлнээс хамааран та өөрийн хэлний серверт зориулж зарим тохиргоог хийж болно. Жишээлбэл, VS Code-ийн Python дэмжлэгийг ашиглан Python-ий нэмэлт төрлийн тэмдэглэгээ ашигладаггүй төслүүдийн хувьд статик төрөл шалгах үйлдлийг идэвхгүй болгож болно.
AI-д суурилсан хөгжүүлэлт
2021 оны дунд үеэс эхлэн OpenAI-ийн Codex загвар дээр суурилсан GitHub Copilot гарч ирснээр LLM-үүдийг програм хангамжийн инженерчлэлд маш өргөнөөр ашиглах болсон. Одоогоор ашиглагдаж буй үндсэн гурван хэлбэр нь: autocomplete, inline chat болон coding agents юм.
Автомат нөхөлт
AI-д суурилсан автомат нөхөлт нь таны IDE дэх уламжлалт автомат нөхөлттэй ижил хэлбэртэй бөгөөд таныг бичиж байх явцад курсор байгаа байрлалд кодын үргэлжлэлийг санал болгодог. Заримдаа энэ нь цаанаа ажилладаг идэвхгүй функц байдлаар ашиглагддаг. Үүнээс гадна AI-ийн автомат нөхөлтийг кодын сэтгэгдэл ашиглан prompt хийж чиглүүлж болно.
Жишээлбэл, лекцийн тэмдэглэлийн агуулгыг татаж аваад түүн доторх бүх холбоосыг салгаж авах скрипт бичицгээе. Дараах кодоор эхэлж болно:
import requests
def download_contents(url: str) -> str:
Загвар нь функцийн биеийг автоматаар нөхөх болно:
response = requests.get(url)
return response.text
Бид сэтгэгдэл ашиглан автомат нөхөлтийг цааш чиглүүлж болно. Жишээлбэл, хэрэв бид Markdown холбоосыг салгаж авах функц бичиж эхэлсэн боловч түүнд тодорхой нэр өгөөгүй бол:
def extract(contents: str) -> list[str]:
Загвар ингэж зүйлийг санал болгож магадгүй:
lines = contents.splitlines()
return [line for line in lines if line.strip()]
Бид үүнийг кодын сэтгэгдлээр дамжуулан чиглүүлж чадна:
def extract(content: str) -> list[str]:
# extract all Markdown links from the content
Энэ удаад загвар илүү сайн нөхөлт санал болгоно:
import re
pattern = r'\[.*?\]\((.*?)\)'
return re.findall(pattern, content)
Эндээс бид AI хэрэгслийн нэг сул талыг харж болно: энэ нь зөвхөн курсор байгаа байрлалд нөхөлт хийдэг. Энэ тохиолдолд import re санг функцийн дотор биш, модулийн эхэнд бичих нь илүү зөв практик байх байсан юм.
Дээрх жишээнд сэтгэгдэл ашиглан кодын автомат нөхөлтийг хэрхэн чиглүүлж болохыг харуулахын тулд тодорхой бус нэртэй функцийг ашигласан; амьдрал дээр та extract_links гэх мэт илүү тодорхой нэртэй функц бичиж, түүнд docstrings бичих нь зүйтэй (үүнд үндэслэн загвар дээрхтэй ижил нөхөлтийг санал болгоно).
Үзүүлэн дасгалын зорилгоор бид скриптийг гүйцээж бичиж болно:
print(extract(download_contents("https://raw.githubusercontent.com/missing-semester/missing-semester/refs/heads/master/_2026/development-environment.md")))
Inline chat (Шууд чат)
Inline chat нь танд тодорхой мөр эсвэл кодын хэсгийг сонгоод AI загварт шууд өөрчлөлт оруулах хүсэлт өгөх боломж өгдөг. Энэ горимд загвар нь бэлэн байгаа кодонд өөрчлөлт оруулж чаддагаараа (зөвхөн курсорын ард код нэмдэг автомат нөхөлтөөс ялгаатай) давуу талтай.
Дээрх жишээг үргэлжлүүлэн, бид гадны requests санг ашиглахаас татгалзсан гэж бодъё. Бид холбогдох 3 мөр кодыг сонгож аваад inline chat-ыг нээж дараах хүсэлтийг өгч болно:
use built-in libraries instead
Загвар дараах өөрчлөлтийг санал болгоно:
from urllib.request import urlopen
def download_contents(url: str) -> str:
with urlopen(url) as response:
return response.read().decode('utf-8')
Хөгжүүлэлтийн агентууд
Coding agents-ийн талаар Агентлаг програмчлал лекцээр дэлгэрэнгүй үзэх болно.
Зөвлөх програм хангамж
Түгээмэл хэрэглэгддэг AI IDE-үүд бол GitHub Copilot өргөтгөл бүхий VS Code болон Cursor юм. GitHub Copilot нь одоогоор оюутнууд, багш нар болон түгээмэл нээлттэй эхийн төслийг хөгжүүлэгчдэд үнэ төлбөргүй ашиглаж болно байдаг. Энэ салбар маш хурдацтай хөгжиж байгаа бөгөөд тэргүүлэгч бүтээгдэхүүнүүд нь ерөнхийдөө ижил төстэй функцуудыг санал болгож байна.
Өргөтгөлүүд болон бусад IDE-ийн функцууд
IDE-үүд нь маш сайн хэрэгсэл бөгөөд өргөтгөлүүдийн (extensions) тусламжтайгаар бүр ч илүү сайн болдог. Бид эдгээр бүх боломжийг нэг лекцээр багтаан зааж чадахгүй тул түгээмэл хэрэглэгддэг цөөн хэдэн өргөтгөлийг энд дурдъя. Та энэ чиглэлээр өөрөө бие даан судлаарай; онлайнд маш олон шилдэг өргөтгөлийн жагсаалтууд байдаг (жишээ нь, Vim-ийн залгаасуудад зориулсан Vim Awesome болон VS Code extensions sorted by popularity).
- Development containers: Түгээмэл IDE-үүдийн дэмждэг dev container-ууд (жишээ нь, VS Code-ийн дэмждэг) хөгжүүлэлтийн tool-уудаа container дотор ажиллуулах боломж өгдөг. Энэ нь portable байдал болон isolation-д их хэрэгтэй. Кодыг тээвэрлэх ба суулгах лекц дээр container-ийн талаар дэлгэрэнгүй үзнэ.
- Remote development (Алсаас хөгжүүлэлт хийх): SSH ашиглан алсын сервер дээр хөгжүүлэлт хийх (жишээ нь, VS Code-ийн Remote SSH plugin залгаасоор дамжуулан). Энэ нь, жишээлбэл, үүлэн дээрх сайн GPU бүхий машин дээр код бичиж ажиллуулахад маш тохиромжтой байдаг.
- Collaborative editing (Хамтран засварлах): Нэг файлыг Google Docs шиг зэрэг хамтран засварлах (жишээ нь, VS Code-ийн Live Share plugin залгаасоор дамжуулан).
Дасгал ажил
- Өөрийн ашигладаг, Vim горимыг дэмждэг бүх програм хангамж (код засварлагч, shell гэх мэт) дээр Vim горимыг идэвхжүүлж, дараагийн нэг сарын турш текст засварлах бүх ажилдаа Vim горимыг ашиглаарай. Ямар нэгэн үйлдэл үр ашиггүй санагдах эсвэл “үүнийг хийх илүү сайн арга байгаа байх” гэж бодогдох бүрд Google-ээс хайж үзээрэй, илүү сайн арга заавал байх болно.
- VimGolf-оос аль нэг даалгаврыг биелүүлж туршина уу.
- Өөрийн ажиллаж буй төсөлд зориулан IDE өргөтгөл болон хэлний серверийг тохируулна уу. Сангийн хамаарлуудын тодорхойлолт руу шилжих (jump-to-definition) зэрэг хүлээгдэж буй бүх боломжууд зөв ажиллаж байгаа эсэхийг шалгана уу. Хэрэв танд ашиглах бэлэн код байхгүй бол GitHub-аас аль нэг нээлттэй эхийн төслийг (жишээ нь, үүнийг) ашиглаж болно.
- IDE өргөтгөлүүдийн жагсаалтыг гүйлгэн харж, өөрт хэрэгтэй санагдсан нэг өргөтгөлийг суулгана уу.
Лиценз: CC BY-NC-SA.