Warum Java lernen und wie man es effizient macht. Yandex-Bericht

Wie unterscheidet sich Java von anderen gängigen Sprachen? Warum lernt Java als erste Sprache? Lassen Sie uns einen Plan erstellen, mit dem Sie Java von Grund auf lernen und Programmierkenntnisse in anderen Sprachen anwenden können. Wir listen die Unterschiede zwischen der Erstellung von Produktionscode in Java und der Entwicklung in anderen Sprachen auf. Mikhail Zatepjakin las diesen Bericht bei einem Treffen für zukünftige Teilnehmer des Praktikums von Yandex und anderen unerfahrenen Entwicklern - Java Junior Meetup.


- Hallo zusammen, ich heiße Misha. Ich bin ein Entwickler von Yandex.Market und heute werde ich Ihnen erklären, warum Sie Java lernen und wie Sie es effektiv tun können. Sie können eine vernünftige Frage stellen: Warum erzähle ich es und nicht irgendein starker Entwickler mit langjähriger Erfahrung? Tatsache ist, dass ich selbst vor ungefähr anderthalb Jahren Java studiert habe, also erinnere ich mich noch daran, wie es war und was die Tücken sind.

Vor einem Jahr habe ich ein Praktikum bei Yandex.Market bekommen. Entwickelte ein Backend für "Ich nehme", für den Markt selbst, Sie haben es wahrscheinlich benutzt. Jetzt arbeite ich dort in einem anderen Team weiter. Wir machen die Yandex.Market-Analyseplattform für Geschäftspartner.



Fangen wir an. Warum Java aus praktischer Sicht lernen? Tatsache ist, dass Java eine sehr berühmte Programmiersprache ist. Er hat eine sehr große Community.

Zum Beispiel gibt es einen solchen TIOBE-Index, einen beliebten Index für die Popularität von Programmiersprachen, und Java steht dort an erster Stelle. Auf Websites mit Stellenangeboten werden Sie wahrscheinlich feststellen, dass die meisten Stellenangebote nur Java betreffen. Wenn Sie sich also in Java weiterentwickeln, können Sie immer einen Job finden.

Da die Community sehr groß ist, werden Ihre Fragen auf einigen Stack Overflow- oder anderen Websites beantwortet. Und während Sie in Java entwickeln, schreiben Sie tatsächlich Code mit der JVM, sodass Sie problemlos zu Kotlin, Scala und anderen Sprachen wechseln können, die die JVM verwenden.



Was ist Java aus ideologischer Sicht gut? Es gibt verschiedene Programmiersprachen. Sie lösen verschiedene Probleme, das wissen Sie. Zum Beispiel ist es in Python großartig, einzeilige Skripte zu schreiben, um schnelle Aufgaben zu lösen.

Auf den Profis können Sie den ausführbaren Code vollständig steuern. Zum Beispiel fahren wir Autos, unbemannte Yandex-Fahrzeuge, deren Code auf die Profis geschrieben ist. Warum? Java hat so etwas - Garbage Collector. Es räumt RAM von unnötigen Objekten auf. Dieses Ding startet spontan und stoppt die Welt, das heißt, es stoppt den Rest des Programms und geht zum Zählen von Objekten, löscht das Gedächtnis von Objekten. Wenn so etwas in einer Drohne funktioniert, ist es nicht cool. Ihre Drohne fährt in diesem Moment geradeaus, um die Erinnerung zu löschen und nicht auf die Straße zu schauen. Deshalb ist die Drohne auf die Profis geschrieben.



Welche Aufgaben löst Java? Dies ist in erster Linie eine Sprache für die Entwicklung großer Programme, die seit Jahren von Dutzenden oder Hunderten von Menschen geschrieben wurden. Insbesondere ist viel Backend in Yandex.Market in Java geschrieben. Wir haben ein verteiltes Team in mehreren Städten mit jeweils zehn Mitarbeitern. Der Code ist einfach zu warten, wird seit zehn Jahren oder länger unterstützt und gleichzeitig verstehen neue Leute diesen Code.

