Tell us about a design decision you made that you later regretted. What did you weigh at the time, and what would you do now?
What they're testing: Reasoning about trade-offs honestly and learning from a decision that aged badly.
Updated 5 October 2026 by Ben Gallagher. Sources below.
This page covers software engineer and software developer interviews; the two titles mean the same job in most advertisements. The government framework and NCSC guidance described below are UK sources and are labelled; OWASP is international. Software developer panels rarely stop at what you built. They want to know how you debug a fault you cannot reproduce, what you do when a release corrupts data on a Friday, how you argue about a pull request, how you guard against unsafe input and how you give an estimate when you do not know the answer. Prepare real projects and say what you measured, what you changed and what went wrong. Technical rounds may add live coding or a take-home task, so check what the advert says.
Try these questions free
These are common questions for this job, but your panel will also ask about you. Sign up for free to get questions personalised to your interview, written from the job advert and your CV.
What they're testing: Reasoning about trade-offs honestly and learning from a decision that aged badly.
What they're testing: Making safe changes to unfamiliar code: characterisation tests, small steps and asking the right people.
Do not change it blind. First learn what it does by reading it, running it and talking to anyone who knows it. Add tests that capture its current behaviour, then make the smallest change that delivers the feature, and leave the code a little clearer than I found it.
I inherited an invoicing module with no tests, and I had a week to add a discount rule. I read through it with the debugger and wrote down what each function took and returned. Then I wrote tests around the existing behaviour, using real invoices from last month as examples, so I would know if I changed any totals. That took two days but gave me confidence. I asked the developer who had worked on it last for twenty minutes, and she warned me about a rounding rule that was not documented. I added the discount in a new small function, called from one place, and ran the tests. I left a short note in the readme explaining the rounding rule and the new tests. The change shipped on time and the finance team found no differences.
What they're testing: Measuring before changing: profiling, queries, data volume and reproducing the slow case.
Measure before changing anything. Reproduce the slow case with the affected customer's data, look at the query plan and time each part of the request. Common causes are missing indexes, large data volumes or repeated queries, but I would find the evidence, not guess.
A dashboard loaded in a second for most customers and eight for a few. I asked support which customers were affected and found they were the ones with the most orders. I reproduced it locally with a copy of one account's data and turned on query logging. A single page was running over 400 queries: for each order it fetched the customer's addresses separately. With few orders, nobody noticed. I confirmed it with a profile before changing anything. I replaced the repeated queries with one query that fetched all addresses for the page and added an index on the foreign key. The load time for the largest account fell below a second. I wrote a test that checks the number of queries for a page with fifty orders, so the problem cannot return unnoticed, and shared the finding in the team channel.
What they're testing: Designing for consumers: clear contracts, versioning, errors and backwards compatibility.
What they're testing: Weighing build against reuse, including security, maintenance and dependency risk.
What they're testing: Linking technical debt to delivery risk and agreeing priorities with a non-technical owner.
What they're testing: Containing harm first, communicating clearly, then fixing and reviewing, without panic.
Stop the harm first: roll back or switch off the feature, and tell the people who need to know. Then work out which records are affected, plan how to repair them, fix and test the cause, and hold a blame-free review. Do not start debugging live while the damage continues.
On a Friday afternoon, support told me customers' delivery addresses were being overwritten after a morning release. I told the team lead in our channel that I was investigating, and asked for the release to be rolled back, which took ten minutes. That stopped new damage. Next I queried the audit table to find affected records: about 300, all updated by one endpoint. I wrote a script to restore addresses from the previous day's backup, tested it on a copy and had a colleague review it before running it. The cause was a missing condition in an update query that I had reviewed but not tested against partial updates. I added a test for it and fixed the query. On Monday we reviewed what let it through, without blame, and added a check to the release process for data-changing endpoints. I emailed the affected customers through support.
What they're testing: Systematic investigation: logs, environment differences, data and asking better questions.
What they're testing: Owning your part and focusing on how the system allowed the failure.
What they're testing: Treating flaky tests as a defect: finding the cause instead of normalising the noise.
What they're testing: Separating principle from preference, using evidence and agreeing a team convention.
Find out whether it is a principle or a preference. Ask for their reasoning, share mine with an example, and see if the team already has a convention. If not, propose agreeing one and automating it with a linter, so the argument is settled once.
A senior developer blocked my pull request because I had used a different way of structuring error handling. I felt mine was clearer. Rather than argue in comments, I asked him for ten minutes on a call. He explained that his pattern made errors easier to find in logs, which I had not considered. I showed him a case where my version made the happy path easier to read. We found that the team had no written convention. I suggested we agree on one and write it into the contributing file, and he agreed to take it to the next team meeting. Meanwhile I changed my pull request to follow his pattern, as his reason was sound for our logging. We later added a linter rule so such points do not need discussing in reviews.
What they're testing: Useful, kind reviewing that focuses on correctness, risk and clarity.
What they're testing: A reasoned test strategy across unit, integration and end-to-end, not a slogan.
What they're testing: Protecting quality where the risk is high and offering a safer way to meet the date.
Be clear that payment changes carry high risk, so skipping tests is not a saving. Offer options that still meet the date: reduce the scope, test the riskiest paths first, or release behind a feature flag to a small group. Put my concern in writing so the decision is shared.
Before a launch, my manager suggested we skip testing on a change to the payment flow because the date was fixed. I said I understood the pressure, but that mistakes in payments hurt customers and are expensive to unpick. I did not just refuse. I proposed three options: ship the simpler version without the saved-cards feature, which was where most of the risk sat, test only the main payment paths and the refund path, or release to ten per cent of users behind a feature flag. He chose the second with the flag. I wrote the tests that evening, found a bug in refunds and fixed it, and we launched on the date. I sent a short note afterwards listing what we had tested and what we had deferred, so that nobody was surprised later.
What they're testing: Revoking first, being open about it, then fixing the process.
Revoke or rotate the key immediately, because removing it from the repository does not make it safe. Then tell the team and security, check logs for misuse, clean up the history if needed, and add a secrets scanner and a safer way to handle keys.
I once pushed a configuration file that contained a third-party API key to a shared repository. I noticed within minutes. I logged into the provider's dashboard and revoked the key, then generated a new one. I told my team lead and the security contact straight away, in writing, with the time and what had been exposed. I checked the provider's usage logs and found no unusual calls. I removed the file from the repository and its history with the team's agreed procedure, and moved the key to our secrets manager. Afterwards I added a pre-commit secrets scan and a line in the readme about environment variables. The security lead thanked me for reporting it quickly. I would say that being open early turned a mistake into a small process improvement.
What they're testing: Assessing dependency risk, prioritising a patch and testing it safely.
Find where the library is used and whether the vulnerable feature is reachable. Check the advisory for affected versions and fixes, prioritise exposed services first, patch or mitigate, test and deploy. Record what I found, and tell the owners of any service I cannot update quickly.
When a critical advisory was published for a logging library, I used our dependency report to list every service that included it, directly or through another package. I read the advisory and learned that only versions before a certain release were affected, and only if a particular feature was on. Of eleven services, six used an affected version and two of those had the feature enabled and were internet-facing. I patched those two first, ran their test suites and deployed them the same day. I disabled the feature as a temporary mitigation on a third service that could not be upgraded until the following week. I then updated the remaining services in the normal cycle. I posted a short summary for the team with the services, versions and dates. We also set up automatic alerts for new advisories.
What they're testing: Practical defences against injection and unsafe output, and validating at the right place.
Never trust input. Use parameterised queries to prevent injection, validate input on the server, and encode output for where it is shown to prevent cross-site scripting. Also check who is allowed to see or change each item, and log failures without exposing details.
For a comments form that saves to a database and shows to other users, I would think about two things: what goes in and what comes out. For input, I would use parameterised queries through the database library, never string-built SQL, so a comment containing quotes cannot change the query. I would validate length and type on the server, and not just in the browser. For output, I would encode comments for the context where they appear, so that a comment containing a script tag is shown as text and does not run. I would use the framework's templating rather than writing HTML by hand. I would check on each request that the user has permission, rather than relying on hidden fields. Finally, I would write tests with hostile strings, and rate-limit the endpoint to deter abuse.
What they're testing: Protecting personal data and finding a safe way to get realistic test data.
What they're testing: Making complexity and risk understandable and offering options.
What they're testing: Teaching and supporting growth rather than rescuing or ignoring.
What they're testing: Raising doubts early with evidence and alternatives, instead of building the wrong thing quietly.
What they're testing: Estimating under uncertainty with ranges, assumptions and options.
Give a range, not a single number, and name the assumptions and unknowns behind it. Break the task down, do a small spike to reduce the biggest unknown, and offer options on scope when I am pushed to go faster.
Asked to estimate adding a new payment provider, which I had never integrated, I said I could give a range after a short spike. I spent half a day reading their documentation and building a test call in their sandbox. The unknowns became clear: webhook handling and the refund flow. I broke the work into pieces and estimated each as a best and worst case. I told the product owner it would take three to five weeks, depending on the refund flow, and that I would know more after the first week. She asked for two. I said we could meet two weeks if we launched with payments only and left refunds for a second release. She agreed. I shared my assumptions in the ticket and updated the estimate after week one, when it came in at the lower end of the range.
What they're testing: Learning efficiently and validating understanding through small tests and review.
What they're testing: Depth of understanding of your own work, with honest evaluation and monitoring.
In the UK, the Government Digital and Data Profession Capability Framework and the Technology Code of Practice are cited below. Use the framework your employer uses wherever you work.
The Government Digital and Data Profession Capability Framework describes a software developer as someone who designs, runs and improves software that meets user needs. It says they are responsible for writing clean, secure code following a test-driven approach, and for creating code that is open by default and easy for others to reuse. Whatever sector you apply to, the pairing is useful: panels listen for users' needs as well as for technique.
The government's Technology Code of Practice has twelve points, including defining user needs, making things accessible and inclusive, being open and using open source, making things secure and making privacy integral. Point three asks teams to publish code and use open source software to improve transparency, flexibility and accountability, and point six asks them to keep systems and data safe with the appropriate level of security.
The National Cyber Security Centre (NCSC) is the UK's cyber security body. OWASP's Top 10 is international and used by developers everywhere, so know it whichever country you work in.
The National Cyber Security Centre's guidance for developers says that genuine security benefits come when delivery teams weave security into everyday practice, that security considered as a bolt-on after development risks missing vulnerabilities, and that every team needs security expertise although not everyone needs to be an expert. It also says to treat third-party libraries and dependencies in the same light as code you write, to require peer review before changes reach the main branch, to keep secrets separate from source code and scan for ones committed by accident, and to accept that your code will have exploitable shortcomings and set up a process for managing them.
OWASP's Top 10 for 2025 lists the web application risks that developers should recognise, among them broken access control, security misconfiguration, software supply chain failures, cryptographic failures, injection, insecure design and authentication failures. You do not need to recite it. Be able to name the risk behind a scenario, such as a committed API key, a vulnerable dependency or unsafe user input, and say what you would do.
This section draws on the NCSC's guidance in the UK; the no-blame culture it describes is widely used by engineering teams elsewhere.
Most questions about conflict, reviews and estimates test teamwork. NCSC's guidance on a no-blame culture is a good model: even the best make mistakes that cause security issues, and treating them without blame encourages people to report rather than conceal. The same applies to outages and failed deployments. A panel will trust you more if you can describe your own error, how you told people and what the team changed afterwards.
Careers advice agrees that the end of an interview is your turn. The National Careers Service says to bring your own prepared questions about the role or the organisation, and Prospects publishes a short list of good ones. The Muse recommends asking about day-to-day work, training and how you would grow, and Indeed says to base your questions on your research so that they show you have looked.
For this job, good questions come from the work itself:
Questions about reviews and incidents show that you think like an engineer who ships.
Starting out is normal in this job, and panels know it. The Muse advises showing willingness to learn and using examples from study, volunteering and everyday responsibilities, and the National Careers Service recommends preparing examples from your past and telling them with the STAR method. If a question is about something you have not done, the University of Arizona's career service suggests saying so honestly and describing what you would do. Freshers, as new graduates are called in India and elsewhere, can use the same approach.
Say what you do when you do not know the answer. It is part of the job.
Many employers include a live coding exercise, a take-home task or a pairing session. The advert or the invitation usually says. Practise explaining your thinking aloud as you work, because panels listen to your approach as well as the result.
Say so honestly, then show how you learn: a recent example of picking up a new tool, how you checked your understanding, and the first thing you would build. Panels value a fast, careful learner.
Describe the problem, your part, the design decisions and the result without naming confidential details. A personal or open source project is a good alternative to show your code.
Choose a real one, say how you found it, who you told, what you fixed and what you changed so it could not happen again. Avoid examples where nothing was your fault.
Related topics: Behavioral interview questions, Common interview questions.
Related: Project manager, Data analyst, Business analyst, Sales executive.