5 things I wish I knew starting university as a Computer science/engineering student
Tags: computerscience, beginners, productivity
Published: 2020-05-10 14:30:30

University can be stressful for cs students, especially if you didn't have any coding experience previously (such as myself). You might be feeling that you're behind others who started earlier than you, thinking it's too late for you too to be an amazing engineer. "build projects so you can land internships", "problem solve all the time so you can pass interviews", "know all your data structures and algorithms" are pieces of "advice" thrown around as if they are easy to master quickly. Soon you're over-stressed and you don't know what to focus on. If you are still in your early university days and are feeling lost and overwhelmed, know that you are not alone. I'm going to share with you what I found most valuable to help me get passed those feelings and even excel! So let's go!

**1. Choose your friends wisely**
  This may sound off topic, but it might be my most valuable piece of advice. Find motivated and strong-willed people to be in your life. People who are passionate to learn and build things. They'll inspire you to work and become the best version of yourself. They'll be your project teammates. They'll be your study buddies. They'll keep you accountable. Unless you are always 100% motivated, these people will pick you up on your low days, and push you to work towards your dreams and goals. Remember, you are the average of the 5 people you spend most of your time with.

**2. The difference between Competitive Programming and Interview-preparing**
    When I first heard about problem solving and how sacredly important it is, I started exploring Codeforces -which is a platform for competitive programming. I would pick a problem and stare at it the whole day. When I decide to finally write code and submit it to the online judge I get this "test case failed at test number #" message. Sounds frustrating doesn't it? Well, it was. Even though that's totally normal at the beginning. I shouldn't have just stared at the problems, I needed to see the solution, to learn from it, to see where my code fell short and to learn clean code and coding conventions. Codeforces is for problem solving and competitive programming, the problems are told in a story-like manner, this can be annoying because the technical requirements are hidden in all the details. Problem solving is an important part of being an engineer, it shapes your thinking and helps you acquire the skill of developing solutions to vague problems with constraints that might not be that clear. On the other hand, preparing for interviews is a different story. Interviews are a little different, they focus more on data-structures and Algorithms. Most questions are straightforward. Platforms for interview preparing are like Leetcode or Hackerrank. Leetcode is amazing. There are lists of problems with different levels of difficulty. Start out with the easy problems, then when you get a little bit better try the medium ones. Some problems have solutions in leetcode's articles, and you can always find someone's solution in the discussion section. When you're stuck in a problem, staring at it the whole day isn't going to help. Instead, think about the problem for about 20 mins. If you still don't know the answer, Study the solution. Yes study the solution, understand the algorithm, recognize clean code and how data structures are used. You will improve by how much you learn from the problems, not by how many problems you solve. Quality over Quantity. Both of these problem solving techniques will benefit you greatly as an engineer, but you need to know when to use which. Codeforces is great for competitive programming and leetcode is great for interviews. In general I can't emphasize enough how important it is to know your algorithms and data-structures well. If you want that dream internship, you better start problem solving as fast as possible.

**3. You don't have to be a genius to excel**
    I remember when I first started learning about recursion, or even more specifically, the "Tower of Hanoi" problem. I just couldn't wrap my head around it at first. This worried me a little, thinking that maybe I'm just not fit for the job. Some people can understand these concepts almost instantly, but as I recently learned, this isn't always an advantage. I recently encountered this interesting concept from Barbara Oakley in her online course "Mindshift: Break Through Obstacles to Learning and Discover Your Hidden Potential". Barbara gives an example of when a teacher in class asks a question, and before you even understand the question you find people raising their hands to answer. "Some people just plain seem to have race car brains. They get to the finish line, they answer really, really fast. Other people have what you might call hiker brains. They get to the finish line but because they're walking, they get there much, much more slowly. With the race car driver, they do get to the finish line a lot faster, but everything goes by in a rush. They're also on a set, smooth roadway. They know exactly where they're going. A hiker on the other hand, moves slowly. But while they're hiking, they can reach out. They can touch the leaves on the trees, smell the air, hear the birds. And they can easily veer off the expected path into places where people don't normally go." Barbra then points out the many advantages these "hiker brains" have, because they think of all the different aspects slower, their understanding can be deeper than others. She talked about the Nobel prize winner Santiago Ramon y Cajal, who was not a genius himself, but worked with geniuses. He found that they often shared similar problems. For example, these geniuses with their race car brains were used to jumping ahead to speedy conclusions. And when they were incorrect, they weren't use to changing their minds. So they keep charging ahead with the incorrect conclusion they jumped to, their super fast brains could easily devise justification. Ramon y Cajal himself though had a persistent hiker type brain. He'd come up with a hypothesis and then he'd persistently check it out in a way that would reveal whether he was wrong. Instead of just trying to prove that he was right. If he was wrong, he changed his mind and flexibly tried again. So was his persistence and his flexibility in the face of what the data was truly telling him that made him superstar researcher. When I first heard of this comparison, I thought it was mind-blowing. I sometimes find myself stuck on specific concepts while some others would get it instantly and I would start worrying, am I smart enough to be a great software engineer? Do I really understand this algorithm thoroughly? Now I know that everyone is unique and we all have our strengths and weaknesses. It's okay if it takes you time to grasp some concepts, we all struggle sometimes.


