<p>Looks like everyone has their own definitions, but I’ll add mine.</p>
<p>Computer scientist: a researcher (PhD or maybe an MS) who expands the boundaries of knowledge in the field of computer science. I would not call somebody who has a bachelors in CS a computer scientist, just like I would not call somebody with a BS in chemistry a chemist, a BS in math a mathematician, a BS in physics a physicist, and so on. I would reserve this title only for CS professors, post-docs, or researchers in industry.</p>
<p>Computer engineer: a graduate of an accredited engineering program who is designs computer hardware or embedded systems. I suppose this name could also be applied to researchers in computer engineering, but in academia I would use “Professor of Computer Engineering.”</p>
<p>Computer programmer: anyone who writes code for a living. I wouldn’t assume any particular level of education is required for this title; anyone from a high school graduate to a doctorate could be called a computer programmer.</p>
<p>Software engineer: in my opinion, this title carries more “prestige” than that of a computer programmer. However, I believe anyone can call themselves a software engineer without formal accreditation or education. I would expect somebody with this title to have a bachelors degree in computer-related field, but that’s certainly not always the case.</p>
<hr>
<p>In terms of roles:</p>
<p>Computer scientist: develop new algorithms and analyze their properties (designing software and writing software are not primary tasks)</p>
<p>Computer programmer: implement a software design (designing software and developing new algorithms are not primary tasks)</p>
<p>Software engineer: design software and sometimes implement (code) it; understands algorithms and how to apply them effectively to different situations (developing new algorithms is not a primary task)</p>
<p>For smaller companies these roles will blur, but I would say this a fair summary of the <em>primary</em> purpose for each person.</p>