I have had the chance to work for a few companies by now and every time I moved on to the next one I tried to make the best choice.
Sometimes it meant going through a grueling 10 or 20 interviews, each of them made up of 2-3 rounds, before finally settling on something.
Sometimes I managed to find great companies to work for by pure accident and stayed with them for a long time while other times I managed to screw up royally by picking carefully. Here's what I've learned so far:
An interview must be fair. If you are being scrutinized for 3 interview rounds and only get to ask a few questions at the end, you end up knowing nothing about the company you're going to work for. A fair interview is a 2 way street where you should ask as many questions as you are asked. Some companies will refuse such an interview style, it's best to avoid them.
Here are the questions you can ask to avoid common pitfalls:
1. Some companies will not sponsor you to learn, go to conferences and grow as an engineer. Ask if they have a training budget, and how big it is. Let them make a commitment.
2. Some companies will want to help you and appreciate you, but will never have a sustainable business model, or are about to run out of money. Always ask about the financial state of the company, future prospects. Make an informed decision, dont put yourself in the situation of your employer going bankrupt.
3. Some companies will need to hire marathon developers, that is they take a farm-like approach to software development. Ask about work life balance and what kind of people they hire.
4. When you are asked about disputed technology subjects (Such as Storyboards, Autolayout, Swift vs ObjC) always ask the same questions back. You want to find out if your technical choices match those of your colleagues, and see if you can fit in. Maybe you're completely incompatible.
5. Ask about working hours and how they are enforced, ask about paid holidays and benefits. Get a clear picture of what is expected of you and compare with what you expect. This is to avoid companies that nag you about every 5 minutes that you missed, or the lunch that took too long.
6. Ask about the ages, skill sets and types of developers you are going to be working with. Evaluate the team against yourself, ask to talk to them if you feel like you need it. This is to avoid joining a team that is made up of developers that are the opposite of you (Examples being joining a conservative team, when you're a bleeding edge developer or viceversa)
7. Ask about the tech stack they make use of, check how open they are to change by asking if they would like to introduce something new into their pipeline (like Swift). Ask if the product is up to date with platform standards and innovations and if they practice continous deployment/ continous integration. This to avoid companies that have very old products with a lot of technical debt, and a huge maintenance burden but hide this detail from you during the interview.
8. Challenge the company to answer questions about unit and integration tests, if they have them and if not why not?
9. Interview the developers of your employer as if they were going to work for you. Do so politely, but make sure to have an opinion about them. This to avoid joining a team that you cannot learn from.
10. Ask about future career growth. Sometimes companies are looking for a developer for 3 months and they need to let you go after. Know what your future holds.
11. Ask if the company has weekly tech sessions where they share knowledge, ask if they are open to having them. In general sharing knowledge and learning helps you grow, and companies that say they don't have time for such things are to be avoided. Work smart not hard.
12. Ask about recent leaves and joiners in the team. You want to avoid places where everyone is leaving from, and you're brought in to extinguish fires. Ask how long people stay in the company for, ask for examples.
13. Ask how decisions are made in the team, and who ultimately holds decision power. You want to work in a team where every engineer is able to make choices, not dictated from the top. You can gauge this by asking who dictated specific technology and tools for the team to use. Challenge them to see how they react.
14. Take a step back when the company, it's employees or it's practices seem to be immature or unprofessional. There's always another company that you will fit just fine in.
15. Always interview well in advance, even if you're not planning to switch jobs immediately. Know what's opportunities are out there for you and don't allow yourself to be blackmailed with job security (IE: We're not giving you as much as you deserve because we know you don't have the courage to leave)
16. Read on glassdoor what employees have to say about the company. Sometimes it's great stuff, other times it's awful.
At the end you should know as much about your future team mates and employer and the culture inside the company as they do about you.
This guide does not speak about what you must do as developer to impress the company. It only helps you evaluate the company you are going to work for. Too many people go into companies knowing very little about them, and employers design interviews in such a way that they find out every detail of your work/private life while it takes you a few months of working there to figure out if you really want to be working there. A fair interview should give both you and your possible employer a clear picture.