KBTG ใช้ Golang กับงานอะไร? มีอะไรควรรู้บ้างกับการใช้ Go ใน KBTG?

Jirat Srisawat
KBTG Life
Published in
4 min readNov 10, 2022
Sticker แจก Golang guild members น้าา

ในบทความนี้ ผมอยากจะมาอธิบายถึงงานที่ใช้ภาษา Go ใน KBTG โดยอยากเล่าตั้งแต่จุดเริ่มต้นของการนำภาษา Go มาใช้ที่ KBTG สู่ภาพการใช้งานในปัจจุบัน มีข้อดีข้อเสียอย่างไร และมีเรื่องอะไรที่ Developers ควรรู้บ้างในการพัฒนางานส่วนนั้นๆ

จุดเริ่มต้นในการใช้ Go

KBTG เริ่มนำ Go มาใช้เมื่อประมาณ 6 ปีก่อน (ช่วงปี 2016 ราวๆ Go 1.7 ซึ่งตอนนั้นยังไม่มี Go Module เลย ต้องใช้ Dep, Glide กันแบบลำบากพอสมควร) สาเหตุที่องค์กรใหญ่อย่างธนาคารกสิกรไทยและ KBTG กล้านำภาษาใหม่ๆ มาใช้ตอนนั้น เกิดจากการทำโปรเจค Innovation งานหนึ่งที่มีเงื่อนไขพิเศษหลายอย่าง ทั้ง Online และ Batch เช่น ต้องการลิมิต Memory แต่ละ Process ให้น้อยที่สุด ต้องการจัดการ Thread จำนวนมาก ต้องการ Speed ที่เร็ว ฯลฯ

เพื่อตอบโจทย์โปรเจคดังกล่าว ทางทีมลอง Run Benchmark เทียบกันหลายๆ ภาษาตามที่คนในทีมคิดว่าเขียนและดูแลได้ ซึ่งตอนนั้นก็ได้หยิบ Go มาเปรียบเทียบโดยไม่ได้หวังอะไรมาก ปรากฏว่า Go สามารถทำได้ตามเงื่อนไขทั้งหมดและดันได้ผลดีกว่าภาษาอื่นๆ ด้วย แม้คนเขียนจะเพิ่งหัดเขียนและไม่เคยมีประสบการณ์มาก่อน ทำให้เราตัดสินใจเลือก Go สำหรับทำโปรเจคนั้นคู่กับ Stacks ใหม่ตัวอื่นๆ เช่น NoSQL, Microservice และ Containers พอเห็นว่าได้ผลดี โปรเจคอื่นๆ ก็เริ่มหันเข้าหา Golang และมีการใช้งานเพิ่มขึ้นเรื่อยๆ จนถึงทุกวันนี้

Golang Trends in KBTG

จำนวน source code แต่ละภาษาย้อนหลัง 2 ปี
กราฟแสดงจำนวน Source Code แต่ละภาษาในแต่ละช่วงเวลา

ข้อมูลเทรนด์นี้ดึงมาจาก Git ขององค์กร โดยเป็นการเปรียบเทียบจำนวน Source Code แต่ละภาษาย้อนหลังไป 2 ปี ตั้งแต่ปลายปี 2020 จนถึงกลางปี 2022 จะเห็นว่า Golang มีการใช้สูงขึ้นเรื่อยๆ จนเพิ่งขึ้นมาเป็นอันดับ 1 ได้ไม่นานมานี้เอง จากเดิมที่ระบบ Legacy ของธนาคารจะเป็น Java ซะส่วนใหญ่ ซึ่งเป็นหนึ่งในข้อพิสูจน์ว่าการใช้งานภาษา Go ใน KBTG นั้นเติบโตรวดเร็วมากภายในเวลาเพียง 4 ปี จากที่การใช้งานเป็นศูนย์ กลายเป็นภาษาที่มีใช้กันมากที่สุด

ปล. กราฟนี้ไม่ได้บอกว่าภาษาไหนดีกว่ากันนะ บอกแค่จำนวน Source Code ในองค์กรเฉยๆ โดยไม่ได้อ้างอิงถึงคุณภาพหรือความสามารถของแต่ละภาษา เพราะงั้นไม่น่ามีดราม่าเนอะ 555

