2009-10-26 5 views
19

Kürzlich habe ich versucht, meinem Projektmanager etwas schlecht entworfenen Code zu erklären. Alle Manager-Klassen sind Singletons ("und deshalb kann ich das nicht einfach ändern") und der Code verwendet Event-Dispatching überall dort, wo ein Funktionsaufruf genügt hätte ("und deshalb ist es so schwer zu debuggen"). Leider kam es nur als ein verwirrendes Durcheinander von Englisch heraus.Schwierigste Programmierung Erklärung

Was ist das Schwierigste, das Sie als Programmierer an eine nichttechnische Person weitergeben mussten? Haben Sie irgendwelche Analogien oder Erklärungsmuster gefunden, die das deutlicher machten?

+3

Ich vermute, das sollte ein Community-Wiki sein. –

+13

"Wenn du es einem Sechsjährigen nicht erklären kannst, verstehst du es nicht selbst." - Albert Einstein: o) –

+6

@Gary Einstein, sechs Jahre alt war wahrscheinlich nur eine Metapher für alle anderen. – Kai

Antwort

29

Thread-Synchronisierung und Dead-Locking.

+0

+1 dafür. Alles Multithreading ist einer nichttechnischen Person schwer zu erklären, auf eine Weise, in der sie verstehen, warum die Aufgabe "schwer" ist. – wheaties

+21

Einfach, stellen Sie sich vor, wie mehrere Hämmer mit verbundenen Augen auf den gleichen Nagel schlagen oder einen Satz Nägel dicht aneinander legen und gleichzeitig versuchen, sie zu hämmern. Wird nicht funktionieren oder nicht schnell sein. Sie brauchen etwas Schema/Plan/Arbiter, um das zu handhaben.:) – Macke

+4

Erklären ist es schwierig genug; Das Debuggen erfordert eine völlig neue Definition von "schwierig": P – Magsol

17

Ich wurde gefragt, wie das Internet funktionierte - ich antwortete mit "SYN, ACK, ACK". Halten Sie vergessen, es ist SYN, SYN-ACK, ACK ..

alt text http://www.inetdaemon.com/img/internet/3-way-handshake.gif

+18

Und ich nehme an, dass von einem WTF gefolgt wurde. –

+0

Nun, sie sagten, sie wollten es einfach :). Es ist der 3-Wege-Handshake: http://www.inetdaemon.com/tutorials/internet/tcp/3-way_handshake.shtml –

+1

Das ist einfach genial. :) –

10

1.) SQL: Denken in Sätzen, anstatt prozedural (es ist schwer genug für uns Programmierer zu fassen!).

2.) ... und hier ist ein großartiges Beispiel für demystifing technische Konzepte:

How I explained REST to my wife

+1

+1 für den REST-Erklärungslink handelt. –

25

Verbringe Zeit auf Design, und verbringt viel Zeit auf Refactoring.

Refactoring produziert überhaupt keine für den Kunden sichtbare Arbeit, was es zu einer der schwierigsten Arbeiten am Projekt macht.

Als ein zweites "nicht Client-sichtbares" Problem, Unit-Tests.

+7

Es wird sichtbar sein, wenn Sie etwas ändern und es nicht mehr funktioniert. –

+0

Oh, es ist dann sichtbar, aber die Schuld des Managements fällt auf die Person, die die Änderung vorgenommen hat, nicht auf das Fehlen von Tests. –

2

Ich habe manchmal wirklich Schwierigkeiten, das Konzept der Kovarianz/Kontravarianz und die damit verbundenen Probleme mit anderen Programmierern zu erklären.

1

Dead-Locking in einer Multithread-Umgebung vermeiden.

Ich löste Verwirrung, indem ich es visuell auf einer Tafel erklärte, zwei parallele Linien zeichnend und zeigend, was passiert, wenn die gleichen Punkte zur gleichen Zeit erreichen.

Auch Rollenspiel zwei Threads mit der Person, ich erklärte es zu, und mit physischen Objekten (Buch, Kaffeetasse, etc) zu zeigen, was passiert, wenn wir beide versuchen, etwas auf einmal zu verwenden.

