تطوير المكتبة: من API إلى الإصدار العام

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

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

بالنسبة للجميع ، سيتم ملء القصة بقصص حقيقية من حياة فريق SpeechKit المحمول ، لذا يجب أن تكون ممتعة.


المحتويات


  • دقيقة SpeechKit .
  • تصميم واجهة برمجة تطبيقات مريحة ومفهومة تريد استخدامها.
  • التنمية . ما يجب إضافته إلى الشفرة بحيث لا تعمل فقط وتؤدي وظائف ، ولكنها تساعد المستخدمين أيضًا.
  • الإطلاق - ما لا يجب أن تنساه عند طرح الإصدار.


دقيقة SpeechKit


لن أسأل ما إذا كنت قد سمعت عن SpeechKit ، لأنه حتى داخل Yandex ، لا يعرف الجميع ما هو.

SpeechKit هو الباب لجميع تقنيات الكلام في Yandex . باستخدام هذه المكتبة ، يمكنك دمج تقنيات الكلام في التطبيق الخاص بك: التعرف على الكلام والتوليف ، التنشيط الصوتي.

ربما سمعت عن مساعد الصوت أليس - إنها تعمل فقط على أساس SpeechKit. لا يتضمن SpeechKit نفسه التعرف أو التوليف ، بل يحدث على الخادم. ولكن من خلال مكتبتنا يمكن دمج كل شيء في التطبيق.

عادة ما يأتي السؤال التالي - إذا حدث كل شيء على الخادم ، فماذا تفعل المكتبة؟ لماذا هو مطلوب؟

تقوم المكتبة بالكثير:

  1. تزامن جميع العمليات. على سبيل المثال ، باستخدام مساعد صوتي ، ينقر المستخدم على زر ، ويقول شيئًا ، ويقاطع المساعد ، ويقدم الطلبات - كل ذلك يمر عبر المكتبة. بالنسبة لمستخدم مكتبتنا ، هذه شفافة ، يجب ألا تقلق بشأن كل هذا.
  2. التواصل نظرًا لأن كل شيء يحدث على الخادم ، فأنت بحاجة إلى الحصول على البيانات من هناك ومعالجتها وإعطائها للمستخدم. يمكن لـ SpeechKit الآن الانتقال إلى عدة خوادم مختلفة داخل نفس اتصال الشبكة: أحدهما يعمل في التعرف ، والآخر في تخصيص المعنى ، والثالث في التعرف على الموسيقى ، إلخ. كل هذا مخفي داخل المكتبة ، ولا يحتاج المستخدمون إلى القلق بشأنه.
  3. العمل مع مصادر الصوت. نحن نتعامل مع الكلام البشري ، والعمل مع الصوت يحدث أيضًا داخل SpeechKit. علاوة على ذلك ، لا يمكننا الكتابة فقط من جهاز قياسي ، ولكن أيضًا استقبال البيانات من أي مكان. يمكن أن يكون ملف أو دفق - يمكننا العمل مع كل هذا.

يتم استخدام SpeechKit في الفرق الداخلية. الآن تم دمجها من قبل 16 فريق Yandex. ونعرف أيضًا عن العديد من الفرق الخارجية التي قامت بذلك أيضًا.

التصميم


دعونا نفكر في ما نعنيه بتطبيق مناسب. عادة ، هذا هو UX مدروس ومفهوم ، حل مشاكلنا ، عملية مستقرة ، إلخ.

عندما نقول أن المكتبة ملائمة ، فإننا نعني أولاً أنها تحتوي على واجهة برمجة تطبيقات سهلة الاستخدام. كيف تحقق ذلك؟

المبادئ الأساسية


هذه بعض الجوانب التي تعلمتها من تجربتي مع SpeechKit.

  • بادئ ذي بدء ، تذكر أن المستخدمين هم مطورين .

