ЛЕКЦ 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 | Цикломатик нарийн төвөгтэй байдал | Кодын бүтцийн нарийн төвөгтэй байдлыг тоогоор хэмждэг. Кодонд хэдэн бие даасан зам байгааг тоолдог. Тоо их байх тусам → ойлгоход хэцүү, алдаатай байх магадлал өндөр. |
ХЭСЭГ 3: ЛАБОРАТОРИ БА ПРАКТИК ЗААВАР (Labs & Step-by-Step Guide)
3.1 Бэлтгэл шаардлага (Requirements)
Энэ лабораторид та Java хэл дээр анхны програмаа бичиж, Software Construction-ий суурь зарчмуудыг практикт хэрэгжүүлнэ.
Шаардлагатай зүйлс:
- Java JDK 17+ суулгасан байх (https://adoptium.net)
- Eclipse IDE for Enterprise Java and Web Developers суулгасан байх (https://www.eclipse.org/downloads/packages/)
- Компьютер дээр интернэт холболт
3.2 Алхам 1: Java болон IDE суулгах
Java JDK суулгах:
- https://adoptium.net хуудас руу орно
- "Latest LTS Release" товч дарна
- Өөрийн үйлдлийн системд тохирох хувилбарыг (Windows/Mac/Linux) татна
- Суулгагчийг ажиллуулж, зааврын дагуу суулгана
- Терминал/Command Prompt нээж шалгана:
java --version # Java хувилбар харагдах ёстой
javac --version # Java компайлер хувилбар харагдах ёстой
Eclipse IDE суулгах:
- https://www.eclipse.org/downloads/packages/ хуудас руу орно
- "Eclipse IDE for Enterprise Java and Web Developers" хувилбарыг татна
- Суулгагчийг ажиллуулж, workspace фолдер сонгоно
3.3 Алхам 2: Анхны Java төсөл үүсгэх
- Eclipse IDE-г нээнэ
- File → New → Java Project сонгоно
- Дараах тохиргоог хийнэ:
- Project name:
SoftwareConstructionLab01 - JRE: JavaSE-17 (суулгасан хувилбар)
- Project layout: Create separate folders for sources and class files
- Project name:
- "Finish" дарна
3.4 Алхам 3: "Hello World" — Анхны програм
src фолдер дотор Main.java файл үүсгэж дараах кодыг бичнэ:
public class Main { // Main нэртэй класс зарлаж байна (програмын эхлэх цэг)
public static void main(String[] args) { // main функц — Java програм эндээс эхэлдэг
System.out.println("Сайн байна уу! Энэ бол миний анхны Java програм!"); // Дэлгэцэнд текст хэвлэх
}
}
Ажиллуулах: Main.java файл дээр баруун товч → Run As → Java Application эсвэл Ctrl + F11
3.5 Алхам 4: Нарийн төвөгтэй байдлыг багасгах зарчмыг практикт хэрэгжүүлэх
Муу кодыг сайн код болгон өөрчлөх жишээ:
// ===== МУУ КОД (Нарийн төвөгтэй, ойлгоход хэцүү) =====
public class BadExample {
public static void main(String[] args) {
int a = 85; // a юу гэсэн үг вэ? Тодорхойгүй!
if (a >= 90) { // 90 юу гэсэн үг вэ? Тодорхойгүй!
System.out.println("A");
} else if (a >= 80) {
System.out.println("B");
} else if (a >= 70) {
System.out.println("C");
} else if (a >= 60) {
System.out.println("D");
} else {
System.out.println("F");
}
}
}
// ===== САЙН КОД (Энгийн, ойлгомжтой, стандартын дагуу) =====
public class GoodExample {
// Тогтмол утгуудыг нэрлэсэн тогтмолд (named constant) хадгалах
private static final int GRADE_A_THRESHOLD = 90; // "A" үнэлгээний доод хязгаар
private static final int GRADE_B_THRESHOLD = 80; // "B" үнэлгээний доод хязгаар
private static final int GRADE_C_THRESHOLD = 70; // "C" үнэлгээний доод хязгаар
private static final int GRADE_D_THRESHOLD = 60; // "D" үнэлгээний доод хязгаар
public static void main(String[] args) {
int studentScore = 85; // Оюутны оноо — нэр нь утгатай
String grade = calculateGrade(studentScore); // Тусдаа функцэд үнэлгээ тооцуулах
System.out.println("Үнэлгээ: " + grade); // Үр дүнг хэвлэх
}
/**
* Оюутны оноогоор үнэлгээ тооцоолох функц.
* @param score оюутны оноо (0-100)
* @return үнэлгээ (A, B, C, D, F)
*/
public static String calculateGrade(int score) { // Тусдаа функц — нэг үүрэгтэй
if (score >= GRADE_A_THRESHOLD) return "A"; // Тогтмол ашигласан — утга тодорхой
if (score >= GRADE_B_THRESHOLD) return "B";
if (score >= GRADE_C_THRESHOLD) return "C";
if (score >= GRADE_D_THRESHOLD) return "D";
return "F";
}
}
Юу сайжирсан бэ?
- Хувьсагчийн нэр утгатай болсон (
a→studentScore) - Шидэт тоонууд (magic numbers) тогтмол болсон (
90→GRADE_A_THRESHOLD) - Логик тусдаа функцэд гарсан → Дахин ашиглаж болно, тестлэхэд хялбар
3.6 Алхам 5: Exception Handling практик
import java.util.Scanner; // Хэрэглэгчээс оролт авах сан
public class ExceptionDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // Оролт авах объект үүсгэх
System.out.print("Эхний тоо оруулна уу: ");
try { // Алдаа гарч болох хэсгийг try-д оруулна
int num1 = Integer.parseInt(scanner.nextLine()); // Текстийг тоо руу хөрвүүлэх
System.out.print("Хоёр дахь тоо оруулна уу: ");
int num2 = Integer.parseInt(scanner.nextLine());
int result = divide(num1, num2); // Хуваах функцийг дуудах
System.out.println("Үр дүн: " + result);
} catch (NumberFormatException e) { // Тоо биш зүйл оруулсан бол
System.out.println("Алдаа: Зөвхөн бүхэл тоо оруулна уу!");
} catch (ArithmeticException e) { // Тэгд хуваасан бол
System.out.println("Алдаа: Тэгд хуваах боломжгүй!");
} finally {
scanner.close(); // Нөөцийг чөлөөлөх (үргэлж хийгдэнэ)
}
}
/**
* Хоёр тоог хуваах функц — Defensive Programming жишээ
* @param a хуваагдагч
* @param b хуваагч (0 байж болохгүй)
* @return хуваалтын үр дүн
*/
public static int divide(int a, int b) {
if (b == 0) { // Урьдчилсан нөхцөл шалгах (precondition)
throw new ArithmeticException("Хуваагч тэг байж болохгүй");
}
return a / b;
}
}
3.7 Алхам 6: Энгийн нэгж тест бичих (JUnit ашиглахгүйгээр)
public class SimpleTest {
public static void main(String[] args) {
// Тест 1: A үнэлгээ шалгах
testGrade(95, "A", "Тест 1"); // 95 оноо → "A" байх ёстой
// Тест 2: B үнэлгээ шалгах
testGrade(85, "B", "Тест 2"); // 85 оноо → "B" байх ёстой
// Тест 3: F үнэлгээ шалгах
testGrade(50, "F", "Тест 3"); // 50 оноо → "F" байх ёстой
// Тест 4: Хилийн утга шалгах (boundary)
testGrade(90, "A", "Тест 4"); // Яг 90 → "A" байх ёстой
testGrade(89, "B", "Тест 5"); // 89 → "B" байх ёстой
System.out.println("Бүх тест дууслаа!");
}
/**
* Тест хийх туслах функц
* @param score шалгах оноо
* @param expected хүлээгдэж буй үр дүн
* @param testName тестийн нэр
*/
public static void testGrade(int score, String expected, String testName) {
String actual = GoodExample.calculateGrade(score); // Бодит үр дүнг авах
if (actual.equals(expected)) { // Хүлээгдэж буй ба бодит ижил үү?
System.out.println("✅ " + testName + " ДАВЛАА");
} else {
System.out.println("❌ " + testName + " БҮТЭЛГҮЙ — Хүлээсэн: "
+ expected + ", Гарсан: " + actual);
}
}
}
ХЭСЭГ 4: ШАЛГАЛТЫН АСУУЛТ (Knowledge Check — 100 тест)
Тест 1
Software Construction гэж юу вэ?
- A) Зөвхөн код бичих үйл явц
- B) Код бичих, шалгах, алдаа засах, нэгтгэх зэрэг үйл ажиллагааны цогц
- C) Зөвхөн програмын дизайн хийх
- D) Зөвхөн тест бичих
Зөв хариулт: B
Тайлбар: SWEBOK-ийн тодорхойлолтоор Software Construction нь coding, verification, unit testing, integration testing, debugging зэргийг бүгдийг хамардаг. A нь зөвхөн нэг хэсгийг, C ба D нь огт өөр салбарууд.
Тест 2
SWEBOK нь юуны товчлол вэ?
- A) Software Engineering Body of Knowledge
- B) Software Engineering Book of Knowledge
- C) System Engineering Body of Knowledge
- D) Software Excellence Body of Knowledge
Зөв хариулт: A
Тайлбар: SWEBOK = Software Engineering Body of Knowledge — IEEE Computer Society-ийн баталсан програм хангамжийн инженерчлэлийн мэдлэгийн сан. B-д "Book" биш "Body" гэдгийг анхаарна уу.
Тест 3
Software Construction нь дараах аль салбартай хамгийн нягт холбоотой вэ?
- A) Software Requirements ба Software Maintenance
- B) Software Design ба Software Testing
- C) Project Management ба Configuration Management
- D) Software Quality ба Computing Foundations
Зөв хариулт: B
Тайлбар: SWEBOK-д Construction нь Design (дизайны гаралтыг авч ашигладаг) ба Testing (бүтээлтийн явцад unit test, integration test хийдэг)-тэй хамгийн нягт холбоотой гэж заасан.
Тест 4
"Minimizing Complexity" зарчмын гол шалтгаан юу вэ?
- A) Компьютерийн санах ой хязгаарлагдмал
- B) Хүний тархи нарийн төвөгтэй мэдээллийг боловсруулах чадвар хязгаарлагдмал
- C) Програмчлалын хэлнүүд хязгаарлагдмал
- D) Интернэтийн хурд удаан
Зөв хариулт: B
Тайлбар: Хүний ажлын санах ой (working memory) нэг удаад ердөө 7±2 мэдээллийн нэгжийг боловсруулж чаддаг (Миллерийн дүрэм). Тиймээс кодыг энгийн, уншихад хялбар бичих шаардлагатай.
Тест 5
Дараах аль нь "Minimizing Complexity"-ийг хэрэгжүүлэх арга БИШ вэ?
- A) Нэршлийн стандарт дагах
- B) Модуль болгож хуваах
- C) Аль болох олон функцийг нэг класст оруулах
- D) Гүн үүрлэлтээс зайлсхийх
Зөв хариулт: C
Тайлбар: Олон функцийг нэг класст оруулах нь нарийн төвөгтэй байдлыг НЭМДЭГ. A (нэршил), B (модуль хуваах), D (үүрлэлт багасгах) нь бүгд нарийн төвөгтэй байдлыг БУУРУУЛДАГ.
Тест 6
"Anticipating Change" зарчмын дагуу дундаж төслийн шаардлагын хэдэн хувь нь хөгжүүлэлтийн явцад өөрчлөгддөг вэ?
- A) 5%
- B) 10%
- C) 25%
- D) 50%
Зөв хариулт: C
Тайлбар: Судалгаагаар дундаж төслийн шаардлагын 25% нь хөгжүүлэлтийн явцад өөрчлөгддөг. Дахин ажиллах (rework) зардал нь анхнаасаа зөв хийснээс 10-100 дахин үнэтэй.
Тест 7
"Constructing for Verification" гэдэг нь юу гэсэн үг вэ?
- A) Код бичигч л алдаа олох ёстой
- B) Алдааг амархан олж болохоор кодыг бүтээх
- C) Зөвхөн автомат тест ашиглах
- D) Кодыг шалгахгүйгээр ашиглалтад гаргах
Зөв хариулт: B
Тайлбар: Энэ зарчим нь код бичигч, тестер, хэрэглэгч бүгд алдааг хялбар олж чадахаар бүтээхийг шаарддаг. A нь хэт хязгаарлагдмал, C нь нэг л аргыг хэлсэн, D нь огт буруу.
Тест 8
Software Reuse-ийн хоёр тал аль нь вэ?
- A) Design for reuse ба Code for reuse
- B) Construction FOR reuse ба Construction WITH reuse
- C) Internal reuse ба External reuse
- D) Code reuse ба Design reuse
Зөв хариулт: B
Тайлбар: SWEBOK-д Reuse-ийн хоёр талыг: Construction FOR reuse (дахин ашиглахын тулд бүтээх) ба Construction WITH reuse (дахин ашиглаж бүтээх) гэж тодорхойлсон.
Тест 9
Дараах аль нь "Standards in Construction"-ий жишээ БИШ вэ?
- A) Нэршлийн дүрэм (Naming conventions)
- B) UML диаграмм стандарт
- C) Програмистын хувийн код бичих хэв маяг
- D) Java хэлний стандарт
Зөв хариулт: C
Тайлбар: Стандарт гэдэг нь баг эсвэл байгууллагын түвшинд нийтээр баримтлах дүрэм. Програмистын хувийн хэв маяг нь стандарт биш — стандарт нь нийтэд хамаатай.
Тест 10
Waterfall загварын хамгийн том СУЛ ТАЛ нь юу вэ?
- A) Баримт бичиг их шаарддаг
- B) Өөрчлөлтөд уян хатан биш, алдааг хожуу илрүүлдэг
- C) Хэтэрхий хурдан
- D) Багийн ажиллагаа шаарддаггүй
Зөв хариулт: B
Тайлбар: Waterfall загвар нь шугаман тул буцаж өөрчлөлт хийхэд маш хэцүү. Алдааг тестийн үе шатанд л олдог тул засах зардал өндөр. A нь сул тал боловч хамгийн том биш, C ба D нь буруу.
Тест 11
Agile хөгжүүлэлтийн нэг давталтыг юу гэж нэрлэдэг вэ?
- A) Phase
- B) Sprint
- C) Cycle
- D) Wave
Зөв хариулт: B
Тайлбар: Agile (ялангуяа Scrum) хөгжүүлэлтэд нэг давталтыг Sprint гэж нэрлэдэг. Ихэвчлэн 1-4 долоо хоног үргэлжилдэг.
Тест 12
Big Bang Integration-ий хамгийн том асуудал юу вэ?
- A) Хэтэрхий удаан
- B) Алдааны эх сурвалжийг олоход маш хэцүү
- C) Хэтэрхий олон тест шаарддаг
- D) Зөвхөн жижиг төсөлд ажилладаг
Зөв хариулт: B
Тайлбар: Бүх хэсгийг нэг дор нэгтгэхэд аль хэсэгт алдаа байгааг олоход маш хэцүү — "зүү ёроолоос хайх" мэт. Incremental integration нь энэ асуудлыг шийддэг.
Тест 13
Incremental Integration-ий давуу тал аль нь вэ?
- A) Бүх кодыг нэг дор бичиж болно
- B) Алдааг амархан олно, явц тодорхой, эрт бүтээгдэхүүн гаргана
- C) Стандарт шаарддаггүй
- D) Тест хийх шаардлагагүй
Зөв хариулт: B
Тайлбар: Хэсэг хэсгээр нэгтгэж, алхам бүрт шалгах нь алдааг олоход хялбар болгож, явцыг тодорхой болгож, эрт бүтээгдэхүүн гаргах боломж олгодог.
Тест 14
API гэж юу вэ?
- A) Програмын дотоод код
- B) Нэг програм нөгөөтэйгөө харилцах стандартчилсан арга зам
- C) Мэдээллийн сан
- D) Хэрэглэгчийн интерфейс
Зөв хариулт: B
Тайлбар: API (Application Programming Interface) нь програмууд хоорондоо мэдээлэл солилцох интерфейс. Ресторанд цэсээр захиалга өгдөг шиг — дотоод гал тогоог мэдэх шаардлагагүй.
Тест 15
Polymorphism гэж юу вэ?
- A) Програмын хурдыг нэмэгдүүлэх арга
- B) Нэг үйлдэл объектийн төрлөөс хамааран өөр өөрөөр ажиллах чадвар
- C) Олон хэл дээр код бичих чадвар
- D) Кодыг нууцлах арга
Зөв хариулт: B
Тайлбар: Polymorphism = "олон хэлбэрт байдал". Жишээ: "дуугар" гэхэд нохой "хав хав", муур "мяу мяу" гэдэг — нэг команд, объектоос хамааран өөр үр дүн.
Тест 16
Reflection гэж юу вэ?
- A) Кодыг хуулбарлах
- B) Програм ажиллаж байх үедээ өөрийн бүтцийг харж, өөрчлөх чадвар
- C) Толинд код харуулах
- D) Алдааг автоматаар засах
Зөв хариулт: B
Тайлбар: Reflection нь програмд ажиллах үедээ (runtime) класс, интерфейс, талбар, функцийг шалгах, шинэ объект үүсгэх чадварыг олгодог.
Тест 17
Generics-ийн гол давуу тал юу вэ?
- A) Кодын хурдыг нэмэгдүүлдэг
- B) Нэг код бичээд олон төрлийн өгөгдөлтэй аюулгүй ажиллах боломж
- C) Кодыг автоматаар тестлэдэг
- D) Мэдээллийн санд холбодог
Зөв хариулт: B
Тайлбар: Generics нь төрлийн аюулгүй байдлыг (type safety) хангаж, нэг кодоор олон төрлийн өгөгдөлтэй ажиллах боломж олгодог. Кастинг (casting) алдаанаас сэргийлдэг.
Тест 18
Assertion нь юу хийдэг вэ?
- A) Програмыг хурдасгадаг
- B) Тодорхой нөхцөл үнэн байх ёстой гэж шалгадаг
- C) Хэрэглэгчид мессеж харуулдаг
- D) Файл руу бичдэг
Зөв хариулт: B
Тайлбар: Assertion нь "энэ нөхцөл үргэлж үнэн байх ёстой" гэж зарладаг. Худал болвол програм зогсдог → алдааг эрт олоход тусалдаг. Бэлэн бүтээгдэхүүнд хасагддаг.
Тест 19
Design by Contract дахь "precondition" гэж юу вэ?
- A) Функц дуусахад биелэх нөхцөл
- B) Функц дуудахаас өмнө биелсэн байх ёстой нөхцөл
- C) Компайлын үед шалгах нөхцөл
- D) Хэрэглэгчийн тохиргоо
Зөв хариулт: B
Тайлбар: Precondition = урьдчилсан нөхцөл. Функцийг дуудахад ЗӨВ оролт өгсөн байх ёстой. Жишээ: "Цусны шинжилгээ хийлгэхийн тулд 8 цаг хоосон ирэх" — энэ бол precondition.
Тест 20
Defensive Programming-ийн гол зорилго юу вэ?
- A) Кодыг хакераас хамгаалах
- B) Буруу оролтоос програмыг хамгаалах
- C) Кодыг нууцлах
- D) Програмыг хурдасгах
Зөв хариулт: B
Тайлбар: Defensive programming нь бүх оролтыг шалгаж, буруу оролт ирсэн тохиолдолд програмыг эвдэлгүйгээр зохицуулах арга барил. A нь security-тэй холбоотой боловч Defensive Programming-ийн ГОЛ зорилго биш.
Тест 21
try-catch блокод "finally" хэсэг хэзээ ажилладаг вэ?
- A) Зөвхөн алдаа гарсан үед
- B) Зөвхөн алдаа гараагүй үед
- C) Алдаа гарсан ч, гараагүй ч үргэлж ажилладаг
- D) Хэзээ ч ажилладаггүй
Зөв хариулт: C
Тайлбар: finally блок нь ямар ч тохиолдолд (алдаа гарсан ч, гараагүй ч) ажилладаг. Нөөц чөлөөлөх (файл хаах, холболт хаах) зэрэгт ашиглагддаг.
Тест 22
TDD (Test-Driven Development)-ийн зөв дараалал аль нь вэ?
- A) Код бичих → Тест бичих → Дахин бүтэцлэх
- B) Тест бичих → Код бичих → Дахин бүтэцлэх
- C) Дизайн хийх → Код бичих → Тест бичих
- D) Тест бичих → Дахин бүтэцлэх → Код бичих
Зөв хариулт: B
Тайлбар: TDD = Red (тест бичих, бүтэлгүй) → Green (код бичих, тест давах) → Refactor (дахин бүтэцлэх). Эхлээд тест бичнэ!
Тест 23
IDE гэж юу вэ?
- A) Internet Development Engine
- B) Integrated Development Environment
- C) Internal Design Editor
- D) Intelligent Data Executor
Зөв хариулт: B
Тайлбар: IDE = Integrated Development Environment (Нэгдсэн хөгжүүлэлтийн орчин). Код бичих, компайл, дебаг, тест бүгдийг нэг програмд нэгтгэсэн.
Тест 24
Дараах аль нь Java-д зориулсан IDE вэ?
- A) Photoshop
- B) IntelliJ IDEA
- C) Microsoft Word
- D) VLC Player
Зөв хариулт: B
Тайлбар: IntelliJ IDEA нь Java хөгжүүлэлтэд хамгийн алдартай IDE. Photoshop (зураг засварлагч), Word (текст боловсруулагч), VLC (медиа тоглуулагч) нь IDE биш.
Тест 25
WYSIWYG гэж юу гэсэн үг вэ?
- A) What You See Is What You Get
- B) Where You Start Is Where You Go
- C) When You Save It Will Yield Good
- D) Why You Should Improve Without Guessing
Зөв хариулт: A
Тайлбар: WYSIWYG = "What You See Is What You Get" — яг юу харагдаж байна тэр нь болно. GUI Builder зэрэг хэрэгсэлд ашиглагддаг зарчим.
Тест 26
Unit Testing гэж юу вэ?
- A) Бүх системийг нэг дор шалгах
- B) Програмын жижиг хэсгийг тусгайлан шалгах
- C) Хэрэглэгч програмыг шалгах
- D) Зөвхөн алдаа олох зорилгоор ажиллуулах
Зөв хариулт: B
Тайлбар: Unit testing нь програмын хамгийн жижиг хэсгийг (функц, класс) тусгайлан, бусдаас тусгаарлаж шалгадаг. A нь system testing, C нь user acceptance testing.
Тест 27
Integration testing нь юуг шалгадаг вэ?
- A) Нэг функцийн зөв ажиллагааг
- B) Хэсгүүд хоорондоо зөв ажиллаж байгааг
- C) Хэрэглэгчийн сэтгэл ханамжийг
- D) Програмын хурдыг
Зөв хариулт: B
Тайлбар: Integration testing нь хоёр ба түүнээс олон хэсэг (модуль, компонент) хоорондоо зөв харилцаж байгааг шалгадаг. A нь unit testing.
Тест 28
Coupling бага байх нь яагаад сайн вэ?
- A) Програм хурдан ажилладаг
- B) Модулиуд бие даасан тул нэгийг нь өөрчлөхөд бусдад нөлөөлөхгүй
- C) Код богино болдог
- D) Тест хийх шаардлагагүй болдог
Зөв хариулт: B
Тайлбар: Бага coupling = модулиуд бие даасан. Нэг модулийг өөрчлөхөд бусад модулиудад нөлөөлөхгүй → засвар хялбар, алдаа бага.
Тест 29
Cohesion өндөр байх нь юу гэсэн үг вэ?
- A) Олон модуль хоорондоо нягт холбоотой
- B) Нэг модуль доторх элементүүд нэг зорилгод чиглэсэн
- C) Код маш урт
- D) Олон хэл ашигласан
Зөв хариулт: B
Тайлбар: Өндөр cohesion = нэг модуль доторх бүх элемент нэг зорилгод чиглэсэн. Судалгаагаар cohesion өндөртэй routine-ууд 50% нь алдаагүй, бага cohesion-тэй нь зөвхөн 18%.
Тест 30
Refactoring гэж юу вэ?
- A) Кодыг устгаад шинээр бичих
- B) Кодын ажиллагааг өөрчлөхгүйгээр дотоод бүтцийг сайжруулах
- C) Шинэ функц нэмэх
- D) Алдаа засах
Зөв хариулт: B
Тайлбар: Refactoring нь гаднаас харахад адилхан ажилладаг (ижил оролт → ижил гаралт), гэхдээ дотоод бүтэц нь илүү цэвэр, ойлгомжтой болсон байна. Байшинг нураахгүйгээр дотоод засвар хийх шиг.
Тест 31
"Premature optimization is the root of all evil" — Энэ юу гэсэн үг вэ?
- A) Оновчлол хэзээ ч хийж болохгүй
- B) Кодыг эхлээд зөв, ойлгомжтой бичиж, дараа нь шаардлагатай хэсгийг л оновчлох
- C) Аль болох хурдан код бичих ёстой
- D) Бүх кодыг оновчлох ёстой
Зөв хариулт: B
Тайлбар: Donald Knuth-ийн алдартай үг. Гол санаа: эхлээд ЗӨВӨӨР ажилладаг, ойлгомжтой код бич. Дараа нь profiler-ээр "hot spot" олоод ТЭР хэсгийг л оновчилно.
Тест 32
Configuration Language-ийн жишээ аль нь вэ?
- A) Java
- B) .ini файл
- C) Python
- D) C++
Зөв хариулт: B
Тайлбар: Configuration language нь хязгаарлагдмал сонголтуудаас тохируулдаг хэл. .ini файл нь Windows-ийн тохиргооны файл. Java, Python, C++ нь програмчлалын хэлнүүд.
Тест 33
Linguistic notation-ий жишээ аль нь вэ?
- A) MatLab
- B) Event-B
- C) Java
- D) Scratch
Зөв хариулт: C
Тайлбар: Linguistic (хэл зүйн) notation нь текстэн тэмдэгтүүд ашигладаг: Java, C++, Python. MatLab, Scratch нь Visual (харааны), Event-B нь Formal (албан ёсны) notation.
Тест 34
Кодын нэршлийн стандарт яагаад чухал вэ?
- A) Компайлер шаарддаг
- B) Код уншихад хялбар болж, бусад хөгжүүлэгчид ойлгоход тусалдаг
- C) Програмыг хурдасгадаг
- D) Алдаа автоматаар засдаг
Зөв хариулт: B
Тайлбар: Нэршлийн стандарт нь хүмүүст зориулсан (компайлерт хамаагүй).
studentAgeньx-ээс хамаагүй ойлгомжтой. Судалгаагаар 10-16 тэмдэгтийн нэр хамгийн бага алдаатай.
Тест 35
Судалгаагаар програмистууд хэдэн түвшний үүрлэлтээс (nesting) дээш ойлгоход бэрхшээлтэй болдог вэ?
- A) 2
- B) 3
- C) 5
- D) 10
Зөв хариулт: B
Тайлбар: Судалгаагаар 3-аас дээш түвшний if/for үүрлэлт хүнд ойлгоход хэцүү болдог. Гүн үүрлэлтийг функцэд гаргаж багасгах нь зөв арга.
Тест 36
Миллерийн дүрмийн дагуу хүн нэг дор хэдэн мэдээллийн нэгжийг тогтоож чаддаг вэ?
- A) 3±1
- B) 5±2
- C) 7±2
- D) 12±3
Зөв хариулт: C
Тайлбар: Жордж Миллерийн 1956 оны судалгаагаар хүний ажлын санах ой нэг удаад 7±2 (тэгэхээр 5-9) мэдээллийн нэгжийг боловсруулж чаддаг. Энэ нь класс дахь талбарын тоог 7±2-оос хэтрүүлэхгүй байх үндэс.
Тест 37
Дараах кодын аль нь ИЛҮҮ САЙН нэршилтэй вэ?
- A)
int x = 25; - B)
int studentAge = 25; - C)
int sa = 25; - D)
int theAgeOfTheStudentInYears = 25;
Зөв хариулт: B
Тайлбар:
studentAgeнь утгатай бөгөөд хэт богино (x, sa) ч биш, хэт урт (D сонголт) ч биш. Судалгаагаар 10-16 тэмдэгтийн нэр хамгийн тохиромжтой.
Тест 38
"Magic number" гэж юу вэ?
- A) Програмд ашигласан аливаа тоо
- B) Кодонд шууд бичсэн утга нь тодорхойгүй тогтмол тоо
- C) Санамсаргүй тоо үүсгэгч
- D) Алдааны код
Зөв хариулт: B
Тайлбар: Magic number гэдэг нь кодонд
if (score >= 90)гэх мэт шууд бичсэн тоо. 90 юу гэсэн утгатай болохыг тайлбарлаагүй.GRADE_A_THRESHOLD = 90гэж нэрлэсэн тогтмол ашиглах нь зөв.
Тест 39
Функцийн параметрийн тоо хамгийн ихдээ хэд байх ёстой вэ?
- A) 3
- B) 5
- C) 7
- D) 10
Зөв хариулт: C
Тайлбар: Миллерийн дүрмийн дагуу 7 параметрээс дээш нь хүнд санахад хүндрэлтэй. Судалгаагаар 7-оос дээш параметр алдааны магадлалыг нэмэгдүүлдэг.
Тест 40
Cohesion өндөртэй routine-уудын хэдэн хувь нь алдаагүй байдаг (судалгаагаар)?
- A) 18%
- B) 30%
- C) 50%
- D) 90%
Зөв хариулт: C
Тайлбар: 450 routine-ийн судалгаагаар cohesion өндөртэй routine-уудын 50% нь алдаагүй, бага cohesion-тэй нь зөвхөн 18% нь алдаагүй байсан.
Тест 41
Coupling/cohesion-ий харьцаа хамгийн муутай routine-ууд сайн харьцаатайгаас хэд дахин олон алдаатай вэ?
- A) 2 дахин
- B) 5 дахин
- C) 7 дахин
- D) 10 дахин
Зөв хариулт: C
Тайлбар: Судалгаагаар coupling/cohesion-ий харьцаа хамгийн муутай routine-ууд хамгийн сайнаас 7 дахин олон алдаатай, засахад 20 дахин үнэтэй.
Тест 42
Дараах аль нь Software Construction-ий ГОЛ үйл ажиллагаа вэ?
- A) Шаардлага цуглуулах
- B) Код бичих ба алдаа засах
- C) Маркетингийн стратеги боловсруулах
- D) Сервер тохируулах
Зөв хариулт: B
Тайлбар: SWEBOK-ийн дагуу Software Construction нь ерөнхийдөө код бичих (coding) ба алдаа засах (debugging)-аас бүрддэг, мөн construction planning, detailed design, unit testing, integration testing зэргийг багтаадаг.
Тест 43
Fault Tolerance-ийн хамгийн түгээмэл стратеги аль нь вэ?
- A) Програмыг зогсоох
- B) Нөөцлөж, дахин оролдох (backup and retry)
- C) Алдааг үл тоох
- D) Хэрэглэгчид алдаа шилжүүлэх
Зөв хариулт: B
Тайлбар: Fault tolerance-ийн түгээмэл стратегиуд: нөөцлөж дахин оролдох (backup and retry), нөөц код ашиглах, санал хураалтын алгоритм (voting algorithm), хуурамч утга орлуулах.
Тест 44
Middleware гэж юу вэ?
- A) Хэрэглэгчийн интерфейс
- B) Үйлдлийн систем ба програмын хооронд байрладаг програм хангамж
- C) Мэдээллийн сан
- D) Компайлер
Зөв хариулт: B
Тайлбар: Middleware нь OS-ийн дээр, програмын доор байрладаг. Runtime container, message passing, persistence зэрэг үйлчилгээ хангадаг. ESB (Enterprise Service Bus) нь middleware-ийн жишээ.
Тест 45
Concurrency гэж юу вэ?
- A) Код дарааллаар ажиллах
- B) Олон ажлыг нэг зэрэг гүйцэтгэх
- C) Кодыг хуулбарлах
- D) Алдаа засах процесс
Зөв хариулт: B
Тайлбар: Concurrency (зэрэгцээ боловсруулалт) нь олон ажлыг нэг зэрэг гүйцэтгэх. Semaphore, monitor, mutex зэрэг синхрончлолын механизмуудыг ашигладаг.
Тест 46
Semaphore гэж юу вэ?
- A) Алдааны мессеж
- B) Олон процесс/thread-ийн нийтлэг нөөцөд хандалтыг зохицуулах хамгаалагдсан хувьсагч
- C) Мэдээллийн сангийн хүснэгт
- D) Тестийн фреймворк
Зөв хариулт: B
Тайлбар: Semaphore нь нийтлэг нөөцөд (shared resource) олон процесс/thread-ийн хандалтыг зохицуулах синхрончлолын механизм. Замын гэрлэн дохио шиг — "яв" эсвэл "зогс" гэж зааварладаг.
Тест 47
Mutex гэж юу вэ?
- A) Олон thread-ийг нэг зэрэг ажиллуулах
- B) Нэг удаад зөвхөн нэг thread/процесст нөөцөд хандах эрх олгох
- C) Кодыг хурдасгах
- D) Алдааг автоматаар олох
Зөв хариулт: B
Тайлбар: Mutex = Mutual Exclusion. Нэг удаад зөвхөн нэг thread/процесс нөөцөд хандах боломжтой. Жишээ: Угаалгын өрөөний цоож — нэг хүн оровол нөгөө нь хүлээнэ.
Тест 48
Profiling tool юу хийдэг вэ?
- A) Кодын алдааг засдаг
- B) Код ажиллаж байх үед хаана их цаг зарцуулж байгааг хэмждэг
- C) Кодыг автоматаар бичдэг
- D) Баримт бичиг үүсгэдэг
Зөв хариулт: B
Тайлбар: Profiler нь кодын мөр бүр хэдэн удаа ажиллаж, хэр их цаг зарцуулж байгааг хэмждэг. "Hot spot" (удааширсан хэсэг) олж өгдөг → зөвхөн тэр хэсгийг оновчилно.
Тест 49
Program slicing гэж юу вэ?
- A) Програмыг хэсэг хэсгээр устгах
- B) Тодорхой хувьсагчид нөлөөлж болох кодын мөрүүдийг тооцоолох
- C) Програмыг жижиг файлуудад хуваах
- D) Кодыг компайл хийх
Зөв хариулт: B
Тайлбар: Program slicing нь тодорхой хувьсагчийн утганд нөлөөлж болох бүх кодын мөрийг (program slice) тооцоолдог. Алдааны эх сурвалжийг олоход маш тустай.
Тест 50
Table-driven method гэж юу вэ?
- A) Мэдээллийн сангийн хүснэгт ашиглах
- B) Логик илэрхийллийн оронд хүснэгтээс мэдээлэл хайх арга
- C) HTML хүснэгт бүтээх
- D) Excel файл уншиж боловсруулах
Зөв хариулт: B
Тайлбар: Table-driven method нь if/case зэрэг логик бүтцийн оронд хүснэгтээс мэдээлэл хайдаг. Тохирох тохиолдолд код энгийн, өөрчлөхөд хялбар болдог.
Тест 51
Дараах аль нь external standard-ийн жишээ вэ?
- A) Компанийн дотоод нэршлийн дүрэм
- B) IEEE стандарт
- C) Төслийн баримт бичгийн загвар
- D) Багийн код форматлах дүрэм
Зөв хариулт: B
Тайлбар: External standard нь IEEE, ISO, OMG зэрэг олон улсын байгууллагаас гаргасан стандарт. A, C, D нь internal (дотоод) стандартууд.
Тест 52
Дараах аль нь internal standard-ийн жишээ вэ?
- A) Java хэлний стандарт
- B) IEEE 829 стандарт
- C) Компанийн кодын нэршлийн дүрэм
- D) ISO 12207 стандарт
Зөв хариулт: C
Тайлбар: Internal standard нь компани эсвэл төслийн түвшинд тогтоосон дүрэм. A, B, D нь гадаад (external) стандартууд.
Тест 53
JUnit гэж юу вэ?
- A) Java хэлний компайлер
- B) Java хэлний нэгж тестийн фреймворк
- C) Java хэлний IDE
- D) Java хэлний мэдээллийн сангийн сан
Зөв хариулт: B
Тайлбар: JUnit нь Java хэлний хамгийн алдартай нэгж тестийн фреймворк. Автомат тест бичиж, ажиллуулж, үр дүнг мэдэгдэх боломж олгодог.
Тест 54
Distributed system гэж юу вэ?
- A) Нэг компьютер дээр ажиллах систем
- B) Физикийн хувьд тусдаа байрлах олон компьютерийг сүлжээгээр холбосон систем
- C) Зөвхөн нэг хэрэглэгчид зориулсан систем
- D) Интернэтгүй ажиллах систем
Зөв хариулт: B
Тайлбар: Distributed system нь физикийн хувьд тусдаа, сүлжээгээр холбогдсон олон компьютерийн цогц. Client-server, 3-tier, n-tier зэрэг архитектуртай.
Тест 55
State-based programming гэж юу вэ?
- A) Төлөвийн машин (finite state machine) ашиглан програмын зан төлөвийг тодорхойлох
- B) Өгөгдлийн сангийн төлөвийг хадгалах
- C) Хувьсагчийн утгыг хэвлэх
- D) Алдааны төлөвийг бүртгэх
Зөв хариулт: A
Тайлбар: State-based programming нь finite state machine (төгсгөлөг төлөвийн машин) ашиглан програмын зан төлөвийг тодорхойлдог. Объект хандлагат програмчлалтай хослуулан ашиглагддаг.
Тест 56
Runtime configuration гэж юу вэ?
- A) Компайлын үед тохируулах
- B) Програм ажиллаж байх үед хувьсагчийн утгыг тохиргооны файлаас уншиж холбох
- C) Хэрэглэгчийн интерфейс дизайн
- D) Тест ажиллуулах тохиргоо
Зөв хариулт: B
Тайлбар: Runtime configuration нь програм ажиллаж байх үед (runtime) тохиргооны файлыг уншиж, хувьсагчийн утгыг тогтоодог (late binding). Код өөрчлөхгүйгээр програмын зан төлөвийг өөрчилж болно.
Тест 57
Internationalization (i18n) гэж юу вэ?
- A) Програмыг олон улсад зарах
- B) Програмыг олон хэл, бүс нутгийг дэмжихээр бэлтгэх техникийн ажил
- C) Програмыг нэг хэлнээс нөгөө рүү орчуулах
- D) Олон улсын стандарт дагах
Зөв хариулт: B
Тайлбар: Internationalization (i18n) нь програмыг олон locale (хэл, бүс нутаг)-ийг дэмжихээр БЭЛТГЭХ техникийн ажил. Localization (l10n) нь тодорхой хэл рүү ОРЧУУЛАХ ажил.
Тест 58
Construction testing-ийн ГОЛ зорилго юу вэ?
- A) Бүх алдааг 100% олох
- B) Алдааг оруулсан цаг ба олсон цагийн хоорондох зайг багасгах
- C) Хэрэглэгчийн сэтгэл ханамжийг хэмжих
- D) Програмын хурдыг шалгах
Зөв хариулт: B
Тайлбар: Construction testing-ийн гол зорилго нь алдааг оруулсан (inserted) ба илрүүлсэн (detected) хоорондох цагийн зайг багасгах. Энэ зай бага байх тусам засах зардал бага.
Тест 59
Phased integration-ийн өөр нэр юу вэ?
- A) Incremental integration
- B) Big Bang integration
- C) Continuous integration
- D) Test integration
Зөв хариулт: B
Тайлбар: Phased integration = Big Bang integration. Бүх хэсгийг бүрэн дуусгаад, эцсийн шатанд нэг дор нэгтгэдэг.
Тест 60
Incremental integration-д дараах алийг нь нэмэлтээр бэлтгэх шаардлагатай вэ?
- A) Маркетингийн төлөвлөгөө
- B) Stubs, drivers, mock objects
- C) Хэрэглэгчийн гарын авлага
- D) Серверийн тохиргоо
Зөв хариулт: B
Тайлбар: Incremental integration-д дутуу хэсгүүдийг орлуулах stubs (хуурамч хариу өгдөг), drivers (дуудагч орлуулагч), mock objects (хуурамч объект) бэлтгэх шаардлагатай.
Тест 61
Дараах аль нь construction quality technique БИШ вэ?
- A) Unit testing
- B) Code review
- C) Marketing survey
- D) Static analysis
Зөв хариулт: C
Тайлбар: Marketing survey (маркетингийн судалгаа) нь чанарын техник биш. A (нэгж тест), B (кодын хянан шалгалт), D (статик шинжилгээ) нь бүгд construction quality technique.
Тест 62
Static analysis гэж юу вэ?
- A) Кодыг ажиллуулж шалгах
- B) Кодыг ажиллуулахгүйгээр шинжилж алдаа олох
- C) Хэрэглэгчийн санал хүсэлт цуглуулах
- D) Серверийн ачааллыг хэмжих
Зөв хариулт: B
Тайлбар: Static analysis нь кодыг compile/run хийхгүйгээр шинжилдэг. Аюулгүй байдлын цоорхой, кодын чанарын асуудлыг олдог. Олон програмчлалын хэлэнд зориулсан хэрэгслүүд байдаг.
Тест 63
Executable model гэж юу вэ?
- A) Ажиллуулж болох програмын загвар (model)
- B) Excel хүснэгт
- C) Зураг файл
- D) Тестийн тайлан
Зөв хариулт: A
Тайлбар: Executable model (жишээ нь xUML) нь тодорхой програмчлалын хэлээс хамааралгүй, ажиллуулж болох загвар. Model-Driven Architecture (MDA)-ийн суурь. Platform Independent Model (PIM)-ийг бүрэн тодорхойлж чаддаг.
Тест 64
Grammar-based input processing юу хийдэг вэ?
- A) Дуу хоолой таних
- B) Оролтын token stream-ийг задлан шинжилж (parsing) өгөгдлийн бүтэц үүсгэх
- C) Зургийг боловсруулах
- D) Файл шахах
Зөв хариулт: B
Тайлбар: Grammar-based input processing нь syntax analysis (синтакс задлал) буюу parsing хийдэг. Оролтоос parse tree (задлалын мод) үүсгэж, тооцоолол хийхэд ашигладаг.
Тест 65
Platform standard-ийн жишээ аль нь вэ?
- A) J2EE ба POSIX
- B) Microsoft Word ба Excel
- C) Facebook ба Instagram
- D) WiFi ба Bluetooth
Зөв хариулт: A
Тайлбар: J2EE (Java 2 Platform Enterprise Edition) ба POSIX (Portable Operating System Interface) нь платформын стандартууд. Зөөмтгий (portable) програм бичих боломж олгодог.
Тест 66
Heterogeneous system гэж юу вэ?
- A) Ижил төрлийн олон компьютерийн систем
- B) Өөр өөр төрлийн тусгай тооцооллын нэгжүүдээс бүрдсэн систем
- C) Зөвхөн нэг хэл дээр бичигдсэн систем
- D) Интернэт холболтгүй систем
Зөв хариулт: B
Тайлбар: Heterogeneous system нь DSP, microcontroller, peripheral processor зэрэг өөр өөр төрлийн тооцооллын нэгжүүдийг агуулдаг. Embedded (суулгагдмал) системүүд ихэвчлэн ийм байдаг.
Тест 67
Code tuning гэж юу вэ?
- A) Кодын бүтцийг бүрэн өөрчлөх
- B) Зөв ажилладаг кодыг илүү хурдан ажиллахаар жижиг хэмжээнд өөрчлөх
- C) Шинэ функц нэмэх
- D) Кодыг устгах
Зөв хариулт: B
Тайлбар: Code tuning нь нэг класс, функц, эсвэл хэдэн мөр кодыг гүйцэтгэлийн хувьд сайжруулах. Том хэмжээний өөрчлөлт биш, жижиг хэмжээний оновчлол.
Тест 68
Performance analysis-ийн гол зорилго юу вэ?
- A) Кодыг цэвэрлэх
- B) Програмын "hot spot" (удааширсан хэсэг)-ийг олох
- C) Шинэ функц нэмэх
- D) Баримт бичиг бичих
Зөв хариулт: B
Тайлбар: Performance analysis нь програм ажиллаж байх үед мэдээлэл цуглуулж, хаана удааширч байгааг (hot spot) олдог. Зөвхөн тэр хэсгийг оновчилно → "premature optimization"-аас зайлсхийнэ.
Тест 69
Postcondition гэж юу вэ?
- A) Функц дуудахаас өмнө биелсэн байх ёстой нөхцөл
- B) Функц дуусахад биелсэн байх ёстой нөхцөл
- C) Програм эхлэхэд шалгах нөхцөл
- D) Компайлын үед шалгах нөхцөл
Зөв хариулт: B
Тайлбар: Postcondition = дараах нөхцөл. Функц ажиллаж дуусахад энэ нөхцөл биелсэн байх ЁСТОЙ. Жишээ: "Эрэмбэлэх функц дуусахад жагсаалт өсөх дарааллаар байна" — postcondition.
Тест 70
Information hiding зарчим юу хийдэг вэ?
- A) Кодыг нууцлах
- B) Дотоод хэрэгжүүлэлтийг далдалж, гаднаас зөвхөн интерфейсээр хандуулдаг
- C) Хувьсагчийг устгах
- D) Файлыг нууцалж хадгалах
Зөв хариулт: B
Тайлбар: Information hiding нь модулийн дотоод хэрэгжүүлэлтийг далдалдаг. Судалгаагаар энэ зарчмыг ашигласан том програмыг өөрчлөхөд 4 дахин хялбар болдог.
Тест 71
Separation of concerns гэж юу вэ?
- A) Баг доторх маргааныг шийдвэрлэх
- B) Өөр өөр үүрэг бүхий хэсгүүдийг тусгаарлах
- C) Кодыг олон файлд хуваах
- D) Тест бичих ба код бичихийг салгах
Зөв хариулт: B
Тайлбар: Separation of concerns нь програмыг өөр өөр "санаа зовнил" (concern) буюу үүрэг бүхий хэсгүүдэд тусгаарлах зарчим. Жишээ нь: UI логик ба бизнес логикийг салгах.
Тест 72
Дахин ажиллах (rework) зардал нь анхнаасаа зөв хийснээс хэд дахин үнэтэй байдаг вэ?
- A) 2-5 дахин
- B) 10-100 дахин
- C) 100-1000 дахин
- D) Зардал ялгаагүй
Зөв хариулт: B
Тайлбар: 25 жилийн судалгаагаар rework зардал нь 10-100 дахин (жижиг төсөлд 5-10 дахин) үнэтэй. Энэ нь Anticipating Change зарчмын үндэслэл.
Тест 73
Loose coupling-ийн давуу тал юу вэ?
- A) Програм хурдан ажилладаг
- B) Модулиуд бие биеэсээ хамааралгүй, өөрчлөхөд хялбар
- C) Код богино болдог
- D) Компайл хурдан болдог
Зөв хариулт: B
Тайлбар: Loose coupling нь модулиуд хоорондын хамааралыг багасгадаг. Нэг модулийг өөрчилсөн ч бусдад нөлөөлөхгүй → засвар үйлчилгээ хялбар, алдаа багасдаг.
Тест 74
Дараах аль нь Agile хөгжүүлэлтийн зарчим БИШ вэ?
- A) Захиалагчтай байнга харилцах
- B) Бүх баримт бичгийг 100% бэлтгэсний дараа л код бичих
- C) Богино давталтаар ажиллах
- D) Өөрчлөлтийг хүлээн авах
Зөв хариулт: B
Тайлбар: Agile нь баримт бичиг бага, хурдан давталттай. "Бүх баримт бичгийг 100% бэлтгэх" нь Waterfall-ийн арга. Agile-д ажиллагаатай програм нь иж бүрэн баримт бичгээс илүү чухал.
Тест 75
GUI Builder-ийн гол зарчим юу вэ?
- A) Код бичиж интерфейс бүтээх
- B) WYSIWYG — харж байгаагаар интерфейс бүтээх
- C) Зөвхөн текст интерфейс бүтээх
- D) Мэдээллийн сан тохируулах
Зөв хариулт: B
Тайлбар: GUI Builder нь WYSIWYG (What You See Is What You Get) горимоор ажилладаг. Товч, текст зэргийг чирч, тавьж, визуал байдлаар интерфейс бүтээдэг.
Тест 76
Дараах аль Java кодын хэсэг нь зөв exception handling хийж байна вэ?
- A)
try { } catch { } - B)
try { code } catch (Exception e) { log(e); } - C)
catch { } try { } - D)
exception { handle(); }
Зөв хариулт: B
Тайлбар: Java-д зөв exception handling: try блокод алдаа гарч болох код, catch блокод exception-ий төрөл ба зохицуулах логик бичдэг. A-д exception төрөл байхгүй, C ба D нь синтаксын хувьд буруу.
Тест 77
"throw" түлхүүр үг юу хийдэг вэ?
- A) Алдааг барьж зохицуулдаг
- B) Шинэ exception шидэж, дээш дамжуулдаг
- C) Програмыг зогсоодог
- D) Хувьсагч зарладаг
Зөв хариулт: B
Тайлбар:
throwнь шинэ exception үүсгэж, дуудагч функц руу дамжуулдаг.catchнь барьж зохицуулдаг.throw new ArithmeticException("Алдаа")гэх мэтээр ашиглана.
Тест 78
143 мөрөөс бага routine-ууд илүү урт routine-уудаас хэд дахин хямдхан засагддаг вэ?
- A) 1.5 дахин
- B) 2.4 дахин
- C) 5 дахин
- D) 10 дахин
Зөв хариулт: B
Тайлбар: Судалгаагаар 143 мөрөөс бага routine-ууд илүү урт routine-уудаас 2.4 дахин бага зардлаар засагддаг. Өөр судалгаагаар 100-150 мөрийн routine хамгийн бага өөрчлөлт шаарддаг.
Тест 79
Routine-уудын интерфейс дэх алдаа нийт алдааны хэдэн хувийг эзэлдэг вэ?
- A) 10%
- B) 25%
- C) 39%
- D) 50%
Зөв хариулт: C
Тайлбар: Судалгаагаар бүх алдааны 39% нь routine хоорондын харилцаа (интерфейс) дэх алдаа. Тиймээс интерфейсийг сайн дизайнлах маш чухал.
Тест 80
Ашиглагдаагүй параметр (unused parameter) алдааны магадлалд яаж нөлөөлдөг вэ?
- A) Нөлөөлөхгүй
- B) Алдааны магадлалыг нэмэгдүүлдэг
- C) Алдааны магадлалыг бууруулдаг
- D) Компайл хийхэд саад болдог
Зөв хариулт: B
Тайлбар: Судалгаагаар ашиглагдаагүй хувьсагчтай routine-уудын зөвхөн 17-29% нь алдаагүй, харин ашиглагдаагүй хувьсагчгүй routine-уудын 46% нь алдаагүй.
Тест 81
Data abstraction нь програмыг ойлгоход хэр хялбар болгодог вэ?
- A) 10% хялбар
- B) 30% хялбар
- C) 50% хялбар
- D) Хялбар болгодоггүй
Зөв хариулт: B
Тайлбар: Эрдэм шинжилгээний судалгаагаар data abstraction ашигласан програм нь функционал програмаас ойролцоогоор 30% ойлгоход хялбар байдаг.
Тест 82
NASA-ийн судалгаагаар сайн бүтэцлэсэн класс кодын дахин ашиглалтыг хэд дахин нэмэгдүүлдэг вэ?
- A) 1.5 дахин
- B) 2 дахин
- C) 3 дахин
- D) 5 дахин
Зөв хариулт: B
Тайлбар: NASA-ийн судалгаагаар сайн бүтэцлэсэн класс дахь код нь функционал дизайнаар хийсэн кодоос 2 дахин илүү дахин ашиглагддаг.
Тест 83
Control flow complexity (удирдлагын урсгалын нарийн төвөгтэй байдал) юутай хамааралтай вэ?
- A) Өндөр найдвартай байдал
- B) Бага алдааны хувь
- C) Бага найдвартай байдал ба олон алдаа
- D) Хурдан ажиллагаа
Зөв хариулт: C
Тайлбар: Судалгаагаар control flow complexity нь бага найдвартай байдал (low reliability) ба олон алдаатай (frequent errors) нягт хамааралтай.
Тест 84
Encapsulation гэж юу вэ?
- A) Кодыг шифрлэх
- B) Өгөгдөл ба тэр өгөгдөл дээр ажиллах функцийг нэг нэгжид нэгтгэж, гаднаас шууд хандахыг хязгаарлах
- C) Олон удамшил
- D) Кодыг нууцлах
Зөв хариулт: B
Тайлбар: Encapsulation (капсулжуулалт) нь OOP-ийн суурь зарчим. Өгөгдөл ба методыг нэг класст нэгтгэж, гаднаас зөвхөн зөвшөөрсөн интерфейсээр хандуулдаг. Эмийн капсул шиг — дотоод бүтцийг далдалдаг.
Тест 85
Dynamic binding гэж юу вэ?
- A) Компайлын үед функц холбох
- B) Ажиллах үед (runtime) объектийн бодит төрлийг тодорхойлж функц дуудах
- C) Хувьсагчийн нэр өөрчлөх
- D) Мэдээллийн сантай холбогдох
Зөв хариулт: B
Тайлбар: Dynamic binding (late binding) нь програм ажиллаж байх үед объектийн бодит төрлийг тодорхойлж, тохирох функцийг дуудах. Polymorphism-тэй нягт холбоотой.
Тест 86
Software Construction хамгийн олон юу үүсгэдэг вэ?
- A) Шаардлагын баримт бичиг
- B) Тохиргооны зүйлс (configuration items) — эх файл, баримт бичиг, тест
- C) Маркетингийн материал
- D) Хэрэглэгчийн санал хүсэлт
Зөв хариулт: B
Тайлбар: SWEBOK-д Software Construction нь төсөлд хамгийн олон тохиргооны зүйл (эх файл, баримт бичиг, тест гэх мэт) үүсгэдэг гэж заасан. Тиймээс Configuration Management-тэй нягт холбоотой.
Тест 87
Дараах аль нь Scripting Language-ийн жишээ вэ?
- A) Java
- B) C++
- C) Python
- D) Assembly
Зөв хариулт: C
Тайлбар: Python нь scripting language. Java ба C++ нь бүтэн програмчлалын хэлнүүд (programming languages). Assembly нь бага түвшний хэл.
Тест 88
Monitor (concurrency) гэж юу вэ?
- A) Компьютерийн дэлгэц
- B) Програмист нэгэн зэрэг зөвхөн нэг процесс идэвхтэй байх хийсвэр өгөгдлийн төрөл
- C) Кодын хянагч
- D) Тестийн хэрэгсэл
Зөв хариулт: B
Тайлбар: Monitor (concurrency-д) нь хийсвэр өгөгдлийн төрөл бөгөөд дотор нь зөвхөн нэг процесс нэг удаад идэвхтэй байдаг. Хуваалцсан хувьсагч, функцуудыг агуулдаг.
Тест 89
Дараах аль нь Software Construction-ий 5 суурь зарчмын нэг БИШ вэ?
- A) Minimizing Complexity
- B) Anticipating Change
- C) Maximizing Performance
- D) Reuse
Зөв хариулт: C
Тайлбар: 5 суурь зарчим: Minimizing Complexity, Anticipating Change, Constructing for Verification, Reuse, Standards. "Maximizing Performance" нь суурь зарчим биш.
Тест 90
Construction planning-д аль шийдвэр хамгийн чухал вэ?
- A) Оффисын тохиргоо
- B) Construction method (бүтээлтийн арга) сонгох
- C) Баримт бичгийн өнгө
- D) Ажилчдын цалин
Зөв хариулт: B
Тайлбар: SWEBOK-д construction method сонгох нь construction planning-ийн ХАМГИЙН чухал шийдвэр гэж заасан. Энэ нь бүх бусад шийдвэрт нөлөөлдөг.
Тест 91
Дараах аль нь Construction Measurement-ийн хэмжигдэхүүн БИШ вэ?
- A) Бичсэн кодын хэмжээ
- B) Кодын нарийн төвөгтэй байдал
- C) Ажилчдын сэтгэл ханамж
- D) Алдааны олдох/засах хурд
Зөв хариулт: C
Тайлбар: Construction measurement-ийн хэмжигдэхүүнүүд: код хэмжээ, нарийн төвөгтэй байдал, inspection статистик, алдааны хурд, хүчин чармайлт, хуваарь. Ажилчдын сэтгэл ханамж нь HR-ийн хэмжигдэхүүн.
Тест 92
Дараах кодонд ямар асуудал байна вэ?
try {
int result = 10 / 0;
} catch (Exception e) {
// хоосон
}
- A) Ямар ч асуудалгүй
- B) Хоосон catch блок — алдааг "нуудаг"
- C) try блок шаардлагагүй
- D) Exception төрөл буруу
Зөв хариулт: B
Тайлбар: Хоосон catch блок нь хамгийн муу практик — алдаа гарсан ч хэн ч мэдэхгүй ("алдааг залгидаг"). Ядаж алдааг бүртгэх (log) хэрэгтэй.
Тест 93
Дараах аль нь backward compatibility-ийн утга вэ?
- A) Хуучин хувилбар шинэ хувилбартай ажилладаг
- B) Шинэ хувилбар хуучин хувилбартай нийцтэй ажилладаг
- C) Хоёр програм нэг зэрэг ажиллах
- D) Кодыг буцаах боломж
Зөв хариулт: B
Тайлбар: Backward compatibility = хоёшоо нийцтэй байдал. Шинэ хувилбар нь хуучин хувилбараар бичсэн кодтой зөв ажиллах чадвар. API дизайнд маш чухал.
Тест 94
Дараах аль нь Open-source library ашиглахын давуу тал вэ?
- A) Кодыг тэг-ээс бичих шаардлагагүй, цаг хэмнэнэ
- B) Үргэлж 100% аюулгүй
- C) Ямар ч тест хийх шаардлагагүй
- D) Лиценз зөрчил гарахгүй
Зөв хариулт: A
Тайлбар: Open-source library ашиглах нь "construction with reuse" — цаг, зардал хэмнэдэг. Гэхдээ B (аюулгүй байдлыг шалгах хэрэгтэй), C (интеграцийн тест хэрэгтэй), D (лиценз анхаарах хэрэгтэй) нь буруу.
Тест 95
Variability analysis гэж юу вэ?
- A) Кодын чанарын шинжилгээ
- B) Програмын аль хэсэг нь өөрчлөгдөж болохыг судлах
- C) Хувьсагчийн утгыг шалгах
- D) Хурдны шинжилгээ
Зөв хариулт: B
Тайлбар: Variability analysis нь "construction for reuse"-ийн суурь. Програмын аль хэсэг өөрчлөгдөж болохыг тодорхойлж, тэр хэсгийг уян хатан (parameterization, design patterns) болгодог.
Тест 96
Scaffolding (барилгын бэхэлгээ) програмчлалд юу гэсэн үг вэ?
- A) Байнгын код
- B) Тест хийхэд зориулсан түр зуурын дэмжих код (stubs, drivers)
- C) HTML бүтэц
- D) Мэдээллийн сангийн бүтэц
Зөв хариулт: B
Тайлбар: Scaffolding нь incremental integration-д ашигладаг түр зуурын дэмжих код. Барилгын ажилд ашигладаг бэхэлгээ шиг — барилга дуусахад авч хаядаг.
Тест 97
Localization (l10n) ба Internationalization (i18n)-ийн ялгаа юу вэ?
- A) Ялгаагүй, нэг зүйл
- B) i18n нь бэлтгэх, l10n нь тодорхой хэл рүү орчуулах
- C) l10n нь бэлтгэх, i18n нь орчуулах
- D) i18n нь тест, l10n нь код бичих
Зөв хариулт: B
Тайлбар: i18n (internationalization) = олон хэлийг ДЭМЖИХЭД бэлтгэх техникийн ажил. l10n (localization) = тодорхой нэг хэл/бүс нутагт зориулж ОРЧУУЛАХ ажил.
Тест 98
Дараах аль нь client-server архитектурын тодорхойлолт вэ?
- A) Бүх код нэг компьютер дээр ажиллах
- B) Нэг компьютер (сервер) үйлчилгээ хангаж, нөгөө (клиент) хүсэлт илгээдэг
- C) Бүх компьютер ижил үүрэгтэй
- D) Интернэтгүй ажиллах систем
Зөв хариулт: B
Тайлбар: Client-server нь distributed system-ийн хамгийн энгийн хэлбэр. Сервер нь нөөц/үйлчилгээ хангаж, клиент нь хүсэлт илгээж, хариу авдаг.
Тест 99
Дараах аль нь "Construction for Reuse"-ийн даалгавар вэ?
- A) Бэлэн сан ашиглах
- B) Дахин ашиглаж болох сан, компонент бүтээх
- C) Кодыг устгах
- D) Тест бичих
Зөв хариулт: B
Тайлбар: "Construction FOR reuse" нь ирээдүйд өөр төслүүдэд дахин ашиглаж болох сан, компонент бүтээх. "Construction WITH reuse" нь бэлэн сан ашиглах (A сонголт).
Тест 100
Software Construction яагаад чухал вэ?
- A) Зөвхөн код бичих л чухал
- B) Код бол програмын эцсийн бүтээгдэхүүн тул чанартай бүтээлт нь найдвартай, аюулгүй, засвар хялбар програм хангамж бий болгодог
- C) Зөвхөн компанийн ашиг олоход чухал
- D) Технологи мэддэг болоход л чухал
Зөв хариулт: B
Тайлбар: Код бол програм хангамжийн эцсийн бүтээгдэхүүн (ultimate deliverable). Чанартай бүтээлт нь програмын зөв байдал (correctness), найдвартай байдал (robustness), засвар хялбар байдал (maintainability), гүйцэтгэл (performance) зэрэг чанарын шинж чанаруудыг тодорхойлдог. Тиймээс Software Construction нь програм хангамжийн амжилтын гол түлхүүр юм.
📚 Ашигласан эх сурвалжууд:
- SWEBOK v3 — Chapter 3: Software Construction (IEEE Computer Society)
- Head First Software Development (O'Reilly)
- Clean Architecture by Robert C. Martin
- Ken Fogel — Transitioning to Java (Packt, 2023)
- Code Complete, 2nd Edition by Steve McConnell
- Wikipedia — Software Construction
- IEEE Computer Society — What Is Software Construction?