Ein moderner Full-Stack-Entwickler sein


Ich lebe an der Peripherie eines technologischen Treffens. Und an der Peripherie im geografischen Sinne. Und das bedeutet:


  • Ich war noch nie auf professionellen Konferenzen. Nur weil es noch nie eine solche Gelegenheit gegeben hat.
  • Ich habe nie Schulungen gekauft: Es ist seltsam für mich, für das zu bezahlen, was Sie selbst im Internet oder in Büchern lernen können. Es ist natürlich verlockend, konzentriertes Wissen zu erwerben, das durch praktische Aufgaben gestützt wird, um ein Zertifikat zu erhalten. Aber dafür hatte ich nie das Geld oder die Zeit.
  • Ich bin ein Anhänger der digitalen Askese: nicht aus freiem Willen, sondern als Produkt ewiger Umstrukturierung in unserem Land. In kurzen Zeiten finanzieller Stabilität aktualisiere ich die Elektronik auf Restbasis. Jetzt schreibe ich diesen Text vor zehn Jahren auf Core2Duo. Ich warte immer noch auf das nächste stabile Plateau in meiner Gewinnkurve.
  • Dreimal in meinem Leben habe ich Spiele gekauft. In den 90ern. Dies waren Kassetten für das veraltete Spektrum. Ich sehe den Kauf von Software überrascht: Wenn alle Raubkopien verwendeten, habe ich sie auch verwendet, ohne das Wesentliche des Problems zu verstehen. Und dann, Anfang der 2000er Jahre, wechselte ich komplett zu Linux und es gab nichts zu kaufen.
  • Überraschenderweise habe ich seit Beginn der GSM-Kommunikation nie ein Mobiltelefon verloren. Und sie sind nie kaputt gegangen oder wurden nicht repariert. Alle drei Teile stehen ordentlich im Regal, und das vierte, ein Smartphone, liegt in Ihrer Tasche. Er ist fünf Jahre alt. Ich habe keine Erfahrung mit dem Kauf von Software bei Google Play. Ich weiß nicht einmal, wie das geht. Die Frau weiß es, aber ich nicht.
  • Ich bitte die Anbieter, mich auf die schwarze Liste zu setzen und mich nicht mit Angeboten zum „Kauf des Internets“ oder einem Fernsehpaket anzurufen. Da ich keinen Fernseher habe und für das Internet, reicht mir die Mindestgeschwindigkeit. Ich bitte Sie, mir nichts über die neuen Tarife für die Mobilkommunikation zu erzählen, da ich die günstigsten verfügbaren Tarife auswähle.
  • Ich habe noch nie englischsprachige Ausländer gesehen. Und er sprach nie mit einer Stimme mit Ausländern. Eine solche Gelegenheit wurde in meiner Bärenecke nie gegeben, obwohl es interessant wäre. Ich pumpe langsam mein Englisch, aber ich brauche es nur zum Lesen von Literatur.

Wahrscheinlich genug. Wer bin ich und was mache ich auf Habrahabr? Tatsache ist, dass ich ... ein ständiger Überlebender bin. Mit anderen Worten, ein moderner Full-Stack-Entwickler. Oh, ich kann mir vorstellen, wie Profilprogrammierer jetzt die Stirn runzelten! Fullstack ... Was kann ich ihnen sagen? Leute, ich würde gerne Fähigkeiten in eine Richtung pumpen. Ich würde mich wie Sie freuen, in das Thema einzutauchen und ein hochspezialisierter Guru zu werden. Leider ist die Realität, dass in den Regionen eine Person an einem abgelegenen Ort an jedem Arbeitsplatz festhalten muss, nur um nicht zu gehen oder Taxifahrer zu werden.


Mit welchen Sprachen musste ich umgehen und fertige Dinge herausgeben? Wenn Sie eine Auswahl auf einer Zeitachse treffen, erhalten Sie die folgende Liste:


