Přidám ještě jednu věc, o které se divím, že tu explicitně nepadla: Psát unit testy a nemilosrdně refaktorovat.
Unit testy tě donutí kód psát znovupoužitelně a rozdělit ho na smysluplné části (protože je tím pádem nutné ho použít alespoň ze dvou míst, z produkčního kódu a z testovacího kódu). To je hrozně důležitý.
Unit testy ti umožní refaktorovat kód, který se ti nelíbí - a to se stává pořád - vrátíš se ke staršímu kódu, nerozumíš mu, protože už to nemáš tolik v hlavě, nebo se ti něco nelíbí něco čeho sis nevšiml, tak to upravíš tak, aby to dávalo lepší smysl. Tohle neustálé vylepšování je podle mě povinnost, bez které se z projektu časem stane břečka. Super kód se často nepíše na první dobrou, ale iteruje se k němu. Nebo něco, co byl super kód dřív, přestane dávat smysl a musí se to trochu předělat kvůli novým byznys požadavkům. Unit testy ti dají důvěru a svobodu nutnou k tomu, aby jsi mohl kód upravovat a nebál se, že něco rozbiješ. To je hrozně důležitý.