کمی فکر کنید که واقعاً کجا کار میکنید.
یک زیرزمین با فونداسیون بتنی و بدون پنجره. یک ساختمان نوساز با تیرکهای فلزی، تختهکوبی دیوار و بدون هیچ اتصال خدماتی. یک ملک روستایی، بیست دقیقه آنطرفتر از آخرین دکل مخابراتی. یک اتاق تأسیسات وسط یک طبقهی تجاری. یک پارکینگ زیرزمینی.
حالا فکر کنید دموی نرمافزارها معمولاً کجا برگزار میشود: یک دفتر کار، روی وایفای.
همین فاصله است که نرمافزار میدانی را به شکلی آزاردهنده میکند که توصیفش سخت است. اپ کند یا بدساخت نیست. توی مسیر ورودی خانه بینقص کار میکند و دقیقاً توی زیرزمین از کار میافتد، جایی که واقعاً به آن نیاز داشتید. و این خرابی معمولاً خودش را نشان نمیدهد: بیشتر وقتها بهشکل نشانگر چرخان بارگذاری، یک ذخیرهسازی خاموش که واقعاً ذخیره نشده، یا فرمی است که وقتی از آن خارج میشوید، هرچه تایپ کردهاید را دور میریزد.
دقیقاً چه چیزی خراب میشود؟
«بدون اتصال» یک مشکل نیست. چند مشکل است، و هر کدام نرمافزار را به شکل متفاوتی خراب میکند.
بدون هیچ آنتنی. حالت روشن ماجرا. یک اپ خوبساخته میداند که آفلاین است و بر همان اساس رفتار میکند. بیشتر اپها این حالت را بهاندازهی کافی مدیریت میکنند، چون تشخیصش ساده است.
یک خط آنتن، روی کاغذ متصل. حالت واقعاً مخرب. گوشی میگوید متصل هستید، پس اپ سعی میکند به سرور برسد، و درخواست معطل میماند. چهل ثانیه نشانگر چرخان بارگذاری میبینید و بعد وقفهی زمانی، یا بدتر، درخواستی که نیمهکاره تمام میشود. نرمافزاری که فقط «آیا شبکهای هست؟» را بررسی میکند، نه «آیا این کار واقعاً موفق شد؟»، در همینجا بیشترین خرابی را میبیند.
سیگنالی که میآید و میرود. روزی چهار بار از مسیر ورودی به زیرزمین میروید. هر عبوری فرصتی است تا یک همگامسازی نیمهکاره بماند.
متصل، اما کند. دکلهای شلوغ روستایی ساعت چهار بعدازظهر. همهچیز روی کاغذ کار میکند، اما آنقدر کند که عملاً استفاده از آن را کنار میگذارید.
اپی که واقعاً میتواند آفلاین کار کند، باید هر چهار حالت را پوشش دهد. اپی که فقط حالت اول را مدیریت میکند، باز هم کارتان را از دست میدهد.

