Rules for Good Program Design
If you are doing it twice, you are doing it wrong. Every piece of code should be designed only once. When setting to a new project, look for places to reuse your previous code. Allow old code to be modified to serve multiple purposes. As you work in any language, you should be building a large toolbox of subroutines that you can bring to bear on each new task.
Borrow code. When able, pick a programming language that is popular, so you can go download code that others have already created. Check around before you commit hours to writing code that someone else probably already wrote.
Make the computer do the work for you. Work to make any repetitive task into an automated one. Some tasks will actually take longer to accomplish when not done manually, but over time you will recoup those lost minutes when performing similar tasks.
Find short cuts. If you expect that you will type the same command over and over, make an alias for it that is one or two characters long. Use an editor that allow easy insertion of long variable and command names. Fewer keystrokes, even for fast typists, can save a lot of time.
Make code legible. Make variable names and procedure names long and clear. Usually variables should be nouns, procedures should be verbs, and procedures that return a value of importance should be nouns. This is a critical part of good internal documentation. The time saved in making short variable and procedure names will be lost many times over when trying to read the code later. Add comments that say why you are doing what you are doing, and make sure that your programs are clear enough about how you are doing it.
Find elegant solutions. Perhaps the hardest part of good programming is creating abstract data structures and programs that can handle any problem that is likely to be presented. Code that has exceptions for unusual requests are difficult to maintain and fail to scale well when those unusual requests become common tasks.
Test. Always test out changed code in many different situations. Consider how a change might affect other programs. Make all your tests automated, or you will not want to run them all the time.
There is no good writing, only good rewriting. Read over your code frequently to see how it can be improved. After a project has matured, a full rewrite will often sweep out all old bugs and accurately capture the evolved program requirements. Get other good programmers to read your code and offer suggestion. If you would be embarrassed to have your work critiqued, get busy rewriting it.