Was sind Ihre ersten drei Schritte, wenn Sie zum ersten Mal mit einem Softwareproblem konfrontiert werden?[geschlossen]

softwareengineering.stackexchange https://softwareengineering.stackexchange.com/questions/12864

Frage

Ich bin neugierig auf die ersten Schritte, die der Verstand eines Programmierers unternimmt, wenn er zum ersten Mal auf ein Problem stößt, das er lösen soll.Wie fängt man an, darüber nachzudenken?Was sind die ersten Fragen, die Sie sich stellen?

Ok, lassen Sie es mich für diejenigen unter Ihnen konkretisieren, die denken, dass die Frage zu vage oder völlig situationsabhängig ist.Wählen beliebig Machen Sie sich mit den folgenden Anforderungen vertraut und denken Sie laut über Ihre allerersten Ahnungen/Eindrücke/Tendenzen darüber nach, wie Sie das Problem lösen können.

1) Erstellen Sie ein einfaches Textverarbeitungsprogramm mit etwa so vielen Funktionen wie MS Word Pad
2) Entwerfen Sie ein Kartenspiel für eine einzelne Person (z. B.Solitär)
3) Baue einen wissenschaftlichen Taschenrechner
4) Jedes Problem Ihrer Wahl mit ähnlichem Umfang/Komplexität wie die oben genannten drei

War es hilfreich?

Lösung

1) Bring es zum Laufen.Auch wenn es nichts anderes tut, als Hallo zu sagen.

2) Analysieren.Finden Sie heraus, was es braucht, was schön wäre usw.

3) Hab es drauf.Fügen Sie Funktionen nacheinander hinzu und testen Sie sie zwischendurch.

Andere Tipps

1) Angeben.Zerlegen Sie das Problem in Kernteile und finden Sie heraus, wie diese funktionieren sollen.Wenn das Problem bereits klar definiert ist, wie etwa bei einem Kartenspiel mit bekannten Regeln, kann ein Großteil dieses Schritts beschönigt werden, aber es ist gut, es noch einmal durchzugehen, nur um sicherzustellen, dass Sie den Problembereich so gut verstehen, wie Sie denken du tust.

2) Richten Sie ein Quellcodeverwaltungs-Repository für das Projekt ein.Es ist sehr wichtig, dies zu tun, bevor Sie überhaupt mit dem Schreiben von Code beginnen.

3) Rufen Sie Ihre IDE auf und beginnen Sie mit dem Hacken.

Geistig mache ich Folgendes, sehr schnell und abstrakt

1) Erfassung von Anforderungen - Ich erstelle schnell im Kopf eine Liste der Funktionen und wie diese implementiert werden können

2) Methodik - Ich versuche herauszufinden, welche Technologien für den Job am besten geeignet sind

3) Identifizieren Sie Probleme - Bevor ich überhaupt mit dem Projekt beginne, versuche ich, mögliche Probleme zu identifizieren und sie von Anfang an zu vermeiden

Im Prozess mache ich Folgendes:

1) Erfassung von Anforderungen - Ich erstelle fast immer eine Projektspezifikation, in der alle Funktionen aufgeführt sind, wie die Funktionen funktionieren, was sie tun und was sie sind nicht tun und welche Benutzergruppen sie verwenden werden.Ich denke, dass dies von entscheidender Bedeutung ist, da es die Ziele für alle Parteien klar definiert und beim Testen und bei der Qualitätssicherung hilfreich sein kann.sowie einen Überblick über die Entwicklung geben.

Bei bezahlten Projekten stellt es außerdem sicher, dass Kunden keine unerfüllten Erwartungen haben, ich mache dies jedoch auch bei internen Projekten.

2) Entwicklung - Zur Entwicklung gehört für mich das Einrichten einer von der Produktionsumgebung getrennten Entwicklungsumgebung, das Einrichten der Versionskontrolle (für mich Git) und das Ausführen jeder Funktion sowie das Durchführen einiger Tests nebenbei.

3) Benutzererfahrung - In der UX-Phase geht es darum, dass ein Grafikdesigner alle Elemente auf der Website/Anwendung gestalten muss, da ich Programmierer bin und keine Designentscheidungen treffen darf :P

Dazu gehört auch das Testen der Anwendung und das Vornehmen aller erforderlichen Optimierungen.Am Ende dieser Phase sollte die Anwendung/Software/Website für eine erste Veröffentlichung bereit sein.

1.Existiert das Programm bereits? Wenn das Programm bereits auf dem Markt existiert, kann ich es dann deutlich verbessern?Hat jemand Interesse an einer besseren Version?

