Software ရေးပြီးတဲ့အခါ ဘာလုပ်ကြမလဲ

တကယ်တော့ code ရေးတယ်ဆိုတာ ပထမဆုံးအဆင့်ပဲ ရှိပါ​​သေးတယ်။ ဘာကြောင့် compile ရသလဲ။ ဘာလို့ CPU, Memory တွေ လိုအပ်တာလဲ။ Operating System ဘာလို့ လိုအပ်တာလဲ။ Web Server ဘာကြောင့်သုံးသလဲ စသဖြင့် Deployment နဲ့ ပတ်သက်လို့ သိသင့်တာတွေ ရှင်းပြလိုက်ပါတယ်။

Compiling

Software Deployment လုပ်တယ်ဆိုတာ ကိုယ်ရေးထားတဲ့ software ကိုသုံးလို့ရအောင် run တာပဲ။ အဲလို မ run ခင်မှာ source code တွေကို များသောအားဖြင့် အရင်ဆုံး build ရတယ်။ ဘာလို့ဆို CPU က binary (1 နဲ့ 0) ကလွဲရင် C တို့၊ Rust တို့ high level code တွေကို နားမလည်ဘူး။ အဲဒီတော့ လူကပဲနားလည်တဲ့ code တွေကိုအရင်ဆုံး binary format ပြောင်းရတယ်။ ဒါကို build တယ်လို့ အလွယ်ခေါ်တာပေါ့။ နောက်တနည်းက compile မလုပ်ပဲ source code တွေကို native နားလည်မယ့် ကြားခံ software တခုခု ခံပြီး run တာ။ အဲဒီ software ကို interpreter လို့ခေါ်တယ်။

ဒါပေမယ့် ဒီ interpreted language တွေကလည်း source code နဲ့ CPU ကြားမှာ တိုက်ရိုက်အလုပ်လုပ်တဲ့ ပုံစံနဲ့စာရင် နည်းနည်းပို low level ကျတဲ့ bytecode ထွက်အောင် တဆင့်အရင် compile ပြီးမှ ရလာတဲ့ bytecode နဲ့ CPU ကြားမှာ interpreter ကဘာသာဝင်ပြန်ပေးတဲ့ hybrid design ပိုများလာတယ်။ နောက်ပြီး React လိုမျိုးဟာမှာ JSX သုံးတယ်။ Browser မှာ JS interpreter ပါပေမယ့် သူက JSX ကိုနားမလည်ဘူး။ ဒီတော့ Babel တို့၊ Webpack တို့သုံးပြီး JSX ကို JavaScript ပြောင်းရတာပဲ။ ဒီတော့ ဘာနေနေ တခုခုတော့ build ရသလို ဖြစ်လာတယ်။

Resources

နောက်တဆင့်အနေနဲ့ build ပြီးထွက်လာတဲ့ artifact ကို run ဖို့ resource တွေလိုအပ်တယ်။ application တခုအလုပ်လုပ်တဲ့အခါ တွက်ချက်ရတာတွေ ပါတယ်ကိုး။ ဘာမှမတွက်ဘူးဆိုရင်တောင် string manipulation လုပ်တာတွေ၊ filter လုပ်တာတွေ၊ map နဲ့ transform လုပ်တာတွေ၊ List ထဲက တန်ဖိုးတွေဖတ်တာဘာညာ ဒါတွေက အကုန်တွက်နေတာတွေပါပဲ။ အဲဒီအတွက် CPU လိုတယ်။

ဒါတင်ပဲလားဆို သိမ်းဖို့လည်း လိုတယ်။ application ထဲသုံးထားတဲ့ data structure တွေကိုသိမ်းရမယ်။ တွက်ချက်လို့ရလာတဲ့ ရလဒ်တွေ သိမ်းရမယ်။ local variable တွေလည်း ရှိမယ်။ ဒါတင်မကဘူး။ CPU ကိုဘာပြီးရင် ဘာတွက်ရမယ်ဆိုတဲ့ဟာအတွက် ညွှန်ကြားချက်တွေပေးဖို့လည်း load ဖို့နေရာလိုတာပဲ။ အဲဒီအတွက် ကိုယ်တို့ memory လိုတယ်။ memory ကတော့ မျိုးစုံပေါ့။ Register, L1, L2, RAM (Main Memory)၊ နောက် လိုအပ်ရင် storage ကိုပါ memory အဖြစ်သုံးမယ်ဆိုရသေးတယ်။

Operating System