Sprache und TechnologieProjektthema
C & Assembler x86Für die Seele
FoxPro 2.6, NetwareSteuern und Buchhaltung
PHP4 & LAMPWebentwicklung
AnSYS & StarCD & MathCADFestigkeitsanalyse, Berechnung von Flüssigkeits- und Gasströmen
1C v7Lagerbuchhaltung und Buchhaltung
C ++ 98Embarding und Gaming
PHP5 & LNMP & CodeigniterWebentwicklung
C ++ 03/11 & QtOpen Source Software
1C v8 & PostgreSQL & LinuxGeschäftsprozesse in Kernkraftwerken
Python 2.7SMS-Benachrichtigungen
PHP7 & LNMP & Yii2Webentwicklung
C ++ 11 & Qt & QML & JavaKartografie und Navigation, mobile Entwicklung für Android
PHP7 & LNMP & Laravel & SIPWebentwicklung und Telefonie

Ja, ich selbst habe Angst vor diesem Durcheinander. Was für ein bezauberndes Werfen? Ist das richtig Webstärkeanalyse - Bestandsbuchhaltung - Spiele ... Kernkraftwerke, Kartographie, Telefonie. Autor, meinst du das ernst? Absolut! Das Leben wird quetschen - du stehst nicht zu viel auf.


Übergangskante


Um den Übergang von Projekt zu Projekt zu spüren, können Sie die beiden untersten Zeilen der obigen Tabelle betrachten. Für das Projekt werden wir aus der vorletzten Zeile „Kartografie und Navigation, mobile Entwicklung für Android“ nur die Links verwenden.



Und um das Bild zu vervollständigen, noch ein paar Veröffentlichungen:



Und über das Ende der Tabelle "Webentwicklung und Telefonie" werde ich später in diesem Text sprechen.




Ein vielversprechendes Projekt einer mobilen Anwendung für Android für benutzerdefinierte Navigationsgeräte wird also scharf abgeschlossen. Gestern hat der Entwickler den Backend-Code in C ++ und den Front-Code in QML geschrieben, den nativen Code über JNI mit Java verschraubt, und heute muss er verzweifelt nach der Stelle des C ++ - Entwicklers auf der Remote-Site suchen. Der moderne C ++ - Markt ist derart, dass es ein großer Erfolg ist, einen Arbeitgeber in Russland mit C ++ an einem entfernten Standort zu finden. Alle Arbeitgeber möchten einen C ++ - Programmierer im Büro sehen. Der Monat in der Suche ist eine vollständige Null. Es ist Zeit für eine Umschulung, der Nutzen des Hintergrunds erlaubt es.


Definition


Der Fullstack-Entwickler (Vertreter einer Familie von Spezialisten) ist ein mythischer Charakter, der Gegenstand des Wunsches eines Arbeitgebers ist, der die Softwareproduktion für ein Team von einer Person optimieren möchte. Fullstack-Entwickler haben magische Fähigkeiten: Er hat ein bodenloses Gedächtnis, weil er alle modernen Sprachen und Technologien kennt; Der globale konzeptuelle Apparat ist in das Gehirn integriert und bei der Organisation des Denkprozesses von Wladimir Lenin, Albert Einstein und Leonardo da Vinci überlegen. Das systemische Denken eines solchen Spezialisten ist in der Lage, alles direkt im Gehirn zu debuggen, ohne Debugging-Tools zu verwenden. Unprätentiös, angetrieben von Sonnenlicht.

Übergang zu einer neuen Aufgabe


Plötzlich kommt der Haarbenutzer von itsar zu mir und bringt es zu seinem Team. Er hat mehrere Aufgaben zu erledigen, und ich implementiere einen Prototyp-Webdienst zum Testen. Wie geplant benachrichtigt der Webdienst Benutzer über verschiedene Kommunikationskanäle, einschließlich Telefonanrufe, über verschiedene Ereignisse. Infolgedessen erschien die Seite QrCall.org , über die bereits auf Habrahabr geschrieben wurde: Gehen Sie dorthin - ich weiß nicht wo .


Mit Blick auf die Zukunft schreibe ich sofort die Fristen: Die Diskussion und das Schreiben der technischen Aufgabe dauerten zwei Wochen, es dauerte anderthalb Monate, um die erste Implementierung zu erstellen und in Produktion zu bringen.


Zum Verständnis sieht dieser Webdienst bisher folgendermaßen aus (Entwicklerversion):



