ช่วงที่ผ่านมามีโอกาสได้ไปร่วมทีมทำแอป ฯ เพื่อช่วยคนไทยต่อสู้กับ COVID-19 นามว่า หมอชนะ มา เพิ่งเปิดตัวไปหมด ๆ วันศุกร์ที่ 10 เมษายน ซึ่งแนวทางแอป ฯ น่าสนใจมากและน่าจะช่วยสู้กับการระบาดของ COVID-19 ได้จริง ๆ
แต่เนื่องจากแอป ฯ ตัวนี้มีการเก็บข้อมูลที่ Sensitive หลายอย่าง ในฐานะที่เป็นหนึ่งในทีมพัฒนา(ที่ไปร่วมแค่ไม่ถึง 1% ของโค้ดทั้งหมด) ก็เลยไปสัมภาษณ์และขอข้อมูลทาง Technical มาจากทีมเพราะอยากจะมาเขียนอธิบายตั้งแต่ตอนก่อน Launch เลยว่าแอป ฯ ทำอะไร เพื่อให้ตอน Launch จริงทุกอย่างจะได้เป็นไปอย่างราบรื่น โดยเรายิงคำถามที่คิดว่าหลาย ๆ คนคงมีอยู่ในใจแล้วเอามาตอบให้หมดในบล็อกนี้ น่าจะเป็นประโยชน์ต่อการตัดสินใจติดตั้งและใช้งานครับ
อ้อ โค้ดชุดนี้จะ Open Source ด้วยนะเพื่อความโปร่งใสของตัวงาน เพราะทีมพัฒนา CodeForPublic ไม่ได้หวังกำไรอะไรจากสิ่งที่ทำมาทั้งสิ้น ต้องการแค่ให้ช่วยคนไทยเท่านั้น
ทั้งนี้ จุดประสงค์ของบล็อกนี้คือ "การให้ข้อมูล" ล้วน ๆ ด้วยความเป็นกลาง อะไรชัดเจนก็จะบอกให้ชัดเจน อะไรไม่เคลียร์ก็จะบอกเช่นกันว่าไม่เคลียร์ นาทีนี้ความโปร่งใสสำคัญสุดครับ
อ่ะ เริ่มเลยนะ
แนวคิดของแอป ฯ หมอชนะ: "เพราะโรคติดต่อเกิดจากการติดต่อกัน"
การติดต่อของโรคระบาดเกิดจากการเข้าใกล้กันของคน ความเสี่ยงของการติดโรคจะอยู่ที่ว่าเราเข้าใกล้ผู้ป่วยมากแค่ไหน ซึ่งถ้ารู้ว่าแต่ละวันเราเดินผ่านใครบ้าง ไปที่ไหนมาบ้าง เราก็จะพอประเมินความเสี่ยงของตัวเองได้ เช่นเดียวกัน ถ้ามองในสเกลที่ใหญ่ขึ้น ถ้ามีคนเป็นแสนเป็นล้านคนมีข้อมูลตรงนี้แล้วรวมเอาไว้ที่เดียวหละจะทำอะไรกับมันได้บ้าง ? คำตอบคือ
เราจะสามารถประเมินความเสี่ยงของแต่ละคน ติดต่อและกักกันได้อย่างทันท่วงที การควบคุมโรคจะมีประสิทธิภาพมากเลยหละ
แต่ชีวิตจริงการจะให้ทุกคนไล่จดว่าเราไปไหนมาบ้างก็คงเป็นไปไม่ได้ หรือยิ่งถ้าให้จำว่าเดินผ่านใครบ้างนี่เป็นไปไม่ได้เลย จึงเป็นที่มาของแอป ฯ หมอชนะ ที่จะ
ช่วยจดจำพิกัดการเดินทางของเราตลอดทั้งวัน รวมถึงคอยสแกนหาคนที่เราเข้าใกล้แล้วบันทึกไว้โดยอัตโนมัติ จากนั้นก็จะทยอยอัปโหลดข้อมูลขึ้นไปยัง Server เพื่อคอยวิเคราะห์ว่าเรามีโอกาสเข้าใกล้บุคคลที่ติดเชื้อหรือเข้าใกล้สถานที่ที่มีความเสี่ยงหรือไม่ในช่วงที่ผ่านมา
และเมื่อระบบตรวจเจอว่าเรามีความเสี่ยง ทางแพทย์จะแจ้งเตือนมาทางเราว่า เฮ้ย มีโอกาสเสี่ยงนะ เพื่อให้เราสามารถปฏิบัติตัวได้ถูกต่อไป
นี่ก็เป็นแนวคิดคร่าว ๆ ของแอป ฯ หมอชนะ ที่ทีมพัฒนาจัดทำขึ้นมาครับ คราวนี้มาดูฟีเจอร์ที่ละเอียดขึ้นกันหน่อยว่าแอป ฯ จริง ๆ แล้วทำอะไรบ้าง
ฟีเจอร์ของแอป ฯ หมอชนะ
ตามที่บอกเบื้องต้นเลย หลัก ๆ แอป ฯ จะทำการเก็บข้อมูลสองอย่างอยู่ตลอดเวลา
1) ตำแหน่งของโทรศัพท์มือถือจาก GPS
2) บันทึกการเข้าใกล้มือถือเครื่องอื่นที่ลงแอป ฯ ไว้เหมือนกันผ่าน Bluetooth Low Energy
และข้อมูลก็จะถูกอัปโหลดขึ้นไปยัง Server ที่มีระบบวิเคราะห์การเข้าใกล้กันของแต่ละบุคคล (Cross Path Analysis) โดยระบบนี้จะดูแลโดยสาธารณสุข หากมีใครติดเชื้อก็จะสามารถป้อนข้อมูลเข้าไปได้ และระบบจะคอยวิเคราะห์และติดตามให้ว่าใครบ้างที่เคยเข้าใกล้คนนั้น ๆ หรือเป็นกลุ่มเสี่ยงนั่นเอง
การใช้งานเป็นแบบไม่สามารถระบุตัวตนได้
ก็จะเห็นว่าข้อมูลข้างต้นทั้งตำแหน่งของโทรศัพท์มือถือและการเข้าใกล้ใครนั้นถือเป็นข้อมูลที่ Sensitive มาก มีความเป็นส่วนตัวสูง และอาจถูกนำไปใช้ในทางไม่ดีได้ ทางทีมพัฒนาก็ออกแบบโดยมีความกังวลตรงนี้เป็นแกนกลาง ทำให้ระบบจึงถูกออกแบบมาให้
"เป็นการใช้งานแบบไม่สามารถระบุตัวตนได้"
มือถือทุกเครื่องจะถูกแทนตัวด้วยรหัสที่ระบบสร้างขึ้นมาแบบสุ่มและเริ่มใช้งานได้ทันที ซึ่งรหัสดังกล่าวนี้จะไม่มีความข้องเกี่ยวกับตัวตนบุคคลหรืออุปกรณ์ใด ๆ เลยทั้งสิ้น เรียกว่าถึงจะได้รหัสผู้ใช้ไปก็ไม่สามารถบอกได้ว่าคน ๆ นี้เป็นใคร
ดังนั้นข้อมูลที่ถูกอัปโหลดขึ้นไปก็จะเห็นเป็นเส้นทางการเดินทางของรหัสผู้ใช้นั้น ๆ รวมถึงว่าผู้ใช้นั้นเข้าใกล้ใครมาบ้างในช่วงที่ผ่านมา แต่ก็จะไม่สามารถบอกได้เลยว่าเค้าเป็นใครครับ
ข้อมูลที่ถูกเก็บและส่งขึ้น Server
ข้อมูลที่ถูกเก็บและส่งขึ้น Server จะถูกแบ่งเป็นสองส่วน คือ ส่วนที่ผู้ใช้ป้อนเข้าไป กับ ส่วนที่เครื่องคอยเก็บให้ตลอดเวลา
ส่วนที่ผู้ใช้ป้อนเข้าไป
แอป ฯ จะมีส่วนให้ผู้ใช้กรอกแบบสอบถามเพื่อคำนวณความเสี่ยงจากพฤติกรรม เช่น ไปต่างประเทศมาหรือเปล่า มีไข้หรือไม่ ฯลฯ ข้อมูลเหล่านี้จะถูกอัปโหลดขึ้น Server เมื่อผู้ใช้กรอกเข้าไป
ส่วนที่เครื่องคอยเก็บให้ตลอดเวลา
ข้อมูลพิกัดของเครื่อง (GPS) และรหัสผู้ใช้ของเครื่องอื่นที่เราเข้าใกล้ จะถูกเก็บตลอดเวลาและถูกทยอยอัปโหลดขึ้น Server เป็นระยะ ๆ ครับ
โดยย้ำอีกทีว่าข้อมูลที่ถูกเก็บข้างต้นนี้จะอัปโหลดขึ้นไปโดยผูกกับรหัสผู้ใช้ที่ไม่สามารถระบุตัวตนได้
สิ่งที่อยากโน้ตไว้นิดนึงคือ แอป ฯ จะมีการให้ถ่ายรูปตัวเองไว้ด้วย แต่รูปดังกล่าวจะไม่ถูกอัปโหลดขึ้น Server แต่อย่างใดครับ เผื่อมีคนมีความกังวล
ข้อมูลอยู่บน AWS ของภาครัฐ
ความโปร่งใสและจะต้องไม่มีใครเอาไปใช้ในทางที่ผิดเป็นสิ่งที่ทีมพัฒนาคิดอยู่ตลอด ดังนั้นทีมจึงจะไม่ปิดอะไร ทุกอย่างต้องชัดเจน และคำถามว่าข้อมูลเก็บไว้ที่ไหนก็เช่นกัน ทีมพัฒนาแจ้งไว้อย่างชัดเจนว่า
อยู่บน AWS ในแอคเค้าท์ของภาครัฐครับ
แน่นอนว่าข้อมูลส่วนตัวที่ Sensitive มากอย่างนี้อยู่ในพื้นที่ของภาครัฐก็จะเป็นข้อกังวลหลักของประชาชนอย่างหลีกเลี่ยงไม่ได้ ทีมพัฒนาจึงออกแบบระบบอย่างรัดกุมเพื่อไม่ให้เกิดปัญหาใด ๆ ครับ ซึ่งอันนี้ไม่ใช่เป็นเรื่องของประเทศใดประเทศหนึ่ง แต่ทุกประเทศก็จะทำแบบนี้เป็นมาตรฐานอยู่แล้ว เดี๋ยวมีตัวอย่างเล่าให้ฟังด้านล่างด้วยว่ามีประเทศไหนที่ทำแบบนี้แล้วบ้าง
ข้อมูลทั้งหมดจะถูกทำลายทิ้งเมื่อสถานการณ์คลี่คลาย
หนึ่งในข้อตกลงที่ทีมพัฒนาทำไว้ร่วมกับเจ้าของโครงการคือ เมื่อสถานการณ์คลี่คลายลง ข้อมูลทั้งหมดถูกทำการเคลียร์ทิ้งทั้งหมดเพื่อไม่ให้เกิดปัญหาขึ้นในอนาคตครับ
ระบบเตรียมหยุดบันทึกตำแหน่งด้วย Kill Switch
เมื่อสถานการณ์คลี่คลายลงคงจะมีคนจำนวนหนึ่งที่ลืมลบแอป ฯ ทิ้งหรือลืมปิดระบบบันทึกตำแหน่ง ซึ่งตรงนี้ระบบจะมีKill Switch ที่จะสั่งปิดจากฝั่ง Server ไว้ให้ด้วย
วิธีการติดต่อผู้ใช้ถ้าพบความเสี่ยง
เนื่องจากการใช้งานเป็นแบบไม่สามารถระบุตัวตนได้ ทางผู้ดูแลระบบจึงไม่สามารถติดต่อไปยังผู้ใช้ได้ วิธีที่แอป ฯ ทำคือ
1) จะส่ง Push Notification ไปบอก
2) ในแอป ฯ จะขึ้นสถานะว่ามีความเสี่ยง
ซึ่งเมื่อพบว่าเรามีความเสี่ยง เราก็จะสามารถกักตัวเองดูสถานการณ์ได้ หากมีอาการก็สามารถไปหาหมอพร้อมประวัติในมือได้อย่างง่ายดาย
ตรงนี้ยังพยายามปรับปรุงให้ประสบการณ์การใช้งานดีที่สุดอยู่ครับ อาจจะมีอัปเดตในภายหลังให้ติดต่อได้ง่ายขึ้นแต่ยังคงคำนึงถึง Privacy อยู่
ใช้ BLE ไม่เปลืองแบต โปรโตคอลไม่มีการเชื่อมต่อหรือส่งข้อมูลกัน
ในส่วนของการค้นหาเครื่องที่อยู่รอบ ๆ เพื่อดูว่าเราเข้าใกล้ใคร จะใช้เทคโนโลยี Bluetooth Low Energy ซึ่งเป็นเทคโนโลยีที่ประหยัดพลังงานมาก สามารถทำงานได้ทั้งวันโดยแบตเตอรี่ลดเพียง 2-3% เท่านั้น
ทั้งนี้ เทคนิคที่ใช้จะไม่มีการเชื่อมต่อทางบลูทูธเกิดขึ้น แต่จะเป็นการเปิด Bluetooth Service พร้อมพ่วงรหัสผู้ใช้เข้าไปด้วย ทำให้เครื่องอื่นสามารถรู้รหัสผู้ใช้ตั้งแต่ขั้นตอนการค้นหาเลย ไม่จำเป็นต้องมีการเชื่อมต่อใด ๆ ไม่ต้องกังวลว่าจะมีการส่งข้อมูลหากัน ทำแค่ค้นหาแล้วก็จบงานครับ
อย่างไรก็ตาม ถึงเทคนิคนี้จะประหยัดพลังงาน แต่ถ้าเป็นเครื่องเก่าหน่อย ฮาร์ดแวร์ก็อาจจะทำมากินแบตเตอรี่ได้ ในกรณีนั้นเราก็สามารถปิดฟังก์ชั่นนี้ไปได้ในแอป ฯ ไปได้ครับ
และก็อาจจะมีมือถือบางรุ่นใช้งานฟังก์ชันนี้ไม่ได้ เพราะขึ้นอยู่กับฮาร์ดแวร์ครับ
สำหรับโค้ด ตอนนี้ Open Source แล้วที่ https://github.com/codeforpublic/contact-tracer ครับ ไปเช็คดูได้ว่าทำงานยังไงเพื่อยืนยันว่าไม่มีการเชื่อมต่อและส่งข้อมูลหากันแน่นอน
แอนดรอยด์ฟังก์ชันเต็มที่ ส่วน iOS ต้องเปิดแอป ฯ ทิ้งไว้
โปรแกรมถูกเขียนมาโดยดึงความสามารถทุกอย่างของมือถือออกมาอย่างเต็มที่ แต่ข้อจำกัดทางระบบปฏิบัติการก็ยังคงมีอยู่ โดยแอนดรอยด์ที่ระบบออกแบบมาเปิดกว้างกว่าจะสามารถใช้งานได้อย่างเต็มฟังก์ชัน ระบบจะสามารถเก็บพิกัดและสแกนหาเครื่องอื่น ๆ ได้ตลอด 24 ชั่วโมง หากปิดเครื่องเปิดใหม่ระบบก็จะเริ่มทำงานเองโดยอัตโนมัติ (แต่ระบบก็จะมีแจ้งเตือนบน Notification Bar นะว่าทำงานอยู่ ไม่ได้แอบทำงานเงียบ ๆ)
แต่กับ iOS ฟังก์ชั่นการสแกนหาเครื่องรอบ ๆ จะทำงานได้ก็ต่อเมื่อเปิดแอป ฯ ค้างไว้เท่านั้น เป็นข้อจำกัดของระบบปฏิบัติการที่ทำอะไรไม่ได้ครับ อาจจะใช้งานลำบากหน่อยแต่ก็ยังใช้งานได้อยู่
ส่วนการเก็บพิกัดเครื่องจะยังทำได้ทั้งแอนดรอยด์และ iOS ถึงแม้จะไม่ได้เปิดแอป ฯ ไว้ก็ตาม และเพื่อความชัดเจน จะมี Notification ออกมาเตือนเรื่อย ๆ ด้วยว่าแอป ฯ มีการเข้าถึง GPS อยู่นะ ไม่ได้แอบเก็บเงียบ ๆ ครับ
มีประเทศไหนทำอะไรแบบนี้แล้วบ้าง ?
ประเทศไทยไม่ใช่ประเทศแรกที่ทำ เมื่อเดือนก่อนสิงคโปร์ทำแอป ฯ ชื่อว่า TraceTogether ไว้ก่อนหน้าแล้วครับ เทคโนโลยีที่ใช้คือเหมือนกันหมดเลยทั้งเรื่อง BLE ที่ใช้ในการสแกนหาเครื่องรอบตัว รวมถึงรหัสผู้ใช้แบบสุ่มที่ไม่สามารถระบุตัวตนได้ก็มีทำไว้บน TraceTogether เช่นกัน
TraceTogether มีข่าวว่าจะ Open Source เร็ว ๆ นี้ แต่ไม่ทันใจ ไทยเราเลยพัฒนาใหม่เองเลย ฮ่า ๆ
เทคโนโลยีที่ใช้พัฒนา
หลัก ๆ มีอยู่สองฝั่งคือ ฝั่ง Mobile App และฝั่ง Server
ฝั่ง Mobile App
แอป ฯ บนมือถือพัฒนาโดยใช้ React Native เป็นแกนหลัก และมีการทำ Native Bridge บ้างในส่วนที่จำเป็นครับ
ซึ่งพอเป็น React Native ก็แน่นอนว่าโค้ดจะสามารถ Unminify ออกมาดูได้ ดังนั้นโค้ดจึงไม่มีข้อมูลสำคัญอะไรเก็บไว้เลย อันนี้คิดไว้เรียบร้อยดีครับ
ฝั่ง Server
ส่วนฝั่ง Server ก็ใช้ Node.js ทำงานบน AWS Lambda เพื่อรับโหลดได้แบบสเกลอัตโนมัติ ทางด้าน Database ก็ใช้ DynamoDB ของ AWS ครับ
ด้วย Infra ที่ใช้เป็นของ AWS โดยตรง ทำให้สบายใจเรื่องโดนแฮค Server ไปได้ระดับใหญ่ ๆ เลย
API ไม่มีการดึงข้อมูลออกมาได้
API ที่ทำไว้จะเป็นการเก็บข้อมูลขึ้นไปยังบน Server เท่านั้น ไม่สามารถดึงข้อมูลที่เก็บไปลงมาจาก Server ผ่าน API ได้ ดังนั้นจึงไม่ต้องกลัวข้อมูลที่เก็บไปจะหลุดครับ
เป็นเรื่องทาง Security ที่อยากให้ข้อมูลไว้ครับ
ทีมพัฒนา
โค้ดทั้งระบบถูกพัฒนาโดยทีม CodeForPublic ซึ่งเป็นการรวมตัวกันเฉพาะกิจของนักพัฒนาที่คนในวงการคุ้นเคยหลายคนนำทีมโดย Cleverse ซึ่งมีผลงานออกมาเยอะมากในช่วงที่ผ่านมา ตอนนี้โค้ดโมดูลต่าง ๆ อยู่บน GitHub Repo เรียบร้อย ส่วนตัว Server และแอป ฯ จะตามมาเร็ว ๆ นี้ครับ
ส่งมอบไปยังทีมต่อไป
ทีม CodeForPublic เขียน Open Source ออกมาครบทั้งระบบแบบ End-to-End ตอนนี้ระบบพร้อมใช้งานแล้ว แต่สิ่งที่อยากจะแสดงความชัดเจนไว้ตรงนี้เลยคือ
หลังจากนี้จะส่งมอบให้ทีมอื่นดูแลรับผิดชอบต่อ
ทาง CodeForPublic จะไม่ได้ Maintenance โค้ดและระบบต่อครับ อยากให้เข้าใจโครงสร้างชัดเจนว่าทีม CodeForPublic ตั้งใจทำเพื่อประโยชน์ของคนไทยจริง ๆ จึงรีบทำออกมาให้เสร็จก่อนจะช้าเกินไป แต่คนที่ Execute จริงจะไม่ใช่ทีมพัฒนาและไม่ได้เกี่ยวข้องอะไรด้วยเลย
แต่ทีมพัฒนาก็พยายามหาวิธีเปิดทุกอย่างให้โปร่งใสที่สุด เช่น ถ้ามีการเข้าถึงข้อมูลจะต้องมี Log แสดงให้ประชาชนดูแบบ Public ได้ว่าใครเข้าถึงตอนไหนด้วยสาเหตุอะไร อันนี้ถ้ามีข้อมูลเพิ่มเติมจะอัปเดตให้ฟังครับ ถ้าทำได้นี่ถือเป็นมาตรฐานใหม่ที่วางไว้เลยนะ
แต่โดยพฤตินัยแล้วคาดว่าแอป ฯ คงจะไม่มีการอัปเดตอะไรมากมายเพราะทีมที่รับต่อไปจะเป็นทีมใช้งาน (Execution) มากกว่าทีมนักพัฒนาครับ
สรุปแล้ว อยากให้ชัดเจนตรงนี้ว่า ระบบที่ทีมออกแบบมามีความซีเรียสเรื่อง Privacy มากตั้งแต่วันแรกจนวัน Deliver แต่ก็อยากให้ชัดเจนตรงนี้เช่นกันว่าเราไม่สามารถรับประกันว่าหลังจากส่งมอบทุกอย่างจะยังคงเป็นแบบที่วางไว้หรือไม่ เพราะอยู่นอกเหนือความรับผิดชอบของทีม CodeForPublic แล้ว แต่ด้วยตัวระบบที่ออกแบบมาให้ระบุตัวตนไม่ได้ตั้งแต่แรก ก็คงไม่มีปัญหาอะไรหลัง Deliver เสร็จแล้วครับ
มี Concern อะไรยิงมาบอกได้
แอป ฯ ออกแบบมาตั้งใจช่วยคนไทยสู้กับ COVID-19 จริง ๆ แต่ Privacy ก็สำคัญมาก ถ้ามีใครมี Concern อะไรสามารถบอกมาได้ตลอดครับ คอมเม้นต์ในบล็อกนี้ก็ได้ จะมีทีมงานเข้ามาเช็ค ถ้าเป็นช่องที่อันตราย ทางทีมพัฒนาจะเพิ่มและหาวิธีอุดเพิ่มให้ได้ครับ
อย่างที่บอก จุดประสงค์แอป ฯ นี้ดี แต่ก็ต้องมั่นใจว่าไม่สร้างปัญหาอื่นด้วย ทุกคนพร้อมแก้ไขให้โปร่งใสและปลอดภัยขึ้นครับ =)
ขอบคุณ
โปรเจคนี้มีหลายภาคส่วนมากที่เกี่ยวข้อง ทีมพัฒนาเลยฝากขอบคุณส่วนต่าง ๆ มา ณ ที่นี้เลยคือ
- คุณ ฉัตรชัย คุณปิติลักษณ์ DEPA ในส่วนของคำแนะนำเรื่องโปรเจค และประสานงานเพื่อขอ AWS มาใช้งาน
- AWS สำหรับการให้เครดิตมาใช้ฟรีในโปรเจคนี้
- DGA ที่ดูแลข้อมูลแอคเค้าท์ AWS
- CodeForPublic นำโดย Cleverse สำหรับการทำโค้ดชุดนี้มาจน Delivered ได้และปล่อย Open Source ด้วย
บล็อกนี้ปล่อยก่อนเปิดตัวจริง 1 วันเพื่อให้คนทำความเข้าใจก่อน ก็หวังว่าจะมีประโยชน์ครับ พรุ่งนี้ตอนแอป ฯ เปิดตัวแล้วจะมาเปลี่ยนชื่อในบล็อกเป็นชื่อแอป ฯ จริงอีกทีนึง
สิ่งที่หวังตอนนี้คืออยากให้สถานการณ์ดีขึ้นโดยเร็วและการควบคุมโรคเป็นไปอย่างมีประสิทธิภาพ ก็หวังว่างานที่ทีม CodeForPublic contribute ไปจะสร้างประโยชน์และไม่มีใครเอาไปใช้ในทางที่ผิดครับ
รักษาสุขภาพกันครับทุกคน