My first two weeks at NerdWallet has really highlighted the stark differences between studying computer science at school and joining a relatively large Engineering team with strong existing infrastructure. While I have learned a lot from Penn, I have learned more in these past two weeks than in any two week stretch at Penn.
Some Takeaways from Penn
- Algorithmic Thinking: Classes that focus on algorithms are both the hardest and the most fun classes that I have taken at Penn so far. They taught me how to attack problems at a high level using a small but powerful set of techniques, expecting that should I need to write up an actual program to solve a problem, I could learn that myself.
- Extensive Testing: Many of my classes required that I write all my own tests for any homework project, and so the only way to ensure a good score was to think about and test every possible scenario.
- Hardware: Understanding how a computer works now makes me think about many little changes I can make to my code to improve runtime.
New Learning
- Databases: Despite the fact that database interaction is a central part of any large scale modern application, none of the core classes at Penn taught it. I had to spend a lot of time familiarizing myself with the general database structure, understanding migrations, and more. You can get started with learning about databases here.
- Security: This is the first time I’ve had to learn how to deal with sensitive information. It’s great to learn about encryption, secure login features, and how to provide different functionality to different users depending on their roles. You can get started with security here (Start with the post at the bottom of the search and work upwards).
- Prioritizing Projects: The key learning here is that there is always something new to work on. This means that there is a tradeoff between making an existing feature perfect and using that time to build a new feature for consumers to enjoy. I haven’t found good material for this from a software engineer’s perspective so look out for a future post on this.
- Changing Requirements: Requirements are always subject to change. This could be something small, like the addition of a new feature, something medium sized, like updating for compliance, or something large like a total redesign. This has two significant consequences - we need to write code that can easily be changed without breaking anything (learn about important Software Design Principles), and we need to be aware of how often we have the ability to update our application. With web apps, there’s little turnaround time - perhaps we just have to wait till 3am when traffic is low for our next deploy. However, with mobile apps, we need to get through the App Store Review process which constrains our ability to push updated versions quickly. Look out for a future post on this, too.
School Teaches you How to Learn, Not What to Do
Computer Science at school is hard. It pushes you to your limits. But that is the beauty of it. After getting through those tough circumstances, we should be confident in being able to go through the rapid learning needed to onboard successfully into a tech company. Of course, it would be even better if we had exposure to many of these topics before joining a company.
Build Projects with your Friends
I was always hesitant to start my own large scale projects - they seem like daunting tasks and it is difficult to find the time to devote to something large amongst everything else that is happening at school. When I head back in the fall, I am going to work on a couple of ideas I had, but I think it is important to find a friend or two to tackle the project with. Working on something I believe in with a team of people I can trust seems like extremely valuable learning (dealing with source control, blocking, contrasting ideas etc.) that will stand me in good stead for my next role.