Well, I consider myself a software engineer. Or at least I've written a lot of software. Yet I began as an electrical engineer, with two university degrees and two FCC licenses on the wall.
I also like the pure inventiveness of software. In the engineering disciplines that produce solid objects, you have a somewhat limited design vocabulary. Mechanical assemblies, electrical circuits, and chemical processes all have to be composed from a relatively small number of simple elements. There are only a few ways, for example, to convey mechanical force around a corner or across a distance. Software exists in a more abstract domain and benefits from a broader and more flexible vocabulary.
The classical engineering discplines (e.g., mechanical, electrical, chemical, nuclear, civil) typically require a "core" engineering curriculum that's very rigorous and emphasizes not only the physical sciences but also the ineffable practice of "being an engineer." There's much more to being an engineer than simply being a technologist. Engineering is the intersection of technology with the human and business worlds. It is a much higher calling to be an engineer than simply to be a technician.
But if you go to school for "software engineering" you learn practically none of that, and most software engineers don't realize this. The gulf between "real" engineering and software engineering is not just elitism or resentment. The software engineer simply hasn't been subjected to as rigorous an academic program as the classical engineers, and consequently is not really able to bring viable engineering principles to his work. I maintain that the most successful software engineers are those who began their careers as another kind of engineer.
Here's how I define the taxonomy.
Computer science. The philosophical and mathematical underpinnings of computation. There is actually quite a large body of mathematics that applies to software. Programs are elaborate mathematical structures that can be studied as abstract mathematical constructs. Functional algebra, for example, leads to a heightened understanding of the concepts of iteration, invariance, and composition. Program code that respects functional algebra knowledge, even if written as a declarative program, tends to work better.
Software engineering. The application of engineering principles to the commercial production and operation of computer programs. This emphasizes constraint management, requirements management, traceability, estimability, quality assurance, and related safety and business concerns. The goal of software engineering is program code that succeeds as a sustainable commercial product. ("Commerce" here includes open-source and non-profit use. The emphasis is on accountability to the end user and sustainability in creation.)
Computer programming. The nuts and bolts of producing software. A computer programmer is to a software engineer what a machinist is to a mechanical engineer. It's not a matter of hierarchy so much as an emphasis of roles. A good engineer knows to listen to his machinists on matters of production efficiency and ease. Similarly a good software engineer relies on talented programmers to assist him in creating designs that can be effectively implemented and tested. At some point, in order to be useful, a software design must be implemented in one or more programming languages and deployed on the target hardware.
Software development. A catch-all term for elements of all of the above: theoretical foundation, good design practice, and competent implementation and management.
Web development. A cesspool of chaos hobbled by a high proportion of under-qualified practitioners and undisciplined technological carcinoma. But that's just my opinion.