Cloud ပေါ်မှာ Server ဆောက်တယ်ဆိုတာ အဲဒီဟာအတွက်ပဲ။ အဓိကက CPU နဲ့ memory တို့လို resource တွေငှားတာပေါ့။ ဒါပေမယ့် ဒါတင်ပဲလားဆို​တော့ မဟုတ်ဘူး။ ကြားမှာ OS ခံကြတယ်။ Windows, Linux တို့ BSD တို့စသဖြင့်ပေါ့။ OS အကြောင်းကို အသေးစိတ် မပြောတော့ဘူး။ hardware resource တွေနဲ့ application တွေကြားမှာ အလုပ်လုပ်ပေးတဲ့ software ကြီးလို့ အလွယ်မှတ်လို့ရတယ်။

ဥပမာ Java ရဲ့ JVM, Go runtime, C ရဲ့ malloc တို့တွေက application ထဲ memory လိုရင် OS ရဲ့ API တွေလှမ်းခေါ်ပြီး တောင်းကြရတာဖြစ်တယ်။ (C ကို OS မပါပဲ run လို့မရ မဟုတ်ဘူး။ ရပါတယ်။ ဒါပေမယ့် malloc ခေါ်ရင် ဘာဖြစ်စေမယ်ဆိုတဲ့ custom implementation လိုပြီး ဒါကို bare metal programming လို့ခေါ်တယ်)

Dependencies

Software တခု အလုပ်လုပ်ဖို့ဆိုရင် သူ့ပတ်ဝန်းကျင်မှာ သူမှီထားတဲ့ dependency တွေအသင့်ရှိနေဖို့ လိုတယ်။ အထူးသဖြင့် interpreted ပုံစံအလုပ်လုပ်မယ့် application မျိုးဆိုရင် ကိုယ်တို့ source code ကိုစက်ပေါ်တင်ပြီးတဲ့အခါ မှီထားတဲ့ library တွေကို Server (OS) ပေါ်မှာ install ဖို့လိုအပ်တယ်။

ဒီနေရာမှာ တခုခေါင်းခဲစရာက ကိုယ် code ရေးတုန်းက သုံးထားတဲ့ version တွေကတမျိုး Server ပေါ်ထည့်မိတာကတမျိုးဖြစ်ရင် ထင်သလို အလုပ်မလုပ်တာတွေ ဖြစ်တယ်။ ဒါကို ဖြေရှင်းနည်းက source code နဲ့အတူတူ လိုအပ်သမျှ library တွေကော filesystem တွေပါ ထည့်ပေးလိုက်တာပဲ။ container တွေရဲ့ သဘောတရားက ဒီလိုပါ။ ဒီ process ကို containerization လုပ်တယ်လို့ခေါ်တယ်။

Middleware

Middleware တွေကလည်း dependency တွေပါပဲ။ ဒါပေမယ့် သူတို့ကတော့ networked dependency တွေပေါ့ ဥပမာ Database တို့၊ Web Server တို့၊ Message Queue တို့။ ကိုယ့် application က MySQL database ကိုသုံးထားတယ်ဆိုရင် ကျိန်းသေပေါက် MySQL install ရမယ်။

ဒါပေမယ့် သူက networked dependency ဖြစ်တဲ့အတွက် ကိုယ့် application တင်ထားတဲ့ စက်နဲ့ တလုံးတည်းပေါ်မှာ ဖြစ်ဖို့မလိုဘူး။ စက်တခုတည်းပေါ်ပဲ တူတူတင်မယ်ဆိုရင်တော့ loopback interface (localhost) ကနေ စကားပြော၊ တခြားစက်ပေါ်ဆိုရင်လည်း network ပေါ်ကတဆင့် ချိတ်ပေါ့။ ဒီတော့ network access control ဆိုတဲ့ ခေါင်းစဥ်ဆီ ရောက်လာတယ်။

Network Firewall

အင်တာနက်ဆိုတာ တကမ္ဘာလုံးချိတ်ထားတာဖြစ်လို့ ရရင် ရသလို ဝင်ကြမှာပဲ။ လုံခြုံအောင် သိမ်းဖို့က ကိုယ့်တာဝန်။deploy ထားတဲ့အထဲ public ကသုံးဖို့မဟုတ်တဲ့၊ public ကိုပေးသိဖို့ မလိုတဲ့ အစိတ်အပိုင်းတွေ အကုန်လုံးကို အဝင်အထွက် မရှိအောင် lock ချထားဖို့လိုတယ်။ ဒီအတွက် Middleware တွေက ဘယ် port ဘယ်လိပ်စာမှာ ဆက်သွယ်လို့ရမယ်။ ဒါတွေကို ဘယ်သူတွေက ဆက်သွယ်ခွင့်ရှိတယ်ဆိုတဲ့ firewall သေချာဆင်ဖို့လိုတယ်။ အပွင့်လွန်ရင် အကုန်သမခံရပြီး အပိတ်လွန်သွားရင်လည်း ကိုယ့် app ကပါ ဆက်သွယ်လို့မရဖြစ်မယ်။

