هندسة الهاتف
نبني تطبيقات iOS وAndroid يفتحها المستخدم ليراجع سجلًا ويوقّع موافقة ويأذن بتغيير. عليها أن تُحمَّل على هاتف عمره خمس سنوات عبر اتصال 3G متقطّع، وتعمل دون اتصال حين تسقط الشبكة، وتتعافى بلطف من جلسة في الخلفية نسي المستخدم أنها مفتوحة. الانهيار أثناء موافقة حرجة ليس مقياسًا؛ بل حادث.
البدء البارد إلى أول فعل
جلسات بلا انهيار
الحد الأدنى للنظام
تدفقات حرجة تعمل دون اتصال
لماذا الهاتف
الهاتف حيث تلتقي الثقة بالإبهام
الهاتف هو السطح الذي يفتحه العميل في الثانية فجرًا ليوافق على إطلاق ضمان، أو ليتحقق إن كان رصيد حفظه قد صمد الليل، أو ليأذن بدفعة لا يستطيع رجعها. تلك اللحظة هي اختبار الثقة، ونهندس لها تحديدًا: لا يكذب التطبيق على الشبكة، ولا يتجمد في منتصف موافقة، ولا يُظهر رصيدًا قديمًا حين يكون المستخدم على وشك التوقيع. كل شاشة مسارات حرجة مُبنية لتصمد أمام اتصال ساقط في منتصف لمسة وتتعافى إلى حالة متسقة — لا حالة نصف مرسلة أبدًا. القياسات الحيوية ميسّرة، لكن الحد الأمني الذي تحميه يلزم تصميمه أولًا؛ نتعامل مع Face ID بوصفه القفل لا الباب.
نرفض فكرة أن الهاتف «الموقع داخل غلاف». تطبيقاتنا أصلية حيث تهمّ ميلي ثانية — القياسات الحيوية، والمنطقة الآمنة، والمزامنة الخلفية، ودفع الإشعارات — ومشاركة في كل ما عداه عبر قاعدة شيفرة TypeScript واحدة. الوصول بوابة إصدار لا فكرة لاحقة: مستخدم VoiceOver يكمل نفس الحوالة التي يكملها المبصر، بنفس عدد النقرات، وبنفس نص التأكيد مقروءًا صوتيًا. وبما أن الهاتف أكثر جهاز شخصي يمتلكه الإنسان، نتعامل مع الخصوصية بوصفها ميزة: التطبيق يجمع القياسات التي يحتاجها لإصلاح الانهيارات لا أكثر، ويستطيع المستخدم رؤية تلك البيانات وحذفها من داخل التطبيق.
ماذا نبني
من تطبيقات الموافقات إلى لوحات مشغّلين على الأجهزة اللوحية، هذا ما يخرج من لوحات مفاتيحنا ويطلق إلى App Store وPlay Store.
تطبيقات الموافقة والتوقيع
عملاء iOS وAndroid أصليون لموافقات السجلات وتوقيع الوثائق ومراسم المفاتيح — بوابية بالقياسات الحيوية، مدعومة بالمنطقة الآمنة، وقادرة على العمل دون اتصال حين تسقط الشبكة في منتصف المراسم.
لوحات المشغّلين اللوحية
أدوات امتثال وعمليات داخلية تجري على أجهزة لوحية مُدارة، بضوابط إدخال بمستوى تدقيق ومسار فعل موقّع يردّ كل نقرة إلى مشغّل وجهاز.
الدفع والمزامنة الخلفية
دفع صامت وجلب خلفي يُبقيان حالات السجلات وطوابير الموافقات طازجة دون استنزاف البطارية — ويصمدان أمام قتل التطبيقات الخلفية في iOS وأمام Doze في Android.
جوهر TypeScript مشترك
منطق المجال والتحقق والأنواع الأولية للمجال تعيش في وحدة TypeScript واحدة تستهلكها المنصتان — تُكتب مرة، وتُراجع مرة، وتُختبَر سلوكيًا مرة.
تدفقات حرجة أولًا دون اتصال
التدفقات الحرجة تُصفّ محلّيًا على الجهاز، وتُزامن حين تعود الشبكة، ولا تُظهر حالة نجاح أبدًا لمعاملة لم يُؤكدها الأنظمة الخلفية.
الوصول وVoiceOver
كل شاشة حرجة تطلق بعناوين VoiceOver وTalkBack، ودعم النوع الدينامي، وخطة اختبار نقرة-بنقرة يستطيع مستخدم قارئ الشاشة إكمالها دون مساعدة.
كيف نعمل
حلقتنا جوهر مشترك وقشرة أصلية. هذه دورة واحدة من لوحة المفاتيح إلى المتجر.
حدّد الجوهر المشترك
يُشارك المهندس مع الأنظمة الخلفية والتصميم على مواصفة مكتوبة: تحقق مشترك، وحالات، ونص بلغتين، وعناوين وصول، واختبارات قبول.
نفّذ الجوهر بـ TypeScript
المنطق المشترك — عمليات المجال، التحقق، آلات الحالات — يُنفّذ مرة ويُختبَر سلوكيًا مرة، قبل أن يُكتب أي قشرة خاصة بالمنصة.
ابنِ القشرات الأصلية
قشرتا iOS (Swift) وAndroid (Kotlin) تستهلكان الجوهر المشترك؛ وتُنفَّذ القياسات الحيوية والمنطقة الآمنة والدفع أصليًا حيث تهمّ كلفة الميلي ثانية.
اختبر على أجهزة حقيقية
مزرعة أجهزة حقيقية تجري كل طلب سحب على جهاز عمره خمس سنوات عبر شبكة 3G مُقيَّدة؛ الانحدار على جهاز منخفض النهاية يحظر الإصدار.
إطلاق تدرّجي على المتجر
تطلق الإصدارات إلى 1% من المستخدمين ثم 10% ثم 100% خلال 72 ساعة، مع مفتاح قتل يرجع خادميًا دون تقديم جديد على المتجر.
راقب الانهيارات وأطلق إصلاحًا
قياسات الانهيار تُغذّي السبرنت القادم؛ وانحدار يطلق أكثر من مرتين يطلق إصدار إصلاح حار خلال 24 ساعة. لا ننتظر الإصدار المجدول القادم لإصلاح انهيار.
تعريف الجاهز
لا يُطلق إصدار هاتف إلا حين يتحقق كل هذا
بلا انهيار
جلسات بلا انهيار ≥ 99.4% على الإصدار السابق؛ وأي صنف انهيار جديد يحظر التدرّج.
يمكن الوصول إليه
عناوين VoiceOver وTalkBack مدمجة، والنوع الدينامي متحقَّق منه، وخطة اختبار قارئ الشاشة مكتملة دون مساعدة على كل شاشة حرجة.
آمن دون اتصال
كل تدفق حرج يصمد أمام اتصال ساقط في منتصف لمسة ويتعافى إلى حالة متسقة — لا حالة نصف مرسلة أبدًا.
جاهز للنهاية المنخفضة
بدء بارد أقل من 2 ث على جهاز عمره خمس سنوات عبر 3G مُقيَّدة؛ والذاكرة تحت الميزانية على أصغر عتاد مدعوم.
قابل للرجوع
مفتاح قتل خادمي يستطيع تعطيل الميزة دون تقديم جديد على المتجر؛ ويمكن إطفاء الانحدار خلال دقائق، لا خلال الأيام التي يستغرقها مراجعة المتجر.
الأدوات ولماذا نستخدمها
جوهر مشترك، وقشرات أصلية. اختيرت كل أداة لنمط فشلها لا لعرضها الترويجي.
أصلي حيث تهمّ الميلي ثانية: القياسات الحيوية، المنطقة الآمنة، دفع الإشعارات. يلفّ الجوهر المشترك TypeScript.
السبب نفسه، منصة أخرى. Coroutines لمزامنة خلفية تصمد أمام Doze وقتل التطبيقات الخلفية.
عمليات المجال والتحقق وآلات الحالات تُكتب مرة، وتُراجع مرة، وتُختبَر سلوكيًا مرة — ثم تستهلكها كلتا القشرتين.
قياسات انهيار تُغذّي السبرنت القادم؛ وانحدار يطلق أكثر من مرتين يطلق إصلاحًا حارًا خلال 24 ساعة.
مزرعة أجهزة حقيقية في كل طلب سحب؛ عتاد عمره خمس سنوات عبر 3G مُقيَّدة؛ وانحدار على جهاز منخفض النهاية يحظر الإصدار.
إطلاق تدرّجي على المتجر إلى 1% ثم 10% ثم 100% خلال 72 ساعة، مع مفتاح قتل خادمي مستقل عن مراجعة المتجر.
أعلام ميزات خادمية تتيح إطفاء ميزة دون تقديم على المتجر؛ نستطيع الرجوع خلال دقائق.
تنقيط وصول في كل طلب سحب؛ وخطط اختبار VoiceOver وTalkBack تُكمل دون مساعدة قبل أن تطلق شاشة حرجة.
كيف نتواصل
حيث يلتقي الهاتف ببقية الشركة
الأنظمة الخلفية
الجوهر المشترك TypeScript مملوك بالاشتراك؛ الأنظمة الخلفية تكتب جانب الخادم من العقد، والهاتف يكتب جانب العميل، واختبارات العقد تثبت اتفاقهما في كل طلب سحب.
الجودة
تدفقات Maestro تجري في كل طلب سحب على مزرعة الأجهزة الحقيقية؛ والجودة تملك مصفوفة سيناريوهات المسارات الحرجة التي تجري ضد كل مرشح إصدار قبل بدء التدرّج.
DevOps
الإطلاق التدرّجي على المتجر مملوك بالاشتراك؛ DevOps يملك بنية مفتاح القتل، والهاتف يملك بوابات أعلام الميزات. أيٌّ منهما يستطيع إطفاء ميزة خلال دقائق.
التصميم
يحدّد المصممون الحالات وعناوين الوصول بالاشتراك مع المهندسين؛ ولا تطلق شاشة حرجة دون أن يُدمج مواصفة عناوين VoiceOver أولًا.
أسئلة تُطرح علينا
لماذا جوهر TypeScript مشترك لا أصلي كامل؟
عمليات المجال والتحقق وآلات الحالات أخطر كود نكتبه؛ وكتابته مرتين بلغتين تضاعف سطح العلل. جوهر واحد مُراجَع ومُختبَر سلوكيًا تستهلكه قشرات أصلية يمنحنا الصحة مرة وتجربة أصلية حيث تهمّ.
كيف تتعاملون مع اتصال ساقط في منتصف موافقة؟
كل فعل حرج عاطل للترديد على الأنظمة الخلفية؛ التطبيق يصفّ الطلب محلّيًا، ويعيد بمفتاح الترديد نفسه حين تعود الشبكة، ولا يُظهر حالة نجاح حتى يؤكده الأنظمة الخلفية.
هل تختبرون فعلًا على عتاد عمره خمس سنوات؟
نعم — على مزرعة أجهزة حقيقية مع 3G مُقيَّدة. الانحدار على جهاز منخفض النهاية يحظر الإصدار حتى لو كان خفيًا على جهاز رائد، لأن ذلك هو الهاتف الذي يمسكه أغلب عملائنا فعلًا.
ماذا يحدث إن تم تجاوز Face ID؟
Face ID يفتح جلسة؛ لا يأذن بمعاملة. كل فعل حرج يستلزم عاملًا ثانيًا يصمد أمام هاتف مفتوح مسروق — إذنًا خادميًا يلزم على المستخدم أن يوافق عليه من جهاز موثوق.
هل تستطيعون رجع إصدار دون انتظار المتجر؟
نعم. أعلام الميزات الخادمية تتيح إطفاء ميزة خلال دقائق، مستقلة عن مراجعة المتجر. تقديم ثنائي جديد هو الملاذ الأخير لا الأول.
مهمتنا
نبني تطبيقات هاتف تستحق الثقة في الثانية فجرًا، على هاتف عمره خمس سنوات، عبر شبكة متقطّعة، حين يُأذن المستخدم بشيء لا يستطيع رجعه. نتعامل مع الهاتف بوصفه سطح الثقة حيث يلتقي الإبهام بالسجل — ونهندس على هذا الأساس.