So lösen Sie Programmierprobleme

Hallo an alle!

Heute ist Ihre Aufmerksamkeit eingeladen, einen unersetzlichen Artikel auf seine eigene Weise zu übersetzen, der Ihnen hilft, selbst die heimtückischste und nicht trivialste TK, die Sie auf den ersten Blick nicht verstehen, richtig anzugehen. Die Hauptsache ist, Fragen nicht aufzugeben und intelligent zu formulieren. Herr Justin Fuller von der Bank of America erläutert freundlicherweise, wie man es richtig macht.



Viel Spaß beim Lesen!

Dieser Tag ist also gekommen. Vielleicht ist dies Ihr erster Arbeitstag, oder vielleicht arbeiten Sie seit zehn Jahren an diesem Ort - das spielt keine Rolle. Es passiert jedem: Sie stoßen schließlich auf eine Aufgabe, die Sie einfach nicht verstehen.

Was tun? Einfach anfangen und hoffen, dass alles von selbst funktioniert? Oder geben Sie dem Chef zu, dass Sie dies nicht tun können, weil Sie es nicht verstehen?

Ich denke, Sie haben erraten, dass die richtige Antwort weder die eine noch die andere ist!

Mir ist aufgefallen, dass es beim Programmieren wie in jedem anderen Beruf fast unmöglich ist, eine Arbeitswoche (und manchmal einen Arbeitstag) zu leben, ohne sich einer völlig unverständlichen Aufgabe stellen zu müssen.

Aber mach dir keine Sorgen! Es gibt gute Neuigkeiten. Sie können dieses Problem nicht nur lösen, sondern auch davon profitieren.

Schließlich müssen Sie dabei Ihr Wissen und Ihre Fähigkeiten im Vergleich zu allem, was Sie zuvor getan und gewusst haben, erweitern.

Als nächstes werde ich Ihnen erklären, wie Sie die Lücke zwischen den für Sie festgelegten Anforderungen und dem Wissen schließen können, das Sie zur Erfüllung der Aufgabe benötigen.

Über die "Anforderungen"


Wie Sie bereits bemerkt haben, verwende ich das Wort "Anforderungen". Je nachdem, wo genau Sie arbeiten, kann dieses Wort bestimmte Konnotationen haben.

Nach meiner Erfahrung mögen sie in großen Unternehmen Anforderungen, und in kleinen Unternehmen stellen sie manchmal "keine Anforderungen". Ich denke, darüber sollten wir hier sprechen.

Tatsache ist, dass letztendlich alle Programmierer dasselbe tun: Sie lösen Probleme.
Sie erhalten eine ausführliche hundertseitige TK zur Lösung dieses Problems (ich habe einmal an einer einstündigen Besprechung über den Text auf einer Schaltfläche teilgenommen). Oder vielleicht so: Der CEO geht an Ihrem Schreibtisch vorbei und fragt, als ob er versehentlich fragt: "Werden Sie diese Aufgabe bis Freitag bewältigen?"
In beiden Fällen ist die Aufgabe für Sie festgelegt, und Sie müssen sicher sein, dass Sie sie vollständig verstehen. Nur so kannst du dich ihr richtig nähern!

Über die Bühnen




Nicht alle der unten aufgeführten Schritte sind für eine Aufgabe erforderlich. Nur die komplexesten Aufgaben erfordern möglicherweise die sorgfältige Ausführung aller Schritte, die in diesem Artikel behandelt werden.

Es ist möglich, dass viele Fragen nicht nur aufgrund geäußerter Anforderungen oder aufgrund der Unzulänglichkeit Ihrer persönlichen Erfahrung beantwortet werden können.

Möglicherweise müssen Sie sich mit anderen Entwicklern, Teamleitern, Produktbesitzern, Geschäftsanalysten oder sogar Großmüttern beraten! Und vielleicht mit jedem von ihnen, bevor das Problem gelöst werden kann!

