Frage

Sie wissen, dass bestimmter Teil des Codes, der für das Projekt wesentlich ist aber wahrscheinlich eine Menge Zeit in Anspruch nehmen, um es getan? Haben Sie manchmal das Gefühl, dass man eher auf etwas anderes (wahrscheinlich weniger wichtig) oder nicht-Code auf diesem Teil überhaupt, anstatt zu arbeiten arbeiten würde? Das Tier Sie so hart versuchen, jeden faulen Trick, den Sie zu vermeiden und verwenden Sie kennen seine unvermeidlichen Umsetzung zu verzögern?

Nun, ich bin wahrscheinlich nur faul zu sein, aber ich habe immer mit Code wie er damit umgehen. Schreiben Sie etwas, das ich nicht das Gefühl, wie das Schreiben (und es ist noch schlimmer, wenn Sie es für Spaß tun und nicht bezahlt!). Ein großes System, das viel Zeit in Anspruch nehmen wird es in eine Bühne zu bekommen, wo Sie nützliche Ergebnisse oder die Angabe es wieder funktioniert. Wie starten Sie so etwas Codierung? Die meisten Leute würden wahrscheinlich divide vorschlagen und erobern und ähnliche architektonische Techniken, aber das ist nicht, wie Sie es tun; es geht darum, wie man sich auf zu tun beginnen. Was ist die ersten Schritte, die Sie würde nehmen?

War es hilfreich?

Lösung

Ich werde eine Geschichte von einem Fall erzählen, in dem dies mir passiert ist.

Ich wollte einen neuen Frame-Type Entscheidungsalgorithmus für x264 implementieren, die Vorwärts-dynamische Programmierung (der Viterbi-Algorithmus) verwendet. Aber es würde zu kompliziert sein, unordentlich, hässlich, und so weiter. Und ich will wirklich nicht, es zu tun. Ich habe versucht, das Projekt auf Google Summer of Code zu verpfänden, sondern aus einer Art von schrecklichem Unglück, das ein Schüler, dass wir einfach auf seinem Projekt gebürgt hatten ... war der Schüler, die dieses Projekt gewählt hat.

So nach zwei Monaten darüber zu beschweren und Ausweichen, ich habe endlich auf dem Algorithmus zu arbeiten. Und hier ist, wie ich es tat.

Zuerst sprach ich mit dem anderen Entwickler, die offenbar schon einige Ideen hatten, wie man es tun. Wir sprachen sie über und er hat es mir erklärt, bis ich vollständig den Prozess von einem algorithmischen Standpunkt zu verstehen. Dies ist der erste Schritt eines solchen Projekts. Den Algorithmus dahinter verstehen so gut, dass man die ganze Sache Pseudo-Code kann

Dann sprach ich mit einem anderen Mitarbeiter von mir. Wir gingen in ein Whiteboard und skizzierte ich es aus, bis er es auch verstanden. Mit der Erklärung, es an jemand anderen, ich selbst gewonnenen Verständnis. Dies ist der zweite Schritt: der Algorithmus zu jemandem erklären, sonst so gut, dass sie kann es Pseudo-Code. Dies ist eine Emulation des Programmierprozesses, da die Programmierung eine Form der „Erklärung“ einen Algorithmus auf den Computer ist.

Dann schrieb ich einen einfachen Java-Prototyp, die beliebigen gefälschte Werte für die Kostenfunktion verwendet und ausschließlich verwendet wurde, die Viterbi-Suche zu testen. Ich beendete es und habe es gegen eine erschöpfende Suche - es perfekt aufeinander abgestimmt. Meine dynamische Programmierung richtig war. Dies ist der dritte Schritt. Schreiben die einfachsten möglichen Form des Algorithmus in der einfachsten möglichen Umgebung

Dann portierte ich es C, x264 der Muttersprache. Es funktionierte wieder. Dies ist der vierte Schritt. Port, einfache Form des Algorithmus auf die volle Umgebung

Dann endlich ich ersetzt die gefälschte Kostenfunktion mit dem realen. Nach einigen Fehlerjägern und Fixierung, es funktionierte. Dies ist der letzte Schritt. Den Algorithmus vollständig mit der Umgebung integrieren

Dieser Prozess dauerte kaum eine Woche, sondern aus der Perspektive von mir zu Beginn des Projekts war es völlig entmutigend, und ich konnte mich nicht einmal loszulegen bekommen - noch, indem sie es brechen in einen solchen Schritt nach unten durch Schritt-Prozess, konnte ich nicht nur es getan , aber get it done viel schneller als ich erwartet hatte.

Und die Vorteile gingen weit über x264; Ich verstehe jetzt Viterbi so gründlich, dass ich jetzt es anderen erklären kann ... und die andere, können stark davon profitieren. Zum Beispiel, einer der ffmpeg-Entwickler verwendet eine Anpassung meines Algorithmus und Code optimal ein etwas anderes Problem zu lösen. Optimale Kopf Platzierung in Audio-Dateien

Andere Tipps

Generell Ich liebe den großen, komplexen Teil. Sie sind die Teile, die tatsächlich eine Herausforderung erweitern und mich zwingen, sorgfältig zu prüfen, was ich tue. Es ist all die kleinen, langweiligen Bits, die ich mag nicht. Allerdings, wenn es um etwas zu tun, kommt Ich habe aufzuschieben finde ich ein einfaches Stück Beratung wichtig:
JUST DO IT !!!
Im Ernst, wenn es es ist viel einfacher zu beenden gestartet wird. Ich immer finde ich Dinge aufschieben, bis ich sie beginnen, dann plötzlich finde ich, dass jetzt, wo ich angefangen habe, ist es nicht so schlimm ist, wie ich es mir vorgestellt hatte, und schauen, ist es fast schon fertig!

