Fünf berufliche Herausforderungen für angehende Java-Entwickler im Jahr 2022

Habr, hallo! Mein Name ist Daniil Pilipenko, ich bin Programmdirektor Fakultät für Backend-Entwicklung Richtung “Programmierung” Skillbox, Direktor des Zentrums für die Auswahl von IT-Spezialisten SymbioWay. Heute werden wir die praktischen Aufgaben analysieren, denen Junior-Level-Java-Entwickler während eines Interviews begegnen können. Wir sehen solche Aufgaben oft bei den Vorstellungsgesprächen unserer Kunden und Kollegen, und wir geben auch selbst Bewerber.

Was will ein Arbeitgeber?

Bei der Auswahl der Kandidaten möchte der Arbeitgeber verstehen, wie gut dieser oder jener Bewerber zu ihm passt – wie wohl er sich in Kommunikation und Arbeit fühlt, über die notwendige Erfahrung und vor allem über die technischen Fähigkeiten für die bevorstehende Stelle verfügt. Vorhin habe ich über fünf Fähigkeiten gesprochen, die oft getestet werden, wenn man sich für eine Stelle bei aufstrebenden Java-Entwicklern bewirbt. Und in diesem Artikel werde ich Beispiele für bestimmte Aufgaben geben, die bei Vorstellungsgesprächen gegeben werden können, und ich werde analysieren, worauf der Arbeitgeber bei der Lösung dieser Aufgaben achtet.

Aufgabenbeispiele

Aufgabe 1. Schreiben Sie Code, der eine einfache Aufgabe ausführt. Hier kann es bspw. Klassisches Fizzbuzz, eine Aufgabe zum Komprimieren oder Umkehren einer Zeichenfolge. Für den Arbeitgeber ist es wichtig zu verstehen, woher der Bewerber die Grundlagen der Syntax der Sprache kennt und ob er auf Anhieb sauberen Code schreiben kann. Überraschenderweise haben viele Kandidaten erhebliche Schwierigkeiten, Aufgaben dieser Art zu erledigen.

Eine der Aufgaben, die wir Bewerbern geben, besteht darin, Code zu schreiben, der Zahlen von 0 bis 1000 ausgibt, die durch 3, aber nicht durch 5 teilbar sind und deren Ziffern weniger als zehn ergeben. Die Aufgabe verursacht oft völlig undenkbare Schwierigkeiten für Menschen, die behaupten, ihr Niveau sei mittel oder sogar hochrangig. Hier sind einige Beispiele, wie Kandidaten dieses Problem in Vorstellungsgesprächen gelöst haben:

//Beispiel 1 public class TestClass { public static final int MAX_LIMIT = 1000; public static void main(String[] args) {for(int i = 0; i 0) { res += in % 10; in = in / 10; } Rückgaberes < 10; } } //Beispiel 2 public class Test { public static void main(String[] args) { for (int i = 0; i<1000; i ++) { if ( i%3 == 0 && i%5!= 0) { } } } public int returnNumber( int i) { int t; Wenn (i > 0) { returnNumber (i / 10); } } } //Beispiel 3 import java.util.List; java.util.stream.Collectors importieren; import java.util.stream.IntStream; public class TestTask { public static List getForNumber() { List list = IntStream.range(0, 1000).boxed() .filter(n -> n % 3 == 0 && n % 5 != 0) .collect(Collectors.toList()); Rückgabeliste; } public static int sumOfNubers(List list) { for (Integer n : list) { int summ; while(n>1) { Summe += n % 10; n /= 10; } } Rückgabe 0; } }

Teilen Sie uns in den Kommentaren mit, wie Sie jede dieser Lösungen bewerten und warum. Welche findet ihr am besten und welche am schlechtesten? Ich merke gleich an, dass die Lösung, die wir bei SymbioWay für ideal halten, hier nicht vorgestellt wird. Sie können auch versuchen, es in die Kommentare zu schreiben.

Mit Hilfe von Aufgaben dieser Art überprüfen wir das Niveau des Bewerbers: wie viel er den Code selbst geschrieben hat, und auch indirekt – ob er auf „schmutzigen“ Code gestoßen ist und ob er ihn umgestaltet hat. Anhand einer solchen Aufgabe sieht man indirekt, wie schnell und „sauber“ (verständlich und unterstützt) ein Spezialist seinen eigenen Code schreibt.

