Сильно зависит от языка. Если пишешь на С — будь добр знать стратегии управления памятью, врубаться в арифметику указателей, помнить про выравнивание данных и подобные вещи.
Если Java/C# — то паттерны проектирования, тонны библиотек для этих языков и ещё кучу всего.
Если С++ то всё вышеперечисленное
Если функциональщина — то лямбда счисление, замыкания, что там ещё есть…
В идеале — всё вышеперечисленное и умение выбирать инструмент соответствующий задаче.
Как-то так.