Teile und herrscht nicht nur um die Strukturierung Code, es funktioniert auch als Ansatz ein Projekt vom Konzept her handhabbar zu machen. Wenn ich eine harte Zeit an einem Projekt der ersten Schritte habe es fast immer, weil es zu groß und unheimlich . Durch die Aufteilung in konzeptuell handhabbare Stücke, wird es weniger beängstigend.

Ich glaube, auch in „ Leuchtspurgeschosse “, wie durch die pragmatischen Programmierer beschrieben. reduzieren das Projekt in die absolut einfachste Möglichkeit „proof of concept“ der Kernteile, z.B. ohne UI, Sonderfälle, Fehlerbehandlung und so weiter. Vielleicht ist es nur ein paar Kernroutinen mit zugehörigen Komponententests. Damit haben Sie die beängstigend Teile erobert und kann vom Kern bauen.

Grundsätzlich ist der Trick, um die ersten Schritte (für mich zumindest) ist: Sie auf das gesamte Projekt nicht gestartet werden. Starten Sie auf einem kleinen (vorzugsweise Kern) Teil und baut von dort aus. Wenn I noch haben eine harte Zeit begonnen, Es ist, weil der kleine Teil ich beschlossen, noch zu groß ist, so habe ich zu teilen und es weiter zu reduzieren.

Ich stimme Ihnen zu, dass viele große, wichtige Teile einer Software nicht Spaß zu schreiben. Ich in der Regel mit einigen kleineren Dingen, die meine Entwicklung Tag beginnen, wie ein Feature hier hinzufügen oder einen Fehler dort zu befestigen. Wenn es Zeit ist, beginne ich mit dem großen Teil, aber wenn ich kann einfach nicht das Ding nicht mehr sehen, ich tue etwas anderes. Das ist alles in Ordnung, wenn man noch alles rechtzeitig fertig bekommen. Und denken Sie daran, dass es machen kann Dinge einfacher, wenn Sie mit anderen Menschen über dieses große Tier sprechen, bevor Sie es tun, während Sie tun, und nachdem Sie fertig sind. Dies wird nicht nur Ihren Geist frei, aber Sie werden auch andere Menschen der Meinung von einer weniger subjektiven Sicht bekommen. solche Dinge planen zusammen hilft auch.

Komisch, ich bin umgekehrt. Wenn ich ein Problem beginnen Bewältigung, gehe ich für die Großen zuerst. Der Kern des Problems ist in der Regel, was mich interessiert.

Wenn ich ein Projekt für mich mache, könnte ich in der Regel nicht gestört werden alle Fuzzy-Bits zu implementieren um die Kanten, so dass sie nie getan. Wenn ich etwas für echte tun, ich schließlich zu allen Fuzzy-Bits erhalten, aber es ist nicht mein Lieblingsteil.

Ich denke, es gibt zwei Probleme hier.

Zuerst wird tatsächlich begonnen. Wie Sie sagen, kann das ziemlich schwierig sein. Persönlich fange ich gerade auf jedem Bit, nur etwas auf dem Papier / Bildschirm zu bekommen. Es wird wahrscheinlich falsch sein und muß die Bearbeitung aber im Allgemeinen ist es einfacher zu kritisieren als auch auf die eigene Arbeit erstellen.

Dann gibt es den eigentlichen Prozess harte Probleme zu lösen. Es gibt ein großes Buch „Conceptual BlockBusting“ genannt, die verschiedene Möglichkeiten der Annäherung an Probleme diskutiert. Ich habe viel gelernt, wie ich Ansatz der Problemlösung und meine blinden Flecken dieses Buch verwenden. Sehr zu empfehlen.

ich versuche, eine Metapher zu schaffen, was das System zu tun versucht. Ich habe immer wohler fühlen, wenn ich das Verhalten im Sinne einer Metapher beschreiben kann.

Ich gehe dann von einer Testgetriebene Entwicklung Sicht, das heißt anfangen zu beschreiben, was das System durch die Einrichtung, die Tests zu tun, muss die richtige Verhalten überprüfen wird.

HTH.

prost,

Rob

Der schwierigste Teil des Projektes wird aus dem Nichts in der ersten Zeile getan hat. Nur etwas nach unten auf dem Papier wird dieser Prozess gestartet und es ist erstaunlich, wie schnell der Rest von hier fließen kann.

Ich bin ein Fan der „ teile und herrsche “ -Typ mich nähern.

Wann ist es eine besondere große Aufgabe in einem System über mir hängen, lasse ich den Computer, einen Stift und Papier nehmen und brechen die Aufgabe heraus in alle seine logischen Komponenten und Work-Flow.

Dann wird jede dieser Aufgaben übernehmen, und brechen die bis in die grundlegendsten Funktionen / Anrufe erforderlich.

Ich kann dann in Stub-Methoden setzen, dass ich denke, ich brauche. und Fleisch sie eins nach dem anderen. An dieser Stelle jeder dieser „Unteraufgaben“ ist nicht größer als die kleinere Entwicklungsaufgaben das gleiche Projekt umkreisen, so fühlen sich wie ein viel weniger schwere Aufgabe über mich hängen.

ich in der Regel diese Art von Problemen zu Hause bewältige einen Stift und ein Stück Papier mit .. ich den Algorithmus vorstellen und / oder logischen Ablauf und dann Stub (auf dem Papier!) Die Klassen und Methoden-Stubs und wenn ich in vor a / der Computer kann ich es viel einfacher machen ... Wahrscheinlich mich ist es nur ..

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top