The Hidden Curriculum of Programming

Many people have the preconceived notion that they need a university education to succeed. While many programmers in the past have gone on to become professionals and leaders in their field without one, more job postings keep popping up asking for programmers to have a degree. There is also a bigger push to interest young students to consider a degree in computer science. It is therefore of great importance for students of computer science to realize that the education given is incomplete.

For those who think this is an attempt to deface higher education, it is not. I have learned many important lessons in mine, and am very glad I pursued it. This field’s scope is enormous and it would be impossible to teach everything in the span of 4–6 years. That being said, there are a few things that really need to be communicated better to students. This is what I call “the hidden curriculum”.

Your Portfolio Starts Now

During my formal education, only one professor suggested we should keep our assignments for the future. Even then it was not stated the exact reason why. Perhaps they assume it is obvious or common knowledge; they shouldn’t. I have met many fellow students who did not have a portfolio of their work available upon graduation. Some weren’t able to make one because over time they had deleted or lost their projects.

From the moment you start, every piece of code you create, every diagram you design, and any technical documentation you write should be saved and backed up. If you’re considering data science, this includes Excel workbooks so you can showcase any VBA script, pivot, and other experience you have written. It also includes R and MATLAB projects. You might not use all of it (you might not even use any of it), but at least if you have it available, you know it’s there if you do need it.

Priorities Change

I’ve heard many people say that what they learned just wasn’t useful in real life. Usually they are referring to the algorithms and operating systems courses. This is both true and false; the problem is priorities change.

Scouring through job postings, I find that most junior jobs do not list the above in their listings. The ones that do are for highly analytical companies. However, I do see the above in many Mid-Sr postings. In other words, you will need these, but not for a few years. Some developers who don’t go into back-end or full-stack may indeed never need these. Save your notes. If you’re into digital flash cards like Anki, save these such that you’ll be able to find them again when you truly need them — or until you’re comfortable with the material you need to know now.

The Curriculum Gap

Previously I mentioned that some of what you learn isn’t needed right away. It’s also common for surveys to show that employers feel schools don’t prepare students enough. This implies that in between programming basics and the harder courses, there may be gaps that employers would like filled. While some schools might cover a few of these with electives (which are chosen by the student), there are many who don’t teach them at all.

I also previously stated that there is no way schools can teach everything. If they taught the content at this level, then students would complain they didn’t learn the harder content when they eventually did reach that point in their career. Since a lot of this gap content can actually be self taught with relative ease, it makes sense if schools may not consider them a priority. However schools should do a better job of communicating what their gaps are so that students are aware of what they need to make up during their own time. To that end I’d suggest a required course or workshops with the purpose of only introducing content that students will need to pursue themselves.

So What Exactly Do I Need To Learn?

Here is a list that I attempted to order as best as I could on what a programmer needs to learn. Cross off what your school already covers. If you already know your specialty ( front end, back end, data, full stack, machine learning, imbedded, assembly, etc…), cross off anything you know you won’t use.

Hard skills

  1. Programming basics in a language
  2. OOP concepts
  3. Data structures
  4. User interface/experience design and programming
  5. Databases: Querying, designing/normalization, and performance tuning
  6. Asynchronous programming
  7. Unit testing and TDD
  8. Design patterns
  9. Refactoring and Clean Code
  10. Overview of other languages, other programming styles,etc..
  11. Stack-specific overview of secondary languages (languages that go well with your primary language)
  12. Language-specific patterns and anti-patterns
  13. SDLC, integration testing, component testing, system testing, technical documentation
  14. Version control systems, IDEs, and other tools
  15. MVC, web services, APIs, active directory
  16. Big O notation
  17. Sorting algorithms
  18. Searching algorithms
  19. Operating systems
  20. Software architecture design

Soft Skills

  • Keeping up with news on latest technology
  • Team play and pair programming
  • The importance of reading widely recognized books
  • The professionalism of being a programmer. Other professionals practice. You should too.
  • Marketing yourself as a programmer.
  • Office communications
  • Learning your domain/industry
  • Time management
  • Project estimation
  • Team management

Making The Most Of Your College Education

The most important part of really embracing what a college experience offers to its computer science is that it is not your primary form of education. Use the classes to get a further understanding of what you’ve learned yourself.

However, do not underestimate the knowledge your professors have to share. Ask questions. Don’t just ask about the topic at hand. Find out what their career paths were like, what books they recommend, if they’re still reading and learning now. Ask about their creative process when designing a program. Find out if they know of any conventions for students that they would recommend. Don’t think of your professors as teachers; teach yourself and think of them as your mentors.

Furthermore, your other focus should be about your interaction with your classmates and members of the computer science clubs. See if there is a project you can work on together. A real app available on an App Store, a program for a research project, or a live website will bring about more recognition than most class projects. This is a golden opportunity to learn from more senior students (from clubs) and other enthusiasts in your classes who might already have some experience. It doesn’t even matter if the product is successful, though it is preferable for it to be functional and publicly available if possible.

If some of your classmates seem to be far ahead, don’t be intimidated. Be honest and ask if there is something smaller you can help with. If you’re really convinced you don’t have enough to help, then offer to document code, or write unit tests, but make sure you’re actually trying to read and learn from it. If instead you find that you are more knowledgeable, remember that one of the best ways to learn is to teach. Don’t just do it on a whim though. Prepare. If you find that people find it really helpful, consider putting it online to gain an online presence.

Of course an internship works wonders, and you should try to get one, but there is always the possibility that you won’t find one, or that it won’t be as educational as you’d like it to be. Let that be the final step.

And Off You Go

Computer science is an ever changing field. Hopefully this has helped you realize that the most important education is the one you provide yourself. Use college for what it’s good for, but don’t forget the importance of doing more on the side. Just like doctors have to keep up on new studies, tools, and procedures, you will need to keep supplementing your education. Don’t wait until it’s time to look for a new job or internship. Start now, and keep at it even after you have one.

Now if only I could go back and teach myself all of the above…