In my opinion an Engineer is a problem solver, at scale. Similar to a Contractor vs Civil Engineer. Sure a contractor can build you a good bridge for your backyard but you don't get them to design you the Golden Gate.
Similarly you don't build DynamoDB or BigTable with programmers, in my opinion you need Engineers.
Outside of analogy, the biggest difference I can think of is probably the ease at which youre able to be taught new things and the breath of knowledge that they already have. An engineer, at least in my experience/opinion has more breath of knowledge and a far easier time teaching themselves new things than a programmer. However, some programmers actually have more knowledge about a specific topic. For example I couldn't currently profile a running JVM (I'm sure I could learn) but to someone taught to program in Java and specifically took classes on Java, it is second nature. Again similar to how a civil engineer couldn't build you a closet. Or mechanical engineer couldn't fix your Honda Civic.
Anyways, I'm just being a bit defensive since I had to go through 1 year of general engineering (physics/chemistry/project management) 1 year of electrical engineering and 2 years of computer engineering.
For the record, I don't think you need to have gone to university to be an engineer. That was just my motivation for segregating its definition as much as I could.
Actually I beg to differ on this. Engineers are supposed to understand both theory and practice. Your engineering course at university teaches you how to think and not just how to complete a task. Being able to think about a problem and solve it using experience and scientific knowledge is what differentiates a construction site foreman from an engineer with equal years of experience.
Could all three not be judged on the same scale as building developers?
programmer === contractor developer === forman (or better term for somebody with view of the larger context of the current task) engineer === engineer