As we approach late august, the time is coming for college classes to kick off again. Whether your school is online or in-person, I believe there's a handful of things you can do to make this year a success. This article is a culmination tips targeted at Computer Science majors to help them have a successful year. This information has been curated from my four years of learning at university, along with various pieces of advice from other students, graduates and professors.
Trust me, you don't need to know how to program going into a CS degree. Hell, the degree wouldn't exist if everyone was expected to come in knowing what they are doing already. Want proof of that? Here's Exhibit A:
This is my first personal project I made halfway through freshman year. This is a suuuuper simple sorting program. Like 100 lines of code simple. But, at the time I was super proud of it and thought I had discovered some new amazing algorithm. The reason I'm sharing this is because the fact that I was proud enough of this tiny project to put it on Github should show how little I knew going into my CS degree.
Now, just over 3 years later, I have a mobile app launched on the app store and have done various other medium-sized projects in the past 2 years. The path from bubble sort to app store can be a hard one, but trust me it's attainable. School will do a good job of teaching you the basics, so don't worry about how much you know going into the major. After you learn the fundamentals, it's up to you to gain more knowledge before you graduate. My other tips are aimed at helping you do that.
If you're like me then you'll constantly feel like you're in one of these two camps as you embark on your journey. Although it's pretty awesome to feel like a god all the time, it's not practical and you're bound to get stuck over and over again.
I like to think of this paradigm as just riding the wave to mastery. You have to ride the up's and down's, but what you'll find is the general long-term trend will be an upward slope to mastery as you learn more things.
My advice here would be to not get discouraged during the hard parts of the learning process. It takes a long time to learn these skills, so just relax and ride the wave.
This is a concept I'm trying to do more and more. It's the idea that whenever you're learning something new you should do it in a public context. So if you're developing an app, build it in a way where others can follow your journey. You can do this by posting a weekly blog on medium or dev.to, or posting a daily update on twitter, or even making a youtube channel and sharing your learnings there.
This has 2 benefits because:
Employers LOVE this. Companies know that no intern is going to be a master of their craft and that's not what they're looking for either. Companies are looking for someone who's good at learning, good at communicating, and passionate for what they're doing. There's no better way to exemplify all these qualities than to have a repository of your thoughts and say "Look! This is everything I've learned this past year."
This will make you a better learner. Having a set-time each week where you sit down and reflect on what you learned and share a piece of that to the world helps you solidify that knowledge. It's also very motivating to see other people be engaged in the problems you're working on will give you the drive to keep going.
This is key. If you're going to "learn in public" it's a good idea to make a personal website that can give people one central place to view all the cool things you're up to. This is also a great programming project too, because it's something that you can make as simple or complicated as you want and once you finish it you can easily share it to the world.
Bonus Tip: Don't be a perfectionist when building this website. I've redone my website 3 times in 3 years and plan to redo it again in the near future. It's more important to have a website than to have a perfect one.
I have some classmates who built theirs with plain HTML and it works great! Hell I have professors who's websites are built in plain HTML. If you don't have an interest in design, making it minimal and purely functional is a great path to take.
Take advantage of all your student discounts! You can ride these discounts really far and likely never have to pay for any cloud-hosting before you graduate. You can find these deals everywhere, but my favorite place to view student perks is Github Student Developer Pack. Some of my favorite deals from this:
- $100 of AWS Credits for Cloud Services
- Free GitHub Pro While a Student
- Free Year of a NameCheap .me Domain Name
- $50 of Free DigitalOcean Cloud Hosting
- $200 of Free MongoDB Atlas Credits
… and more!
The Computer Science major has really 3 different types of classes. It's important to know the difference between these because some of these areas may not be as interesting to you and that's okay.
- Algorithm Courses (ex. Discrete Math, Finite Automata, Data Structures)
These classes are what people are talking about when they say the Computer Science major has a lot of "math" in it. These classes are similar to math classes and teach you more of the theoretical-side of Computer Science. They'll teach you how to develop algorithms, how to write proofs, data structures and more. If you love these classes they can be a path towards grad school, a PHD, teaching, or research fields.
- Hardware / Low-Level Courses (ex. Operating systems, Computer Networks, Computer architecture)
These classes teach you what's going on in internally in a computer. You'll learn stuff such as CPU scheduling, networking, assembly programming, operating systems, permissions, etc etc. If you like these classes, this can lead you into a career doing computer engineering, robotics, OS design, or more.
- Programming Courses (ex. Software Analysis & Design, Software Engineering)
These courses will teach you how to write software. In these classes you'll learn object-oriented design, design patterns, databases, frontend design, git, project management and more. If you like these classes, they can lead to a career in web design, game development, backend engineer, software engineer and more. There's so many options it would be too many to list.
All of these classes are important. You'll find that the concepts of one will tie into another so pay attention to everything. You might first be introduced to a hypothetical concept in your algorithms class (like big-O notation), then later see it cropped up in a programming class (For determining the best way to structure your SQL query). That's typical and it's the reason all these classes exist.
Bonus Tip: Don't load up your schedule with too many of 1 type of class in the same semester or you might get overwhelmed with too much of the same type of workload. This depends on the specific class, but it's generally a good rule to follow.
Some courses can be very project based. Each of my programming-focused courses had about 8 labs and 5 or 6 projects of varying difficulty. This can be super stressful if you leave these to the last couple days, especially considering you probably won't know what you're doing.
It helps to develop a pattern. I eventually got a pattern down of trying to complete projects the weekend before they were due and this helped a lot. This gives you the ability to step away and refresh your brain then come back and tackle a problem later. I still do this today!
Mastering the unix command-line is one of the most practical skills you can learn in college. You should learn how to create, edit and delete files, navigate directories, move files around, edit documents with vim, and shell into other computers. This might not seem like the most important thing to learn at the time, especially if you're thinking "No but I don't need a command-line for X", but the fact is that everyone will need the command line to use git repositories, ssh into your production environment, etc. It's unavoidable.
This has been my favorite way to work on my programming skills. After each semester when I'm on Christmas or summer break I'll build a "Capstone Project" that solidifies everything I learned. This is a great way to stay in the habit of programming, build your resume, and build something that you actually want to use!
One of my favorites of these projects is my Spotify web app that lets me view my most listened to tracks and artists:
Doing projects you're interested like this will make it something you want to finish so my recommendation is to build something that YOU want to use. Even if it already exists, that doesn't matter. Just build what you would use.
The job environment might be changing due to COVID, but trust me there will still be internships available. The key is to know where to find them and how to have the skills they're looking for in candidates. If you do the other items on this list, such as learn in public, have a personal website, and build capstone projects, you'll be an attractive intern no matter what year you are.
Here's some other tips I have for getting internships:
Get out of the mindset that you're "not prepared" for an internship. Everyone is still learning through college so let the companies be the judge of if you're prepared or not, don't make that decision for them.
There's always internship opportunities popping up. I started applications around October last year and got an internship in November. Some students started even earlier. The summer before that I got my internship during finals week right before summer. New opportunities are popping up all the time, so be on the lookout consistently through the school year.
Use State-Funded Internship boards if available. If you live in Minnesota, https://scitechmn.org/ is a great resource that I recommend. Local internship boards have a smaller competition pool and give you a more personal application process than something like Indeed.
Thanks for reading!
I hope you find this valuable and if you have any more tips please share them in the comments!
Check me out: https://spencerpauly.com