6
+18

http://stackoverflow.com/questions/1627018/most-difficult-programming-explanation/1627060#1627060 –

+5

Sie sollten mit der Erklärung beginnen, wie die Rekursion funktioniert – Tim

+0

@Dan, das ist nicht mehr neu. : P –

2

einen Freund zu überzeugen, dass die Facebook-Anwendung entwickelte ich wirklich nicht ihre persönlichen Daten (zum Beispiel Name), obwohl zeigt es immer noch.

+4

Es speichert es, zumindest im Speicher. Und wenn es ausgelagert wird, ist es auf der Festplatte ... Jetzt gehen und versuchen, das zu erklären ... –

5

Warum Code wie das ist schlecht:

private void button1_Click(object sender, EventArgs e) 
{ 
    System.Threading.ThreadStart start = 
     new System.Threading.ThreadStart(SomeFunction); 
    System.Threading.Thread thread = new System.Threading.Thread(start); 
    _SomeFunctionFinished = false; 
    thread.Start(); 
    while (!_SomeFunctionFinished) 
    { 
     System.Threading.Thread.Sleep(1000); 
    } 
    // do something else that can only be done after SomeFunction() is finished 
} 

private bool _SomeFunctionFinished; 
private void SomeFunction() 
{ 
    // do some elaborate $#@%# 
    _SomeFunctionFinished = true; 
} 

aktualisieren: was dieser Code sollte sein:

private void button1_Click(object sender, EventArgs e) 
{ 
    SomeFunction(); 
    // do something else that can only be done after SomeFunction() is finished 
} 

private void SomeFunction() 
{ 
    // do some elaborate $#@%# 
} 
+4

Warum ist es schlecht? –

+1

Braucht nur ein paar Dutzend Schlösser drin (Übertreibung). –

+1

Ich bin neugierig, warum eine nicht-technische Person Ihre Meinung zu diesem ... fragte (oder ist das ein subtiles Klopfen auf einem "nicht technischen" Coder?) –

1

Es gibt wirklich keine richtige oder falsche Antwort-richtige für diese .. Es sind alles Erfahrungen.Das Schwierigste, was ich einem Nicht-Tech-Menschen erklären musste, war, warum er nicht auf seine Website gehen konnte, wenn er ins Ausland reiste, aber sein Familienmitglied, das dort wohnte (mit einem ganz anderen Anbieter), konnte dazu kommen. Irgendwie war "Scheitern in Finnland" nicht gut genug.

1

Die schwierigsten Konzepte, die man Leuten erklären kann, die ich als Programmierer im Gegensatz zu Entwicklern bezeichnen würde, sind einige der wichtigsten Paradigmen des objektorientierten Designs. Insbesondere Abstraktion, Verkapselung und der König, Polymorphismus und wie man sie richtig benutzt.

Darauf aufbauend ist die Komplexität der Erklärung, was Inversion of Control ist und warum es ein absolutes Bedürfnis ist, und nicht nur zusätzliche Ebenen von Code, die nichts tun.

3

Das Konzept der Rekursion - einige Leute bekommen es wirklich schwer.

+3

Um Rekursion zu verstehen muss man zuerst Rekursion verstehen –

+1

Ich konnte nie die Schwierigkeit der Rekursion erfassen. Ich fühle mich ratlos. –

4

Die Bedeutung von Komponententests.

+2

Es ist immer schwer zu erklären, dass etwas fehlt. :) –

11

Ich hatte einen lustigen Fall zu versuchen, zu erklären, warum ein Programm nicht wie erwartet reagiert, wenn einige Datensätze in einer Datenbank leere Zeichenfolgen hatten und einige NULL waren. Ich denke, dass ihr Kopf explodierte, als ich ihnen sagte, dass eine leere Zeichenfolge nur eine Zeichenfolge mit 0 Bytes ist, während NULL einen unbekannten Wert bedeutet und man sie daher nicht mit irgendetwas vergleichen kann.

