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

بادئ ذي بدء ، حرفيا قبل عامين ، اكتسب تطوير الأجهزة المحمولة لنظام iOS مذاقه الفريد الخاص به ، ويرجع ذلك إلى ظهور لغة مثل Swift. تم تقدير لغة جديدة وحديثة ذات نموذج جيد وأيضًا مع فريق تطوير قوي جدًا على الفور من قبل المطورين الأكثر استباقية. لكن ميزته الرئيسية هي أن شركة آبل ستراهن على Swift ، وهذا ما تؤكده تصريحات تيم كوك التي تم الإعلان عنها علنًا. لذلك ، يبدو أن إجراء المقابلات مع مراعاة تفاصيل المعرفة السويفتية خطوة منطقية.
ومع ذلك ، لا تطرح جميع الشركات بشكل عام أسئلة حول Swift في المقابلات. قبل الانضمام إلى Acronis ، أجريت بنفسي مقابلات في شركات مختلفة ، ولم يسأل أحد تقريبًا عن Swift. بدا الأمر غريباً للغاية بالنسبة لي ، حيث من الواضح أن تطوير الهاتف المحمول يسير في هذا الاتجاه.
ربما تكون المشكلة هي أن العديد من مطوري الجيل الأخير "يجلسون" على Objective-C ولا يريدون الابتعاد عن النماذج المألوفة. لكن هذه اللغة متخلفة عن طرق التطوير الحديثة ، ولا تطورها Apple ، ولديها أيضًا الكثير من القواعد القديمة ، مثل إرسال الرسائل إلى كائنات لا شيء ونظام نوع ديناميكي. يصعب النظر إليها عند كتابة التعليمات البرمجية وأثناء تصحيح الأخطاء. مع التبديل إلى Swift ، يمكنك تجنب العديد من الصعوبات.
بضع كلمات حول Swift
قدمت Apple اللغة في عام 2014 كثقل موازن لـ Objective-C. أظهر المبتدئ على الفور عدة مزايا. على سبيل المثال ، لا يتطلب Swift ملفين ، أمان لغوي ممتاز ، عمل فريد من نوعه مع الأدوية العامة ، نموذج مطور جيدًا لأنواع البيانات وإرسال الطريقة. يمكن تسمية هذه اللغة بأمان أكثر قابلية للقراءة بسبب البنية المبسطة والملائمة.
أثناء عملية التطوير على Swift ، يساعد توفر بيئة تجربة خاصة تسمى Playground كثيرًا ، وسيتم مناقشة استخدامها في المقابلات أدناه.
وأخيرًا ، فإن اللغة الجديدة واعدة لأن سرعة التطوير أعلى بكثير من Objective-C و C ++. إنه يسهل إصلاح الأخطاء ، وبشكل عام ، يعد تطوير Swift أرخص وأكثر كفاءة واعدة من Objective-C. لذلك ، نحن نبحث عن عمد عن متخصصين لديهم خبرة في "التواصل" بهذه اللغة.
المطورين والمحاكاة
بالطبع ، يمكنك توظيف خريج جامعي أو حتى متدرب ، بعد أن دربه في عملية اجتياز الممارسة. ولكن إذا كنت تبحث عن أخصائي لديه خبرة بالفعل ، فإن التناقض بين التجربة المعلنة والمعرفة الحقيقية يبدو غريبًا جدًا. على سبيل المثال ، يدعي مقدم الطلب أنه كان "يتطور على Swift لمدة ثلاث سنوات" ، ولا يعرف أساسيات اللغة. ربما يرجع ذلك إلى الرغبة في الحصول على وظيفة بأجر جيد ، لأن الطلب اليوم على المطورين لنظام iOS مرتفع جدًا. للتخلص من هؤلاء المرشحين ، نجري مقابلات مدروسة خصيصًا عبر "الخبراء" الذين:
- كتابة الرمز بالضبط وفقًا لأمثلة فيديو YouTube ؛
- نسخ التعليمات البرمجية من GitHub دون أي تغييرات على الإطلاق ؛
- اكتب إلى صديق في Telegram واسأل عن كيفية حل مشكلة أولية ؛
- "اذهب إلى المرحاض" أو "اتصل بسرعة" بعد الإعلان عن شروط المهمة.
يمكن الكشف عن حقيقة الكفاءة غير الكافية إذا تم استخدام الرمز مباشرة أثناء المقابلة. في الشركات المختلفة ، من المعتاد طرح أسئلة مع ملاحظات على لوح ، أو على قطعة من الورق ، أو على قطعة من الورق ، أو عن طريق الأذن فقط. ولكن في النهاية ، يكتب المطور الرمز على الكمبيوتر ، ولماذا لا يرى كيف يقوم بمهامه المباشرة مباشرة؟
على سبيل المثال ، يأخذ المتخصص لدينا جهاز كمبيوتر محمول ويقدم للمتقدم البدء في الإنشاء في الملعب - في بيئة لغة Swift الخاصة جدًا. في Playground ، يمكنك ببساطة تشغيل الكود "كما هو" وإلقاء نظرة على نتائج عمله. هذا مريح ويوفر الوقت (بعد كل شيء ، يتم تخصيص ساعتين كحد أقصى لإجراء مقابلة فنية). بينما تحتاج في C ++ إلى إنشاء مشروع ، وحفظه في مكان ما ، وتكوينه ، يسمح لك Playground بتنفيذ التعليمات البرمجية دون مشاكل إضافية. لذلك ، أثبت Playground نفسه كأداة مقابلة ، على الأقل في Acronis.
خمس لفات ... مقابلات عمل
لمعرفة ما إذا كان بإمكان مقدم الطلب بدء العمل فورًا بعد المقابلة ، نطرح الأسئلة العملية الخمسة التالية:
1. الفروق بين نوع المرجع ونوع القيمة
يدرك مطورو الهواتف المحمولة لنظام iOS جيدًا أن اللغة تحتوي على أنواع مختلفة من المتغيرات. وهي مقسمة إلى نوعين رئيسيين. على وجه التحديد ، يتم تمرير بعضها عن طريق المرجع - نوع المرجع (نوع المرجع) ، بينما البعض الآخر - حسب نوع القيمة - القيمة (نوع القيمة). في مقابلة ، نسأل ما هو الفرق بين هيكل (هيكل) وفئة (فئة). البنية نوع قيمة ، والفئة هي نوع مرجعي. للأسف ، لا يجيب الجميع على مثل هذا السؤال ، وحتى بعض المرشحين مهتمون بـ "لماذا هذا السؤال الغريب في البداية؟" ولكن إذا فكرت في الأمر ، فإن السؤال ليس غريبًا على الإطلاق ، خاصة إذا كنت تخطط للتطوير على Swift.
أثناء التهيئة والتعيين ، تبدأ مثيلات النوع المرجعي في الإشارة إلى نفس المنطقة في الذاكرة ، ونتيجة لذلك ، تشترك في نفس القيمة فيما بينها ، وفي حالة نوع القيمة ، يتم نسخ البيانات ، وتبدأ الكائنات في الإشارة إلى مناطق ذاكرة مختلفة ، ولا يشتركون في المعاني فيما بينهم. بصرامة ، في حالة نوع القيمة ، مبدأ أعمال النسخ عند الكتابة. أي ، حتى محاولة تغيير القيمة ، ستشير مثيلات نوع القيمة إلى نفس العنوان ، وسيتم نسخ التغيير الأول. من الواضح أن فهم هذا أمر ضروري للمطور. يمكن أن تتصرف التعليمات البرمجية بشكل مختلف تمامًا للفئات والهياكل. لكن مجرد معرفة الاختلافات لا يكفي. المستوى الثاني من الوعي هو الفرق في كتابة التعليمات البرمجية. اتضح أن الكتابة في Playground وإظهار الاختلافات في العمل مع نوع المرجع ونوع القيمة ليست سهلة للغاية إذا لم تكن لديك خبرة في البرمجة في Swift. لدينا 1 فقط من بين 3 مرشحين يجتازون هذا الاختبار.
للفضول ، تم عرض الاختلافات بشكل جيد في
WWDC ، كما تمت مناقشتها بالتفصيل في
الوثائق والمدونة .
2. ما هي البرمجة الموجهة للبروتوكول؟
في البرمجة ، من المستحيل الاستغناء عن الواجهات. تستخدم Apple مصطلح البروتوكول في لغاتها. يمكن للبروتوكولات حل مشكلة الميراث المتعدد. قدمت شركة Apple البرمجة الموجهة للبروتوكول للجمهور منذ عدة سنوات في مؤتمر
WWDC مع Swift ، مؤكدة على أهميتها للغة. على سبيل المثال ، مؤشر مهم لاستخدام البروتوكولات هو حقيقة أن اللغة ليس لديها مستوى محمي من الوصول إلى الحقول.
من المفهوم أنه يجب تحقيق تعدد الأشكال باستخدام البروتوكولات ، وليس الميراث. وعلى الرغم من أن البرمجة الموجّهة بالبروتوكول هي في الغالب عملية تسويق ، إلا أننا استجابة لمثل هذا السؤال نتوقع أن يبدأ المبرمج في الحديث عن ميزات البروتوكولات وأن يكون قادرًا على إنشاء بروتوكول في Playground. في الجوهر ، هناك حاجة لثلاثة أسطر لوصف بروتوكول. للأسف ، في تطوير الأجهزة المحمولة ، لا يفهم الأشخاص غالبًا الغرض من البروتوكولات ، ولا يمكنهم حتى القيام بذلك. ونحن ننتظر شيئًا بسيطًا ، على سبيل المثال:
protocol Developer { func readManual() var name: String { get } }
بالإضافة إلى ذلك ، هناك بروتوكولات منتظمة ، وهناك بروتوكولات عامة تعمل مع الأنواع الترابطية. وفي الواقع ، هم قريبون من القوالب في C ++. البروتوكولات العامة هي أشياء مجردة ومحددة نادرا ما تستخدم في البرمجة التقليدية. إنها ضرورية لكتابة مكتبات داخلية (وهذا ما تستخدمه Apple نفسها) أو مكتبات حيث تحتاج إلى استخدام درجة عالية من التجريد. من الجيد أن يعرف مقدم الطلب بذلك. رابط
واحد واثنين .
3. العمل مع الذاكرة
لدى IOS نظام ذاكرة خاص بها ، والذي يستخدم العد المرجعي. هناك طريقتان في Swift. هذه هي العد المرجعي اليدوي (MRC) والعد المرجعي التلقائي (ARC). يستخدم العد المرجعي اليدوي لعمليات الذاكرة المباشرة ، ولكن عادةً ما يتم استخدام ARC. على وجه الخصوص ، من المهم للمطور أن يفهم الفرق بين الروابط القوية والروابط الضعيفة. هذه نقطة مهمة لتلك اللغات حيث لا يوجد جامع القمامة. إليك رسالة
بريد إلكتروني مثيرة للاهتمام حول سبب عدم استخدام Swift جامع القمامة.
في الواقع ، كل شيء ليس معقدًا للغاية هنا - تحتاج إلى التحدث عن العداد المرجعي ، بحيث يتم حذف الكائن عندما يصل العداد إلى 0 (صفر) ، وهكذا. ولكن مرة أخرى ، نحتاج إلى شخص ليضرب مثالاً في الملعب. وهنا جزء من المتقدمين لديهم ذهول. حتى إذا تم تعلم بضع عبارات حول الروابط القوية والضعيفة بنجاح ، في هذه المرحلة يصبح من الواضح إذا لم يكن الشخص لديه ممارسة ترميز Swift عادية.
// var slimer: Ghost? = Ghost(name: "Slimer") // , weak var weakSlimer = slimer // , let strongSlimer = slimer // slimer = nil
4. العمل مع الإغلاق
في Java ، C ++ هناك lambdas ، في Objective-C هناك كتل ، في العديد من اللغات هناك تصميمات تتوافق مع مفهوم الإغلاق في Swift. لكن المتقدمين لا يستطيعون في كثير من الأحيان شرح كيفية التعامل مع الإغلاق ، لأنك تحتاج إلى فهم كيفية التعامل مع الذاكرة ونظام الترابط بين المتغيرات الداخلية والخارجية. لذلك - تحتاج إلى معرفة تنسيقات البيانات القياسية وإدارة الذاكرة وغيرها من القضايا ذات الصلة. إذا لم يكن إنشاء إغلاق في الرمز صعبًا بشكل خاص بالنسبة لمقدم الطلب:
let completionHanlder: () -> Void = { print("Success") }
على سبيل المثال ، إن قول أي نوع - القيمة أو المرجع - هو الإغلاق ، يعد بالفعل مهمة صعبة إلى حد ما. في الواقع ، الإغلاق هو نوع مرجعي. ومن هنا تظهر التركيبات المعروفة لـ
[الذات الضعيفة] .
let completionHanlder: () -> Void = { [weak self] in self?.close() }
لاختبار مهارات المتقدمين ، قمنا بإعداد نموذج في الملعب. أدناه يمكنك رؤية مجموعة تتغير بشكل مختلف في موضوعين. وتحتاج إلى الإجابة عن التأثير الذي سيحدثه هذا في التطبيق. يعكس فهم العملية في هذه الحالة القدرة على العمل مع المتغيرات ونقلها بين كائنات مختلفة.
//: Playground — noun: a place where people can play import Foundation import PlaygroundSupport let queue = DispatchQueue.global() var employees = ["Bill", "Bob", "Joe"] queue.async { let count = employees.count for index in 0 ..< count { print("\(employees[index])") Thread.sleep(forTimeInterval: 1) } } queue.async { Thread.sleep(forTimeInterval: 0.5) print("remove") employees.remove(at: 0) } PlaygroundPage.current.needsIndefiniteExecution = true
تم أخذ مثال
من هنا .
5. كتابة تطبيق بسيط
يجب أن يكون أي مطور قادرا على إطلاق مشروع. نعطي مهمة بسيطة لهذا - لتطوير تطبيق لنظام iOS يعرض ببساطة موقع Acronis. بالنسبة للمبرمج الذي قام بالفعل بشيء ما على Swift ، فإن هذه المهمة تتطلب 10-15 دقيقة ، والتي تذهب في الأساس إلى ضبط الإعدادات والتحقق.
إذا مرت هذه المرحلة ، تصبح المهمة أكثر تعقيدًا ، كما يحدث عادة في الحياة: "يصل مدير المنتج الذي يغير الشروط ويحتاج إلى التحسين بشكل عاجل". في الواقع ، هذه هي الطريقة التي يتم بها بناء الممارسة اليومية لأي مبرمج. من المثير للاهتمام أن نرى كيف يغير الشخص الرمز وفقًا للظروف الجديدة. في مهمتنا التجريبية البسيطة ، نمر بالعديد من التكرارات ، على سبيل المثال:
- أضف التنقل داخل التطبيق
- قم بالاختيار بين مواقع متعددة
- أضف العمارة
- اكتب بشكل أكثر تجريدية
بملاحظة هذا العمل بشكل تفاعلي ، يمكنك معرفة كيفية استخدام الشخص للتوثيق ، و GitHub ، والموارد الأخرى.
بالطبع ، هذا أبعد ما يكون عن جميع الأسئلة التي تطرح خلال المقابلة ، ولكن يجب على مرشحينا التعامل أولاً وقبل كل شيء مع حل هذه المهام الأساسية.
الخلاصة
تتيح لك المقابلة التفاعلية رؤية السلوك الحقيقي للمطور ، بما في ذلك مهاراته الناعمة وقدرته على التواصل مع المديرين. ولا يجتاز جميع الخبراء الذين يأتون إلينا حتى جزءًا من الاختبارات.
نحن
منفتحون على التعاون وننتظر فريقنا من المطورين الموهوبين.
إذا كنت ترغب في العمل في تطوير Acronis للهواتف المحمولة ، فإنني أوصيك بممارسة برمجة Swift.
وفي الوقت نفسه ، سنقوم بإعداد سلسلة من المنشورات حول تجربتنا في العمل مع لغة البرمجة هذه.
اشترك في مدونتنا حتى لا تفوت أي شيء.
المنافسة
تعطل تطبيق تم تخزين
رمز مصدره على Github عند بدء التشغيل.
المهمة: من الضروري إنشاء طلب سحب بتصحيح سبب التحطم.
أول شخص يقوم بهذا الطلب مع تصحيح الخطأ سيحصل على جائزة - Power Bank والترخيص السنوي لـ
Acronis True Image 2018 مع 1 تيرابايت من التخزين السحابي.