من ناحية ، هذا جيد ، لأنك لا تشرح للمستخدمين العاديين: "كما ترى ، الواجهة الخلفية معنا ، وبالتالي لا شيء يعمل ، ونحن بخير!" يمكنك شرح ذلك للمطورين - يمكنك شرح الكثير للمطورين!

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

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

تتوافق النقطة الثانية المهمة تمامًا مع النقطة الأولى.

  • يجب حظر كل شيء غير مسموح به في مكتبتك ،
    بحيث لا توجد ثغرات غير مرغوب فيها.

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

  • لا تسمح بالغموض في تفسير واجهة برمجة التطبيقات لمكتبتك.

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

واجهة برمجة تطبيقات Case SpeechKit


باستخدام SpeechKit كمثال ، سأخبرك كيف قمنا بإعادة صياغة الإصدار 2 إلى الإصدار 3. قمنا بتغيير واجهة برمجة التطبيقات كثيرًا وحاولنا استخدام جميع هذه المبادئ.

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

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

كانت عملية إعادة الهيكلة طويلة (نصف عام) ومؤلمة (كان الجميع غير سعداء) . كانت الصعوبة الرئيسية عدم أخذ جبل من التعليمات البرمجية وإعادة كتابته. كان من المستحيل ببساطة إعادة البناء ، ولكن كان من الضروري دعم جميع الإصدارات النشطة التي كانت قيد الاستخدام. لا يمكننا فقط إخبار مستخدمينا: "يا شباب ، نعم ، إنها لا تعمل من أجلك ، نعم ، أنت بحاجة إلى هذه الميزة - سنفعل كل شيء في الإصدار 3 ، يرجى الانتظار ستة أشهر!"

ونتيجة لذلك ، استغرق إعادة الهيكلة وقتًا طويلاً ، وكانت العملية مؤلمة ، وللمستخدمين أيضًا. لأنه في النهاية ، قمنا بتغيير API دون التوافق مع الإصدارات السابقة. جاءوا إليهم وقالوا: "ها هي مجموعة SpeechKit الجميلة الجديدة ، يرجى أخذها!" - أجابوا: "لا ، ليست لدينا خطط للترقية إلى الإصدار 3.0 على الإطلاق." على سبيل المثال ، كان لدينا فريق تحول إلى هذا الإصدار في غضون عام. لذلك ، دعمنا الإصدار السابق لهم لمدة عام كامل.

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

فيما يلي مثال لكيفية ظهور الطبقة الرئيسية التي تتعامل مع الاعتراف قبل إعادة البيع.

// SpeechKit v2 @interface YSKRecognizer: NSObject @property (nonatomic, strong, readonly, getter=getModel) NSString* model; @property (nonatomic, assign, getter=isVADEnabled) BOOL VADEnabled; - (instancetype)initWithLanguage:(NSString *)language model:(NSString *)m; - (void)start; - (void)cancel; - (void)cancelSync; @end @interface YSKInitializer: NSObject - (instancetype)init; - (void)dealloc; - (void)start; + (BOOL)isInitializationCompleted; @end extern NSString *const YSKInactiveTimeout; extern NSString *const YSKVADEnabled; @interface YSKSpeechKit: NSObject + (instancetype)sharedInstance; – (void)setParameter:(NSString *)name withValue:(NSString *)value; @end 

هذه فئة عادية ترث من NSObject. دعونا نفكر في كل من تفاصيله بشكل منفصل. من الواضح أنه يمكننا أن نرث منه ، ونعيد تعريف بعض الطرق فيه - كل شيء يمكن القيام به باستخدام NSObject.

ثم ، عند الإنشاء ، يتم تمرير سطرين (اللغة والنموذج) إليها. ما هذه الخطوط؟ إذا مررت بلغة "Hello، world" ، فسيكون الناتج ترجمة ، أم ماذا؟ ليس واضحا جدا.

بالإضافة إلى ذلك ، نظرًا لأن هذا هو خليفة NSObject ، فيمكننا استدعاء init ، جديد ، إلخ. ماذا سيحدث؟ هل ستعمل أم ستنتظر بعض المعلمات؟