Welche Eigenschaften sollte eine Sprache haben, damit der Code problemlos unterstützt und in großen Teams problemlos entwickelt werden kann? Zuallererst sollte es lesbarer Code sein und es sollte einfach sein, komplexe Architekturlösungen darauf zu implementieren. Das heißt, es sollte einfach sein, Abstraktionen auf hoher Ebene zu schreiben usw. All dies liefert uns nur Java. Dies ist eine objektorientierte Sprache. Es ist wirklich einfach, Abstraktionen auf hoher Ebene und komplexe Architekturen darauf zu implementieren.

Es gibt auch viele Frameworks und Bibliotheken für Java, da die Sprache älter als 15 Jahre ist. In dieser Zeit wurde alles geschrieben, was geschrieben werden konnte. Es gibt also eine Reihe von Bibliotheken für alles, was für Sie nützlich sein kann.



Was sind meiner Meinung nach die Hauptfähigkeiten, die ein Anfänger-Javist haben sollte? Zuallererst sind dies Kenntnisse der Java-Kernsprache. Weiterhin ist es ein beliebiges Dependency Injection Framework. Der nächste Redner Kirill wird darüber ausführlicher sprechen. Ich werde nicht besonders tief gehen. Weiter geht es um Architektur- und Designmuster. Wir müssen in der Lage sein, architektonisch schönen Code zu schreiben, um große Anwendungen zu schreiben. Und dies ist eine Art SQL oder ORM für Datenbankaufgaben. Und hier geht es mehr um das Backend.



Lass uns gehen! Java-Kern. Hier werde ich Amerika nicht besonders entdecken - Sie müssen die Sprache selbst kennen. Worauf Sie achten sollten. Erstens hat Java in den letzten Jahren viele Versionen veröffentlicht, das heißt, in den Jahren 2014-2015, dem siebten, dann dem achten, neunten und zehnten, wurden viele neue Versionen veröffentlicht, und es wurden viele coole neue Dinge eingeführt, zum Beispiel die Java Stream API , Lambda usw. Sehr coole, frische, coole Dinge, die im Produktionscode verwendet werden, die bei Interviews gefragt werden und die Sie wissen müssen. Daher sollten Sie kein Buch aus einem Regal in der Java-4-Bibliothek nehmen und es lernen. Ein solcher Plan: Java-8 oder höher lernen.

Wir achten sorgfältig auf Innovationen wie Stream API, var usw. Sie werden bei Interviews gefragt und werden ständig in der Produktion verwendet. Das heißt, die Stream-API ist viel cooler als Zyklen, im Allgemeinen eine sehr coole Sache. Achten Sie unbedingt darauf.

Und es gibt alle möglichen Dinge wie Iteratoren, Ausnahmen und so weiter. Was Ihnen unwichtig erscheint, wenn Sie selbst einen kleinen Code schreiben. Sie brauchen diese Ausnahmen nicht, wer braucht sie überhaupt? Aber sie werden auf jeden Fall bei Interviews gefragt, sie werden auf jeden Fall für Sie in der Produktion nützlich sein. Im Allgemeinen lohnt es sich, auf Ausnahmen, Iteratoren und andere Dinge zu achten.



Datenstrukturen. Ohne Strukturen, nirgendwo, ist es großartig, wenn Sie nicht nur wissen, dass es Sätze, Wörterbücher und Blätter gibt. Und auch verschiedene Implementierungen von Strukturen. Zum Beispiel hat dasselbe Wörterbuch in Java viele Implementierungen, einschließlich HashMap und TreeMap. Sie haben unterschiedliche Asymptotika, sie sind innen unterschiedlich angeordnet. Sie müssen wissen, wie sie sich unterscheiden, wann welche zu verwenden ist.

Es ist auch toll, wenn Sie wissen, wie diese Datenstrukturen im Inneren funktionieren. Das heißt, es ist nicht einfach, ihre Asymptotik zu kennen - wie viel die Wette funktioniert, wie viel die Passage funktioniert und wie die Struktur im Inneren funktioniert - zum Beispiel, was in HashMap ein Bucket ist.