Dies ist jedoch normal. Dies bedeutet, dass Sie unterschiedliches Wissen sammeln und es zu einem Ganzen zusammenfassen - und so das bestmögliche Ergebnis erzielen können!

Zum Schluss noch die letzte Warnung: Übertreiben Sie es nicht mit Formalisierung! Das Wichtigste dabei ist, die Aufgabe schnell zu verstehen. Keine künstlichen Barrieren und roten Bänder erforderlich! Alles, was benötigt wird, ist ein systematischer Plan zur Lösung eines Problems, das Sie derzeit nicht verstehen.

Stufe eins: Analysieren Sie das Problem

In dieser Phase versuchen wir zu verstehen, worum Sie gebeten wurden. Bis wir versuchen zu entscheiden, wie wir es machen werden!

Es ist wichtig, diesen Unterschied zu erfassen. Es kann gefährlich sein, Karriere zu machen, ohne alle Konsequenzen zu erkennen oder, schlimmer noch, nicht vollständig zu verstehen, was genau von Ihnen verlangt wurde.

Wir klassifizieren das Problem

Eine Aufgabe zu klassifizieren bedeutet zu bestimmen, welche Arbeit getan werden muss, um sie zu lösen. Hier einige Beispiele für Aufgabentypen:

  • Fehlerbehebung
  • Neue Funktion
  • Neue App
  • Forschungsauftrag
  • Leistungsoptimierung

Denken Sie daran, dass diese Liste von Optionen nicht auf beschränkt ist.

In diesem Fall müssen wir entscheiden, welche Art von Arbeit von Ihnen erwartet wird. Dies ist wichtig, da es sich direkt auf die Art der Arbeit auswirkt, die Sie ausführen werden.

Diese Phase ist besonders wichtig bei unscharfen Anforderungen, zum Beispiel: "Wir brauchen eine Möglichkeit, unsere Client-Caches nach dem Aktualisieren der Site irgendwie zu leeren."

Hier sind einige mögliche Interpretationen dieser Anforderung.

  1. Sie müssen schnell einen bestimmten Mechanismus zum Löschen des Caches implementieren, damit Clients immer die aktuellsten Updates erhalten.
  2. Es ist erforderlich, alle Möglichkeiten zum Speichern dieser Client-Caches zu untersuchen und die besten Optionen zu ermitteln, um diese Caches nach jedem Site-Update zu entfernen.
  3. Client-Caches sollten bereits gelöscht worden sein, und Sie müssen einen Fehler finden und beheben, der dies verhindert.

Wenn Sie zu diesem Zeitpunkt nicht absolut sicher sind, welche Interpretation gemeint war, müssen Sie sich um Klärung bemühen und erst dann weiterarbeiten.

Formulieren Sie das Wesentliche des Problems in Form von ein oder zwei einfachen Aussagen.

Fassen Sie die komplexe Anforderung zusammen, als würden Sie die Frage "Woran arbeiten Sie heute?" Beantworten. Es mag nicht so einfach sein, aber Sie sollten versuchen, das Wesentliche des Problems auf ein oder zwei Sätze zu reduzieren.

Wenn das Zusammenfassen der Aufgabe auf diese Weise fehlschlägt, kann dies bedeuten, dass sie in mehrere Unteraufgaben unterteilt werden sollte. Im Prinzip wird dieser Schritt zu einem Lackmustest, der signalisiert, ob Sie es geschafft haben, Ihre Aufgaben in Form von ausreichend kleinen Fragmenten zu organisieren.

Hier ein gutes Beispiel für eine solche Zusammenfassung: „Beim Aktualisieren einer Site fügen wir den Dateien eine eindeutige Nummer hinzu, damit der Browser versteht, dass die neueste Version des Codes verwendet werden muss.“
Diese Aufgabe hat der Einfachheit halber den „Lackmustest“ bestanden, und es ist möglicherweise nicht erforderlich, ihn in kleinere Fragmente zu zerlegen.

