Где и как научиться веб-дизайну, будучи программистом?
я нифига не дизайнер, такой же программист-фрилансер и такая же проблема была у меня лет пять назад
я для себя разделил «дизайн» сайта на три фазы: 
1 придумать что-то типа концепции или общей картины что будет и где, какие блоки, какие страницы 
2 детализовать концепцию до макетов страниц — часто приходит программисту в виде картинок
3 придумать как это будет верстаться и сделать, то есть допилить до состояния как на картинке в пункте 2

Про первое мало что могу посоветовать — это как «решить задачу» — есть какие-то алгоритмы, но все они сводятся к декомпозиции: сначала формулируем общую идею, например «магазин фуфла» или «блог о прекрасном». Потом потихоньку определяем из чего эта идея может состоять — магазин нуждается в списках товара, которые надо видеть, искать и сортировать, товары надо покупать. Потом каждую из состовляющих делим до элементов, которые понятны. Все это превращаем в некие блоки на странице(ах). Тусуем, что-то выкидываем, что-то добавляем. На выходе получается что-то, что называется скетчем или наброском

Второе — это чисто навык работы с изображениями и инструментами по работе с ними. Плюс фантазия и талант «сделать красиво». У меня таланта нет, фантазия тоже в этом плане хромает, так что я либо делаю какими-нить прямоугольниками, либо подсматриваю детали на других сайтах. С изображениями работать могу, но не люблю это дело, так что ищу сеты изображений, если надо, а лучше совсем без них — минимализм наше все

Третье в целом называется версткой. По хорошему это опять же должен сделать дизайнер, хотя бы для понимания как его дизайн будет выглядеть, но у них руки и голова заточены не в эту сторону, и как правило приходиться переделывать. С другой стороны верстка делается на декларативных языках и обычному программеру надо тоже немного свернуть сознание, что бы думать готовыми блоками и их взаимодействием. Навык работы в функциональных языках или регэкспах тут немного помогает, ага.
Причем есть большая разница между создать макет с нуля и переделать или исправить. Я не знаю почему, но это сильно больше чем разница между начать писать код с нуля vs правка кода. Может быть дело в том что в верстке вариантов намного больше, может быть у меня мышление все еще повернуто бедром.

Как научиться? как всегда — делать, пробовать и разбирать что и почему не так. Я для начала делал всякую фигню. Потом смотрел и переделывал. И опять и снова. У моей домашней странички было что-то около 20 вариантов. Причем некоторые я переверстывал. Последний держиться уже пару лет, но уже хочется что-то изменить, но пока не сформулировалась концепция что и во что менять.

Книги и курсы я не могу посоветовать, потому что с ними у меня не складывается. Редко попадается книга, которая стоит времени, потраченного на нее. А курсы… в общем также. Я вообще стараюсь извлекать знания из того что попадается — увидел сайт — глянь код, но подготовленные к употреблению «блюда» вызывают разочарование.
У меня сейчас похожая проблема. Мне тоже не очень нужны инструкции «как делать», а больше нужны знания «что делать».

Поскольку что и как почти не разделимо, я поступил следующем образом: 

взял с учебника по html5 css стиль,
внутри оказалось много ссылок, одна из которых на книжку по типографике,
еще очень интересными мне показались ссылки из блога бобука по соответствующим тегам,
поскольку этого не достаточно, я опять в поиске. :)

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