Screen Shot 2558-10-27 at 9.22.42 AM
จากบทความเรื่อง The Stack That Helped Medium Drive 2.6 Millennia of Reading Time
เขียนโดยหัวหน้าทีมพัฒนาของ Medium.com
อธิบายการพัฒนาระบบได้อย่างน่าสนใจ
ทั้งเรื่องของทีม
ทั้งเรื่องของ architecture ของระบบ
ทั้งเรื่องของเครื่องมือที่นำมาใช้
ทั้งเรื่องขั้นตอนการพัฒนา

ดังนั้นจึงนำมาแปล และ สรุปตามความเข้าใจของตัวเอง
เริ่มกันเลยดีกว่า

สถิติที่น่าสนใจของ Meduim

ในแต่ละเดือนมีผู้เข้ามาอ่านเรื่องราวต่าง ๆ กว่า 20 ล้าน Unique IP
ในแต่ละสัปดาห์มีการเขียนเรื่องราวใหม่ ๆ กว่า 10,000 เรื่องราว

เรื่องของจำนวนผู้เข้ามาอ่าน หรือ page view
มันไม่ใช่สิ่งที่ทีมใช้วัดความสำเร็จ
แต่สิ่งที่สนใจ คือ คุณภาพของเรื่องราวต่าง ๆ ที่เกิดขึ้นในระบบต่างหาก

ว่าด้วยเรื่องของทีม

แต่ละคนในทีมมีความคิดในแนวทางเดียวกัน คือ
มาร่วมทำงานกันเพื่อ สร้างงานที่แจ่มสุด ๆ ออกมา
โดยทีมเป็นแบบ Cross-functional team และ Mission-Driven team

ทีมมีความยืดหยุ่นมาก ๆ
ทุกคน ทุกทีม จะมีเป้าหมายร่วมกัน
เนื่องจากบริษัทเอง จะมีการกำหนดเป้าหมายในแต่ละ quarter

เครื่องมือหลัก ๆ ที่ทีมพัฒนาใช้งาน

ประกอบไปด้วย

  • Github สำหรับการจัดการ source code, code review และ bug tracking
  • Google App สำหรับการใช้งาน email และจัดการเอกสารต่าง ๆ
  • Slack และ Slack bot สำหรับการติดต่อสื่อสาร และ ทำงานร่วมกัน
  • Trello ใช้สำหรับบางทีมเท่านั้น

Architecture ของระบบ

ทั้งระบบนั้นจะอยู่บน Amazon’s Virtual Private Cloud (VPC)
ใช้ Ansible สำหรับจัดการ infrastructure ของระบบงาน
โครงสร้างของระบบออกแบบตามแนวคิด SOA
ซึ่งมี service จำนวนมากมายที่แยกกันทำงานอย่างชัดเจน
ทำให้ง่ายต่อการ deploy service อย่างมาก

ส่วนการทำงานหลักของระบบ

ทั้ง Frontend และ Backend พัฒนาด้วย Node.js
มีบาง service จะพัฒนาด้วยภาษา Go เช่น การจัดการรูป และ caching data เป็นต้น

ส่วนของ database ใช้ DynamoDB
แต่กำลังเริ่มใช้งาน Amazon Aurora เพื่อมาทดแทน DynamoDB
เนื่องจากการดึงข้อมูล และ กรองข้อมูลมันยืดหยุ่นกว่านั่นเอง

ประกอบไปด้วย 3 ส่วนหลักตามผู้ใช้งาน ดังนี้

  1. Web frontend
  2. iOS app
  3. Android app

1. Web frontend

ใช้ Closure เป็น Single Page Application framework
โดยใช้เป็น template ในการ render ทั้ง client และ server
แถมยังมี compiler สำหรับการ minify code ลง
และแยกออกเป็น module ได้ง่าย
รวมทั้งยังทดสอบได้ง่ายอีกด้วย

2. iOS app

เป็นการพัฒนาแบบ native แต่ก็มี web view บ้างเล็กน้อย
การทดสอบจะใช้ XCTest และ OCMock

