Ich weiß, wie man programmiert und wie man programmiert, aber wie / wo lernst du, wie man Systeme richtig macht? [geschlossen]

11

Es gibt viele Dinge, die bei der Erstellung eines Systems berücksichtigt werden müssen. Nehmen wir zum Beispiel ein webbasiertes System, in dem sich Benutzer anmelden und miteinander interagieren, Inhalte erstellen und bearbeiten. Jetzt muss ich über Sicherheit und Validierung nachdenken (ich glaube nicht einmal, dass ich zu 100% sicher bin, was dies bedeutet), "sicherstellen, dass Benutzer sich nicht gegenseitig auf die Füße treten" (Begriff dafür?), Um Fehler in vielen Fällen zu vermeiden Fälle, in denen sichergestellt wird, dass Datenbankdaten nicht durch unerwartete ... Situationen problematisch werden? All diese Dinge, die ich nicht weiß, wie oder wo ich lernen soll, gibt es ein Buch über solche Dinge? Wie gesagt, es scheint einen großen Unterschied zwischen dem Schreiben von Code und dem Schreiben des richtigen Codes zu geben. Wissen Sie, was ich meine? Ich habe das Gefühl, dass meiner aktuellen Programmierarbeit viel von dem fehlt, was ich beschrieben habe, und ich kann die Probleme sehen, die sie später verursacht. und dann sind die Probleme viel schwieriger zu lösen, weil Daten existieren und von Menschen verwendet werden. Kann mich jemand auf Bücher oder Ressourcen oder die richtige Teilmenge der Programmierung (?) Für diese Art des Lernens verweisen?

PS: Fühlen Sie sich frei, meine Tags zu korrigieren. Ich weiß nicht, wovon ich spreche.

Bearbeiten: Ich gehe davon aus, dass einige der Beispiele, die ich geschrieben habe, auch für andere Systemtypen gelten. Ich kenne nur keine anderen guten Beispiele, da ich hauptsächlich an der Webarbeit beteiligt war.

MetaGuru
quelle

Antworten:

10

Soweit ich das beurteilen kann, lernen professionelle Programmierer diese Dinge auf drei Arten:

  1. Aus einer schlechten Erfahrung lernen - Sie stoßen auf etwas Falsches. Sie beheben es. Sie sagen: "Hey, das sollte ich nicht noch einmal machen. Das nächste Mal mache ich X." Du bist eindeutig mittendrin.
  2. Lernen vor einer schlechten Erfahrung - Schließlich lernen Sie, bestimmte Probleme zu erkennen. Wenn Sie dies tun, werden Sie versuchen, dies zu vermeiden. Vielleicht lesen Sie ein Buch, vielleicht suchen Sie im Internet, vielleicht probieren Sie einige Experimente aus.
  3. Von erfahrenen Kollegen lernen - Dies ist bei weitem am einfachsten, obwohl es immer noch nicht einfach ist. Der Trick besteht darin, herauszufinden, ob der Kollege auf eine schlechte Erfahrung reagiert, die immer noch relevant ist. Die Technologie geht schließlich weiter.

Ich würde Sie ermutigen, für alle drei zu schießen. Finden Sie einen Platz mit intelligenten, erfahrenen Kollegen, die Ihre Fragen beantworten. Stellen Sie sicher, dass Sie früh und häufig versenden können, damit Sie viele Dinge ausprobieren können. Und nehmen Sie sich Zeit für Forschung und Reflexion.

William Pietri
quelle
Denken Sie bei # 1) daran, dass die schlechten Erfahrungen und Fehler, aus denen Sie lernen, nicht unbedingt Ihre eigenen sein müssen. Verbringen Sie Zeit im Internet, bleiben Sie dort, wo Programmierer arbeiten, lernen Sie einige ihrer Horrorgeschichten über verrückte Fehler, die sie gemacht haben oder auf die sie gestoßen sind, und behalten Sie sie beim Programmieren im Hinterkopf.
Shadur
1
Ich würde zustimmen, Shadur, aber ich denke, einige der schlechten Erfahrungen müssen wirklich deine eigenen sein. Einige Leute versuchen, am Rande zu sitzen und zu warten, bis sie das perfekte Ding machen können. Aber sie müssen wirklich einfach da rein und anfangen zu machen, wenn sie ihre Fähigkeiten verbessern wollen.
William Pietri
4

Wenn es um Web-Apps geht, enthält diese Antwort weitere gute Informationen als jeder andere Ort, den ich jemals gesehen habe.

