I've heard the distinction as "software engineering is a creative profession, requiring professionals to exercise a large degree of judgment in building working systems from ambiguous requirements.  Programmers take an existing spec and then translate that into code."<p>I'm not sure how useful this distinction is, as every job I've held had highly ambiguous requirements and a lot of trade-offs involved in building a working system from them.  It kinda makes me wonder though - a colleague who'd been a PM at both Google and Microsoft said the difference was "Microsoft expects PMs to produce a spec that's thrown over the wall to engineers, who throw it back if there's any ambiguity.  Google expects their engineers to have opinions about the product and to resolve most of the details themselves, only consulting the PM if there's something big where they need additional data."  I wonder if Microsoft hires programmers and Google hires software engineers?