Break your limit, practice your skills | https://unsplash.com/photos/_UeY8aTI6d0

เมื่อผมลองทำการบ้านวิชา Software Architect

Supawit R
odds.team
Published in
3 min readFeb 1, 2021

--

เมื่อเร็วนี้ผมมาเป็น Teacher Assistant (TA) ของวิชา Software Architect ที่ผมมาเป็นเพราะเห็นว่า อยากมี skill Software Architect มาก เป็น skill ที่เรารู้เพียงแค่ผิว ๆ ถือโอกาสเรียนรู้ไปในตัว หวังว่าจะนำปรับใช้กับงานด้วย :)

วันนี้ผมจะมาเล่าว่าการบ้านในสัปดาห์แรกของน้องเป็นอะไร ผมลองทำอะไร แล้วรู้สึกยังไง

เป้าหมายของวิชานี้

เป้าหมายที่เรียนกันในวิชานี้ มีเน้น ๆ ที่เราอยากเห็น web services ที่รองรับการ scale ได้มาก ๆ ว่าจะเริ่มยังไง ต้องรู้อะไรบ้าง

และการบ้านในคาบแรกที่เปิดมาก็ยากประมาณหนึ่งเลย คือให้เราเขียน simple web api ง่าย

โจทย์ของสัปดาห์แรก

โจทย์คือทำ Message Counter Web Service

  • สามารถส่งข้อความเพื่อเก็บในระบบ
  • สามารถแสดงข้อความทั้งหมดที่เก็บในระบบ และบอกด้วยว่าข้อความแต่ละข้อความถูกส่งมากี่ครั้ง

เพื่อให้ง่ายเรายังไม่ต้องเก็บข้อมูลลง Database เก็บเข้า memory ก็พอ ถ้า restart application ข้อมูลก็จะหายไปหมด มองดูแล้วตัวโจทย์นี้ไม่ยากเลย

requirement ต่อมาคือ เจ้าระบบนี้เราจะจับคู่กัน หา buddy ไม่ได้เพื่อที่จะมาช่วยกันเขียนโค้ดนะ แต่ให้ buddy เลือกภาษาที่จะมาแก้โจทย์โดยที่

  • คนแรกขอเรียก นาย A ต้องเลือกภาษา blocking เช่น Java, ASP .NET, Python-Flask, Ruby
  • คนที่สองขอเรียก นาย B ต้องเลือกภาษา non-blocking เช่น Go, Node.js, Vert.x

ตรงนี้ขอไม่อธิบายเพิ่มว่า block, non-blocking ต่างกันยังไงนะ

การเริ่มต้นของโปรเจกต์ด้วยการเลือกเทคโนโลยี ถ้ามองแล้วเริ่มต้นอาจไม่ต่างกันมากเท่าไร แต่เชื่อว่าการที่แอปโตขึ้นจากการเพิ่ม feature หรือฐานผู้ใช้งาน มีผลแตกต่างกัน

เหตุผลที่ให้จับ buddy แล้วลองคนละ technology กัน เพื่อที่สัปดาห์ถัด ๆ ไปจะมาลองยิง load test ดู

เริ่มทำ

เมื่อได้ simple web api ผมได้จับคู่กับน้อง แล้วให้น้องเลือกภาษาที่อยากเขียนเลย น้องเลือกฝั่งที่เป็น non-blocking

ตอนนี้ในใจที่ผมคิดถ้าเป็น Blocking จะลองอะไรดี แล้วผมก็เลือกใช้ Java SpringBoot ที่ผมลองเลือกตัวนี้ เพราะอยากรู้ด้วยตัวเองว่า Java ที่เขาว่าเร็วแต่แลกมาด้วยการกิน resource ที่มากเนี่ย มันมีความเสี่ยงยังไงที่จะทำให้ application scale ได้ยาก

เพิ่มความยากของโจทย์

ถัดมา ๆ การบ้านไม่ได้จบเท่านี้ เราจะต้องทำการ deploy application ของเราขึ้นไปที่ azure โดยที่เริ่มจากการลองทำผ่าน web portal คลิก ๆ เพื่อสร้างเครื่อง Virtual Machine พอลองทำ manual ด้วยตัวเองทุกขั้นตอนแล้ว สิ่งที่น้องได้ทำต่อไปคือการที่เขาต้องเขียน Automation Script ขึ้นมา โดยมีตัวเลือกอีกเหมือนกัน

  • นาย A ให้ลองใช้ Ansible / GitHub Action
  • นาย B ให้ลองใช้ Terraform, Chef

การดูว่า Script เราทำงานได้จริง

  • script ควรจะสามารถสร้างของจาก 0 ตั้งแต่ไม่มีเครื่อง server, network
  • script ควรจะสามารถแก้ไขปัญหาให้เราได้ เช่น Firewall misconfig, machine deleted, machine restart

มาถึงจุดนี้จากที่นั่งทำ simple web api ง่าย ๆ ไปทำฝั่ง operation ให้รันแอปขึ้นมาจาก 0 แล้วสำหรับน้อง ๆ ที่ต้องมาเรียนรู้เองแล้วถือว่าไม่ง่ายเลย

แต่ทุกอย่างต้องมีครั้งแรกเสมอครับน้อง

