This is a guide with bits of advice I would give my younger self about CS undergrad programs, assuming that self didn’t have access to quality education and little idea about what to expect or how to use the degree to build a future. I will start with fundamental CS knowledge that you must acquire to be successful, followed by some hacks that my younger self should have known. I will discuss tools that come in handy and how to build a resume, and then suggest some approaches to things that help, along with some comments on grades. This article may sound a bit rusty.
CS fundamental knowledge you must have
- Csapp - This CMU course/book will give you a profound idea of computer science. It should be easy to follow and good for the basics. Make sure to use it as much as possible.
- Pick one language and go deep - Every CS program offers an introductory programming language course. Both C and Python work fine as an introductory languages (python is easy to learn). You have two options: you may choose to learn one programming language well or die (dropout). Any compromise in between is a sin.
- Keep DSA under your pillow - There should be a course for data structure and algorithms (DSA). Practice algorithm analysis before going to bed. There is another way to be very good at DSA. Just be part of the competitive programming community, they will teach you in the best way.
- OOP makes you smart - Object Oriented Programming (OPP) is essential for software craftsmanship. Learn OOP practices with care. Try to do a small unique project for your OOP course.
- Database + Software - There should be a course for software dev. You get to use a database, SQL, and a tiny framework for app development. It’s hands-on practice, so build something for this course. Do not copy-paste some php projects from seniors :(
- Numerical recipes - CS is all about numerical computation. You better learn how to do them efficiently. This will make you smarter than most peers in your class.
If you’re an undergrad, these are a few courses you should take to acquire fundamental knowledge. They are essential for your success. Compromising on any of them is a sin that will haunt you forever. It’s not difficult to get this knowledge tbh, but most undergrads fail to do this in time. You’ll notice a pattern where one course is a prerequisite for the next. If you lose your grip in the introductory courses, everything else will fall apart, even if you think you tried.
Hacks you should know
- For every single topic/lesson you will encounter in your four years CS journey, there is a guy on the internet who can spoon-feed that lesson to you. I can guarantee that a random YouTuber will be 5X better than your faculty. I used to follow CMU/Stanford/MIT courses and some Indian YouTubers :)
- Ask people to teach you and vice versa. If you know something teach it to someone. If they know something, ask them to teach you.
- Have a study group. If you want to maintain good grades, you should have a study group. You should always pair with people who are better than you. If no one is supposedly better than you, then it is a unique opportunity for you — which comes with appreciation from your opposite gender, some leadership practice, etc, etc.
- Submit your assignment on time. It’s hard to do it I know. You are a cool programmer and you don’t care about grades. Okay! But timely work on those suggested readings for an assignment and submit it on time. This helps you practice punctuality and consistency, in addition, forces you to pay attention to lectures. Eventually, you will have good grades and final exams will never feel like a nightmare.
- Google + Reddit. I suppose StackOverflow is commonly used by students these days. Another powerful tool is Reddit. For most things that you are googling… search for that with the “reddit” keyword. It will make your life 10X easier.
- Maintain a notebook. You should try to maintain a simple computerized one like a folder of “.txt” files or a notebook that someone gifted you on your 18th birthday. Keep track of to-do lists; weekly, monthly and semester-wise. Finish 50% of those, maybe fail in the other 50%. It’s okay! None of your peers will do this and no one gets it right at a young age. If you do this, you will be in the top 5% of your class. Iterate your todos to get better with time estimates.
- Use consistent storage e.g. google drive to store your data for the long term. You should always organize class notes, data, tutorials, etc tagging with a subject, or semester and get rid of unwanted stuff.
- Consume resources as you go. Never buy books that you don’t need i.e. don’t collect those five free python books that have no use to you. Use one book only, a maximum of two. Specifically, never ever download tutorials from torrent sites and fill your disk storage with them. You will never watch them, no one does. A simple hack is to download them when you need only. I used to pay for my Udemy courses. Since I have paid for it, now I have to watch those tutorials to justify my 10$ registration fee.
Tools makes you cool
- Version control (Git) is a must. Learn it. This tool will make you look cool and act smart.
- You need an editor for coding. You should have a favorite editor and you must have an opinion about it. Like vim vs emacs. This clearly shows you have a sense of taste.
- Learn some UNIX commands. It is a bit difficult to learn them at first. Girls/boys should date you just for using UNIX commands. Unfortunately, that’s not the case at your university yet. Another sign of taste and coolness.
- Shell and scripting. For anything that seems repetitive, try to automate it with python scripting.
- Things like debugging and profiling are good to know. You will debug every single program you write, it’s just a matter of how smartly you do that. And profiling is again coolness. You want your code to run faster.
- There is a thing called tmux. Have you heard of it?
I am recommending a course from MIT that pretty much teaches you all of the things I have mentioned above.
An extreme approach for building a resume that counts
Most people prepare a resume in their final year while they are looking for a job or internship. I suggest the opposite. You should maintain a resume since your first semester. You should practice version controlling on your resume or maybe save them with term tags. The first version will not have much, list your education, awards, and some co-curricular stuff. As you go forward, you will join a programming contest or solve 20 online judge problems or build a tic-tac-toe game using C. You must update your resume with that information, and also drop outdated stuff. At the end of each semester, you should have something to update, which means you are making progress. The plan is to take your efforts from each term and translate them into some presentable outcomes for your resume.
An important question is how do you know you are getting it right? Here is my second piece of advice for you. Download an ideal resume online (how abt a Stanford CS student?) and collect another resume from any recent graduates from your department. Put three resumes side-by-side and compare them. You should take notice of what your resume is missing and how bad that bhai/apu’s resume is (typical case). You don’t want to make the same mistakes for sure. Your goal would be to match that Stanford resume. In practice, you cannot even approximately be the same as a Stanford CS student. It makes sense — you don’t have opportunities similar to Stanford.
However, this practice will deliver your a good resume, with proper outlines, style, and uniqueness. This also forces you not to compete with your peers but compete with a global pull of talents. Now that you have a bar to match, you should find proxies to approximately match that Stanford resume. If that fancy resume guy interned at Meta, you could do GSOC. Every single thing can be replaced by some proxy if you are willing to do it. There are other things like you should use latex for writing a resume — again, it just proves you have good taste!
Other things to keep in mind
- Don’t listen to random people including your classmates, seniors, or faculties. This is a bit tricky. You need to define your community. And you should listen to people who are experts in that community. For instance, if you are a competitive programmer you should listen to a world finalist but not that faculty who hates contest programmers. You may try to avoid listening to your classmates or seniors who have tons of opinions on everything but knows nothing.
- Learn to communicate well. This is an important skill that almost 90% of undergrads will lack I may presume. Mention the context clearly to the person you are communicating with and identify what you need from them i.e. I am X, I did Y and I need your help on Z. Learn those email etiquette that varies across cultures. For instance, calling Sir/Madam to US professors or sending an email without a subject or bad grammar in the email body are some bad indications of an email sender. Use AI tools like GPT3, and Grammarly to improve your English.
- Maintain a personal website. People should be able to find your name on the internet with a simple google search. A portfolio website can be helpful to showcase your projects. GitHub page is pretty easy to use for this.
- Understand the meaning of help. Some people get it wrong and it’s annoying. When you ask someone for help, you shouldn’t expect them to do your work and you sit there idle doing nothing. It’s just wrong! I can give you a scale for quantifying help. Your request for help from someone is valid if you did 80-90% work or are willing to do it and you need help with the other 10-20% that you can’t figure out yet. Also, please don’t take someone for granted even if they are your close acquaintance. Appreciate people for their support and let them know it. In addition, try to carry it forward.
- You should ask yourself which community you belong to. Are you a competitive programmer? Python geek? AI enthusiast? Open source dev? None of your peers may think about it. You should spend some time thinking about it. A community is very critical for making an informed decision and generating success. Your undergrad program will fail you in thousands of ways and you will fail it the same. It’s just how things work in reality. My understanding is most undergrads don’t have a proper idea why they need that degree. So, you should try to belong to a broader community that can mitigate some of those issues and help you with resources so that you become a skilled person. There are tons of communities such as the python community, developer community, Linux community, open source community, and so on. Just find your own.
- Join competitive programming. Try to be part of this and nourish problem-solving attitude. You will face failure cuz it’s difficult. It’s hard to achieve satisfactory growth. To make it worse your seniors will get the 50th position in a national contest. But it’s okay, don’t stress. As long as you keep trying and failing, you will learn something new. I say it’s better to fail for something worthy. Note it is now established that competitive programmers always get jobs soon after their graduation. So, keep trying and secure that job.
- Participate in Google Summer of Code. I have little idea about them but this is for sure an awesome exposure to global projects and mentorship.
- Apply for international internships, mentorship, collaboration, etc. Often if you are making good progress, you will outrun your peers. The only way to scale it is by accessing resources beyond your known community. Try to be in touch with FAANG engineers or phd students in US/Canada. Ask them if they need some help with their projects and work with them if you can.
- Have a plan ready for the future. Want to apply for phd? Crack that 60K salary job? You must have a plan ready at least one year ahead. You must learn to simulate your future and run that simulation three times (i.e. safe, medium, and ambitious self). Our cultural phenomenon is to think in the “short term” — we just live in the present. It’s not good for you. Practice thinking about what you want to do after six months, one year, five years, and ten years. Mastering simulation will give you control for engineering your future self — making informed decisions and generating success.
- Work on yourself. Run experiments on your work habits, and identify your weakness and strength. Iterate over them to have more control in day-to-day life. Do you prefer small sprints to get work done? Are you distracted by social media? Are you eating healthy? Is it wise to waste time on three private tuitions, maybe one is enough? Should you date that guy? What is the meaning of life?
- Aim big and play it hard but cool. CS is difficult. Agreed. But it also offers incredible opportunities, right? In the last few years, a huge pool of phd students and FAANG engineers from Bangladesh moved to foreign countries. You could be one of them if you work hard. It might be difficult given your local atmosphere, but it is not impossible.
Comments on grades and gaming the system
- Grades fail to indicate your CS skills. Grades don’t indicate someone’s CS skills in most local universities I can think of. Many toppers you will encounter don’t know how to code. My sample size is small but I would be surprised to learn otherwise. This means that skills need to be attained with your efforts. Most CS skills can be self-taught. If you are not too much into gaming the system, you can develop your skills in parallel to your efforts to score top grades. But skills and grades are typically mutually exclusive I would say.
- Good grades might kill you. Some students get too occupied with gaming the system, they don’t learn any practical CS skills. They end up in top positions by memorizing (or learning things that only count in exams). Unfortunately, that 160k$ FAANG job is not going to happen to them. They just lose themselves in the process.
- Things where grade matters. Good grades don’t hurt tbh. It is most useful for grad school admission and scholarships. Typically, a person with good grades is deemed to be punctual, attentive, and consistent. These are useful habits to have for doing good work. It is rarely a case that a person with bad grades is a very skilled person (counterintuitive, right?). A balance is always nice to have :)
- How to maintain good (or okayish) grades? For maintaining okayish grades you may game the system lightly. Participating in classes and submitting assignments regularly is a huge plus. The rest is just to follow some old notes, previous year’s questions and not being bugged by a friend the night before your final exam.
You may ask what is gaming the system? Try to collect previous year’s questions before an exam and you will know it :)