im Aufkommen des Codeseine Reihe täglicher Programmierherausforderungen, die zum ersten Mal im Dezember veröffentlicht werden. Die täglichen Herausforderungen bestehen in der Regel aus zwei Rätseln, die auf einem ähnlichen Drawback aufbauen. Auch wenn diese Herausforderungen und Probleme nicht typischen Arbeitsabläufen in der Datenwissenschaft ähneln, habe ich festgestellt, dass viele der Gewohnheiten, Denkweisen und Problemansätze, die sie fördern, überraschend intestine auf datenorientierte Arbeit übertragen werden können. In diesem Artikel denke ich über fünf Erkenntnisse nach, die ich durch die Befolgung des erhalten habe Aufkommen des Codes Herausforderung in diesem Jahr und wie sie sich auf die Datenwissenschaft übertragen lassen.
Für mich, Aufkommen des Codes conflict eher eine kontrollierte Übungsumgebung, in der ich die Grundlagen wieder aufgreifen und an meinen Programmierkenntnissen arbeiten konnte. Sie konzentrieren sich auf das Wesentliche, da es keine Ablenkungen gibt, denen Sie im Arbeitsalltag ausgesetzt wären. Sie haben keine Besprechungen, keine sich ändernden Anforderungen, keine Stakeholder-Kommunikation oder keinen Koordinationsaufwand. Stattdessen haben Sie eine direkte und binäre Rückkopplungsschleife: Ihre Antwort ist richtig oder nicht. Es gibt kein „quick richtig“, keine Möglichkeit, das Ergebnis zu erklären und keine Möglichkeit, Ihre Lösung zu verkaufen. Gleichzeitig haben Sie die Freiheit und Flexibilität, jeden Ansatz zu wählen, den Sie für richtig halten, solange Sie zu einer richtigen Lösung gelangen.
Die Arbeit in einem solchen Umfeld conflict eine große Herausforderung, aber auch sehr wertvoll, da dadurch auch Gewohnheiten offengelegt wurden. Da Sie kaum Raum für Unklarheiten haben und Ihre Fehler nicht verbergen können, wurden eventuelle Mängel in Ihrer Arbeit sofort aufgedeckt. Mit der Zeit wurde mir auch klar, dass die meisten Fehler, auf die ich stieß, wenig mit der Syntax, der Wahl des Algorithmus oder der Codierungsimplementierung zu tun hatten, sondern viel mehr mit der Artwork und Weise, wie ich Probleme angegangen bin, bevor ich mit Code in Berührung gekommen bin. Was folgt, sind meine wichtigsten Erkenntnisse aus dieser Erfahrung.