Aufgabe 2. Erstellen Sie eine Webanwendung basierend auf dem Spring-Framework, die einer bestimmten Spezifikation entspricht. Die Angabe kann in Textform oder als separate Swagger-Datei erfolgen. Implementieren Sie beispielsweise ein Backend für anonyme Online-Chats mit der folgenden Spezifikation:

  • GET /init – eine Initialisierungsanfrage, die anhand der Sitzungs-ID antwortet, ob der aktuelle Benutzer autorisiert ist oder nicht.

  • POST /auth ist eine Anfrage, die den Benutzer registriert und autorisiert. Es fügt den Benutzer der Datenbank hinzu und bindet an die aktuelle Sitzung.

  • Anfrageformat:

  • Name — Benutzername

  • sex – Benutzergeschlecht, M oder F

  • Antwortformat:

    { “Ergebnis”: wahr }

  • GET /users – eine Anfrage, die eine Liste der Benutzer im Chat in der Reihenfolge von den neuesten, die sich kürzlich registriert haben, bis zu den ältesten zurückgibt.

  • Anfrage ohne Parameter

  • Antwortformat:

    { “Ergebnis”: wahr, “Daten”: [
    {
    “id”: 567,
    “name”: “Alex Kurnikov”,
    “male”: “M”
    },

    ]
    }

  • GET /messages – Eine Anfrage, die einen Feed von Chat-Nachrichten von den neuesten bis zu den ältesten mit Paginierung zurückgibt.

  • Anfrageformat:

  • Offset – Offset vom spätesten zum frühesten, von 0, Standard ist 0

  • limit – Anzahl der anzuzeigenden Nachrichten, Standard ist 100

  • Antwortformat:

    { “Ergebnis”: wahr, “Anzahl”: 100, “Daten”: [

    {

    “id”: 46273,

    “time”: “18:30 30.01.2022”,

    “authorId”: 567,

    “message”: “Some HTML text, may me <b>tagged</b>”

    },

    ]

    }

  • POST /messages – eine Anfrage, die eine neue Nachricht im Namen des aktuellen Benutzers erstellt. Gestalten Sie die Anfrage- und Antwortformate anhand der verfügbaren Dokumentation nach eigenem Ermessen.

Mit Hilfe solcher Aufgaben testen wir und Arbeitgeber gleich mehrere Fähigkeiten:

  • die Fähigkeit, Webanwendungen auf dem Spring-Framework gemäß der akzeptierten Struktur korrekt zu entwerfen und zu erstellen;

  • Verständnis der Prinzipien der Client-Server-Interaktion (Kenntnisse von HTTP und des REST-Standards);

  • Fähigkeit, mit einem ORM-System (normalerweise Hibernate) und einer Datenbank zu arbeiten, die Fähigkeit, die Struktur dieser Datenbank zu entwerfen;

  • die Fähigkeit, Code in Java zu schreiben und grundlegende Fähigkeiten im Umgang mit dieser Programmiersprache, insbesondere Kenntnisse in OOP, die Fähigkeit, mit Strings und Collections, Lambda-Ausdrücken und der Stream-API zu arbeiten, die Gewohnheit, diese bei Bedarf zu verwenden.

Aufgabe 3. Schreiben Sie eine SQL-Abfrage. Die Aufgabe könnte zum Beispiel so aussehen. Sie haben zwei Tabellen:

Mitarbeiter – Mitarbeiter des Unternehmens

  • Ich würde

  • Abteilungs-ID

  • Arbeitsbeginn_Datum

  • Name

  • Gehalt

Abteilung — Abteilungen, in denen Mitarbeiter arbeiten

Sie müssen eine solche SQL-Abfrage schreiben, die alle Mitarbeiter anzeigt, die seit Sommer 2021 im Unternehmen arbeiten, nicht an Abteilungen gebunden sind und ein Gehalt von weniger als 100.000 Rubel erhalten.

Die richtige Antwort auf dieses Problem wäre:

SELECT e.id, e.name FROM employee e LEFT JOIN department d ON d.id = e.department_id WHERE e.work_start_date >= ‘2021-06-01’ AND e.salary < 100000 AND d.id IS NULL

Anhand der Aufgaben eines solchen Plans können Sie nachvollziehen, wie gut der Kandidat die SQL-Abfragesprache kennt, falls dies in diesem Projekt wichtig ist.

Anstatt SQL-Abfragen zu schreiben, bieten sie möglicherweise an, Code mit Hibernate zu schreiben. Natürlich ist die Beherrschung von SQL eine grundlegende Fähigkeit, die niemals überflüssig sein wird. Aber in einigen Projekten ziehen sie es vor, nicht in reinem SQL zu schreiben.