แล้วใช้ Go กับงานอะไรบ้างล่ะ?

อันนี้จะอธิบายยากหน่อย เพราะระบบในธนาคารค่อนข้างใหญ่ ซับซ้อน และแตกต่างกันมาก แต่เราก็พอจะแบ่งกลุ่มงาน Go ที่คล้ายๆ กันออกมาได้บ้าง โดยใช้วิธีแบ่งระบบของธนาคารเป็นส่วนย่อยๆ และเล่ารวมๆ ว่างาน Go แต่ละส่วนต่างกันยังไง

high level architecture ส่วนที่เกี่ยวข้องกับ Go
จริงๆ ระบบข้างในซับซ้อนกว่านี้มาก แต่เพื่อให้ง่ายสำหรับบทความนี้ ขอเล่าแค่นี้พอ

จากรูปข้างบน เราสามารถแบ่งระบบธนาคารเป็น 3 ส่วนใหญ่ๆ ดังนี้

  • Channel เช่น Mobile Banking, Web รวมถึง Back-office ที่พนักงานธนาคารใช้ หรือ API ที่ให้บริษัทลูกค้าหรือพาร์ทเนอร์ใช้
  • Backend & Integration คือ ส่วน BFF (Backend for Frontend) ของแต่ละ Channel (ไม่ได้มี 1:1 ตามรูปนะ แต่ขึ้นอยู่กับดีไซน์ของแต่ละระบบ) รวมถึงระบบ Enterprise Integration Layer ที่ทำหน้าที่เฉพาะ อย่างเช่นการคุยกับ Core
  • Core เช่น ระบบ Core Banking ต่างๆ ที่เก็บบัญชีธนาคารหรือข้อมูลลูกค้าทั้งหมด

ระบบที่ใช้ Golang ส่วนใหญ่ใน KBTG จะอยู่ตรงช่วง Backend & Integration ที่ต้องมีการรับ Request จาก Channel และส่งต่อไปยัง Core หรือดึงข้อมูลมา Process บางอย่างตรงงาน Batch ซึ่งงานแต่ละส่วนจะใช้ความสามารถของ Go แตกต่างกันไป ตามนี้

Go as Backend

ระบบที่ใช้ Go เป็น Backend มักจะใช้ Go ทำ RESTful API กับ Frontend ภาษาต่างๆ เช่น Swift, Kotlin, Flutter, JavaScript และทำ CRUD กับ Database ตามที่แต่ละระบบออกแบบไว้

ความท้าทายของงานส่วนนี้ มีทั้งเรื่อง API Design, Scalability, Security และ Time to Market เนื่องจากเป็นระบบที่เน้นทำงานร่วมกับ Frontend ต่างๆ ที่มักมีการเปลี่ยนแปลง Requirements และ UI บ่อย จึงต้องดีไซน์ API ให้ยืดหยุ่นเพียงพอ ไปจนถึงการทำให้สเกลได้ในกรณีที่ระบบมีคนใช้งานสูงขึ้นแบบ Exponential ยังไม่รวม Security Requirements ต่างๆ ที่ต้องทำให้ปลอดภัยที่สุดตาม Standard ของธนาคารอีก

ซึ่งจุดนี้เองที่ภาษา Go ช่วยให้การทำงานง่ายขึ้น ด้วยความ Simple ของภาษาและพวก Built-in Tools เช่น HTTP Server ในการ Implement API ได้ง่ายและเร็ว โดยไม่ต้องเขียนโค้ดหลายบรรทัด

นี่จึงทำให้ Developers กลุ่มนี้มีความรู้ที่กว้างและหลากหลาย บางคนรู้ไปถึง Web หรือทำ Full Stack ได้ก็มี แถมส่วนใหญ่มักจะมีการใช้ Agile Methodology ในการพัฒนาระบบด้วย

Technology หรือ Practice ที่ผู้พัฒนาระบบส่วนนี้ควรรู้ เช่น

  • API Authorization & Authentication
  • Security, OWASP Secure Coding
  • Database and Queries Optimization
  • Microservices Design
  • OpenAPI spec, Swagger, gRPC

Go as Integration Layer

