ЛЕКЦ 01: ПРОГРАМ ХАНГАМЖИЙН БҮТЭЭЛТ (Software Construction) — ТАНИЛЦУУЛГА
ХЭСЭГ 1: ҮНДСЭН ОЙЛГОЛТ БА ОНОЛ (Theory & Foundations)
1.1 Ерөнхий танилцуулга — Энэ хичээл юуны тухай вэ?
Та гар утсандаа өдөр бүр ашигладаг апп-уудыг (Instagram, Facebook, банкны апп гэх мэт) бодоод үзээрэй. Эдгээр бүгд програм хангамж (software) юм. Тэгвэл эдгээр програмыг яаж бүтээдэг вэ? Яг л барилга барихтай адил — зураг төсөл зурж, материал бэлтгэж, тоосго нэг нэгээр нь өрж, шалгаж, засаж, эцэст нь бэлэн болгодог.
Software Construction буюу "Програм хангамжийн бүтээлт" гэдэг нь програмыг бодитоор бүтээх үйл явц юм. Үүнд:
- Код бичих (Coding) — Компьютерт ойлгогдох хэлээр заавар бичих
- Шалгах (Testing) — Бичсэн код зөв ажиллаж байгаа эсэхийг нягтлах
- Алдаа засах (Debugging) — Алдаатай хэсгийг олж, залруулах
- Нэгтгэх (Integration) — Хэсэг хэсгүүдийг нийлүүлж бүхэл систем болгох
Амьдрал дээрх зүйрлэл: Байшин барих
Програм бүтээх нь байшин барихтай яг адил:
| Байшин барих | Програм бүтээх |
|---|---|
| Архитектор зураг зурна | Дизайнер системийн бүтцийг төлөвлөнө |
| Тоосго, цемент бэлтгэнэ | Хэрэгсэл, сан (library) бэлтгэнэ |
| Барилгачин тоосго өрнө | Програмист код бичнэ |
| Шалгагч чанар шалгана | Тестер програмыг шалгана |
| Алдаа олдвол засна | Алдаа (bug) олдвол засна |
SWEBOK (Software Engineering Body of Knowledge) номонд Software Construction нь програм хангамжийн инженерчлэлийн 15 мэдлэгийн салбарын нэг гэж тодорхойлсон.
1.2 Програм хангамжийн бүтээлт гэж яг юу вэ?
SWEBOK-ийн тодорхойлолтоор:
"Software construction гэдэг нь код бичих, шалгах (verification), нэгж тест (unit testing), интеграцийн тест (integration testing), алдаа засах (debugging) зэргийг хослуулан ажиллагаатай програм хангамжийг нарийвчлан бүтээх үйл явц юм."
Бусад салбартай хэрхэн холбогддог вэ?
Програм хангамжийн бүтээлт нь дангаараа байдаггүй — бусад чиглэлүүдтэй нягт холбоотой:
- Програмын дизайн (Software Design) — Юуг яаж хийхийг төлөвлөх. Бүтээлт нь дизайны гаралтыг (output) авч ашигладаг.
- Програмын тестчилэл (Software Testing) — Бүтээлтийн үеэр нэгж тест, интеграцийн тест хийдэг.
- Тохиргооны удирдлага (Configuration Management) — Код, баримт бичиг, тест зэргийг хянах.
- Чанарын удирдлага (Software Quality) — Код бол програмын эцсийн бүтээгдэхүүн тул чанар маш чухал.
Зүйрлэл: Хоол хийх
- Дизайн = Жор бичих (юу хийхийг төлөвлөх)
- Бүтээлт = Жорын дагуу хоол хийх (бодитоор гүйцэтгэх)
- Тест = Амталж үзэх (зөв болсон эсэхийг шалгах)
- Тохиргооны удирдлага = Жорын номоо эмх цэгцтэй хадгалах
1.3 Програм хангамжийн бүтээлтийн 5 ҮНДСЭН ЗАРЧИМ
SWEBOK-д Software Construction-ий 5 суурь зарчмыг тодорхойлсон. Эдгээрийг нэг бүрчлэн авч үзье.
1.3.1 Нарийн төвөгтэй байдлыг багасгах (Minimizing Complexity)
Асуудал: Хүний тархи нэг дор олон зүйлийг санаж, боловсруулах чадвар хязгаартай. Судалгаагаар хүн нэг удаад ердөө 7±2 мэдээллийн нэгжийг л тогтоож чаддаг (Жордж Миллерийн дүрэм).
Зарчим: Код бичихдээ "ухаалаг" код биш, энгийн, уншихад хялбар код бичих хэрэгтэй.
Амьдрал дээрх зүйрлэл: Та ном унших гэж байна гэж бодоорой. Аль нь дээр вэ?
- А) 500 хуудас бүгд нэг догол мөргүй, нэг удаа ч мөр шилжүүлэлгүй бичсэн ном
- Б) Бүлэг бүлгээр хуваасан, гарчигтай, зурагтай, товч тодорхой ном
Мэдээж Б) сонголт! Код ч яг адил — бүтэцтэй, ойлгомжтой байх ёстой.
Хэрхэн хэрэгжүүлэх вэ?
-
Нэршлийн стандарт (Naming conventions) — Хувьсагч, функцийн нэрийг утга санаа нь тодорхой байхаар өгөх
// Муу жишээ: int x = 25; // Сайн жишээ: int studentAge = 25; // Оюутны нас гэдэг нь тодорхой -
Модуль болгож хуваах (Modular decomposition) — Нэг том програмыг жижиг, тус тусдаа ажиллах хэсгүүдэд хуваах
-
Холбоосыг багасгах (Reducing coupling) — Хэсгүүд хоорондоо аль болох бага хамааралтай байх
-
Гүн үүрлэлтээс зайлсхийх — 3-аас дээш түвшний if/for үүрлэлт ойлгоход хэцүү болдог
-
Хийсвэрлэл (Abstraction) — Нарийн дэлгэрэнгүй зүйлийг нуух
1.3.2 Өөрчлөлтийг урьдчилан тооцох (Anticipating Change)
Асуудал: Бараг бүх програм хангамж цаг хугацааны явцад ӨӨРЧЛӨГДДӨГ. Судалгаагаар дундаж төслийн шаардлагын 25% нь хөгжүүлэлтийн явцад өөрчлөгддөг. Дахин ажиллах (rework) зардал нь анхнаасаа зөв хийснээс 10-100 дахин үнэтэй байдаг.
Зарчим: Програмыг ирээдүйд өөрчлөхөд хялбар байхаар бүтээх.
Амьдрал дээрх зүйрлэл: Та шинэ байшин барьж байна. Хэрэв ирээдүйд давхар нэмж болохоор суурийг бат бөх хийвэл — энэ бол "өөрчлөлтийг урьдчилан тооцсон" хэрэг. Харин суурийг яг л нэг давхарт зориулж хийвэл, дараа нь давхар нэмэхэд бүх зүйлийг нураагаад дахин барих шаардлагатай болно.
Хэрхэн хэрэгжүүлэх вэ?
- Сул холбоос (Loose coupling) — Хэсгүүдийг нэг нэгнээсээ тусгаарлах
- Мэдээлэл нуух (Information hiding) — Дотоод хэрэгжүүлэлтийг далдлах
- Тусгаарлалтын зарчим (Separation of concerns) — Өөр өөр үүрэг бүхий хэсгүүдийг салгах
- Дизайн загвар (Design patterns) — Батлагдсан шийдлүүдийг ашиглах
- Тохируулж болох өгөгдөл (Configurable data) — Тогтмол утгуудыг кодонд бус тохиргооны файлд хадгалах
1.3.3 Шалгах боломжтойгоор бүтээх (Constructing for Verification)
Асуудал: Алдааг аль болох эрт олох нь хожуу олохоос хамаагүй хямд. Алдааг эрт олох тусам засахад бага зардал гарна.
Зарчим: Програмыг бичигчид ч, тестерүүдэд ч, хэрэглэгчдэд ч алдааг амархан олж чадахаар бүтээх.
Амьдрал дээрх зүйрлэл: Машины үйлдвэрлэлд угсрах шугам дээр алхам бүрт чанарын шалгалт хийдэг — бэлэн машинаас алдаа олохоос угсрах явцад олох нь хэдэн зуу дахин хямд.
Хэрхэн хэрэгжүүлэх вэ?
- Кодын стандарт дагах → Кодын хянан шалгалтыг (code review) хөнгөвчлөх
- Нэгж тест (Unit testing) бичих → Жижиг хэсэг бүрийг тусгайлан шалгах
- Автомат тест дэмжих бүтцээр код зохион байгуулах
- Нарийн төвөгтэй хэлний бүтцийг хязгаарлах → Ойлгоход хялбар байлгах
1.3.4 Дахин ашиглалт (Reuse)
Асуудал: Аль хэдийн бүтээгдсэн, шалгагдсан зүйлийг дахин бүтээх нь цаг, мөнгөний шууд алдагдал.
Зарчим: Байгаа нөөцийг (сан, модуль, компонент, эх код) шинэ асуудлыг шийдвэрлэхэд дахин ашиглах.
Амьдрал дээрх зүйрлэл: Хоол хийхдээ бэлэн соус, бэлэн гурил ашиглах — бүгдийг тэг-ээс хийхгүй.
Хоёр талтай:
- Дахин ашиглахын тулд бүтээх (Construction FOR reuse) — Ирээдүйд өөр төслүүдэд ашиглахаар сан, компонент бүтээх
- Дахин ашиглаж бүтээх (Construction WITH reuse) — Өмнө бүтээсэн эсвэл бусдын бүтээсэн сан, фреймворкийг ашиглаж шинэ програм бүтээх
1.3.5 Бүтээлт дэх стандартууд (Standards in Construction)
Асуудал: Баг дотор хүн бүр өөр өөрийн дураар код бичвэл — нэг нь зүүнээс баруун тийш, нөгөө нь баруунаас зүүн тийш бичвэл — хамтран ажиллах боломжгүй болно.
Зарчим: Гадаад болон дотоод стандартуудыг мөрдөх нь үр ашиг, чанар, зардлыг сайжруулна.
Стандартуудын жишээ:
- Холбооны стандарт — Баримт бичгийн формат (жишээ нь UML диаграмм)
- Програмчлалын хэлний стандарт — Java, C++ хэлний стандартууд
- Кодын стандарт — Нэршил, байрлал, догол мөрний дүрмүүд
- Платформын стандарт — Үйлдлийн системтэй харьцах интерфейс
- Хэрэгслийн стандарт — UML гэх мэт тэмдэглэгээний стандарт
Амьдрал дээрх зүйрлэл: Замын хөдөлгөөний дүрэм — хүн бүр дүрмийн дагуу жолоодвол осол бага гардаг. Код бичих стандарт ч яг үүнтэй адил.
1.4 Бүтээлтийн удирдлага (Managing Construction)
Програм хангамжийн бүтээлт нь зүгээр л "суугаад код бич" гэсэн зүйл биш. Энэ нь сайтар удирдаж, төлөвлөж, хэмжиж байх ёстой үйл явц юм.
1.4.1 Амьдралын мөчлөгийн загварууд дахь бүтээлт (Construction in Life Cycle Models)
Програм хангамж бүтээх олон өөр арга зам (загвар) байдаг. Тэдгээрийг хоёр том бүлэгт хуваадаг:
А) Шугаман загварууд (Linear Models)
Waterfall (Хүрхрээ) загвар — Алхам бүрийг дарааллаар, бүрэн дуусгаж дараагийнх руу шилждэг.
Шаардлага → Дизайн → Бүтээлт (код бичих) → Тест → Ашиглалт
Зүйрлэл: Байшин барихдаа эхлээд бүх зураг төслийг 100% бэлтгээд, дараа нь суурь, дараа нь хана, дараа нь дээвэр... Нэг алхмыг дуусгахгүйгээр дараагийнхыг эхэлдэггүй.
Давуу тал: Энгийн, ойлгомжтой, баримт бичиг сайн Сул тал: Өөрчлөлтөд уян хатан биш, алдааг хожуу илрүүлдэг
Б) Давталттай загварууд (Iterative Models)
Agile (Хурдан, уян хатан) загвар — Богино давталтуудаар (Sprint) ажиллаж, давталт бүрт ажиллагаатай бүтээгдэхүүн гаргадаг.
[Sprint 1: Төлөвлөх→Бүтээх→Тестлэх→Гаргах]
[Sprint 2: Төлөвлөх→Бүтээх→Тестлэх→Гаргах]
[Sprint 3: ...]
Зүйрлэл: Хоол хийхдээ жоорыг нэг нэгээр нь амталж, давс нэмэх, чанах гэх мэтээр алхам бүрт шалгаж, тохируулж байдаг.
Давуу тал: Өөрчлөлтөд уян хатан, алдааг эрт олдог, захиалагч байнга бүтээгдэхүүнийг харж чаддаг Сул тал: Сайн багийн ажиллагаа шаарддаг, баримт бичиг бага
Head First Software Development номонд: "Agile хөгжүүлэлт нь захиалагчтай байнга харилцаж, хурдан, чанартай бүтээгдэхүүн гаргахыг зорьдог" гэж тодорхойлсон.
1.4.2 Бүтээлтийн төлөвлөлт (Construction Planning)
Бүтээлтийн төлөвлөлтөд дараах шийдвэрүүдийг гаргадаг:
- Бүтээлтийн арга сонгох — Waterfall уу, Agile уу?
- Нэгтгэлийн стратеги тодорхойлох — Бүх хэсгийг нэг дор нэгтгэх (Big Bang) эсвэл аажмаар нэгтгэх (Incremental)?
- Компонентуудыг бүтээх дараалал тогтоох
- Чанарын удирдлагын процесс тодорхойлох
- Даалгаврыг хуваарилах — Хэн юу хийх
Зүйрлэл: Аялалд гарахын өмнө маршрут төлөвлөдөг шиг — хаанаас эхлэх, хаана зогсох, хэн юу авч явах гэдгийг урьдчилж тохирдог.
1.4.3 Бүтээлтийн хэмжилт (Construction Measurement)
Юу хэмжиж болох вэ?
| Хэмжигдэхүүн | Тайлбар |
|---|---|
| Бичсэн кодын хэмжээ | Хэдэн мөр код бичигдсэн |
| Өөрчилсөн кодын хэмжээ | Хэдэн мөр засагдсан |
| Дахин ашигласан код | Бэлэн кодыг хэр ашигласан |
| Кодын нарийн төвөгтэй байдал | Цикломатик нарийн төвөгтэй байдал (Cyclomatic complexity) |
| Алдааны олдох/засах хурд | Алдааг хэр хурдан олж, засаж байгаа |
| Хүчин чармайлт | Хэдэн хүн/цаг зарцуулагдсан |
Зүйрлэл: Биеийн жин, цусны даралт хэмжих шиг — эдгээр тоо нь "бүтээлтийн эрүүл мэнд"-ийг харуулна.
1.5 Практик асуудлууд (Practical Considerations)
Програм хангамжийн бүтээлт бол онол бус — бодит ертөнцийн хязгаарлалт, хаос, өөрчлөлттэй нүүр тулдаг ажил. Програм хангамжийн инженерчлэлийн бүх салбараас бүтээлт нь хамгийн "гар урлал"-тай төстэй.
1.5.1 Бүтээлтийн дизайн (Construction Design)
Хэдийгээр дизайн нь тусдаа үе шатанд хийгддэг ч, бүтээлтийн явцад жижиг хэмжээний дизайны ажил байнга хийгддэг.
Зүйрлэл: Барилгачин хана өрж байхдаа архитекторын зурагт байхгүй жижиг нарийн зүйлийг (жишээ нь: кабелийн суваг яаж оруулах) шийдэж байдаг шиг, програмист ч код бичихдээ алгоритм, өгөгдлийн бүтэц, интерфейсийн жижиг дизайны шийдвэрүүдийг гаргадаг.
1.5.2 Бүтээлтийн хэлнүүд (Construction Languages)
Хүн компьютерт заавар өгөхийн тулд програмчлалын хэл ашигладаг. Хэлнүүдийг ангилбал:
А) Тохиргооны хэл (Configuration Language)
- Хязгаарлагдмал сонголтуудаас сонгож програм тохируулдаг
- Жишээ: Windows-ийн
.iniфайл, XML тохиргоо
Б) Хэрэгслийн хэл (Toolkit Language)
- Бэлэн хэрэгслийн багцаас програм бүтээдэг
- Жишээ: WordPress-ийн plugin тохиргоо
В) Скрипт хэл (Scripting Language)
- Автоматжуулах, хялбар даалгавруудад
- Жишээ: Python, JavaScript, Bash
Г) Програмчлалын хэл (Programming Language)
- Хамгийн уян хатан, хамгийн их сургалт шаарддаг
- Жишээ: Java, C++, C#
Тэмдэглэгээний 3 төрөл:
| Төрөл | Тайлбар | Жишээ |
|---|---|---|
| Хэл зүйн (Linguistic) | Текстэн тэмдэгтүүдийг ашигладаг | Java, C++, Python |
| Албан ёсны (Formal) | Математик тодорхойлолтод суурилдаг | Event-B, Z |
| Харааны (Visual) | Дүрслэлийн элементүүдийг ашигладаг | MatLab, Scratch |
1.5.3 Код бичих (Coding)
Код бичих нь бүтээлтийн гол үйл ажиллагаа. Анхаарах зүйлс:
- Нэршлийн дүрэм — Хувьсагч, функцийн нэрийг утгатай, тодорхой өгөх
- Бүтэц зохион байгуулалт — Код кластер (class), пакет (package), модулиар зохион байгуулах
- Удирдлагын бүтэц (Control structures) — if, for, while зэргийг зөв ашиглах
- Алдааг зохицуулах — Буруу оролтыг зөв арчлах
- Аюулгүй байдал — Buffer overflow, array index зэрэг аюулгүй байдлын цоорхойг сэргийлэх
- Нөөцийн ашиглалт — Thread, database lock зэргийг зөв удирдах
- Баримтжуулалт — Код дотор болон гадна баримт бичиг
- Кодын оновчлол — Гүйцэтгэлийг сайжруулах (гэхдээ хэт эрт оновчлохоос зайлсхийх)
"Premature optimization is the root of all evil" — Donald Knuth (Хэт эрт оновчлол бол бүх бузрын эх)
1.5.4 Бүтээлтийн тестчилэл (Construction Testing)
Бүтээлтийн үед хоёр төрлийн тест хийдэг:
А) Нэгж тест (Unit Testing)
- Програмын жижиг хэсгийг (функц, класс) тусгайлан шалгах
- Жишээ: "Энэ функц 2+3=5 гэж зөв тооцоолж байна уу?"
Б) Интеграцийн тест (Integration Testing)
- Хэсгүүд хоорондоо зөв ажиллаж байгааг шалгах
- Жишээ: "Нэвтрэх хэсэг ба мэдээллийн сан хоорондоо зөв харилцаж байна уу?"
Зорилго: Алдааг оруулсан цаг ба олсон цагийн хоорондох зайг багасгах → Засах зардлыг бууруулах.
1.5.5 Бүтээлтийн чанар (Construction Quality)
Чанарыг хангах үндсэн аргууд:
- Нэгж тест ба интеграцийн тест
- Тест-түрүүлсэн хөгжүүлэлт (Test-First Development / TDD) — Эхлээд тест бичээд, дараа нь код бичих
- Assertion ба хамгаалалтын програмчлал (Defensive programming)
- Алдаа засалт (Debugging)
- Кодын хянан шалгалт (Code inspections, reviews)
- Статик шинжилгээ (Static analysis) — Кодыг ажиллуулахгүйгээр шинжлэх
1.5.6 Нэгтгэл (Integration)
Тусдаа бүтээсэн хэсгүүдийг нэг системд нэгтгэх. Хоёр арга байдаг:
А) Шатлалт нэгтгэл (Big Bang Integration)
- Бүх хэсгийг дуусгаад нэг дор нэгтгэх
- Сул тал: Алдаа олоход маш хэцүү — "хаана алдаа байна" гэдэг нь тодорхойгүй
Б) Аажмын нэгтгэл (Incremental Integration)
- Хэсэг хэсгээр нэмж нэгтгэх, нэгтгэх бүрт шалгах
- Давуу тал: Алдааг амархан олно, явц тодорхой, эрт бүтээгдэхүүн гаргана
Зүйрлэл:
- Big Bang = 1000 ширхэг LEGO-г бүгдийг нь дор нь угсрах гэж оролдох
- Incremental = LEGO-г 10-10-аар нь угсарч, алхам бүрт зөв байгааг шалгах
1.6 Бүтээлтийн технологиуд (Construction Technologies)
1.6.1 API-ийн дизайн ба ашиглалт (API Design and Use)
API (Application Programming Interface) гэдэг нь нэг програм нөгөө програмтай "ярилцах" арга зам юм.
Зүйрлэл: Ресторанд очиход та гал тогоонд ороод өөрөө хоол хийдэггүй. Үүний оронд цэс (menu) авч, зөөгчөөр дамжуулан захиалга өгдөг. Цэс бол API — танд ямар зүйл боломжтойг хэлж, дотоод нарийн ширийнийг далдалдаг.
Сайн API-ийн шинж чанарууд:
- Сурахад хялбар, цээжлэхэд амархан
- Уншигдахуйц код бичихэд тусалдаг
- Буруу ашиглахад хэцүү
- Өргөтгөхөд хялбар
- Бүрэн гүйцэд, хоёшоо нийцтэй (backward compatible)
1.6.2 Объект хандлагат ажиллагааны асуудлууд (Object-Oriented Runtime Issues)
Объект хандлагат хэлнүүд (Java, C# гэх мэт) ажиллах үеийн хоёр чухал механизмыг дэмждэг:
А) Полиморфизм (Polymorphism)
- Нэг ерөнхий үйлдэл нь объектийн бодит төрлөөс хамааран өөр өөрөөр ажиллах чадвар
- Зүйрлэл: "Дуугар" гэж хэлэхэд нохой "хав хав", муур "мяу мяу" гэдэг — нэг команд, өөр өөр хариу
Б) Рефлекц (Reflection)
- Програм ажиллаж байх үедээ өөрийн бүтцийг харж, өөрчилж чаддаг чадвар
- Зүйрлэл: Хүн толинд харж өөрийгөө танидаг, өөрийн хувцсаа солидог шиг
1.6.3 Параметрчлал ба ерөнхий төрлүүд (Parameterization and Generics)
Generics нь нэг код бичээд олон төрлийн өгөгдөлтэй ажиллах боломж олгодог.
Зүйрлэл: Хайрцаг (Box) гэж нэг загвар хийнэ. Энэ хайрцагт ном ч, жимс ч, тоглоом ч хийж болно — хайрцгийн загвар ижил, зөвхөн дотор нь юу хийхээ сонгоно.
// Generics-гүй (муу) — Юу байгааг мэдэхгүй
List list = new ArrayList();
list.add("Hello");
String s = (String) list.get(0); // Төрөл хувиргах шаардлагатай
// Generics-тэй (сайн) — Яг юу байгаа нь тодорхой
List<String> list = new ArrayList<>();
list.add("Hello");
String s = list.get(0); // Шууд ашиглана, аюулгүй
1.6.4 Assertion, Гэрээгээр дизайн, Хамгаалалтын програмчлал
А) Assertion (Батламж)
- Кодонд оруулсан "шалгах цэг" — тодорхой нөхцөл үргэлж үнэн байх ёстой гэж зарладаг
- Хөгжүүлэлтийн үед ажилладаг, бэлэн бүтээгдэхүүнд хасагддаг
assert age >= 0 : "Нас сөрөг байж болохгүй!";
Б) Гэрээгээр дизайн (Design by Contract)
- Функц бүр "гэрээ" байгуулдаг: "Надад ийм оролт өг (precondition), би чамд ийм гаралт өгнө (postcondition)"
- Зүйрлэл: Эмнэлэгт очиход "Та 8 цаг хоосон ирнэ (урьдчилсан нөхцөл) → Бид цусны шинжилгээний үр дүн өгнө (дараах нөхцөл)"
В) Хамгаалалтын програмчлал (Defensive Programming)
- Буруу оролтоос програмыг хамгаалах
- Бүх оролтын утгыг шалгаж, буруу оролтыг зөв зохицуулах
1.6.5 Алдаа зохицуулалт ба Exception (Error/Exception Handling)
Програм ажиллах явцад алдаа гарах нь зайлшгүй. Үүнийг зөв зохицуулах нь чухал.
Exception (Онцгой нөхцөл) — Програмын хэвийн ажиллагааг тасалдуулах үйл явдал.
try {
// Алдаа гарч болох код
int result = 10 / 0;
} catch (ArithmeticException e) {
// Алдааг барьж зохицуулах
System.out.println("Тэгд хуваах боломжгүй!");
} finally {
// Юу ч тохиолдсон гүйцэтгэх
System.out.println("Энэ хэсэг үргэлж ажиллана");
}
Зүйрлэл: Онгоцонд аюулгүй байдлын зааварчилгаа байдаг шиг — ямар нэг зүйл буруу болвол юу хийхийг урьдчилж төлөвлөсөн байдаг.
1.6.6 Тест-түрүүлсэн програмчлал (Test-First Programming / TDD)
TDD (Test-Driven Development) нь код бичихээс ӨМНӨ тест бичдэг арга юм.
3 алхамтай мөчлөг (Red-Green-Refactor):
- 🔴 Red — Эхлээд шалгах тест бичих (тест амжилтгүй болно, учир нь код байхгүй)
- 🟢 Green — Тестийг давахад хангалттай хамгийн бага хэмжээний код бичих
- 🔵 Refactor — Кодыг цэвэрлэж, сайжруулах (тест давсаар байх ёстой)
Зүйрлэл: Шалгалтын асуулт эхлээд бичээд (тест), дараа нь хариултыг бэлтгэх (код) — ингэхээр яг юу хийх ёстойгоо тодорхой мэднэ.
1.7 Бүтээлтийн хэрэгслүүд (Software Construction Tools)
1.7.1 Хөгжүүлэлтийн орчин (IDE — Integrated Development Environment)
IDE гэдэг нь програмист код бичих, ажиллуулах, шалгах бүх хэрэгслийг нэг дор нэгтгэсэн програм юм.
Зүйрлэл: Тогоочийн гал тогоо — хутга, тогоо, зуух, угаалтуур бүгд нэг дор байдаг шиг, IDE-д код засварлагч, компайлер, дебаггер бүгд нэг дор байна.
Алдартай IDE-үүд:
- IntelliJ IDEA — Java хөгжүүлэлтэд хамгийн түгээмэл
- Visual Studio Code — Олон хэлийг дэмждэг хөнгөн IDE
- Eclipse — Java-д зориулсан нээлттэй эхийн IDE
- NetBeans — Java-д зориулсан үнэгүй IDE
1.7.2 GUI бүтээгч (GUI Builders)
GUI Builder нь "Юу харагдаж байна тэр нь болно" (WYSIWYG) горимоор хэрэглэгчийн интерфейс бүтээх хэрэгсэл.
Зүйрлэл: PowerPoint дээр слайд хийдэг шиг — товч, текст, зургийг чирж, тавьж, хэмжээг нь тохируулж интерфейс бүтээдэг.
1.7.3 Нэгж тестийн хэрэгслүүд (Unit Testing Tools)
- JUnit — Java хэлний хамгийн алдартай нэгж тестийн фреймворк
- TestNG — JUnit-ийн өргөтгөсөн хувилбар
- Mockito — Хуурамч объект (mock) үүсгэх хэрэгсэл
1.7.4 Гүйцэтгэлийн шинжилгээний хэрэгслүүд (Profiling Tools)
Код ажиллаж байх үед хаана удааширч байгааг олж тогтоох хэрэгслүүд.
Зүйрлэл: Замын түгжрэл хаана байгааг камераар хяндаг шиг — profiler нь кодын "түгжрэл"-ийг (bottleneck) олж өгдөг.
ХЭСЭГ 2: ТҮЛХҮҮР ҮГ БА МЭРГЭЖЛИЙН НЭР ТОМЬЁО (Keywords & Glossary)
| # | Англи нэр томьёо | Монгол утга | Дэлгэрэнгүй тайлбар |
|---|---|---|---|
| 1 | Software Construction | Програм хангамжийн бүтээлт | Код бичих, шалгах, алдаа засах, нэгтгэх зэрэг үйл ажиллагааны цогц. Барилгын жишээгээр бол тоосго өрж, хана босгож, байшин барих үйл явц. |
| 2 | SWEBOK | Програм хангамжийн инженерчлэлийн мэдлэгийн сан | IEEE Computer Society-ийн баталсан, програм хангамжийн инженерчлэлийн бүх мэдлэгийг нэгтгэсэн лавлах гарын авлага. |
| 3 | Coding | Код бичих | Компьютерт ойлгогдох хэлээр заавар бичих үйл явц. Монголоор "код зохиох" ч гэж хэлэх боломжтой. |
| 4 | Debugging | Алдаа засалт / Алдаа олох | Кодонд байгаа алдааг (bug) олж, шалтгааныг нь тогтоож, засах үйл явц. "Bug" гэдэг нь "шавж" гэсэн үг — анхны компьютерт шавж орж алдаа гаргасан түүхтэй. |
| 5 | Unit Testing | Нэгж тестчилэл | Програмын хамгийн жижиг хэсгийг (нэг функц, нэг класс) тусгайлан, бусдаас тусгаарлаж шалгах. Жишээ нь нэг тооцоолох функц зөв хариу өгч байгааг шалгах. |
| 6 | Integration Testing | Нэгтгэлийн тестчилэл | Хоёр ба түүнээс олон хэсэг хоорондоо зөв ажиллаж байгааг шалгах. Жишээ нь нэвтрэх хэсэг ба мэдээллийн сан хоорондоо зөв холбогдож байгааг шалгах. |
| 7 | Minimizing Complexity | Нарийн төвөгтэй байдлыг багасгах | Хүний тархи хязгаарлагдмал тул кодыг аль болох энгийн, ойлгомжтой бичих зарчим. |
| 8 | Anticipating Change | Өөрчлөлтийг урьдчилан тооцох | Ирээдүйд програмыг өөрчлөх шаардлагатай болохыг тооцож, өөрчлөхөд хялбар байхаар бүтээх зарчим. |
| 9 | Constructing for Verification | Шалгах боломжтойгоор бүтээх | Алдааг амархан олж, засаж болохоор кодыг бүтэцлэх зарчим. |
| 10 | Reuse | Дахин ашиглалт | Өмнө бүтээгдсэн код, сан, компонентыг шинэ асуудал шийдвэрлэхэд дахин ашиглах. "Дугуйг дахин зохиохгүй" зарчим. |
| 11 | Standards | Стандартууд | Баримтлах дүрэм, журам. Нэршил, формат, хэрэгсэл ашиглах дүрмүүд. Замын хөдөлгөөний дүрэмтэй адил — бүгд нэг дүрмийг дагахад эмх цэгц бий болно. |
| 12 | Waterfall Model | Хүрхрээ загвар | Шугаман дараалалтай хөгжүүлэлтийн загвар. Нэг алхмыг бүрэн дуусгаж дараагийнх руу шилждэг. |
| 13 | Agile | Уян хатан хөгжүүлэлт | Богино давталтуудаар (sprint) ажиллаж, байнга бүтээгдэхүүн гаргаж, хэрэглэгчийн санал хүсэлтэд нийцүүлэн өөрчилдөг арга зүй. |
| 14 | Sprint | Спринт / Давталт | Agile хөгжүүлэлтийн нэг давталт. Ихэвчлэн 1-4 долоо хоног. Энэ хугацаанд тодорхой ажлуудыг гүйцэтгэж, ажиллагаатай бүтээгдэхүүний хэсэг гаргадаг. |
| 15 | Big Bang Integration | Нэг удаагийн нэгтгэл | Бүх хэсгийг тусдаа бүтээгээд, эцэст нь нэг дор нэгтгэх арга. Алдааны эх сурвалжийг олоход маш хэцүү. |
| 16 | Incremental Integration | Аажмын нэгтгэл | Хэсэг хэсгээр нэгтгэж, алхам бүрт шалгаж явдаг арга. Алдааг амархан олдог. |
| 17 | API | Програмын хэрэглээний интерфейс | Нэг програм нөгөө програмтай харилцах стандартчилсан арга зам. Ресторанд цэс захиалдаг шиг — дотоод үйл явцыг мэдэх шаардлагагүй. |
| 18 | Polymorphism | Олон хэлбэрт байдал | Нэг ерөнхий үйлдэл нь объектийн төрлөөс хамааран өөр өөрөөр ажиллах чадвар. |
| 19 | Reflection | Рефлекц / Өөрийгөө шинжлэх | Програм ажиллаж байх үедээ өөрийн бүтцийг харж, өөрчилж чаддаг чадвар. |
| 20 | Generics | Ерөнхий төрлүүд | Нэг код бичээд олон төрлийн өгөгдөлтэй ажиллах боломж олгодог механизм. |
| 21 | Assertion | Батламж / Нотолгоо | Кодонд тодорхой нөхцөл үнэн байх ёстой гэж зарлах шалгах цэг. Хөгжүүлэлтийн үед алдааг эрт олоход тусалдаг. |
| 22 | Design by Contract | Гэрээгээр дизайн | Функц бүр урьдчилсан нөхцөл (precondition) ба дараах нөхцөл (postcondition) тогтоож "гэрээ" байгуулдаг арга. |
| 23 | Defensive Programming | Хамгаалалтын програмчлал | Буруу оролтоос програмыг хамгаалах арга барил. Бүх оролтыг шалгаж, найдвартай болгох. |
| 24 | Exception Handling | Онцгой нөхцөл зохицуулалт | Програмын ажиллах явцад гарч болох алдааг try-catch бүтцээр барьж зохицуулах. |
| 25 | TDD (Test-Driven Development) | Тест-түрүүлсэн хөгжүүлэлт | Эхлээд тест бичээд, дараа нь кодыг бичдэг хөгжүүлэлтийн арга. Red-Green-Refactor мөчлөгтэй. |
| 26 | IDE | Нэгдсэн хөгжүүлэлтийн орчин | Код бичих, компайл хийх, дебаг хийх, тест ажиллуулах бүх хэрэгслийг нэг програмд нэгтгэсэн орчин. |
| 27 | GUI | Графикт хэрэглэгчийн интерфейс | Хэрэглэгч програмтай цонх, товч, цэс гэх мэтээр харилцдаг дүрслэлийн интерфейс. |
| 28 | WYSIWYG | "Юу харагдаж байна тэр нь болно" | Дизайн хийж байх үед эцсийн үр дүн яг тэр чигтээ харагдах горим. |
| 29 | Coupling | Холбоос / Хамаарал | Модулиуд хоорондын хамааралын зэрэг. Бага coupling = сайн (модулиуд бие даасан). |
| 30 | Cohesion | Нэгдмэл байдал | Нэг модуль доторх элементүүд хэр нягт холбоотой байгааг хэмждэг. Өндөр cohesion = сайн. |
| 31 | Refactoring | Дахин бүтэцлэх | Кодын ажиллагааг өөрчлөхгүйгээр дотоод бүтцийг сайжруулах. Байшинг нураахгүйгээр дотоод засвар хийх шиг. |
| 32 | Life Cycle Model | Амьдралын мөчлөгийн загвар | Програм хангамжийг эхнээс нь дуустал хөгжүүлэх үйл явцыг тодорхойлсон арга зам (Waterfall, Agile гэх мэт). |
| 33 | Configuration Management | Тохиргооны удирдлага | Код, баримт бичиг, тестийн өөрчлөлтийг хянах, удирдах үйл явц. Git зэрэг хэрэгслийг ашигладаг. |
| 34 | Code Review | Кодын хянан шалгалт | Нэг хүний бичсэн кодыг өөр хүн уншиж, шалгаж, санал өгөх үйл явц. |
| 35 | Static Analysis | Статик шинжилгээ | Кодыг ажиллуулахгүйгээр шинжилж, алдаа, аюулгүй байдлын асуудлыг олох. |
| 36 | Profiling | Гүйцэтгэлийн дүн шинжилгээ | Код ажиллаж байх үед хаана их цаг зарцуулж байгааг хэмждэг. |
| 37 | Middleware | Зуучлагч програм | Үйлдлийн систем ба програмын хооронд байрладаг, үйлчилгээ хангадаг програм хангамж. |
| 38 | Concurrency | Зэрэгцээ боловсруулалт | Олон ажлыг нэг зэрэг гүйцэтгэх чадвар. Thread, semaphore, mutex зэргийг ашигладаг. |
| 39 | Fault Tolerance | Алдаанд тэсвэртэй байдал | Системд алдаа гарсан ч үйл ажиллагааг үргэлжлүүлэх чадвар. |
| 40 | Cyclomatic Complexity | Цикломатик нарийн төвөгтэй байдал | Кодын бүтцийн нарийн төвөгтэй байдлыг тоогоор хэмждэг. Кодонд хэдэн бие даасан зам байгааг тоолдог. Тоо их байх тусам → ойлгоход хэцүү, алдаатай байх магадлал өндөр. |