Aufgabe Nummer 4. Lösen Sie das gegebene Problem mündlich. Erläutern Sie beispielsweise, wie Deadlocks in Multithread-Anwendungen verhindert werden, oder erklären Sie, wie Sie Code, der mit einer Sammlung funktioniert, Thread-sicher machen.

Hier ist es in der Regel erforderlich, zuerst über das Problem selbst zu sprechen – was es ist und warum es überhaupt gelöst werden sollte, und dann genau zu erklären, wie dies getan werden kann. Und je klarer Ihre Geschichte ist und je logischer Ihre Argumentation ist, desto besser.

Es ist jedoch nicht notwendig, das Problem bis zum Ende perfekt zu lösen. Die Tatsache, dass Sie in die richtige Richtung denken, reicht völlig aus, um die Antwort als richtig zu werten. Schließlich ist es in Wirklichkeit unmöglich, alles zu wissen und sich zu merken, die Fähigkeit, Lösungen zu finden, zu verstehen, wo man „graben“ muss, und Experimente durchzuführen, ist viel wichtiger.

Aufgabe Nummer 5. Eine Aufgabe oder eine Reihe von Fragen, um die Prinzipien und Muster von OOP zu verstehen. Erstellen Sie beispielsweise eine Klasse, deren Objekt nur in einer einzigen Instanz dargestellt werden kann (implementieren Sie tatsächlich das Singleton-Muster).

Hier dürfen sie nicht nur aufgefordert werden, eventuell Code für eine Multithread-Betriebsart zu schreiben, sondern auch zu erklären, warum dies überhaupt notwendig sein kann, oder zu erklären, warum Singleton im Spring-Framework nicht verwendet wird und wodurch es tatsächlich ersetzt wird.

Wir selbst sehen uns damit konfrontiert, dass weniger als 20 % der Kandidaten, die laut Lebenslauf ein mittleres oder höheres Level haben, Fragen wie „wofür wird das letzte Schlüsselwort in Java verwendet“ oder „kann eine statische Methode wann überschrieben werden“ beantworten vererbt”.

Wie die Ergebnisse interpretiert werden

Sie werden überrascht sein, aber bei der Lösung praktischer Probleme erwartet der Arbeitgeber nicht immer eine vollständige und klare Antwort für jedes Problem. Er verlässt sich vielmehr auf den richtigen Vektor der Argumentation und des Verständnisses eines bestimmten Themas.

Wenn wir gebeten werden, Code zu schreiben, wäre der Kandidat natürlich besser dran, die Arbeit zu erledigen. Wir verstehen also, dass er wirklich weiß, wie man Code schreibt, und es sofort sauber macht. Außerdem ist hier oft Ihr Durchhaltevermögen wichtig: Die Fähigkeit, die Aufgabe bis zum Ende durchzuziehen, ist die wichtigste Fähigkeit, mit der viele Menschen in unserer Zeit Probleme haben.

Die dritte Sache, die ebenfalls wichtig ist, ist ein Verständnis der grundlegenden, grundlegenden Konzepte des Kandidaten. Wenn Sie nicht wissen, was HTTP ist, wie man einfache SQL-Abfragen macht, warum Multithreading überhaupt benötigt wird und was Thread-Sicherheit ist, werden Sie höchstwahrscheinlich abgelehnt.

Bei der Auswahl von Junior-Level-Spezialisten für unser Team oder für einen der Arbeitgeber prüfen wir drei Kompetenzblöcke:

  • Verständnis grundlegender Konzepte (Syntax, Sammlungen, Sauberkeit des Codes, OOP, Erstellung von Anwendungen auf Spring, HTTP, REST und SQL).

  • Fähigkeit, auftretende Probleme schnell, unabhängig und kompetent zu lösen, einschließlich der Suche nach den richtigen Informationen.

  • Das Lernniveau ist die Geschwindigkeit und Qualität des Auswendiglernens und der weiteren Umsetzung der Best Practices und Empfehlungen, die wir einem Anfänger in unsere Arbeit geben.

Nach der Einstellung eines unerfahrenen Spezialisten ist es wichtig, ihn nicht mit zu komplexen Aufgaben zu überlasten. Wenn er seinen Job gut macht und kurz vor Langeweile steht, werden ihm nach und nach immer komplexere und interessantere Projekte anvertraut, die für weiteres Wachstum sorgen.

Similar Posts

Leave a Reply

Your email address will not be published.