2.Wäre die Entwicklung dieses Programms für mich interessant? Wäre es eine wachstumsfördernde Erfahrung?Mit zunehmender Erfahrung haben Entwickler im Allgemeinen mehr Möglichkeiten zum Programmieren, als ihnen Zeit zur Verfügung steht.

3.Welche Ressourcen habe ich? Nicht genug?Verhandeln.Jetzt ist der richtige Zeitpunkt.

Wenn ich die Möglichkeit habe, ein Programm zu entwickeln oder ein Problem zu lösen, drehen sich meine ersten Gedanken im Grunde immer um die Frage:Möchte ich dabei sein?

Manager denken oft, dass sie einen Ingenieur dazu bringen können, alles zu lösen.Es ist wichtig, auf sich selbst aufzupassen, um nicht in Unordnung zu geraten.

In Ordnung:

  1. Ist bereits vorhanden?
  2. Scheint komplex?Weiß ich wirklich, wie es funktionieren soll?
  3. Versuchen wir es mit einem Prototyp!
  • Meine erste instinktive Reaktion ist einzutreten Lösungsmodus.Mein Gehirn beginnt sofort, nach kleinen und großen Lösungen zu suchen.Dies geschieht schneller, als zum Lesen der Problemstellung erforderlich ist.

  • Aber schon bald ertappe ich mich dabei, dass ich diesen (schlechten) Weg beschreite, und zwinge mich bewusst dazu Experten-Modus und ich trete einen Schritt zurück.

  • Einmal in Experten-Modus, ich schreibe einen Test.

Meine erste Frage lautet immer: „Welches Geschäftsbedürfnis bzw. welches Geschäftsproblem versuchen wir zu lösen?“.Zu oft wurde ich gebeten, eine Lösung zu entwickeln, die letztendlich nicht das Problem des Kunden löst.

Wenn ich ihre Bedürfnisse und Ziele verstehen kann, kann ich sicherstellen, dass das, was ich baue, für sie nützlich ist.Dies trägt auch dazu bei, Fehlinterpretationen von Anforderungen zu reduzieren und die Anzahl der Iterationen zu reduzieren, die erforderlich sind, um etwas Brauchbares in die Produktion zu bringen.

  1. Was genau will ich?Wie sieht eine Lösung aus, z.B.Handelt es sich um ein neues Programm, um die Behebung eines Fehlers in einer vorhandenen Anwendung, um den Austausch eines Systems oder um etwas anderes?Dies ähnelt wahrscheinlich in vielerlei Hinsicht der Antwort von Mason Wheeler.Beachten Sie, dass es sich lediglich um das fertige Produkt handelt und nicht unbedingt um die darauf enthaltenen Parameter.

  2. Welche Parameter hat dieses Problem?Versuche ich zum Beispiel, das Problem innerhalb einer Stunde, eines Tages, einer Woche, eines Monats, eines Jahres usw. zu lösen?Wie groß ist die Lösung, die ich erstellen möchte, z. B.Der Austausch eines Content-Management-Systems für eine Website kann einen ganz anderen Umfang haben als die Erstellung eines Formulars zur Erfassung der verdienten Freizeit im Intranet des Unternehmens?Was ist die Priorität, dies zu erreichen?Wird von mir erwartet, dass ich rund um die Uhr daran arbeite, das Problem zu lösen, oder ist es nur dann so, wenn ich im Büro bin und es nicht bald gelöst werden muss, oder ist das Unternehmen tot?

  3. Wer begleitet mich bei der Umsetzung dieser Lösung?Nachdem ich weiß, was ich erreichen möchte und ein paar Details darüber festgelegt habe, wie, warum, wann und wo es sein wird, steht auf meiner Liste der zu erledigenden Dinge als nächstes die Frage, ob ich das alleine schaffen kann , leite ich diese Anfrage an eine andere Abteilung weiter, als ob es sich bei dem Fix um eine Änderung an einer Firewall handeln würde? Dies könnte ich möglicherweise nicht alleine tun, oder könnte ich andere hinzuziehen, die mir dabei helfen?Manchmal taucht ein Problem auf, bei dem man das Gefühl hat, dass „alle Hände an Deck“ sind und mehrere Entwickler versuchen, Lösungen zu finden, ähnlich wie die verschiedenen Ärzte Haus Versuchen Sie, verschiedene differenzierte Ideen vorzuschlagen.