Danach hatte ich eine böse Kopfschmerzen.

+6

+1 ... Ich hatte dieses eine vor allem mit SQL - "sie sind beide null, also warum sind sie nicht gleich?" –

14

Meine schwierigste Frage begann unschuldig genug: Meine Freundin fragte, wie Text in Firefox gerendert wird. Ich antwortete einfach mit etwas wie "Rendering-Engine, Gecko, HTML-Parser, bla bla bla".

Dann ging es bergab. "Nun, wie weiß Gecko, was er dann zeigen soll?"

Es buchstäblich von der Grafiktreiber, Betriebssystem, Compiler, Hardwarearchitekturen, und die rohen 1s und 0s. Ich erkannte nicht nur, dass es signifikante Lücken in meiner eigenen Kenntnis der Schichtungshierarchie gab, sondern auch, wie ich sie (und mich!) Am Ende mehr verwirrt hatte als zu Beginn.

Ich hätte zuerst "Schildkröten den ganzen Weg nach unten" beantwortet und blieb dabei. : P

+8

+1 für "Turtles den ganzen Weg hinunter" - es ist die beste Antwort für die meisten Computerprobleme. –

+19

Sie haben eine Freundin, die nach Text-Rendering in Firefox fragt? Aussenseiter! – Amarghosh

+1

Ich habe einmal versucht, einen Kollegen mit meinem neu erlernten Betriebssystemwissen zu beeindrucken. Es war ihr egal. –

5

"Wenn Sie dieser späten Aufgabe einen Monat lang einen neuen Programmierer hinzufügen, wird er später geliefert. Es macht nichts, lesen Sie dieses Buch." (The Mythical Man-Month.) Manager immer noch nicht ganz bekommen.

0

Versuchen zu erklären, warum Code überhaupt sequentiell ausgeführt wurde. Scheinbar ist dies für einige Nicht-Programmierer (d. H. Meine Freundin) nicht intuitiv.

+0

wirklich? Ich glaube nicht, dass ich jemals zuvor darüber gestolpert bin ... Ich denke, die meisten Leute nehmen an, dass der Computer Dinge sequentiell macht, weil sie es tatsächlich sehen, wenn sie den Computer benutzen (vor allem bei Fortschrittsbalken mit blinkenden Erklärungen) über was es tut) – rmeador

+0

Mm. Außer Menschen holen solche Dinge nicht unbedingt auf. Es ist eine Art Kochrezepte. Sie erscheinen strukturiert und sequenziell, aber in Wirklichkeit laufen viele Dinge gleichzeitig ab. Wenn Sie nicht wissen, wonach Sie suchen, können die Dinge wahrscheinlich ziemlich chaotisch erscheinen. Wohlgemerkt, ich habe versucht, den tatsächlichen Code zu erklären, der ziemlich weit von dem entfernt ist, mit dem meine Freundin normalerweise in Kontakt kommt, wenn es um Computer geht. Das war, worauf wir feststeckten. –

+0

Meinst du sequentiell oder synchron? Ich kann mir vorstellen, dass Nichttechniker denken: "Okay, gut, während es diese Codezeile ausführt, geht es weiter zu dieser Codezeile." – PaulG

2

Warum wird es weitere vier Wochen dauern, bis diese App in Produktion geht? Schließlich dauerte es nur eine Woche, um den Rapid Prototyp zu machen. Es "funktioniert" (oder sieht zumindest so aus), also sollte ich ziemlich fertig sein, oder?

Erklärungen, die Sicherheit, Codequalität (Wartbarkeit), normalisierte DB-Schemas, Tests usw. betreffen, werden in der Regel als Liste von Abstraktionen ausgegeben, die keine sichtbaren Auswirkungen auf die App haben wirklich zum Projekt beitragen und warum sie notwendig sind. Manchmal können Analogien dich nur so weit bringen.

+0

"Handgeschriebene Briefe, Schreibmaschinen oder Computer. In welche investiert man?" –

9

