Of course, that's in larger orgs. Smaller places will typically have an engineer doing everything.
[1] http://www.joelonsoftware.com/articles/fog0000000018.html
If the problem is inherently complex enough, particularly if it is multidisciplined, than it is the correct approach.
http://sdg.csail.mit.edu/6.894/dnjPapers/hall-correctness-by...
Software architects do the macro design, but they need to do that from an understanding of how it will be implemented, and the various lower level tradeoffs like consideration of the memory constraints of the target platforms.
In order to implement that design the non-architect programmers need to micro-design their bits that they build, too. And those smaller bits also often need abstractions/mini-architectures that aren't part of the macro architecture.
In fact, we even have software called an assembler :)
Of course, it all depends on what level you're doing design at, and what level your language(s) work at. But the point is that those 3 roles aren't necessarily are fulfilled by humans when working with software.
That does not mean that there can't or shouldn't be a distinction between the engineer and the technician on sufficiently complex projects. That is, they don't need to be filled by people who could perform either role, as the original comment I was replying to implied. That point was either miscommunicated in my original post or rubbed some people the wrong way.
That's exactly what a coder does.
There are some fields (draftsman, typist, others?) of people who created fine documents based on vague documents from engineers, architects etc. So in principle you could have a similar distinction between software archtects and coders. But it is exactly those document-gruntwork fields which have been transformed most by computers.