Software engineering is (and to some extent, all engineering disciplines) are about 4 things:
o Defining value
o Seeking simplicity
o Managing expectations
o Always being done
Of these, the last one is the most fundamental to programming and software engineering. You must learn to proceed from one “completed state” to another completed state as you build software that contains, step by step, progressively more and then yet more, of the total functionality that the program (or system of programs) is ultimately intended to have.
Your first step in building a system may well do some tiny fraction—essentially zero percent—of all that the system design specifies— However it must be a completed step: it compiles and runs and it runs correctly, in that it does something (however small) that you intended for it to do.
Each task be such a completed step before you proceed to do anything else that may be required. DO NOT ever, get partway through something and then decide that it is more important to work on something else, and come back to what you were doing later. In software engineering, that way lies madness and death.
You must always proceed in such a way that you are “done” with some microcosm of the complete universe that you are engaged in creating. You must always be done with some part and building upon that solid foundation to create the next piece.