ОНОЛ 01

Програм Хангамжийн Бүтээлт

ЛЕКЦ 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 хуудас бүгд нэг догол мөргүй, нэг удаа ч мөр шилжүүлэлгүй бичсэн ном
  • Б) Бүлэг бүлгээр хуваасан, гарчигтай, зурагтай, товч тодорхой ном

Мэдээж Б) сонголт! Код ч яг адил — бүтэцтэй, ойлгомжтой байх ёстой.

Хэрхэн хэрэгжүүлэх вэ?

  1. Нэршлийн стандарт (Naming conventions) — Хувьсагч, функцийн нэрийг утга санаа нь тодорхой байхаар өгөх

    // Муу жишээ:
    int x = 25;
    
    // Сайн жишээ:
    int studentAge = 25;  // Оюутны нас гэдэг нь тодорхой
    
  2. Модуль болгож хуваах (Modular decomposition) — Нэг том програмыг жижиг, тус тусдаа ажиллах хэсгүүдэд хуваах

  3. Холбоосыг багасгах (Reducing coupling) — Хэсгүүд хоорондоо аль болох бага хамааралтай байх

  4. Гүн үүрлэлтээс зайлсхийх — 3-аас дээш түвшний if/for үүрлэлт ойлгоход хэцүү болдог

  5. Хийсвэрлэл (Abstraction) — Нарийн дэлгэрэнгүй зүйлийг нуух

1.3.2 Өөрчлөлтийг урьдчилан тооцох (Anticipating Change)

Асуудал: Бараг бүх програм хангамж цаг хугацааны явцад ӨӨРЧЛӨГДДӨГ. Судалгаагаар дундаж төслийн шаардлагын 25% нь хөгжүүлэлтийн явцад өөрчлөгддөг. Дахин ажиллах (rework) зардал нь анхнаасаа зөв хийснээс 10-100 дахин үнэтэй байдаг.

Зарчим: Програмыг ирээдүйд өөрчлөхөд хялбар байхаар бүтээх.

Амьдрал дээрх зүйрлэл: Та шинэ байшин барьж байна. Хэрэв ирээдүйд давхар нэмж болохоор суурийг бат бөх хийвэл — энэ бол "өөрчлөлтийг урьдчилан тооцсон" хэрэг. Харин суурийг яг л нэг давхарт зориулж хийвэл, дараа нь давхар нэмэхэд бүх зүйлийг нураагаад дахин барих шаардлагатай болно.

Хэрхэн хэрэгжүүлэх вэ?

  1. Сул холбоос (Loose coupling) — Хэсгүүдийг нэг нэгнээсээ тусгаарлах
  2. Мэдээлэл нуух (Information hiding) — Дотоод хэрэгжүүлэлтийг далдлах
  3. Тусгаарлалтын зарчим (Separation of concerns) — Өөр өөр үүрэг бүхий хэсгүүдийг салгах
  4. Дизайн загвар (Design patterns) — Батлагдсан шийдлүүдийг ашиглах
  5. Тохируулж болох өгөгдөл (Configurable data) — Тогтмол утгуудыг кодонд бус тохиргооны файлд хадгалах

1.3.3 Шалгах боломжтойгоор бүтээх (Constructing for Verification)

Асуудал: Алдааг аль болох эрт олох нь хожуу олохоос хамаагүй хямд. Алдааг эрт олох тусам засахад бага зардал гарна.

Зарчим: Програмыг бичигчид ч, тестерүүдэд ч, хэрэглэгчдэд ч алдааг амархан олж чадахаар бүтээх.

Амьдрал дээрх зүйрлэл: Машины үйлдвэрлэлд угсрах шугам дээр алхам бүрт чанарын шалгалт хийдэг — бэлэн машинаас алдаа олохоос угсрах явцад олох нь хэдэн зуу дахин хямд.

Хэрхэн хэрэгжүүлэх вэ?

  1. Кодын стандарт дагах → Кодын хянан шалгалтыг (code review) хөнгөвчлөх
  2. Нэгж тест (Unit testing) бичих → Жижиг хэсэг бүрийг тусгайлан шалгах
  3. Автомат тест дэмжих бүтцээр код зохион байгуулах
  4. Нарийн төвөгтэй хэлний бүтцийг хязгаарлах → Ойлгоход хялбар байлгах

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)

Бүтээлтийн төлөвлөлтөд дараах шийдвэрүүдийг гаргадаг:

  1. Бүтээлтийн арга сонгох — Waterfall уу, Agile уу?
  2. Нэгтгэлийн стратеги тодорхойлох — Бүх хэсгийг нэг дор нэгтгэх (Big Bang) эсвэл аажмаар нэгтгэх (Incremental)?
  3. Компонентуудыг бүтээх дараалал тогтоох
  4. Чанарын удирдлагын процесс тодорхойлох
  5. Даалгаврыг хуваарилах — Хэн юу хийх

