I think it depends on what part of the software development process you're looking at. Designing new algorithms and datastructures... probably art (in the way that developing mathematical proofs is artful). Choosing from a set of well-understood algorithms and datastructures... probably engineering. Coding up said choice into something that users and other programmers will use (in the case of libraries)... I'd put it in the craft category.
I have a feeling that, at some point in the future, all the "engineering" could actually be done by the compiler. You tell it "I want to store X, Y, and Z"; it selects the best data structure for you, and tailors the algorithms to be optimized for just the kind of data you'll be working with. The designers would still exist and be responsible for feeding the compiler new data structures to select from, but most "programmers" would simply become business analysts, feeding the domain knowledge required to the compiler and watching as it evolves a program that best handles those conditions. The "craft" aspect would reduce to defining Interface contracts for your libraries that the compiler would have to adhere to when munging its algorithms (though it could always just tack the "right stuff" transforms on top of its quirky works-by-coincidence internal versions.)
Or, things might go step a further with everything running on virtual machines that monitor the behavior of the program (and the structure of incoming data) to tailor things appropriately.
http://www-cs-faculty.stanford.edu/~knuth/taocp.html
(Note that he titled it "Art" and not "Science" or "mechanism".)
We're also beginning to see the formation organizations similar to Guilds in software.
& Soon we will have our own guild of Cathedral building Templars using esoteric knowledge :)
No sign of model-T on the horizon. (Remember that in software assembly line, what rolls down is not a 'copy' but another 'program'.)