حتى وقت قريب ، كان لدى Dropbox استراتيجية تقنية لاستخدام كود C ++ الشائع لتطبيقات iOS و Android المحمولة. الفكرة واضحة: اكتب الكود مرة واحدة في C ++ بدلاً من تكرارها بشكل منفصل في Java و Objective C. اعتمدنا هذه الاستراتيجية في عام 2013 ، عندما كانت مجموعة مهندسي تطوير الهواتف المحمولة صغيرة نسبيًا واضطررت إلى تطوير المنتج بسرعة. مثل هذا الحل يسمح لإنتاج كمية كبيرة من التعليمات البرمجية على كل من Android و iOS بواسطة قوى فريق صغير.
لقد تخلينا عن هذه الاستراتيجية تمامًا لصالح اللغات الأصلية لكل منصة (بشكل أساسي Swift و Kotlin ، والتي لم تكن موجودة عندما بدأنا). يتضمن الحل التكاليف الخفية لمشاركة الرمز.
جميع المشاكل تنبع من
الشيء الرئيسي:
تبين أن النفقات العامة أكثر من مجرد كتابة الكود مرتين .
قبل تحليل أنواع مختلفة من الأحمال ، أود أن أوضح أننا لم نصل إلى النقطة التي كان معظم قاعدة الشفرات فيها C ++. التكاليف في الواقع منعتنا من التحرك في هذا الاتجاه.
تجدر الإشارة أيضًا إلى أن الشركات الأكبر حجمًا مثل Google و Facebook تعمل على تطوير حلول لتبادل الرموز القابلة للتطوير لعدة سنوات حتى الآن. هذه الحلول ليست شائعة جدا. على الرغم من أن أنظمة الجهات الخارجية مثل React Native أو Flutter تتجنب بعض النفقات العامة ، إلا أن بعض التكاليف لا تزال قائمة (على الأقل حتى تصبح إحدى هذه التقنيات شائعة وناضجة بدرجة كافية). على سبيل المثال ،
رفض Airbnb استخدام React Native للعديد من نفس الأسباب الموضحة في هذه المقالة.
يمكن تجميع جميع التكاليف في أربع فئات رئيسية.
النفقات العامة من الأطر المخصصة والمكتبات
أسهل طريقة للتنبؤ بتكاليف إنشاء الأطر والمكتبات. وهي مقسمة إلى فئتين فرعيتين:
- الأطر التي تسمح لك بالتفاعل مع بيئة المضيف لإنشاء تطبيق جوال كامل. على سبيل المثال:
- Djinni ، أداة لإنشاء إعلانات interlanguage لأنواع الاتصال والواجهات
- إطار عمل لأداء المهام في الخلفية مقابل الخيط الرئيسي (بشكل تافه باللغات الأصلية للمنصة)
- المكتبات لتحل محل معايير اللغة أو حلول المصادر المفتوحة التي يمكن استخدامها باللغات الأصلية ، على سبيل المثال:
- json11 لـ (de) إجراء تسلسل JSON
- مؤشرات غير فارغة لـ C ++
لا شيء من هذا ضروري إذا بقيت في اللغات الأصلية للمنصة. ومن المحتمل أن تكون مشاركتنا في المشاريع مفتوحة المصدر باللغات الأم أكثر فائدة للمطورين. في مجتمع C ++ ، لم تكن ثقافة المصدر المفتوح (وهل هي كذلك؟) لم يتم تطويرها كما هو الحال في مجتمع مطوري البرامج المحمولة ، والأهم من ذلك أن مجتمع C ++
المحمول لا وجود له من الناحية العملية.
يرجى ملاحظة أن هذه التكاليف مرتفعة بشكل خاص بالنسبة لـ C ++ (على عكس اللغات الأخرى غير المحلية المحتملة مثل Python أو C #) ، لأنه لا توجد مكتبة قياسية واحدة تعمل بكامل طاقتها. ومع ذلك ، فقط C / C ++ لديه مترجم مدعوم من كل من Google و Apple ، لذا فإن التحول إلى لغة أخرى يسبب عددًا من المشكلات الأخرى.
بيئة التطوير المخصصة المتضخم
هناك العديد من الأدوات في النظام الإيكولوجي المتنقل لتحسين كفاءة التنمية. أجهزة IDE للجوال عملية للغاية ، وقد استثمرت Google و Apple الكثير من الموارد لجعلها مثالية على منصاتها. الابتعاد عن التخلف عن السداد ، نتخلى عن بعض المزايا. أولاً وقبل كل شيء ، تصحيح أخطاء اللغة الأصلية عادةً ما يتفوق على تصحيح C ++ في IDE بشكل افتراضي.
أتذكر بشكل خاص خطأ واحد تسبب في حظر بنية دفق الخلفية ، مما أدى إلى تعطل التطبيق بشكل عرضي. يصعب تتبع مثل هذه الأخطاء حتى باستخدام مكدس بسيط قياسي. نظرًا لأن المشكلة تنطوي على تصحيح التعليمات البرمجية متعددة مؤشرات الترابط بين C ++ و Java ، فقد استغرق الأمر أسابيع لتعقب!
بالإضافة إلى فقد الأدوات القياسية ، اضطررت إلى استثمار الوقت في إنشاء الأدوات الخاصة بي لدعم رمز C ++ الشائع. الأهم من ذلك ، كان مطلوبًا إنشاء نظام بناء مخصص لإنشاء مكتبات تحتوي على تعليمات برمجية لـ C ++ ، بالإضافة إلى قذائف Java و Objective-C. يجب أن تولد الأهداف التي يفهمها كل من Xcodebuild و Gradle. استغرق إنشاء مثل هذا النظام الكثير من الموارد ، لأنه كان لا بد من تحديثه باستمرار لدعم التغييرات في نظامي البناء.
تجاوز النظام الأساسي لـ اختلافات النظام الأساسي
على الرغم من أن iOS و Android "تطبيقات محمولة" توفر عادةً نفس الميزات ، إلا أن هناك بعض الاختلافات في الأنظمة الأساسية نفسها التي تؤثر على التنفيذ. على سبيل المثال ، كيفية تنفيذ أحد التطبيقات لمهام الخلفية. حتى الأشياء المتشابهة يمكن أن تبدأ في التغير بشكل كبير مع مرور الوقت (على سبيل المثال ، التفاعل مع الكاميرا).
نتيجة لذلك ، لا يمكنك فقط كتابة الكود مرة واحدة وتشغيله على منصة أخرى. تحتاج إلى قضاء الكثير من الوقت في الدمج والترميز لنظام أساسي معين ، وفي بعض الأحيان ينتهي هذا الرمز على مستوى C ++!
لا تتوافق المدخرات النظرية من شفرة الكتابة مرة واحدة مع الواقع ، مما يقلل بشكل كبير من فعالية هذا النهج على الفور.النفقات العامة للتوظيف والتدريب والاحتفاظ بالمطورين
أخيرًا وليس آخرًا ، تكلفة التدريب و / أو التعاقد مع المطورين للعمل مع مجموعتنا المميزة للغاية. عندما بدأ Dropbox في استخدام استراتيجية الهاتف المحمول هذه ، كان لدينا مجموعة أساسية من مطوري C ++ ذوي الخبرة. أطلقت هذه المجموعة مشروع C ++ ودربت مطورين متنقلين آخرين.
بمرور الوقت ، ذهب هؤلاء المطورين إلى فرق أخرى وشركات أخرى. لم يكن لدى الباقي خبرة كافية لسد الفجوة في الريادة التقنية ، وأصبح من الصعب على نحو متزايد العثور على مهندسين ذوي خبرة يتمتعون بخبرة C ++ مناسبة ممن يرغبون في تطوير الأجهزة المحمولة.
نتيجة لذلك ، واجهنا نقصًا حقيقيًا في المعرفة الأساسية للحفاظ على قاعدة كود C ++. بقي خياران فقط ، وكان كل منهما يتطلب بذل جهود كبيرة:
- ابحث عن المرشحين ووظفهم مع مجموعة محددة جدًا من المهارات (حاولنا دون جدوى لمدة عام).
- تدريب مطوري الأجهزة المحمولة الخاصة بك (أو C ++) ، وهو أمر يكاد يكون من المستحيل القيام به في غياب كبار السن مع مجموعة المهارات المناسبة لاستكمال التدريب. حتى عندما لم تكن المجموعة الرئيسية قد تفرقت بعد ، فإن مطوري الأجهزة المحمولة لا يهتمون عادة بـ C ++ ، لذا فإن العثور على أشخاص يتعلمون يمثل مشكلة كبيرة أيضًا.
بالإضافة إلى التوظيف ، أدى إصدار كومة التقنية الخاصة بها إلى خلق مشكلة استبقاء - لم يرغب مطورو الهواتف المحمولة ببساطة في العمل على مشروع C ++. تسبب هذا في ترك العديد من المهندسين الموهوبين للمشروع بدلاً من الاستمرار في المعاناة مع كومة مخصصة سيئة الصيانة. بشكل عام ، فإن مجتمع مطوري الأجهزة المحمولة ديناميكي للغاية - تظهر التقنيات والنماذج الجديدة بشكل متكرر ويتم تنفيذها بسرعة. كبار المهندسين يحبون الحفاظ على مهاراتهم محدثة.
المنتج الناضج مع رصة قياسية ليس من السهل تحديثه. أنت تضحي بالجدة من أجل الاستقرار. تزداد هذه المشكلة بشكل كبير إذا قمت بحبس نفسك في مكدس مخصص خارج النظام البيئي المحمول الأوسع.
استنتاج
مرة واحدة ، بدا أن كتابة التعليمات البرمجية مرة واحدة لمنصات مختلفة كانت كبيرة ، ولكن التكاليف المرتبطة بها تفوقت على مزاياه (التي كانت في أي حال أقل من المتوقع). في النهاية ، لم نعد نستخدم قاعدة الشفرة الشائعة من خلال C ++ (أو أي طريقة أخرى غير قياسية) ، ولكننا نكتب الشفرة بلغاتنا الأم لكل نظام أساسي.
بالإضافة إلى ذلك ، نريد أن يشعر مهندسونا بالرضا وأن يكونوا قادرين على المساهمة في المجتمع. هذا هو السبب في أننا قررنا جعل ممارساتنا متوافقة مع معايير الصناعة.