Das sind Aspekte meines Ausgangspunkts bei einem bestimmten Problem.Manchmal kann es schwierig sein, das Problem auf den Punkt zu bringen, da es vorkommen kann, dass ein Entwickler und ein Tester die Anforderungen unterschiedlich interpretieren und jemand der Richter sein und entscheiden muss, wer Recht und wer Unrecht hat.Manchmal kann beides falsch sein, wenn die Person, die die Anforderung erstellt hat, nicht genügend Details erhalten hat und verschiedene Fälle Interpretationsspielraum gelassen haben.Danach kann es verschiedene Lösungen geben, die ich an diese verschiedenen Pläne weitergebe, damit jemand anderes entscheiden kann, welche die richtige ist:Eine schnelle Pflasterlösung, die wahrscheinlich nicht lange hält, aber sehr kurzfristig funktionieren kann, eine moderate Lösung, die zwar etwas mehr Zeit in Anspruch nehmen kann, aber mittelfristig besser ist, oder die industrietaugliche Lösung, die vielleicht übertrieben ist, aber auf jeden Fall löst das Problem dauerhaft.

Ich zerlege das Problem in immer kleinere Teile, bis ich so etwas wie eine Lösung für das Problem habe.

  • Definieren Sie die verschiedenen Baugruppen (falls erforderlich), z.B.UI/BLL/DAL/Tests.
  • Dann die „Hauptspieler“ (Klassen), die in sie aufgenommen werden, z. B. Spielkarten, Spielbrett
  • Definieren Sie die Substantive (Eigenschaften) und Verben (Methoden) für die Hauptakteure.Ich verwende für fast alles vorgefertigte Werte als Rückgabewerte.
  • Definieren Sie die wichtigsten Anwendungsfälle für das System (was wird der Benutzer tun).Normalerweise verdrahte ich eine einfache Benutzeroberfläche, um die zugrunde liegenden Klassen zu steuern

Danach fange ich an, die Teile zusammenzukleben, die vorgefertigten Werte durch die tatsächliche Funktionalität zu ersetzen und sie bei Bedarf umzugestalten.

Während ich jede Funktionalität schreibe, schreibe ich gleichzeitig Unit- und Integrationstests dafür (ich bin vom TDD-Teil „Zuerst testen“ noch nicht ganz überzeugt – ich weiß nicht, wie die Schnittstelle aussehen wird, bis ich schreibe es und wenn ich es zuerst teste, mache ich am Ende zu viel Refactoring des Testcodes).

Alle von Ihnen aufgelisteten Projekte sind nicht trivial, wenn Sie sie richtig durchführen wollen – d. h.ein fertiges, poliertes und getestetes Produkt.Daher sind meine ersten Schritte:

1.Anforderungen/Spezifikationen.Schreiben Sie auf, was es tun soll und was nicht.Priorisieren Sie die Dinge, die Sie erledigen müssen – wichtig (funktioniert ohne sie nicht), „nice-to-have“ und „wenn Sie Zeit zum Töten haben“.Bestellen Sie die Artikel nach Priorität.Vereinbaren Sie mit demjenigen, der das Projekt bezahlt, dass dies die richtige Reihenfolge ist.Bleiben Sie bei Schritt 1, bis Sie eine Einigung erzielt haben.

2.Design.Zeichnen Sie die Benutzeroberfläche – wie werden die Funktionen für den Benutzer aussehen?Das muss nicht schön sein – Bleistift und Papier genügen –, aber es hilft Ihnen, den Benutzer-Workflow durchzuarbeiten, und daraus entsteht das High-Level-Design, die Hauptkomponenten/Module der Anwendung.Dies muss kein „großer Entwurfsaufwand im Vorfeld“ sein, aber eine schlechte Benutzeroberfläche oder ein schlechter Arbeitsablauf machen jede Erfolgsaussicht zunichte.Arbeiten Sie mit dem Projektsponsor (wer auch immer zahlt) zusammen, bis er mit der UX zufrieden ist.

3.Iterative Entwicklung.Implementieren Sie gerade genug Code, um die nächste Anforderung auf der Prioritätenliste zu erfüllen und dabei Design und Workflow einzuhalten.Checken Sie diesen Code ein.Dem Projektsponsor vorführen.Gehe zu 3.

Ich versuche immer, die Entwicklung mit drei Fragen im Hinterkopf zu beginnen:

  • Verstehe ich das? echtes Geschäftsbedürfnis?

Sehr oft ist das „präsentierende Problem“ nicht das eigentliche Problem.

