Débutant ou confirmé? Comment embaucher un développeur mobile pour iOS qui sait vraiment comment

Le développement mobile est une cuisine spéciale, et elle a ses propres nuances. C'est pourquoi les entretiens avec les candidats au département de développement pour iOS devraient avoir lieu avec un certain parti pris. Aujourd'hui, nous allons vous dire comment les développeurs mobiles d'Acronis sont embauchés et quelles curiosités se produisent lors des entretiens, lorsque le demandeur pense qu'il suffit de se souvenir de quelques mots intelligents, puis «essayons de comprendre.»

image

Pour commencer, il y a littéralement deux ans, le développement mobile pour iOS a acquis son propre goût unique, et cela est dû à l'émergence d'un langage tel que Swift. Un langage nouveau et moderne avec un bon paradigme et aussi avec une équipe de développement très forte a été immédiatement apprécié par les développeurs les plus proactifs. Mais son principal avantage est qu'Apple pariera sur Swift, et cela est confirmé par les déclarations de Tim Cook faites publiquement. Par conséquent, un entretien prenant en compte les spécificités de la connaissance Swift semble une étape logique.

Cependant, toutes les entreprises ne posent généralement pas de questions sur Swift lors des entretiens. Avant de rejoindre Acronis, j'ai moi-même eu des entretiens dans diverses entreprises et presque personne n'a posé de questions sur Swift. Cela m'a paru très étrange, car, évidemment, le développement mobile va dans ce sens.

Le problème est peut-être que de nombreux développeurs de la dernière génération "s'assoient" sur Objective-C et ne veulent pas s'éloigner des paradigmes familiers. Mais ce langage est en retard sur les méthodes de développement modernes, Apple ne le développe pas et il a également beaucoup de règles obsolètes, telles que l'envoi de messages à des objets nuls et à un système de type dynamique. Ils sont difficiles à prendre en compte lors de l'écriture de code et lors du débogage. Avec le passage à Swift, vous pourriez éviter de nombreuses difficultés.

Quelques mots sur Swift


Apple a introduit le langage en 2014 comme contrepoids à Objective-C. Le novice a immédiatement montré plusieurs avantages. Par exemple, Swift ne nécessite pas deux fichiers, une excellente sécurité linguistique, un travail unique avec les génériques, un modèle bien développé de types de données et la répartition des méthodes. Ce langage peut être appelé en toute sécurité plus lisible en raison de la syntaxe simplifiée et pratique.

Au cours du processus de développement sur Swift, la disponibilité d'un environnement d'expérimentation spécial appelé Playground aide beaucoup, dont l'utilisation dans les interviews sera discutée ci-dessous.

Enfin, le nouveau langage est prometteur car la vitesse de développement est beaucoup plus élevée que sur Objective-C et C ++. Il facilite la correction des bogues et, en général, le développement Swift est moins cher, plus efficace et plus prometteur que Objective-C. Par conséquent, nous recherchons délibérément des spécialistes ayant une expérience de la «communication» dans cette langue.

Développeurs et simulateurs


Bien sûr, vous pouvez embaucher un diplômé universitaire ou même un stagiaire, après l'avoir formé au processus de réussite. Mais si vous recherchez un spécialiste qui a déjà de l'expérience, l'écart entre l'expérience déclarée et les connaissances réelles semble très étrange. Par exemple, le demandeur prétend avoir «développé sur Swift pendant trois ans» et ne connaît pas encore les bases de la langue. Cela est peut-être dû au désir d'obtenir un emploi bien rémunéré, car aujourd'hui, la demande de développeurs pour iOS est assez élevée. Pour éliminer ces candidats, nous menons des entretiens spécialement pensés qui ont déjà rencontré des «experts» qui:

  • écrire le code exactement selon des exemples de vidéos YouTube;
  • copier le code de GitHub sans aucune modification;
  • écrivez à un ami dans Telegram et demandez comment résoudre un problème élémentaire;
  • «Aller aux toilettes» ou «appeler d'urgence» après l'annonce des conditions de la tâche.

Le fait d'une compétence insuffisante peut être détecté si le code est utilisé directement pendant l'entretien. Dans différentes entreprises, il est habituel de poser des questions avec des notes sur un tableau, sur un morceau de papier, sur un morceau de papier ou simplement à l'oreille. Mais au final, le développeur écrit le code sur l'ordinateur, et pourquoi ne pas voir comment il exécute ses tâches immédiates en direct?