Wir müssen also von C ++ zu PHP7 und dem Tool-Stack springen, der den modernen Realitäten entspricht. Es ist keine Zeit für Aufbau (C) Putin. Straustrup, Schildt, Gottschling, Salter und Klepper stehen im hinteren Regal. Parallel zum Schreiben von TK erinnere ich mich, dass sie es in PHP7 erfunden haben. Die Abfrage "Was ist neu in PHP7?" Enthält mehrere Artikel zu Habrahabr und in Programmierblogs. Ja, Namespaces und Importe, eine neue Art von ternärem Operator und jeglichem syntaktischen Zucker, Skalartypen und ähnliche, anonyme Klassen, Abschluss von Schließungen, Generatoren ... Zum größten Teil ist alles bekannt. Ich stelle noch einmal für mich selbst fest, dass PHP im Vergleich zu den schwerwiegenden Vorteilen ein himmlisches Vergnügen ist.


Werkzeugauswahl


Telefonie


Am meisten besorgt über die zukünftige Implementierung der Telefonie. Werde ich meistern Es ist sofort klar, dass Sie mit SIP arbeiten müssen, aber wie? In meinem Gehirn hängt eine Erinnerung, die ich früher mit einem Konsolen-SIP-Client gespielt habe und die sogar eine Telefonnummer wählen und einen Anruf tätigen konnte. Um das Problem zu lösen, reicht dies aus. Im Extremfall müssen Sie mit Asterisk verwechselt werden. Ich rufe einen vertrauten Signalgeber an, beschreibe die Essenz des Problems und bitte Sie, mich daran zu erinnern, welche Art von Konsolen-Client ich fühlen könnte. Das Urteil ist eindeutig - das ist Linphone und seine Konsole linphonec . Das Wählen einer Nummer in der Konsole reicht jedoch nicht aus. Sie müssen die Audiodatei noch auf dem virtuellen Mobilteil abspielen. Installieren Sie Linphone, gehen Sie zu seiner Konsole und sehen Sie sich die Möglichkeiten an. Es ist also möglich, von einem Audiogerät zu einer Datei zu wechseln. Das ist gut. In der Konsole befindet sich ein Wiedergabebefehl, mit dem eine Audiodatei zum Abspielen gestartet wird. Grundsätzlich wird nichts mehr benötigt.


Obwohl dies nicht der Fall ist, besteht immer noch das Problem gleichzeitiger Anrufe. Ich diskutiere es mit itsar , er sagt, dass Anrufbenachrichtigungen selten sind, richten Sie sie einfach aus. Begrenzen Sie nur die Dauer. Gut. Wenn ja, dann gibt es keine Fragen mehr zur Telefonie.


PHP Framework und Paketmanager


Als Nächstes müssen Sie entscheiden, auf welchem ​​Framework das Projekt erstellt werden soll, und gleichzeitig müssen Sie sich mit dem Composer-Paketmanager befassen. Zuvor habe ich mir nur Composer angesehen und Yii2 ohne Komponenten installiert, da in Yii2 alles, was benötigt wurde, bereits enthalten war. Egal für welches Framework ich mich entscheide, Composer wird immer noch benötigt. Ich habe gelesen, wie man es installiert. Ich wette, es funktioniert.


Als nächstes kommt die Frage zum Framework. Ich finde heraus, dass Yii2 2019 nicht mehr relevant ist und Yii3 in einem Zwischenzustand steckt. Was bleibt übrig? Für Zend und Symfony bin ich noch nicht gereift, daher gibt es praktisch keine Optionen - nur Laravel . Ich lese die Dokumentation, schaue mir die Handbücher an, bestelle ein Buch eines russischsprachigen Autors (es stellte sich als sehr vernünftig heraus, was zum Starten benötigt wird). Nach dem alten Codeigniter und dem irrelevanten Yii ist das Laravel-Framework leicht zu verstehen. Sie können sofort sehen, wie sich die Programmieridee beim Design von Webanwendungen entwickelt hat. Alles, wovon geträumt wurde, wurde bereits implementiert, ausgeführt und mit Standardansätzen überwachsen. Ja, das Projekt ist nicht geladen geplant, daher kann ich mir eine nubische Krümmung bei der Implementierung leisten.


