Der Artikel wurde als Antwort auf einen zuvor veröffentlichten Antipodenartikel geschrieben.

In den letzten mehr als zwei Jahren habe ich mit Go einen speziellen RADIUS-Server mit einem entwickelten Abrechnungssystem implementiert. Dabei lerne ich die Feinheiten der Sprache selbst. Die Programme selbst sind sehr einfach und nicht der Zweck, einen Artikel zu schreiben, aber die Erfahrung mit Go selbst verdient es, ein paar Worte zu seiner Verteidigung zu sagen. Go wird zu einer immer beliebteren Sprache für seriösen, skalierbaren Code. Die Sprache wird in Google erstellt und dort aktiv verwendet. Zusammenfassend glaube ich aufrichtig, dass das Go-Sprachdesign für dumme Programmierer schlecht ist.
Entwickelt für schwache Programmierer?
Schwaches Gerede über Probleme. Starkes Gespräch über Ideen und Träume ...
Go ist sehr einfach zu erlernen, so einfach, dass Sie den Code mit wenig oder gar keiner Vorbereitung lesen können. Diese Funktion der Sprache wird in vielen Unternehmen der Welt verwendet, wenn der Code zusammen mit Nicht-Kernspezialisten (Managern, Kunden usw.) gelesen wird. Dies ist sehr praktisch für Methoden wie Design Driven Development.
Selbst unerfahrene Programmierer beginnen nach ein oder zwei Wochen, ziemlich anständigen Code zu produzieren. Das Buch, das ich Go studiert habe, heißt „Go Programming“ (geschrieben von Mark Summerfield). Das Buch ist sehr gut, es berührt viele Nuancen der Sprache. Nach unnötig komplizierten Sprachen wie Java, PHP ist der Mangel an Magie erfrischend. Früher oder später haben viele eingeschränkte Programmierer den Wunsch, alte Methoden in einem neuen Bereich anzuwenden. Ist das wirklich notwendig?
Rob Pike (der Hauptideologe der Sprache) hat Go als eine Industriesprache geschaffen, die einfach zu lesen und effektiv zu verwenden ist. Die Sprache ist auf maximale Produktivität in großen Teams ausgelegt, und daran besteht kein Zweifel. Viele unerfahrene Programmierer beklagen, dass ihnen viele Funktionen fehlen. Dieser Wunsch nach Einfachheit war eine bewusste Entscheidung der Sprachentwickler, und um vollständig zu verstehen, wofür es war, müssen wir die Motivation der Entwickler und das, was sie in Go erreicht haben, verstehen.
Warum wurde es so einfach gemacht? Hier sind ein paar Zitate von Rob Pike:
Der entscheidende Punkt hierbei ist, dass unsere Programmierer keine Forscher sind. Sie sind normalerweise sehr jung, kommen nach der Schule zu uns, vielleicht haben sie Java, C / C ++ oder Python studiert. Sie sind nicht in der Lage, eine herausragende Sprache zu verstehen, aber gleichzeitig möchten wir, dass sie gute Software erstellen. Deshalb sollte Sprache leicht zu verstehen und zu lernen sein.
Er sollte vertraut sein, grob gesagt wie C. Google-Programmierer beginnen ihre Karriere früh und sind hauptsächlich mit Verfahrenssprachen vertraut, insbesondere mit der C-Familie. Das Erfordernis einer schnellen Produktivität in einer neuen Programmiersprache bedeutet, dass die Sprache nicht zu radikal sein sollte.
Kluge Worte, richtig?
Artefakte der Einfachheit
Einfachheit ist eine notwendige Voraussetzung für das Schöne. Leo Tolstoi.
Einfach zu sein ist eines der wichtigsten Ziele in jedem Design. Wie Sie wissen, ist ein perfektes Projekt kein Projekt, bei dem nichts hinzugefügt werden muss, sondern eines, bei dem nichts entfernt werden muss. Viele glauben, dass ein komplexes Werkzeug benötigt wird, um komplexe Aufgaben zu lösen (oder sogar auszudrücken). Dies ist jedoch nicht so. Nehmen Sie zum Beispiel die PERL-Sprache. Die Ideologen der Sprache glaubten, dass ein Programmierer mindestens drei verschiedene Möglichkeiten haben sollte, um ein Problem zu lösen. Die Ideologen der Go-Sprache gingen einen anderen Weg, sie entschieden, dass ein Weg genug ist, um das Ziel zu erreichen, aber wirklich gut. Dieser Ansatz hat eine ernsthafte Grundlage: Der einzige Weg ist leichter zu lernen und schwerer zu vergessen.
Viele Migranten beklagen, dass die Sprache keine eleganten Abstraktionen enthält. Ja, aber das ist einer der Hauptvorteile der Sprache. Die Sprache enthält ein Minimum an Magie - daher sind keine tiefen Kenntnisse erforderlich, um das Programm zu lesen. Die Ausführlichkeit des Codes ist überhaupt kein Problem. Ein gut geschriebenes Golang-Programm wird vertikal mit wenig oder keiner Strukturierung gelesen. Außerdem ist die Lesegeschwindigkeit eines Programms mindestens eine Größenordnung schneller als das Schreiben. Wenn Sie der Meinung sind, dass der gesamte Code eine einheitliche Formatierung aufweist (ausgeführt mit dem integrierten Befehl gofmt), ist das Lesen einiger zusätzlicher Zeilen überhaupt kein Problem.
Nicht sehr ausdrucksstark
Kunst toleriert nicht, wenn sie seine Freiheit einschränkt. Genauigkeit liegt nicht in seiner Verantwortung.
Aufgrund des Wunsches nach Einfachheit fehlen Go Konstruktionen, die in anderen Sprachen für Menschen, die an sie gewöhnt sind, als etwas Natürliches wahrgenommen werden. Das mag zunächst etwas unpraktisch sein, aber dann merkt man, dass das Programm um ein Vielfaches einfacher und eindeutiger zu lesen ist.
Ein Konsolendienstprogramm, das stdin oder eine Datei aus Befehlszeilenargumenten liest, sieht beispielsweise folgendermaßen aus:
package main import ( "bufio" "flag" "fmt" "log" "os" ) func main() { flag.Parse() scanner := newScanner(flag.Args()) var text string for scanner.Scan() { text += scanner.Text() } if err := scanner.Err(); err != nil { log.Fatal(err) } fmt.Println(text) } func newScanner(flags []string) *bufio.Scanner { if len(flags) == 0 { return bufio.NewScanner(os.Stdin) } file, err := os.Open(flags[0]) if err != nil { log.Fatal(err) } return bufio.NewScanner(file) }
Obwohl die Lösung für dasselbe Problem in der D-Sprache etwas kürzer aussieht, ist es nicht einfacher zu lesen
import std.stdio, std.array, std.conv; void main(string[] args) { try { auto source = args.length > 1 ? File(args[1], "r") : stdin; auto text = source.byLine.join.to!(string); writeln(text); } catch (Exception ex) { writeln(ex.msg); } }
Kopiere die Hölle
Der Mensch trägt die Hölle in sich. Martin Luther.
Anfänger beschweren sich ständig über Go wegen des Mangels an Generika. Um dieses Problem zu beheben, verwenden die meisten von ihnen das direkte Kopieren von Code. Zum Beispiel glauben solche unglücklichen Fachleute, dass die Funktion zum Zusammenfassen der Liste von Ganzzahlen nur durch einfaches Kopieren und Einfügen für jeden Datentyp implementiert werden kann.
package main import "fmt" func int64Sum(list []int64) (uint64) { var result int64 = 0 for x := 0; x < len(list); x++ { result += list[x] } return uint64(result) } func int32Sum(list []int32) (uint64) { var result int32 = 0 for x := 0; x < len(list); x++ { result += list[x] } return uint64(result) } func main() { list32 := []int32{1, 2, 3, 4, 5} list64 := []int64{1, 2, 3, 4, 5} fmt.Println(int32Sum(list32)) fmt.Println(int64Sum(list64)) }
Die Sprache verfügt über ausreichende Mittel, um solche Konstruktionen zu implementieren. Zum Beispiel ist die allgemeine Programmierung in Ordnung.
package main import "fmt" func Eval32(list []int32, fn func(a, b int32)int32) int32 { var res int32 for _, val := range list { res = fn(res, val) } return res } func int32Add(a, b int32) int32 { return a + b } func int32Sub(a, b int32) int32 { return a - b } func Eval64(list []int64, fn func(a, b int64)int64) int64 { var res int64 for _, val := range list { res = fn(res, val) } return res } func int64Add(a, b int64) int64 { return a + b } func int64Sub(a, b int64) int64 { return a - b } func main() { list32 := []int32{1, 2, 3, 4, 5} list64 := []int64{1, 2, 3, 4, 5} fmt.Println(Eval32(list32, int32Add)) fmt.Println(Eval64(list64, int64Add)) fmt.Println(Eval64(list64, int64Sub)) }
Und obwohl sich herausstellte, dass unser Code etwas länger als der vorherige Fall war, wurde er verallgemeinert. Daher wird es für uns nicht schwierig sein, alle arithmetischen Operationen zu implementieren.
Viele werden sagen, dass das D-Programm deutlich kürzer aussieht und richtig sein wird.
import std.stdio; import std.algorithm; void main(string[] args) { [1, 2, 3, 4, 5].reduce!((a, b) => a + b).writeln; }
Es ist jedoch nur kürzer, aber nicht korrekter, da das Fehlerbehandlungsproblem in der D-Implementierung vollständig ignoriert wird.
Im wirklichen Leben verringert sich die Lücke schnell, wenn die Komplexität der Logik zunimmt. Noch schneller wird die Lücke kleiner, wenn eine Aktion erforderlich ist, die nicht mit Standard-Sprachoperatoren ausgeführt werden kann.
In Bezug auf Unterstützbarkeit, Erweiterbarkeit und Lesbarkeit gewinnt meiner Meinung nach die Go-Sprache, obwohl sie an Ausführlichkeit verliert.
Die verallgemeinerte Programmierung bietet uns in einigen Fällen unbestreitbare Vorteile. Dies zeigt deutlich das Sortierpaket. Um eine Liste zu sortieren, reicht es für uns aus, die Schnittstelle sort.Interface zu implementieren.
import "sort" type Names []string func (ns Names) Len() int { return len(ns) } func (ns Names) Less(i, j int) bool { return ns[i] < ns[j] } func (ns Names) Swap(i, j int) { ns[i], ns[j] = ns[j], ns[i] } func main() { names := Names{"London", "Berlin", "Rim"} sort.Sort(names) }
Wenn Sie ein Open Source-Projekt verwenden und den Befehl grep "interface {}" -R ausführen, werden Sie sehen, wie oft verwirrte Schnittstellen verwendet werden. Die engstirnigen Genossen werden sofort sagen, dass dies alles auf den Mangel an Generika zurückzuführen ist. Dies ist jedoch bei weitem nicht immer der Fall. Nehmen Sie zum Beispiel die Sprache DELPHI. Trotz derselben Generika enthält es einen speziellen Typ VARIANT für Operationen mit beliebigen Datentypen. Go macht das Gleiche.
Von einer Waffe auf Spatzen
Und eine Zwangsjacke muss der Größe des Wahnsinns entsprechen. Stanislav Lets.
Viele Fans von Extremsportarten können sagen, dass Go einen anderen Mechanismus zur Schaffung von Generika hat - Reflexion. Und sie werden Recht haben ... aber nur in seltenen Fällen.
Rob Pike warnt uns:
Dies ist ein leistungsstarkes Tool, das mit Vorsicht verwendet werden sollte. Es sollte vermieden werden, bis es unbedingt notwendig ist.
Wikipedia sagt uns Folgendes:
Reflexion bedeutet einen Prozess, bei dem ein Programm zur Laufzeit seine eigene Struktur und sein eigenes Verhalten verfolgen und ändern kann. Das der Reflexion zugrunde liegende Programmierparadigma wird als reflexive Programmierung bezeichnet. Dies ist eine Art Metaprogrammierung.
Wie Sie wissen, müssen Sie jedoch für alles bezahlen. In diesem Fall ist es:
- Schwierigkeiten beim Schreiben von Programmen
- Programmausführungsgeschwindigkeit
Daher sollte die Reflexion als großkalibrige Waffe mit Vorsicht eingesetzt werden. Die gedankenlose Verwendung von Reflexion führt zu unlesbaren Programmen, konstanten Fehlern und geringer Geschwindigkeit. Genau das ist, dass der Snob-Programmierer seinen Code vor anderen, pragmatischeren und bescheideneren Kollegen zur Schau stellen könnte.
Kulturgepäck von C? Nein, aus mehreren Sprachen!
Zusammen mit dem Staat bleiben den Erben Schulden.
Trotz der Tatsache, dass viele glauben, dass die Sprache vollständig auf dem Erbe von C basiert, ist dies nicht der Fall. Die Sprache hat viele Aspekte der besten Programmiersprachen aufgenommen.
Syntax
Zunächst basiert die Syntax grammatikalischer Konstruktionen auf der Syntax der C-Sprache. Die DELPHI-Sprache hatte jedoch auch einen signifikanten Einfluss. Wir sehen also, dass die überschüssigen Klammern vollständig entfernt werden, was die Lesbarkeit des Programms erheblich beeinträchtigt. Außerdem enthält die Sprache den Operator :: =, der der DELPHI-Sprache inhärent ist. Das Konzept der Pakete stammt aus Sprachen wie ADA. Die Deklaration nicht verwendeter Entitäten ist der Sprache PROLOG entlehnt.
Semantik
Die Semantik der DELPHI-Sprache wurde als Grundlage für Pakete verwendet. Jedes Paket kapselt Daten und Code und enthält private und öffentliche Einheiten. Auf diese Weise können Sie die Paketschnittstelle auf ein Minimum reduzieren.
Die Implementierungsoperation nach Delegierungsmethode wurde von DELPHI ausgeliehen.
Zusammenstellung
Kein Wunder, dass es einen Witz gibt: Go wurde entwickelt, während das C-Programm kompiliert wurde. Eine der Stärken der Sprache ist die ultraschnelle Kompilierung. Die Idee wurde von DELPHI entlehnt. Außerdem entspricht jedes Go-Paket dem DELPHI-Modul. Diese Pakete werden nur bei Bedarf neu kompiliert. Daher ist es nach der nächsten Bearbeitung nicht erforderlich, das gesamte Programm zu kompilieren, es reicht jedoch aus, nur die geänderten Pakete und Pakete in Abhängigkeit von diesen geänderten Paketen neu zu kompilieren (und dies nur, wenn sich die Paketschnittstellen geändert haben).
Hochwertige Designs
Die Sprache enthält viele verschiedene Konstrukte auf hoher Ebene, die in keiner Weise mit Sprachen auf niedriger Ebene wie C assoziiert sind.
- Linien
- Tabellen-Hash
- Scheiben
- Das Tippen von Enten stammt aus Sprachen wie RUBY (die leider viele nicht verstehen und nicht in vollem Umfang nutzen).
Speicherverwaltung
Die Speicherverwaltung verdient im Allgemeinen einen separaten Artikel. Wenn in Sprachen wie C ++ die Kontrolle vollständig dem Entwickler überlassen bleibt, wurde in späteren Sprachen wie DELPHI ein Referenzzählmodell verwendet. Bei diesem Ansatz waren zyklische Verbindungen nicht zulässig, da verlorene Cluster gebildet wurden. Daher ist die Erkennung solcher Cluster (wie in C #) in Go integriert. Darüber hinaus ist der Garbage Collector effektiver als die meisten derzeit bekannten Implementierungen und kann bereits für viele Echtzeitaufgaben verwendet werden. Die Sprache selbst erkennt Situationen, in denen ein Wert zum Speichern einer Variablen auf dem Stapel zugewiesen werden kann. Dies reduziert die Belastung des Speichermanagers und erhöht die Geschwindigkeit des Programms.
Parallelität und Wettbewerb
Die Parallelität und Wettbewerbsfähigkeit der Sprache ist nicht zu loben. Keine einfache Sprache kann mit der Go-Sprache auch nur aus der Ferne konkurrieren. Fairerweise ist anzumerken, dass das Modell nicht von den Autoren der Sprache erfunden wurde, sondern einfach aus der guten alten ADA-Sprache entlehnt wurde. Die Sprache ist in der Lage, Millionen paralleler Verbindungen unter Verwendung aller CPUs zu verarbeiten, während sie bei komplexen Multithread-Code-Problemen mit Deadlocks und Race-Bedingungen in der Größenordnung weniger häufig vorkommt.
Zusätzliche Vorteile
Wenn dies von Vorteil ist, wird jeder selbstlos.
Die Sprache bietet uns auch eine Reihe von unbestrittenen Vorteilen:
- Die einzige ausführbare Datei nach dem Erstellen des Projekts vereinfacht die Bereitstellung von Anwendungen erheblich.
- Statische Typisierung und Typinferenz können die Anzahl der Fehler im Code erheblich reduzieren, auch ohne Tests zu schreiben. Ich kenne einige Programmierer, die überhaupt nicht auf das Schreiben von Tests verzichten und gleichzeitig die Qualität ihres Codes nicht wesentlich beeinträchtigt.
- Sehr einfache Cross-Kompilierung und hervorragende Portabilität der Standardbibliothek, was die Entwicklung plattformübergreifender Anwendungen erheblich vereinfacht.
- RE2-reguläre Ausdrücke sind threadsicher und haben vorhersehbare Laufzeiten.
- Eine leistungsstarke Standardbibliothek, mit der die meisten Projekte auf Frameworks von Drittanbietern verzichten können.
- Die Sprache ist leistungsfähig genug, um sich auf das Problem zu konzentrieren, und nicht auf Methoden, um es zu lösen, und gleichzeitig niedrig genug, um das Problem effizient zu lösen.
- Das Go-Ökosystem enthält bereits sofort einsatzbereite Tools für alle Gelegenheiten: Tests, Dokumentation, Paketverwaltung, leistungsstarke Linters, Codegenerierung, einen Detektor für Rennbedingungen usw.
- Go Version 1.11 verfügt jetzt über ein integriertes semantisches Abhängigkeitsmanagement, das auf beliebten VCS-Hosts basiert. Alle Tools, aus denen sich das Go-Ökosystem zusammensetzt, verwenden diese Dienste, um Code von ihnen auf einen Schlag herunterzuladen, zu kompilieren und zu installieren. Und das ist großartig. Mit dem Aufkommen von Version 1.11 wurde auch das Problem mit der Paketversionierung vollständig behoben.
- Da die Hauptidee der Sprache darin besteht, Magie zu reduzieren, ermutigt die Sprache Entwickler, die Fehlerbehandlung explizit zu behandeln. Und das ist richtig, denn sonst wird er die Fehlerbehandlung einfach ganz vergessen. Eine andere Sache ist, dass die meisten Entwickler die Fehlerbehandlung absichtlich ignorieren und es vorziehen, den Fehler einfach weiterzuleiten, anstatt sie zu verarbeiten.
- Die Sprache implementiert die klassische OOP-Methodik nicht, da es in Go keine Virtualität in ihrer reinen Form gibt. Dies ist jedoch kein Problem bei der Verwendung von Schnittstellen. Das Fehlen von OOP verringert die Eintrittsbarriere für Anfänger erheblich.
Einfache Vorteile für die Gemeinschaft
Komplizieren ist einfach, Vereinfachen ist schwierig.
Go wurde so konzipiert, dass es einfach und hervorragend ist. Es wurde für intelligente Programmierer geschrieben, die alle Vorteile der Teamarbeit verstehen und die endlose Variabilität der Sprachen auf Unternehmensebene satt haben. Mit einem relativ kleinen Satz syntaktischer Konstruktionen in seinem Arsenal unterliegt es praktisch keinen Änderungen im Laufe der Zeit. Daher haben Entwickler viel Zeit speziell für die Entwicklung und nicht für ein endloses Studium von Sprachinnovationen frei.
Unternehmen haben auch eine Reihe von Vorteilen: Eine niedrige Einstiegsschwelle ermöglicht es Ihnen, schnell einen Spezialisten zu finden, und die Unveränderlichkeit der Sprache ermöglicht es Ihnen, nach 10 Jahren denselben Code zu verwenden.
Fazit
Die große Gehirngröße hat noch keinen einzigen Elefanten zum Nobelpreisträger gemacht.
Für jene Programmierer, deren persönliches Ego den Teamgeist überwiegt, sowie für Theoretiker, die akademische Aufgaben und endlose "Selbstverbesserung" lieben, ist die Sprache wirklich schlecht, weil sie eine universelle Handwerkssprache ist, die es nicht erlaubt, ästhetische Freude am Ergebnis ihrer Arbeit zu haben und sich zu zeigen ein Fachmann vor Kollegen (vorausgesetzt, wir messen den Geist genau anhand dieser Kriterien und nicht anhand des IQ-Koeffizienten). Wie alles im Leben ist es eine Frage der persönlichen Prioritäten. Wie alle lohnenden Innovationen hat die Sprache bereits einen langen Weg von der universellen Verleugnung zur Massenerkennung zurückgelegt. Sprache ist in ihrer Einfachheit genial, aber wie Sie wissen, ist alles Geniale einfach!
Zusammenfassung
Unter all der scharfen Kritik an Go fallen vor allem folgende Aussagen auf:
- Keine Generika. Wenn wir uns die Statistiken der beliebtesten Sprachen ansehen, stellen wir fest, dass die Hälfte der zehn wichtigsten Sprachen keine Generika enthält. Generika werden meist nur in Containern benötigt. Daher ist der Gewinn von ihnen nicht zu groß.
- Andere Sprachen wie Rust sind viel besser (zumindest in XXX-Site-Kategorien). Wenn wir uns die Statistiken der beliebtesten Sprachen ansehen, werden wir Rust überhaupt nicht in der Liste finden, oder es wird irgendwo unter der Bewertung liegen. Persönlich mag ich Rust, aber ich habe mich für Go entschieden.
- XXX hat so ein Brötchen. Dies ist die Kehrseite der Münze der Einfachheit. Ob es ein Nachteil ist oder nicht, muss jeder entscheiden. Die Entwickler des Projekts bevorzugten jedoch die Einfachheit.
- Sie werden Go 2.0 veröffentlichen, dann werden wir sehen. Diese Position wird von Beobachtern eingenommen, nicht von Praktizierenden.
- Nicht ausdrucksstark genug. Ich stimme zu, in einigen Bereichen ist Ausdruckskraft lahm, aber im Allgemeinen ist es eine einfache und konsistente Sprache. Darüber hinaus sind wir aufgrund der Armut der Sprache gezwungen, der Architektur der entwickelten Anwendung mehr Aufmerksamkeit zu schenken, was sich positiv auf ihre Flexibilität auswirkt.
Tatsächlich dachte der Artikel nicht über die syntaktischen Vorteile der Go-Sprache nach, sondern über einen kurzen Überblick über ihre Vorteile für die Teamarbeit und die effektive Entwicklung des zu entwickelnden Projekts. Es wurde davon ausgegangen, dass der Artikel in Bezug auf spezifischere Probleme fortgesetzt worden wäre. Aufgrund des mangelnden Interesses an dem Thema wird es jedoch höchstwahrscheinlich keine Fortsetzung geben.
Ein Experiment
Glauben Sie nicht den Worten - weder Ihren noch Fremden, sondern den Taten - sowohl Ihren als auch den Fremden.
Der letzte Teil richtet sich ausschließlich an Personen, die sich als konstruktiv denkende Optimisten betrachten und dies mit ihren eigenen Angelegenheiten bestätigen können. Der Rest des Publikums, bitte überspringen Sie diesen Teil.
Dieses Experiment wurde von Freunden inspiriert, die behaupteten, dass alle konstruktiv denkenden Optimisten die Weiten unseres Landes lange (zumindest virtuell) verlassen und sich beispielsweise für Stack Overflow entschieden hätten, und hier blieben meistens Snobs. Lange Zeit habe ich ihnen nicht geglaubt, deshalb habe ich beschlossen, dieses Experiment durchzuführen.
Auf dem Hub wurden mehrere Artikel veröffentlicht, die das Ergebnis der Analyse der Kommentare sind, zu denen ich zitiere.
- In der Tat wurde die Hypothese meiner Freunde bestätigt, aber es gibt immer noch angemessene Leute unter den Straßenhändlern, obwohl ihr Prozentsatz schnell sinkt. Juri Bykow nennt solche Menschen " Narren ", auf denen das ganze Land ruht. Ihm zufolge ist ihr Prozentsatz gering (etwa 2%). Ich bin nicht so pessimistisch und ich denke, dass es viel mehr davon gibt.
- Das Gesetz der Medien. Destruktive Informationen sind von viel größerem Interesse als konstruktive Informationen.
- Die Psychologie der Menge. Dies ist eine schreckliche Sache, es macht sogar ein missbräuchliches Schaf aus einer angemessenen Person. Ein Mann in einer Menschenmenge ist kein Mann mehr. Von Objektivität kann keine Rede sein. Keine logischen Argumente, keine maßgeblichen Quellen oder Präzedenzfälle betreffen ihn mehr.
- Verantwortung und Straflosigkeit. Menschen sind bereit, andere zu demütigen, um sich selbst zu erhöhen (zumindest in ihren eigenen Augen). Vor allem, wenn Sie nicht antworten müssen (was einfacher sein könnte - klicken Sie auf das Minuszeichen und Sie müssen nicht einmal einen Kommentar schreiben). Worte und Taten haben so viel gemeinsam wie zwischen einem Kanal und einem Abwasserkanal.
- Eitelkeit. Die meisten Snobs sind bereit, sich in irgendeiner Weise abzuheben. Sie haben keine Angst vor moralischen Barrieren.
- Pessimismus Im Gegensatz zu westlichen Ländern (und insbesondere Amerika) herrschen im Land pessimistische Gefühle vor. Wie Sie wissen, sucht ein Optimist nach Möglichkeiten inmitten von Schwierigkeiten, und ein Pessimist sucht nach Schwierigkeiten unter Chancen. In unserem Land achtet fast niemand auf die positiven Eigenschaften von irgendetwas.
- Professionalität und Weltanschauung. Die meisten Menschen wählen Werkzeuge als Selbstzweck und nicht als Mittel zum Zweck. Die Leute haben vergessen, wie man mit Informationen arbeitet. Die Menschen sehen keine Wälder hinter den Bäumen. Aus einer Reihe von Informationen können sie die Hauptgedanken nicht extrahieren. Niemand möchte aus einer anderen, für sich selbst nicht standardmäßigen Sichtweise schauen. Dissens wird unterdrückt. Es wird hier nicht akzeptiert.
- Freundlichkeit und Respekt. Gelobte freundliche Gruppen existieren nur in Worten. Agile Entwicklungswerte sind nur auf dem Papier.
- Heuchelei. Sie können dazu im Allgemeinen einen separaten Artikel schreiben.
- Prinzip. Es gibt Leute, die die richtige Frage stellen: „ Was zum Teufel mache ich? ”, Nicht jeder versteht jedoch, dass für uns aufgrund des Mangels an Prinzipien ein momentanes egoistisches Interesse wichtiger ist als alle unsere Prinzipien zusammen. Es ist am einfachsten, alles den Umständen zuzuschreiben und zu sagen, dass nichts von uns abhängt.
Mit tiefem Respekt und Sympathie für alle konstruktiv denkenden Optimisten.
Adverax