I'll second the recommendation to take actual programming classes. I think it forces you to do the work and to do it properly. It keeps you from only doing the easy stuff. There is no substitute...