Es lohnt sich auch, auf Bäume und Graphen zu achten. Dies sind die Dinge, die im Produktionscode nicht sehr zahlreich sind, aber sie werden in Interviews geliebt. Dementsprechend müssen Sie in der Lage sein, Bäume, Graphen in Breite und Tiefe zu umrunden. Dies sind alles einfache Algorithmen.

Sobald Sie anfangen, Code zu schreiben, der irgendwie groß und komplex ist, Bibliotheken und Code mit mehreren Klassen verwendet, werden Sie feststellen, dass es schwierig für Sie ist, Systeme zu erstellen und Abhängigkeiten aufzulösen. Dies ist in erster Linie Maven und Gradle. Mit ihnen können Sie Bibliotheken wirklich in einer Zeile in Ihr Projekt importieren. Das heißt, Sie schreiben einzeiliges XML und importieren es in das Bibliotheksprojekt. Großartige Systeme. Sie sind ungefähr gleich, verwenden entweder Maven oder Gradle.

Als nächstes folgt ein Versionskontrollsystem. Ich empfehle Git, weil es sehr beliebt ist, es gibt jede Menge Tutorials. Fast jeder benutzt Git, eine coole Sache, ohne es irgendwo.

Und - eine Entwicklungsumgebung. Ich empfehle IntelliJ Idea. Es beschleunigt den Entwicklungsprozess erheblich, hilft Ihnen sehr, jeder Code, der für Sie geschrieben wird, ist im Allgemeinen cool.


Links von der Folie: SQLZOO , Habrapost

SQL Ein bisschen über Backender. Hier war in der Tat ein lustiger Fall. Zwei Tage vor meinem zweiten Praktikumsinterview rief mich eine HR-Mitarbeiterin an und sagte, dass sie mich in zwei Tagen nach SQL und HTTP fragen würde, was ich lernen muss. Und ich wusste weder über SQL noch über HTTP Bescheid. Und ich habe so eine coole Seite gefunden - SQLZOO . Daraufhin habe ich 12 Stunden lang SQL gelernt, im Sinne von SQL-Syntax, wie man SELECT-Abfragen schreibt, JOIN usw. Eine sehr coole Site, die ich sehr empfehlen kann. Eigentlich habe ich in 12 Stunden 90% von dem gelernt, was ich jetzt weiß.

Es ist auch toll, die Datenbankarchitektur zu kennen. Dies sind alle Arten von Schlüsseln, Indizes, Normalisierung. Darüber gibt es eine Reihe von Posts auf Habré.



In Java gibt es neben SQL alle möglichen objektrelationalen Mapping-Systeme wie JPA. Es gibt einen Code. Bei der ersten Methode lautet der SQL-Code SELECT id name FROM info.users WHERE id IN userIds. Aus der Benutzerdatenbank und aus der Tabelle werden ihre Bezeichner und Namen empfangen.

Als nächstes gibt es eine Art Mapper, der ein Objekt von einer Basis in ein Java-Objekt verwandelt. Und es gibt eine dritte Methode, die diesen Code ausführt. All dies unter Verwendung von JPA kann durch eine Zeile ersetzt werden, die im Folgenden beschrieben wird. Sie macht das Gleiche - finde All ByIdIn. Das heißt, mit dem Namen der Methode wird eine SQL-Abfrage für Sie generiert.

Sehr cooles Zeug. Als ich SQL nicht kannte, habe ich selbst JPA verwendet. Achten Sie im Allgemeinen darauf. Wenn Sie zu faul sind, um SQL - Feuer zu lernen. Und im Allgemeinen Feuer!