Par exemple, notre spécialiste prend un ordinateur portable et propose au candidat de commencer à créer sur le Playground - dans cet environnement linguistique Swift très spécial. Dans Playground, vous pouvez simplement exécuter le code «tel quel» et regarder les résultats de son travail. C'est pratique et fait gagner du temps (après tout, un maximum de 2 heures est alloué pour un entretien technique). Alors qu'en C ++, vous devez créer un projet, l'enregistrer quelque part, le configurer, Playground vous permet d'exécuter du code sans problèmes supplémentaires. Par conséquent, Playground a fait ses preuves comme outil d'interview, au moins dans Acronis.

Cinq tours ... entretiens d'embauche


Pour savoir si le candidat peut commencer à travailler immédiatement après l'entretien, nous posons les cinq questions pratiques suivantes:

1. Différences entre le type de référence et le type de valeur


Les développeurs mobiles pour iOS sont bien conscients que le langage a différents types de variables. Ils sont divisés en deux types principaux. À savoir, certains sont transmis par référence - type de référence (type de référence), tandis que d'autres - par valeur - type de valeur (type de valeur). Dans une interview, nous demandons quelle est la différence entre une structure (struct) et une classe (classe). La structure est un type de valeur et la classe est un type de référence. Hélas, tout le monde ne répond pas à une telle question, et certains candidats sont même intéressés par "pourquoi une question si étrange au tout début?" Mais si vous y réfléchissez, la question n'est pas du tout étrange, surtout si vous prévoyez de développer sur Swift.

Pendant l'initialisation et l'affectation, les instances de type de référence commencent à se référer à la même zone en mémoire et, par conséquent, partagent la même valeur entre elles, et dans le cas du type de valeur, les données sont copiées et les objets commencent à se référer à différentes zones de mémoire, et ils ne partagent pas de significations entre eux. A strictement parler, dans le cas du type valeur, le principe de la copie sur écriture fonctionne. Autrement dit, jusqu'à la tentative de modification de la valeur, les instances du type de valeur se réfèrent à la même adresse et la première modification est copiée. De toute évidence, une compréhension de cela est nécessaire pour le développeur. Le code peut se comporter complètement différemment pour les classes et les structures. Mais connaître les différences ne suffit pas. Le deuxième niveau de sensibilisation est la différence dans l'écriture de code. Il s'avère que l'écriture dans Playground et la démonstration des différences de travail avec le type de référence et le type de valeur ne sont pas si faciles si vous n'avez pas d'expérience en programmation dans Swift. Nous n'avons que 1 candidat sur 3 réussi ce test.

Pour les curieux, les différences ont été bien mises en évidence lors de la WWDC , et également discutées en détail dans la documentation et le blog .

2. Qu'est-ce que la programmation orientée protocole?


En programmation, il est impossible de se passer d'interfaces. Apple utilise le terme protocole dans ses langues. Les protocoles peuvent résoudre le problème de l'héritage multiple. Programmation orientée protocole Apple a présenté le public il y a plusieurs années lors d'une conférence de la WWDC avec Swift, soulignant leur importance pour la langue. Par exemple, un indicateur important pour l'utilisation de protocoles est le fait que la langue n'a pas un niveau d'accès protégé aux champs.

Il est entendu que le polymorphisme doit être réalisé en utilisant des protocoles, pas l'héritage. Bien que la programmation orientée protocole soit plus susceptible d'être commercialisée, en réponse à cette question, nous nous attendons à ce que le programmeur parle des caractéristiques des protocoles et soit capable de créer un protocole dans l'aire de jeux. En substance, trois lignes sont nécessaires pour décrire un protocole. Hélas, dans le développement mobile, les gens ne comprennent souvent pas le but des protocoles, et ils ne peuvent même pas le faire. Et nous attendons quelque chose de simple, par exemple:

protocol Developer { func readManual() var name: String { get } } 

De plus, il existe des protocoles réguliers et des protocoles génériques qui fonctionnent avec les types associatifs. Et, en fait, ils sont proches des modèles en C ++. Les protocoles génériques sont des choses abstraites et spécifiques qui sont très rarement utilisées dans la programmation conventionnelle. Ils sont nécessaires pour écrire des bibliothèques internes (et c'est ce qu'Apple utilise lui-même) ou des bibliothèques où vous devez utiliser un haut degré d'abstraction. Il est bon que le demandeur le sache. Un lien et deux .

3. Travailler avec la mémoire


