Computer Science: Lessons Learned

How to Succeed at a CS Education


The efforts made by Code.org and many others for students to learn computer science seem to be working as there has been an “Explosion of Student Interest in Computer Science.” There is no doubt that we need more people with a computer science education as the demand for software engineers continues to vastly outpace the supply. But as you can read in these Reddit comments and based on my personal experience, computer science is very hard and attrition rates are often high. There were computer science classes I took at Rice University which took more time, effort, and grit than all the other classes that I was taking at that time combined.

Majors for Incoming Freshmen — University of Washington

Due to my early interest in computers, I declared CS as my major 10 days into college and never looked back. While I came in with a strong interest and a minor head-start in programming i.e. knowing what basic data structures, functions, and loops were, I quickly learned that computer science isn’t programming and that I would have my fair share of struggles as I went through this challenging discipline.

Over the next few years, I absorbed a lot of knowledge and wisdom from my professors and mentors. I took a lot of computer science classes and TA’ed for 2 of them. I had very productive and fun summers as I did research in collision avoidance for UAVs for my first summer and interned at Google and Facebook for my following summers. During my senior year, I became the President of the Rice Computer Science Club and through my visibility I got to mentor lots of my peers at Rice. I also got to have deep conversations with hundreds of students both at Rice and other universities about their careers and aspirations. As I leave with a birds-eye view of an undergraduate CS education at a top university, I feel obligated to pass on my advice in the form of this writing on how to navigate and succeed in obtaining a CS education.

1. It Starts with the Fundamentals

During my first semester at Rice, a significant overhaul of the computer science curriculum was announced. During an info session led by Dr. Scott Rixner — chair of the undergraduate program — , I remember raising my hand and asking, “What programming languages will be taught under the new curriculum to prepare students for the industry?” I saw a look of annoyance on Dr. Rixner’s face before he answered my question and later I realized how I was paying attention to the wrong stuff. Time and again, he emphasized that a good education in computer science should teach you how to think and learn. At first I was disinclined to believe him in my impatience, but as I heard many talks from alumni working in the industry and during my technical interviews, I realized that the best companies did not care about which programming languages you knew and the best engineers did not label themselves as “Java Expert” or “Ruby Developer.”

How do you model the information around you and represent it as data that can be computationally processed? How do you approach problems and use algorithms to solve them? These are the questions computer science answers as it teaches you how to think computationally. Computer science departments across the world vary on how much they focus between the theoretical and practical aspects of computing. The reusable concepts and abstract thinking will help you much more in your career in the long term compared to learning a programming language or framework. Therefore, stay curious and focus on the fundamentals.

2. Code like it’s Second Nature

Programming is a major part of computer science in practice. It involves writing instructions for a computer to perform on the basis of data structures, logic, algorithms, and system design. While the fundamentals come first, programming is also very important — especially if you want to become a software engineer (which is not all you can do with a CS degree).

In his book Outliers, Malcolm Gladwell enumerates over many examples of very well known and extremely successful people who spent roughly ten thousand hours to achieve mastery in their domain. The example that caught my interest highlights both mastery and luck. At a time when programming was done by tediously punching cards and submitting them to run on a mainframe computer by appointment, only to find out that there was an error and you had to start all over again, getting a lot of programming practice was extremely difficult. Bill Gates was very lucky to have access to a computer terminal and got to do real-time programming as an eighth-grader in 1968 when computer terminals were new and rare. Once Gates began programming, he was so addicted to it that he would sneak out of his parents’ home between 3:00 AM — 6:00 AM to program on a computer that happened to be free during that time in University of Washington. By the time Bill Gates and Paul Allen dropped out of college to form Microsoft in 1975, they had easily acquired 10,000 hours of practice in programming.

Punched cards make me really appreciate Vim and Sublime Text Editor

10,000 hours of work can seem really daunting at first. But consider the basketball player who spends endless hours playing in the court with his teammates. Or the software developer who writes code all day long for his job and then goes home to write even more code for an open-source project. Eventually people fall in love with what they do — especially if the work is sufficiently varied and challenging and they are able to make progress — and then it doesn’t feel like work anymore. In the 2 months that I have off before I start work, I am spending one month on programming projects I have been meaning to complete and one month traveling with friends in Europe. I find both equally exciting!

There is no substitute or shortcut to gaining mastery in programming. For elaboration read Teach Yourself Programming In Ten Years.