بالطبع ، أعرف إجابات هذه الأسئلة ، وأنا أعرف هذا الرمز. لكن الناس الذين ينظرون إلى هذا للمرة الأولى لا يفهمون على الإطلاق لماذا هذا كل شيء. حتى الأساليب مع المُحدد والمقبل لا تبدو على الإطلاق كما قد تبدو عليه في iOS. طرق البدء والإلغاء وإلغاء المزامنة (والطريقة التي تلغيها للتو - هل هي المزامنة؟) - ماذا سيحدث إذا تم استدعاؤها معًا؟ الكثير من الأسئلة لهذا الرمز.

بعد ذلك يأتي الكائن الذي تحدثت عنه (YSKInitializer) ، والذي يجب أن يبدأ لكي يعمل كل شيء - إنه بشكل عام نوع من السحر. يمكن ملاحظة أن هذا الرمز كتبه المطورون الذين لا يكتبون لنظام iOS ، ولكنهم يشاركون في C ++.

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

من v3 أفضل من v2


ما الذي حصلنا عليه عندما قمنا بإعادة الهيكلة والتحول إلى الإصدار 3؟

  • واجهة برمجة تطبيقات أصلية تمامًا.

الآن بدت واجهة برمجة تطبيقات iOS الخاصة بنا مثل iOS-API ، بدت واجهة برمجة تطبيقات Android مثل Android.

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

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

أتذكر كيف جادلنا لفترة طويلة حول هذا الموضوع. يبدو لنا أنه من المهم أن يأخذ المطور رمزنا على iOS أو Android ، وستكون المباراة 99٪. لكن الأمر ليس كذلك. أفضل ، سيكون الرمز مشابهًا للمنصة التي يتم تطويرها من أجلها.

  • تهيئة بسيطة وبديهية .

هذا الكائن مطلوب - إليك إعداداته ، قم بإنشائه ، قم بتحويله - الربح! أي أنه لا توجد إعدادات عمومية مخفية تحتاج إلى نقلها إلى مكان ما.

  • نقص المكونات العالمية.

طرحنا مكونات عالمية تسبب في إرباك وخوف وتسبب في الكثير من الأسئلة حتى بين مطوري هذه المكتبة ، وليس فقط المستخدمين.

الآن تبدو نفس الفئة في الإصدار الجديد على هذا النحو (لا يزال Objective-C - لا يمكنك التبديل إلى Swift بعد ذلك).

 // SpeechKit v3 NS_ASSUME_NONNULL_BEGIN __attribute__((objc_subclassing_restricted)) @interface YSKOnlineRecognizer: NSObject<YSKRecognizing> @property (nonatomic, copy, readonly) YSKOnlineRecognizerSettings *settings; - (instancetype)initWithSettings:(YSKOnlineRecognizerSettings *)s audioSource:(id<YSKAudioSource>)as NS_DESIGNATED_INITIALIZER; + (instancetype)new __attribute__((unavailable("Use designated initializer."))); - (instancetype)init __attribute__((unavailable("Use designated initializer."))); @end NS_ASSUME_NONNULL_END @protocol YSKRecognizing <NSObject> - (void)prepare; - (void)startRecording; - (void)cancel; @end @interface YSKOnlineRecognizerSettings: NSObject<NSCopying> @property (nonatomic, copy, readonly) YSKLanguage *language; @property (nonatomic, copy, readonly) YSKOnlineModel *model; @property (nonatomic, assign) BOOL enableVAD; - (instancetype)initWithLanguage:(YSKLanguage *)l model:(YSKOnlineModel *)m NS_DESIGNATED_INITIALIZER; @end @interface YSKLanguage: YSKSetting + (instancetype)russian; + (instancetype)english; @end 

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