Ich habe Laravel "standardmäßig" gesetzt und dem Komponisten vorgeschlagen, selbst zu entscheiden, welche Version von Laravel derzeit relevant ist. Er setzt 5.5. Nun, lassen Sie diese Version sein, es ist mehr Run-In als 5.8, so wird es einfacher sein, Probleme zu lösen. Wir verfolgen keine Innovation.


NPM


Einige Laravel-Komponenten, z. B. das Mix CSS-Build- und Minifizierungssystem (Add-On für Webpack), erfordern die Laufzeit des Node.Js-JavaScript-Servers und den JavaScript-basierten npm-Paketmanager. Der Debian Linux Stable, den ich verwende, hat bereits das npm- Paket. Es ist jedoch eine ziemlich alte Version und nicht für die Laravel 5.5-Infrastruktur geeignet. Ich finde heraus, wie man aus Quellen von Drittanbietern installiert. Ich finde deb.nodesource.com und installiere daraus. Hmm, seltsam, im selben Paket ist npm zusammen mit Node.Js installiert. Dies ist überhaupt kein Unix-Weg, aber na ja. Die Hauptsache, die funktioniert.


Layout


Die Idee des QrCall.org- Projekts besteht darin , den Benutzer über einen QR-Code aufzurufen . Dies bedeutet, dass Besucher die Website von mobilen Geräten aus betreten, mit deren Kameras dieser QR-Code gescannt wird. Gleichzeitig werden Benutzerregistrierungen, das Einrichten von Warnungen und das Drucken von QR-Codes wahrscheinlich von Desktop-Computern aus durchgeführt. Ein adaptives Layout ist daher unverzichtbar.


Ich bemerke sofort die Erzeugung von mobilen / Desktop-Inhalten auf dem Server durch Analyse von UserAgent. Dies ist nicht unser Ansatz für 2019. Hier wird uns das Bootstrap CSS Framework definitiv helfen. Im Allgemeinen ist das Layout von Webanwendungen ein separates, gigantisches, großes Thema, das von einem separaten Spezialisten behandelt werden sollte. Für mich in der Webentwicklung gibt es nichts Komplizierteres als das Kommissionieren mit Layout. Ich habe lange verstanden, dass ich einen imposanten Kretinismus habe. Ich verbringe enorm viel Zeit damit, ein anderes reguläres Element einzurücken oder mehrere Elemente auszurichten. Wir haben jedoch keine Ressourcen für den Codierer. Sie müssen also tun, was Sie können. Es ist wünschenswert, dass das Ergebnis glatt und schön ist.


Die Frage ist: Welche Version von Bootstrap soll ich verwenden? 3 oder 4? Es stellt sich heraus, dass Bootstrap sofort mit Laravel 5.5 geliefert wird, und dies ist Version 3.x. Es ist keine Zeit herauszufinden, wie die Umgebung auf Bootstrap 4 neu erstellt werden kann. Daher lasse ich Version 3. Am Ende verwenden Hunderttausende von Websites Bootstrap 3 im Internet, was bedeutet, dass es eine anständige Technologie ist.


Das Interessanteste ist, dass sich herausstellte, dass nicht nur für den "offenen" Teil der Website, sondern auch für Ihr persönliches Konto ein adaptives Layout erstellt wurde.


So sieht die Seite in der Desktop-Version aus:



Und hier ist sie in der mobilen Ansicht:



Entwicklung


Wie wird das Framework verwendet? Ich habe diesen Ansatz: Maximale Nutzung aller vorgefertigten Komponenten der Freverka, aber mit einer Bedingung: Wenn es ein gutes Verständnis dafür gibt, wie diese Komponente funktioniert. Eine Person, die Zen Laravel bereits kannte, sagte: "Es geht nicht darum, dass die Dokumentation in nicht-russischer Sprache verfasst ist, sondern darum, dass sie selbst in Muttersprache Englisch für den Rahmen nicht immer bezeichnend ist." Daher glaube ich, dass es besser ist, mit Ihren eigenen Methoden etwas Einfacheres zu tun, als Code zu schreiben, der von Ihnen selbst schlecht verstanden wird, wenn Sie eine Komponente oder Methode nicht schnell herausfinden können.