3. 10,000 Hours of Practice; Not 10,000 Hours of Frustration

Through grading assignments and speaking with students, I’ve seen really high quality work submitted in about 8 hours of effort and lower quality work done in about 30 hours.

The most frustrating aspect of programming is debugging a problem you can’t seem to find the cause for. Last year, I was a TA for COMP 446: Mobile Device Applications and one of my friends came to me after 6 hours of struggling as he was trying to get the loading indicator to show up in one of his iOS apps. We went through some possible problems / mistakes and verified that they weren’t the case. Then it occurred to me to check the color. Turns out the indicator was there all along but it was white on a white background. Can you imagine the look on my friend’s face after that?

Are my friend and the student who took 30 hours to do an 8 hour assignment inherently incompetent? No. These kinds of situations have happened with everyone and you can ask people to share their favorite story. The point here is to pay attention to your quality of time spent towards an effort and to avoid repeating mistakes. Repeating mistakes is very easy when they come up in varying forms. The trick is to find the underlying cause, pay attention to the process that leads to mistakes and frustration, and to not just treat the symptoms.

At times, problems stem from a lack of clear understanding of the assignment or task at hand. It’s very tempting to jump into coding which can be disastrous if you don’t really know what you’re doing. For my first operating systems assignment, I remember reading the 20 page handout more than 3 times and writing down notes to finally have a clear idea of what I was supposed to do. I remember meeting with my manager last summer for half an hour just so he could clarify what I was supposed to do because I didn’t fully understand it.

Also, never spend too much time stuck on a problem. Getting help not only gives a fresh pair of eyes to look at your problem but lets you see how your instructor, TA, friend, manager or co-worker approaches the problem / debugging. Whether it’s a theoretical problem set, programming assignment, or a task at your internship, you’ll notice a Goldilocks zone between asking for help all the time and independently completing a task. Experience and an active strive for improvement will help you find your zone and it varies from situation to situation.

Being “on a roll” or getting “in the zone” and feeling truly immersed is about progressing to greater challenges as you build skill proportionally. See Flow: The Psychology of Optimal Experience

If you want to turn those 30 hours into 8 hours of work so you can go hang out with your friends on a Friday night, start building a strategy for getting stuff done efficiently.

4. Build Something

Most of my proudest work comes from self-directed side projects that were not an academic or internship requirement. Knowing that there’s no expectation gives you the confidence and freedom to do whatever you like on the side. This is the kind of work that will really get your creative juices flowing and there is something deeply fulfilling about building stuff.

My greatest side-project accomplishment was to create Rice Elections — a web app for secure online elections. Today, it has been used by 22 organizations within Rice including 7 of the 11 residential colleges and our Student Association. We have ran over 130 elections at Rice with over 7900 ballots cast. Working on this project taught me how to create a non-trivial piece of software, work with databases, design a scalable architecture, gain UX design experience, market a product, and consider business viability.

If you’re an underclassmen or considering CS, side projects like the one I mentioned can sound really intimating. But it’s small steps that get you to the skill, confidence, and experience to work on more impressive stuff. For example, the first side project that I worked on was during the first hackathon I attended called Parade — a simple poem writing app that finds rhymes based on the last line you wrote. This took my partner Dennis and I over 14 hours to create after lots of Googling around and learning Javascript. Today, I’m confident both of us could write this in under an hour alone. On the note of hackathons, I highly encourage attending them as they can be really fun and productive! If you don’t have hackathons at your university, organize one!

Experiences of working on side projects will give you great conversation to make during an interview where your excitement will shine through. Furthermore, the project can grow into an opportunity itself. Mark Zuckerburg probably wasn’t thinking of creating a multi-billion dollar company when he was initially writing Facebook in college.

5. Try to Get the Best Opportunities Possible

Apply early and apply often to anything and everything that interests you. Was there an assignment or a class that you found really interesting? Talk to the professor about research opportunities relevant to that. Use your summers to do internships and apply what you learn in school. For underclassmen, Google specifically has the Engineering Practicum Internship while Facebook U is an internship program specifically for freshmen.

The one thing I’d like to stress here is to apply to as many places as possible (even the ones you think you couldn’t land in your wildest dreams) to increase your odds of finding a good opportunity. Desperate to get an industry internship, I applied to about 30 companies during my sophomore year to land 3 offers. One of them was with Google whose technical interviews were my 2nd and 3rd technical interviews ever. I spent weeks preparing and simulating mock interviews by pretending to talk on the phone using Cracking the Coding Interview. For technical interview advice, read my friend Onkur’s series: A Walkthrough for Software Engineering Interviews. You can also find more information on the application processes and internship experiences of specific companies on Quora.

