I made a mild college CS alarmist post today on /leftypol/ and was asked by a student for advice on what to avoid in school. I'm well aware of how contentious programming can get, often with people disagreeing on what even constitutes fact vs. opinion, so feel free to argue against anything I say or provide your own advice to any potential CS students.
Here is my generalized advice in terms of CS: take any class that is focused on implementation rather than theory. Theory is also very important but it is absolutely useless unless it relates to your actual programming experience. If you are not being assigned large or challenging projects, make your own.
Things to avoid or be skeptical of:
- You are primarily being tested on pen-and-paper. The only time programmers have to write algorithms without a debugger or at least a console to print to is in job interviews. You can fail every single test in algorithms class and still be a boss programmer. Tests like these are more akin to Math exams where you must provide proofs.
- You are being force-fed OOP (Object Oriented Programming), either by an academic ideologue or simply by virtue of using Java which basically forces it. OOP in programming epitomizes "ideology" in Zizek sense, it's an abstract model adored by academics who don't write code for actual users because of its perceived elegance and simplicity. However, real-world code ALWAYS has to deal with reality's messy edge cases, which renders any OOP code into a nightmare. There are about a million other reasons it's bad, there are many good lectures on YT.
. This ends up saving an enormous amount of time by catching mistakes before running the program, and it produces a faster result. You should ultimately learn both dynamic and compiled languages, but only the latter ultimately leads to enlightenment. And FOR GOD'S SAKE
if you are making a large, non-trivial project
, make it in an actual, compiled language.
Things to do:
- Figure out which direction to go in. Programming has an almost unlimited array of applications. Eventually you will have to specialize to a certain degree.
- Learn how to read code. This is brutal at first and only comes with time, but eventually you will learn how to. Whenever I find something interesting on github, I poke my head in and see if I can get any good ideas, or just observe how others solve the same problems I have.
- Learn a god-damn text editor. I use Vim. It's horrible at first, then it's pretty nice, then it's great, then it becomes part of your being.
- Be optimistic. Yes, I know, this sounds retarded, but hear me out. I knew before I ever started programming that it absolutely MUST
feel amazing to be a really good programmer. I still have a lot to learn but these days I can tackle most problems that come up without consulting the internet and holy fuck does it feel good.
And finally, the ultimate programming mantra: Keep it simple. Resist the urge to over-design, over-architect, over-generalize. A program is a tool for completing a task: start with the absolute bare minimum and add as necessary. Abstractions always have cost: the only things that really exist are functions and the data they read and transform. And when you ascend to metaprogramming, you will see that functions are data too.
PS if any of you are gamedev gang, this is the ultimate, painstakingly detailed resource available: https://www.youtube.com/user/handmadeheroarchive/videos