Und hier ein schlechtes Beispiel: „Beim Aktualisieren einer Site fügen wir den Dateien eine eindeutige Nummer hinzu, sodass der Browser versteht, dass die neueste Version des Codes verwendet werden muss. Wir müssen auch eine Nachricht an unser CDN senden und es auf diese Weise über die Notwendigkeit der Aktualisierung von Dateien informieren. Es muss auch vorgesehen werden, dass Anwendungen für iOS und Android ein Update an den Anwendungsmarkt senden. Noch…"

In diesem Fall ist der Test definitiv ein Fehler. Es ist viel Arbeit erforderlich, und möglicherweise muss jede Aufgabe separat identifiziert und verfolgt werden.

Markieren Sie kritische Details

Jetzt sollten Sie (in freier Form, die für Sie am bequemsten ist) eine Liste der wichtigsten Dinge erstellen, die erledigt werden müssen.

Dies sollte wiederum ein sehr einfaches Zusammendrücken jeder der Hauptstufen sein.

Dies ist keine schrittweise oder detaillierte Anleitung zur Fehlerbehebung.

Denken Sie daran, während Sie die Ihnen zugewiesene Aufgabe weiter analysieren. An dieser Stelle empfehle ich, schriftliche Notizen zu machen. Persönlich verwende ich hierfür die Notes-Anwendung.

Unsere Caching-Aufgabe ist sehr einfach und es ist möglicherweise nicht notwendig, sie auf diese Weise zu skizzieren. Schauen wir uns in diesem Fall ein komplexeres Beispiel an.

Unsere nächste Aufgabe ist es, eine neue Chance zu realisieren: „Jeder Benutzer sollte gezielte Werbung für unser internes Produkt erhalten. Diese Anzeige sollte auf der Grundlage der von uns gesammelten Daten auf die Bedürfnisse des Nutzers zugeschnitten sein. “

Um die Hauptelemente dieser Aufgabe zu isolieren, müssen wir uns klar vorstellen, was getan werden muss, um jedes Element zu implementieren.

  • Unsere vorhandenen Anzeigen müssen so verteilt werden, dass sie mit bestimmten Benutzerparametern korrelieren.
  • Für unsere Marketingabteilung müssen wir eine Möglichkeit bereitstellen, mit der wir neue Werbung mit einem oder mehreren Benutzerdaten korrelieren können (in diesem Fall sollten Vermarkter nichts programmieren!).
  • Das System muss Benutzerparameter aggregieren, die im Zusammenhang mit unserer Werbung relevant sind.
  • Schließlich müssen Sie eine Art System erstellen, das eine Benutzer-ID erhält und Anzeigen anzeigt.

Das Schöne an solchen Listen ist, dass sie schnell mit dem Team oder dem Chef vereinbart werden können! In diesem Beispiel könnten Sie diese Liste Ihrem Teamleiter zeigen, und er entschied, dass ein weiterer sehr wichtiger Punkt in der Liste fehlte:

  • Nutzer sollten uns mitteilen können, dass sie bestimmte Anzeigen nicht mehr sehen möchten.

Schließlich wollen wir als letztes unsere Lieblingsbenutzer nerven! Wenn wir uns die Zeit nehmen und nur ein paar Minuten länger über die Aufgabe nachdenken, sparen wir uns in Zukunft Stunden und Tage voller Probleme. Daher ist es wichtig, eine wichtige Aufgabe zu formulieren und zu planen und erst dann mit dem Code fortzufahren.

Bevor ich fortfahre, möchte ich Ihre mögliche Kritik beantworten.

Vielleicht denken Sie: „In einem normal gelieferten Unternehmen sollte diese Art von Arbeit erledigt werden, bevor die Anforderungen für den Entwickler auf den Tisch gelegt werden“ - und ich stimme Ihnen voll und ganz zu!

Leider ist unsere Welt unvollkommen. Manchmal sind die Anforderungen, die an den Entwickler gestellt werden, keineswegs in den Regalen festgelegt. Daher müssen wir alle Anstrengungen unternehmen, um die Anforderungen richtig einzuschätzen, bevor wir mit der Entwicklung beginnen.

