فكّر في المكان الذي تشتغل فيه فعلًا.

قبو بأساس خرساني وبلا نوافذ. مبنى جديد بقوائم فولاذية وألواح تكسية وبلا توصيلات مرافق. عقار ريفي على بُعد عشرين دقيقة بعد آخر برج اتصالات. غرفة ميكانيكية في وسط طابق تجاري واسع. مرآب مغطى.

والآن فكّر في المكان الذي تجري فيه العروض التجريبية للبرمجيات: مكتب، على شبكة واي فاي.

هذه هي الفجوة التي تجعل برمجيات الميدان مُتعِبة على نحو يصعب وصفه. فالتطبيق ليس بطيئًا ولا سيئ التصميم؛ إنه يعمل بلا عيب في الممر أمام المنزل، ثم يتوقف في القبو، وهو المكان الذي احتجته فيه بالضبط. والأسوأ أن العطل نادرًا ما يكون صريحًا: عادةً ما يظهر على هيئة مؤشر تحميل يدور بلا نهاية، أو حفظ صامت لم يحفظ شيئًا، أو نموذج يمسح ما كتبته حين تخرج منه.

أنماط العطل، بالتحديد

"لا يوجد اتصال" ليست مشكلة واحدة. إنها عدة مشكلات، وكل منها يُعطّل البرنامج بطريقة مختلفة.

انقطاع الإشارة تمامًا. الحالة الأوضح. التطبيق المبني جيدًا يعرف أنه بلا اتصال ويتصرف على هذا الأساس، ومعظم التطبيقات تتعامل مع هذه الحالة تعاملًا مقبولًا لأن اكتشافها سهل.

خط إشارة واحد، واتصال قائم من الناحية التقنية. هذه هي الحالة المدمّرة فعلًا. يُبلّغ الجهاز عن وجود اتصال، فيحاول التطبيق الوصول إلى الخادم، ويعلَق الطلب. تجلس أمام مؤشر يدور أربعين ثانية ثم تنتهي المهلة، أو ما هو أسوأ: طلب ينفَّذ نصفه. والبرنامج الذي يسأل "هل توجد شبكة؟" بدل أن يسأل "هل نجح هذا فعلًا؟" يفشل هنا أشد الفشل.

إشارة تروح وتجيء. تمشي من الممر إلى القبو أربع مرات في اليوم، وكل انتقال فرصة لأن تنقطع مزامنة في منتصفها.

اتصال قائم لكنه بطيء. أبراج ريفية مزدحمة عند الرابعة عصرًا. كل شيء يعمل من الناحية التقنية، لكن بوتيرة تدفعك إلى تركه.

التطبيق الذي يعمل دون اتصال بصدق يجب أن يتعامل مع الحالات الأربع كلها. أما الذي يتعامل مع الأولى وحدها فسيضيّع عملك رغم ذلك.

هاتف يعرض عملية رفع في قائمة الانتظار بينما يعمل حرفي في بئر سلّم خرساني

ماذا يجب أن تعني عبارة "يعمل دون اتصال" فعلًا؟

تُستعمل هذه العبارة على عواهنها. لكن هناك اختبارًا ذا معنى، وهو مكوَّن من أربعة أجزاء.

القراءة تعمل. تستطيع أن تفتح مهمة وترى العنوان ونطاق العمل ورقم هاتف العميل وصور الأمس، من دون أي اتصال. ومعنى ذلك أن البيانات محفوظة على الجهاز فعلًا، لا مجرد ذاكرة مؤقتة تمتلئ متى اتفق.

الكتابة تعمل، وما تكتبه يبقى. تستطيع أن تضيف ملاحظة، وتسجّل ساعات، وتدوّن مصروفًا، وتلتقط صورًا. وإذا انطفأ الهاتف، أو أُغلق التطبيق قسرًا، أو نفدت البطارية في البرد، يبقى ذلك كله موجودًا حين يعود. فما هو في الذاكرة وحدها ليس محفوظًا.

المزامنة تلقائية ولا تُرى. حين تعود الإشارة، يُرفَع كل ما في قائمة الانتظار من تلقاء نفسه. لا ينبغي أن تتذكر الضغط على زر مزامنة، لأن المرة التي تنساه فيها هي المرة التي يهم فيها.

التعارضات تُعالَج بصراحة. عدّل شخصان المهمة نفسها وكلاهما بلا اتصال. البرنامج الجيد يكتشف ذلك ويخبرك به. أما البرنامج السيئ فيُبقي على نسخة واحدة بصمت، فتكتشف بعد أسابيع أن ملاحظة قد ضاعت.

