От себя скажу, что мне помогают:



- проектирование и аналитика



Я начинаю работу со сбора и анализа требований, потом всегда прикидываю решение, прежде чем писать код. Обычно использую бумагу чтобы что-то зафиксировать.



Это помогает в реализации сложных фич, с большим количеством неизвестных. Если надо устранить баг, то как правило этого не требуется.



- выделение интерфейсов и абстракций



Вроде и не хардскил в привычном понимании, но я экономлю себе кучу времени на рефакторинге, тем что сразу уменьшаю количество открытых методов.



Сужение (уменьшение) количества методов публичного интерфейса - это одна из вещей которая доставляет страшную боль на рефакторинге



- теория программирования



Это очень обширная вещь, сюда входят принципы (solid, grasp и т.д.), шаблоны, правила, "запахи", чистота кода и т.д.



Общая идея опять же в том, чтобы изначально уменьшить объем работы. У Макконела есть информация о том как стоимость устранения дефекта растёт при позднем его выявлении.



- парадигмы (ООП)



Помогает при декомпозиции задачи.



- язык программирования



Как правило сильно глубокого знания ЯП мне не требуется, часто даже прошу ограничить специфичные конструкции языка другими разрабами, они могутт сильно усложнить сопровождение кода.



Если нужно устранить что-то очень сложное, то проще найти специалиста который сделает специфчный анализ, чем сильно копать ЯП.



- структуры данных, алгоритмы



Тут сложно оценить, но заметил, что люди которые хорошо пишут код, как правило неплохо разбираются в алгоритмах.