If your internship goes well, you’ll likely get a return internship or full-time offer depending on your graduation date. Regarding return internship offers, I strongly recommend not taking it and finding better or different opportunities instead especially if you’re scared that you won’t get a full-time offer from them later otherwise. If you got an offer once, you can get another in the future. An internship is only 3 months long where as the expectation for a full time job is much longer. So internships are a great way to dabble around and explore your options. You won’t know what you’re missing out on until you try! I had a return offer from Google after my first internship there and it was very tempting to take it. I wanted a full-time offer to work there and I feared that if I didn’t return for an internship, I wouldn’t get a full-time offer from them later. I didn’t end up returning there for another internship and got a full-time offer from them anyway. I’m really glad that I tried a different company instead and it gave me a whole new perspective and much to compare as I decided where to work full-time.

General Advice

This doesn’t apply just to computer science.

Stop Comparing Yourself to Others and Start Comparing Yourself to Yourself

It is very easy to fall in the emotional pitfall of comparing yourself to others. The people who started programming at the age of 11 and won hackathons before they even came to college might find it easy to look down upon others. While someone who is struggling to understand a concept in class might look at the person who eagerly answers all the questions and think, “How am I ever going to be as good as her?” These kinds of comparisons cause envy or contempt and either damage one’s self-confidence or make one err on the side of arrogance.

Instead of focusing on others, focus on yourself and what makes you unique. Start making goals that are important to you and find ways to achieve them. For example, compare yourself to the person you were a year ago, look at the ways you’ve improved and progressed and then ask yourself where you want to be a year from today. Self-awareness goes a long way towards improving other qualities about yourself.

Don’t Overcommit and Have a Support System

If you’re interested in a lot of things, be very careful not to overcommit. After having a very successful freshman year and being very ambitious, I felt invincible and starting tacking on every opportunity I came across. During sophomore fall semester, I was enrolled in 1 normal and 3 insanely time-consuming classes one of which was COMP 446: Mobile Device Applications whose prerequisites I did not satisfy (I didn’t have Object-Oriented Programming experience). I had a part time student job and I became a TA for the freshmen CS intro class. Additionally, I was involved in 3 student clubs; was a permanent improvements committee head for my residential college and redesigning their website. My entire day would be gone attending classes and meetings. I would start work around 8:00 PM and get too tired to continue around 3:00 AM. Later, I developed insomnia and wouldn’t be able to sleep till 5 or 6. Only to wake up at 9:00 AM to get ready for my morning class and repeat the process. Midway through the semester as things got tougher, I nearly broke down. I attended a session hosted by the Rice Wellness Center, spoke with one of my professors, one of my RAs, and friends. I found ways to reduce my stress and commitments such as pass failing one of the classes I was taking and doing the bare minimum work. That semester was one of the worst times of my life and I really learned how to prioritize and say no.

My friend Veronica wrote about this phenomenon which I wish I had read about back then: Stop overcommitting and doing a shitty job — Part 2: The Resume Builders.

Make Lots of Friends and Find a Sense of Belonging

When you graduate from college and look back years later, you’re not going to remember or care about that exam you did or didn’t ace. What you’ll remember and cherish the most is the friendships you made in college and the time you spent together. Step out of your comfort zone and make as many friends as possible both within and outside your major. Working together on impossibly hard problem sets with friends will make you realize that you’re not alone in your struggles. Your friends outside your major will open you up to a diverse set of interest and activities which will make you more well-rounded individual.

Believe In Yourself

Yeah I know; this sounds really cliche. But know that people will treat you according to the way you carry yourself and you can only go as far as your self-esteem allows you. So build your self-esteem! Notice your strengths and what makes you unique. When you make an achievement, bask in the glory. Learn how to handle rejections. Receive compliments well and think positively about yourself.

“Do not let your fire go out, spark by irreplaceable spark. In the hopeless swamps of the not quite, the not yet, and the not at all, do not let the hero in your soul perish and leave only frustration for the life you deserved, but never have been able to reach. The world you desire can be won, it exists, it is real, it is possible, it is yours.” Ayn Rand