وهذه النقطة الأخيرة هي أسهل ما يُهمَل، وهي الفرق بين تطبيق يحتمل انقطاع الاتصال وتطبيق بُني للعمل دون اتصال من الأساس. فاكتشاف التعارض يقتضي أن يتتبع التطبيق نسخ كل سجل ويقارنها عند الرفع إلى الخادم. إنه عمل هندسي حقيقي لا تظهر منه ميزة يراها المستخدم، ولهذا السبب بالذات كثيرًا ما يُترك.

لماذا تستحق الصور فقرة خاصة بها

الصور أصعب حالات العمل دون اتصال في برمجيات الميدان، وهي في الوقت نفسه أكثر ما يحتاج المقاول إلى تصويره في الموقع: الأضرار القائمة قبل أن تبدأ، وما خلف الجدار، والعمل بعد إنجازه، وقراءة عداد، وتوريد مواد.

وهي صعبة لأنها كبيرة الحجم. صور مهمة واحدة بالدقة الكاملة تبلغ عشرات الميغابايت، وعلى خط إشارة واحد سيفشل رفعها. مرة بعد مرة. والتطبيق الذي يعامل الصورة كأي سجل آخر إما أن يتوقف منتظرًا اكتمال الرفع، وإما أن يُسقطها.

وما ينبغي أن يحدث بدلًا من ذلك: تُحفَظ الصورة على الجهاز فورًا وتُرفق بالمهمة، ويجري الرفع كمهمة خلفية منفصلة تعيد المحاولة، عبر إعادة تشغيل التطبيق وعلى مدى أيام إن لزم الأمر. ويجب أن تكون الصورة صالحة للاستخدام داخل التطبيق لحظة التقاطها، وصلت إلى الخادم أم لم تصل.

والعطل الذي يجب الانتباه له هو التطبيق الذي يعرض الصورة على الجهاز لكنه لا يرفعها أبدًا ولا يخبرك. يبدو كل شيء سليمًا إلى أن تفتح المهمة على حاسوب محمول، أو يضيع الهاتف، فتكتشف أن الصور لم تغادره قط.

حرفي يصوّر عملًا مكتملًا بهاتفه

ماذا يكلّفك غياب هذا كله

التكلفة الظاهرة صغيرة ومتكررة: بضع دقائق تضيع في كل مرة، ومشوار إلى الممر بحثًا عن خط إشارة.

أما التكلفة الحقيقية فسلوكية. فبعد أن يكتوي الناس مرتين، يفقدون ثقتهم بالتطبيق في الموقع، ويعودون إلى كتابة الساعات على قصاصة ورق وإدخالها مساء الجمعة، وتصوير الإيصالات في ألبوم لا يُرتَّب أبدًا، والاحتفاظ بالجدول الحقيقي في رؤوسهم. يبقى البرنامج مثبَّتًا ومدفوع الثمن، ويعود العمل يُدار بالذاكرة من جديد.

وما إن يحدث ذلك حتى يتدهور كل ما يليه. يتعطّل حساب تكلفة المهام لأن التكاليف لا تُربَط بها أصلًا. وتتأخر الفوترة لأن لا أحد واثق من اكتمال العمل. كانت قيمة النظام كله معلَّقة على تسجيل البيانات في لحظة تنفيذ العمل، وانقطاع الاتصال هو ما يكسر ذلك.

كيف تختبره قبل أن تلتزم به؟

لا تعرف ذلك من قائمة الميزات؛ الكل يكتب "يعمل دون اتصال". اختبره بنفسك في نحو عشر دقائق:

  1. اضبط الهاتف على وضع الطيران.
  2. افتح مهمة لم تفتحها منذ مدة. هل تُحمَّل بالكامل، بصورها؟
  3. أضف ملاحظة، وسجّل ساعات، ودوّن مصروفًا، والتقط ثلاث صور.
  4. أغلق التطبيق قسرًا ثم أعد فتحه. هل بقي كل ذلك موجودًا؟
  5. أعد الاتصال. هل تتم المزامنة وحدها من دون أن تضغط شيئًا؟
  6. ثم الاختبار الحقيقي: شغّل الواي فاي على شبكة بلا إنترنت، حتى يُبلّغ الهاتف عن اتصال لا يعمل، وأعد الخطوة 3. كثير من التطبيقات التي تجتاز وضع الطيران تسقط في هذا الاختبار.

فإن نجا من الاختبارات الستة كلها، فقد بناه أناس نزلوا إلى قبو فعلًا.

