… a Science?
It is most definitely not a science.
Science requires the rigorous confines of the scientific method.
As an atheist who often rants against pseudoscientific and mystical thinking, I can say categorically that Software Development cannot be considered a science as it does not in any way base itself in any way on (dis)provable hypotheses and evidence.
A lot of people consider it a science because the discipline exists purely because of scientific advancements.
[And greatly contributes to further scientific advancement.]
But this is a ludicrous as calling an Olympic swimmer a scientist because he is proving the hypotheses of fluid dynamics.
So, no, not a science.
The language of software development is very engineering related.
We talk about building.
We talk about construction.
We talk about infrastructure.
We talk about design.
We talk about architecture.
To the layman this sounds similar to the language used to build bridges, boats and planes.
But the similarity is totally superficial.
Software Development as a discipline is extremely new, compared to masonry, and so appropriated existing language as metaphors for similarly scoped, but entirely different, tasks.
It may be that building software in the 70s took a long time, but now it is instantaneous.
The software infrastructure of a distributed server farm may be impressive, but not to the scale and magnificence of the catacombs.
Using the tired old metaphors of engineering in today’s world just does not work as well.
So, no, not engineering.
… an Art?
There is without a doubt high creativity at work in good Software Development.
Although it is in a manner that those outside of the discipline would rarely comprehend or appreciate.
Seeing my first MVC application, in the wild rather than in the dry leaves of some academic tome, was, for me, a work of beauty equivalent to a Caravaggio.
Stupendous and awe-inspiring in its depth of vision.
But, even so, software development can never be as nebulous or personally subjective as art.
True, there are many debates in software development, loose vs. strict typing, procedural vs. functional vs. object-oriented programming, etc.
But these are just minor disagreements compared to the pointillists vs. synthetist disagreements of post-impressionism. [See van Gogh vs. Gaugin]
Even the most partisan of software developers would agree that an opposing concept has some merit. [Excepting Richard Stallman, of course. :P]
Something no artistic difference would ever permit.
And finally, and most damningly, with art you need not be an artist, or even remotely artistic, to truly appreciate the beauty of the art.
So, no, not art.
So what the hell is it then?
This is a tough question.
It does not naturally fit any of the above descriptions neatly.
It is like science in its approach, but without needing to prove a hypothesis.
It is like engineering in implementation, but without actually building something physical.
And it is like art in its intricate beauty, but it cannot be appreciate fully by the layman.
Software Development is a craft
A software developer has a wealth of experience and skill to bring to bear on the writing of software.
And the skill that software developers have grows over time with experience.
It is not an unskilled profession.
It is a craft and will be for quite some time to come.