Die Realität ist jedoch, dass es viel zu wissen gibt, um ein komplettes System gut zusammenzustellen. Es gibt Studien, die 10.000 Stunden unterstützen, da die Menge an Übung , die erforderlich ist, um ein Maß an Meisterschaft zu erreichen, keine Ausnahme bildet, und die Entwicklung von Informationssystemen ist keine Ausnahme.

Quentin-Starin
quelle
Also denke ich, dass es für verschiedene Dinge anders ist, oder?
MetaGuru
Viele Probleme werden beispielsweise spezifisch für Web-Apps sein und viele werden allgemeiner sein. Ich bin mir nicht sicher, ob ich ganz verstehe, was du fragst.
Quentin-Starin
3

Ich mag die Antwort von William Pietri sehr (+1), aber ich glaube, dass sie ergänzt werden muss. Selbst wenn man davon ausgeht, dass das, was Sie unter Systemen verstehen, ausschließlich aus Software besteht.

Aber bevor ich darauf eingehe, kenne ich kein Buch, das mir helfen könnte. Alles, was folgt, habe ich aus Erfahrung gelernt (dh die drei Punkte, die William gemacht hat).

Was Sie sprechen, umfasst mindestens vier große Rollen. Manchmal kann eine Person alle diese Rollen für kleine bis mittlere Projekte ausfüllen, aber wenn Sie mit großen Projekten beginnen, müssen Sie diese Rollen zumindest etwas voneinander trennen. Es ist schwierig für irgendjemanden, in irgendeiner sinnvollen Weise Experte für sie alle zu sein.

  1. Business Analyst

    Das ist die Person, die mit dem Kunden spricht und seine Anforderungen in etwas übersetzt, das ein Architekt verstehen kann. Grundsätzlich eine Liste der richtig formulierten Anforderungen. Dies umfasst die offensichtlichen funktionalen Anforderungen (was muss dieses System bieten?), Aber auch nicht funktionale Anforderungen (welche allgemeinen Merkmale muss das System erfüllen? Dies kann Sicherheit, Zuverlässigkeit, Verfügbarkeit, Ausfallsicherheit, Kapazität, Leistung, Robustheit und Sicherheit umfassen andere solche Anforderungen aus Anwendersicht).

    Dies ist der erste Durchgang zu dem, was das System tun muss, der Beginn ernsthaften Denkens.

  2. System Architekt

    Diese Person erstellt den technischen Rahmen auf hoher Ebene, in dem sie arbeiten kann. Sie geben den Umriss-Match-Plan. Die allgemeinen Werkzeuge, Techniken, Konstrukte. Sie zerlegen das gesamte System in kleinere Komponenten, wie sie zueinander passen, wie sie zur Außenwelt passen ...

    Dies hilft in vielerlei Hinsicht zu verfeinern, worüber nachgedacht werden muss. In diesem Stadium werden sehr oft Probleme mit den Anforderungen des Geschäftsanalysten festgestellt. Zurück zu ihnen für einige Iterationen, um ihr Verständnis für das, was sie wollen und ihren Ausdruck davon zu verbessern.

  3. Systemdesigner

    In dieser Rolle geht es darum, wie alles funktioniert. Dies könnte mehr Teamarbeit sein als eine Ein-Mann-Show. Es gibt jedoch wahrscheinlich einen leitenden Designer, der das gesamte Systemdesign überwacht. Diese Person muss sich mit den Details befassen und sicherstellen, dass die Ansicht des Architekten tatsächlich erstellt werden kann.

    Erwarten Sie eine weitere Verfeinerung der Architektur des Systems und damit möglicherweise der Geschäftsanalyse.

  4. Testmanager

    Diese Rolle wird sehr oft vergessen. Aber am Ende des Tages, wenn Sie es nicht testen können, wie können Sie beweisen, dass Sie es bauen können? Die Ergebnisse aller Phasen müssen überprüft werden: Geschäftsanalyse, Architektur und Design durch eine Testperson, die in der Lage ist, Mängel aufzuzeigen und daher frühzeitige Korrekturen zu ermöglichen, lange bevor Code geschrieben wird.

Das ist eine kurze Zusammenfassung.

Diese Jungs / Mädels sind nur die allgemeinen Leute in der Kette, die darüber nachdenken, woran man denken muss.

