จากบทความเรื่อง 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 ส่วนหลักตามผู้ใช้งาน ดังนี้
- Web frontend
- iOS app
- 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
สิ่งที่ทีมพัฒนาต้องทำต่อไป มีอะไรบ้าง ?
มี feature จำนวนมากที่ต้องทำการปรับปรุง
เพื่อทำให้การอ่านง่าย และ ดีขึ้น
เพื่อทำให้การเขียนง่าย และ ดีขึ้น
ทุก feature ที่สร้างขึ้นมานั้น
จะต้องทำให้เกิดข้อมูลที่มีค่า และ คุณภาพเสมอ
สุดท้ายแล้ว
ทีมพัฒนาของ Medium กำลังต้องการ
คนที่มีความรู้ความสามารถเกี่ยวกับ Data Science อย่างมากด้วยนะ