Lektion 1: Skizzieren Sie die Lösung – Denken Sie nach, bevor Sie programmieren
Ein Muster, das währenddessen oft auftauchte Aufkommen des Codes conflict meine Tendenz, direkt in die Umsetzung zu gehen. Wenn ich mit einem neuen Drawback konfrontiert wurde, conflict ich normalerweise versucht, sofort mit dem Codieren zu beginnen und zu versuchen, so schnell wie möglich eine Lösung zu finden. Ironischerweise bewirkte dieser Ansatz oft genau das Gegenteil. Ich habe zum Beispiel tief verschachtelten Code geschrieben, um Grenzfälle zu bewältigen, die die Laufzeit des Codes in die Höhe trieben, ohne zu bemerken, dass es eine viel einfachere Lösung gab.
Was mir letztendlich geholfen hat, conflict, einen Schritt zurückzutreten, bevor ich mit dem Code begann. Stattdessen begann ich damit, Anforderungen, Eingaben und Einschränkungen zu notieren. Der Prozess des Notierens hat mir geholfen, ein Maß an Klarheit und Struktur zu erreichen, das mir gefehlt hatte, als ich direkt in den Code gesprungen conflict. Darüber hinaus trug das Nachdenken über mögliche Ansätze, das Skizzieren einer groben Lösung oder die Arbeit an einem Pseudocode dazu bei, die benötigte Logik noch weiter zu formalisieren. Sobald dies erledigt conflict, wurde die Implementierung über den Code viel einfacher.
Diese Erkenntnisse lassen sich auf die Datenwissenschaft übertragen, da viele Probleme aufgrund unklarer Ziele, schlecht formulierter Ziele oder weil Einschränkungen und Anforderungen im Voraus nicht intestine genug bekannt sind, eine Herausforderung darstellen können. Durch die Definition gewünschter Ergebnisse und Überlegungen zur Lösung vor Beginn des Codeschreibens kann unnötiger Aufwand vermieden werden. Wenn man vom angestrebten Ergebnis rückwärts arbeitet, anstatt von einer bevorzugten Technologie auszugehen, bleibt der Fokus auf dem eigentlichen Ziel, das erreicht werden muss.
Lernen 2: Eingabevalidierung – Kennen Sie Ihre Daten
Selbst nach diesem Ansatz, Lösungen zu skizzieren und die gewünschte Lösung im Voraus zu definieren, tauchte ein weiteres wiederkehrendes Hindernis auf: die Eingabedaten. Einige Fehler, die ich erlebte, hatten nichts mit fehlerhaftem Code zu tun, sondern mit Annahmen über die Daten, die ich gemacht hatte, die in der Praxis nicht zutrafen. In einem Fall ging ich davon aus, dass die Daten eine bestimmte Mindest- und Höchstgrenze hatten, was sich als falsch herausstellte und zu einer falschen Lösung führte. Schließlich kann Code isoliert betrachtet korrekt sein, aber völlig versagen, wenn er mit Daten arbeitet, für die er nie entwickelt wurde.
Dies zeigte erneut, warum die Überprüfung der Eingabedaten so wichtig ist. Oft musste meine Lösung nicht komplett überarbeitet werden, kleinere Anpassungen wie die Einführung zusätzlicher Bedingungen oder Grenzüberprüfungen reichten aus, um eine korrekte und robuste Lösung zu erhalten. Darüber hinaus kann eine erste Datenuntersuchung Hinweise auf den Umfang der Daten geben und Hinweise darauf geben, welche Ansätze machbar sind. Bei großen Bereichen, extremen Werten oder hoher Kardinalität ist es sehr wahrscheinlich, dass Brute-Power-Methoden, verschachtelte Schleifen oder kombinatorische Ansätze schnell an ihre Grenzen stoßen.
Dies ist natürlich ebenso wichtig bei datenwissenschaftlichen Projekten, bei denen Annahmen über Daten (implizit oder explizit) zu ernsthaften Problemen führen können, wenn sie nicht überprüft werden. Die frühzeitige Untersuchung von Daten ist ein entscheidender Schritt, um zu verhindern, dass sich Probleme nach unten ausbreiten, wo es später viel schwieriger werden kann, sie zu beheben. Die wichtigste Erkenntnis besteht nicht darin, Annahmen über Daten überhaupt zu vermeiden, sondern sie vielmehr explizit zu machen, zu dokumentieren und frühzeitig im Prozess zu testen.
Lernen 3: Schnell iterieren – Fortschritt statt Perfektion
Die Rätsel in Aufkommen des Codes werden in der Regel in zwei Teile geteilt. Während die zweite häufig auf der ersten aufbaut, bringt sie eine neue Einschränkung, Herausforderung oder Wendung mit sich, beispielsweise eine Vergrößerung der Problemgröße. Die zunehmende Komplexität machte die ursprüngliche Lösung für den ersten Teil oft ungültig. Dies bedeutet jedoch nicht, dass die Lösung des ersten Teils nutzlos ist, da sie eine wertvolle Grundlage bietet.
Eine solche funktionierende Ausgangsbasis hilft zu klären, wie sich das Drawback verhält, wie es angegangen werden kann und was die Lösung bereits bewirkt. Von da an können Verbesserungen strukturierter angegangen werden, da man weiß, welche Annahmen nicht mehr gelten und welche Teile geändert werden müssen, um zu einer erfolgreichen Lösung zu gelangen. Die Verfeinerung einer konkreten Basislösung ist daher viel einfacher, als von Anfang an eine abstrakte „perfekte“ Lösung zu entwerfen.
In Aufkommen des Codesder zweite Teil erscheint erst, nachdem der erste gelöst wurde, wodurch frühe Versuche, eine Lösung zu finden, die für beide Teile funktioniert, sinnlos sind. Diese Struktur spiegelt eine in der Praxis häufig anzutreffende Einschränkung wider, da man in der Regel nicht alle Anforderungen im Voraus kennt. Der Versuch, alle möglicherweise erforderlichen Erweiterungen im Voraus vorherzusagen, ist nicht nur weitgehend spekulativ, sondern auch ineffizient.
In der Datenwissenschaft lassen sich ähnliche Prinzipien beobachten. Wenn sich Anforderungen ändern, Datenquellen sich weiterentwickeln und Stakeholder ihre Bedürfnisse und Anfragen verfeinern, müssen sich auch Projekte und Lösungen weiterentwickeln. Daher ist es weitaus effektiver, mit einfachen Lösungen zu beginnen und auf der Grundlage echten Feedbacks zu iterieren, als zu versuchen, von Anfang an ein vollständig allgemeines System zu entwickeln. Solch eine „perfekte“ Lösung ist am Anfang selten sichtbar, und die Iteration ist es, die es den Lösungen ermöglicht, zu etwas Nützlichem zu konvergieren.
Lernen 4: Design for Scale – Kennen Sie die Grenzen
Während bei der Iteration der Schwerpunkt darauf liegt, mit einfachen Lösungen zu beginnen, Aufkommen des Codes weist auch immer wieder darauf hin, wie wichtig es ist, die Größenordnung zu verstehen und wie sie sich auf den zu verwendenden Ansatz auswirkt. Bei vielen Rätseln erhöht der zweite Teil nicht nur die logische Komplexität, sondern erhöht auch die Problemgröße dramatisch. Daher kann eine Lösung mit exponentieller oder faktorieller Komplexität für den ersten Teil ausreichend sein, wird jedoch unpraktisch, wenn die Problemgröße im zweiten Teil zunimmt.
Selbst wenn man mit einer einfachen Basislinie beginnt, ist es wichtig, eine ungefähre Vorstellung davon zu haben, wie sich diese Lösung skalieren lässt. Verschachtelte Schleifen, Brute-Power-Aufzählung oder erschöpfende Suche nach Kombinationen signalisieren, dass die Lösung nicht mehr so effizient funktioniert, wenn das Drawback größer wird. Wenn Sie den (ungefähren) Bruchpunkt kennen, können Sie leichter abschätzen, ob oder wann ein Umschreiben erforderlich ist.
Dies widerspricht nicht dem Gedanken, eine vorzeitige Optimierung zu vermeiden. Vielmehr bedeutet es, dass man die Kompromisse verstehen sollte, die eine Lösung mit sich bringt, ohne gleich den effizientesten oder skalierbarsten Ansatz implementieren zu müssen. Skalierungsorientiertes Design bedeutet, sich der Skalierbarkeit und Komplexität bewusst zu sein und nicht von Anfang an blind optimieren zu müssen.
Hier ist auch eine Parallele zur Datenwissenschaft gegeben, da Lösungen bei Beispieldaten oder begrenzten Datensätzen intestine funktionieren können, bei Größen auf „Produktionsebene“ jedoch zum Scheitern neigen. Sich dieser Engpässe bewusst zu sein, wahrscheinliche Grenzen zu erkennen und various Ansätze im Auge zu behalten, macht diese Systeme widerstandsfähiger. Wenn Sie wissen, wo eine Lösung möglicherweise nicht mehr funktioniert, können später kostspielige Neugestaltungen und Neufassungen vermieden werden, selbst wenn diese nicht sofort implementiert werden.
Lernen 5: Seien Sie konsequent – Schwung schlägt Motivation
Eine der weniger offensichtlichen Erkenntnisse aus der Teilnahme am Creation of Code hatte weniger mit der Lösung von Problemen als vielmehr mit dem „Auftauchen“ zu tun. Jeden Tag ein Rätsel zu lösen, klingt theoretisch machbar, conflict aber in der Praxis eine Herausforderung, vor allem, wenn es mit Müdigkeit, begrenzter Zeit oder einem Rückgang der Motivation einherging, insbesondere nach einem ganzen Arbeitstag. Die Hoffnung, dass die Motivation auf magische Weise wieder auftaucht, conflict daher keine praktikable Strategie.
Wirkliche Fortschritte wurden durch die tägliche Arbeit an Problemen erzielt, nicht durch gelegentliche Inspirationsschübe. Durch die Wiederholung wurden Denkweisen gestärkt und Probleme entwirrt, was wiederum für Dynamik sorgte. Sobald dieser Schwung aufgebaut conflict, begannen sich die Fortschritte zu verschärfen und Beständigkeit conflict wichtiger als Intensität.
Auch die Kompetenzentwicklung in der Datenwissenschaft erfolgt selten durch einmalige Projekte oder isolierte Vertiefungen. Stattdessen ist es das Ergebnis wiederholter Übung, des sorgfältigen Lesens von Daten, des Entwerfens von Lösungen, des Iterierens von Modellen und des Debuggens von Annahmen, die im Laufe der Zeit konsequent durchgeführt werden. Sich auf Motivation zu verlassen ist nicht praktikabel, aber feste Routinen machen es nachhaltig. Aufkommen des Codes veranschaulichte diesen Unterschied: Während die Motivation schwankt, verstärkt sich die Konsistenz. Eine solche Tagesstruktur hat dazu beigetragen, das Lösen von Rätseln zur Gewohnheit und nicht zum Wunsch zu machen.

