Constraints are found in any type of art. For instance with painters, your canvas is a set size and your brushes are the ones (random things included) that you have nearby. You have a limited set of tools and constraints, but still the world is open to you.
The same is true with programming. You have constraints, but as Brooks say, "air from air". You can imagine, create, and manipulate your programs to do whatever you want them to do.
One thing to note on another comment I noticed was a comparison of craft and true art based on skill levels. As with artists, programmers come with various degrees of skill. Some art is primitive and unskilled, but practice makes perfect and a programmer that works on his skillset can improve as well.
One argument is that programming is structured and follows after others. The key is that art is the same. Look up figure drawing for example and you will find the techniques most artists use for basic figure drawing to create what later become works of art. Art also immitates nature and other artists in many cases. Sometimes immitation is the highest form of flattery. With programming, imitation is a key to success on various levels. For instance, I personally referenced and learned many things about coding from the Richard Stevens books and his examples. Many others have gained knowledge on "best practices" in coding as a basis to help them create. Much like the eliptical shapes, ovals, circles, and other shapes that make the lightly drawn poses in the start of a figure drawing, programming has those key APIs, bits of code, libraries, classes and "shapes" if you will that help you create the final "picture" that makes up what we call our art.
The art of a programmer.