Зүйрлэл: Аялалд гарахын өмнө маршрут төлөвлөдөг шиг — хаанаас эхлэх, хаана зогсох, хэн юу авч явах гэдгийг урьдчилж тохирдог.

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)

Код бичих нь бүтээлтийн гол үйл ажиллагаа. Анхаарах зүйлс:

  1. Нэршлийн дүрэм — Хувьсагч, функцийн нэрийг утгатай, тодорхой өгөх
  2. Бүтэц зохион байгуулалт — Код кластер (class), пакет (package), модулиар зохион байгуулах
  3. Удирдлагын бүтэц (Control structures) — if, for, while зэргийг зөв ашиглах
  4. Алдааг зохицуулах — Буруу оролтыг зөв арчлах
  5. Аюулгүй байдал — Buffer overflow, array index зэрэг аюулгүй байдлын цоорхойг сэргийлэх
  6. Нөөцийн ашиглалт — Thread, database lock зэргийг зөв удирдах
  7. Баримтжуулалт — Код дотор болон гадна баримт бичиг
  8. Кодын оновчлол — Гүйцэтгэлийг сайжруулах (гэхдээ хэт эрт оновчлохоос зайлсхийх)

"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):

  1. 🔴 Red — Эхлээд шалгах тест бичих (тест амжилтгүй болно, учир нь код байхгүй)
  2. 🟢 Green — Тестийг давахад хангалттай хамгийн бага хэмжээний код бичих
  3. 🔵 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)