علاوة على ذلك ، أزلنا العمل بالصوت من هنا ، أي أن المستعد الآن ليس المكون الذي يكتب الصوت. يتعامل هذا المكون مع مشكلات التعرف ، ويمكن نقل أي مصدر هنا.

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

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

وحدات الماكرو NS_ASSUME_NONNULL_BEGIN / NS_ASSUME_NONNULL_END للتأكيد على أن هذه الإعدادات لا يمكن أن تكون خالية: لا يمكن أن يكون مصدر الصوت خاليًا - يجب أن تحتوي جميعها على قيمة معينة حتى تعمل.

كما قلت ، انتقلت أساليب البدء والإلغاء (CancelSync left) إلى بروتوكول منفصل. هناك أماكن في المكتبة حيث لا يمكنك استخدام المستفيد الخاص بنا ، ولكن في أي مكان آخر. على سبيل المثال ، نستخدم التطبيق الأصلي لشركة Apple ، والذي ينفذ هذا البروتوكول والذي يمكن من خلاله نقل مكوناتنا.

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

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

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

التنمية


بادئ ذي بدء ، يجب أن تفعل المكتبة ما كتبته من أجل - لأداء وظائفها بشكل جيد. ولكن يمكنك جعل التعليمات البرمجية الخاصة بك مكتبة جيدة حقًا. أقترح عدة ملاحظات جمعتها أثناء تطوير SpeechKit.

الرمز ليس لك وحدك


من الضروري للغاية جمع معلومات التصحيح ، لأنك لا تريد أن يقول المستخدمون أن خدمتهم لا تعمل بسبب مكتبتك.

يحتوي IOS على مستوى معلومات تصحيح يوضح المعلومات التي يجب جمعها. بشكل افتراضي ، سيجمع كل شيء يمكنه العثور عليه: كل المكالمات ، كل القيم. هذا رائع ، ولكنه كمية كبيرة جدًا من البيانات. يسمح لك إعداد -gline-tables-فقط بجمع معلومات حول المكالمات الوظيفية. هذا أكثر من كافٍ لإيجاد مشكلة وإصلاحها.

يتم تضمين هذا في إعدادات Xcode (إعدادات البناء) ، ويسمى مستوى معلومات التصحيح. على سبيل المثال ، من خلال تشغيل هذا الإعداد ، قمنا بتقليل حجم الملف الثنائي SpeechKit من 600 ميجابايت إلى 90 ميجابايت. هذه ليست معلومات ضرورية للغاية وقمنا برميها.

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

تجنب تضارب الشخصيات : أضف البادئات إلى كل ما لديك ، إلى فصولك ، إلى الفئات. إذا كانت المكتبة تحتوي على فئة UIColor + HEX ، فتأكد من أن المستخدمين لديهم نفس الفئة بالضبط ، وعندما يقومون بدمج مكتبتك ، فسوف يتلقون تعارضات في الأحرف. ومرة أخرى ، لن يرغب الجميع في إخبارك وقول ذلك.

سؤال آخر هو عندما تستخدم بنفسك مكتبات الطرف الثالث في مكتبتك. هناك بعض الفروق الدقيقة التي تستحق التذكر. أولاً ، إذا كنت تستخدم شيئًا ظهر في إصدار أقدم من مكتبتك ، فلا تنس استخدام Weak Linking (Xcode -> Build Phases -> Link Binary With Libraries -> Status قيد التشغيل). هذا يسمح لك بعدم السقوط إذا لم تكن هذه المكتبة فجأة.

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

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

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