**4. Volunteering is your new best friend**
 Many big companies like to see volunteering experience on your resume, but that's not the main reason why I'm telling you this. I'm advising this through personal experience, as I am a volunteer at IEEE Alexandria Student Branch, in the software development committee. I have been there for about a year and here are some of my experiences: My team and I built an android app for our branch (I knew very little android at the beginning, but with sessions from more experienced students, online courses and helpful teammates I managed to learn a lot and participate in a new project to put on my resume!) I got to interact with many older students at my university who shared with me valuable lessons and insights. I attended many educational events and seminars. I got the opportunity to help younger students and made many friends. Besides the benefits, it's actually fun! If your university has a community or club with similar interests as yours, join it and start learning, networking and socializing. It was one of the best decisions I've made that year.

**5. Study your university courses well**
   I know maintaining a high GPA isn't for everyone, but I can tell you it has benefits. Many people will tell you that a high GPA isn't necessary for software engineering, and that's partially true, but it doesn't mean having a decent GPA won't boost your chances. After attending a google event at my university and submitting my resume previously, a google recruiter reached out to me. That time I didn't have any amazing unusual projects on my resume, so I'm assuming what helped me stand out was my GPA. I know how hard and stressful it is to keep your grades high, I personally struggle with it, but if you can do it, I think it's worth it. Just don't forget that the real purpose of you attending uni is to learn and to learn properly. If you are lucky enough to be enrolled in a computer engineer/science degree, then most of your courses will be extremely important for your career. Learning is a beautiful process, and to be a successful engineer you need to be a life long learner. In the real world when you start working, it's almost impossible to find a free day where you can just sit around all day and study and solve problems. Where in university, you may have many days just to read textbooks and process information. It may not feel like a blessing now, but later on you will miss these days, so appreciate them now and take advantage of them!
 

**I know I said 5 tips, but here are my last thoughts for this post.**
 Find what excites you! I'm still working on this myself, but what I realized is that you will never know what excites you until you try many different things and know what doesn't excite you. Let's say you try web development for a month, and then you figure out you don't like it that much. Isn't that better than choosing a web development career randomly and being stuck with it for a much longer period just because you chose blindly? You have time now to explore many different fields, and no that's not time wasteful. It will save you much more time on the long run. 
 Don't wait till you're ready to apply for internships. Apply and if you're lucky enough to get that interview, do it! Interviewing is a skill and the more you get interviewed, the faster you'll attain that skill. Don't get discouraged if you don't get an internship at one of those giant tech companies, it's especially hard for international students, but at the same time be optimistic! I know many amazing people who got offers from big Tech companies like Facebook and google. 

Take care of your health. Staring at screens all day and sitting at a desk is a recipe for disastrous health, especially with the programmer stereotype where you have to be awake all night coding. That is not okay, you should not be awake for half of the night. Exercise and healthy eating habits will give you more energy, sharpen your brain and improve the quality of your life. Don't neglect your health with excuses like you would better code one more hour than going to bed. All your efforts for securing yourself a decent job in the future will be useless if your health -which is your most important asset, is in poor condition. 

That's it from me for today! I hope you found this useful. Please tell me your helpful tips and tricks in the comments section below!