بُني Zeus على هذا الأساس عمدًا: يحتفظ التطبيق بقاعدة بيانات محلية كاملة على الجهاز، فتُقرأ المهام والعملاء والأسعار من دون أي اتصال، وكل ما تُدخله يُكتَب محليًا أولًا ثم يُزامَن عند عودة الإشارة. وتُحفَظ الصور على الجهاز فورًا، وفي الخطط التي تشمل النسخ الاحتياطي للصور تُرفَع في الخلفية مع إعادة المحاولة، مع خيار الرفع عبر الواي فاي وحده حتى لا يلتهم تصوير يوم كامل باقة البيانات. أما التعديلات المتعارضة من جهازين فتُكتشَف بدل أن يُكتب فوقها بصمت، وتُعلَّم على مؤشر المزامنة لتحسمها بنفسك. والعمل دون إشارة هو أحد الأسئلة الخمسة التي يطرحها الجدول المقارن جنبًا إلى جنب على كل تطبيق فيه، فترى من يجيب بنعم قبل أن تثبّت أي شيء.

أين يتموضع Zeus

الاختبار المكوَّن من ست خطوات هو صلب المقال، فالشيء الوحيد المفيد لإضافته هنا هو ما يحدث عند كل خطوة داخل القبو، لا في الممر أمام المنزل.

يحتفظ التطبيق بقاعدة بيانات كاملة على الجهاز، فتفتح المهمة وعنوانها ونطاق عملها وصور الأمس والهاتف في وضع الطيران. وكل ما تُدخله يُكتب في تلك القاعدة أولًا بدل أن يبقى في الذاكرة بانتظار الشبكة: ملاحظة، ساعات، مصروف، صور، مهمة جديدة في عنوان جديد. وتذهب كل عملية كتابة إلى صندوق صادر تستطيع فتحه وقراءته، فيصير ما لم يصل إلى الخادم قائمة أمامك بعدد محدَّد، لا مؤشر تحميل يدور. وحين تعود الإشارة يُفرَّغ صندوق الصادر من تلقاء نفسه، ويعمل تفريغ آخر في الخلفية تحسّبًا لتفويت تلك اللحظة. أما الصور فتُرفَع كعملية مستقلة تعيد المحاولة بنفسها، عبر إعادة التشغيل وعبر الأيام. وإذا عدّل جهازان السجل نفسه، لا يُهمَل الثاني بصمت: بل ينتقل إلى شاشة تعارض تختار فيها أي نسخة تبقى. هذا ما يتطلّبه تنفيذ المهمة وشاشة الإشارة خالية.

ما تستطيع إنشاءه وتعديله بلا إشارة هو معظم ما يفعله التطبيق، لا زاوية صغيرة منه. إعداد عروض الأسعار وإصدار الفواتير يبدآن بلا تكلفة؛ وما تضيفه الباقات المدفوعة موضَّح مع الأسعار. طبّق الخطوات الست هذا المساء على ما تستخدمه الآن، وعلى تطبيق Zeus للمقارنة.

عُد إلى القبو ذي الأساس الخرساني وبلا نوافذ. إمّا أن يستقبل التطبيق الملاحظة والساعات والصور الثلاث وأنت واقف فيه، وإمّا أن يعطيك مؤشر تحميل يدور فتكتب على قصاصة ورق. وهذا ما لا تكتشفه في مكتب متصل بشبكة Wi-Fi.

أسئلة شائعة

ألا يستهلك تخزين كل شيء على الهاتف مساحة كبيرة؟

السجلات النصية صغيرة جدًا: آلاف المهام والعملاء والبنود لا تتجاوز بضعة ميغابايت. الصور وحدها هي المستهلك الحقيقي، ولهذا تُدار عادةً على حدة، وتبقى النسخ الأصلية بالدقة الكاملة في السحابة بعد رفعها.

هل بياناتي على الهاتف آمنة إن ضاع أو سُرق؟

يعتمد ذلك على التطبيق، والسؤال عنه مباشرةً يستحق العناء. ما تبحث عنه شيئان: تشفير قاعدة البيانات المحلية، وقفل للتطبيق نفسه لا مجرد اعتماد على قفل شاشة الهاتف. ويُشفّر Zeus قاعدة بياناته المحلية، ويوفّر قفل تطبيق اختياريًا يعمل بالقياسات الحيوية لجهازك أو رمز PIN.

ماذا يحدث إذا عدّل عضوان من الطاقم المهمة نفسها دون اتصال؟

في نظام مبني جيدًا، يُكتشَف التعارض حين يزامن الجهاز الثاني، ويُعرَض على شخص ليحسمه. واحذر أي تطبيق يَعِدك بأن هذا لا يحدث أبدًا: الطريقة المعتادة هي أن يبقى آخر تعديل ويُمحى ما قبله، ومعناها أن عمل أحدهم قد اختفى من دون أن يعلم به أحد.

هل عليّ أن أزامن يدويًا قبل التوجّه إلى موقع العمل؟

لا ينبغي، والحاجة إلى ذلك علامة تحذير. يجب أن تجري المزامنة باستمرار في الخلفية كلما توفّرت إشارة.