Für komplexe Projekte wie große Bank- oder Raumfahrtanwendungen, um nur zwei Beispiele zu nennen (denken Sie an viele hundert bis viele tausend Manntage), gibt es viele Fachexperten, wie wir sie nennen, um Projekte in jeder Phase zu überprüfen und zu unterstützen. Diese Rollen umfassen Sicherheitsanalyse, Systemgröße, Kapazität, Leistung, Datenbanken, Clustering und viele andere derart enge Fachgebiete, einschließlich präziser Geschäftsbereiche. Die Vielfalt der Rollen hängt von der Größe und Komplexität der Systeme ab.

All das, um zu sagen, dass Sie nicht versuchen sollten, alles zu wissen, werden Sie nicht. Sie können sich jedoch ein Bild vom Gesamtbild machen und bei kleinen Projekten viel mehr als bei großen Projekten, einfach weil die Komplexität es Ihnen ermöglicht, runder zu sein.

Wenn Sie wissen möchten, wie man Systeme entwirft, müssen Sie anfangen, Fragen zu stellen, indem Sie über den Tellerrand hinaus denken. Versetzen Sie sich genug in die Lage des Kunden und überlegen Sie, was schief gehen könnte und was getestet werden muss. Treffen Sie sich dann mit einem echten Kunden und fordern Sie ihn auf, die Ausmaße und Grenzen des Systems zu erläutern, das er sich vorstellt. Und wenn ich "Kunde" sage, müssen Sie verstehen, dass dies mehrere sehr unterschiedliche Personen umfasst. Es gibt die Person, die das System Tag für Tag für das verwendet, wofür es entwickelt wurde. Es gibt den Betreiber, den technischen Support, den Manager, der den einen oder anderen Bericht benötigt, den Prüfer, das Infrastruktur-Team, den Stakeholder, der dafür bezahlt hat, den Qualitätsmanager, der Mittel zum Testen Ihres Systems benötigt ... Fragen Sie alle (und ob) sie sind eine Person, Bitten Sie sie, alle diese Hüte einzeln aufzusetzen. Fragen Sie sie also alle, was sie benötigen, und Sie haben einen guten Einstieg in die Kenntnis Ihrer Systemanforderungen. Von dort können Sie die Architektur und von dort das Design ableiten.

Für komplexe Systeme (ob nur Software oder zur Integration in Hardware im allgemeinsten Sinne) reicht nicht nur eine Person für jede der vier oben aufgeführten Rollen aus, sondern Sie müssen auch die Definition des Systems projektverwalten tun, geschweige denn die anderen Phasen.

HPH, asm.

asoundmove
quelle
2

Hier, um zu lernen, gibt es ein Buch über solche Dinge?

Nicht "ein Buch". Viele Bücher.

Es gibt keine königliche Straße

Wie ich bereits sagte, scheint es einen großen Unterschied zwischen dem Schreiben von Code und dem tatsächlichen Schreiben des richtigen Codes zu geben

Richtig.

Sie sprechen von "Architektur", Programmierung im Großen.

Schritt 1. Lesen Sie viel Code. Sehr viel. Denken Sie an Dinge, die Sie gerne tun würden. Finden Sie verwandte Open Source-Projekte. Lesen Sie den Code. Alles davon.

Schritt 2. Lesen Sie mehr Code. Eine Menge mehr.

Schritt 3. Lesen Sie Bücher über Architektur.

S.Lott
quelle
2
Lesen Las gelesen. Aber ich muss vorschlagen, dass es nicht dasselbe ist wie das, was Sie lernen, wenn Sie echte Systeme implementieren.
Quentin-Starin
@qes: Die Frage war "Wo lernst du, wie man Systeme richtig macht?" Das lernt man nicht, wenn man echte Systeme schlecht baut. In der Tat ist die schlechte Implementierung realer Systeme das genaue Gegenteil von Lernen.
S.Lott
3
Eines der Dinge, die mir von Code Complete am besten gefallen haben: "Im Bereich Software-Engineering werden Beispiele für vergangene Erfolge und Misserfolge außerordentlich begrenzt verwendet. Wenn Sie sich für Architektur interessieren würden, würden Sie die Zeichnungen von [berühmten Architekten] studieren ... besuche einige Gebäude ... ".
Jacob
@ S.Lott: Wer hat etwas darüber gesagt, es schlecht zu machen?
Quentin-Starin
@qes: Ohne den Stand der Technik zu lesen, wie stehen die Chancen, ein umfangreiches Programm gut zu machen? Für ein Genie wie Sie ist es möglich, dass man einfach jederzeit und in allen Maßstäben gute Programme schreibt. Aber für alle anderen, die sich nicht mit umfangreicher Programmierung befasst haben, ist der Versuch, ein großes System zu implementieren, ohne etwas gelesen zu haben, ein Weg, etwas zu schreiben, das so viele Fehler enthält, dass daraus nichts Nützliches gelernt werden kann. Ihre Erfahrung mag anders sein, aber ich weiß, dass ich nicht klug genug bin, um zu arbeiten, ohne vorher zu lesen.
S.Lott
1

