Та квант компьютер дээр Виндоус 95 ажиллуулж байна
: Шийдэгдээгүй сэтгэл зүйн техникийн өрийн нуугдмал зардал
20 жилийн өмнө дадлагын ажилтан бичсэн нэг мөр кодын улмаас олон сая долларын алдагдал хүлээж буй өндөр давтамжийн арилжааны алгоритмыг төсөөлөөд үз. Тэр дадлагын ажилтан бол 7 настай байхад чинь өөрийнх чинь. Тэгээд тэр код одоо таны амьдралыг ажиллуулж байна.
Програм хангамжийн инженерчлэлд 'Хуучин код (Legacy Code)' гэдэг нь одоо ч хэрэглэгдэж байгаа боловч засвар үйлчилгээ хийхэд төвөгтэй хуучин эх кодыг хэлнэ. Энэ нь одоогийн цар хүрээг бодолцож бичигдээгүй байсан. Тэр үед тодорхой асуудлын түргэн шийдэл (засвар) байсан.
Татгалзалтын айдас уу? Энэ бол ангид дуу хоолой авах үед бичигдсэн хуучин код юм. Мөнгөний түгшүүр үү? Нийтийн төлбөрийн төлөө хэрэлдэж байсан эцэг эхийг харж байхад бичигдсэн хуучин код. Эдгээр нь анх 'алдаа' биш байсан. Тэд амьд үлдэх скрипт байсан. Тэд тэр үед чамайг хамгаалсан. Гэхдээ одоо чи цогц үйл ажиллагаа явуулж буй командлагч байгаа бөгөөд эдгээр 8 битийн скриптүүд таны RAM-ын 80%-ийг эзэлж байна.
Ихэнх хүмүүс энэ зөрчилдөөнтэй OS дээр шинэ 'зуршил' (апп) суулгах гэж оролддог. Хэзээ ч ажиллахгүй. Танд шинэ апп хэрэггүй. Цөм дахин боловсруулалт (Kernel Refactor) хэрэгтэй.
1. Техникийн өрийн тодорхойлолт: Саатал (Latency) туршилт
Хуучин код ажиллуулж байгаагаа яаж мэдэх вэ? 'Саатал (хоцрогдол)'-ыг хай.
- Хариу үйлдлийн зөрүү (The Reaction Gap): Жижиг зүйл (даргын тодорхойгүй имэйл) тохиолдсон боловч сэтгэл хөдлөлийн хариу үйлдэл асар том байна (сандрах таталт). Тэр тэнцвэргүй хариу үйлдэл бол цаана давталтанд орж буй хуучин кодын улмаас үүссэн саатал юм. Цэвэр систем өгөгдлийг байгаагаар нь боловсруулдаг. Эмх замбараагүй систем өгөгдөл дээр нь 20 жилийн кэш хийсэн логт хариу үйлдэл үзүүлдэг.
- Давтагдах алдаа: Яг ижил төрлийн хортой хүнтэй болзож байна уу? Яг ижил сард ажлаа орхидог уу? Энэ бол та гарч чадахгүй байгаа 'While Loop' юм.
2. Сэтгэлийн гэмтлийн 'спагетти код'
Яагаад зүгээр л 'давах' нь ийм хэцүү байдаг вэ? Сэтгэлийн гэмтэл бол 'спагетти код' учраас. Бүтэцгүй, орооцолдсон, тодорхой GOTO мэдэгдэл байхгүй. Нэг дурсамж үнэртэй холбогдсон, тэр айдастай холбогдсон, тэр гэдэсний өвдөлттэй холбогдсон.
Нэг мөр хүрвэл бүхэл модуль эвддэг. Иймээс хүсэл зориг бүтэлгүй-тдэг. Та 'уур хилэн' функцийг засах гэж байна боловч энэ нь 'аюулгүй байдал' номын санд хатуу кодлогдсон байдаг. Зүгээр л устгаж болохгүй.
3. Дахин боловсруулалт vs. Дахин бичих (Rewriting)
Эхлэн хөгжүүлэгч 'эхнээс дахин бичих (Rewrite)'-ыг хүсдэг. Тэд өөрийгөө алах эсвэл нэг шөнийн дотор шинэ хүн болохыг хүсдэг. Ахлах архитектууд энэ нь гай гамшиг болохыг мэддэг. Хамаарал (Dependencies) байдаг. Ажиллах цагийн (Uptime) шаардлага байдаг.
Бид 'дахин боловсруулалт' ашигладаг. Гадна талын зан үйлийг шууд өөрчлөхгүйгээр кодын дотоод бүтцийг өөрчилнө.
- Тайлбар бичих (Commenting Out): Бид одоохондоо айдасны скриптийг устгаагүй. Зүгээр л автоматаар ажиллахгүй байхаар тайлбар хийнэ. Бид үүнийг ажиглана.
- Модульчлал (Modularization): Орооцолдсоныг тайл. 'Миний өөрийн үнэлэмж' ба 'миний бүтээмж'-ийг салга. Одоо тэд холбогдсон анги (Coupled Classes) байна. Бид тэднийг салгах (Decouple) хэрэгтэй.
4. Баримтжуулалтын үе шат: Кодын шалгалт болгосон тэмдэглэл
Баримт биргүй код бол хар хайрцаг юм. Унших боломжгүй зүйлийг засах боломжгүй. Ай руутингийн [Diary] модуль нь "өнөөдөр гунигтай байсан" гэж бичих тэмдэглэлийн дэвтэр биш. Энэ бол кодын шалгалт (Code Review)-д зориулагдсан.
- Мөрийн лог (Trace Logs): Алдаа (түгшүүр/уур) мэдрэх үед өрөмдлөгийн мөрдлөгө (Stack Trace) хий. "Би уурласан. Яагаад? Тэр намайг үл тоомсорлосон. Энэ яагаад өвдсөн бэ? Аав минь явж байгаа мэт санагдсан." Бум. Үндсэн директорыг олсон.
- Commit мессеж: Ойлголт бүр дээр бич. "Шүүмжлэл хамгаалалтын дэд горимыг триггер хийдэг алдаа засварласан."
5. Хуучин API (харилцаа)-г хүчингүй болгох (Deprecating)
Заримдаа таны хуучин код гадаад сервер дээр хадгалагддаг. Чамайг 'инээдтэй бүдүүн найз' хэвээр байхыг хүсдэг хуучин найзууд. Чамайг хүүхэд гэж үздэг эцэг эх. Эдгээр бол хүчингүй болгосон (Deprecated) API юм.
Тэд одоо байх ёсгүй endpoint руу пинг илгээж байна. Та 410 Gone алдаа илгээх хэрэгтэй. "Би тэр зан үйлийг дэмжихээ больсон." Үргэлжлүүлэн пинг илгээвэл IP-г нь блоклоорой.
6. Шинэ цөмийн нэгж туршилт (Unit Testing)
Итгэл үнэмшлээ дахин боловсруулсны дараа (жишээ нь: "Би сул дорой"-г "Би чадварлаг" гэж өөрчлөх), нэгжийн туршилт ажиллуулах хэрэгтэй.
- Стрессийн туршилт: Алдаа үүсгэдэг байсан нөхцөл байдалд санаатайгаар өөрийгөө оруул. Олон нийтийн өмнө үг хэлэх үү? Зөрчилдөөн үү?
- CPU-ийн температур хянах: Зүрхний цохилт ([Control Tower] эрүүл мэндийн үзүүлэлт ашигла)-ыг ажигла. Сандарсан уу? Эсвэл тайван байсан уу? Сандарсан бол дахин боловсруулалт бүтэлгүйтсэн. Код руу буц.
7. Тасралтгүй интеграци/Тасралтгүй байршуулалт (CI/CD)
Та хэзээ ч 'дууссан' болохгүй. Та үргэлж бета хувилбар байна. Илүү өндөр түвшний амжилт (илүү их траффик) руу өргөжих тусам шинэ алдаа гарна.
- Шөнийн бүтээлт (Nightly Builds): Шөнө бүр кодоо хянаарай. Хуучин скрипт нууцаар орж ирсэн үү?
- Засварын мягмар (Patch Tuesday): Гүн эмчилгээ эсвэл бясалгалд тусгайлан цаг гарга. Энэ бол серверийн засвар үйлчилгээний цаг юм.
8. 'Хуучин техник хангамж' (бие)-ийн аюул
Код техник хангамж дээр ажилладаг. Таны бие сэтгэлийн гэмтлийг бие махбодит нь хадгалдаг. Psoas булчин, блуждающий мэдрэл. Заримдаа код зүгээр боловч серверийн багц тоос шороонд дарагдсан байдаг.
- Техник хангамжийн цэвэрлэгээ (Hardware Flush): Бие махбодийн протокол шаардлагатай. Өндөр эрч хүчний интервал сургалт. Гүн тактикийн амьсгал. Хүйтэн усанд орох. Энэ нь BIOS-ыг дахин ачаална. Биеийн асуудлыг үгээр шийдэж чадахгүй. Биечлэн гадагш гаргах хэрэгтэй.
9. Яагаад бид хуучин кодыг хүндэтгэдэг вэ
Өнгөрсөн цагийг бүү үзэн яд. Тэр хуучин код өөр нөөц байхгүй үед системийг үргэлжлүүлэн ажиллуулсан. 2010 оны осол (таны өсвөр насны үе)-оос амьд үлдсэн. Тэр үүргээ биелүүлсэн.
Хүндэтгэл үзүүл. Талархал илэрхийл. Тэгээд тэтгэвэрт гарга. Архивд түүний дурсгалыг босгож, үйлдвэрлэлийн траффикийг шинэ кластер руу шилжүүл.
Хавсралт: Нийтлэг ажиллах цагийн алдааны шийдэл
Q1: Гунигтай биш, мэдрэмжгүй байна. Энэ алдаа уу? A: Мэдрэмжгүй байдал бол кодын дутагдал биш. Хэт их ачаалал (DDoS довтолгоо)-оос сэргийлэхийн тулд орж ирж буй бүх траффикыг хаадаг галт хана (Firewall) юм. Систем өндөр аюулыг илрүүлж байгаа гэсэн үг. Сэтгэл хөдлөлийг албадахын оронд аюулын түвшинг бууруулах хэрэгтэй.
Q2: Дахин боловсруулсан боловч стресст орвол алдаа дахин гарч ирлээ. A: Энэ бол 'буцаалт (Rollback)' юм. Өндөр ачаалалд орвол систем хамгийн сүүлд мэдэгдсэн тогтвортой тохиргоо руугаа буцдаг. Таны хуучин зуршил бол тогтвортой тохиргоо. Шинэ код одоохондоо 'үйлдвэрлэлд бэлэн (Production Ready)' болоогүй гэсэн үг л. Үргэлжлүүлэн туршаарай.
Q3: Бүтэн дахин бичих нь хэр удаан үргэлжлэх вэ? A: Бүтэн дахин бичих байхгүй. Үхэх хүртлээ шинэчлэлт байршуулна. Гэхдээ эгзэгтэй тогтвортой байдалд хүрэхэд ихэвчлэн 6-12 сарын төвлөрсөн ажил шаардлагатай.
Q4: Ганцаараа дахин боловсруулж чадах уу? A: Бага түвшний хөгжүүлэгч ганцаараа кодлодог. Ахлах архитект хос програмчлал (Pair Programming) хийдэг. Эмч эсвэл зөвлөгч бол таны хос програмчлагч юм. Тэд дэлгэцийг хэт удаан ширтсэний улмаас таны алдсан синтаксийн алдааг олдог.
Системийн архитектын зааварчилгаа
[Diary] модулийг нээ. Өнөөдөр хүүхэд шиг аашилсан нэг нөхцөл байдлыг тодорхойл. Шүүмжил бүү хий. Зүгээр кодыг хар. IF/THEN мэдэгдэл юу байсан бэ? "IF тэр утсаа хараад байвал THEN тэр намайг үзэн яддаг." Үүнийг тодорхойл. Маргаашаас дахин боловсруулалт эхлүүлнэ.