Frühling Wer hat von so etwas wie dem Frühlingsrahmen gehört? Sehen Sie, wie viele von Ihnen? Aus gutem Grund. Spring ist in den Anforderungen eines jeden zweiten Jobs für das Java-Backend enthalten. Ohne sie gibt es wirklich keinen Ort, an dem man sich entwickeln kann. Was ist Frühling? Dies ist in erster Linie ein Abhängigkeitsinjektionsframework. Der nächste Redner wird auch darüber sprechen . Kurz gesagt: Mit dieser Funktion können Sie das Importieren der Abhängigkeiten einer Klasse in eine andere Klasse vereinfachen. Das heißt, die Kenntnis von Abhängigkeiten wird vereinfacht.

Spring Boot ist ein solches Stück Spring, mit dem Sie Ihre Serveranwendung mit einem Klick anheben können. Gehen Sie zu THID und klicken Sie auf einige Schaltflächen. Jetzt wurde Ihre Serveranwendung auf localhost 8080 erstellt. Das heißt, Sie haben keine einzige Codezeile geschrieben, aber es funktioniert bereits. Sehr cooles Zeug. Wenn du etwas von dir schreibst, feuere!

Der Frühling ist ein sehr großer Rahmen. Es wird nicht nur eine Serveranwendung erstellt, sondern auch die Abhängigkeitsinjektion aufgelöst. Sie können damit eine ganze Reihe von Aufgaben ausführen, einschließlich der Erstellung von REST-API-Methoden. Das heißt, Sie haben eine Methode geschrieben und die Annotation Get mapping darauf gesetzt. Und hier haben Sie bereits eine Methode auf localhost, die Ihnen Hello World schreibt. Zwei Codezeilen, und es funktioniert. Cooles Zeug.

Spring erleichtert auch das Schreiben von Tests. Ohne in irgendeiner Weise in einer großen Entwicklung zu testen. Der Code muss getestet werden. Für diesen Zweck hat Java eine coole JUnit 5-Bibliothek und im Allgemeinen JUnit, aber die neueste Version ist die fünfte. Es gibt alles zum Testen, alle möglichen Behauptungen und andere Dinge.

Und es gibt ein großartiges Mockito-Framework. Stellen Sie sich vor, Sie haben einige Funktionen, die Sie testen möchten. Die Funktionalität erledigt eine Menge Dinge, einschließlich, dass sie irgendwo in der Mitte "VKontakte" mit Ihrem z. B. einem Bezeichner eingibt und den Vor- und Nachnamen des Benutzers "VKontakte" als ID erhält. Wahrscheinlich werden Sie in Tests nicht VKontakte eingeben, das ist seltsam. Aber Sie müssen die Funktionalität testen, also haben Sie diese Klasse mit Mockito zum Mok gemacht, zur Imitation.

Sie werden sagen, dass, wenn eine Anfrage mit dieser ID mit einer solchen ID eingeht, ein Nachname zurückgegeben wird, zum Beispiel Vasya Pupkin. Und es wird funktionieren. Das heißt, Sie testen die gesamte Funktionalität für eine Klasse. Sehr cooles Zeug.


Link von der Folie

Entwurfsmuster. Was ist das? Dies sind Muster zur Lösung typischer Entwicklungsprobleme. In der Entwicklung ergeben sich oft die gleichen oder ähnliche Aufgaben, die sich gut irgendwie lösen lassen. Aus diesem Grund haben die Leute Best Practices und einige Muster entwickelt, wie diese Probleme gelöst werden können.

Es gibt eine Website mit den beliebtesten Mustern - refactoring.guru, Sie können lesen, herausfinden, was Muster sind, eine Menge Theorie lesen. Das Problem ist, dass es praktisch nutzlos ist. In der Tat sind Muster ohne Übung nicht von besonderem Nutzen.

Sie werden über einige Muster wie Singletone oder Builder hören. Wer hat diese Worte gehört? Viele Leute. Es gibt so einfache Muster, die Sie selbst implementieren können. Aber die meisten Muster: Strategie, Fabrik, Fassade - es ist nicht klar, wo sie angewendet werden sollen.

Und bis Sie in der Praxis in einem Fremdcode die Stelle sehen, auf die dieses Muster angewendet wird, können Sie es nicht selbst anwenden. Daher ist Übung mit Mustern sehr wichtig. Und es ist nicht besonders hilfreich, wenn Sie sich beim refactoring.guru über sie informieren, aber Sie müssen es tun.