Web Server (Reverse Proxy)

Application တွေအကုန်လုံးက Web App တွေမဟုတ်ဘူး။ Web App ဆိုတာက Web traffic ကိုနားလည်ပြီး Web ပေါ်ကနေ သုံးလို့ရအောင် interface ထုတ်ထားပေးတဲ့ app ကိုခေါ်တာပါပဲ။ အရင်ကတော့ Web App ဆိုရင် HTML, CSS တွေထုတ်ပေးတဲ့ Application တွေဖြစ်ခဲ့တာမို့ တော်တော်လေး သိသိသာသာ ကွဲပြားခဲ့ပေမယ့် အခုခေတ်လိုမျိုး API driven ဖြစ်လာတဲ့အခါမှာ HTTP သုံးနေတာကလွဲရင် Web App ကဒီတိုင်း App ပါပဲ။

တခုရှိတာက Web Application တွေက HTTP protocol ကိုတော့ နားလည်ဖို့လိုတယ်။ ဥပမာ TCP connection နဲ့ HTTP request တွေကိုလက်ခံတတ်ရမယ်။ ရောက်လာတဲ့ request ထဲက path တွေ၊ payload တွေနဲ့ တခြား meta information တွေကို ဖြတ်ထုတ်တတ်ရမယ်။

ဟာ ကျွန်တော် software ရေးလာတာ ကြာလှပြီ။ ဒါမျိုးတွေလည်းမလုပ်ရပါဘူးဆို အဲဒါကြောင့် ဒီခေတ်မှာ လူဖြစ်ရတာ ကံကောင်းတယ်လို့ပြောတာ။ တချို့ runtime တွေ၊ ဥပမာ NodeJS နဲ့ Go တို့တွေက Web Serving module တွေပါတဲ့အတွက် Web Server သီးသန့်မလိုဘူး။ ဒါပေမယ့် Web serving မပါဘဲ ရေးထားတဲ့ PHP နဲ့ Python လိုမျိုးဆိုရင် client ဆီက request တွေကို လက်ခံပြီး application ဆီကို ပြန်လက်ဆင့်ကမ်းပေးမယ့် ကြားခံ (proxy) server တခုခု လိုတယ်။ Apache httpd နဲ့ Nginx တို့လို software တွေက ဒီအတွက်ပါပဲ။ ကိုယ့် application ဆီကို request တွေမှန်မှန်ကန်ကန် forward လုပ်ပေးနိုင်အောင် ဒီ software တွေကို ဘယ်လို configure လုပ်မလဲ လေ့လာရမယ်။

Load Balancer

မဖြစ်မနေ လိုတယ်တော့ မဟုတ်ဘူး။ ဒါပေမယ့် Deploy တဲ့အခါ Load Balancer ပါသင့်တယ်။ Load Balancer ဆိုတာ Server ရှေ့မှာ ထိုင်ရတဲ့ software မျိုးဖြစ်ပြီး သူ့နောက်မှာ ရှိတဲ့ Server တွေဆီ traffic ကိုအချိုးကျ ခွဲပေးနိုင်တယ်။ ဒီတော့ Server တွေလိုသလောက် ထပ်ထည့်လို့ရတဲ့အတွက် horizontal scaling လုပ်နိုင်မယ်။ ပြီးတော့ Load Balancer ကနေတဆင့်ပဲ Server ဆီဆက်သွယ်လို့ရအောင် Firewall နဲ့ပိတ်လို့ရတဲ့အတွက် ပိုလုံခြုံမယ်။

နောက်ထပ် တခြားပြောစရာတွေ အများကြီး ရှိသေးပေမယ့် အကျဥ်းချုပ် ဒီလောက်သိရင်ပဲ အတော်ဟုတ်ပြီ။ Cloud တို့ CI/CD တို့ IaC တို့ပါ ပိုကောင်းကောင်းနားလည်ချင်ရင်တော့ စာအုပ်ဖတ်။