Anfänger oder erfahren? Wie man einen mobilen Entwickler für iOS anstellt, der wirklich weiß wie

Mobile Entwicklung ist eine spezielle Küche und hat ihre eigenen Nuancen. Aus diesem Grund sollten Interviews mit Kandidaten für die Entwicklungsabteilung für iOS mit einer gewissen Tendenz stattfinden. Heute werden wir Ihnen erzählen, wie die mobilen Entwickler von Acronis eingestellt werden und welche Kuriositäten während der Interviews auftreten, wenn der Bewerber der Meinung ist, dass es ausreicht, sich an ein paar kluge Worte zu erinnern, und dann „lass es uns herausfinden“.

Bild

Zunächst hat die mobile Entwicklung für iOS vor buchstäblich zwei Jahren ihren eigenen einzigartigen Geschmack erlangt, und dies ist auf die Entstehung einer Sprache wie Swift zurückzuführen. Eine neue und moderne Sprache mit einem guten Paradigma und einem sehr starken Entwicklungsteam wurde von den proaktivsten Entwicklern sofort geschätzt. Der Hauptvorteil besteht jedoch darin, dass Apple auf Swift setzt. Dies wird durch die öffentlich gemachten Aussagen von Tim Cook bestätigt. Daher scheint es ein logischer Schritt zu sein, Interviews unter Berücksichtigung der Besonderheiten des Swift-Wissens zu führen.

Im Allgemeinen stellen jedoch nicht alle Unternehmen in Interviews Fragen zu Swift. Bevor ich zu Acronis kam, hatte ich selbst Interviews bei verschiedenen Unternehmen, und fast niemand fragte nach Swift. Es kam mir sehr seltsam vor, da sich die mobile Entwicklung offensichtlich in diese Richtung bewegt.

Vielleicht liegt das Problem darin, dass viele Entwickler der letzten Generation auf Objective-C "sitzen" und sich nicht von bekannten Paradigmen entfernen wollen. Diese Sprache bleibt jedoch hinter den modernen Entwicklungsmethoden zurück, Apple entwickelt sie nicht und es gibt auch viele veraltete Regeln, wie das Senden von Nachrichten an keine Objekte und ein dynamisches Typsystem. Sie sind beim Schreiben von Code und beim Debuggen schwer zu berücksichtigen. Mit der Umstellung auf Swift können Sie viele Schwierigkeiten vermeiden.

Ein paar Worte zu Swift


Apple führte die Sprache 2014 als Gegengewicht zu Objective-C ein. Der Anfänger zeigte sofort mehrere Vorteile. Zum Beispiel benötigt Swift keine zwei Dateien, ausgezeichnete Sprachsicherheit, einzigartige Arbeit mit Generika, ein gut entwickeltes Modell für Datentypen und Methodenversand. Diese Sprache kann aufgrund der vereinfachten und praktischen Syntax sicher als besser lesbar bezeichnet werden.

Während des Entwicklungsprozesses auf Swift hilft die Verfügbarkeit einer speziellen Experimentierumgebung namens Playground sehr, deren Verwendung in Interviews weiter unten erläutert wird.

Schließlich ist die neue Sprache vielversprechend, da die Entwicklungsgeschwindigkeit viel höher ist als bei Objective-C und C ++. Es macht es einfacher, Fehler zu beheben, und im Allgemeinen ist die Swift-Entwicklung billiger, effizienter und vielversprechender als Objective-C. Deshalb suchen wir bewusst Spezialisten, die Erfahrung in der „Kommunikation“ in dieser Sprache haben.

Entwickler und Simulatoren