Identifizieren Sie die Probleme, die Sie lösen möchten.

Beantworten Sie die Frage: "Warum sollte jemand dies verwenden müssen?" oder "Was ist das eigentliche oder wahrgenommene Problem, das ich in diesem Fall zu beheben versuche?"

Hoffe die Antwort ist offensichtlich. In unserem ersten Beispiel lautet die Antwort: "Benutzer sehen immer die neuesten Updates." Im zweiten Fall werden bei Werbung "Benutzer immer relevante Benachrichtigungen sehen, nicht diejenigen, die sie nicht interessieren".

Die Verwendung dieser beiden Antworten sollte offensichtlich sein! Wenn Sie die Aufgabe und ihre Ziele besser verstehen, können Sie vernünftigere Entscheidungen treffen und eine solche Implementierung vornehmen, die Ihren Geschäftszielen angemessen entspricht. Wenn es möglich ist, schlechte Lösungen und bedeutungslose Aufgaben zu identifizieren, ist es möglich, keine Zeit und Energie für Suchvorgänge zu verschwenden, die per Definition nicht zur Lösung des Problems beitragen.

Stufe zwei: Anforderungen interpretieren und bewerten

Zu diesem Zeitpunkt sollten Sie sich bereits vorstellen, was Sie tun müssen und warum.
Als nächstes müssen Sie die Details verstehen, was Sie tun werden, wie Sie es tun werden und warum Sie es so tun werden.
Klären Sie wichtige Begriffe im Zusammenhang mit Ihrer Aufgabe.

Dieser Schritt ist wahrscheinlich für einen unerfahrenen Entwickler als Teil eines Teams oder wenn Sie in einem großen Unternehmen arbeiten, wichtiger. In beiden Situationen ist es sehr wahrscheinlich, dass Sie in den Anforderungen auf unbekannte Begriffe stoßen.

Dies können Geschäftskonzepte wie Produktnamen, Kunden oder Prozesse sein. Möglicherweise gibt es Begriffe, die sich auf die Entwicklung beziehen, z. B. die Namen von Tools, Anwendungen, Modellen, Diensten oder Bibliotheken.

Sie müssen sicherstellen, dass Sie alle wichtigen Begriffe absolut klar verstehen, damit Sie sicher sein können, dass Sie die Aufgabe korrekt implementieren.

Vielleicht haben Sie bereits verstanden, dass Sie einen Weg finden müssen, um auf aggregierte Benutzerinformationen zuzugreifen, aber verstehen Sie, was es bedeutet, sie dem Dao hinzuzufügen?
Sie verstehen wahrscheinlich, dass Sie die Werbedaten formatieren müssen, haben aber eine Vorstellung davon, was „MADF“ (Markup für Werbe-Newsfeeds) ist?

Ich verstehe weder den einen noch den anderen.

Deshalb müssen Sie alle wichtigen Begriffe isolieren und definieren. In Definitionen verwirrt zu sein, ist der richtige Weg, um ein Problem falsch zu lösen.

Entscheiden Sie, wie die Aufgabe erledigt werden soll.

Zu diesem Zeitpunkt sollten Sie bereits herausfinden, wie die Aufgabe ausgeführt wird. Die Details dieses Prozesses können sehr unterschiedlich sein, je nachdem, wo Sie arbeiten und welche spezifische Aufgabe Ihnen zugewiesen ist.

In einigen Teams erklärt Ihnen niemand genau, wie die Anforderungen implementiert werden sollen. Sie sagen lediglich, welche Funktionalität am Ausgang erhalten werden soll.

In anderen Fällen wird jeder Schritt, den Sie unternehmen, detailliert beschrieben.

Höchstwahrscheinlich befinden Sie sich in einer Zwischensituation.

Wenn das Team Ihnen keine Anweisungen gegeben hat, können Sie zu diesem Zeitpunkt fast nichts tun. Wenn Sie Anweisungen erhalten haben, machen Sie sich mit den Phasen vertraut, die Sie durchlaufen müssen.

