In a short summary, what are the most important design principles when it comes to programming an idea/system? When designing a system which is meant to be indeterminately upgraded and extended, what general principles should one bear in mind to avoid compromising flexibility down the line?