Natürlich können Sie einen Universitätsabsolventen oder sogar einen Praktikanten einstellen, der ihn im Prozess des Bestehens der Praxis geschult hat. Wenn Sie jedoch einen Spezialisten suchen, der bereits Erfahrung hat, sieht die Diskrepanz zwischen der deklarierten Erfahrung und dem tatsächlichen Wissen sehr seltsam aus. Zum Beispiel behauptet der Antragsteller, sich „drei Jahre lang auf Swift entwickelt zu haben“ und kennt die Grundlagen der Sprache noch nicht. Vielleicht liegt das an dem Wunsch, einen gut bezahlten Job zu bekommen, denn heute ist die Nachfrage nach Entwicklern für iOS ziemlich hoch. Um solche Kandidaten auszusortieren, führen wir speziell durchdachte Interviews durch, die bereits auf „Experten“ gestoßen sind, die:

  • Schreibe den Code genau nach YouTube-Videobeispielen.
  • Kopieren Sie den Code von GitHub ohne Änderungen.
  • Schreiben Sie einem Freund im Telegramm und fragen Sie, wie Sie ein elementares Problem lösen können.
  • "Auf die Toilette gehen" oder "dringend anrufen", nachdem die Bedingungen der Aufgabe bekannt gegeben wurden.

Die Tatsache unzureichender Kompetenz kann festgestellt werden, wenn der Code direkt während des Interviews verwendet wird. In verschiedenen Unternehmen ist es üblich, Fragen mit Notizen auf einer Tafel, auf einem Stück Papier, auf einem Stück Papier oder nur nach Gehör zu stellen. Aber am Ende schreibt der Entwickler den Code auf den Computer und warum nicht sehen, wie er seine unmittelbaren Aufgaben live ausführt?

Zum Beispiel nimmt unser Spezialist einen Laptop und bietet dem Bewerber an, auf dem Spielplatz mit dem Erstellen zu beginnen - in dieser ganz besonderen Swift-Sprachumgebung. In Playground können Sie den Code einfach so wie er ist ausführen und die Ergebnisse seiner Arbeit anzeigen. Dies ist bequem und spart Zeit (schließlich sind maximal 2 Stunden für ein technisches Interview vorgesehen). Während Sie in C ++ ein Projekt erstellen, irgendwo speichern und konfigurieren müssen, können Sie mit Playground Code ohne zusätzliche Probleme ausführen. Daher hat sich Playground zumindest in Acronis als Interview-Tool bewährt.

Fünf Runden ... Vorstellungsgespräche


Um herauszufinden, ob der Bewerber unmittelbar nach dem Vorstellungsgespräch mit der Arbeit beginnen kann, stellen wir die folgenden fünf praktischen Fragen:

1. Unterschiede zwischen Referenztyp und Werttyp


Mobile Entwickler für iOS sind sich bewusst, dass die Sprache verschiedene Arten von Variablen enthält. Sie sind in zwei Haupttypen unterteilt. Einige werden nämlich als Referenz - Referenztyp (Referenztyp) übergeben, während andere - als Wert - Werttyp (Werttyp) übergeben werden. In einem Interview fragen wir, was der Unterschied zwischen einer (Struktur-) Struktur und einer (Klassen-) Klasse ist. Die Struktur ist ein Werttyp und die Klasse ist ein Referenztyp. Leider beantwortet nicht jeder eine solche Frage, und einige der Kandidaten sind sogar daran interessiert, "warum so eine seltsame Frage am Anfang?" Aber wenn Sie darüber nachdenken, ist die Frage überhaupt nicht seltsam, besonders wenn Sie vorhaben, sich auf Swift weiterzuentwickeln.

Während der Initialisierung und Zuweisung beziehen sich Referenztypinstanzen auf denselben Bereich im Speicher und teilen daher denselben Wert untereinander. Im Fall des Werttyps werden Daten kopiert und Objekte beginnen, auf verschiedene Speicherbereiche zu verweisen. und sie teilen keine Bedeutungen untereinander. Genau genommen funktioniert beim Werttyp das Prinzip des Copy-on-Write. Das heißt, bis zum Versuch, den Wert zu ändern, beziehen sich Instanzen des Wertetyps auf dieselbe Adresse, und die erste Änderung wird kopiert. Offensichtlich ist ein Verständnis dafür für den Entwickler notwendig. Code kann sich für Klassen und Strukturen völlig anders verhalten. Aber nur die Unterschiede zu kennen, reicht nicht aus. Die zweite Bewusstseinsstufe ist der Unterschied beim Schreiben von Code. Es stellt sich heraus, dass das Schreiben auf dem Spielplatz und das Aufzeigen der Unterschiede bei der Arbeit mit dem Referenztyp und dem Werttyp nicht so einfach ist, wenn Sie keine Programmiererfahrung in Swift hatten. Wir haben nur 1 von 3 Kandidaten, die diesen Test bestehen.