Um zu verstärken, lesen Sie viele Bücher ....

Jetzt, wo Sie wissen, dass Sie ein Problem haben, ist es sinnvoll, Ihnen zu sagen, dass Sie diese Bücher lesen sollen. (Bevor Sie echte Arbeit geleistet haben, macht es wenig Sinn, diese Bücher zu diskutieren.)

Entwurfsmuster von Gamma, Helm, Johnson und Vlissides Mustersprachen des Programmdesigns 1,2,3 und 4.

Versuchen Sie jedoch nicht, jedes Muster überall dort anzuwenden, wo Sie sehen, dass es verwendet werden könnte

das ist auch eine schlechte sache.

Hoffe das hilft.

Tim Williscroft
quelle
1

Der beste Weg, um zu lernen, wie man etwas macht, ist es, es zu tun. Wenn Sie lernen möchten, wie man Französisch spricht, müssen Sie Französisch sprechen und Französisch lesen und Französisch schreiben und über Französisch lesen und nach Frankreich gehen und mit Franzosen auf Französisch sprechen. Wenn Sie wissen wollen, wie man Klavier spielt, müssen Sie tatsächlich Klavier spielen. Sie müssen einfache Lieder spielen und die Struktur des Klaviers und die Struktur der Musik lernen. Sie müssen lernen, wie man Musik liest und wie man Musik mit den Fingern über ein Klavier ausdrückt. Sie müssen lernen, wie Musik klingt und welche Klänge ein Klavier erzeugen kann, im Gegensatz zu dem, was eine Gitarre, eine Flöte oder ein Saxophon kann.

Die Programmierung ist genau das gleiche. Wenn Sie wissen möchten, wie eine Datenbank entworfen wird, müssen Sie Datenbanken entwerfen. Wenn Sie die Kryptografie verstehen möchten, implementieren Sie kryptografische Algorithmen und kryptografische Protokolle. Wenn Sie Software schreiben möchten, die mehrere Benutzer gleichzeitig bedienen kann, müssen Sie wissen, wie Festplatten-E / A, Netzwerk-E / A und Threads funktionieren. Um zu verstehen, wie das funktioniert, haben Sie Schreibcode, der Dateien liest und aus ihnen schreibt, Daten über ein Netzwerk überträgt und den Zugriff auf Ressourcen synchronisiert. All dies erfordert Übung.

Ein "System" ist im Allgemeinen nur eine Sammlung von Dingen. Stücke, die zu einem Ganzen koordinieren. Um etwas Großes zu bauen, muss man ein paar kleine Teile bauen. Wenn Sie also lernen möchten, wie man Systeme erstellt, beginnen Sie einfach mit dem Erstellen von Systemen. Nehmen Sie ein Problem, zerlegen Sie es in Teile und implementieren Sie jedes Stück einzeln. Schließlich haben Sie ein integriertes "System". Sie werden wahrscheinlich ein paar Mal auf dem Weg scheitern, aber das ist in Ordnung. Wenn Sie nicht versagen, bedeutet dies normalerweise, dass Sie sich nicht genug anstrengen.

Außerdem würde ich empfehlen, zur Schule zu gehen, um Informatik zu studieren. Das wird beim "Üben" nicht zu viel helfen. Sie müssen das selbst tun, aber es hilft beim Belichtungsteil. Sie werden viel über so ziemlich alles lernen, was mit der Funktionsweise von Computern und Computersystemen zu tun hat, was allein schwer zu lernen ist.

Scott Wisniewski
quelle
1
+1, obwohl ich vorschlagen würde, dass es nicht genug ist, nur zu tun. Sie werden nicht wissen, ob Sie es gut oder schlecht gemacht haben, bis Sie denselben Code nach einiger Zeit erneut aufrufen. Und selbst dann wissen Sie vielleicht, dass etwas nicht stimmt, aber nicht, wie es verbessert werden kann. Eine Möglichkeit, all dies zu verkürzen, besteht darin, viele schnelle Rückmeldungen von Personen zu erhalten, die mehr Erfahrung mit dem haben, was Sie lernen möchten. Also ja, "tun" ist sehr wichtig, aber Feedback zu dem, was Sie möglicherweise noch mehr tun, um den Lernprozess zu beschleunigen.
Marjan Venema