Advice For Computer Science Students
I decided to write this post as I occasionally get asked to attend lectures in my old college answering questions for new students starting out to help alleviate their worries, offer practical advice, and give them an idea of what its like working in software. The students tend to be quite responsive during these sessions and the questions can resonate with some of them. I feel this information can be of use to others outside of that classroom if I would only take the time to actually write it down somewhere.
When did I graduate and where do I work?
I began studying electronic and electrical engineering straight out of school in 2011 which helped me learn that maths is hard and I don’t understand circuit theory. During that time I had my first taste of coding, building robots programmed in C/C++ and signal processing in Matlab.
Eventually I transitioned into a computer science course in 2014 where I was able to focus my efforts on learning what really interested me without the stress of dealing with Fourier transforms and trying not to electrocute myself! After 4 years of learning mainly Java with a few other technologies thrown in I graduated in 2018 specialising in Internet of Things.
Throughout my time in college I didn’t really know where I wanted to end up working or with what technology. I just knew that I like embedded systems and more abstract programming. I ended up landing a job as an Android SDK (Software Development Kit) developer which is basically just making software plugins for other people’s apps. As of writing this post I am currently working as an Android engineer for Unfold in Squarespace.
What is my role?
I work for Unfold as an Android software engineer and while my job does involve writing a lot of Android specific code it’s not all that my role includes. Other tasks can include planning new features with product managers and designers, discussing technical challenges with engineers on other platforms (e.g. iOS, web, server side), participating in interview panels, or engaging with customer support agents to help solve customer issues.
It’s nice to be able to work on glamorous tasks creating beautiful user interfaces or intricate algorithms but there are a number of less fun yet equally important tasks that are also required to set up teams to succeed in building great software.
I quite enjoy the supporting tasks creating tools and documentation to help the teams I work with to help gear everyone up for success. It means we have a better culture for collaboration on ideas and designs, and we have an easier time troubleshooting problems later when they inevitably happen.
What does my day to day look like?
A significant amount of my time is spent looking at code whether that’s writing code myself or reviewing code for my coworkers. Depending on what task I’m working on, the code I write can be in one of a number of different languages; Kotlin or Java if I’m working on Android, Python if I’m writing scripts to automate tedious jobs, or Bash if I’m trying to improve the working environment on my laptop.
Once I’ve completed writing a piece of code and I’m happy that it’s working as expected then I’ll submit that code to be reviewed by other engineers so they can give feedback which I can address by either implementing their suggestions or give my reasons for why it should remain the way I wrote it. I’ll also provide this same feedback on code submitted by others, trying to give constructive feedback that is possible to take action on or sharing knowledge on nice ways to improve code if I have advice to give.
My days will typically have a few meetings some of which are recurring and others which pop up as the teams work on new initiatives. Recurring meetings include things like “standup” where the team huddles up for 15 minutes to discuss what each person was doing yesterday and what they’ll do today, or “planning” where the team will discuss what tasks need to be prioritised to reach our goals. Other meetings can be 1-to-1 sessions with managers to talk about progress and performance, sync ups with other teams to share knowledge between projects, or organisation wide meetings to hear news about the company.
Occasionally I will also hop into video calls with other engineers to “pair up” on a piece of code that might be particularly nasty to work on or just has the person stumped. Code is a difficult thing to understand sometimes and it can be very easy to miss a very simple mistake which will cause nonsense problems to happen and it’s good to have a buddy to step through the work and spot out the issue.
What advice do I have for studying computer science?
Practice your basics beyond what you’re asked to solve for assignments. Keep a scrap project where you create a new file to tinker with any time you learn a new topic and be curious about exploring what you can do with it. For example if you were looking at loops then try putting loops inside each other, try looping backwards, or try skipping every second item. I noticed from people in my class and from teaching that a lot of people didn’t practice early and by the time they reached 3rd and 4th year they were lacking the foundational knowledge that the complex topics build upon later.
Don’t be afraid to ask questions in class. It’s a scary thing to ask a question in a classroom full of people but remember that you’re in a room full of people also learning these things for the first time so it’s almost guaranteed that someone else there is also wondering the same thing and they’ll be thankful somebody asked. Don’t be embarrassed about sounding silly sometimes, you’re there to learn for yourself so don’t mind what the others think.
Start some side projects to use the tools you’re being taught. Build a simple website showcasing your favourite band, or a program to create D&D characters, or challenge your friends to see who can build Snake over a weekend.
What advice do I have for dealing with stress in college/work?
College can be stressful when you have numerous assignments all on the go at the same time so it’s important to plan out your work and keep on top of deadlines to minimise the amount of stress you experience. Using project management tools such as Trello can be beneficial for keeping a timeline of your assignments and your progress for each of them.
When working on a particularly complex assignment you can sometimes find yourself stuck looking at the same few lines of code for hours not really grasping how things work or why they are broken. In moments like these it is vital to take breaks and do something else to relax and take your mind off the code. This can be playing some music, or solving a puzzle, or going for a walk and it gives your mind a chance to work on the problem in the background so when you sit back down you can sometimes see things you missed before.
Take advantage of any learning support or mental health facilities your college offers. Struggling with a difficult concept in programming can sometimes be remedied by having a tutor explain the topic from a different perspective or with alternate examples. Dealing with a lot of stress can take a toll and talking it through can help so if your college offers mental health facilities then you should absolutely make use of them.
What advice do I have for getting started with a career in software?
Build up your LinkedIn and online project portfolio so you have a solid showcase for potential recruiters to browse. Github is a popular place for people to show off their projects but alternatives could be Bitbucket or Gitlab. As you’re working on college projects, back them all up to Github with a well written README so anybody looking around can get an idea of the project, how it works, and why you built it.
When looking around for internships and graduate roles don’t be afraid of failure. Getting a “no” is not the end of the world but instead provides you with an opportunity to learn from your mistakes for the next interview. When applying for internships during my 3rd year of college I did interviews in 7 different companies before getting an opportunity in Zendesk. Each time you get a rejection you should reflect and ask yourself “what questions did I struggle with?” or “how could I have better described my projects?” so that each time you get stronger in the interview.
Having given this same talk a few times in my old college I’m glad to have finally written down my responses so that I can share it to others that might get some value out of it. Next year when I’m invited back then this should help serve as a good reference for any of the attendees that wanted to review the discussion and if there are new questions then I can use that as fuel for another post!