Für die Neugierigen wurden die Unterschiede auf der WWDC gut gezeigt und auch in der Dokumentation und im Blog ausführlich besprochen.

2. Was ist protokollorientierte Programmierung?


Bei der Programmierung ist es unmöglich, auf Schnittstellen zu verzichten. Apple verwendet den Begriff Protokoll in seinen Sprachen. Protokolle können das Problem der Mehrfachvererbung lösen. Protokollorientierte Programmierung Apple stellte die Öffentlichkeit vor einigen Jahren auf einer WWDC- Konferenz mit Swift vor und betonte deren Bedeutung für die Sprache. Ein wichtiger Indikator für die Verwendung von Protokollen ist beispielsweise die Tatsache, dass die Sprache keinen geschützten Zugriff auf Felder hat.

Es versteht sich, dass Polymorphismus unter Verwendung von Protokollen und nicht unter Vererbung erreicht werden sollte. Obwohl protokollorientierte Programmierung eher Marketing ist, erwarten wir als Antwort auf diese Frage, dass der Programmierer über die Funktionen der Protokolle spricht und in der Lage ist, ein Protokoll auf dem Spielplatz zu erstellen. Im Wesentlichen werden drei Zeilen benötigt, um ein Protokoll zu beschreiben. Leider verstehen Menschen in der mobilen Entwicklung den Zweck der Protokolle oft nicht und können dies nicht einmal tun. Und wir warten auf etwas Einfaches, zum Beispiel:

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

Darüber hinaus gibt es reguläre Protokolle und generische Protokolle, die mit assoziativen Typen arbeiten. Tatsächlich befinden sie sich in der Nähe von Vorlagen in C ++. Generische Protokolle sind abstrakte und spezifische Dinge, die in der herkömmlichen Programmierung sehr selten verwendet werden. Sie werden zum Schreiben interner Bibliotheken (und genau das verwendet Apple selbst) oder für Bibliotheken benötigt, in denen Sie einen hohen Abstraktionsgrad verwenden müssen. Es ist gut, wenn der Antragsteller davon weiß. Ein Link und zwei .

3. Arbeiten Sie mit dem Speicher


IOS verfügt über ein eigenes Speichersystem, das die Referenzzählung verwendet. In Swift gibt es zwei Ansätze. Dies sind die manuelle Referenzzählung (MRC) und die automatische Referenzzählung (ARC). Die manuelle Referenzzählung wird für direkte Speicheroperationen verwendet, normalerweise wird jedoch ARC verwendet. Insbesondere ist es für den Entwickler wichtig, den Unterschied zwischen starken und schwachen Gliedern zu verstehen. Dies ist ein wichtiger Punkt für Sprachen, in denen es keinen Garbage Collector gibt. Hier ist eine interessante E-Mail, warum Swift Garbage Collector nicht verwendet.

Tatsächlich ist hier nicht alles so kompliziert - Sie müssen über den Referenzzähler sprechen, dass das Objekt gelöscht wird, wenn der Zähler 0 (Null) erreicht, und so weiter. Aber auch hier brauchen wir eine Person, die auf dem Spielplatz ein Beispiel gibt. Und hier hat ein Teil der Bewerber einen Stupor. Selbst wenn einige Sätze über starke und schwache Glieder erfolgreich gelernt wurden, wird in diesem Stadium offensichtlich, ob die Person keine normale Swift-Codierungspraxis hatte.

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

4. Arbeiten Sie mit Verschlüssen