واقعاً «آفلاین کار میکند» یعنی چه؟
این عبارت اغلب بدون دقت کافی به کار میرود. یک تست معنادار وجود دارد که چهار بخش دارد.
خواندن کار میکند. بدون هیچ اتصالی میتوانید یک کار را باز کنید و آدرس، محدودهی کار، شمارهی تلفن مشتری و عکسهای دیروز را ببینید. یعنی داده واقعاً روی دستگاه ذخیره شده، نه اینکه فقط گاهبهگاه کش شده باشد.
نوشتن کار میکند، و پایدار است. میتوانید یادداشت اضافه کنید، ساعت کاری ثبت کنید، هزینهای وارد کنید، عکس بگیرید. و اگر گوشی خاموش شود، اپ بهزور بسته شود، یا در هوای سرد شارژ تمام شود، وقتی برگردید همان کار همانجاست. چیزی که فقط در حافظه است، ذخیرهشده نیست.
همگامسازی خودکار و نامرئی است. وقتی سیگنال برگردد، هرچه در صف بوده، خودش بالا میرود. هرگز نباید یادتان باشد دکمهی همگامسازی را بزنید، چون همان یک باری که فراموش کنید، دقیقاً همان زمانی است که اهمیت دارد.
تعارضها صادقانه مدیریت میشوند. دو نفر همزمان و آفلاین روی یک کار ویرایش کردهاند. نرمافزار خوب این را تشخیص میدهد و به شما میگوید. نرمافزار بد بیسروصدا یکی از نسخهها را نگه میدارد، و هفتهها بعد میفهمید یک یادداشت گم شده است.
آن نکتهی آخر معمولاً راحتتر از همه نادیده گرفته میشود، و همان تفاوت بین اپی است که آفلاین را «تحمل» میکند و اپی که واقعاً «آفلاین-اول» ساخته شده. تشخیص تعارض یعنی اپ باید نسخههای هر رکورد را دنبال کند و در مسیر برگشت با هم مقایسه کند. این کار مهندسی واقعی است بدون هیچ ویژگی قابلنمایشی، و دقیقاً به همین دلیل معمولاً انجام نمیشود.
چرا عکسها بند مخصوص خودشان را لازم دارند
عکسها سختترین مورد آفلاین در نرمافزار میدانی هستند، و در عین حال همان چیزی هستند که پیمانکاران بیشترین نیاز را به گرفتنشان در سایت دارند: آسیب موجود پیش از شروع، شرایط پشت دیوار، کار تمامشده، عدد کنتور، یک تحویل.
سخت هستند چون حجیماند. عکسهای کیفیتکامل یک کار روی هم دهها مگابایت میشوند. با یک خط آنتن، آن بارگذاری شکست میخورد. بارها. اپی که با یک عکس مثل هر رکورد دیگری رفتار کند، یا منتظر تکمیل بارگذاری میماند، یا آن را رها میکند.
آنچه باید اتفاق بیفتد این است: عکس بلافاصله روی دستگاه نوشته و به کار متصل میشود، و بارگذاری یک کار پسزمینهی جداگانه است که تلاش دوباره میکند، حتی بعد از ریاستارت اپ و در صورت لزوم روزها بعد. عکس باید همان لحظهی گرفتن، در اپ قابلاستفاده باشد، فارغ از اینکه اصلاً به سرور رسیده باشد یا نه.
خرابیای که باید مراقبش باشید، اپی است که عکس را روی دستگاه نشان میدهد ولی بیصدا هرگز آن را بارگذاری نمیکند. همهچیز درست به نظر میرسد تا وقتی کار را روی لپتاپ باز کنید، یا گوشی گم شود، و بفهمید عکسها همیشه فقط محلی بودهاند.

