My former-former-former colleague Mikael Lundin wrote up a nice list of 100 interview questions for software developers which I thought it would be fun (for me) to write answers to and document my standpoint at a certain point in time.
How do you prefer to version control your code?
Git (on Github) is what I’ve been using for the past 12-isch years and I haven’t had any super compelling reasons to look elsewhere.
Do you follow any known patterns of version control?
What does continuous integration mean to you?
A stepping-stone towards continuous deployment?
What is your definition of done?
In production. (Hoping that answer in the future would be somewhere along the lines of “an answer to some hypothesis for an experiment”)
How do you safely deliver code to production?
No manual steps. Automate, automate, automate.
How do you make your production environment reproducible in test and dev?
Not sure I do too much but containers and using the same external tools across all environments where it’s possible.
How would you start troubleshooting an issue only visible in production?
I would get an alert with relevant information about the error and steps to take to solve it via logs. If the alert and/or logs aren’t there add them after figuring out what happened.
Describe the steps involved for you to fix a bug
Read the error message. Try and understand what it means. Try to reproduce locally. Write tests, improve logs etc as needed so that the problem doesn’t happen again and/or is quicker to fix the next time.
What is the importance of git commit messages and how do you format them?
I don’t find them too important given our mob programming setup. That said, writing something semi descriptive usually isn’t that taxing but I don’t spend too much time on figuring out the perfect phrasing.
How do you roll-back a failed deployment to production?
More common to role forward than backwards but I guess it would involve re-deploying an older version of the container.
Production goes down because of a bad deployment. What would make you roll-back and what would make you roll-forward?
Typically I try to have my systems written in a way that makes it easy to roll forward and honestly I can’t really remember the last time I did a roll-back.
How do you manage assets that should not be committed to source control, like passwords or databases?
Databases/FTP:s etc running locally or typically running in containers for local development and passwords are .env files (not commited to git) locally and some form of secret manager in production.
Where do you think code ownership should lie?
With the team that is responsible for the code and are maintaining it.
When should refactoring happen?
Organically all the time. Nowadays I’m not sure what the difference between developing and refactoring is or if it’s an important distinction to make.
What code should be written by solitary programmers, and what code should be pair programmed or mob programmed?
Well I work in a full time mob and so far I like that best of the alternatives listed above.
What does quality mean for you?
Peace of mind.
How do you ensure quality in your delivery?
Writing tests and making sure it’s easy to quickly iterate and roll forward.
Who is testing your code?
My team and our users.
What does testability mean to you?
What quality measures do you consider low hanging fruit?
Hmm, depends on the what the thing is supposed to do and for whom it should do it. Happy users, unhandeled errors, response times etc.
Where do you draw the line between enough testing and too much testing?
Depends on the system. If it’s very painful if an error reach production I can live with a “too much testing” slower test suite for a higher degree of confidence but for systems where errors are easy to manage after they reach production the line for enough testing typically is drawn pretty quickly.
Mention what statical code analysis tools you use
Do you write tests first, after or at the same time as the code?
What is your opinion on integration testing?
Best test(s) for building confidence that the system is working as intended
How do you deal with a test suite with brittle tests that require much maintenance?
Hmm, similar answer to the ” line between enough testing and too much testing” question. Naturally I can invest some time into making them as little brittle as possible but I can live with some UI-tests that I have to re-run sometimes (which is typically what people talk about when talking about brittle test right?) if once they pass I’m highly confident in the resulting release.
How can you improve quality by communication?
By having high quality communication.
How do you think that management can enable quality?
By engaging in conversations about what quality is for your context and how we can measure it.
How do you measure quality?
Depends on what quality means for your context.
What are your thoughts on technical debt?
A semi boring discussion that I’m not sure leads anywhere productive.
What is your favorite language and why?
Not sure I have a favorite. I write mostly .net and node.
What do you consider a good framework?
Something that provides enough for a good foundation and tries to be helpful and not in the way when you want to expand beyond that foundation.
What is your preferred way to document your code?
Readme.md, github wiki, code tours and code comments depending on what is to be documented.
How do you make your code readable to others?
In a mob this is an ongoing continuous process that happens all the time. If someone doesn’t understand we discuss and adapt accordingly. What I’ve found to be the best method of understanding written code is to be there when it’s written.
What do you consider maintainable code?
Code that is easy to change and perhaps more importantly, code that is easy to throw away.
What are your most used development tools?
What is the worst feature of your favourite programming language?
Working with json in .net is such a pain when compared to node for obvious reasons.
What is the most common programming error people do?
Building things that might not have to be built.
How do you typically handle errors in your application?
Depends a bit if the error affects a human or not. Best case scenario you can offer a way forward in some form.
Mention something you do to make your application secure.
Not trusting input.
What’s your suggestion to improve deployment frequency?
What’s your suggestion to reduce time from you start working on a feature until its available to users?
Limit work to that feature until it’s done, automated build, test and deploy process.
What can we do to prepare for a system to be restored faster, when it goes down?
Minimize the amount of manual steps needed to take to restore.
How would you propose we reduce number of releases that cause problems in production?
Look at past problematic releases and look for patterns and take steps to remove the root causes of the patterns identified.
How do you verify the impact of your feature in production?
This is something I very much would like to be able to give a better answer to in the future because today I’m not doing much beyond obvious things related to waiting for error alerts and keeping track of logs.
Where do you draw the line between development and operations?
Not sure if it’s an interesting distinction to make but personally I tend to loose interest somewhere around DNS-servers and different ip subnets so I guess that’s where operations starts for me.
How do you manage different configuration options for different environments?
See answer for “How do you manage assets that should not be committed to source control, like passwords or databases”
How can you as a coder make your service easier to manage for operations?
Communication, but in general terms I don’t see it as operations job to manage my services. That is the responsibility of the team that developed the service.
What are the things that you believe should be automated?
As much as possible.
What are the tools you need in order to deliver code to production once per day?
An editor, a terminal, a registry to deploy my container too.
Do trunk-based development contribute to better software delivery?
Not sure if I would say it’s better, I’m sure there are way better developers than me doing long lived feature branches or trunk-based but I know that I enjoy working in main-only branch flow much more than the alternatives.
How do we create predictability in our software delivery?
What’s required for you to feel inspired by your work?
A somewhat clear direction and freedom to choose how I move in that direction.
Which is your favourite cloud provider and why?
GCP but that is also the only one I have experience with.
What does cloud native mean to you?
What is your relationship with Kubernetes?
I like it. The good thing about having a dark past involving copy-pasting things on windows RDP sessions is that everything else feels so good.
What is your thoughts on serverless?
I like it. Perhaps more in theory than when I’ve used it in practice. That might be that I’ve used it too little and haven’t really find a flow of work that feels satisfying.
How do you measure uptime of your services?
I’m not really. Mostly because that isn’t a very interesting and/or important metric for the type of systems I’ve worked with in the last couple of years.
How do you collect telemetry from your services?
Everything writes structured logs to stdout/stderr and those get collected by StackDriver and, when applicable, gets visualized in grafana.
Mention a way to improve availability of your services
Handling retries on the service level (that is, if something fails, try to do it again and that usually takes care of a lot of “system wasn’t available for some 10 seconds” types of errors).
How do you monitor the services you have released?
Logs which can lead to alerts.
What would make you choose on-prem hosting over cloud?
Privacy, security and/or latency issues. Happy to say that this is not something I’m required to think about in general.
What is a good way of managing SSL certificates?
Have a good relationship with ops that handles that they exist and are not expired and setting up standard proxies that handles the cert and ssl termination so that my apps don’t need to worry about them.
What aspects do we need to consider regarding data protection laws?
Hard do answer in general terms but if you’re striving to save as little data as you can and make sure to have a automated process in place to clean up as much as you can that helps.
Agile Software Development
What is your opinion on Scrum?
Might be a good compromise to build trust but I wouldn’t want to work in such a low trust environment.
What is your opinion on user stories?
Haven’t actively used them in quite some time and I haven’t missed them.
What is the most common impediment for you to be able to do your job?
Figuring out what “my job” actually is in the given context.
How do you estimate correctly?
Typically there’s an underlying more important discussion to have that provides more value to all the people involved than some random set of days/weeks/months. After that discussion we typically agree on some form of estimate.
Which meetings do you consider necessary?
Do we as developers think too much about what meetings are necessary and too little on what code is necessary?
How do we make sure to maximize customer value?
By making it very cheap to quickly try things and see if these tries increase customer value or not. It’s also good if someone has a reasonable idea how to measure if the customer value has gone up or not.
What roles do you have in your optimal development team?
The people needed. Such a non-answer but I have no better answer.
What activities do you think a team should do to improve its delivery?
Retros and actually implement/change/fix things that are discovered there.
The team will not be able to deliver in time. What is your proposed solution?
It’s been ages since I worked towards a very fixed deadline but I suppose it would involve some figuring out what is the least important things in the release and start to shave things away until we’ve reach a more likely release bundle.
What do you expect from a project manager?
What does it mean to have a good team culture?
You can be who you are, the good parts and the not so good parts and it’s accepted and the fact that you can be vulnerable towards each other makes you a better team.
How do you follow up on progress in a project?
Continuous demoing and discussions with the involved parties.
What is your opinion on Microservices?
I like it. I think my brain is too small to keep the conceptual model of a larger monolith in RAM and I feel like the microservice approach is better suited towards how I think and visualize systems.
What is your opinion on SOLID?
Interesting to read and think about, horrendous topic for a conversation.
What is your view on ORM frameworks?
In my experience, more harmful than useful.
What does object oriented programming mean to you?
I write mostly in object oriented language, not sure I write too much in an object oriented style. Probably says more about me than anything else but I tend to try to be too clever with the OO things and have found it better to keep it simple and just write the simplest code that would work (which usually doesn’t involve inheritance etc)
In what capacity do you use functional programming?
Different takes of map/reduce feels like 80% of the things I do in my day-today work.
Where do you draw the line between refactoring and rewrite?
Hmm, I don’t think I do.
Where do you draw the line between buying software or building it yourself?
Haven’t been involved in a decision in this area. But I guess something along the lines of “part of core business” = write and the further away from that the buy-button would look more appealing. But there are so many more different aspects with complexity, size of company etc etc so it feels like a thing that would require quite some more context to answer.
What is your perspective on “best practices”?
A phrase that usually doesn’t mean anything because the context in which it is a “best practice” is usually not known.
How do you document your software design?
Similar answer as to the question What is your preferred way to document your code?
What tools do you use to design your software?
Pen and paper if alone, whiteboard if we’re multiple people in the same place and powerpoint via some screen share if remote.
What technological advancement do you consider a fad, and expect to be gone in 5 years?
If we could dial back on the IoT I wouldn’t mind it but it doesn’t seem likely to go in that direction.
How do you think we’ll be writing software in the future?
Given the reaction of github co-pilot it will be interesting to see what, if any, impact that service or similar ones will have for the industry. I’m also interested to see how much will have changed remote friendly-wise now that the pandemic seems to be nearing an end.
What will be the major challenges for our industry moving forward?
Major challenges (insert salute emoji once it’s accepted). Probably the same challenges we face today, we tend to build too much software in a too complicated manner.
What do you think will happen with Machine Learning and AI?
Sadly I’m way too inexperience in this area to venture a guess.
What technology would you like to specialize in?
Can’t think of anything concrete.
What technologies would you like to learn to broaden your expertise?
I would like to learn more about basic statistics and some of the math behind ML.
If you were not a software developer, what would you be doing instead?
I’m not talented enough for either of these but I’d like to have been working with music for games or be a baker.
What is, your opinion, the worst mistake done in history of computing?
No idea. This wasn’t great.
What do you think is the most important traits/qualities for a developer to have?
How do you contribute to a good team culture?
Being curious about other people, actively suggest and be part of activities that build culture.
What is required for you to feel satisfied with your work?
A somewhat clear purpose and confirmation that I’m doing something right.
What can we do to prioritize diversity and promote an inclusive environment?
Not sure I have any good suggestions.
How do you learn new skills?
I learn best when I get to learn by applying the skills to an actual problem, so a real (work) problem is usually the best setting.
What does ethical coding mean to you, and how do you write code responsibly?
I’m not sure I am an ethical coder and I’m not sure that this is best solved with all coders simultaneously deciding to be ethic but rather by laws and regulations. I realize this sounds like a cop out from not taking any personal responsibility.
Does a software developer have to know how a computer works?
For many of the coding tasks that we have today, not really. Would it make them a better coder? Possibly. Would that knowledge be the best ROI regardless of what type of systems you’re working on? Probably not.