สิ่งที่น่าสนใจ คือ
แต่ละการเปลี่ยนแปลงของ code
จะถูกทำการทดสอบ และ review code อย่างรวดเร็ว (Small and Fast)
ถึงแม้ว่า จะเปลี่ยนแปลงเพียงเล็กน้อยก็ตาม
เนื่องจากการ deploy ที่ App Store มันมีรอบการ review และ approve นาน
ดังนั้นจึงต้องทำการ update เล็ก ๆ บ่อย ๆ
เพื่อให้เร็วที่สุดนั่นเอง

3. Android app

การพัฒนาก็ใช้ Android SDK และ support library ปกตินี่แหละ
การทดสอบจะใช้ Mockito และ Robolectric

ซึ่งเขียนทั้ง high-level test สำหรับการทดสอบพวก Activity
โดยจะเริ่มด้วยการเขียนแบบง่าย ๆ
เพื่อทำให้ง่าย และ ปลอดภัยต่อการเปลี่ยนแปลง และ refactoring code
จะเขียนการทดสอบเพิ่มเรื่อย ๆ ตาม bug ที่เกิดขึ้นมาด้วย
ทำให้ได้ชุดของ regression test ที่มีคุณค่า
เพื่อป้องกันข้อผิดพลาดต่าง ๆ

และ low-level test สำหรับทดสอบ class ต่าง ๆ หรือ unit test นั่นเอง
ทำให้เรารู้ว่า แต่ละ class นั้นใช้งานอย่างไร
และทำงานตามที่เราคาดหวังหรือไม่

สิ่งที่น่าสนใจ คือ
ทุก ๆ การเปลี่ยนแปลงของ code
จะถูก build และ package ไฟล์ APK
เพื่อทำการ deploy ไปยัง Play Store เสมออยู่ในส่วนของ Alpha นะ

ทุก ๆ วันศุกร์ทำการ promote จาก Alpha ไปเป็น Beta
เพื่อให้กลุ่มคนที่ทดสอบในช่วงวันหยุด

เมื่อกลับมาในวันจันทร์ และ ผลการทดสอบใช้งานมันแจ่ม
ก็จะทำการ promote ไปยัง Production ต่อไป
นั่นหมายความว่า มีการ deploy และ release บ่อยมาก ๆ

มาดูขั้นตอนการ Build, Test และ Deploy กันหน่อยสิ

แน่นอนว่า สิ่งที่ Medium ขาดไม่ได้เลย คือ
ระบบ Continuous Integration (CI)
ระบบ Continuous Delivery (CD)
โดยระบบทั้งหมดจะใช้ Jenkins นั่นเอง

ระบบการ build ในปัจจุบันจะใช้ Pants
ส่วนระบบก่อนหน้าจะใช้ Make

การทดสอบนั้น มีทั้ง Unit testing และ Functional testing
โดยทุก ๆ การเปลี่ยนแปลงต้องถูกทดสอบเสมอ
ถ้าการทดสอบผ่านทั้งหมด จึงจะทำการ merge code

ส่วนการทดสอบจะทดสอบแบบ Distribute test ด้วย Cluster Runner
ซึ่งทำให้เวลาในการทดสอบน้อยลงไปอย่างมาก

เมื่อทุกอย่างเรียบร้อย
จะทำการ deploy ไปยัง staging server
ซึ่งใช้เวลาประมาณ 15 นาที

เมื่อระบบพร้อม และทำการทดสอบผ่าน
ทำการ deploy ไปยัง production server
โดยปกติทำการ deploy 5 ครั้งต่อวัน
แต่บางครั้งอาจจะถึง 10 ครั้ง

เพิ่มเติมสำหรับการ deploy บน production server
จะใช้วิธีที่เรียกว่า Blue/Green deployment

blue_green_deployments

สิ่งที่ทีมพัฒนาต้องทำต่อไป มีอะไรบ้าง ?

มี feature จำนวนมากที่ต้องทำการปรับปรุง
เพื่อทำให้การอ่านง่าย และ ดีขึ้น
เพื่อทำให้การเขียนง่าย และ ดีขึ้น

ทุก feature ที่สร้างขึ้นมานั้น
จะต้องทำให้เกิดข้อมูลที่มีค่า และ คุณภาพเสมอ

สุดท้ายแล้ว
ทีมพัฒนาของ Medium กำลังต้องการ
คนที่มีความรู้ความสามารถเกี่ยวกับ Data Science อย่างมากด้วยนะ