نبودنش چه هزینهای دارد؟
هزینهی قابلمشاهده کوچک و ثابت است: چند دقیقه در هر رخداد، یک قدم زدن تا مسیر ورودی برای گرفتن آنتن.
هزینهی واقعی رفتاری است. بعد از اینکه دو بار ضرر خوردند، آدمها دیگر توی سایت به اپ اعتماد نمیکنند. برمیگردند به نوشتن ساعتکاری روی یک تکه کاغذ و وارد کردنش جمعهشب، عکسگرفتن از رسیدها به گالریای که هرگز مرتب نمیشود، نگهداشتن برنامهی واقعی توی ذهنشان. نرمافزار همچنان نصب است و همچنان هزینهاش پرداخت میشود، و کسبوکار دوباره روی حافظه میچرخد.
وقتی این اتفاق افتاد، همهچیز پاییندستی هم افت میکند. هزینهیابی کار متوقف میشود چون هزینهها هرگز به کارها متصل نمیشوند. صدور فاکتور عقب میافتد چون کسی مطمئن نیست کار تمام شده یا نه. کل ارزش سیستم به این بستگی داشت که داده در لحظهی انجام کار ثبت شود، و خرابی آفلاین همان چیزی است که این را میشکند.
پیش از تعهد، چطور آن را تست کنید؟
از روی لیست ویژگیها نمیتوانید بفهمید؛ همه مینویسند «آفلاین کار میکند». در حدود ده دقیقه تستش کنید:
- گوشی را در حالت هواپیما بگذارید.
- کاری را باز کنید که اخیراً بازش نکردهاید. آیا کامل، از جمله عکسها، بارگذاری میشود؟
- یک یادداشت اضافه کنید، ساعت کاری ثبت کنید، هزینهای وارد کنید، سه عکس بگیرید.
- اپ را بهزور ببندید. دوباره بازش کنید. همهچیز هنوز آنجاست؟
- اتصال را برگردانید. همهچیز خودش، بدون اینکه چیزی فشار دهید، همگام میشود؟
- حالا تست واقعی: وایفای را روشن کنید اما به شبکهای متصل شوید که اینترنت ندارد، تا گوشی بگوید متصل است در حالی که کار نمیکند. مرحلهی سه را تکرار کنید. خیلی از اپهایی که از حالت هواپیما جان سالم بهدر میبرند، اینجا شکست میخورند.
اگر از هر شش مرحله جان سالم بهدر برد، یعنی کسانی آن را ساختهاند که خودشان توی یک زیرزمین بودهاند.
Zeus عمداً همینطور ساخته شده: اپ یک پایگاهدادهی کامل محلی روی دستگاه نگه میدارد، پس کارها، مشتریها و قیمتگذاری بدون هیچ اتصالی قابلخواندن هستند، و هرچه وارد میکنید ابتدا محلی نوشته و وقتی سیگنال برگردد همگام میشود. عکسها بلافاصله روی دستگاه ذخیره میشوند و در پلنهایی که پشتیبانگیری عکس دارند، در پسزمینه و با تلاش مجدد بارگذاری میشوند، با گزینهی بارگذاری فقط روی وایفای تا یک روز عکسگرفتن، بستهی اینترنت را نخورد. ویرایشهای متعارض از دو دستگاه بهجای رونویسی بیصدا تشخیص داده میشوند و روی نشانگر همگامسازی علامت میخورند تا خودتان حلشان کنید.
پرسشهای متداول
ذخیره همهچیز روی گوشی حجم زیادی نمیگیرد؟
رکوردهای متنی خیلی کوچکاند: هزاران کار، مشتری و ردیف کالا روی هم چند مگابایت میشوند. عکسها تنها مصرفکنندهی قابلتوجه هستند، برای همین معمولاً جدا مدیریت میشوند، با نسخههای اصلی و کامل که پس از بارگذاری در فضای ابری ذخیره میشوند.
اگر گوشی گم یا دزدیده شود، داده روی آن امن است؟
بستگی به اپ دارد، و ارزش دارد مستقیم بپرسید. چیزهایی که باید دنبالشان باشید رمزنگاری پایگاهدادهی محلی است، و یک قفل روی خودِ اپ بهجای تکیهی صرف بر قفل صفحهی گوشی. Zeus پایگاهدادهی محلیاش را رمزنگاری میکند و یک قفل اپ اختیاری ارائه میدهد که از بیومتریک یا پین دستگاه شما استفاده میکند.
اگر دو نفر از تیم همزمان و آفلاین روی یک کار ویرایش کنند چه؟
در یک سیستم خوبساخته، وقتی دستگاه دوم همگام میشود، تعارض تشخیص داده و به یک نفر برای حلکردن نشان داده میشود. مراقب هر اپی باشید که قول میدهد این هرگز پیش نمیآید: پیادهسازی معمول «آخرین نوشته برنده است» است، و یعنی کار یک نفر بدون خبردادن به کسی ناپدید شده.
آیا باید پیش از رفتن به سر کار، دستی همگامسازی کنم؟
نباید لازم باشد، و اگر لازم باشد، خودش یک نشانهی هشدار است. همگامسازی باید هر وقت سیگنال هست، پیوسته و در پسزمینه اتفاق بیفتد.