Dieser Schritt scheint völlig natürlich, aber es ist wichtig, genau auf die Reihenfolge zu achten, in der wir fortfahren.

Natürlich möchten wir uns auf einmal mit allen Details der Aufgabe befassen und sie studieren, bis uns das von uns gesetzte Ziel völlig klar ist.

Da Sie sich jedoch bereits die Zeit genommen haben, das Problem zu verstehen, sollten Sie jetzt eine klarere Vorstellung von dem gesamten Problem haben und die Schritte bewerten, die zur Erreichung des Problems erforderlich sind.

Stellen Sie fest, ob Aufgaben angesprochen werden.

In dieser Phase verschmelzen die Phasen der Analyse und Interpretation. In der Analysephase konzentrieren Sie sich auf ein ganzheitliches Bild und große Ziele - was wir tun und warum.

Konzentrieren Sie sich in der Interpretationsphase auf die Details - wie wir das machen.

Die zweite Stufe heißt „Interpretation und Bewertung“, da Sie jetzt „wie“ und „was und warum“ korrelieren können. Sie interpretieren die Details anhand des Gesamtbildes. Sie bewerten die Details und stellen fest, ob das ursprüngliche Problem behoben wurde.

Fragen Sie sich: Werden die Schritte, zu denen ich angewiesen wurde, zu dem Ergebnis führen, das als Endziel der Aufgabe festgelegt wurde? Löst das geplante Ergebnis wirklich das ursprüngliche Problem?

Wenn Sie sicher sind, dass alle Probleme gelöst werden können und die Details aussagekräftig sind, können Sie sich an die Arbeit machen! Andernfalls muss zur dritten Stufe übergegangen werden, um alle Arten von Konflikten zu lösen.

Stufe drei: Wir gehen das Problem kritisch an

In dieser Phase sollten Sie sicher sein können, dass Sie sowohl die Aufgabe als auch die Lösung verstehen. Es bleibt abzuwarten, ob diese Entscheidung richtig ist.

Um ein Produkt von höchster Qualität zu schaffen, müssen wir alle in der Lage sein, Verantwortung zu übernehmen und uns zu äußern, wenn einige Dinge eindeutig falsch sind.

Auf der anderen Seite werden wir keine unangemessenen Ansprüche geltend machen. Man kann nicht sagen, dass etwas nicht stimmt, weil "es so scheint" oder einfach "nicht so". Konkrete und gut durchdachte Argumente müssen vorgebracht werden.

Wir skizzieren also die Grundregeln für kompetente Meinungsverschiedenheiten

Wissen, wann man anderer Meinung ist

  • Meinungsverschiedenheiten sind inakzeptabel, bis ich das Problem gründlich herausgefunden habe.
    Zu sagen "das ist falsch" ist nur mit absoluter Sicherheit möglich, dass Sie verstehen, womit Sie nicht einverstanden sind /
    Wenn Sie ein Problem und eine geplante Lösung nicht sicher formulieren können, können Sie nicht widersprechen. Wenn Sie nicht sicher sind, ob Sie alles richtig verstehen, können Sie nicht widersprechen. Nur wenn Sie sicher sind, dass Sie das Problem bis ins kleinste Detail verstehen, können Sie es sich leisten, nicht zuzustimmen.
    Wenn Sie der Meinung sind, dass Sie nicht über alle erforderlichen Informationen verfügen, ist es möglicherweise an der Zeit, alle abgeschlossenen Schritte anzuhalten und zu überprüfen, bevor Sie behaupten, dass die Anforderungen falsch sind.
  • Man kann nur aus subjektiven Gründen zustimmen. Suchen Sie nach echten potenziellen Problemen.
    "Ich mag es nicht, wie das gemacht wird" ist ein subjektives Urteil. "Dies wird zu Leistungsproblemen führen, weil so viele Operationen beteiligt sind" ist ein objektiver Grund. Beispiele für andere subjektive Gründe: „Und bei einem anderen Projekt haben wir es anders gemacht“ oder „Ich hätte diese Lösung etwas anders implementiert, aber das ist natürlich Geschmackssache.“
  • Sie sollten gut durchdachte Erklärungen bereithalten, um Ihre Behauptungen zu stützen.
    Wenn Sie nicht erklären können, warum etwas nicht stimmt, können Sie sicher sein, dass Sie wirklich Recht haben? Ich rate Ihnen, die Gründe aufzuschreiben, warum Ihnen die Entscheidung falsch erscheint, und zu formulieren, wie sie behoben werden kann.

