Engineer vs Technician
I've been doing campus interviews for tech companies for a long time now. Long enough that it's been 10+ years since I told a candidate that I got my BS in 1988 and the response was "I was born in 1988." In that time I've done 100's of interviews at dozens of schools. And one of the things I quickly learned is that while there are lots of schools and cultures and styles, not everyone who learns to code and looks for a job as a programmer is a software engineer. Out of those 100s of interviews the vast majority of candidates could code, at least to the level expected for a 45 minute on-campus interview. But most of them weren't what I would call software engineers. And some of the people who's coding wasn't up to that level were. So what's the difference between a programmer and software engineer?
I think it comes down to attitude and mindset. Programmers understand the basics of a language. They understand the syntax and know the best practices, and they regularly apply them. Give them a clear set of requirements and you'll get back a function/library/executable that meets all the requirements. And that's it. And they're happy with the results and doing things that way. They don't know why the best practices are best practices and don't care. They don't know what happens if something in the environment goes wrong. That's the other person's problem. They don't know the customer/end-user and they don't want to. And there's nothing wrong with that. In many cases that's what's needed. As IDEs and frameworks and infrastructure becomes more of a commodity it becomes easier for a technician to put the pieces together the right way and get things done.
A software engineer, on the other hand, asks what if and why. Why does that work that way? Why do you need it to do that? What happens if that packet doesn't arrive? What if the other person isn't following the rules? What if the requirements are conflicting? And my favorite question, "What is it you're really trying to do here?". Software engineers don't just make it work, they figure why it works, what might break it, and what to do in case it does. If you think those questions are important you're a software engineer. Even if you haven't spent the last 4 years learning the intricacies of C++, you're an engineer. And it's the engineers who build those commodity IDEs and frameworks and infrastructure that lets the technician be so productive.