This is my mantra. Why? Because no matter how functional, feature-rich, bug-free and visually compelling your software may be, at the end of the day, there is someone in the other end that is going to use it. And users want to be productive. Basically, they don't care about anything else than getting the job done. It's that simple. Unless the user figures out how to get the job done, your software is useless. Of course, creating user-friendly software involves a lot of factors, including those mentioned above. But, along the way of development, I always keep an eye on the the user-interface. "How can I make this feature easy to understand and use?"
I first started programming when a got a Texas Instruments TI-58 calculator for my birthday. I think I was about 12 years old. However primitive this device was, it got me started with the basic idea of programming: to design a workflow for how to solve a task.
The next step was how to present the solution to someone who is going to do the job. A giant leap forward here was the introduction of graphical user interfaces such as Microsoft Windows. I started exploring these and event based programming during my studies, and quickly got hooked. All though most of my fellow students preferred the traditional sequential approach, it was obvious to me that this was going to be the future of software development. It turned out that it was time well spent...
Managing big projects
Over the years, I have been involved in and also managed quite a few large software projects. And the most important lesson I have learned is: Always refactor and modularise! Avoid copy and paste. Sometimes it can be bit of a pain, "I just need a quick fix"... But copying and pasting code is the by far the most frequent cause of bugs. And, on top of that, it also duplicates the bugs, making it even harder to find all of them.
Another important milestone in the history of programming is object-orientation. C++ is a huge step forward compared to C in terms of structuring large programming projects and developing bug-free and maintainable software. The ability to encapsulate pieces of functionality in a semantically stringent way enforces a different mindset when programming. Instead of thinking in sequences and logic you think in components and how they interact.
Forget the garbage
The second most frequent cause of bugs in software is memory handling. In C and C++ you, the programmer, is responsible for telling how much you need and to clean up after yourself. In every single corner of your program. With modern programming languages like C# and Java, this job is left to the programming framework. This is a huge advantage, it eliminates memory leaks and invalid pointers which over the years has been the cause of millions of system crashes.
In control of the source
As software projects grow - and they always do - it becomes important to track the development of the source code: Who did what, and when? Also, you need a way of preventing developers from getting in the way of each other. Several developers working on the same piece of code at the same time just creates a big mess. If one developer is working on it, the others need to know that it's occupied and must wait for their turn.
You need a source control system, which is of course also a software;-) There are many such systems available, but the most important thing is that you actually choose one and actually use it!