Freunde! Wir setzen eine Reihe von Veröffentlichungen „ohne Schnitte“ über Designprozesse, IT-Technologien und effektive Arbeitsweise fort. Heute werden wir über ein sehr schmerzhaftes Thema sprechen, das Sodbrennen im Gehirn verursacht - die Auswahl von Technologien, Programmiersprachen, die Rolle von Architekten, Analysten, Teamleitern und Hellsehern, um das epische Problem zu lösen: Starten Sie nach Möglichkeit innerhalb einer angemessenen Zeit eine Softwarelösung. Und wir werden uns getrennt mit einer Analyse der Korrelation der Größe von Körperteilen eines Teils des Teams mit der Produktivität des Gehirns eines anderen befassen, um uns überhaupt nicht zu langweilen. Kaffee einschenken und los geht's!
Wie man Experten wird
Um objektiv zu verstehen, warum es in den angegebenen Fragen immer noch keine Klarheit gibt und es so viele „religiöse“ Streitigkeiten mit Menschenopfern gibt, müssen Sie abgelenkt sein, lächeln und das Leben eines IT-Spezialisten mit einem Küchenmesser in Form einer gestrichelten Linie auf einen Tisch mit Quadraten zeichnen, die das gewonnene Wissen bedeuten.

Der Spaß beginnt damit, dass selbst an spezialisierten Universitäten in der Regel nicht genügend Kenntnisse für professionelles Programmieren vorhanden sind und die Kompetenz eines Spezialisten direkt vom mentalen Kampf gegen Faulheit abhängt: Nehmen Sie sich ein paar Stunden lang ein Buch / einen Code oder stürzen Sie sich mit einer Dose Bier vor den Fernseher. Natürlich kann nur ein kleiner Teil sozialen Netzwerken, Fernsehserien, Online-Spielen standhalten und selbstlos lernen, aber selbst wenn sie wie die Mönche ständig und täglich einen Teil ihres Lebens opfern, können sie leicht eine, gut, manchmal zwei industrielle Programmiersprachen und mehrere verstehen verwandte Technologien. Und der Schnurrbart, die Rente beginnt und während Bienen zu pflanzen.
Bei solchen Schwierigkeiten reicht das für den Erfolg gewonnene Wissen jedoch immer noch nicht aus, und es ist eine ständige Spezialisierung auf Entwicklungsprojekte erforderlich, vorzugsweise mit höllischen Fristen, da die Schreibfähigkeiten sofort schnell und korrekt ziemlich bald verloren gehen.
Infolgedessen können nur wenige Quadrate mit einem Messer geschnitten werden, und je mehr rechts, desto weniger Quadrate sind in der Regel vorhanden, da Kinder geboren werden, Bekannte auftauchen, Hobbys und Sie zumindest nachts ein wenig für sich selbst leben und endlich genug von den kleinen Tanks bekommen möchten.
Eine sehr verständliche Analogie eines IT-Experten ist vielleicht ein Kampfsportspezialist, der nach der Schule Woronesch nach China verließ, 10 Jahre in einem Kloster verbrachte, sich die Fingerknöchel bis zu den Schultern füllte, sein Genitalschwert abschnitt und 20 Stunden am Tag trainierte. Ein Kämpfer wird sogar nett sein, mehrere Dialekte des Chinesischen zu kennen, aber eines Tages wird er einem dunkelhäutigen Mann begegnen, der sich
Capoeira gewidmet hat. Auf der Ebene der Zeichen werden sie sich höchstwahrscheinlich verstehen und in der Lage sein, Technologie für ein Softwareprojekt auszuwählen, aber leider muss man meistens aggressive Fans von Cosplay und Science Fiction treffen - in einem Jedi-Kostüm mit einem Plastiklichtschwert in der Hand.
Copy-Paste, Frameworks und Science Fiction
Offensichtlich können nur wenige die Wahrheit so selbstlos studieren und lernen, und im wirklichen Leben finden Treffen und Streitigkeiten über Technologien und Programmiersprachen hauptsächlich zwischen Fans verschiedener und modischer „Serien“ statt, die den Unterschied zwischen IP und TCP oft nicht kennen. Das Problem wird durch externes aggressives Marketing verschärft - die meisten großen IT-Anbieter „rekrutieren“ aktiv Follower über aufgepumpte Informationskanäle in ihre Reihen. Sie müssen nicht weit gehen, um Beispiele zu nennen - Mozilla fördert Rust, Google fördert Go, Oracle ist interessiert (?) An der Förderung von Java, Microsoft entwickelt C #, JetBrains ist Kotlin, Aliens sind Haskell und die wissenschaftliche Gemeinschaft ist unter dem Deckmantel von AI und ML, einem Neuron, nicht überglücklich und Datatatanismus, für viel Geld werden verkauft ... staubige akademische Kurse in Wahrscheinlichkeitstheorie, Lineal und Statistik für immer und ewig, Amen :-)