IOS possède son propre système de mémoire, qui utilise le comptage des références. Il y a deux approches dans Swift. Il s'agit du comptage manuel de référence (MRC) et du comptage automatique de référence (ARC). Le comptage manuel des références est utilisé pour les opérations de mémoire directe, mais ARC est généralement utilisé. En particulier, il est important pour le développeur de comprendre la différence entre les liens forts et les liens faibles. C'est un point important pour les langues où il n'y a pas de garbage collector. Voici un e-mail intéressant expliquant pourquoi Swift n'utilise pas Garbage Collector.

En fait, tout n'est pas si compliqué ici - vous devez parler du compteur de référence, que l'objet est supprimé lorsque le compteur atteint 0 (zéro), etc. Mais encore une fois, nous avons besoin d'une personne pour donner l'exemple sur le Playground. Et ici, une partie des candidats est stupéfaite. Même si quelques phrases sur les liens forts et faibles ont été apprises avec succès, à ce stade, il devient évident si la personne n'a pas eu une pratique normale de codage Swift.

 //  var slimer: Ghost? = Ghost(name: "Slimer") //   ,    weak var weakSlimer = slimer //   ,   let strongSlimer = slimer //    slimer = nil 

4. Travailler avec des fermetures


En Java, C ++ il y a des lambdas, en Objective-C il y a des blocs, dans de nombreux langages il y a des constructions correspondant au concept de fermeture dans Swift. Mais les candidats ne peuvent souvent pas expliquer comment gérer la fermeture, car pour cela, vous devez comprendre comment travailler avec la mémoire et le système d'interconnexions des variables internes et externes. Donc, vous devez bien connaître les formats de données standard, la gestion de la mémoire et d'autres problèmes connexes. Si la création d'une fermeture dans le code n'est pas particulièrement difficile pour le demandeur:

 let completionHanlder: () -> Void = { print("Success") } 

Par exemple, dire quel type - valeur ou référence - est une fermeture est déjà une tâche assez difficile. En fait, la fermeture est un type de référence. Et c'est d'ici qu'apparaissent les fameuses constructions de [soi faible] .

 let completionHanlder: () -> Void = { [weak self] in self?.close() } 

Pour tester les compétences des candidats, nous avons préparé un modèle dans le Playground. Ci-dessous, vous pouvez voir un tableau qui change différemment dans deux threads. Et vous devez répondre à l'effet que cela créera dans l'application. La compréhension du processus dans ce cas reflète la capacité à travailler avec des variables et à les transférer entre différents objets.

 //: 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 

Un exemple est tiré d'ici .

5. Écrivez une application simple


Tout développeur doit pouvoir lancer un projet. Nous donnons une tâche simple pour cela - développer une application pour iOS qui affiche simplement le site Acronis. Pour un programmeur qui a vraiment fait quelque chose sur Swift, une telle tâche nécessitera 10-15 minutes, ce qui va essentiellement dans la définition des paramètres et la vérification.

Si cette étape est franchie, la tâche devient plus compliquée, comme cela arrive généralement dans la vie: «un chef de produit arrive qui change les conditions et doit être amélioré d'urgence». En effet, c'est ainsi que se construit la pratique quotidienne de tout programmeur. Il est intéressant de voir comment une personne modifie le code en fonction de nouvelles conditions. Dans notre tâche de test simple, nous passons par plusieurs itérations, par exemple:

  • Ajouter une navigation dans l'application
  • Faites un choix entre plusieurs sites
  • Ajouter une architecture
  • Écrivez plus abstraitement

En observant un tel travail de manière interactive, vous pouvez découvrir comment une personne utilise la documentation, GitHub et d'autres ressources.

Bien sûr, cela est loin de toutes les questions qui sont posées lors de l'entretien, mais nos candidats doivent d'abord faire face à la solution de ces tâches de base.

Conclusion


Une interview interactive vous permet de voir le comportement réel du développeur, y compris ses compétences générales et sa capacité à communiquer avec les managers. Et tous les experts qui viennent chez nous ne réussissent même pas une partie des tests.

Nous sommes ouverts à la coopération et attendons notre équipe de développeurs talentueux.

Si vous souhaitez travailler dans le développement mobile Acronis, je vous recommande de pratiquer la programmation Swift.

Et nous, en attendant, préparerons une série d'articles sur notre expérience de travail avec ce langage de programmation.

Abonnez-vous à notre blog pour ne rien manquer.

Compétition


Une application dont le code source est stocké sur Github plante au démarrage.

Tâche: il est nécessaire de créer une pull request avec la correction de la cause du crash.

La première personne à faire cette demande avec la correction d'erreur recevra un prix - Power Bank et la licence annuelle d' Acronis True Image 2018 avec 1 To de stockage cloud.

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


All Articles