ตัวผมเองที่ได้เป็นนาย A ก็เลือกใช้ GitHub Action เพราะยังไม่มีโอกาสได้ลองใช้

เข้ามาลองใช้ GitHub Action ดูเริ่มต้นไม่ยากเลย จิ้มเลือก step ก็พอจะได้ของมาประมาณนึง โดยพวก script เริ่มต้นจะเป็นพวกการดูด source code จาก Git มาแล้ว build เพื่อให้ได้แอปมา ที่ผมตั้งใจทำเป็นอย่างแรกก็คือทำยังไงก็ได้ให้แอปมันรันได้ก่อน สร้าง VM เองไว้ทีหลัง ไปดูว่าถ้ารันบน terminal ที่เรา ssh เข้าไปจัดการจะต้องมีคำสั่งอะไรบ้าง โดยคำสั่งที่จะใช้ไม่ควรต้องรอ prompt (keyboard input) เพราะว่าอยู่ใน CI จะตอบของพวกนี้ไม่ได้ โดยใน GitHub Action เขาจะเรียกการทำงานว่า workflow หรือที่เราเรียก ๆ กันว่า pipeline

แล้วการที่เรา build app ขึ้นมาได้ ยังไม่พอจะต้องเอาไฟล์ไปฝากบน remote อีก โดยจะมีโปรแกรมตัวนึงช่วยเราได้ก็คือ SCP เราก็เอา keyword นี้ไปลอง search ดูว่ามี Action นี้ให้ใช้ไหม (ตัว Action เป็น script เรียกว่าแทบจะสำเร็จรูปสำหรับการทำ operation นึง ๆ ที่เอาใช้กับ GitHub Action โดยอาจจะเป็น Action จาก official หรือนักพัฒนาช่วย ๆ กัน build)

พอเรารันแอปได้ ถัดไปจะเหลืองานที่จะทำ 2 อย่างคือการ สร้าง resource ที่จะใช้ run application เช่น การสร้าง network interface, storage, virtual machine, DNS จะเรียกตรงนี้ว่า setup server ตรงนี้คือส่วนที่เราต้องไปจัดการบน cloud provider และอีกอย่างคือการ provisioning เตรียม server ที่ได้มาให้พร้อมสำหรับการรันแอปพลิเคชัน เช่น การจัดการ firewall, ติดตั้ง web server, ติดตั้ง runtime ของภาษานั้น ๆ

Create resource

ตรงส่วนนี้ต้อง script ไปคุยกับ azure api เราก็ต้องไปศึกษา cli ที่ใช้ manage resource ที่อยู่บน azure ตรงส่วนนี้ถือว่าเปลืองเวลาไปพอตัวกว่าที่เราจะสร้างเราก็ต้องรู้หลาย ๆ command มาก ๆ หลายสิบคำสั่งเลย ผมพยายามดู document เป็นอย่างแรกว่าเขาให้อะไรมาบ้าง คำสั่งต่าง ๆ โดยผมเอา keyword ที่ได้จาก web portal มาลองค้นดู โดย azure เองก็ทำ doc มาครบมาก ๆ แม้ว่าจะเสียเวลาศึกษา command เยอะประมาณนึงเลยก็ตาม ผมพยายามลองสร้าง resource ต่าง ๆ ผ่าน cli โดยวิธี manual ทีละคำสั่ง พอเรารู้ว่ามันจะต้องทำยังไง เราค่อยเรียงเอาคำสั่ง ตามขั้นตอน 1 2 3 4 ยัดเข้าไปใน workflow ของ GitHub Action

Provisioning

มาถึงขั้นตอนนี้ได้ถือว่าสบายกว่าตอน create resource แล้ว แต่จับยัดความรู้ linux command ไปเต็มที่ โดยขั้นตอนที่ผมทำคือ enable firewall ก่อน โปรแกรมของ Ubuntu ก็จะเป็น ufw 👉 ติดตั้ง Apache Server แล้วสั่ง proxy มาที่ port ของ application 👉 ติดตั้ง Java Runtime Environment (JRE)

🎉 ทดลองทำมาเยอะมาก แต่ก็ได้เรียนรู้เยอะทั้ง GitHub Action, azure cli เป็นต้น และคิดว่าอยากจะลองทำ version Ansible กับ Terraform ต่อ..

ใครอยากเห็นแล้วว่าสุดท้ายของที่ถูกสร้างขึ้นมาเป็นยังไงลองไปดูได้ที่ GitHub ข้างล่างนี้เลย

ถ้ามีเรื่องสนุก ๆ จะมาเล่าต่อ 🙂

Special Thanks

ขอขอบคุณ “สำนักงานส่งเสริมเศรษฐกิจดิจิทัล (depa)” และคณาจารย์ “คณะเทคโนโลยีสารสนเทศ มจธ. (SIT)” ที่ให้การสนับสนุน “ทุนเพชรพระจอมเกล้าเพื่อพัฒนาเทคโนโลยีและนวัตกรรมดิจิทัล (KMUTT-depa)” ซึ่งเป็นทุนที่มอบความรู้ ทักษะและโอกาสดีในการฝึกฝนพัฒนาทักษะที่มีอยู่ให้เฉียบคมมากยิ่งขึ้นครับ ❤

--

--

Supawit R
odds.team

a developer who love to learn, read, and sleep.