Computer programming

From Early Retirement Extreme Wiki
Jump to: navigation, search

Computer programming is a craft with its own techniques, terminology, best practices, and opportunities for craftsmanship and self-expression. If you will be doing a lot of it, it is worth investing time and energy into starting with a solid foundation, and avoid taking shortcuts which lead to habits. See: Teach Yourself Programming in Ten Years.

The following is a suggested course of self-study. It is intended to be taken in order since each topic builds on the earlier ones. This is essentially the curriculum for the first year of a computer science bachelors degree, although this list of resources is oriented toward free texts and self-study rather than traditional textbooks and classes.

  1. Introduction to computer programming, data representation, and computational thinking. Programming in a high level, functional style. This is more about establishing patterns of thought and vocabulary, which are timeless and apply equally well to all programming languages, than it is learning a specific programming language (e.g. Java) or environment (e.g. Android).
    1. Suggested text: How to Design Programs, taught in Scheme
    2. Alternatives: Think Python: How to Think Like a Computer Scientist
  2. Object-oriented design and systems programming. Along the way you can learn a marketable OOP language such as C#, Java, or C++, or Objective C.
    1. One of: C# Programming Wikibook, Introduction to Design Patterns in C++ with Qt 4, or Introduction to Programming Using Java
    2. And: Design Patterns or Computer Science Design Patterns
  3. Discrete math.
    1. Suggested text: Mathematics for Computer Science
    2. Alternatives: Applied Discrete Structures, Discrete Structures
  4. Data structures.
    1. Suggested text: Open Data Structures
    2. Alternatives: Fundamental Data Structures, Data Structures Wikipedia book, Data Structures: Fundamental Tools

After this you will have a solid foundation, from which you should be able to teach yourself any future programming language, environment, or more advanced subject. At this point you are ready to learn whatever hot language and environment you want to work in; iOS apps, Java web apps, C++ games, or whatever the case may be.