على سبيل المثال ، في SpeechKit ، قبل الإصدار الثالث ، عملنا مع الصوت داخل المكتبة ، وقمنا بإعداد وتنشيط الجلسة الصوتية بشكل صريح. جلسة صوتية في iOS هي شيء يحتوي عليه كل تطبيق - لا تقل أنه ليس لديك واحد. يتم إنشاؤه في البداية ، وهو مسؤول عن تفاعل التطبيق وخفي وسائط النظام ، ويقول ما يريد تطبيقك القيام به مع الصوت. هذا هو كائن مفرد بالمعنى الحقيقي للكلمة. لقد أخذناها بهدوء ، وقمنا بإعدادها كما نحتاج ، ولكن هذا أدى إلى حقيقة أن المستخدمين لديهم مشاكل بسيطة مثل تغيير مستوى الصوت. هناك طريقة أخرى للجلسات الصوتية ، المسؤولة عن ضبط الإعدادات ، وهي طويلة جدًا. يستغرق حوالي 200 مللي ثانية ، وهذا تباطؤ ملحوظ في التنشيط أو التعطيل.

في الإصدار الثالث ، قمت بسحب جلسة صوتية من المكتبة. بعد ذلك ، قال جميع مستخدمي جميع الخدمات التي تم دمجها في SpeechKit إنهم غير راضين بشكل رهيب. الآن يجب أن يعرفوا أن هناك نوعًا ما من الجلسات الصوتية التي يجب تكوينها خصيصًا لـ SpeechKit.

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

نجعلها ملائمة للمستخدمين


كيف يمكنك مساعدة مستخدميك؟

  • إضافة سجلات: مستويات مختلفة ، إدراج ديناميكي .

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

  • دعم جميع إصدارات نظام تشغيل المستخدم.

تذكر أنه عندما تتحدث عن دعم الإصدار في مكتبة ، فهو ليس مثل دعم الإصدار في التطبيق العادي. في التطبيق العادي ، ننظر إلى الإحصائيات التي ، على سبيل المثال ، 2٪ فقط من مستخدمينا يستخدمون iOS 8 ، وهذا يعني أنه يمكنك التوقف عن دعم iOS 8. في المكتبة ، الأمر ليس كذلك ، هنا رفض إصدار نظام التشغيل يعني التخلي تمامًا عن المستخدم وجميع مستخدميه. قد يكون هذا نصف المستخدمين من حيث المبدأ.

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

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

  • أضف الحد الأدنى من الزيادة في الإصدارات الجديدة.

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

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

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

لا يوجد الكثير من الاختبارات


هذا صحيح لكل من التطبيق العادي والمكتبة. ولكن في حالة المكتبة مرة أخرى هناك ميزات.

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

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

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

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

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

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

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

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

إطلاق


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

سأبدأ بالإصدارات المحلية للمستخدمين داخل Yandex. المخطط هنا هو نفسه كما هو الحال في تطوير تطبيق منتظم: الإصدارات العادية أو الشهرية أو الأسبوعية.

تتكون العملية من المراحل المعتادة ، ولكن عند تطوير مكتبة ، فإن كل نقطة من هذه النقاط لها خصائصها الخاصة.

التخطيط


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

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

SpeechKit , , , . , , - . , — . , n . , . , , - .



, , : , , . Agile- .

, , , — . , . !

Scrum . , , , . . « », .

Scrum , , , — — , . . — , - . , ? , : «, , , ». , , - , , Scrum . ! , .

. , , . , . , , , , . , . .



, — , - . , , , , . , . : « 4, 3 — ». , . - , , , , .

. Continuous Integration , , , .



, . .

1. .

. - - , , , . .

. , — , , , , . , , - .

2. .

, , , — , , , , , !

. , . , , -, .

. SpeechKit . , , — , - . — , - .

, . , 4 2, , . , -, , .

. , , , .

. .


, -, . . , , , help , .

. : -, GitHub, , . — , — . , , .

, , - , , ..



, , :

  • . , . - , , .
  • . , . , OpenSource , , , , .
  • . , . , , . . SpeechKit .

الملخص


  • , API.
  • , , .
  • .
  • , - :) - , .

Yandex.SpeachKit GitHub iOS , Android , Mobile SDK.

AppsConf — — 22 23 2019 , , .

. , , .

Source: https://habr.com/ru/post/ar429912/


All Articles