In Java, C ++ gibt es Lambdas, in Objective-C gibt es Blöcke, in vielen Sprachen gibt es Konstruktionen, die dem Konzept des Abschlusses in Swift entsprechen. Bewerber können jedoch häufig nicht erklären, wie sie mit dem Schließen umgehen sollen, da Sie dazu verstehen müssen, wie Sie mit dem Speicher und dem System der Verbindung interner und externer Variablen arbeiten. Sie müssen also die Standarddatenformate, die Speicherverwaltung und andere damit verbundene Probleme gut kennen. Wenn es für den Antragsteller nicht besonders schwierig ist, einen Abschluss im Code zu erstellen:

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

Zu sagen, welcher Typ - Wert oder Referenz - ein Abschluss ist, ist bereits eine ziemlich schwierige Aufgabe. In der Tat ist der Verschluss ein Referenztyp. Und von hier aus erscheinen die bekannten Konstruktionen des [schwachen Selbst] in .

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

Um die Fähigkeiten der Bewerber zu testen, haben wir eine Vorlage auf dem Spielplatz vorbereitet. Unten sehen Sie ein Array, das sich in zwei Threads unterschiedlich ändert. Und Sie müssen antworten, welchen Effekt dies in der Anwendung hat. Das Verständnis des Prozesses in diesem Fall spiegelt die Fähigkeit wider, mit Variablen zu arbeiten und sie zwischen verschiedenen Objekten zu übertragen.

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

Ein Beispiel wird von hier genommen .

5. Schreiben Sie eine einfache Anwendung


Jeder Entwickler sollte in der Lage sein, ein Projekt zu starten. Wir geben eine einfache Aufgabe dafür - eine Anwendung für iOS zu entwickeln, die einfach die Acronis-Site anzeigt. Für einen Programmierer, der wirklich etwas mit Swift gemacht hat, dauert eine solche Aufgabe 10 bis 15 Minuten, was im Wesentlichen das Festlegen der Einstellungen und das Überprüfen umfasst.

Wenn diese Phase bestanden ist, wird die Aufgabe komplizierter, wie es normalerweise im Leben der Fall ist: „Ein Produktmanager kommt, der die Bedingungen ändert und dringend verbessert werden muss“. Auf diese Weise wird die tägliche Praxis eines jeden Programmierers aufgebaut. Es ist interessant zu sehen, wie eine Person den Code unter neuen Bedingungen ändert. In unserer einfachen Testaufgabe durchlaufen wir mehrere Iterationen, zum Beispiel:

  • In-App-Navigation hinzufügen
  • Treffen Sie eine Wahl zwischen mehreren Standorten
  • Architektur hinzufügen
  • Schreiben Sie abstrakter

Indem Sie solche Arbeiten interaktiv beobachten, können Sie herausfinden, wie eine Person Dokumentation, GitHub und andere Ressourcen verwendet.

Dies ist natürlich weit entfernt von allen Fragen, die während des Interviews gestellt werden, aber unsere Kandidaten müssen sich zunächst mit der Lösung dieser grundlegenden Aufgaben befassen.

Fazit


In einem interaktiven Interview können Sie das tatsächliche Verhalten des Entwicklers sehen, einschließlich seiner Soft Skills und der Fähigkeit, mit Managern zu kommunizieren. Und nicht alle Experten, die zu uns kommen, bestehen auch nur einen Teil der Tests.

Wir sind offen für Zusammenarbeit und warten auf unser Team talentierter Entwickler.

Wenn Sie in der mobilen Entwicklung von Acronis arbeiten möchten, empfehle ich Ihnen, die Swift-Programmierung zu üben.

In der Zwischenzeit werden wir eine Reihe von Beiträgen über unsere Erfahrungen mit dieser Programmiersprache vorbereiten.

Abonnieren Sie unseren Blog, damit Sie nichts verpassen.

Wettbewerb


Eine Anwendung, deren Quellcode auf Github gespeichert ist, stürzt beim Start ab.

Aufgabe: Sie müssen eine Pull-Anforderung erstellen, um die Ursache des Absturzes zu beheben.

Die erste Person, die diese Anfrage mit der Fehlerkorrektur stellt, erhält einen Preis - Power Bank und die jährliche Lizenz von Acronis True Image 2018 mit 1 TB Cloud-Speicher.

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


All Articles