Ich kenne leider auch einige Entwickler, die wirklich nur gut bezahlte Programmierer sind und wie mit Scheuklappen ihre Businesslogik in Code hacken wollen und bereits beim Build-Tool dankend ablehnen.
Um aber selbst nicht nur rumzunölen, gehe ich noch mal auf die Ursprungsfrage ein. Theoretische Grundlagen wie Design Patterns und Domain Driven Design kann und sollte man sich beibiegen. Ein daraufhin folgendes Projekt wird vermutlich nicht wie durch Wunderhand guter Code werden, aber im besten Fall hat man hier und da einen flashback ins Gelesene. Es kann natürlich auch passieren, dass man es dann übertreibt und überakademisiert komplizierten Code schreibt...
Ich würde einem Einsteiger wohl raten, sich auf etablierte Tools einzulassen. Statische Code-Analyse weist auf "code smell" und echte Fehler wie Null-Pointer-Dereferenzierung hin. Das führt nicht zu besserer Architektur, aber man kann sich dann mehr auf andere Sachen konzentrieren. Eine wichtige Weisheit, umso mehr, wenn man im Team arbeitet, ist meines Erachtens - Code wird öfter gelesen, als er geschrieben wird. Es ist nicht ausreichend, wenn das Ergebnis der Implementierung stimmt, sondern die Verständlichkeit des Codes ist (zumindest im professionellen Umfeld) bares Geld wert.
Wenn ich dann noch nett bin, hinterlasse ich für meinen Code einen Unit-Test, damit mein Kollege (der nur modifizieren/refactorn will und vielleicht nicht den gleichen Wissens-Hintergrund hat, wie ich) bessere Chancen hat, keine Regression zu verursachen. Es hilft dir natürlich auch selbst, wenn du nach vielen Monaten oder gar Jahren mal wieder an alten Code von dir ran musst.
Um ein bisschen Struktur reinzubekommen, empfiehlt es sich meiner Meinung nach, branchenübliche Frameworks zu nutzen und sich auch auf diese einzulassen. Ich habe schon so manchen Entwickler kennengelernt, der meinte, selbst ist der Mann. Ja natürlich kann ich alles selbst implementieren, aber warum soll ich denn die ganzen Fallstricke, an denen sich andere schon die Pfoten gebrochen haben, noch mal mitnehmen? Da stecken teils Mannjahrzehnte von erfahreneren Entwicklern drin, bei großen Frameworks. Sich dem zu verwehren, ist einfach nur Hybris.
Dann gibt es da noch ein paar Grundprinzipien, die man verinnerlichen sollte, wie DRY, YAGNI, KISS, SOLID und wie sie alle heißen. Auch muss ich mich je nach konkreter Aufgabenstellung entscheiden, ob ich alles in einen fetten Monolithen gieße oder kleine Anwendungen baue, die dann vielleicht übersichtlicher sind. Es ist überall ein Für und Wider, die Entscheidung trifft man je Einzelfall auf Basis seiner Erfahrung. Erfahrung kommt u.a. von früheren schlechten Entscheidungen. Das müssen nicht immer eigene gewesen sein. Man sollte auch offen sein, von Fehlern anderer zu lernen. Für so was ist es z.B. ganz nett, ab und an Konferenzen und Meetups zu besuchen.
Zu guter Letzt noch was, was
@kuddlmuddl ja schon andeutete - auch die Art und Weise, wie man ein größeres Projekt angeht, konzeptioniert und später durchführt, ist eine kleine Wissenschaft für sich. Ich habe relativ früh gelernt, dass es illusorisch ist zu denken, man könnte ein Projekt von vorn bis hinten durchplanen. Manchmal muss man erst in eine Richtung loslaufen und Problemchen/Anforderungen feststellen, die man anfangs noch gar nicht auf dem Schirm hatte. Umso wichtiger ist es, dass der Code entsprechend gut wartbar ist, damit man im späteren Projektverlauf noch die Chance hat umzusteuern, ohne einen kompletten rewrite machen zu müssen. Es gibt allerdings noch genug Leute, die über Jahre Papier beflecken wollen und meinen, hinterher programmiert man das runter und hat das perfekte Ergebnis.