Steve Summit / Teil4
StartSeite | SteveSummit/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Top
Prev
Next
4. ability to abstract, think on several levels
- 4. Die Fähigkeit zu abstrahieren und vielschichtig zu denken
[11] This is probably the most important skill in programming. Computers are some of the most complex systems we've ever built, and if while programming you had to keep in mind every aspect of the functioning of the computer at all levels, it would be a Herculean task to write even a simple program.
- Dies ist vermutlich die wichtigste Fähigkeit beim Programmieren. Computer gehören zu den komplexesten System, die gebaut werden und wenn man beim Programmieren jedes funktionelles Detail des Computers auf allen Ebenen im Kopf haben müsste, dann wäre es eine Herkules-Aufgabe, auch nur ein simples Programm zu schreiben.
[12] One of the most powerful techniques for managing the complexity of a software system (or any complex system) is to compartmentalize it into little "black box" processes which perform useful tasks but which hide some details so you don't have to think about them all the time. We compartmentalize tasks all the time, without even thinking about it. If I tell you to go to the store and pick up some milk, I don't tell you to walk to the door, open the door, go outside, open the car door, get in the car, drive to the store, get out of the car, walk into the store, etc. I especially don't tell you, and you don't even think about, lifting each leg as you walk, grasping door handles as you open them, etc. You never (unless perhaps if you're gravely ill) have to worry about breathing and pumping your blood to enable you to perform all of these tasks and subtasks.
- Eine der wirkungsvollsten Techniken zum Umgang mit der Komplexität von Software-Systemen (beliebiger komplexer Systeme) ist die Zerlegung in kleine Black-Box-Prozesse, die nützliche Aufgaben erfüllen und Details in sich aufnehmen, damit man sie nicht im Kopf behalten muss. Wenn ich jemand bitte, im Geschäft Milch zu kaufen, dann sage ich ihm nicht, dass er zur Tür gehen, sie öffnen, hinausgehen, die Autotür öffnen, ins Auto einsteigen, zum Geschäft fahren, aus dem Auto aussteigen, ins Geschäft gehen soll, etc. Insbesonders sage ich nicht dazu - ja denke nicht einmal darüber nach - dass beim Gehen die Füße zu heben sind, beim Öffnen der Türen nach den Türgriffen zu greifen ist, etc. Man braucht sich auch (außer im Falle einer schweren Krankheit) keine Gedanken über die Atmung und den Blutkreislauf zu machen, der uns in die Lage versetzt all diese Aufgaben und Teilaufgaben zu erfüllen.
[13] We can carry this little example in the other direction, as well. If I ask you to make some ice cream, you might realize that we're out of milk and go and get some without my asking you to. If I ask you to help put on a party for our friends, you might decide to make ice cream as part of that larger task. And so on. Compartmentalization, or abstraction, is a vital skill in programming, or in managing any complex system. Despite what I said in point 3 above, we can only keep a small number of things in our head at one time. A large program might have 100,000 or 1,000,000 or 10,000,000 lines of code. If it were necessary to understand all of the lines together and at once to understand the program, the program would be impossible to write or understand. Only if it is possible to think about small pieces in isolation will it ever be possible to work with a large program.
- Wir können dieses kleine Beispiel auch in die andere Richtung ausdehnen. Bei der Zubereitung von Eiscreme könnte man feststellen, dass die Milch fehlt und ohne besonderen Auftrag welche einkaufen. Bei einer Party-Vorbereitung könnte die Eiscreme-Zubereitung Teil dieser größeren Aufgabe sein. Und so weiter, und so fort. Die Zerlegung in Teilaufgaben bzw. die Abstraktion ist eine lebenswichtige Fähigkeit beim Programmieren bzw. bei der Handhabung komplexer Systeme. Trotz des unter Punkt 3 über das Gedächtnis gesagten, können wir immer nur eine kleine Anzahl von Dingen gleichzeitig im Kopf haben. Ein großes Programm kann 100.000 oder 1.000.000 oder 10.000.000 Programmzeilen haben. Wenn es notwendig wäre, alle Zeilen im Kopf zu haben und vor allem gleichzeitig zu verstehen, könnte man so ein Programm unmöglich erstellen oder verstehen. Nur weil es möglich ist, über jeweils kleine Teile isoliert nachzudenken, kann man mit so großen Programmen umgehen.
[14] Compartmentalization, powerful though it is, is not automatic, and not necessarily an instant cure for all of our organizational problems. We carry a lot of assumptions around about how various things work, and things work well only as long as these assumptions hold. To return to the previous example, if I ask you to go the store and get some milk, I'm assuming that you know which kind to get, where the store is, how to get there, how to drive if you need to, etc. If some of these assumptions weren't valid, or if there were several options for any of them, we might have to modify the way I gave you instructions. I might have to tell you to drive to the store, or to go to Safeway, or to get some two percent milk.
- Aufgabenzerlegung ist zwar ein mächtiges Werkzeug, ergibt sich aber einerseits nicht automatisch und ist andererseits auch kein Patentrezept für jedes organisatorische Problem. Wir agieren ständig mit einem Bündel von Annahmen darüber, wie die Dinge um uns herum funktionieren, und alles klappt solange diese Annahmen zutreffen. Um auf das letzte Beispiel zurückzukommen, wenn ich jemand bitte, ins Geschäft zu gehen und Milch zu kaufen, dann gehe ich davon aus, dass er weiß, welche Milch und welches Geschäft ich meine und wie er dorthin fährt, etc. Wenn diese Annahmen nicht stimmen, oder wenn es Alternativen gibt, dann muss ich meinen Auftrag genauer formulieren, indem ich z. B. von einem bestimmten Supermarkt spreche, den Weg beschreibe oder die 2%-Milch verlange.
[15] Therefore, we can't simply compartmentalize all of our processes and subprocesses and forget about complexity problems forever. We have to remember at least some of the assumptions surrounding the compartmentalization scheme. We have to remember what we can and can't expect from the processes (people, computer programs, etc.) which we call on to do tasks for us. We have to make sure that we keep our end of the bargain and don't fall down on any of the commitments and promises we've made on the tasks we've been asked to do and which others are assuming we'll keep.
- Aus diesem Grund reicht es nicht, einfach alle Aufgaben weiter und weiter zu zerlegen und so die Probleme der Komplexität zu erledigen. Wir müssen immer zumindest einen Teil der Annahmen, die unsere Strukturierung begleiten, im Kopf haben. We müssen wissen, was wir von den Prozessen (Personen, Computerprogrammen, etc.), die wir für unsere Aufgaben verwenden, erwarten können bzw. nicht erwarten dürfen. Wir müssen sicherstellen, dass wir unseren Teil dieser Verträge erfüllen, die eigenen Zusagen und Versprechungen einhalten, auf die sich andere Teile des Systems verlassen.
[16] Thinking about the mechanics of a design hierarchy, while also using that hierarchy to avoid having to think about every detail of it at every level all of the time, is one of the things I mean by "thinking on several levels." It's tricky to do (obviously, it's tricky even to describe), but it's the only way to cut through large, complex problems.
- Gleichzeitig einerseits über die Wechselwirkungen in diesen hierarchischen Beziehungen nachzudenken während man sich andererseits mit Details auf jeder Ebene beschäftigen muss, ist das was ich mit "vielschichtigem Denken" meinte. Es sind knifflige Aufgaben (wie man sieht, sogar knifflig zu beschreiben) aber dies ist die einzige erfolgversprechende Methode um große und komplexe Probleme zu bearbeiten.
[17] What's hard about programming (besides maybe having trouble with the four traits above) is mostly picky little detail and organizational problems, and people problems. A large program is a terribly complex system; a large programming project worked on by many people has to work very hard at peripheral, picayune tasks like documentation and communication if the project is to avoid drowning in a flood of little details and bugs.
- Was das Programmieren noch schwierig macht (neben den vier oben angeführten Problemfeldern) sind menschliche Probleme, organisatorische Probleme und die Fülle an nervtötenden Detailproblemen. Ein großes Programm ist ein erstaunlich komplexes System und ein großes Programmierprojekt, an dem viele Personen arbeiten, muss sehr viele periphere Kommunikations- und Dokumentationsaufgaben erfüllen, um nicht in der Flut von Detailinformationen - und Missverständnissen, die zu Fehlern führen - zu ertrinken.
Diskussion / Korrekturen | |
Franz, danke für die IMO sehr wesentliche Korrektur. -- hl
- Ich denke zwar nicht, dass die Korrektur hier wirklich sehr wesentlich war; aber immerhin richtiger als das, was bisher da stand. ;-) --ff
Frage: Im Bezug auf der Übersetzung von "compartmentalization" bin ich im Zweifel, ob ich es mit "Aufgabenzerlegung" richtig getroffen. Sollte man es vielleicht als "Strukturierung" oder "Modularisierung" übersetzen? Oder gibt es noch andere, bessere Alternativen (immer auch in Hinblick auf die Verständlichkeit für den Programmieranfänger als Adressaten des Textes)? --hl
- Hmmm... "Strukturierung" oder "Modularisierung" treffen zwar sicher (in gewisser Weise) das Gemeinte recht gut, sind aber doch (wie Du weißt) auch schon wieder "Fachtermini", und daher mit einer Bedeutung "aufgeladen", die "compartmentalization" an sich (noch) nicht zukommt!
- Daher glaube ich, dass "Zerlegung" bzw. "Aufgabenzerlegung" (je nach Kontext) eigentlich recht gut passt. (TECHNISCH gesehen ist wohl wirklich so was wie Modularisierung gemeint; aber das wird ja eben im Text selbst dann erklärt.) --ff
Top
Prev
Next
StartSeite | SteveSummit/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 29. Mai 2002 21:15 (diff))