Для меня деятельность по разработке программного обеспечения представляет собой серию прогрессивно более тонких проектов для решения конкретной проблемы. Когда у вас есть общее представление о том, что вы создаете, ваш дизайн может быть чем-то очень высокого уровня, например, «будет веб-приложение, которое взаимодействует с базой данных SQL и несколькими веб-службами» или что-то в этом роде. Затем, когда вы углубляетесь в детали каждого элемента, вы получаете более детальный дизайн. В зависимости от сложности решения будет больше или меньше итераций в процессе проектирования. Заключительная итерация включает создание фактического кода, который реализует более высокие уровни дизайна.
Для меня разница между архитектурой и дизайном минимальна, и это просто разные итерации процесса, который я описал выше. Граница между ними размыта и различна для разных людей.
Существует умение решить, на какой уровень детализации дизайна перейти, для каких частей приложения и в какие моменты жизненного цикла проекта. Для проектов с высоким уровнем риска и высокой сложности вам может потребоваться очень детальный дизайн, прежде чем вы начнете писать строку кода. Для небольших проектов вы можете с легкостью выполнить предварительный дизайн, просто набросать немного кода, а затем посмотреть, что не работает, и изменить дизайн этих областей. Здесь не только один ответ. Обычно это где-то между этими двумя крайностями.
У меня есть пост в блоге, в котором говорится о некоторых принципах, которые я использую при приближении к архитектуре. Это может быть полезно для вас, думая в этом направлении. Часть статьи относится к .NET, но большая часть - нет.