Может быть я не прав, но вот мое видение вопроса.
Основное отличие программиста от кодера - это уровень восприятия задачи, уровень абстракции над конкретной реализацией.
Не знаю как сейчас, а раньше было такое понятие, как постановщик задач. Собственно этот человек не должен был даже знать какие-то языки программирования. Он должен был хорошо разбираться в конкретной предметной области. И иметь способности быстро охватывать новые.
Так вот кодеру совершенно не обязательно знать в какой предметной области он работает, перед ним ставится вполне конкретная формализованая задача типа:
"Напиши вот такую-то функцию, на входе у нее такие-то данные, таких-то типов, делать она должна с ними вот что.
На выходе должны быть такие-то данные, таких-то типов."
Все! Для выполнения такой задачи совершенно не нужно знать зачем эта функция нужна и куда она потом будет прикручена.
Программист же, в этом смысле, больше похож на постановщика задачь, т.е. он должен очень хорошо знать предметную область и частенько принимать решения по поводу общей архитектуры проекта (или куска проекта).
Кроме того хороший программист должен быть еще и хорошим кодером