Worüber rede ich? Das Laravel-Framework ist ein großes Framework mit vielen implementierten Abstraktionen und einem eigenen Ansatz für die Codestruktur. Es hat einfache Dinge, die lange und erfolgreich sowohl in Laravel als auch in anderen Frameworks verwendet wurden. Es gibt komplexe, aber verständliche Dinge, zum Beispiel die Implementierung von Warteschlangen (die für die Telefonie verwendet werden müssen). Aber es gibt wirklich komplexe grundlegende Dinge, in die Sie nicht eindringen können. Dies ist beispielsweise ein Bundle Service Container + Service Provider + Fassade. Bisher habe ich verstanden, wie man einen Dienstleister mechanisch erstellt, in einen Servicebehälter legt und die Fassade auf alles schraubt. Aber für das, was getan werden muss, habe ich noch nicht realisiert. Es scheint, als würde dieser Ansatz den Code verkürzen. Sie können auf die Abstraktion und ihre Methoden in einem statischen Stil verweisen, ohne das neue Schlüsselwort zu verwenden (zweifelhafter Wert). Die Verwendung von Fassaden erleichtert das Organisieren automatisierter Tests einer Webanwendung. Als Nebeneffekt all dieser Bequemlichkeit wird bei Verwendung eines Dienstanbieters die Abhängigkeitsinjektion automatisiert. Obwohl es kein Verständnis gibt, ist es für mich im Allgemeinen am einfachsten, mit den üblichen Hilfsklassen umzugehen, die ich mache.


Technologie


Um das oben Gesagte zusammenzufassen, habe ich den folgenden, ziemlich traditionellen Technologie-Stack erhalten:


  • Betriebssystem: Linux (ich wähle Debian Stable)
  • Sprache: PHP7
  • Rahmen: Laravel
  • Frontend Whistles: Bootstrap 3 + Vue.js
  • Datenbank: MariaDB (auch bekannt als MySQL)
  • Webserver: NGinx
  • Telefonie: SIP + linphonec / linphonecsh
  • VCS: Git

Ja, nicht der modischste und fortschrittlichste Stack. Wir müssen jedoch Geschäfte machen und nicht üben, die Umgebung in Docker-Container zu verpacken, und nicht die Idee einer Nur-JS-Entwicklung fördern.


Warteschlange


Warteschlangen sind ein sehr spezifischer Themenbereich, und in großen Teams werden Warteschlangen normalerweise von einem speziell ausgebildeten Spezialisten beantwortet, der den Betrieb von Warteschlangen auf Hunderten von Servern sicherstellt. In unserem Fall werden Hunderte von Servern nicht beobachtet, daher ist es notwendig, die Warteschlange so einfach wie möglich und geschäftlich zu verwenden. Aus diesem Grund habe ich mich als Job-Repository für die Verwendung des relationalen MySQL-Datenbankmoduls entschieden, das bereits im Projekt verwendet wird. Es gab eine gewisse Versuchung, es zum Beispiel mit Bedacht zu tun, basierend auf Redis, aber es gab einfach keine Zeit, sich mit dieser NoSQL-Datenbank zu befassen.


Während der Entwicklung wurde eine Anfrage für eine Aufgabe angezeigt, die nicht direkt mit der MySQL-Warteschlange gelöst werden konnte, sondern mit Redis gelöst werden konnte. Das Problem bestand darin, dass nach dem erfolgreichen Abschluss der Aufgabe die Aufgabe aus der Warteschlange entfernt wird und nicht überprüft werden kann, ob beispielsweise eine bestimmte Aufgabe in den letzten 10 Minuten abgeschlossen wurde. Bei Verwendung von Redis-Speicher kann dies durch Ratenbegrenzung implementiert werden. Bei Verwendung von MySQL ist dies jedoch nicht möglich. Daher musste ich solche Funktionen einfach auf der Grundlage der Analyse des Aktionsprotokolls implementieren. Glücklicherweise ist das Aktionsprotokoll ein unverzichtbarer Bestandteil unseres kleinen Informationssystems.


Bezahlte Dienstleistungen


