---
image: https://i.imgur.com/tFW9IxW.png
---
# Software Engineering - Common Questions Answered by CodePath.org
## Internship Search
### How do I prepare an effective resume?
Check out our [building an effective resume guide](https://tinyurl.com/codepathresumeguide) for a detailed look at the most important tips and tricks.
### How does one become a software engineer or get themselves to that position?
If you are still in college, becoming a software engineer [starts with a technical internship search](https://medium.com/@seaon/3-step-guide-to-nail-your-internship-search-82ed58f7f6a). Check these articles for a bunch of specific details and steps on getting started.
### Where can I find lists of companies and open software development internships and roles?
If you are interested in finding software companies that are looking for software engineers for full-time roles and internships, check out this list of [places to find software roles online](https://tinyurl.com/findsoftwareroles). This is a great way to explore the types of software skill-sets companies are most often hiring for.
## Technical Interviewing
### What topics do I need to know in order to pass common technical interviews at top tech companies for internships or as a new college graduate?
Technical internships or new college graduate roles often have the following:
* Technical coding interviews (data structures and algorithms)
* Past experience interviews ("what have you done")
* Domain-specific interviews ("what do you know")
Check out this [internship interview guide here](https://hackmd.io/s/HJN9k17sm) for a look at all the details on how to prepare and what to expect.
### What courses on campus should I be taking while I am in college that are most important after I graduate?
There are many foundational courses which are important as you go through your CS program. In particular, here are some classes and topics you'll be glad you paid extra attention to:
- **Data Structures and Algorithms.** Used in various ways and for technical interviews.
- **Object-oriented programming.** Used almost everywhere.
- **Functional programming.** Concepts such as callbacks and closures.
- **Databases.** Any class on schema design and databases or SQL.
- **Data Science / Machine Learning** (for data science roles)
- **Regular expressions** (useful all the time)
- **Compilers** (good foundational parser knowledge)
- **Network security.** Buffer overflows, XSS, SQL injection, etc.
- **Operating Systems.** This includes memory management, schedulers, etc.
- **Project Management.** Anything related to managing technical projects.
### What kind of qualifications, qualities, skills, or knowledge, do companies look for in interns/prospective employees?
Much of this is already covered in the other answers. It is important to know at least one language really well and to have applied this language in a context outside of class. Companies love finding interns and college hires who are excited about working there and that have side projects or previous software experience.
## Career
### 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](https://hackmd.io/s/HJN9k17sm) 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](https://medium.freecodecamp.org/everything-you-need-to-know-to-get-started-in-react-11311ae997cb) and [jQuery](https://jquery.com/). 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](https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs) or [Ruby on Rails](https://www.railstutorial.org/book/beginning)
* **UNIX / Command-line**. You'll want to explore how to use the [command-line in various ways](http://matt.might.net/articles/basic-unix/) 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](https://www.elegantthemes.com/blog/resources/git-and-github-a-beginners-guide-for-complete-newbies) to store and track your code. Bonus points for using Git to build a project with a few friends.
You can check out our [skills and knowledge tree](https://codepath.hackmd.io/s/BkPikCsQN) 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](https://codepath.org/classes), as many as you can :smile: 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](https://medium.com/)) 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](http://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](https://codepath.hackmd.io/s/S1lXTRJVV). 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.
### What kind of projects would look good on my resume or help me get an internship?
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](https://github.com) with a clear README describing the project where feasible.
### Should I focus on side projects more or focus my efforts studying for technical interviews?
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](https://hackmd.io/s/HJN9k17sm) 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 responsibilites 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.
### How can we contribute to open source software and how do we approach or get started?
**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.
Most open source projects don’t have a dedicated staff to support them. Instead, developers and users from around the world work on them, often in their spare time. For many programmers, though, the thought of contributing to open source projects seems too difficult and time-consuming. They think that you have to be a programming genius blessed with unlimited free time to make a meaningful contribution.
That’s simply not true. Successful open source projects thrive on a wide variety of contributions from people with all levels of coding skills and commitment. Any time someone fixes a compiler warning, closes a bug, or adds to the documentation, progress is made. Put a lot of those contributions together and great things can happen.
Here's a few great resources for getting started in open source as a beginner:
* [The Beginner's Guide to Contributing to Open Source Projects](https://blog.newrelic.com/engineering/open-source_gettingstarted/)
* [Beginner's Guide to Contributing to Open-Source](https://www.natashatherobot.com/beginners-contributing-to-open-source/)
* [How to contribute to open-source](https://opensource.guide/how-to-contribute/)
* [How to make your first open source contribution in just 5 minutes](https://medium.freecodecamp.org/how-to-make-your-first-open-source-contribution-in-just-5-minutes-aaad1fc59c9a)
* [How Junior Developers Can Contribute to Open Source Projects](https://rubygarage.org/blog/how-contribute-to-open-source-projects)
* [First Timers Only](https://www.firsttimersonly.com/)
* [Getting Started in Open-Source](https://www.hackerearth.com/getstarted-opensource/)
## Software Engineering
### What are the types of skills and knowledge required to be a great software engineer?
There are a number of different broad categories of skills and knowledge within the software engineering discipline:
1. **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.
2. **Data Structures and Algorithms** - How to store and organize data in different ways and then solve many different types of problems using code.
3. **Technical Interviewing** - How communicate clearly as you think through solving problems, asking the right questions, analyzing efficiency, and verifying solutions.
4. **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.
5. **System Architectures** - How different software systems all fit together and how to design them in order to be reliable, maintainable and efficient.
6. **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.
7. **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](https://codepath.hackmd.io/s/BkPikCsQN) 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.
### Do I need to enjoy and be good at math if I want to be 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](http://www.sarahmei.com/blog/2014/07/15/programming-is-not-math/).
### What are the different domains of software engineering that are relevant in industry?
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](https://hackmd.io/s/ByaoRR9Z7).
### What is it really like working as a software engineer day-to-day?
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.
### What languages or frameworks are most popular in the tech industry?
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, Javacript, 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.
### How do I know that I have "what it takes" to be a software engineer?
Many students are unaware of a big challenge among software engineers that people rarely talk about openly. The challenge is called "[Impostor Syndrome](https://product.hubspot.com/blog/engineering-challenge-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](https://product.hubspot.com/blog/engineering-challenge-impostor-syndrome). This other guide focuses on [overcoming impostor syndrome](https://medium.com/learn-love-code/developers-how-to-overcome-imposter-syndrome-48edee803cf4).
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.**
## Miscellaneous
### How can I build up my programming fundamentals in Java?
Chances are that you will be introduced to Java, Python, Lisp, and/or C++ in school at various points over your 4-years in college. Often, you might take a 101 intro class that starts you off with one of these languages. If you feel that your understanding of Java or other languages is lacking, this is nothing to be worried about, it's very common for you to need to reinforce the concepts learned in class through additional online resources before having a deeper understanding. If you are interested in diving deeper with Java, check out our [Diving Deeper with Java](https://hackmd.io/s/SyyXX9Lom) resources for a good place to start.
### Before graduating college, how important is your GPA as opposed to side projects in acquiring your first internship?
If you have a strong GPA, make sure to list that on your resume. Include the higher of your cumulative GPA and your major GPA. If they’re both less than 3.5, leave them off your resume entirely.
The importance of GPA depends on the company. Generally speaking, even if you don't include your GPA on your resume, this will not be asked about and won't prevent you getting an interview. Having side projects, hackathons, and other interesting real-world portfolio pieces will often provide you more impact in many cases than a high GPA. Of course, your mileage may vary and it never hurts to get good grades.
### Does it matter to companies if your CS Degree is a BA or a BS? Does it have any impact at all? And also what about a BA/MA and not a BS/MS?
If you can pick and have the option, you may want to go with the BS. But for the most part, a computer science degree is a computer science degree and many companies/recruiters won't differentiate. Some employers favor a BS degree because it is often more difficult and requires higher level math and sciences. **Bottom line is that you will be able to find great technical software engineering opportunities either way.**
### I'm studying something other than Computer Science, but I enjoy software stuff. How likely is it for non-traditional majors to slide into software roles?
["Software is eating the world"](https://a16z.com/2016/08/20/why-software-is-eating-the-world/). There is software powering every other modern professions. In addition, more and more companies are open to hiring STEM majors who are not Computer Science majors, especially if you have side projects and a Github profile. **In this case, your project portfolio is even more important. Be sure to work on side projects.**
-----
:::success
:wave: This guide was originally authored and adapted by Nathan Esquenazi as part of the services offered to students through CodePath.org, a 501(3)c non-profit dedicated to forging an accelerated pathway into the tech industry for all university students.
Special thanks to the many students, recruiters, and professional engineers that provided feedback and made this guide possible!
:::