Warum werden Muster benötigt? Lassen Sie eine Klasse Benutzer haben. Er hat eine ID und einen Namen. Jeder Benutzer muss sowohl eine ID als auch einen Namen haben. Oben links - klasse.

Wie kann der Benutzer initialisiert werden? Zwei Optionen sind entweder ein Konstruktor oder ein Setter. Was sind die Nachteile beider Ansätze?

Konstruktor. neuer User (7, "Bond"), ok. Angenommen, wir haben keine Benutzerklasse, sondern eine andere mit sieben numerischen Feldern. Sie werden einen Konstruktor haben, in dem es sieben aufeinanderfolgende Zahlen gibt. Es ist unklar, was diese Zahlen sind, welche von ihnen zu welchem ​​Eigentum gehören. Der Konstruktor ist nicht so toll.

Die zweite Option ist Setter. Sie schreiben deutlich: setId (7), setName ("Bond"). Sie verstehen, welche Eigenschaft zu welchem ​​Feld gehört. Aber Setter hat ein Problem. Erstens können Sie vergessen, etwas aufzurufen, und zweitens erweist sich Ihr Objekt als veränderlich. Dies ist nicht threadsicher und verringert die Lesbarkeit des Codes geringfügig. Deshalb haben sich die Leute ein cooles Muster ausgedacht - Builder.



Worum geht es? Wir werden versuchen, die Vorteile beider Ansätze - sowohl Setter als auch Konstrukteur - in einem zusammenzufassen. Wir erstellen ein bestimmtes Objekt, Builder, das auch die Felder Id und Name enthält, das selbst auf der Basis von Setter erstellt wird und das eine Build-Methode enthält, die Ihnen einen neuen Benutzer mit allen Parametern zurückgibt. Wir bekommen einen unveränderlichen Gegenstand und Setter. Cool!

Was sind die probleme Hier haben wir den klassischen Builder. Das Problem ist, dass wir immer noch vergessen können, ein Feld zu füllen. Und wenn wir vergessen haben, einen Bezeichner auszufüllen, wird er in diesem Fall in Builder auf Null initialisiert, da der int-Typ nicht nullwertfähig ist. Und wenn wir den Namen "Bond" vergeben und vergessen, den Bezeichner zu besuchen, haben wir einen neuen Benutzer mit der ID "0" und dem Namen "Bond". Nicht cool

Versuchen wir das zu bekämpfen. Ändern Sie in dem Generator Int zu Int, damit es nullable ist. Jetzt ist alles großartig.



Wenn wir versuchen, einen Benutzer mit dem Namen "Bond" zu erstellen, ohne ihm eine ID zuzuweisen, erhalten wir eine Nullzeigerausnahme, da die ID nicht nullfähig ist, Builder jedoch Null hat, insbesondere eine Zeigerausnahme.



Wir können jedoch immer noch vergessen, den Namen einzugeben, und fügen daher die Objektwiedergabe null hinzu. Wenn wir jetzt unser Objekt aus Builder erstellen, wird überprüft, ob das Feld nicht nullwertfähig ist. Und das ist noch nicht alles.

Schauen wir uns das letzte Beispiel an. In diesem Fall, wenn wir in der ID-Laufzeit den Wert "null" setzen und es großartig ist, sofort zu wissen, dass Sie dies getan haben und es ist nicht cool, dass Sie gerade einen Fehler machen.



Sie müssen einen Fehler nicht beim Erstellen des Benutzers auslösen, sondern wenn Sie den Bezeichner auf null setzen. Daher werden wir im Builder die Setter-Ganzzahl in int ändern, und er schwört hier sofort, dass Null geworfen wurde.

Kurz gesagt, worum geht es? Es gibt das einfachste Builder-Muster, aber selbst seine Implementierung weist einige Feinheiten auf. Daher ist es sehr cool, verschiedene Implementierungen der Muster zu betrachten. Jedes Muster verfügt über Dutzende von Implementierungen. Das ist alles sehr interessant.



