เผลอแป๊บเดียวก็เข้าทำงานที่ REALITY ได้ 1 ปี 9 เดือนแล้ว วันนี้มีเวลาทบทวน ก็ขอแชร์บันทึกว่าทำอะไรมาหน่อยละกัน จะได้อิมเมจงานของ iOS Software Engineer ที่นี่ออก (แล้วถ้าเปิดรับสมัครก็มาสมัครกันเยอะๆ นะ หาเพื่อน 😁)
แนะนำแอป REALITY
REALITY เป็นแอป Live Streaming ที่ผู้ไลฟ์สามารถสร้างอวาตาร์ 3D สไตล์ญี่ปุ่นมาไลฟ์โดยไม่ต้องเปิดเผยหน้าตัวเอง เหมือนอย่างที่ VTuber ไลฟ์กันนั่นเอง ขอแค่มีสมาร์ทโฟนเครื่องเดียวก็พอ ไม่ต้องมีอุปกรณ์แคปเจอร์อื่นๆ รายละเอียดอ่านได้ที่บทความก่อนหน้าครับ: แนะนำบริษัท REALITY - Anime Avatar Live Streaming Platform (VTuber)
อธิบายโครงสร้างแอป REALITY
ก่อนอื่นต้องอธิบายโครงสร้างแอปก่อน แอป REALITY เป็นแอป Native ที่ใช้ Unity as a Library (UaaL) มาแสดงผล 3D ตัวอย่างเช่นการแต่งอวาตาร์ กาชา ไลฟ์สตรีม ระบบแต่งห้อง วิดีโอแชท พวกนี้ใช้ Unity สร้าง แต่ส่วนอื่นที่เป็น 2D และ Voice จะเป็น Native App ทั้งหมด ทำให้ที่จริงแล้วในแอปนี้มีแอป 2 แอปที่ไม่เกี่ยวข้องกันอยู่ข้างใน (สื่อสารกันด้วย Interface คล้ายๆ Web API น่ะแหละ)
เวลา Assign task ก็จะดูว่างานนั้นเข้าไปแก้ส่วนที่เป็น In-Game หรือ Out-Game ถ้า In-Game ใช้ Unity เป็นงานของ Unity Engineer ส่วน Out-Game ใช้ Native App เป็นงานของ iOS & Android Engineer
ที่ยุ่งยากและปวดหัวสุดคือหน้าจอไลฟ์ ฝั่งคนไลฟ์กับฝั่งคนดูสร้างคนละแบบ ฝั่งคนไลฟ์คือ Unity ทั้งหมด รวมทั้ง UI ปุ่ม & คอมเมนต์ ส่วนฝั่งคนดู ภาพ 3D เป็น Unity แต่ UI เป็น Native ทำให้เวลาแก้ UI หน้าจอนี้ ต้องเรียกทั้ง Unity & Native Engineer มาแก้
อนึ่ง เหตุผลที่ฟอนต์ภาษาไทยฝั่งคนไลฟ์เล็กๆ อ่านยาก ก็เพราะ Unity แสดงผลภาษาไทยด้วยฟอนต์มาตรฐานไม่ได้ ต้องใส่ฟอนต์เข้าไปให้นั่นเอง ฝั่ง Native จะไม่เจอปัญหาตรงนี้ (การสร้าง UI ให้เหมือน Native เป็นเรื่องที่ยากมากๆ สำหรับแอปที่สร้างด้วย Unity)
Job Description
เราเข้าทำงานในตำแหน่ง iOS Software Engineer งานหลักก็คือเขียนใช้ Xcode เขียนแอป REALITY บน iOS ด้วยภาษา Swift
ในตำแหน่ง iOS Engineer เราทำงานฝั่ง Out-Game เป็นหลัก แต่ด้วยความที่เป็นตัวเองเป็นสาย Generalist ทำอะไรนู่นนี่ได้เยอะ เคยเขียนเกม Unity มา เข้าไปแก้ฝั่ง In-Game ได้นิดหน่อย เป็นคนต่างชาติที่รู้ภาษาเยอะ อยากแก้ Localization ก็เลยแตกสายไปทำงานอื่นๆ ถ้าให้เล่าหน้าที่ที่ทำจริงทั้งหมด ก็คงแยกย่อยได้ตามนี้
- iOS Software Engineer - เขียนแอป iOS ทุกส่วน
- Unity Software Engineer - เขียนแอป Unity เฉพาะพวก UI ไม่ได้ยุ่งเรื่อง 3D
- Lead Software Engineer - ประสานงาน กำหนด spec เชื่อมโยงระหว่าง native-server และ unity-native เขียน Test case ฯลฯ ทุกอย่างนอกเหนือจากการเขียนโค้ด
- Product Manager (PdM) - คิด story & requirement ฟีเจอร์ต่างๆ ส่วนใหญ่เป็นฟีเจอร์ด้าน localization
- Localization Manager - ดูแล & ปรับปรุง translation workflow 11 ภาษา รับเรื่องแก้คำแปลผิดที่ user แจ้ง
รู้ว่าตัวเองค่อนข้างเป็นเป็ดแหละ ทำได้เยอะ แต่ไม่สุดซักด้าน ข้อดีคือมีอิสระในการเลือกงานพอสมควร เพราะงานด้าน localization ไม่มีคนอื่นรู้เรื่อง (ทีม Dev เป็นคนญี่ปุ่นเกือบหมด) หาปัญหาเจอก็สร้าง story + implement เองได้เลย มีเวลาว่างระหว่างโปรเจ็กต์ iOS ก็หางานด้านนี้ทำเอา
ส่วนสัญญาจ้าง เป็น 裁量労働制 (discretionary labor system) ทำงานกี่ชั่วโมงก็ได้เงินเดือน + OT คงที่ไม่มีลด เอาจริงไม่เคยทำ OT, ทำงานหนึ่งวันไม่ถึง 8 ชั่วโมงด้วยซ้ำ ขอให้งานเสร็จตามที่ประเมินก็ไม่มีใครว่าอะไรละ
แนะนำโปรเจ็กต์ใหญ่ๆ ที่ทำ
เพื่อให้เห็นภาพงาน ก็ขออธิบายเจาะจงฟีเจอร์ที่ทำเลยละกัน ถ้าไม่ได้เขียนอะไรแปลว่าทำในฐานะ iOS Engineer ทำงานใต้คำสั่ง PdM นะ
Streaming BGM
เริ่มจากฟีเจอร์ที่เข้าใจง่ายและเป็นประโยชน์สุดก่อน BGM นั่นเอง เวลาไลฟ์เงียบๆ ก็สามารถเปิดเพลงประกอบได้ เข้าไปอ่านโค้ดเชื่อม AVAudioNode เสียงเพลงเข้ากับเสียงพูด เทสต์กับไมค์นอก-ไมค์หูฟัง เทสต์เวลาคอลแล็บ สนุกสนานมาก
งานนี้เริ่มจากการทดลอง prototype ในอีเวนต์ hackathon ประจำปีของทีม dev พอเห็นว่าดี ทำได้ไม่ติดปัญหาทางเทคนิค ก็ได้ลงมือทำ เป็นทั้ง PdM, Lead Engineer, Unity Engineer, iOS Engineer ครบทุกอย่าง 555 ปัญหาใหญ่สุดไม่ใช่การเขียนฟีเจอร์ แต่เป็นการเลือกเพลงต่างหาก ต้องหาเพลงจาก source ที่เคลียร์ปัญหาเรื่อง license ก็พึ่งพารุ่นพี่ PdM ให้ช่วย สรุปว่าได้ใช้ Audiostock หาเพลงมาใส่แบบสุ่มๆ ก็หวังว่าอนาคตจะได้สร้าง playlist ที่ดีกว่านี้ ให้สตรีมเมอร์เลือกใช้เพลงให้เหมาะกับสถานการณ์ง่ายขึ้นนะ
ประวัติไลฟ์
ฟีเจอร์เล็กๆ ที่เป็นที่เรียกร้องสุด ย้อนดูสถิติไลฟ์ตัวเองได้ เขียนคำขอบคุณให้กับผู้ชมได้
Mission
ฟีเจอร์ภารกิจ (ที่คนไทยเรียกว่าเควสต์ เลยแปลเป็นเควสต์ให้) ทำเควสต์ที่กำหนดเพื่อรับรางวัล เป็นโปรเจ็กต์ใหญ่โปรเจ็กต์แรก ใช้เวลาราวๆ หนึ่งเดือน ตบตีกับ SwiftUI animation สนุกใช้ได้
Invitation Campaign
ฟีเจอร์แคมเปญเชิญเพื่อนเล่นเพื่อรับเหรียญ (ตอนนี้ปิดอยู่) เพื่อส่งเสริมให้ผู้เล่นใหม่เข้ามาเล่นกันเยอะๆ อันนี้ต้องใช้หลายเครื่องเทสต์ ผูกเบอร์โทรศัพท์ สนุกดี 555
Settings UI Renewal
เขียนหน้า Settings ใหม่หมดจด (รวมถึงหน้าจออื่นๆ ใน navigation ด้วย) ใช้ UI component จาก Design System ที่อีกทีมสร้างไว้ให้ ทำให้ UI คงที่ และลดเวลาแก้ UI ในอนาคตได้เยอะ
External Share
รู้หรือไม่ว่าเราสามารถแชร์รูป/วิดีโอไปยังแชทใน REALITY ได้โดยไม่ต้องเปิดแอปเลย ฟีเจอร์นี้เราเขียนโลจิกข้างหลังเอง ต้องตบตีกับข้อจำกัดของ Share Extension ที่ให้ใช้ Memory ได้แค่ 200MB เวียนหัว 😵💫 (วิธี downsampling)
Pluralization
แอป REALITY สามารถแยกแสดงผล plural/singular (1 item, 2 items) ได้อย่างถูกต้อง อ่านรายละเอียดได้ที่บทความนี้ Pluralization Support in REALITY App
ฟีเจอร์นี้เราเป็น PdM + iOS Engineer ทำงานร่วมกับ Unity, Android, Backend Engineer ให้ทุกแพลตฟอร์มสามารถแสดงผลตามนี้ได้ แล้วก็เขียน manual เวลาแปลให้นักแปลภาษาอังกฤษรู้วิธีลงข้อมูลใน master data ด้วย (REALITY ใช้ Lokalise เป็นเครื่องมือบริหารข้อมูลภาษาทั้ง 12 ภาษา ดีมากๆ ขอบอกต่อ)
โปรเจ็กต์นี้เหนื่อยตรงที่ต้องพยายามไม่ให้ workflow การแปลยุ่งยากขึ้น ส่วนเวลา implement ก็ต้องให้ interface เหมือนเดิม ไม่ต้องกังวลว่าคีย์คำแปลนี้ถ้าไม่ซัพพอร์ต plural ต้องใช้โค้ดนี้ ถ้าซัพพอร์ตต้องใช้โค้ดนี้ ถ้าต้องกังวลคืออนาคตเกิดบั๊กแน่นอน ผลที่ได้คือทุกอย่างเหมือนเดิมเป๊ะทุกแพลตฟอร์ม แค่ป้อนตัวเลขเข้าไป โค้ดด้านหลังก็จะจัดการแยกคำแปลให้เอง เย้
Better Localization Supports
แก้ปัญหายิบย่อยเกี่ยวกับการซัพพอร์ตภาษาแต่ละภูมิภาค เป็น PdM + Engineer ทุกแพลตฟอร์มที่ต้องแก้
- แสดงผลวันเดือนปีตามการตั้งค่าเครื่อง ไม่ใช่ล็อก ปี/เดือน/วัน แบบญี่ปุ่น
-
แสดงผลเวลา 24 ชั่วโมง และ 12 ชั่วโมง
- ใส่จุลภาค (,) ให้กับตัวเลขเหรียญในหน้าจอซื้อเหรียญ
- แสดงผลอันดับ 1st, 2nd, 3rd ในแต่ละภาษาให้ถูกต้องใน Unity
- แสดงผลเลขตัวย่อให้เหมาะสมตามแต่ละภาษา
- ญี่ปุ่น/เกาหลี/จีน ใช้ 10,000 = 1万、100,000,000 = 1億 ส่วนภาษาอื่น 1,000 = 1K, 1,000,000 = 1M
- เพิ่มปุ่มเปลี่ยนภาษาใน Settings Menu ของแอป
- เปลี่ยนฟอนต์ไทยฝั่ง Unity ให้อ่านง่ายขึ้น (ผลงานเพื่อนคนไทยที่เรา refer เข้ามา)
ทุกแพลตฟอร์มมีสูตรสำเร็จในการเขียนโค้ดเพื่อ Localization อยู่แล้ว แก้ไม่ยาก ขอแค่มีคนเจอปัญหาและเสนอว่าจะแก้เท่านั้นแหละ
ปรับปรุงคำแปล UI แอป
โปรเจ็กต์นี้ทำในฐานะ Localization Manager ล้วนๆ เรียก Native speaker ในบริษัทมาช่วยกัน
- เขียน Translation Guideline แบบคร่าวๆ ให้ใช้ระดับภาษาตรงกัน
- เช็คคำแปล, แก้คำแปลในภาษาตัวเอง
- สร้าง Glossary คลังคำศัพท์ให้แปลได้คงที่มากขึ้นในอนาคต
ตอนนี้แก้ภาษาไทย, จีนตัวเต็ม, เกาหลี, สเปน, โปรตุเกส (บราซิล) เสร็จไปแล้ว ถ้ามีคนชาติอื่นเข้ามาก็คงขอดึงตัวมาช่วยแก้ ไม่มีงบจ้างข้างนอกให้ ก็ใช้คนในนี่แหละ ฮ่าๆ
อนึ่ง workflow การเพิ่ม text ของ REALITY เริ่มจากภาษาญี่ปุ่น แล้วให้นักแปลอังกฤษแปลภาษาอังกฤษ จากนั้นก็ใช้ machine translation แปลอีกสิบภาษาที่เหลือ ตอนนี้เอา AI มาช่วยแปล ใช้คำศัพท์จาก Glossary ทำให้แปลรู้เรื่องกว่าไม่ใช้อยู่เยอะ (Stream ไม่ใช่กระแสน้ำอีกต่อไป 555) แต่ยังไงก็สู้คนแปลไม่ได้ ก็พยายามยื่นเรื่องของบ outsource การแปลอยู่นะ แต่ยาก 🥲
ถ้าสนใจรายละเอียด เราได้โอกาสไปเป็น Speaker เล่าเรื่องการปรับปรุง Localization โดยรวมไว้ที่นี่แล้ว ดูคลิป & สไลด์ได้เลย 👉 アプリ「REALITY」の12言語対応プロセスの仕組みと品質向上の取り組み
กราฟแสดงภาษาแอปที่ยูเซอร์ใช้ อังกฤษ&ญี่ปุ่นครึ่งนึง ที่เหลือภาษาอื่น (ไทย 8.4%)
แปลภาษาไทย
อันนี้ตรงตัว นอกจากการแก้คำแปลภาษาไทยในแอปแล้ว ก็มีงานแก้คำอธิบายแอปบน Play Store / App Store แปลคลิปโฆษณาภาษาไทยไปยิงบน social medias บางทีได้เห็น commercial video น่ารักๆ จากฝั่งมาร์เก็ตติ้งก็เยียวยาจิตใจดี 555
โฆษณาบนเฟสบุ๊ก ดึงตัวเพื่อนมาช่วยพากย์เสียงให้😆
หน้าที่ของ Senior Software Engineer
ตำแหน่งเราไม่ได้มีเขียน Title ว่าเป็น Junior หรือ Middle หรือ Senior แต่ส่วนตัวเข้าใจว่าตัวเองทำงานในระดับ Senior Software Engineer อยู่ ถือเป็นระดับสูงของ Individual Contributor ถ้าจะไปต่อก็จะต้องเลือกเป็น Tech Lead ไม่ก็ Manager ทางใดทางหนึ่ง
ในระดับ Senior ก็จะมีความรับผิดชอบตรงนี้เพิ่มเข้ามา ไม่ใช่แค่เขียนฟีเจอร์ให้สำเร็จอย่างเดียว
- เขียนโค้ดที่มีคุณภาพ ไม่สร้างภาระให้คนที่จะมาดูแลต่อ
- เขียน Unit test เสมอ
- ถ้าต้องแก้โค้ดเก่า ก็จะพยายาม refactor ให้ใช้ architecture ใหม่ๆ
- Review โค้ดแบบมองภาพระยะยาว
- เป็น Lead engineer ในโปรเจ็กต์
- ช่วยกันคิด critical path กับ PdM ทำยังไงถึงจะ ship ฟีเจอร์นี้ได้เร็วสุด ง่ายสุด ประหยัดสุด
- ช่วย designer คิด flow ของแอปที่จะลดความซับซ้อนได้มากที่สุด
- กำหนด API interface ร่วมกับฝั่ง server
- เขียน/แก้ไข documentation
- เขียน doc อธิบายการเชื่อมโยง Unity กับ iOS ให้คนในทีมเข้าใจ
- เขียน doc อธิบาย workflow การแปลภาษา
- อัพเดต doc ลบ logs, api ที่เลิกใช้
- ลบคีย์คำแปลซ้ำซ้อน/คีย์ที่ไม่ได้ใช้
- ปรับปรุง developer experience
- เขียน script เช็คข้อมูลคำแปล แจ้งเตือนเวลานักแปลป้อน placeholder syntax ผิด
- ลดเวลา lint ให้ build แอปได้เร็วขึ้น
- เพิ่มฟีเจอร์ให้ debug native-unity interface ได้ง่ายขึ้น
- สร้าง test coverage report
- ใช้ periphery scan โค้ดที่ไม่ถูกใช้
ขอบเขตการทำงานก็กว้างอยู่ แต่สรุปสั้นๆ ได้ว่าทำทุกอย่างเพื่อเข็นฟีเจอร์ที่ได้รับมอบหมายมาให้ออกสู่โลกภายนอกอย่างรวดเร็วและปลอดภัยที่สุด บนโครงสร้างพื้นฐานที่มีอยู่แล้ว นั่นเอง (ถ้าขึ้นเป็น Tech lead ขอบเขตจะรวมถึงการคิดโครงสร้างพื้นฐานใหม่เลย)
ความสนุก
เข้าทำงานบริษัท Entertainment ในวงการ VTuber ทั้งที ก็ต้องมีอะไรนอกเหนือจากงาน software engineering ให้เอ็นจอยกันบ้าง เอาจริงนี่คือเหตุผลที่ชอบและอยากอยู่บริษัทนี้เลย งานทำไปก็ลืม อีเวนต์สิจำได้ตลอดไป 555
REALITY CON
เรียลอีเวนต์ประจำปี เป็นโอกาสสำคัญที่ยูเซอร์จะได้มาพบปะกัน คนในได้ไปร่วมฟรีๆ ปี 2023 ได้เป็นสต๊าฟ ช่วยรับลงทะเบียน ได้เห็นยูเซอร์ถ่ายรูปกับพร็อพสนุกๆ ใจฟูดี 😎 เว็บ REALITY CON 2023 in Tokyo
ถ่ายรูปกับคุมะซัง ตุ๊กตาหมีมาสค็อตของ REALITY
ได้เห็น REALITY Avatar อยู่ตามเมืองบ่อยๆ
REALITY จัดอีเวนต์คอลแล็บกับร้านค้า สถานีต่างๆ ในญี่ปุ่นเยอะ ให้เป็นรางวัลสำหรับผู้ไลฟ์ที่ร่วมอีเวนต์ มีโอกาสได้เห็นแผ่นป้าย เห็นโฆษณาบนจอ Shinjuku Vision เรื่อยๆ ภูมิใจดี เป็นส่วนหนึ่งของเซอร์วิสที่ช่วยสร้างสีสันให้กับเมือง ฮ่าๆ
อีเวนต์ Virtual Staff คอลแล็บกับ Yakiniku Watami
ได้โอกาสคอลแล็บกับวงการอนิเมะ
ปีที่แล้วมีคอลแล็บกับ Pretty Cure series ออกชุดกาชาให้แปลงร่างเป็นสาวน้อยเวทมนตร์ในเรียลลิตี้ กระแสตอบรับดีมากๆ เป็นช่องทางเผยแพร่อนิเมะให้ทั่วโลกได้เห็นอย่างดีเลย อนาคตก็มีโอกาสร่วมกับอนิเมะอื่นๆ อีกเยอะ ลุ้นเชียร์ทีม IP อยู่ทุกวัน ขอให้ได้คอลแล็บกับเรื่องที่ชอบซักวัน 555
แล้วก็มีโอกาสที่ไปโผล่เป็นสปอนเซอร์ในอีเวนต์อนิเมะ เช่นตอนไปดูคอน Animax เห็นโลโก้ REALITY ได้เห็นอวาตาร์อันคุ้นเคยไปโผล่บนจอยักษ์เป็น Opening act artist ก็ฟินดี
ปาร์ตี้เยอะ
มีอีเวนต์กินเลี้ยงกินฉลองกันได้ทุกเดือน บ.ออกค่าใช้จ่ายให้ส่วนนึง เฮฮาดี ในออฟฟิศมีพื้นที่จัดปาร์ตี้ได้ บางทีก็สั่งพิซซ่ามากินกันในบ. ไม่ต้องออกไปข้างนอก สบายใจ เป็นบ.ที่เป็นกันเองมาก
ส่งท้าย
ก็หวังว่าจะเห็นภาพการทำงานที่ REALITY กันนะครับ ส่วนตัวคือไม่มีบริษัทอื่นที่จะตรงกับเป้าหมายชีวิตตัวเองที่ต้องการสนับสนุนวงการอนิเมะญี่ปุ่นให้ไปสู่ทั่วโลก เกี่ยวข้องกับ VR/XR Industry และใช้ความสามารถ Software Engineer ให้เต็มที่ได้อย่างนี้อีกแล้ว มองหางานที่อื่นคือรู้สึกไม่ตรงใจซักอย่าง (ยกเว้นเงิน… บ.ข้ามชาติจ่ายหนักกว่าเยอะ 😇)
อนึ่ง ในความเป็นจริง งานก็คืองาน เขาจ้างเรามาแก้ปัญหา มีหลายอย่างที่ไม่เป็นไปตามที่ต้องการ มีเรื่องให้เหนื่อยใจ เรื่องให้หงุดหงิดอยู่ แต่เทียบกับความสนุกและ value ที่ได้เห็นจากการทำงานแล้วก็ถือเป็นเรื่องจิ๊บจ๊อย เป็นบริษัทที่น่าตื่นไปทำงานทุกวัน มีปัญหาที่เราแคร์ให้แก้รออยู่เสมอ เพื่อนร่วมงานเก่ง รู้จักผ่อนปรน ไม่เป๊ะๆ แบบญี่ปุ่นจ๋า คือดีที่สุดเท่าที่ทำงานมา 6 บริษัทแล้วล่ะ 😆