You want to be a CS major but you don’t have much programming experience. Maybe you’ve taken CSCI-002, the non major intro CS course. Maybe you just started learning Java. Maybe you haven’t taken anything at all. That’s fine! You can 100% learn to program as a CS major at NYU.
Likewise, if you switched into the CS major a little later than most, you can certainly accomplish a lot with the time that you have.
However I would like to offer some advice on how to hit the ground running and make the most of the following years.
Programming Is A Skill: Hone It
The best analogy I can provide for this is sports. I used to fence. In fencing, there’d be some people who would mysteriously get good at fencing very quickly. These people would be really annoying because you’d start out kicking their ass, and suddenly year or two later they’d be kicking yours. How did this happen?
For one, they practiced. A lot. They’d have group lessons, one-on-one lessons and open fencing.
Think of programming the same way. You’re practicing a skill. Your classes? Group lessons. Tutoring? One on one training. Your homework? Personal practice.
Use each of these sessions differently. Group lessons are great for picking up general ideas. You can learn the overarching big picture. Tutoring is great for filling in gaps and solidifying this larger knowledge. But homework is the most important for actually learning to program. Just like fencing: you can do all the group lessons and all the one-on-one lessons you want, but ultimately the best way to become a good fencer is to fence.
Set some goals for yourself on practicing programming. Maybe you can do at least 15 minutes of programming each day. Maybe you can aim write code 5 days a week. Whatever the goal is, try to stick to it. The people who got really good at fencing would be incredibly consistent with their training. Even if they didn’t feel like it, even if they had a lot of work, they’d show up at the fencing club. Try to do that with programming.
It’s okay if programming seems really hard. Training isn’t easy. Your brain should be struggling. Take breaks, eat well, get some exercise. You’re tackling a difficult task. It’s okay if you don’t always live up to your goals. Try again the next day.
With practice, it’s absolutely essential to do it conscientiously. If you solve a problem in the homework, challenge yourself to find the nicest possible solution. Is there a way to do this in fewer lines? Could you use a different feature? What are the potential problems with your first approach?
Try to ask “why” as much as possible while programming. Why are you writing this? Why does this work? Why does it not work? Why are we not approaching the problem in this way? It can be quite tempting to program by mashing stuff together and guessing, but that won’t get you nearly as far.
The second thing that helped these fencers become mysteriously good was that they were almost always athletic. If not, they quickly became athletic with cross training.
Similarly, try to cross train your brain. This may mean reading up on problem solving. This may mean doing math. Even if you’re not able to program each day, try to do something that will help you become a better programmer. Something as dumb as learning to type properly or learning keyboard shortcuts can really help you in the long run. Tooling is a very important area to get down. MIT has an excellent course on tooling and other miscellaneous areas. I’d consider learning either Emacs or Vim, as they’re very very useful tools.
You can also read about programming. Even if the topic isn’t directly related to your current courses, you’d be amazed what random info is useful later on in the degree.
There’s only so many hours in a day that you can program. But you can supplement this time with other work like reading, practicing problem solving and tooling.
The third thing these fencers would do is develop what I’d have called (bitterly) a cheap trick, but in retrospect I’d describe as a niche. Basically they would figure out one area they were really good at and use it to their advantage.
If you can find a specific area that you like in programming, perhaps web development, systems development, graphics, compilers, etc., then you can start to get an area of expertise. As you build this area of expertise, your programming skills around that area will get very strong. This in turn will look really good when you start applying to jobs.
It’s important however that this is a genuine interest. Otherwise it’ll just feel like more work.
Get A Job
This is really a rehash from my other guides, however I’d like to reemphasize it here. You may think that you’re not qualified to get a programming job just yet. But you’d be surprised. There’s a lot of great programs for freshmen and sophomores who are new to CS and for underrepresented communities, programs such as Google STEP, Facebook University, Two Sigma Freshman Internship, etc. In general freshmen in college aren’t that good at programming. You probably have better chances than you’d think.
Even if you’re not a freshman/sophomore or an underrepresented minority, you can still apply to local companies for internships.
If you’re worried about not knowing data structures or algorithms, then try to self study just a little bit to get the job. Some people recommend doing MIT OpenCourseWare or reading books like Introduction to Algorithms. I find that extremely overkill. First, going through a full on course in algorithms takes too long. And second, Intro to Algorithms is like a thousand pages long! Nobody has time for that. My recommendation is to get something like Cracking the Coding Interview and as you work through problems, look up info just to solve that problem. This may mean you’ll spend a couple days trying to understand a single problem. That’s fine! At least you’ll have a far more practical knowledge of these algorithms.
However I’ve certainly had jobs where they didn’t ask me any super technical data structures questions in the interview. Hopefully if a company knows that you’re relatively unexperienced, they won’t ask anything too technical.
Classes Aren’t Everything
Because you’re starting from scratch, there’s a chance you’ll spend most of your NYU CS career completing required classes. These classes can totally teach you a lot. That being said, they’re not everything. Far from it in fact. The vast majority of practical programming is done outside of these classes. It’s really important that you learn this practical programming as early as possible. This will make getting internships easier and help you with the harder classes.
You may think that you can just wait to take Applied Internet Technology or whatever. But if you’re starting from scratch that’ll take until your senior or junior year! That’s not good enough since you’ll want at least an internship for the summer after junior year.
This may be a slightly controversial statement, but in my eyes NYU’s core CS curriculum of Data Structures, Algorithsm, CSO and OS is the bare minimum for a CS major. You should aspire higher than that.
You Can Do It!
This may seem intimidating and I truly apologize if so. The truth is you don’t have to do any of this. Plenty of people do just fine without following this advice. That being said, I believe that if you do what I’ve recommended, you’ll have a far easier time becoming a great programmer and an employable programmer. You may find yourself becoming a better programmer than people who have been programming for years and years. Which is pretty awesome.
I truly believe that anybody can do this. You just have to get started.