Principles of Software Engineering
Software engineering is a constant battle against uncertainty – uncertainty about your specs, uncertainty about your implementation, uncertainty about your dependencies, and uncertainty about your inputs.
I'd add to this that software engineering is helping users to find success in the face of all this uncertainty. I think this his true whether you are writing a UI or a library meant for other programmers.