In letzter Zeit wurde auf Twitter viel über den 10x-Ingenieur gesprochen, was eine große Debatte darüber auslöste, was einen guten Ingenieur ausmacht. Es wurden einige wirklich dumme Dinge erwähnt, wie z.B. „10x-Ingenieure hassen Meetings“ und „10x-Ingenieure kommen zu spät ins Büro“ und „10x-Ingenieure haben normalerweise einen schwarzen Laptop-Hintergrund“. Allgemein scheint es, dass einige Leute denken, dass es in Ordnung ist, ein Arschloch zu sein, wenn man klug genug ist.
In Wix versuchen wir, die Arschlöcher vor der Tür zu lassen. Wir glauben, dass 10x-Ingenieure nicht nur Leute sind, die 10x schneller produzieren können als die meisten anderen, sondern auch Leute, die ein ganzes Team 10x besser machen können, indem sie einen positiven Einfluss auf jeden haben, mit dem sie zusammenarbeiten.
Viele Leute verbringen einen großen Teil ihrer Karriere damit, das zu werden, was wir für einen anständigen Ingenieur halten. Das bedeutet, dass man ein guter Programmierer ist, der Probleme lösen kann und die ihm zur Verfügung stehenden Werkzeuge wie IDE, Debugger, Dienste und Frameworks fließend zu benutzen weiß. Dieser Artikel versucht zu beschreiben, was wir bei Wix Engineering glauben, was einen guten Ingenieur zu einem 10-fachen Ingenieur macht.
Eine der wichtigsten Fähigkeiten eines Ingenieurs ist die Fähigkeit, unabhängig zu arbeiten. Kurz gesagt bedeutet das, dass man immer weiß, was man zu tun hat, und selten in einer Situation ist, in der man darauf wartet, dass einem jemand sagt, was man tun soll. Es bedeutet nicht, dass Sie alles selbst machen können, sondern nur, dass Sie wissen, wie Sie sich selbst und andere in Ihrem Team von Blockaden befreien können, und zwar auf eine saubere Art und Weise, die nur minimale technische Schulden verursacht. Wenn Sie z. B. durch ein Problem blockiert werden, werden Sie eine Lösung dafür finden, sei es, indem Sie die Hilfe Ihrer Kollegen in Anspruch nehmen oder das Problem selbst lösen. Unabhängige Ingenieure sind in der Lage, ein Projekt von der Idee bis zur Produktion durch alle Phasen zu führen. Sie sind in der Lage zu definieren, welche Dinge sie benötigen, um eine Aufgabe zu bewältigen, und sie wissen, wann sie die Fahne heben müssen, wenn sie Hilfe brauchen.
Planung
Das Schwierigste, womit weniger erfahrene Ingenieure zu kämpfen haben, ist die Fähigkeit, eine große Aufgabe in kleinere Schritte zu unterteilen. Das ist nicht nur wichtig, damit wir abschätzen können, wie lange etwas dauert, sondern es ist auch ein entscheidender Teil der Entwicklung von qualitativ hochwertiger Software. Eine korrekte Planung bedeutet, dass der Entwickler die erste Version des Produkts so früh wie möglich veröffentlichen kann und früher mit dem Feedback beginnen kann. Richtiges Planen bedeutet, dass man schon früh einen Entwurf des Systems hat und ein gutes Bild von dem hat, was man tun will, bevor man ins Wasser springt. Richtige Planung bedeutet, dass es keine großen Überraschungen gibt, die Ihr Design während der Entwicklung zerstören. Ein guter Ingenieur sollte in der Lage sein, eine Aufgabe aufzuschlüsseln, das Design und die Phasen der Freigabe zu definieren und Designdokumente und Schätzungen vorzulegen, um seinen Plan zu zeigen.
Bescheidenheit
Dies ist ein schwieriges Thema. Sogar die stärksten Ingenieure müssen oft noch wachsen, wenn es um Bescheidenheit geht. Es bedeutet, nicht in seine eigenen Lösungen verliebt zu sein. Zuhören zu können und die Lösungen anderer Leute zu akzeptieren. Das Beste von den anderen anzunehmen und, wenn man etwas sieht, das wie ein Fehler aussieht, zu versuchen, die Gründe dafür zu verstehen. Die Dinge offen zur Diskussion stellen. Lassen Sie andere ihre eigenen Lösungen vorschlagen. Teilen Sie Ihre Ideen mit und sorgen Sie sich nicht um die Anerkennung, die Sie dafür bekommen. Es ist wichtiger, dass sich alle mit einer Idee wohl fühlen und das Gefühl haben, dass es eine Teamleistung war, als dass alle wissen, dass es Ihre Idee war. Seien Sie ehrlich. Geben Sie den Leuten Anerkennung. Scheuen Sie sich nicht zu sagen, dass Sie sich geirrt haben, oder zuzugeben, dass jemand anderes Recht hat. Die Leute respektieren Menschen, die ihre Meinung ändern können.
Wiederverwendung
Es mag trivial klingen, aber die meisten Leute verstehen nicht, dass der beste Weg, um Fortschritte zu machen, darin besteht, auf der vorherigen Arbeit aufzubauen. Weniger erfahrene Ingenieure haben die schlechte Angewohnheit zu denken, dass sie am schnellsten vorankommen, wenn sie alles, was bereits existiert, ignorieren und von vorne anfangen. Gute Ingenieure werden immer gründlich nachschlagen, lernen, nachfragen und alle bereits vorhandenen Lösungen verstehen. Selbst wenn eine bestehende Lösung unzureichend ist, werden sie versuchen, sie zu verbessern, bevor sie sich entscheiden, sie zu ersetzen. Sie werden niemals eine bestehende Lösung ablehnen, ohne sich eingehend mit ihr zu befassen und ohne mit dem Eigentümer der bestehenden Lösung zu sprechen.
Mentalität der Infrastruktur
Wie oben beschrieben, kann die Wiederverwendung früherer Arbeit einen großen Einfluss auf die Menschen haben. Das bedeutet, dass Ingenieure immer Ausschau halten sollten, ob sie eine Möglichkeit haben, etwas Wiederverwendbares zu schaffen. Wenn sich eine solche Gelegenheit bietet, ist es am einfachsten, sie zu ignorieren. Etwas wiederverwendbar zu machen, kostet den „Hersteller“ immer mehr als etwas nicht wiederverwendbar zu machen, so dass viele kurzsichtige Menschen die Vorteile ignorieren, die sie und andere Teams auf dem Weg dorthin ernten werden. Ein guter Entwickler erkennt die Möglichkeiten, wiederverwendbare Dinge zu schaffen, weiß, wie man sie am besten wiederverwendbar macht, und investiert die Mühe, dies zu tun.
Master your domain
Der einzige Weg, gute Lösungen zu finden, ist, das Produkt, an dem man arbeitet, gründlich zu verstehen. Gute Ingenieure haben nicht nur ein tiefes Verständnis für das Produkt, das sie entwickeln. Sie kennen auch alle Anwendungsfälle, verstehen die Motivation für das Produkt und können leicht sinnvolle Gespräche mit dem Produktmanager führen, Entscheidungen in Frage stellen und Alternativen anbieten. Sie wissen, welche Funktionen wichtig und welche weniger wichtig sind, und können dementsprechend Prioritäten setzen und bei Bedarf Umgehungslösungen anbieten. Dies ist nicht nur für das Produkt wichtig, an dem Sie arbeiten, sondern auch für jedes Produkt, das Sie integrieren.
Neugier
Gute Entwickler müssen eine gesunde Neugier haben, die weit über die Grenzen ihres Fachgebiets hinausgeht. Das gilt vor allem für das Lernen, wie die zugrundeliegenden Technologien tatsächlich funktionieren, aber es ist genauso wichtig, die Produkte zu verstehen, an denen andere Teams arbeiten, ihre Architektur und wie sie als Gesamtsystem zusammenhängen. Dieser breitere Kontext kann bei der Lösung komplexer Probleme von unschätzbarem Wert sein und als Inspirationsquelle dienen.
Keine Grenzen
Wir sehen oft, dass die Ursache für schlechte Lösungen und schlechte Architektur darin liegt, dass Menschen Angst haben, Dinge zu ändern, die außerhalb der Grenzen ihrer Box liegen. Client-Entwickler neigen dazu, Dinge auf dem Client zu lösen, auch wenn es besser ist, sie auf dem Server zu lösen. Anwendungsentwickler neigen dazu, das Problem lokal zu lösen, auch wenn die Lösung in der Plattform oder in der Infrastruktur liegt. Der Grund dafür ist einfach. Es ist einfacher, keine Diskussionen mit einem anderen Team zu führen, es ist einfacher, die Welt außerhalb der eigenen Reichweite als Blackbox zu behandeln, es ist einfacher, mit dem Teufel zu verhandeln, den man kennt. Aber gute Ingenieure müssen wissen, dass sie Teil eines großen Systems sind und dass sich kein Teil des Systems wirklich außerhalb ihrer Reichweite befindet. Architekturänderungen mit einem anderen Team zu besprechen, ist gesund und hilfreich und kann Ihre Perspektive erweitern. Das Angebot, zu den von Ihnen gewünschten Änderungen beizutragen, ist gut geeignet, um Vertrauen zwischen den Teams aufzubauen. Die Berührung eines neuen Bereichs ist eine Erfahrung, von der Sie nur profitieren können. Am wichtigsten ist jedoch, dass Ihr Einfluss wächst, wenn Ihre Grenzen flexibler werden. Wann immer Sie es vermeiden, Ihre Grenzen zu überschreiten, sollten Sie sich darüber im Klaren sein, dass Sie sich selbst davon abhalten, eine größere Wirkung zu erzielen.
Verantwortung / Eigenverantwortung
Auch wenn es nicht sofort ersichtlich ist, werden Sie sehr oft feststellen, dass die Ursache für die Verzögerung oder das Scheitern eines Projekts in den Bereichen Eigenverantwortung und Verantwortung liegt. Die Menschen neigen immer dazu, ihrem Umfeld die Schuld zu geben: „Ich musste auf ein anderes Team warten, um etwas fertigzustellen“, „Ich hatte ein Systemproblem und niemand hatte Zeit, mir zu helfen“, „Ich habe die Definitionen zu spät erhalten“. Ein guter Ingenieur weiß, dass diese Dinge fast immer Ausreden sind. Wenn Sie der Verantwortliche für eine Aufgabe sind und die Verantwortung für die Durchführung tragen, sollten Sie jedes Problem, auf das Sie stoßen, als etwas betrachten, das Sie lösen müssen. Wenn Sie von einem anderen Team blockiert werden, sprechen Sie mit ihm. Bieten Sie an, gemeinsam an dem Problem zu arbeiten, und schieben Sie die Verantwortung nicht auf jemand anderen ab. Wenn Sie noch keine Definitionen erhalten haben, stellen Sie einige Vermutungen darüber an, wie die Definitionen aussehen werden. Es ist besser, einige Fortschritte zu machen und später Anpassungen vorzunehmen, als nur zu warten. Wenn Sie durch etwas Großes aufgehalten werden, sollten Sie wissen, wann Sie die Fahne heben müssen und wie Sie das Problem umgehen können, damit Sie zumindest an einer anderen Front Fortschritte machen können. Seien Sie nie in einer Situation, in der jemand anderes dafür verantwortlich ist, Ihr Problem zu lösen, sondern umgekehrt – Sie sind dafür verantwortlich, die Ziellinie zu erreichen, und Sie müssen sich mit den Hindernissen auf dem Weg dorthin auseinandersetzen.
Kommunikation
Dies ist ein echter Wendepunkt und oft das Entscheidende für einen Ingenieur, wenn er in der Lage sein soll, einen großen Einfluss auf das gesamte Team zu haben. Die Fähigkeit zu kommunizieren ist das Wichtigste, was die Menschheit zu dem gemacht hat, was sie heute ist, und das Gleiche gilt natürlich auch für alle anderen Lebensbereiche, einschließlich der Softwareentwicklung. Gute Ingenieure müssen in der Lage sein, ihre Ideen und Meinungen wortgewandt zu erklären. Sie müssen in der Lage sein, auf intelligente und respektvolle Weise mit ihren Kollegen zu diskutieren. Bei der Kommunikation geht es nicht nur um das Sprechen, noch wichtiger ist es, zuhören zu können. Ein guter Ingenieur muss geduldig sein und die richtigen Fragen stellen, um zu verstehen, was die anderen denken, und um ihnen zu helfen, gehört zu werden. All dies ist sowohl für die mündliche als auch für die schriftliche Kommunikation wichtig, und was noch wichtiger ist, es geht nicht nur um Gespräche – das Leben eines Entwicklers ist voll von einer Vielzahl von Kommunikationsformen: Dokumente, Präsentationen, Dokumentationen, Code-Kommentare, Commit-Meldungen. Sogar das Schreiben von lesbarem Code und die Wahl guter Variablennamen ist eine Form der Kommunikation.
Teamarbeit
Dies ist einer der Punkte, an dem selbst erfahrene Ingenieure sehr oft scheitern und nicht einmal wissen, dass es passiert. Denken Sie daran, wie oft Sie gesagt haben: „Das ist zu kompliziert, überlass das mir“. Denken Sie daran, wie oft Sie gesagt haben: „Diese Aufgabe ist eine Ein-Mann-Aufgabe, mit mehr Leuten wird es nicht einfacher“. Denken Sie an all die Male, in denen Sie keine Zeit hatten, jemandem zu helfen, und sich nie darum gekümmert haben, oder in denen Sie den Code eines anderen korrigiert haben, ohne ihn um eine Überprüfung zu bitten, oder in denen Sie eine große Änderung vorgenommen haben, ohne sich mit Ihrem Team abzusprechen. Es gibt unzählige Beispiele. Und die Sache ist die, dass es selbst für erfahrene Ingenieure im Moment das Richtige zu sein scheint. Aber das ist taktisches Denken, das sich nur kurzfristig auszahlt. Wenn wir Großes erreichen wollen, müssen wir dafür sorgen, dass wir als Team zusammenarbeiten können. Es ist kein Zufall, dass Teamarbeit gleich nach der Kommunikation kommt. Das sind die Dinge, die uns am effektivsten machen, das ist grundlegende Biologie. Großartige Ingenieure arbeiten nicht nur mit ihren Kollegen zusammen, beraten sich mit ihnen, lernen von ihnen, unterstützen sie, bilden Paare und respektieren sie. Sie sind auch Mentoren, weisen auf Probleme hin, interessieren sich für alles, was im Team passiert, und lernen daraus. Erstaunliche Ingenieure wissen, wann und wie sie Entwürfe vorlegen müssen, die es vielen Menschen erleichtern, an Dingen zusammenzuarbeiten, bei denen viel Arbeit erwartet wird.
Keep it simple
Die Komplexität einer Lösung kann einer der stillen Killer für die Fähigkeit des Teams sein, voranzukommen und sich anzupassen. Es ist wie mit dem Bluthochdruck. Für das ungeschulte Auge scheint alles in Ordnung zu sein und wie erwartet zu funktionieren, aber tief im Innern bringt einen etwas, das keine direkte Auswirkung auf die Hauptfunktionen hat, langsam um. Gute Ingenieure schaffen pragmatische Lösungen und lesbaren Code, auch wenn Sie mehr Codezeilen schreiben. Zeigen Sie nicht, wie „schlau“ Sie sind, indem Sie alle Möglichkeiten der Sprache ausschöpfen, überflüssige Abstraktionsebenen schaffen oder eine Funktion in einer Zeile schreiben, die niemand sonst verstehen oder debuggen kann. Seien Sie kein Purist, entwickeln Sie nicht zu viele Lösungen, wenn es nicht unbedingt notwendig ist, und scheuen Sie sich nicht, etwas, das bereits komplex ist, zu vereinfachen.
Priorisierung
Wir können nicht alles machen. Wir können nicht alle Probleme lösen. Wir können nicht alle Debatten gewinnen. Wir können nicht alles perfekt machen. Wir haben nur begrenzte Zeit und begrenzte Ressourcen, und wir müssen sie weise einsetzen. Das bedeutet, dass wir in der Lage sein müssen zu unterscheiden, was wir unbedingt tun müssen, was wir aufschieben können und was wir ignorieren sollten. Entwickler treffen diese Entscheidungen jeden Tag dutzende Male. Wenn wir überlegen, ob wir einen Fehler untersuchen sollen, wenn wir überlegen, ob wir ein Refactoring durchführen sollen, wenn wir überlegen, ob wir einen Anwendungsfall oder einen Randfall behandeln sollen, wenn wir überlegen, ob wir einen Umweg von unserer geplanten Aufgabe machen sollen und sogar wenn wir Zeit investieren, um jemanden von unserer Meinung zu überzeugen. Gute Ingenieure wissen, dass sie unerbittlich sein müssen, wenn es darum geht, Dinge zu reparieren, zu untersuchen, zu erforschen oder darauf zu bestehen, dass die Dinge, die wirklich wichtig sind, auf den Punkt gebracht werden. Sie wissen, dass sie sich eine Notiz machen und später auf etwas zurückkommen können, wenn es wichtig, aber nicht dringend ist. Und sie wissen, dass sie etwas in Ruhe lassen oder die Meinung eines anderen akzeptieren können, selbst wenn sie damit unzufrieden sind, wenn es nicht wirklich wichtig ist.
Zeitmanagement
Wie bereits erwähnt, ist die traurige Wahrheit unserer Existenz, dass wir an die Zeit gebunden sind. Die Produkte, die wir entwickeln, müssen schließlich in Betrieb gehen, wir haben Fristen, Schätzungen und Ziele zu erreichen. Gute Entwickler müssen nicht nur ein Gespür dafür entwickeln, wie lange ihre Aufgaben dauern, sondern sie müssen auch klug überlegen, wie sie ihre Aufgaben in noch kleinere Teile zerlegen und anordnen. Sie müssen ihre Unterbrechungen und Kontextwechsel klug verwalten. Diese Intuition der Zeiteinschätzung ist ein untrennbarer Bestandteil der oben beschriebenen Fähigkeit, Prioritäten zu setzen. Wenn etwas zum Beispiel kurz genug ist, lohnt es sich vielleicht, es zu tun, auch wenn es nicht superwichtig ist. Und wenn es zu lange dauert, ist es vielleicht besser, etwas zu verschieben oder sich mit den Kollegen oder dem Vorgesetzten zu beraten.
Schlussfolgerung
Wie bereits erwähnt, glauben wir, dass Ingenieure, die in allen oben genannten Bereichen Experten sind, das Team 10x besser machen können, indem sie ihre Kollegen beeinflussen und inspirieren. Großartige Ingenieure müssen sich immer vor Augen halten, dass dies Teil ihrer täglichen Arbeit ist: Einfluss nehmen und inspirieren. Das bedeutet, dass Sie nicht nur Zeit für Ihre eigene Arbeit finden müssen, sondern auch dafür, anderen zu helfen, ihre Arbeit zu erledigen. Dies kann in vielerlei Hinsicht geschehen: Sie können Mentoren für Ihr Team sein, Ressourcen für die Weiterbildung der Mitarbeiter erstellen, dafür sorgen, dass alles gut dokumentiert ist, immer ein offenes Ohr für Erklärungen haben und sich mit anderen austauschen und vieles mehr. Ein guter Mentor und Ausbilder zu sein, bedeutet nicht nur, dass man seinen Teammitgliedern hilft, zu wachsen, sondern auch, dass man sein eigenes Verständnis für alles, was man tut, vertieft und eine neue Perspektive für die Klarheit der Dinge, die Komplexität des Systems und die Stellen, an denen Dinge verbessert werden können, gewinnt.
Das sind die Merkmale der 10x-Ingenieure, nicht nur in Bezug auf ihre individuelle Wirkung, sondern auch in Bezug auf ihre Wirkung auf alle anderen. Fragen Sie sich immer, was Sie tun können, um Ihren Einfluss zu vergrößern, denn es gibt immer mehr Raum zum Wachsen.