If you try to google comparisons between a “programmer” and a “software engineer”, you will find many attempts on what could be the difference. At NWSE we typically refer to the people who write code as “the developers” or “the engineers” (oftentimes overlooking the important contributions of our QA engineers). A lot of resources out there try to draw the difference between a programmer and an engineer by looking at the formal education of people, stating that engineers generally have a formal university education and deal with complex mathematics and overall know the complete interaction between the systems they are working with.
Often, people with engineering degrees don’t necessarily understand the full stack from the network layer to the frontend application that we are operating in; many previous career choices and other factors play a large role. On the other hand, more and more programmers / developers / software engineers do not have this formalized background but rather come from hands-on coding schools, yet they work with these complex interactions between systems the same way as their colleagues. Looking at these real-life examples, I think this definition cannot hold up.
To me, the distinction between programming and software engineering lies in the amount of time spent preparing before actually writing a single line of code. In our context this is important, because we expect the code that we write to last a long time and behave deterministically for some time. I would guess that the code that we write is there to stay for at least 5 years (if not longer if we look at the Perl exit that was completed only last year). For code to stay in production for 5+ years, we need to understand the context that the code runs in, the systems that it interacts with and take care of edge cases that in other contexts might be considered as too edgy to occur. All this planning and thinking beforehand is important, because we all hate production bugs and we also know that patching a piece of software over and over does not make it better. So, software engineering to me is understanding the context that a code runs in and preparing for the code to be in production for a long time before actually starting to write the code.
I would say that the activity to write code that is only meant to be executed once (e.g. for a data importing job or transformation job) could be considered programming. But maybe this distinction is not sufficient as well. What do you think? Are you a programmer? A developer? A software engineer? Where was the point in your career where you changed this description of yourself when someone asked you what you do?