Und wenn ein Fan von Game of Thrones mit einem Fan des Sopran-Clans über die Vorteile von
aspektorientierter Programmierung ,
Mixins und
Closures zu streiten beginnt, bleibt nur, aufrichtig zu lachen und die Debattierer mit heiligem Sand aus Tibet und McDonald's Kartoffeln zu bestreuen. Sie werden nicht in der Lage sein, auf nützliche und objektive Schlussfolgerungen zu warten, und Sie werden noch mehr verwirrt sein - und noch schlimmer, Sie werden einen viralen Poppin bekommen und in einem gestreiften Mantel laufen.
Traditionen und "Korrektheit"
Tatsache ist, dass die Montage eines Autos aus Eisen eine ziemlich teure und lange Aufgabe ist: Sie benötigen Material, Schweißen, Wissen, einen Raum, ein Mädchenplakat mit den richtigen Formen usw. Und ein Programm zu schreiben, besonders nicht alleine, ist weit verbreitet. Virtuelle Kreativität - explodiert und zerknittert und streckt die Welt weiter. Ein Meer digitaler Inhalte, oft ahnungslos und primitiv, in denen alle Schriftsteller und Künstler das Web überflutet haben. Infolge der relativen Einfachheit des "Selbstausdrucks" in der Welt erschien in relativ kurzer Zeit nach dem Zweiten Weltkrieg eine große Anzahl nicht nur Programme, sondern auch Programmiersprachen. Das Schreiben einer neuen Programmiersprache ist nicht schwierig, viel schwieriger - um sie an Popularität zu gewinnen. Historisch gesehen ist es so, dass die Sprachen, die gelernt haben, „sie richtig zu schreiben“ (zum Beispiel C ++, Java, ECMA262), jetzt populär sind, und die Sprachen, die „später gemacht haben und besser zu sein scheinen“ (zum Beispiel C #, Python3, Rust, Kotlin). sind viel weniger beliebt. Wenn Sie eine "korrektere" Sprache wählen, besteht die Gefahr, dass Sie nicht genügend Entwickler finden, die sie kennen, oder es kann vorkommen, dass die Sprache einfach aufhört, sich zu entwickeln oder in die Ewigkeit aufsteigt, wie Haskell. Aus diesem Grund wählen sie nach dem gesunden Menschenverstand oft sozusagen traditionelle Technologien, auch wenn sie nicht ganz „korrekt“ und konsistent sind, voller Krücken und Spuren des Erwachsenwerdens, aber getestet, beliebt und entwickelt.

Im Zusammenhang mit aktiver Entwicklungsgraphomanie (insbesondere in Richtung Frontend, obwohl npm auch Spaß macht) möchte ich vor der gedankenlosen Verwendung von Bibliotheken und
Frameworks warnen. Es ist wichtig, die Entwicklungshistorie des Frameworks, das Kontingent der Entwickler (je einfacher die Technologie, desto mehr Überraschungen gibt es) und die Dauer der Versionsunterstützung zu betrachten.
In Open-Source-Projekten ist es normalerweise nicht üblich, das Framework für eine lange Zeit aufrechtzuerhalten, beispielsweise 3-5 Jahre oder länger - dies ist kitschig, teuer und langweilig. Daher wird in der Regel nach Erreichen einer kritischen Masse an „Krücken“ die nächste Version in ein oder zwei Jahren erstellt. Ich empfehle Benutzern ihrer vorherigen Versionen, ihr Projekt zu übertragen. Machen Sie es selbst, da die vorherige Version nicht mehr aktualisiert wird und die darin enthaltenen Sicherheitsfehler ebenfalls nicht behoben werden. Beispiele für eine solche "Verantwortungslosigkeit" sind einfach das Meer.
Kommerzielle Bibliotheken und Frameworks leiden in der
Regel nicht an einer ähnlichen Kinderkrankheit (obwohl nicht alle, müssen Sie die Dokumentation sorgfältig prüfen und dieses Problem gründlich untersuchen) und die Abwärtskompatibilität für 5 oder mehr Jahre aufrechterhalten. Bitte achten Sie besonders darauf, sonst müssen Sie Ihre Weblösung plötzlich von Grund auf neu schreiben!
In diesem Punkt ist es im Allgemeinen besser, ein Sprichwort über eine Meise und einen Kran zu verwenden.
Neu oder ... fertig
Ein weiteres sehr beliebtes psychologisches Problem in der Entwicklung ist die Wahl zwischen "Mach es von Grund auf neu" und "Mach es fertig". Ich werde Ihnen ein Geheimnis verraten - jeder möchte Götter sein, unerfahrene Entwickler, was übrigens normal ist, sie möchten pumpen und einen Eintrag in den Lebenslauf bekommen und sich dafür entscheiden, "es von Grund auf neu zu machen". Aber dann gehen sie normalerweise aus Langeweile nach sechs Monaten oder einem Jahr und oft aufgrund mangelnder Erfahrung müssen ihre Kreationen immer wieder von Grund auf neu geschrieben werden. Erfahrene Shaolin-Mönche versichern sich in der Regel gegen Fehler und Überraschungen von Kindern, wählen vorgefertigte Lösungen und Bibliotheken aus und verbringen die verbleibende Freizeit mit der Entwicklung von nicht standardmäßigen, exklusiven Funktionen für dieses Webprojekt. Und es wird nicht langweilig!

Eine gute Assoziation könnte darin bestehen, eine Datenbank auszuwählen - was für ein Webprojekt, eine Oracle-Datenbank oder eine MySQL-Datenbank zu verwenden ist (ja, ich weiß, dass sie jetzt von einem Unternehmen entwickelt werden). Erfahrungsgemäß werden 99% der Webentwicklungsaufgaben auch unter hoher Last in MySQL hervorragend und mit hoher Geschwindigkeit gelöst. Und wenn sich das Ergebnis nicht unterscheidet, warum ...? :-)
Daher besteht ein Softwareprojekt heute normalerweise aus einer Reihe vorgefertigter und getesteter Bibliotheken und Frameworks mit einer guten Support-Zeit und nur einem kleinen Teil der für dieses Projekt spezifischen Funktionen. Und das ist meiner Meinung nach richtig.
Schwer und lang oder ... schnell und einfach?
Dies ist auch eine bekannte Ursache für zahlreiche und endlose Streitigkeiten. Tatsächlich sind moderne IT-Technologien und Programmiersprachen grob in zwei Teile unterteilt: einfach für die Mehrheit (keine Notwendigkeit, sich eingehend mit ein paar Tagen zum Verständnis zu befassen) und schwierig für die Minderheit (es bedarf einer ernsthaften und langen Spezialisierung, Monate zum Verständnis). Wie wir oben gesehen haben, lernen die meisten Menschen nicht gern. Wenn Sie also die richtige und zuverlässige Technologie implementieren, werden Sie keinen Erfolg haben, weil niemand sie vollständig verstehen kann und Sie russisches Roulette mit einer Black Box spielen werden. Ein beliebtes Beispiel: die Wahl zwischen
Redis oder
Cassandra - Produkte unterschiedlicher Komplexität. Oder ein anderes Beispiel: Python oder C ++.
In einfachen Sprachen ist die Programmierung oft viel, viel Größenordnungen schneller - vergleichen Sie ein Python-Skript mit 5 Zeilen und ähnlichen C-Code mit 100 Zeilen. Aber normalerweise arbeiten „einfache“ Sprachen und universelle Technologien viel langsamer und verbrauchen viel mehr RAM :-) Schließlich muss man für alles bezahlen.
Dennoch werden zunehmend „einfache“ Sprachen verwendet, um die meisten Aufgaben eines Softwareprojekts zu lösen, bei denen keine besonderen Anforderungen an Super-Speed und RAM erforderlich sind. Und Eisen wird immer billiger. PHP ist jetzt sehr beliebt für die schnelle Webentwicklung und Python mit seiner sehr klaren und lesbaren Syntax für allgemeine Aufgaben und maschinelles Lernen. JavaScript ist sehr praktisch, um nicht nur die Weboberfläche zu automatisieren, sondern auch ... um sehr schnelle Serveranwendungen auf
Node.js zu erstellen. Selbst mit seiner primitiven Syntax können Sie auf leistungsstärkere, aber viel schwieriger zu verstehende Java-Aufgaben in Systemaufgaben verzichten, und eine mobile Anwendung kann schnell um Größenordnungen erstellt werden, die für Anfänger in Kotlin einfacher und zugänglicher ist. Mit viel geringeren Risiken ist es möglich, eine Hochlastanwendung in Rust auszuführen, ohne sich mit den Feinheiten der Speicherverwaltung in C ++ zu befassen. Aber niemand, der bei klarem Verstand ist, würde ein Spiel in Java schreiben und sich an das beliebte Minecraft erinnern, das nur in einer Entfernung von 10 Metern vom Display gespielt werden kann, und blinzeln :-)
Daher ist es ratsam, für jede Aufgabe ein bestimmtes, beliebtes Werkzeug auszuwählen, das von ihm geschärft wird. Je mehr vorgefertigte Werkzeuge verwendet werden, desto besser.
Es ist komisch, aber in der gegenwärtigen Realität kann nicht einmal die Wahl der Sprache, sondern die Wahl der Sprachmerkmale einen entscheidenden Einfluss auf den Erfolg haben. Wenn Sie beispielsweise ein Team haben, das keine Erfahrung in der objektorientierten Programmierung und keine Kenntnisse über Entwurfsmuster hat, können Sie einen so offensichtlichen Objektzoo schreiben, dass es möglicherweise einfacher ist, das Problem mit 100 Funktionen in einer monolithischen Datei zu lösen, die für alle verständlich ist, als sich vor Hunderten von Objekten in einem Büro zu verstecken Monster mit einem Ständer anstelle von Kopf und Ohren anstelle von Beinen. Aus diesem Grund ermöglichen einfache Sprachen (wie Python, PHP, Javascript, Ruby), die keine redundanten Möglichkeiten für die Entwicklung von Graphomanie und Perfektionismus bieten und sich auf Klarheit, Eindeutigkeit (Python) und Prägnanz (PHP) konzentrieren, zunehmend den Erfolg. Nicht umsonst sind Geschichten so beliebt, als eine Website in C ++ erstellt wurde und was für ein Albtraum sich später herausstellte.
Eine gute Analogie ist hier ein Beispiel für teure und schwer zu „stimmende“ mittelalterliche Ritter und ... Hooligans mit Schusswaffen. Sie können Ihr ganzes Leben trainieren und ein Multithread-Java-Samurai werden, aber Sie können plötzlich Ihr Leben beenden, wenn Sie einen Schüler mit einer ähnlichen und viel einfacheren Lösung in Python oder Go treffen.
ARCHITEKTUREN UND ARCHITEKTUREN
In der Tat war es vor 10 bis 15 Jahren notwendig, lange Zeit dicke Bücher zu studieren und zu lesen, um die Prinzipien des Platzierens von Objekten und ihrer Interaktion auf separaten Servern und Clustern (j2ee, corba, com) zu verstehen. Echos dieses Booms auf Architektur und Architekten finden sich immer noch in monströsen Kreationen wie dem
Frühling . Aber die Zeiten ändern sich, die Technologie wird leistungsfähiger und erschwinglicher. Durch die Bereitstellung einiger kostenloser Apache-Webserver, einer MySQL-Datenbank und einer
RabbitMQ- Warteschlange irgendwo in
Amazon können Sie die meisten Probleme lösen, die zuvor in
Anwendungsserverkonfigurationen verfügbar waren, die für die überwiegende Minderheit verständlich sind.
Wenn die Aufgabe darin besteht, massive Netzwerkverbindungen zu unterstützen, können Sie einen Cluster von Node.js-Computern bzw. Computern mit
Erlang erstellen und
ruhig schlafen, anstatt Ihre eigene Serverlösung beispielsweise in Go oder C ++ zu schreiben.
Wenn Sie ständig im Fluss recherchieren müssen, eines von 10 bis 20 Modellen für maschinelles Lernen auswählen und diese schnell in der Cloud für den Kundenservice bereitstellen müssen, wird Python mit einer großen Anzahl von Bibliotheken natürlich zu einer sehr praktischen und praktischen Lösung und so weiter.
Natürlich sind in eng spezialisierten Projekten noch fundierte Kenntnisse in OOP,
FP , Architektur und
Informatik erforderlich, aber immer häufiger reicht es aus zu wissen, aus welchen Blöcken die Lösung zusammengestellt werden soll, und dies führt das Softwaresystem häufig viel schneller zum Ziel.
Team Matching
Auf der Grundlage des Vorstehenden ist es offensichtlich, dass sich das Team höchstwahrscheinlich nur im begrenzten Rahmen der für das Projekt ausgewählten Technologien entwickeln wird. Die Einheiten werden anfangen, verwandte Themen zu graben, und ein kleiner Teil von ihnen wird Fachliteratur lesen, aber dies ist leider ein Ausnahmefall. Daher wird empfohlen, diejenigen auszuwählen, die bereits Erfahrung mit den angegebenen Sprachen / Bibliotheken haben. Dies kann im Lebenslauf und in den Interviews überprüft werden. Und nur diejenigen, die von Fernsehsendungen und sozialen Netzwerken wirklich nicht niedergeschlagen werden können, können nach Erhalt eines von arteriellem Blut vorab unterzeichneten Vertrags für „Wachstum“ gehalten werden :-)
In nicht standardmäßigen Projekten müssen Sie jedoch mindestens einen Entwickler finden, der etwas anderes weiß und ausgezeichnet ist, außer Python, Ruby, PHP, Javascript, Go, Perl, Bash, Chanson. Die Chancen, dass der Kämpfer die Algorithmen, Entwurfsmuster, Netzwerkstandards und OOP gut kennt, sind erheblich verbessert.
Wenn sich das Projekt auf maschinelles Lernen bezieht und Sie etwas vertiefen müssen, müssen Sie einen echten Mathematikanalytiker finden, vorzugsweise mit einem wissenschaftlichen Abschluss und Python-Kenntnissen. Ich meine es ernst - für maschinelles Lernen ohne spezielle Ausbildung müssen Sie mehrere Monate am Tag (Wahrscheinlichkeitstheorie, lineare Algebra, Methode der kleinsten Quadrate, Statistik, Bayes-Theorem und seine Technik) mehrere Monate, wenn nicht sogar Jahre lang hart lernen.
Prozesse oder Technologien?
Oft finden Sie langlebige und große Softwareprojekte, die in scheinbar „unangemessenen“ Programmiersprachen oder Bibliotheksgruppen geschrieben sind. Zum Beispiel stößt man oft auf riesige Bash-Control-Skripte oder riesige wissenschaftliche Bibliotheken und Frameworks für genaue Berechnungen auf ... Python mit Dodbyba-Ententypisierung. Das Geheimnis liegt in strengen Prozessen und Praktiken. Verwenden von:
- Vorentwurf, Stresstest und Risikoanalyse
- automatisierte Einheiten- und Integrationstests (vorzugsweise 100% Abdeckung)
- gemeinsame Kodierungsstandards
- gute Dokumentation von Code und Systemkomponenten
- maximale transparente Kommunikation innerhalb des Teams
- Überwachung und Analyse der Serverumgebung
Sie können im Prinzip eine Softwarelösung für jede Technologie erstellen, die jahrelang funktioniert und Kunden begeistert. Und umgekehrt: Wenn Sie mit überteuerten "Show-Offs" mit Black Boxes arbeiten, sich nicht mit den Details der Technologie befassen, Nachlässigkeit und persönliche Interessen anstelle von Teaminteressen fördern, können Sie monatelang versuchen, ein Projekt zu starten, einen Fehler zu korrigieren und Dutzende zu verursachen - leider ist diese Situation recht häufig.
Zusammenfassung
Zusammenfassen und priorisieren:
- Zunehmend kann man eine Situation beobachten, in der die Geschwindigkeit des Starts eines Softwareprojekts ein entscheidender Erfolgsfaktor ist. Es ist schlimmer, etwas unnötig langes und hartes zu tun, als schnell eine für Kunden nützliche Lösung freizugeben und Feedback für den nächsten Ruck zu sammeln
- Ein schneller Start ist nur möglich, wenn maximal fertige Komponenten, Frameworks und Bibliotheken mit einer angemessenen Supportdauer verwendet werden (unter Berücksichtigung der erwarteten Lebensdauer Ihres Websystems).
- Leider sind algorithmische und architektonische Kenntnisse weniger gefragt. Häufig sind Erfahrungen bei der Lösung ähnlicher Probleme und die Verwendung von Toolboxen sowie die Stärken von Cloud-Anbietern willkommen.
- Sie müssen sich nicht einschränken und alles auf eine Technologie und nur eine, BESTE Programmiersprache, beschränken - eine Schusswaffe in den Händen eines Kindes ist effektiver als eine Kampfkunststudie der Samurai, die alle bewusst und unbewusst leben. Perfektionismus und Idealisierung töten Softwaresysteme. Wählen Sie für jede Aufgabe im Projekt die richtige Waffe. Nehmen Sie das fertige und konzentrieren Sie die verbleibenden Anstrengungen auf das Nicht-Standard.
- Ausgewählte Technologien sollten einfach, klar und für die Mehrheit des Teams zugänglich sein. Schauen Sie sich an, was sie hauptsächlich über ein ähnliches Projekt schreiben, und nehmen Sie diesen Technologie-Stack selbst in die Hand. Automatisieren Sie das Hosting nicht mit Haskell und schreiben Sie keine Websites in C ++ :-) Wenn Ihr Projekt "startet" und sich zu entwickeln beginnt, können Sie nur in Betracht ziehen, seine kleinen Teile in komplexeren Technologien und Programmiersprachen neu zu schreiben. In der Regel erreichen Softwareprojekte dieses Stadium jedoch nicht oder erst einige Jahre später.
- Mit dem Framework können Sie den Start eines Softwareprojekts um Größenordnungen beschleunigen. Stellen Sie sicher, dass Sie die Verfügbarkeit einer guten Dokumentation überprüfen und den Supportzeitraum für das Framework angeben, damit bei einer vollständigen Neufassung in 2-3 Jahren keine Probleme auftreten. Dies ist ein sehr häufiger Fall unserer Kunden.
- Glauben Sie nicht an die Lernfähigkeit des Teams - es gibt zu viele Ablenkungen im Leben und die Situation wird immer schlimmer. Studieren Sie Ihren Lebenslauf sorgfältig, überprüfen Sie Zertifikate und Prüfungen und versuchen Sie, sich so weit wie möglich auf das praktische Ergebnis zu konzentrieren. Stellen Sie die Praxis zumindest zum Zeitpunkt der Erstellung der ersten Version einer funktionierenden Lösung über die Theorie.
- Technologie und Programmiersprache (n) sind keine kritischen Erfolgsfaktoren. Konzentrieren Sie sich darauf, die wichtigsten Prozesse aufzubauen und wichtige Entwicklungs- und Entwurfspraktiken zu implementieren. Die richtigen Prozesse führen in der Regel garantiert zum „richtigen“ Ergebnis. « » « », . , 2-3 .
, , !