Eine Menge von Aussagen beginnend mit "It's because in Oracle, ..." kommen mir in den Sinn.

9

Die größten Hürden sind "technologische Schulden", vor allem, wie die Architektur für diese Version korrekt war, aber für die nächste Version geändert werden muss. Dies ist ähnlich dem Problem der Erläuterung von "Prototyp versus Produktion" und "Version 1.0 versus Version 2.0".

Der schlimmste Fehler, den ich jemals gemacht habe, war ein UI-Mockup in NeXT-Schritten UI-Builder. Es sah genau wie das Endprodukt aussehen würde und etwas Verhalten hatte. Versuchen zu erklären, dass es noch 6 Monate Arbeit gab, war sehr schwierig.

+0

Ja, ich habe das Gleiche gemacht. – reinierpost

+0

Modellauto. Die Türen funktionieren, aber es gibt keinen Motor! –

1

Ich wollte Mikaels Beitrag kommentieren, dass manche Leute nur die sequentielle Programmierung nehmen und leider einfach dabei bleiben.

Aber das wirklich bedeutet: zwei schwer schwer zu erklären Konzepte:

  • Monaden in Haskell (in der Regel beginnend mit: „Das ist wie eine Funktion, die eine Funktion gibt, das tut, was Sie wirklich tun wollten, aber. .. ")
  • deferreds in verdrehtem/python (" das ist wie ... ehhh ... es nur für ein Jahr verwenden oder so, und Sie werden es bekommen“;))
2

C Zeiger

* i

& i

+0

Das wäre "die Person an Adresse i" und "die Adresse von Person ich". –

0

Warum Sie nicht korrekte Zeichenindex Handhabung in den meisten Fällen müssen Sie, wenn Sie UTF-8-Zeichenfolgen verwenden.

0

Es ist schwer zu erklären, warum die meisten Software Fehler hat. Viele nicht-technische Leute haben keine Ahnung, wie komplex Software ist und wie einfach es ist, unerwartete Bedingungen zu übersehen. Sie denken, wir sind einfach zu faul, Sachen zu reparieren, von denen wir wissen, dass sie kaputt sind.

0

Es gibt 10 verschiedene Arten von Menschen auf der Welt.

Die Leute, die Binary und die Leute verstehen, die nicht ....

+2

Was ist mit den anderen 1000? – some

+0

Sie haben einen Fehler in Ihrer Frage, @some. ;) – TechyTimo

+0

@TechyTimo: Ich bin mir nicht sicher, ob du meinen Scherz hast oder nicht, aber falls du (oder jemand anderes nicht), werde ich versuchen es zu erklären: Es hat alles damit zu tun, welche Basis du benutzt. In der ursprünglichen Erklärung heißt es '10 verschiedene Typen 'mit zwei Optionen. Der Witz ist, dass '10' binär anstatt dezimal geschrieben wird. Jemand, der mit Binär nicht vertraut ist, könnte sich fragen, was mit den anderen acht Typen passiert ist. Mein Witz war, diese Frage zu schreiben, aber binär. Ich hätte auch fragen können, was mit den anderen 10 passiert ist, mit Oktal. – some

0

Um es klar zu sagen, ist, warum die Entwicklung der schwierigste Konzept jemals den Menschen Art ausgesetzt. Nicht im Zusammenhang mit einer Programmiersprache, aber im Allgemeinen. Und nein, ich versuche nicht, mir selbst oder dir einen Ego-Boost zu verschaffen, die einzigen wirklichen Einschränkungen in diesem Bereich sind deine Gedanken.

Warum? Wir arbeiten nicht mit Konstanten und es gibt keine Grenzen. Der einzige Grund, warum eine KI, die wie ein Mensch denkt, noch nicht existiert, liegt an unseren eigenen Einschränkungen. Alle anderen Aspekte müssen sich an irgendeine Art von Gesetz halten, die Entwicklung interessiert sich nicht für die Gesetze der Physik oder irgendein Gesetz, daher der Begriff Entwicklung ... Evolution.