I would suggest two things first apart from the ones posted above. One, one must be very familier with how the data 'flows' in the program. A proper understanding of Flow charts, data diagrams, algorithms etc help in achieving this end. Second, learning the language of programming well to achieve the end goal. Point number one is very important in designing what is to be achieved i.e the 'goal' or 'output' and Point number two is important as a means to achieve the said 'goal' or 'output'.
Learn well to meet any challange a programmer has to face and one should not restrict oneself to steriotyped problems to gain wider perspective.