For even more questions, jump to the following sections:
- On careers in tech
- On software engineering
- On the internship search
- On technical interviewing
- On miscellaneous questions
or begin by reviewing the top questions below!
With regards to software engineering internships, what topics should we know in advance aside from data structures and algorithms that are supposed to be learned outside of class when it comes to the coding interviews?
Check out this internship interview guide for all the details as explained above. Specifically regarding things that are important and would need to be learned outside of most traditional CS classes in college:
- Real-world Javascript programming. Specifically using frameworks like React and jQuery. Javascript is used universally for building website front-ends and can now be used to build web application back-ends as well using Node.js.
- Native iOS and/or Android. Specifically building and shipping native mobile apps for either iPhone or Android. Best if you are building your own app ideas and push them to the Play Store or App Store. Bonus points if you get your friends using them.
- Web Back-end Development. We recommend you check out how to build web application back-ends (server-side development) using a language such as Node.js or Ruby on Rails
- UNIX / Command-line. You’ll want to explore how to use the command-line in various ways especially on the UNIX platform. You’ll be really glad you are comfortable with UNIX.
- Version Control / Git. You’ll want to explore using version control systems such as Git to store and track your code. Bonus points for using Git to build a project with a few friends.
- Software Deployment Part of being a full-time engineer, familiarizing yourself with the processes and tools of making the application work on a target device, whether it be a test server, production environment or a user's computer or mobile device is an essential skill.
You can check out our skills and knowledge tree for a more detailed look. Note that no one is going to become an expert at everything, this is not a checklist to complete. Instead, focus on exploring the areas that are most interesting to you, and enable you to develop projects.
I would like to learn about building a good personal brand and network for a successful career as a Software Engineer.
Although many students don’t start thinking about developing a personal brand and networking in the technology industry until later in their career, there are many ways to do that. Here are a few ways to get started:
- Take CodePath classes, as many as you can 😄 _**_and meet mentors and students through these programs. Become a student leader, and teach other students to push forward your mastery.
- Start a blog (or post on medium) where you share concepts and journal concepts you are learning. Cover anything you find interesting as you learn. Later when you look back, you’ll be glad you did.
- If you can, consider attending nearby hackathons. Hackathons are a great way to meet and talk to people from various companies. You can even try to meet one of the event organizers.
- If you can, find a way to attend software conferences or events nearby. You can often find events on meetup.com or even on your campus.
- Contribute in small ways to open-source online to build up your real-world skills and learn from top engineers in the industry. (Explained more below)
You can find a more detailed write-up about developing your professional network here. Be mindful that no one achieves all of these things at once, and this is not a checklist to complete. You may find you dislike hackathons, or dislike certain clubs or meetups. This is entirely normal, explore around and find what works for you.
As mentioned in the previous question, side projects outside of class work of all types can be a great way to differentiate and deepen your experience and signal to companies that you will be a good fit for an internship. Projects might include:
- If your university supports this, getting involved with research projects can be great too. In particular, anything involving: AI / Machine Learning, Uniquitous Computing, Data Science / Visualization, Graphics, etc. Whatever you are drawn to learn more about.
- Participating in a hackathon and building a prototype of any web or mobile project with a group
- Developing a functional iOS or Android app around an idea and executing it all the way to publishing on the App Store or Play Store. Bonus points if you get some people using it.
- Contribute in small ways to open-source online to build up your real-world skills and learn from top engineers in the industry. (Explained more below)
You can pick any of these ways or many others to start building your out of class project portfolio. Make sure that you list and describe the most notable of your projects on your resume and your LinkedIn, and put the projects onto Github with a clear README describing the project where feasible.
Ideally of course, you’d want to do some of both over your time in school. When going onsite for your first technical internship, you’ll want to make sure you feel prepared for the standard technical internship interview outlined which will often involve some coding questions (most often around Linked Lists, Trees and Graphs).
However, the side projects you work on, and the experience those projects provide you will both help you differentiate yourself to recruiters when you apply and also make you much better prepared to contribute once you’re in a software role.
We realize that finding the time to do well in your classes, study for technical interviews, and also work on side projects, among the many other responsibilities you may have can feel like a near impossible task. The most important thing is to have patience, remember that you don’t have to try to do everything at once, and you don’t need to check every box. This isn’t a race, it’s a long marathon, and being an engineer is about life-long learning. Try to take career development one step at a time.
Open-source projects are free open code projects that anyone can use or contribute to from anywhere in the world. At the heart of most modern software development is the community of open-source projects. The practice of building and maintaining open source software works because people from all over the world, of all levels, abilities, and backgrounds, form communities to support the projects they care about.
{% content-ref url="../contributing-to-open-source.md" %} contributing-to-open-source.md {% endcontent-ref %}
Check out our guide to contributing to open-source here to learn more!
There are a number of different broad categories of skills and knowledge within the software engineering discipline:
- Team Collaboration and Cooperation - How to work well with a team, be a good team member, coordinate your work with other engineers and resolve conflicts.
- Data Structures and Algorithms - How to store and organize data in different ways and then solve many different types of problems using code.
- Technical Interviewing - How communicate clearly as you think through solving problems, asking the right questions, analyzing efficiency, and verifying solutions.
- Software Design Patterns - How to structure and design code in order to make sure the code is high quality, well-organized, easy to understand and easy to change over time.
- System Architectures - How different software systems all fit together and how to design them in order to be reliable, maintainable and efficient.
- Development Workflows - How to do specific processes common to writing software such as debugging when things go wrong, searching for possible solutions online, working with Git or other version control and more.
- Stack-Specific Knowledge - Knowledge of how to build things using particular technology and languages. For example, building iOS or Android apps, building web servers with Ruby on Rails, or writing Javascript.
You can check out our skills and knowledge tree for a detailed look at exactly the types of skills, knowledge and workflows you will develop over the course of your career as a software engineer.
While there is definitely some math involved in most Computer Science degrees in school, you might be surprised how infrequently many software engineers use math. There’s certain things you will encounter a lot in programming of all types such as boolean logic (if this, then that), arithmetic (addition, subtraction), percentages and fractions, basic algebra concepts (variables), etc.
Outside of those basic math concepts above, the amount of math you need in software engineering is entirely determined by what you are building and doing. There are many successful engineering roles such as web app development, front-end javascript, and mobile development that requires little to no math.
Certain other focuses such as game development, physics engines, data science, machine learning, artificial intelligence, inventing your own algorithms, etc. can require significant math. Ultimately though, you can decide how much math you want to use based on what you choose to do.
For more details, check out this post by Sarah Mei called Programming is NOT MATH.
At a high-level, the following software engineering domains are most common within the tech industry:
- Web Front-end (HTML/CSS/Javascript)
- Web Back-end (Ruby/Python/Node.js)
- Mobile Engineer (iOS/Android)
- Graphics/Games (OpenGL/Unity)
- Data Scientists (SQL/Python/R)
- DevOps and Infrastructure (Jenkins/Docker/Kubernetes)
- Embedded Systems Programming (C/C++/Assembly)
- Blockchain Systems Engineer (C/C++)
- Security (Python/Ruby/C++)
- Desktop Software Development (Windows/Mac/Linux)
- Software Testing Engineers (Selenium/Expresso)
For a more detailed breakdown of roles within the software industry, check out our software engineering roles guide.
Working as a software engineer is a broad space, and you can work in all sorts of different and interesting ways depending on the company and the team. However, here are a few things to keep in mind:
- If you enjoy collaborating a lot with others, being a software engineer can be highly creative, working closely with other engineers, as well as designers and product managers to craft a product that users love.
- If you are interested/enjoy design, as a front-end web engineer or UI engineer, there can be a lot of design work involved. Lots of illustration and design, colors, use of space, placement and layouts.
- If you kind of like to keep to yourself, and stay heads down working on the code, working quietly and thoughtfully, there are roles where you can work uninterrupted or even work remotely from home. You can work on teams where in-person meetings are infrequent, and your communication happens largely through email and Slack.
- If you are interested in helping people or social impact, you can work with non-profits or startups that work on cool ways to make the world better in various ways. You can have a lot of control over product decisions, and get to meet with users to improve your product.
At the end of the day, there are so many different companies, teams and software engineering roles, that you can find a work environment that fits almost anything you are looking for. The trick is learning about yourself and your preferred work style and then finding a company/team that is a good fit for your preferences. Don’t worry too much if you don’t know yet what you want, experiment with different environments in order to learn.
The following provides a rough cheatsheet of the various technical areas as a software engineer, and related languages/frameworks:
Technical Area | Related technologies/keywords |
---|---|
Web Front-end | Javascript, jQuery, Angular, React, Ember, HTML, CSS, Bootstrap |
Web Back-end (Startup) | Python, Django, Flask, Pylons, Javascript, Node.js, Express, Sails, Ruby, Rails, Sinatra |
Web Back-end (Enterprise) | Java, J2EE, JEE, Spring, Struts, Play, Grails, Scala, Lift, Go |
Web Back-end (Other) | PHP, Symfony, CakePHP, Zend, C#, ASP.NET , .NET, LAMP |
Mobile (Android) | Kotlin, Java |
Mobile (iOS) | Swift, Objective-C |
Mobile (Web) | React Native, Javascript, Cordova, Sencha Touch |
Data Science | Python, R, Matlab, NumPy, SciPi, TensorFlow |
Desktop | Javascript, Electron, WPF, Cocoa, wxWidgets, Kivy |
General | C, C++, Go, Assembly, Rust, C/C++, VHDL, Verilog |
This is intended to give you a rough sense of the technical landscape, and by no means is comprehensive. There are hundreds of active programming languages and frameworks still being used today across the world.
Many students are unaware of a big challenge among software engineers that people rarely talk about openly. The challenge is called “Impostor Syndrome”, which is defined as a “collection of feelings of inadequacy that persist even in face of information that indicates that the opposite is true. It is experienced internally as chronic self-doubt, and feelings of intellectual fraudulence”.
This often manifests as the thought that you might not “be cut out for being an engineer” or “I’m not a real engineer” or “I am less talented than other people around me”. The most important thing to be aware of is that this is actually an experience that the majority of engineers encounter many times through their careers. If this happens to you, the first part is knowing you are not alone:
How can I deal with this? Be sure to read about and understand impostor syndrome. This other guide focuses on overcoming impostor syndrome.
Software engineering is both a creative and technical skill, and as with any skillset, this can take time to pick up for anyone that’s new. Anyone willing to put in the time and that enjoys building digital things can succeed as a software engineer. Remember that the field is incredibly broad and there are so many good paying roles out there. Bottom line is that this feeling is much more common than you think, and there are so many available opportunities, that there is a place for everyone that wants to be there.
For even more questions answered, jump to the following sections:
or begin by reviewing the top questions below.