Wenn Sie eine solche Lösung nicht anbieten können, teilen Sie mir dies von Anfang an klar mit.

Seien Sie vorsichtig, wenn Sie mit anderen nicht einverstanden sind. Es braucht viel Zeit, um allen zuzuhören und alles zu verstehen - und nur dann kann man nicht zustimmen.

Wenn Sie bis zu diesem Punkt alle beschriebenen Schritte sorgfältig befolgt haben, ist es sehr wahrscheinlich, dass Sie sich in allem auskennen. Versuchen Sie jedoch, sich nicht in Ihre Berechnungen einzuschließen - Sie könnten etwas verpasst haben!

Ich beginne die Diskussion gerne mit den Worten: "Nicht, dass ich dir nicht zustimme, ich verstehe es nur noch nicht." Wenn nötig, kann später eine starke Meinungsverschiedenheit zum Ausdruck gebracht werden, aber zunächst einmal - um es herauszufinden.

Wissen, wie man richtig widerspricht


Um sicherzustellen, dass unsere Meinungsverschiedenheit objektiv ist, werden wir eine Reihe von Maßnahmen ergreifen, die uns helfen, zu verstehen, ob unsere Argumente legitim sind.

Durch objektive Meinungsverschiedenheiten können wir mindestens eine der folgenden Tatsachen nachweisen:

  • Die Entscheidung ist nicht gut informiert
  • Entscheidung ist falsch informiert
  • Die Aufgabe oder Lösung ist unlogisch
  • Die Lösung ist unvollständig

Mangel an Informationen ist kein Grund für Ressentiments; Dies bedeutet lediglich, dass Sie beim Erstellen der Lösung aus unvollständigen Daten stammten. Vielleicht wussten die Verfasser der TK nichts über das bereits bestehende System, das in der Lage war, die erforderlichen Maßnahmen durchzuführen.

Falsch informiert zu sein bedeutet, eine Lösung zu erstellen, die auf falschen Informationen basiert.

Dies ist ein Fall, in dem nach Ansicht der Verfasser von TK das bestehende System etwas tun kann, diese Möglichkeit jedoch in Wirklichkeit nicht vorgesehen ist. Das SEO-Team hat Sie beispielsweise gebeten, die Seite von Google mit dem Benutzerkonto in Ihrer Anwendung zu indizieren. Google kann das nicht. Dies bedeutet, dass Ihr Seokhniki die Funktionen des Google-Suchroboters falsch versteht.

Eine unlogische Aufgabe oder unlogische Lösung ist einfach bedeutungslos. Ein typisches Beispiel (aus Sicht des Entwicklers) ist die Implementierung einer Funktion, die eine andere Funktion beeinträchtigt. Eine solche Anforderung kann als unlogisch angesehen werden, da sie eher Schaden als Hilfe anrichtet.

Die Lösung ist unvollständig und wird manchmal absichtlich durchgeführt. In der Softwareentwicklung versuchen wir häufig, MVP (Minimum Viable Product) zu erstellen, um loszulegen. Dies bedeutet, dass Sie in der ersten Operation die Implementierung einer Funktion, die nicht unbedingt erforderlich ist, absichtlich verzögern können.

Tatsächlich kann eine Entscheidung nur dann als unvollständig angesehen werden, wenn sie nicht genau das für Sie festgelegte Problem löst oder wenn die oben genannten Schritte nicht ausreichen, um ein funktionsfähiges Produkt oder eine vollwertige Gelegenheit zu schaffen.

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


All Articles