มุกตลกและอารมณ์ขันที่ซ่อนอยู่ใน Android API อย่างเป็นทางการ
(voxelmanip.se)- ใน Android public API มี เมธอดและค่าคงที่แบบขำ ๆ ซ่อนอยู่
- ตัวอย่างเด่นคือเมธอดอย่าง isUserAMonkey() และ isUserAGoat() ที่มีทั้งการใช้งานจริงและลูกเล่นเชิงตลก
- DISALLOW_FUN, Log.wtf() ฯลฯ เป็น API ทางการที่แฝงคำอธิบายติดตลกหรือพฤติกรรมชวนขำ
- การตั้งชื่ออย่างสร้างสรรค์ หรือการล้อเลียน (เช่น TWEET_TRANSACTION, GRAVITY_DEATH_STAR_I) ปรากฏอยู่บ่อยในเอกสารทางการหรือในโค้ด
- องค์ประกอบเหล่านี้มีบทบาทในการมอบ ความสนุกและการค้นพบเล็ก ๆ ให้แก่นักพัฒนา
มุกตลกและองค์ประกอบอารมณ์ขันใน Android public API
ใน Android open API มี มุกมีชั้นเชิงและอีสเตอร์เอ็กสำหรับนักพัฒนา หลายอย่างที่ถูกใส่มาควบคู่กับความสามารถจริง
ActivityManager.isUserAMonkey()
- เป็นเมธอดสำหรับตรวจว่ากำลังมี UI Exerciser Monkey เครื่องมือสำหรับนักพัฒนา ทำงานอยู่หรือไม่
- ถูกออกแบบมาเพื่อให้สามารถจำกัดพฤติกรรมบางอย่างได้ในสภาพแวดล้อมที่มีการ จำลองอินพุตแบบสุ่ม บน UI เพื่อ stress test แอป
- ถูกนำมาใช้เพื่อจำกัดฟีเจอร์สำคัญบางอย่าง (เช่น การโทรฉุกเฉิน) เมื่อมี monkey เป็นผู้ใช้งานแอปแทนผู้ใช้จริง
- ถูกเพิ่มเข้าสู่ public API ใน Android 2.2(Froyo, API 8)
- มีที่มาจากการแก้ปัญหาไม่คาดคิดจริงในช่วงแรก ๆ ของการพัฒนา Android
UserManager.isUserAGoat()
- ในเอกสารทางการระบุว่าใช้ตรวจว่า ผู้ใช้เป็นเป้าหมายสำหรับการเคลื่อนย้ายมวลสารทันที หรือไม่ แต่ตรงนี้เป็นมุกตลก
- ในช่วงแรกจะคืนค่า false เสมอ แต่หลังจาก Goat Simulator วางจำหน่าย ก็ถูกเปลี่ยนให้คืนค่า true เมื่อมีการติดตั้งเกมนั้น
- ตั้งแต่ Android 11(API 30) ขึ้นไป ถูกตรึงให้คืนค่า false เสมอด้วยเหตุผลด้าน ความเป็นส่วนตัว
- เดิมมี logic สำหรับตรวจหาแอป Goat Simulator แต่ถูกแก้เพื่อป้องกันข้อมูลรั่วไหลจากการเปลี่ยนแปลงนโยบายการเข้าถึงรายการแอป
- ได้แรงบันดาลใจจากอีสเตอร์เอ็กใน Google Chrome Task Manager
UserManager.DISALLOW_FUN
- หมายถึง นโยบายห้ามความสนุก ที่ถูกเพิ่มใน Android 6 Marshmallow(API 23)
- ในเอกสารทางการอธิบายว่าสามารถจำกัดไม่ให้ผู้ใช้ รู้สึกยินดีหรือสนุกสนาน ได้
- ในทางปฏิบัติใช้เป็นนโยบายที่เจ้าของอุปกรณ์ใช้ปิดกั้นความสามารถบางส่วนของผู้ใช้
- บางแอปหรือแม้แต่ระบบเองสามารถตรวจนโยบายนี้เพื่อ ปิดใช้งานฟีเจอร์ “สนุก ๆ” อย่างอีสเตอร์เอ็กได้
- อาจถูกนำไปใช้ในสถาบันการศึกษา เป็นต้น เพื่อ ปิดฟีเจอร์ที่รบกวนสมาธิ
Chronometer.isTheFinalCountdown()
- ใน Android 8 Oreo(API 26) มีการเพิ่มเมธอด isTheFinalCountdown
- เมื่อเรียกใช้ จะเปิด วิดีโอ YouTube เพลง “The Final Countdown” ของ Europe โดยอัตโนมัติ
- ไม่มีประโยชน์ใช้สอยโดยตรงและเป็นมุก/การอ้างอิงอย่างชัดเจน
- เห็นได้ชัดจากคำสั่ง Intent ในโค้ด
- เป็นลูกเล่นเล็ก ๆ สำหรับนักพัฒนา
PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH_JAZZHAND
- เป็นค่าคงที่สำหรับ การรองรับมัลติทัช ที่ถูกเพิ่มใน Android 2.3 Gingerbread(API 8)
- ชื่อนี้ล้อกับ Jazz hands (ท่ามือประกอบการแสดงดนตรี)
- หมายถึงความสามารถในการรับรู้การแตะพร้อมกันได้สูงสุดห้านิ้ว
Log.wtf()
- เป็นตัวย่อของ What a Terrible Failure ใช้สำหรับบันทึกล็อกในสถานการณ์ที่ไม่ควรเกิดขึ้นเด็ดขาด
- ถูกจัดเป็นล็อกระดับร้ายแรงแบบ assertion
- เป็นหนึ่งใน API เชิงมุกที่นักพัฒนารู้จักกันมากที่สุด
AdapterViewFlipper.fyiWillBeAdvancedByHostKThx()
- ถูกเพิ่มใน Android 3.0 Honeycomb(API 11)
- เป็นชื่อที่ ไม่เป็นทางการและขี้เล่น โดยจะถูกเรียกเมื่อวิวถูกเลื่อนต่อโดยโฮสต์
- คาดว่าน่าจะมาจากไอเดียตลกระหว่างการตั้งชื่อจริง
- เป็นการถ่ายทอดปัญหาเรื้อรังของวิทยาการคอมพิวเตอร์เรื่อง ความยากของการตั้งชื่อ ได้อย่างมีชั้นเชิง
IBinder.TWEET_TRANSACTION
- เป็น transaction type ที่เปิดตัวใน Android 3.2 Honeycomb(API 13)
- แม้จะสื่อถึง การส่งทวีต แต่จริง ๆ แล้วไม่ทำอะไรเลย และข้อจำกัดความยาวข้อความ 130 ตัวอักษรก็อ้างอิงนโยบายเก่าของ Twitter
- ตัวชื่อเองเป็นการล้อเลียนเต็มตัว
IBinder.LIKE_TRANSACTION
- เป็น LIKE transaction ที่ถูกเพิ่มใน Android 4.0.3 ICS(API 15)
- ใช้ส่งสัญญาณว่าผู้เรียกชอบแอปนี้ แต่ไม่มีการบันทึกหรือการนับจริง
- มีคำอธิบายเชิงมุกว่าช่วยเพิ่มความภาคภูมิใจในตนเองให้แอป
SensorManager.SENSOR_TRICORDER
- เป็นค่าคงที่ที่ตั้งชื่อตาม Tricorder จาก Star Trek
- มีมาตั้งแต่ยุค Android 1.0 แต่ภายหลังถูกทำเครื่องหมาย deprecated
- Tricorder เป็นอุปกรณ์ไซไฟที่ไม่มีอยู่จริง จึงชวนให้นักพัฒนายิ้มได้
SensorManager.GRAVITY_*
- ภายใน SensorManager มีค่าคงที่ที่เก็บค่าแรงโน้มถ่วงของเทหวัตถุต่าง ๆ (เช่น ดวงอาทิตย์ ดาวพลูโต)
- ในจำนวนนั้น GRAVITY_DEATH_STAR_I (Death Star จาก Star Wars), GRAVITY_THE_ISLAND (เกาะจากซีรีส์ LOST) เป็นมุกตลก
- บางรายการมีความหมายเชิงล้อเลียนมากกว่าการใช้งานจริง
<blink> แท็ก
- ในระบบ Android view layout มี แท็กซ่อนชื่อ
<blink>อยู่ - มันทำให้ child view กะพริบเหมือน
<blink>แบบเก่าใน HTML - ไม่มีคำอธิบายในเอกสารทางการ แต่ถูกเพิ่มจากคอมมิตในปี 2011 และยังคงอยู่ใน AOSP จนถึงปัจจุบัน
- ยังเป็นประเด็นถกเถียงว่ามีการใช้งานจริงหรือไม่
บทสรุป
ใน Android API อย่างเป็นทางการมี มุกตลก การล้อเลียน และองค์ประกอบแบบอีสเตอร์เอ็ก ถูกใส่ไว้โดยตั้งใจในหลายจุด
องค์ประกอบเหล่านี้ช่วยมอบความสนุกเล็ก ๆ และความสุขจากการค้นพบให้แก่นักพัฒนา และเป็นตัวอย่างที่สะท้อนวัฒนธรรมชุมชนและความขี้เล่นของ Android
2 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ที่ FB อยู่มาหลายปีมีธรรมเนียมว่าจะเติม suffix อย่าง
_DO_NOT_USE_OR_YOU_WILL_BE_FIREDให้กับโทเคนที่อันตรายหรือเลิกใช้ไปแล้ว ทุกคนรู้ว่าเป็นมุกนี้กันหมด แต่หลังช่วงโรคระบาด ตอนที่สัดส่วนพนักงานใหม่สูงขึ้นและการ onboarding ทางไกลไม่ค่อยเพียงพอ ก็เริ่มมีเสียงบ่นว่ามุกวงในแบบนี้ทำให้เกิดความกลัวหรือความไม่แน่นอน ทั้งหมดนี้เป็นเพียงสิ่งที่ฉันพบเจอในขอบเขตประสบการณ์ของตัวเองจำได้ว่าเมื่อก่อนชอบชื่อยาวเกินเหตุแต่กวน ๆ อย่าง
__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIREDของ React มาก น่าเสียดายที่ช่วงหลัง ๆ 'อารมณ์ขัน' แบบนี้ค่อย ๆ หายไป PR ที่เกี่ยวข้องเมื่อก่อนที่ Google มีโค้ดก้อนมหึมาส่วนหนึ่งใน network stack ที่ทั้งเข้าใจยากและแก้ไขยากมาก แถมมันก็ยิ่งพอกพูนขึ้นเรื่อย ๆ ทีมของเราเลยเปลี่ยนชื่อมันเป็น "[Foo]Sorcery" เพราะชื่อนี้ทั้งน่ากลัวและประหลาดพอ จึงไม่มีใครอยากเพิ่มอะไรใหม่เข้าไปอีก และนาน ๆ ทีก็จะมีคนมาจัดระเบียบบางส่วนแล้วลบทิ้งไป คิดว่าการตั้งชื่อขำ ๆ นี้ได้ผลจริง
ฟังก์ชันขำ ๆ ใน Android source ที่ฉันชอบที่สุดคือ
android.os.Handler.runWithScissors()แต่น่าเสียดายที่มันไม่ได้อยู่ใน public API ลิงก์ซอร์สในคอมเมนต์ของฟังก์ชันมีข้อความว่า “@hide เมธอดนี้มีโอกาสถูกนำไปใช้ผิด จึงไม่ควรใส่ไว้ใน API และหากจะเพิ่มจริงอาจต้องเปลี่ยนเป็นชื่อที่ตลกน้อยลงอย่าง runUnsafe()” อ่านแล้วหลุดขำ
แอบเสียดายนิดหน่อยที่ฟังก์ชันนี้ไม่อยู่ในบทความหลัก มันเป็นหนึ่งในฟังก์ชันที่ฉันชอบที่สุด
ตัวอย่างที่นึกถึงทันทีจาก X11 คือมีตัวแปร global ชื่อ "party_like_its_1989" ลิงก์โค้ด และใน changelog ของส่วนขยาย DRI2 ก็เต็มไปด้วยคำอย่าง "Awesomeness!", "True excellence", "Enlightenment attained" ลิงก์ changelog
ใน BeOS (และ Haiku) มีฟังก์ชันชื่อ "is_computer_on()" กับ "is_computer_on_fire()" ซึ่งคำอธิบายนั้นยอดเยี่ยมมาก ลิงก์อ้างอิง
ใน Delphi ก็มี exception ชื่อ 'EProgrammerNotFound' และเอกสารทางการเองก็แห้งแล้งแต่แฝงอารมณ์ขันแบบจริงจังไว้ดีมาก ลิงก์เอกสาร
แน่นอนว่ารู้ว่าการตั้งชื่อแบบนี้ทำมาเพื่อให้ขำ แต่บนคอมพิวเตอร์สมัยใหม่ที่มีระบบจัดการพลังงานขั้นสูง สถานะแบบนี้กลับพบได้ค่อนข้างบ่อย ระบบปฏิบัติการต้องรับมือได้เป็นปกติทั้งการปลุกจากโหมดประหยัดพลังงานลึก ๆ หรือสถานการณ์ที่อุณหภูมิเมนบอร์ดแตะ 200 องศา
คิดว่า
is_computer_on_fire()คงจะยิ่งสนุกถ้านำไปใช้เป็น asynchronous event-based triggerสำหรับคนที่สงสัย ก็มีลิงก์ซอร์สที่เกี่ยวข้องอยู่ด้วย ลิงก์โค้ด
ฉันชอบที่อารมณ์ขันแบบนี้ยังมีชีวิตอยู่ใน codebase ของบริษัทใหญ่ ๆ ตอนใช้งานแค่ API อาจไม่รู้สึก แต่พออ่าน source code เองแล้วเจอ Easter egg แบบนี้เป็นครั้งคราว มันทำให้รู้ชัดว่าโค้ดนี้มีมนุษย์เป็นคนเขียน ทุกวันนี้ซอฟต์แวร์เย็นชามาก แต่กลับรู้สึกถึงความอบอุ่นจากความตัดกันแบบนี้ พูดตรง ๆ คืออยากให้มีอะไรแบบนี้มากกว่านี้
ถ้าอยากลองทดสอบสิ่งอย่าง isUserAGoat หรือ isUserAMonkey บน Android ด้วยตัวเอง ฉันทำแอปเล็ก ๆ ที่มีฟีเจอร์พวกนี้ไว้แล้ว ลิงก์แอป และอยากลองเพิ่ม Easter egg อื่น ๆ เข้าไปอีกในอนาคต
ถ้าใส่ฟีเจอร์อย่างการเช็กนโยบาย DISALLOW_FUN เข้าไปด้วยก็น่าจะสนุกดี ฉันลองค้นโค้ดที่เกี่ยวข้องใน GitHub ดูแล้ว ส่วนใหญ่มักใช้แค่เพื่อซ่อน Easter egg เวอร์ชันในแอป Settings ของระบบเท่านั้น บางทีฉันอาจเป็น third party รายแรกที่เอาฟีเจอร์นี้มาใช้งานจริงก็ได้
แต่บน Android 15 ติดตั้งแอปไม่ได้แล้ว Google บังคับว่าต้องใช้ minimum compileSdk ให้ตรง เลยอยากให้ช่วยอัปเดตแอปหน่อย
ใน Chrome Task Manager เคยมี hidden column ที่แสดง "จำนวนแพะที่ browser process เทเลพอร์ตไปแล้ว" ตอนนี้ฟีเจอร์นั้นหายไปแล้ว แต่ยังดูได้จากภาพหน้าจอเก่า สมัยก่อนมีมากถึง 234 คอลัมน์ แต่ตอนนี้เหลือ 16 คอลัมน์เอง น่าเสียดายเหมือนกัน
คิดถึงยุคที่ผลิตภัณฑ์เทคเต็มไปด้วย Easter egg ตอนนี้ทุกอย่างกลายเป็นความเป็นบริษัทไปหมดจนรู้สึกว่าวัฒนธรรมแบบนั้นหายไปแล้ว
อยากให้การตอบในเธรดนี้เป็นคำถามบังคับในการสัมภาษณ์งาน รวมถึงตอนสัมภาษณ์ฉันด้วย นี่เป็นช่วงเวลาแบบ “บนโลกนี้มีคนอยู่สองประเภทจริง ๆ”
ประเด็นคือมีอารมณ์ขันและมุกตลกอยู่ในเอกสารเทคนิค ซึ่งหลายคนมองในแง่ลบ แต่ฉันชอบมากเวลาเอกสารมีอารมณ์ขัน เคยเขียนถึงไว้ในโพสต์นี้
คำว่า ‘ยูว์มอร์’ นี่ถูก AI แปลมาหรือเปล่าครับ....? ฮ่าๆๆ