Wie schreiben wir Builder in Produktionscode? Hier ist unser User. Wir hängen die Builder-Rotation an die Lombok-Bibliothek, und sie generiert uns selbst den Builder. Das heißt, wir schreiben keinen Code, aber Java glaubt bereits, dass diese Klasse einen Builder hat, und wir können ihn so nennen.

Ich habe bereits gesagt, dass es in Java Bibliotheken für fast alles gibt, einschließlich Lombok, eine coole Bibliothek, mit der Sie kein Boilerplate schreiben können. Baumeister, GET.



Es gibt Architekturmuster, die sich nicht nur auf eine Klasse, sondern auf das gesamte System beziehen. Im Systemdesign gibt es ein so cooles Prinzip: das Prinzip der Einzelverantwortung. Wovon redet er Die Tatsache, dass jede Klasse für einen Teil ihrer Funktionalität verantwortlich sein muss. In diesem Fall haben wir einen Controller, der mit Benutzern, JSON-Objekten, kommuniziert. Es gibt Facade, das JSON-Objekte in Modelle konvertiert, die weiterhin mit Java-Anwendungen funktionieren. Es gibt einen Dienst, bei dem eine komplexe Logik mit diesen Modellen arbeitet. Es gibt ein Datenzugriffsobjekt, mit dem diese Modelle in die Datenbank eingefügt und aus der Datenbank entfernt werden. Und da ist die Datenbank selbst. Mit anderen Worten, dies ist nicht alles in der gleichen Klasse, aber wir machen fünf verschiedene Klassen, und dies ist ein anderes Muster.



Wenn Sie mehr oder weniger Java gelernt haben, ist es großartig, eine Art eigenes Projekt zu schreiben, in dem sich eine Datenbank befindet, das mit anderen APIs zusammenarbeitet und das Ihrer Serveranwendung REST-API-Clients zur Verfügung stellt. Es wird großartig sein, so etwas in den Lebenslauf einzufügen. Dies ist ein cooles Ende Ihres Trainings. Mit diesem können Sie einen Job bekommen.



Hier ist ein Beispiel für meine Serveranwendung. Im zweiten Jahr schrieb ich mit den Jungs eine Hausarbeit. Sie schrieben eine mobile Anwendung für die Organisation von Veranstaltungen. Dort konnten sich Benutzer über VKontakte anmelden, Punkte auf der Karte platzieren, Ereignisse erstellen, ihre Freunde anrufen, das Bild von Ereignissen speichern usw.

Was habe ich im Projekt gemacht? Schrieb eine Serveranwendung auf Spring Boot ohne SQL. Ich kannte ihn nicht, ich habe JPA verwendet. Was kann es? Melden Sie sich über OAuth-2 bei VK an. Nehmen Sie den Token des Benutzers, gehen Sie mit ihm zu VK und überprüfen Sie, ob es sich um einen echten Benutzer handelt. Erhalten Sie Informationen über Benutzer über VKontakte. Es speichert Informationen geschickt in einer Datenbank, auch über JPA. Speichern Sie geschickt Bilder und andere Dateien im Computerspeicher und speichern Sie Links zu diesen in der Datenbank. Ich wusste noch nicht, dass es CLOB-Objekte in der Datenbank gibt, also habe ich es so gemacht. Es gab eine REST-API für Benutzer und Clientanwendungen. Und es gab Unit-Tests für die Grundfunktionalität.

[...] Ein kleines Beispiel für mein erfolgreiches Erlernen von Java. In meinem ersten Jahr an der Universität haben sie mir C # beigebracht und mir ein Verständnis für OOP-Programmierung vermittelt - was sind Klassen, Schnittstellen, Abstraktion, warum werden sie benötigt? Es hat mir sehr geholfen. Java , , .



Java core, , Spring , , . , , .. , , ..

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

Vielen Dank! :
«Java 8. » .
.
SQLZOO .
.
.
Design Patterns .
Clean Code .
Effective Java .

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


All Articles