Wenn Sie eine Website ins Internet stellen, müssen Sie verschiedene Dienste bezahlen. Hosting und Domainname sind immer fast obligatorische Zahlungen. Wir haben das Hosting kostengünstig in Anspruch genommen und für 2 GB RAM bezahlt, mit einer Rate von 1 GB für die Datenbank, den Rest - für das Betriebssystem und die Skriptausführung. Der Tarif enthielt 2 Mikroprozessorkerne, obwohl ich denke, dass einer mit unseren Lasten gut zurechtkommt. Speicherplatz in 20 GB ist mehr als genug für unser Projekt. Während des Bereitstellungsprozesses war die Kompilierung von Linphonec erforderlich , da auf dem Desktop meines Entwicklers ein älteres Debian-Linux vorhanden war als im fertigen Image der virtuellen Maschine, das vom Hoster bereitgestellt wurde, und das Standardpaket aus dem Repository eine alte Version dieses Programms mit mehreren unangenehmen "Funktionen" enthielt. Um Linphonec zu kompilieren, reichten mir 2 GB nicht aus. Die Magie von Vorlagen in C ++ verbraucht Speicher, als wäre er nicht in sich selbst. Daher musste ich einen Austausch einrichten, nach dem die Assembly erfolgreich abgeschlossen wurde.


SIP-Telefonie war auch nie kostenlos, aber da es in Russland mehrere große IP-Telefoniebetreiber gibt, die miteinander konkurrieren und sehr kostengünstige Tarife anbieten. Der einzige unverständliche Moment war, dass der Betreiber bei der Bestellung eines Tarifs davon überzeugt war, dass der Tarif pro Sekunde sein würde, aber tatsächlich stellte sich heraus, dass er pro Minute war. Dies muss jedoch gesondert behandelt werden.


In unserer modernen Realität können Sie sich nicht darauf verlassen, dass es kostenlose E-Mail-Mailing-Dienste gibt. In unserem Fall wird der E-Mail-Newsletter benötigt, um verschiedene Benachrichtigungen zu senden. Nach meiner Erfahrung führen alle Versuche, das Senden vieler Briefe über Yandex.Mail oder Google.Mail zu organisieren, nur dazu, dass die empfangenden Mailserver nach drei oder vier Briefen Nachrichten als Spam markieren. Das heißt, Probleme treten bereits in der Debugging-Phase auf, ganz zu schweigen von der Produktion. Daher musste ich mich um den Mailgun-Service kümmern, über den Briefe schnell und problemlos zugestellt werden. Es gibt nur ein Missverständnis mit Mailgun: In einigen Artikeln schreiben sie, dass sie 10.000 Briefe pro Monat kostenlos versenden. Und auf der Website von Mailgun selbst ist es irgendwie rutschig geschrieben, dass ich vom Moment der Registrierung an 10.000 Briefe verstehe. , , .


Mailgun . , , . , , SMTP. Laravel Mailgun, .



, . INPUT . . , SSH, . — DROP INPUT. , , .


SIP-, SIP- , , nf_conntrack_sip . , NAT, nf_nat_sip , , .



, . . — , , MySQL. — , . zip-, , , . — . rsync.


, — , borg . , .



GIT , , . . , , , ( ), - ( git , artisan ). /etc/sudoers , , .


, Laravel , . , , . , .


, ! — . ? : ! , CI . , , CI-, -.



. , ? Ja! - ? , ! . , .


, Laravel, CSS- Bootstrap 3 Bootstrap 4. - Bootstrap 4 Bootstrap 3, flex- , Bootstrap 3 , . Bootstrap 4, , .


, , HTTPS. , , . HTTP HTTPS, Let's Encrypt HTTPS - NGinx , .


, . , , . , , logrotate , .


. , , . -, . , . , , . , Laravel , , , . , , , .


Zusammenfassung


, " " " ". , . , , , , : , , , ( , , ).


? "". ? -, , . , , , , . , .


, , " , , " , . . ++ , . : , " ", , , , , . -. - , . , , . - : , - , , , .


— , - , , , . , proof-of-concept, , , , . , — , .


, - . , , . , - , , -. , , , ...


? : -, , , , , .

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


All Articles