#Англи нэр томьёоМонгол утгаДэлгэрэнгүй тайлбар
1Software ConstructionПрограм хангамжийн бүтээлтКод бичих, шалгах, алдаа засах, нэгтгэх зэрэг үйл ажиллагааны цогц. Барилгын жишээгээр бол тоосго өрж, хана босгож, байшин барих үйл явц.
2SWEBOKПрограм хангамжийн инженерчлэлийн мэдлэгийн санIEEE Computer Society-ийн баталсан, програм хангамжийн инженерчлэлийн бүх мэдлэгийг нэгтгэсэн лавлах гарын авлага.
3CodingКод бичихКомпьютерт ойлгогдох хэлээр заавар бичих үйл явц. Монголоор "код зохиох" ч гэж хэлэх боломжтой.
4DebuggingАлдаа засалт / Алдаа олохКодонд байгаа алдааг (bug) олж, шалтгааныг нь тогтоож, засах үйл явц. "Bug" гэдэг нь "шавж" гэсэн үг — анхны компьютерт шавж орж алдаа гаргасан түүхтэй.
5Unit TestingНэгж тестчилэлПрограмын хамгийн жижиг хэсгийг (нэг функц, нэг класс) тусгайлан, бусдаас тусгаарлаж шалгах. Жишээ нь нэг тооцоолох функц зөв хариу өгч байгааг шалгах.
6Integration TestingНэгтгэлийн тестчилэлХоёр ба түүнээс олон хэсэг хоорондоо зөв ажиллаж байгааг шалгах. Жишээ нь нэвтрэх хэсэг ба мэдээллийн сан хоорондоо зөв холбогдож байгааг шалгах.
7Minimizing ComplexityНарийн төвөгтэй байдлыг багасгахХүний тархи хязгаарлагдмал тул кодыг аль болох энгийн, ойлгомжтой бичих зарчим.
8Anticipating ChangeӨөрчлөлтийг урьдчилан тооцохИрээдүйд програмыг өөрчлөх шаардлагатай болохыг тооцож, өөрчлөхөд хялбар байхаар бүтээх зарчим.
9Constructing for VerificationШалгах боломжтойгоор бүтээхАлдааг амархан олж, засаж болохоор кодыг бүтэцлэх зарчим.
10ReuseДахин ашиглалтӨмнө бүтээгдсэн код, сан, компонентыг шинэ асуудал шийдвэрлэхэд дахин ашиглах. "Дугуйг дахин зохиохгүй" зарчим.
11StandardsСтандартуудБаримтлах дүрэм, журам. Нэршил, формат, хэрэгсэл ашиглах дүрмүүд. Замын хөдөлгөөний дүрэмтэй адил — бүгд нэг дүрмийг дагахад эмх цэгц бий болно.
12Waterfall ModelХүрхрээ загварШугаман дараалалтай хөгжүүлэлтийн загвар. Нэг алхмыг бүрэн дуусгаж дараагийнх руу шилждэг.
13AgileУян хатан хөгжүүлэлтБогино давталтуудаар (sprint) ажиллаж, байнга бүтээгдэхүүн гаргаж, хэрэглэгчийн санал хүсэлтэд нийцүүлэн өөрчилдөг арга зүй.
14SprintСпринт / ДавталтAgile хөгжүүлэлтийн нэг давталт. Ихэвчлэн 1-4 долоо хоног. Энэ хугацаанд тодорхой ажлуудыг гүйцэтгэж, ажиллагаатай бүтээгдэхүүний хэсэг гаргадаг.
15Big Bang IntegrationНэг удаагийн нэгтгэлБүх хэсгийг тусдаа бүтээгээд, эцэст нь нэг дор нэгтгэх арга. Алдааны эх сурвалжийг олоход маш хэцүү.
16Incremental IntegrationАажмын нэгтгэлХэсэг хэсгээр нэгтгэж, алхам бүрт шалгаж явдаг арга. Алдааг амархан олдог.
17APIПрограмын хэрэглээний интерфейсНэг програм нөгөө програмтай харилцах стандартчилсан арга зам. Ресторанд цэс захиалдаг шиг — дотоод үйл явцыг мэдэх шаардлагагүй.
18PolymorphismОлон хэлбэрт байдалНэг ерөнхий үйлдэл нь объектийн төрлөөс хамааран өөр өөрөөр ажиллах чадвар.
19ReflectionРефлекц / Өөрийгөө шинжлэхПрограм ажиллаж байх үедээ өөрийн бүтцийг харж, өөрчилж чаддаг чадвар.
20GenericsЕрөнхий төрлүүдНэг код бичээд олон төрлийн өгөгдөлтэй ажиллах боломж олгодог механизм.
21AssertionБатламж / НотолгооКодонд тодорхой нөхцөл үнэн байх ёстой гэж зарлах шалгах цэг. Хөгжүүлэлтийн үед алдааг эрт олоход тусалдаг.
22Design by ContractГэрээгээр дизайнФункц бүр урьдчилсан нөхцөл (precondition) ба дараах нөхцөл (postcondition) тогтоож "гэрээ" байгуулдаг арга.
23Defensive ProgrammingХамгаалалтын програмчлалБуруу оролтоос програмыг хамгаалах арга барил. Бүх оролтыг шалгаж, найдвартай болгох.
24Exception HandlingОнцгой нөхцөл зохицуулалтПрограмын ажиллах явцад гарч болох алдааг try-catch бүтцээр барьж зохицуулах.
25TDD (Test-Driven Development)Тест-түрүүлсэн хөгжүүлэлтЭхлээд тест бичээд, дараа нь кодыг бичдэг хөгжүүлэлтийн арга. Red-Green-Refactor мөчлөгтэй.
26IDEНэгдсэн хөгжүүлэлтийн орчинКод бичих, компайл хийх, дебаг хийх, тест ажиллуулах бүх хэрэгслийг нэг програмд нэгтгэсэн орчин.
27GUIГрафикт хэрэглэгчийн интерфейсХэрэглэгч програмтай цонх, товч, цэс гэх мэтээр харилцдаг дүрслэлийн интерфейс.
28WYSIWYG"Юу харагдаж байна тэр нь болно"Дизайн хийж байх үед эцсийн үр дүн яг тэр чигтээ харагдах горим.
29CouplingХолбоос / ХамааралМодулиуд хоорондын хамааралын зэрэг. Бага coupling = сайн (модулиуд бие даасан).
30CohesionНэгдмэл байдалНэг модуль доторх элементүүд хэр нягт холбоотой байгааг хэмждэг. Өндөр cohesion = сайн.
31RefactoringДахин бүтэцлэхКодын ажиллагааг өөрчлөхгүйгээр дотоод бүтцийг сайжруулах. Байшинг нураахгүйгээр дотоод засвар хийх шиг.
32Life Cycle ModelАмьдралын мөчлөгийн загварПрограм хангамжийг эхнээс нь дуустал хөгжүүлэх үйл явцыг тодорхойлсон арга зам (Waterfall, Agile гэх мэт).
33Configuration ManagementТохиргооны удирдлагаКод, баримт бичиг, тестийн өөрчлөлтийг хянах, удирдах үйл явц. Git зэрэг хэрэгслийг ашигладаг.
34Code ReviewКодын хянан шалгалтНэг хүний бичсэн кодыг өөр хүн уншиж, шалгаж, санал өгөх үйл явц.
35Static AnalysisСтатик шинжилгээКодыг ажиллуулахгүйгээр шинжилж, алдаа, аюулгүй байдлын асуудлыг олох.
36ProfilingГүйцэтгэлийн дүн шинжилгээКод ажиллаж байх үед хаана их цаг зарцуулж байгааг хэмждэг.
37MiddlewareЗуучлагч програмҮйлдлийн систем ба програмын хооронд байрладаг, үйлчилгээ хангадаг програм хангамж.
38ConcurrencyЗэрэгцээ боловсруулалтОлон ажлыг нэг зэрэг гүйцэтгэх чадвар. Thread, semaphore, mutex зэргийг ашигладаг.
39Fault ToleranceАлдаанд тэсвэртэй байдалСистемд алдаа гарсан ч үйл ажиллагааг үргэлжлүүлэх чадвар.
40Cyclomatic ComplexityЦикломатик нарийн төвөгтэй байдалКодын бүтцийн нарийн төвөгтэй байдлыг тоогоор хэмждэг. Кодонд хэдэн бие даасан зам байгааг тоолдог. Тоо их байх тусам → ойлгоход хэцүү, алдаатай байх магадлал өндөр.