De mon côté : souplesse et robustesse.
Déjà, je me prends la tête le plus possible pour avoir des nommages cohérents, et compréhensible par tous.
Pas de nom contextualisé, ou rarement, et ceux-ci sont toujours documenté.
Le moins de commentaire possible, aussi, partant du principe qu'un code doit se documenter lui-même. Bien entendu, pour chaque portion sortant de l'ordinaire (utilisation d'un algo en particulier, bizarrerie de code...) un commentaire est rajouté pour expliquer la raison (je me suis déjà piégé moi-même de ce côté-là, j'essaie d'éviter).
De ce côté-là, j'adore la phrase "développez comme si la personne qui reprendra votre code est un psychopathe qui connaît votre adresse".
Ensuite, niveau architecture : une classe doit avoir un nombre limité de responsabilité. Si elle commence à faire le café... il faut revoir le découpage, et limiter le couplage. Idem pour les méthodes.
Bien sûr, quand le tout est possible.
Dès que j'ai deux blocs de code ou deux méthodes qui font exactement la même chose dans un contexte similaire, je tente de factoriser et d'externaliser. J'évite au maximum les duplications de code car je suis feignant (je n'ai pas envie de devoir passer sur chacune des classes pour la correction ou l'évolution) et que, puisque le code est centralisé, cela me permet de facilement corriger ou faire évoluer.
Avec un couplage faible et une architecture hiérarchisée, je peux ensuite répondre plus facilement et plus rapidement aux changements de dernière minute de l'application, ou aux urgences.
Le tout, en faisant en sorte de ne prendre en compte que les cas minimaux de succès, pour que chaque autre situation soit géré et passe automatiquement en erreur, en faisant le moins planter, et si ça plante, remonter l'erreur obligatoirement avec les informations de contact du client en plus de l'erreur (histoire de pouvoir le contacter au cas où il aurait 50 crash dans la journée, pour se renseigner, et faire un geste commercial ensuite).
En bref : le plus possible la factorisation, éviter le couplage, une classe = certaines responsabilités, une méthode = UNE responsabilité, code self-documented, gestion de code minimale.
Par contre, il me manque tout un pan sur les tests unitaires, ce qui rend les refactoring moins sûr.