Integration Layer ใน KBTG คือระบบกลางที่รวม Transaction จาก Backend แต่ละ Channel มาทำงานบางอย่าง เช่น การทำธุรกรรมทางการเงินทาง PromptPay เพื่อตัดเงินหรือเอาเงินเข้า เป็นต้น

ความท้าทายของงานส่วนนี้จะเป็นเรื่อง Performance, Reliability และ Integration เพราะเป็นระบบกลางของทุกงาน ดังนั้นความเสถียรจึงเป็นเรื่องที่สำคัญที่สุด ถ้าระบบนี้ล่ม อาจถึงขั้นทำให้ทุกบริการของธนาคารใช้งานไม่ได้เลย นอกจากนี้ยังต้องออกแบบให้ Performance รองรับได้สูงที่สุดโดยไม่มี Error (นึกสภาพว่าถ้ามี Error ซัก 1 รายการ ก็เป็นปัญหาใหญ่แล้ว เช่น ลูกค้าโอนเงินแล้วเงินโดนตัด แต่ไม่เข้าบัญชีปลายทาง) บางกรณีอาจต้องมีการใช้ Event-driven ผ่าน MQ มาช่วยด้วย

ในมุมกลับกัน เรื่อง Integration กับภาษา Go ก็ถือเป็นงานที่ค่อนข้างยากกว่าภาษาอื่น เพราะแม้ Go จะเก่งเรื่อง Performance แต่ Go ไม่ Mature เลยในการ Integrate กับ Legacy Technology หรือ Proprietary ต่างๆ เช่น บาง Legacy ธนาคารยังต้องยิงด้วย SOAP หรือ Socket การต้องมาปั้น XML ยิง SOAP หรือ Socket ด้วยภาษา Go มีตัวช่วยน้อยกว่าภาษาอื่นมาก และยังไม่รวม Proprietary Database ที่เค้ามี ODBC/JDBC มาให้ ซึ่งใช้กับ Go ไม่ได้หรือไม่สมบูรณ์ ทำให้บางงานมีการออกแบบที่แปลกๆ เช่น เขียน Go ไปยิง Java ที่ต่อ JDBC หา Proprietary Database อีกที เรื่องนี้ทางเรามองเป็นข้อเสียของ Go เหมือนกัน

ทั้งหมดนี้ทำให้ Developer ส่วน Integration จะมีความรู้และประสบการณ์ในเชิงลึกของเรื่องที่กล่าวมา และอาจจะต้องรู้ถึง Infrastructure ด้วย เพื่อให้จูน Performance ได้เต็มประสิทธิภาพ ดังนั้นสิ่งที่ควรรู้จะเป็นในเรื่องต่อไปนี้

  • Infrastructure, Network, I/O
  • OS Parameters Optimization and Tuning
  • Software Architecture Pattern e.g. SAGA, Event Driven Architecture, Service Mesh, Concurrency Pattern
  • Monitoring & Observability
  • Exception Handling
  • Profiling, Debugging

Go as Batch

งาน Batch ใน KBTG มักจะเป็นการนำ Data มา Process โลจิคบางอย่าง เพื่อส่งต่อให้แก่ระบบ Downstream ต่อๆ ไป ซึ่งข้อจำกัดมักจะเป็นเรื่องของ ปริมาณ Data vs Runtime

ความท้าทายของงานส่วนนี้คือเราจะเขียนโปรแกรมยังไงให้ทำงานได้เร็วที่สุดกับข้อมูลปริมาณมหาศาล? ซึ่งไม่พ้นการที่ต้องเข้าใจเรื่อง Algorithm และ Parallel Processing ดีพอที่จะ Optimize โปรแกรมได้ เช่น Batch บางตัวต้องนำข้อมูลธุรกรรมการเงินจากตลอดทั้งวัน (ประมาณ 20 ล้านรายการต่อวัน) มาคำนวณบางอย่างให้เสร็จภายใน 1 ชั่วโมง ก่อนส่งข้อมูลต่อไปยังระบบอื่น ถ้าทำงานช้า ก็อาจจะทำให้เปิดระบบธนาคารตอนเช้าไม่ทัน