Beispielsweise wurde ich kürzlich gebeten, ein komplexes Projektmanagement-Framework zu erstellen, bei dem der Benutzer lediglich eine statische Liste von Aufgaben mit einem Fortschrittstextfeld neben jeder Aufgabe benötigte.

Fragen wie "Wofür werden die Benutzer es tatsächlich verwenden?" sind nützlich, um das eigentliche Problem zu erreichen.

  • Ist das Wirklich ein Programmierproblem“?

Ist die erforderliche Funktionalität bereits in einer Anwendung vorhanden, die wir bereits haben?Dass wir kaufen können?Könnten wir stattdessen Stift und Papier verwenden?

Beispielsweise sollte die Frage „Erstellen Sie ein einfaches Textverarbeitungsprogramm mit etwa so vielen Funktionen wie MS Word Pad“ mit „Haben Sie darüber nachgedacht, WordPad zu verwenden“ und nicht mit einem Programmierprojekt beantwortet werden.

Ich wurde einmal gebeten, eine Datenbank zu erstellen, die Informationen über industrielle Prozesse speichern würde, mit einer Reihe von Managementberichten, die die Prozesse auflisten würden, die in bestimmte Kategorien fielen.Es stellte sich heraus, dass maximal 33 Datensätze in der Datenbank erstellt würden und dass sie von drei Personen verwendet würde, die nebeneinander saßen.Die perfekte Lösung war eine physische Akte mit 33 Blatt A4-Papier.Die Benutzer hätten die Seiten physisch zählen können, um ihre Managementberichte zu erstellen.(Seltsamerweise entschied sich das Management stattdessen für den Kauf eines Systems!Zumindest hatte ich die Möglichkeit hinzugehen und wertvolle Arbeit zu leisten.

  • Verstehe ich die des Kunden? echte Prioritäten?

In jeder Anwendung sind einige Funktionen wichtiger als andere.Es ist wichtig, eine klare Vorstellung davon zu bekommen, was Ihren Benutzern wirklich wichtig ist.Manchmal sind die Dinge, die für uns als Entwickler wichtig sind (z. B.dieses komplizierte Teil) sind für unsere Kunden weniger wichtig (z.das Erscheinungsbild der Anwendung).

Ein befreundeter Entwickler erzählte mir kürzlich von einer Demo einer Web-App, die er durchgeführt hatte, um zu überprüfen, ob die App ihren Anforderungen entsprach.Er war frustriert, weil die Benutzer nicht über das Design der Seiten hinwegsehen konnten.Für diese Benutzer war das Aussehen zunächst wichtiger als die Funktionalität und musste daher vom Entwicklerteam priorisiert werden.

Im Hinblick auf die Entscheidung, was zu tun ist:

  1. Was ist der Bedarf?Wer braucht es?Warum?Wie wird damit Geld verdient (oder wie wird ein anderes Ziel bei Nicht-Geld-Projekten erreicht)?Wie viel kann man dafür ausgeben?Rechtfertigen die Erträge voraussichtlich die voraussichtlichen Ausgaben?
  2. Was sind die wertvollsten Funktionen?Welche Merkmale sind am unbekanntesten?wahrscheinlich am riskantesten (d. h. am unvorhersehbarsten) sein.Versuchen Sie, die Merkmale in die kleinsten Teile zu zerlegen, die der Kunde noch als Merkmale erkennen (akzeptieren) kann.Sie müssen nicht alle Funktionen identifizieren, versuchen Sie einfach, einige zu finden, die für den Kunden einen hohen Wert haben.
  3. Implementieren Sie die riskanteste und wertvollste Funktion (Kompromiss, um den maximalen Nutzen zu erzielen und das maximale Risiko zu Beginn des Projekts zu beseitigen).

Im Hinblick auf die Entscheidung, wie es zu tun ist:

  1. Gibt es einen Code/eine Technologie/ein Produkt/eine Dienstleistung, die das Problem bereits löst? Kann ich diese verwenden oder anpassen?
  2. Wenn nicht, welche Domänenkonzepte sind beteiligt und welche technischen Einschränkungen gelten für die Lösung?
  3. Implementieren Sie die Funktion und versuchen Sie, den einfachsten Ausdruck der für diese Funktion erforderlichen Teile des Domänenmodells zu erreichen.Entkoppeln Sie das Domänenmodell so weit wie möglich von technischen Überlegungen (z. B. Datenbanktechnologie, Betriebssystem, Client-Rechner vs. Cloud usw.).Um dies zu erreichen, verwende ich im Allgemeinen einen testgetriebenen Ansatz.
Lizenziert unter: CC-BY-SA mit Zuschreibung
scroll top