Schlussgedanken
Wenn ich zurückblicke, ist der wahre Wert, den ich aus der Teilnahme gezogen habe Aufkommen des Codes Es ging mir nicht darum, einzelne Rätsel zu lösen oder ein paar neue Programmiertricks zu lernen, sondern darum, meine Gewohnheiten sichtbar zu machen. Es hat gezeigt, wo ich dazu neige, überstürzt nach Lösungen zu suchen, wo ich dazu neige, es zu kompliziert zu machen, und wo es mir viel Zeit gespart hätte, langsamer zu werden und einen Schritt zurückzutreten. Die Rätsel als solche waren nur ein Mittel zum Zweck, die Erkenntnisse, die ich daraus gewonnen habe, waren der wahre Wert.
Aufkommen des Codes Für mich funktionierte es am besten, wenn ich es als bewusstes Coaching und nicht als Wettbewerb betrachtete. Es erwies sich als weitaus wertvoller, konsequent aufzutreten, sich auf Klarheit statt auf Klugheit zu konzentrieren und Lösungen zu verfeinern, anstatt von Anfang an nach perfekten Lösungen zu streben, als eine einzige Lösung zu finden.
Wenn Sie es noch nicht selbst ausprobiert haben, würde ich Ihnen empfehlen, es auszuprobieren, entweder während der Veranstaltung im nächsten Jahr oder durch das Durcharbeiten früherer Rätsel. Der Prozess bringt schnell Gewohnheiten zum Vorschein, die über die Rätsel selbst hinausgehen. Und wenn Sie Spaß daran haben, Herausforderungen anzugehen, wird es höchstwahrscheinlich eine wirklich unterhaltsame und lohnende Erfahrung sein.