Developers กลุ่มนี้มักจะได้ใช้ Goroutine และ Channel ทำ Parallel Processing ซึ่งเป็นจุดขายของ Go อยู่แล้ว และอาจจะต้องออกแบบ Algorithm บางอย่างเองเพื่อ Optimize การทำงานให้เร็วที่สุด แถมยังต้องคำนึงถึง Exception และ Error Handling เป็นอย่างดี เพราะต้องสามารถ Recovery ได้ทันในเวลาที่กำหนด แม้จะเจอเคสแปลกๆ ที่คาดไม่ถึงเข้ามา

ตัวอย่างสิ่งที่ Developers กลุ่มนี้มักศึกษาและได้ใช้ในงาน เช่น

  • Algorithm & Data Structure
  • Parallelism
  • Text/DB Bulk Processing
  • Error Handling & Auto Recovery
  • Reporting Tools

Common Practices

แม้ว่า 3 กลุ่มตัวอย่างที่ยกมาข้างต้นจะแตกต่างกัน แต่จริงๆ ก็มี Technology & Practice บางส่วนที่เป็น Standard ของ KBTG ที่ทุกทีมต้องประยุกต์ใช้อยู่ด้วย เช่น

  • DevSecOps
  • Unit Test, Code Review & Code Style
  • Observability & Monitoring

ซึ่งภาษา Go สามารถช่วยให้เรื่องพวกนี้ง่ายขึ้น เพราะ Go เองก็มี Built-in Tools หลายตัว อย่าง go Test และ gofmt ที่จัดการบางเรื่องได้เลย ทำให้ไม่ค่อยมีปัญหาเรื่อง Compatibility เวลาใช้ร่วมกับซอฟต์แวร์อื่นๆ เช่น DevSecOps

สรุปงาน Golang กับ KBTG

Golang เป็นภาษาที่ได้รับความนิยมมากขึ้นและมีการใช้ในหลายๆ ระบบของ KBTG เนื่องด้วยจุดเด่นหลายข้อ ไม่ว่าจะเป็นความ Simple ของภาษา, Built-in Tools, Performance และ Parallelism แต่ Golang ก็มีข้อเสียตรงที่ไม่เหมาะกับงานบางอย่าง เช่น งานที่เน้น Integration กับ Legacy หรือ Proprietary System ต่างๆ ของธนาคารเป็นจำนวนมาก

บทความนี้ต้องการสื่อว่างานแต่ละงานมีการใช้จุดแข็งของ Go แตกต่างกัน และต้องอาศัยความรู้เสริมในเรื่องอื่นๆ ที่เกี่ยวข้องกับงานนั้นด้วย ซึ่ง Developers ที่สามารถใช้ความสามารถของภาษาคู่กับความรู้อื่นๆ ได้เหมาะสม จะทำให้สามารถเขียนโปรแกรมที่มีประสิทธิภาพดีที่สุดได้

สุดท้ายนี้ผู้เขียนหวังว่าบทความนี้จะช่วยให้ Golang Developers เห็นภาพมากขึ้นว่า KBTG ใช้ Go กับงานส่วนไหนบ้าง และมีเรื่องอะไรที่ควรรู้บ้างในการพัฒนางานแต่ละส่วน ถ้าสงสัยหรือมีคำถามอะไร สามารถทิ้งคำถามไว้ได้เลย และจะพยายามตอบให้ครับ

ปล. ขอโปรโมทหน่อยว่า KBTG มี Golang Guild ที่เป็นเหมือนชมรมรวมคนที่สนใจ Go มาแบ่งปันความรู้ แลกเปลี่ยนประสบการณ์ และช่วยเหลือระหว่างทีมที่ใช้ Go ด้วยกัน ดังนั้นถ้าใครสนใจมาเป็น Golang Developer ใน KBTG ไม่เหงาแน่นอน เพราะเรามีคนที่เจออะไรคล้ายๆ กันพร้อมช่วยแก้ปัญหาอย่างเต็มที่

ตัวอย่างที่ Golang Guild แชร์เรื่อง Observability ในงาน KBTG Inspire

สำหรับ Golang Developers คนไหนที่สนใจอยากมาร่วมทำงาน Go ด้วยกันที่ KBTG ตอนนี้เรายังเปิดรับอีกจำนวนมาก สามารถส่งใบสมัครมาได้ที่ www.kbtg.tech

--

--

Jirat Srisawat
KBTG Life

Software Engineer / DevX whose responsibility is to increase the company's software engineers' productivity