Bug squash: An underrated interview question
blog.jez.io
blog.jez.io
> It’s fun. It’s fun in the same way an escape room is fun. It’s fun because of the dopamine you get when the test suite blinks green.
Keep in mind that for lots of people in a job interview setting (even excellent candidates) this is not fun, this is stressful. It may be fun on the job or at home, but the stress of a job interview both eliminates any "fun" aspect and makes even simple tasks more difficult. Just mentioning that to encourage some amount of empathy and understanding for the candidate.
It’s a better demonstration of knowing how software works imo. But I am biased because this sort of thing is one of my strengths.
The former kind of candidate may be more desirable for the employer :-/
I'm stuck in my job and I get paid less than people with lower tenure and credentials. Due to a disability, I don't have the social/political skills to get promoted in my org nor feel comfortable job hopping. It's funny though because every team I've been on has had managers or TLs telling me things that equate to 'you should be at the next level' such as "if you were preforming at this same level on another team you would probably be promoted". I had an interview internally recently and was told that I "found more errors than was expected" for my level.
So yeah, get disabled people like me so we are less mobile, work above our level for the technical work, cost less, and can't get promoted easily.
It's just cargo cult hiring.
i prefer the bug squash question. i have 20 years of experience. i will probably do well.
a fresh grad might fail. do i care? no. leetcode has benefited fresh grads and is being used to discriminate against those with anxiety and other disorders and those who are older.
i think it is refreshing to try a different interview method, one that benefits those with experience.
B) As an industry and as a society, it's not a good thing to refuse to hire new grads, since that leads to the kind of labour shortages we see in e.g. medicine and pulls up one of the best ladders for wealth mobility. Tech therefore needs some kind of funnel to evaluate candidates with less experience. A test that almost none of them can pass is not very useful for evaluation purposes
If the above doesn't answer your question, then different questions for different levels. You should know if you are hiring a junior, mid, or senior engineer. (you may have different levels), and ask them different questions.
You misinterpreted my question, because I was asking what saagarjha thinks, not what anyone else thinks.
the reasoning is that it's ok to pass on excellent candidates. as a business owner I find that a real problem. I would prefer the best, not just people who had time to grind leetcode and rapidly crank out solutions to standard problems you can find online. i think it would be better if interviews erred on the side of caution and preferred to let people through especially if they have experience. you can always fire them if they don't perform. there is no job security in the US anyway.
In practice firing people is hard at most companies, even if there are no laws protecting people in an individual situation. In principle it can be easy but generally a manager who is in a position to evaluate performance doesn't also usually have unilateral authority to fire someone. And a technical manager telling someone that this person can't code or is disruptive on a team often can't communicate that to the managers with firing authority. This can be out of hesitance, budget concerns, or legitimate communication skills on either parties count.
So the hiring practices that most of the companies I have worked at tend to skip on possibly excellent candidates in preference of definitely excellent or at least definitely decent candidates. This is mostly about risk aversion then gain maximization.
I think you meant to say organizational dysfunction.
The inability to fire someone obviously incompetent is not risk aversion, it's risk accumulation.
squeaky said that companies are risk averse in their hiring process because it's hard to fire people. I said that companies are not risk averse if they can't fire incompetent people.
You responded that it takes time to determine whether someone is incompetent. Ok, but that just shows job interviews are ineffective at weeding out incompetent candidates, so there's still no justification for the so-called "risk aversion" of the interviews.
I guess I'm not sure why you responded to me rather than to squeaky.
Just Sqeaky.
I think the relationship between hiring and firing and interviewing is a little more subtle than a strict if/then statement.
It can be impossible to know up front if it will be easy to fire someone. Some people can hide incompetence of certain kinds for months or even years. Maybe the person that needs to be fired is competent but just toxic. Maybe the person rides right up to the line of the rules and makes an otherwise functional organization seem dysfunctional. Interviews might not be able to tell you if someone is excellent but some terrible people will absolutely reveal their cards. Most of the time there is an unlimited pool of applicants so even if an excellent one is passed up there will be another decent one somewhere. Not every job needs excellence some just need a baseline competence and an ability to be a team player.
These and other factors add subtle weight to risk aversion.
Also, difficulty in firing people doesn't automatically mean organizational dysfunction, sometimes it's an attempt at preventing abusive management. With how swiftly you are advocating for firing I would love to be at such an organization that made firing difficult if you were my supervisor.
You appear to be equivocating on the definition of "terrible". The type of programming interviews that people dread, and are the subject of the linked article, are technical coding quizzes. These audition-style interviews do little or nothing to identify people who are "toxic". And grinding leetcode doesn't make you a team player.
> Also, difficulty in firing people doesn't automatically mean organizational dysfunction, sometimes it's an attempt at preventing abusive management.
Organizational dysfunction and abuse management are one and the same.
> With how swiftly you are advocating for firing I would love to be at such an organization that made firing difficult if you were my supervisor.
I advocated firing "someone obviously incompetent". Why would you fear that?
Such a thing defies singular definition. Every company, person, and project will use different metrics. We might agree that someone truly awful is terrible, but more people exist on the margins. So how could I cleanly define it when clearly there isn't a single definition that matters?
I agree they don't find some kinds of toxic people, but I would argue that a system that does is magic.
> I advocated firing "someone obviously incompetent". Why would you fear that?
Because I don't know you and do not YET trust that "obviously incompetent" isn't a synonym for "politely disagreed one time", "didn't suck up enough", or "black". That last one is super important, somehow the places I have worked that fired very quickly, fired people that looked different very fast. And having a longer harder vetting process during might let a company see a red flag and avoid someone who might make such decisions and allow some time and process to review firing because the rate of terrible hires is likely lessened so firing rapidly is perceived to be less important.
The submitted article is about bug squash interviews vs. leetcode interviews, in other words, technical audition-style coding tests. That's what I've been discussing all along too, and the relevant definition of "competence" is technical programming ability. You appear to be want to go off on a tangent about "toxicity", but it's unclear what bearing that has on the topic of the overarching conversation. Certainly no technical coding test is going to weed out toxicity.
> I would argue that a system that does is magic.
I agree.
Also, magic does not exist.
> Because I don't know you and do not YET trust that "obviously incompetent" isn't a synonym for "politely disagreed one time", "didn't suck up enough", or "black".
Well, you don't have to worry, because I've never hired anyone and won't be hiring anyone in the foreseeable future.
> And having a longer harder vetting process during might let a company see a red flag and avoid someone who might make such decisions and allow some time and process to review firing because the rate of terrible hires is likely lessened so firing rapidly is perceived to be less important.
It's weird that you've seemingly shifted suddenly from the topic of hiring engineers to hiring managers. Again, this is completely irrelevant to the topic of the submitted article, which is bug squash interviews. You want to argue that more "vetting" will help, but you haven't actually explained your method of vetting, other than "magic". In any case, if you're worried about racial discrimination in the firing process, which of course is a legitimate worry, then why wouldn't you worry about racial discimination in the hiring process too? After all, you don't have to fire someone who you never hire in the first place, right? Why do you think that black people wouldn't simply be "vetted" out before they get hired (especially since you yourself appear to want to increase the amount of vetting, and thus the opportunities to weed out whomever the hiring manager doesn't like)? It's truly bizarre to believe that you could institute a magical hiring process that could somehow nullify a racist hiring manager. On the other hand, if your magical hiring process could weed out racist managers before they get hired, then you wouldn't have to worry about the firing process.
I don't know why you are answering for bluGill, and bluGill is answering for you. This is frustrating to me, because you don't appear to be of one mind. Unless you are secretly of one mind, one person behind two HN accounts.
In any case, bluGill's previous comment suggests that job interview vetting is rarely enough: "I've seen very few people obviously incompetent. As such it takes a while to prove they are incompetent. They do write working code and get it through review. Often the only clear sign is nobody likes working with them - only after you get rid of them do you have concrete evidence that they weren't contributing (that is the team got as much done now since they no longer were stopping their own work to help the incompetent person on things that it is never clear if should have been figured out alone)"
How do you define best, and once you do, how much better than second best are they? What if the best person asks for several million dollars per year (an unreasonably high number as I write this), but the second will accept for $200k (a reasonable number though low if they really are second best). My guess is you cannot tell the difference between the top 20% of programmers in actual day to day work, and probably couldn't tell the difference in an interview.
These candidates have, as groups, different characteristic strengths and weaknesses. You need to give them multiple tests to see those. Leetcode is not a good test, but you do have to test a new grad on something, which might mean a vaguely leetcode-adjacent test like "go print this json tree of directories to the console then tell me what you did in your third year of uni".
Note that I did not say younger - you will get a few "old" people switching to programming as well, and they start off as junior.
That's a very sweeping blanket statement and you're putting a lot of your beliefs on to other people. The smoothest projects I've worked on were always full of nothing but senior developers. But even though that is just my personal experience I know full well many projects benefit from Junior developers. Sometimes fresh perspective and energy are what you want to solve a problem instead of experience and expertise.
Of course there is value in bringing in external experts for a short time as well. You don't want to be isolated and not learn from the rest of the world, and of course sometimes you have money for a large project and sometimes you don't and want to fall back the the minimum staff needed to keep institutional knowledge alive.
Last, ignoring everything else, you have a moral obligation to society to build a better world. That includes training the next generation. (and this helps you - when you are retired they will be the senior engineers building the tools to keep you alive)
I've been on Plenty of teams that formed and disbanded in 3 months, we had a goal of building a prototype and turned it over to the customer. Just isn't a great place for new devs. Alternatively, I worked at slow and steady insurance companies that had all the appropriate processes for risk aversion in place and were great places to teach new devs. They let them stretch their wings knowing that they would be protected by good CI and good unit tests and other defensive practices at an organizational level.
Not every team needs every sort of skill or skill level. It's a judgment called each team needs to make, and some teams will decide wrong.
I'm not older, but I was in the industry prior to the leetcode style interview. I've never sat down and "grinded" leetcode but I've also never had a problem with those styles of interview once they became common. Neither have my former co-workers. I have a few friends that are still working, past retirement age, that would crush any problem you threw at them.
In my experience, it's not much different than the whiteboard interview. Sure the presentation of a problem can stump you for a moment, but with a few good follow up questions a solution, however naive, becomes apparent.
I had a mentor early in my career that repeatedly said "There is no such thing as an unsolved problem in computer science". I think that mostly holds true, you either recognize the pattern and implement, or you learn and implement next time.
That all said, leetcode style interviews are the interview version of a "bad code smell" and I'd strongly prefer a bug-squash style, even if it was in a completely unfamiliar programming language. Actually, an unfamiliar programming language might make it fun.
I don't know, maybe some places do have ridiculously hard problems that you just have to memorize the algorithm for, but personally I haven't seen that. It's more like advent of code style stuff that you kind of just figure out by yourself.
However I wasn't as fast as others as I didn't recognize any of the questions and had to work through them. Interviewers expect you to be fast, or at least compare you to people who seem faster. Doesn't matter who studied or not, or who will actually perform better on non-leetcode tasks.
Also having kids is a real issue, it absolutely crushes the amount of time you have to anything besides working.
I don't know where you've been doing coding interviews. I'm pretty confident there are leetcode type problems you will have a hard time with and won't be able to complete in the allotted time. I'll share one of my experiences with a FAANG.
My interviewer first spent a lot of time "getting to know me" and asking trick questions, and stressing he also previously founded a startup, then handed me a problem and demanded I find the optimal solution in ~10 minutes and also wanted me to talk while working on the problem. I could not remember the arguments to a function and couldn't concentrate. It bombed.
A few days later I was sent prep material for an interview at a different FAANG. One of the videos was the author of cracking the coding interview solving this exact problem on a whiteboard. It took her more than an hour to arrive at the optimal solution.
So in short: 1) interviewer had unrealistic expectations
2) interviewer wasted time with introductions given his expectations
3) interviewer asked trick questions to determine whether I am a liar even though it was pretty clear from the introductory conversations that was highly unlikely
4) interviewer created an awkward interviewing environment and triggered my anxiety
5) interviewer thought I should be able to code while talking
6) interviewer probably forgot how long it took him to solve the problem originally and probably never timed that
This isn't discrimination on age this is discrimination on dedication to craft. Young people can have obligations outside of work just as easily as older people.
-- signed an old man
I'm saying that testing people for their skill, in any way, will have imperfections and will wind up excluding people. If it excludes people based on something they can control that's probably not the worst thing. Not everybody can get time to practice, but do I really want to be working alongside people who don't practice? Maybe in some jobs I do maybe in some jobs I don't.
If someone really does have 20 years of experience then a single evening of practicing will do a lot more for them than it will a fresh faced kid from college even if that kid from college does it for two or three hours every day for a week.
I just simply don't accept the notion that leet code interviews favor people based on age.
Why would I take my career less seriously than a game?
I don't doubt that at all. But I've also had that on a whiteboard.
Also, it sounds like your interviewer was a jerk. Which seems orthogonal to the style of interview.
I get that interviewing is a skill on its own, and not everyone has skills that work in an interview that transfer to the day-to-day job but don't most day-to-day jobs have a large communication component?
Probably yeah. I don't remember my last take-home assignment having communication between the start and the end, although I would have probably been able to send them a question if there was something unclear.
>don't most day-to-day jobs have a large communication component?
I wouldn't know if mine has a "large" communication component, especially in terms of synchronous communication, since everyone's remote, choosing their own hours and so on. A lot of our work is very independent.
However, a lot of people don't do well under stress, and in many corporate settings, there's usually no real source of stress (except perhaps artificial stress induced by management). Someone might work much better in a stress free environment than someone else under a stressful environment, but you'd then easily miss these candidates by structuring the interview to be stressful.
Ask a firefighter who rushes into burning buildings for a living to give a public speech in front of a large crowd of people in a non-burning building. Which is more stressful? For the firefighter, it may be the latter. Fighting fires is what they train for, what they're experienced with, whereas giving speeches is not.
A lot of people, no matter the profession—firefighter, programmer, etc.—have a great fear of public speaking. Likewise, a lot of people, no matter the profession, also have a great fear of job interviews, especially the crazy audition-style interviews of programmers. It's simply human nature, with little bearing on job performance in general. We shouldn't be giving auditions to people who aren't stage performers. Personally, I never work with someone watching me—definitely not a judgmental stranger who will fire me for any perceived peccadillo—nor do I ever have some specific narrow time limit on my work in the range of 15 minutes or so.
A bit like 100m race vs. marathon.
In the end, management (or founders if it's a startup) set the tone and who they end up hiring (thus, who will manage your work). And management is just normal people in the end.
Not exactly. Interviews are a different kind of stress that is usually a direct result of being observed in an unfamiliar and somewhat high pressure situation. You might have to deal with an outage at work, but typically your employment isn't on the line (less pressure) and you have a great deal more familiarity.
Some hiring practices intentionally try to create a more welcome, less stressful experience because they don't want to bias for interviewing skill (as opposed to fitness for the job).
Suggestion here: leave the room and come back in 40 minutes. Let them debug, fix the problem, and present to you when they're done.
It was very helpful for sanity checking if a person was able to be in front of a computer. There's a bit of a challenge because I think there's a pretty low ceiling of performance (strace on a Python program is fun, but our bugs are not that deep!), but we could use it to also talk about new features on this mini-system and whatnot.
General feeling on it was "this is a great filter", because ultimately we needed people to just pass above a minimum skill bar, not be maximally good at coding. And having the exercise really helped to communicate the day-to-day (which can be tedious!)
They don't need to be deep to be useful. I once used it on nodejs on a hunch, looking for anything that felt "off", and discovered it was accessing settings files I had no idea even existed. Turned out the other dev was having problems because of one in his home directory the rest of us didn't have.
Keep in mind people that a job interview is to check wether you want to work with the person, not to judge if they "pass" the test.
Or to say it differently, they don't have to find and fix the bug, they have to demonstrate ability with the tools, a good attitude, a match with your work culture.
I know, it's short and humane, so not a good fit for current Sillycon Valley culture.
If you do get asked these questions just lie.
Unless it was literally a week ago, I work on too many things to ever remember anything, and for me it's just a fact of the work that I'll be fixing bugs or whatever the questions asks. Nothing stands out, because I don't consider any of them to be some sort of special occasion worth keeping track of
Not to say that I think this is a bad type of question overall, but IMO, this is an anti-feature. The candidate does not need to accurately self-assess their performance on the day. They need to have their confidence preserved so they don’t tilt and tank the signal for the entire interview round.
[1] https://www.wayup.com/employers/blog/how-a-positive-candidat...
When rejected, or from an otherwise negative experience.
It's not necessarily negative emotional associations. Usually it's that I picked up on signal that the company has serious problems -- either overall, or with a key person -- which suggests I shouldn't depend on the company as a vendor.
If someone fails my interview, it is completely possible that they’ll still get an offer. I have one data point, and my colleagues are going to collect more. I’ve changed my vote from no to yes in debriefs many times once I saw other feedback. But that’s a lot less likely to happen if my interview wrecks their confidence.
1. You don't know what metrics you're being judged on.
2. You do know but you either can't assess your abilities in said metrics or you can't tell how well you've presented them.
The second one is up to the candidate, not much you can do about that, but if during an interview you have no idea what the interviewer is looking for, that's a terrible interview.
I’ve already explained why I think obscuring poor performance to preserve candidate confidence is crucial. If you think that’s a “terrible interview”, maybe you could elaborate on why, rather than just asserting it.
It seems to me that debugging in particular is often dependent on the developer realizing some edge case or scenario where things circumstances line up to produce a bug. In that case, wouldn't a "bug squash" end up being similar to a "gotcha style" white boarding question.
The author, quite correctly, says that the interview should be scored not on whether the candidate can immediately vomit up a solution but on whether they can demonstrate their an organized thought process. However, isn't that true of white board questions as well?
Overall, it seems to me that the real problem with conventional white board questions is when the interviewer focuses on whether the candidate gets the right answer rather than on whether they demonstrate the ability to problem solve. While it sounds like the author is a good interviewer who focuses on assessing the candidate's thought process, it's not clear to me that giving debugging questions is actually what causes that.
I don't think that's the case if there's a test failing. If a well-written test fails, that means there's a completely scoped out requirement for how the feature should work. The candidate should know how to use a debugger, so they should be able to start diving in and figuring out how the code works and what might be going wrong. I don't think that's likely to produce gotchas.
- Didn't set you up with a way to reliably run/test the code, nor a step-through-debugger which, jeez is it 1980? Like setting up a repo in a language you aren't familiar with (say getting your py-env exactly right) can take a whole hour if it's not your main language.
- Didn't have standardized questions, which is hugely problematic (some bugs are 2 orders of magnitude harder than others)
- It also just seems like there's a huge random element, like am I debugging code written by somebody who thinks at the same level of abstraction as me? Did they write comments I understand?
- do they methodically approach the problem? - do they understand the bug? - do they know how to use debugging tools? - do they know advanced debugging tools? - do they work well in an unfamiliar codebase?
But in practice I'd say most candidates check those boxes, at which point it becomes an arbitrary evaluation unless you pass/fail them based on whether they solved the bug.
Fortunately I already had an offer onhand from facebook.
At the end, I would have them walk me through the bug, its cause, and the fix in very high level terms to make sure they could articulate the path we took.
How frequently do people interview in a language other than their "main" one(s)?
> - Didn't have standardized questions, which is hugely problematic (some bugs are 2 orders of magnitude harder than others)
How do you know they're not standardized? (You say in another comment where it was, and indeed that's where the blog post author works. It's described as a pretty standardized process by my reading of it.) You can pass the interview without actually solving the bug, but I get it's easier to blame the problem than admit you struggled with it.
I would say most of the time.
However i still think debugging is a core skill you should be able to demonstrate in languages that aren't your main one.
List<Integer> l = new ArrayList<>();
l.add(1);
l.add(2);
l.add(3);
l.remove(1); // invokes List.remove(int)
System.out.println(l); // [1, 3]
Collection<Integer> l = new ArrayList<>();
l.add(1);
l.add(2);
l.add(3);
l.remove(1); // autoboxes 1 and invokes Collection.remove(Object)
System.out.println(l); // [2, 3]
Bugs very often lurk in language specifics. Python has its infamously static default arguments as an analogous quirk.One of the issues to solve during the tech interview was fixing a bug in a fairly involved web app with a java backend. Long story short, it boiled down to "==" being used to compare two strings instead of ".equals" somewhere deep in their class hierarchy.
I found it and fixed it, even though I was not familiar with the reference vs value equality difference in java. General debugging skills acquired over years should allow you to track down exactly where things go more wrong than expected, and then help you reason about why it goes wrong.
The art of debugging isn't memorizing all the foot guns, its narrowing the problem down enough that you can deal with the foot guns you have never heard of before.
Another part of debugging involves various methods for reducing the size of the haystack, but it's not really realistic to rawdog every bug like that, as that would mean each bug would likely take hours rather than a few minutes.
Any half-experienced Java developer should spot the stink in that code immediately.
Even if it is your main language.
A lot of companies have a set of "standard" interview languages like Java or C++ that may not be used by the role that is being hired for.
Isn't that part of what professional software engineering is about? Unless you worked with the same group of people for a decade and have had the time to mind meld together professionally, _any_ random developer at a new company is nearly guaranteed to think in a different way and have their own philosophy of code comments.
Checking for mental flexibility and adaptation to varying approaches for others is a great subject for an interview as a software engineer.
There are code smells, side effects, errors, confusing syntax, a whole slew of things in it. I give them the code, tell them I'll help with every bit of python syntax (and really emphasise that I don't mark people down _at all_ for any lack of familiarity with python / python syntax), and ask them to work through the code and do a code review.
There's some python specific quirks that I largely consider bonus points at best, but anyone with any appreciable familiarity with at least one language should be able to spot a number of things. As they call stuff out, I'll dig in (or not) as seems appropriate.
So far it seems to be working out great for me as an interviewer. Candidates seem to be way less stressed than they are with a "whiteboard coding" exercise. Good discussions are showing me their development skills, etc.
I think the idea is good, but to be equitable it should be given in a language the person claims to be already familiar with. Or alternatively, only give it to people in a language they are not familiar with.
Thankfully there is a giant corpus of terrible code out there for any language. Especially that code written by the most evil terrible coders of all time: past-self :D
I myself, shoot myself in a foot once doing Python code. I declared variable called 'len' and boom! What an interesting failure mode the script had. Took me a while to figure it out.
In this case Pylint will tell you about this mistake:
https://pylint.pycqa.org/en/latest/user_guide/messages/warni...
Still a tiny bit stressing at the beginning while I read the code for the first time and try to understand it because I worry that I might be taking longer than the interviewer expects, but if I'm thinking out loud then that helps both of us. After I get reasonable context I can then forget about the interview and just focus on the normal pair programming / code review.
Because many people were interested in some actual code, here is an example that we used for Java:
---
public class UserDao {
private Provider<Session> sessionProvider;
public UserDao() {
this.sessionProvider = new DbSessionProvider();
}
public boolean saveUser(User user, ApiConfig config) {
try {
Session session = sessionProvider.get();
session.save(user);
System.out.println("User saved!");
return true;
} catch (DbException e) {
EmailUtil.sendEmail(config.getTechnicalSupportEmail(), e);
return false;
}
}
}---
"Solution": We always ask the candidate "What would you change about this code?" or something similar. We expect the candidate to come up with some selection of: - Database sessions should come an injected provider. - Configuration should probably be injected as well and not passed as a method parameter. - Booleans are not canonical Java as return value. - Don't write to stdout but to a logger. - Exception handling should probably happen outside the DAO. - Don't use static methods for sending Emails without good reason. Non-static methods are easier to test.
Finding these things is as important as being able to talk about them and give background on advantages / disadvantages of doing things different ways. With good candidates one can talk easily half an hour just about this example and adjacent topics (e.g. error handling).
---
Edit: Formatting
Edit 2: added "Solution"
Sr.Dev : "UserSignup failed, ask tech support what happened in our code"
Genius.
What should you return instead? Or should the method return void and raise an exception on failure?
You could also go fancy and do it properly functional, so return something like an `Either<User, Error>` instead of throwing an Exception, but that's definitely not canonical Java...
In good Java code you would return either void to indicate side effects or the newly saved user. Exception handling should be done outside the function, because depending on the context you might retry etc.
The main idea is to check if people who say they are very experienced understand conventions and have experience with common Java libraries.
It's not a bug ("this" is implied, so it works just fine), but leaving it out hints to me that it was originally a third argument to "saveUser()", and either the original person writing this didn't have a solid API in mind or "saveUser()" was intended to also be static like "EmailUtil.sendEmail()" and it was switched around later on. Overall hints towards two conflicting styles in the same codebase and no good guidelines. Or maybe there are such guidelines (as hinted in the "solution"), and whoever updated this class only did it partway. This is the point where I'd poke around in the repo history to see why it's like this and whether anything should be changed further in either direction.
Given the Java code in question, while I understand the idea that "well, the session provider may just be hard coded" and such, I would definitely want to hear something about deficient exception handling. It's obviously an important part of the code and while I may not be able to spew out the exact correct exception handling without knowing more about the context and what exceptions may occur, it is obviously very wrong as written.
Not great advice given the fact that a logger paged pretty much every SDE on this planet.
That said, modern Linux OSs send stdout to journald by default. journald should forward to some centralized logging server.
In my interview, I was given a T-SQL code, where I did point out the mistakes, but was told my solution wasn't optimal, but that was because I've never used that flavour before (nor was it specified in the hiring docs), so I'd like to avoid doing the same to others.
step 1: the candidate is shown the specification for a method and the results of running the test suite on an obfuscated version of the method. All tests pass. The test suite is minimal, and test coverage is abysmal.
step 2: the candidate is asked to come up with more test cases, based on the specification. The code is run against the updated test suite - most new tests will fail because the method's implementation has several known bugs.
step 3: The un-obfuscated source is provided and the candidate is asked to correct any bugs they discover.
step 4: the changed source is run against a full test suite.
I like this because the candidate's ability to think of test cases, debug, and fix existing code are all tested for.
The fun part was it was a discussion. Two people, paper and pencil, talking about the code. And the examples were from bugs they'd already squashed in a code base they inherited. It was a project that I ended up working on that had... quite a few interesting bugs like that.
I've done interviews like this and one major pitfall is the start-up time. It's possible to spend an unreasonable amount of time debugging cold-start issues with getting the repo set up, dependencies installed, and the app to build while the interview slips away. These things are representative of the first week on a new team or project, maybe. Figuring out why bundler can't seem to download the dependency in the gemfile isn't my idea of a good use of interview time.
I had golden images with some scenarios I wrote myself, and the images automatically shared a tmux session over http so I could follow along without requiring the candidates to screen share.
I did have to ask for IPs so I could ensure the machines were just available to me and the candidate, but it was otherwise pretty seamless!
Though now that https://sadservers.com/ has a paid service it might be worth looking into.
I've thought of adding programming debug scenarios (I even got sadbugs.com lol), may implement in the future.
I'd love to see what you've done, please feel free to connect :-)
This kind of interview didn't feel like a gotcha and was much much closer to real world work than the toy and/or algorithm problems that I have encountered. More companies should adopt these types of interview approaches.
It was nice because I didn't need to practice and I knew exactly how to debug the thing.
It was frustrating because my personal laptop is from 7 years ago (from college), is slow, and the dependencies and editor don't work out of the box for an a new repo. Additionally, I'd prefer to use IntelliJ like I do at work but again, that's too heavy for my computer to handle so I resort to vscode and have to figure out how to use it. So then the interview becomes debugging my environment instead of debugging the problem. Maybe that's a useful signal, but it's not really bug squashing anymore then.
So overall, it was still requiring learning but there was not a very good way to test in advance (how do you test all possible repo structures?)
I get it, your fun language is fun. But if the dev shop is 60% one language and 39% another, I don't really care about the small improvements. You need a strong reason that it actually _helps the business_
It works very well and takes only an extra 10 minutes on top of the conversation.
"Yes, you are not in fact immune to this even if you think you are, that’s why it’s so dangerous."
I think that I am. I'll think about that a bit more. I don't care for popular people so, in fact, my bias might be the other direction. However, I don't think I have ever met a person who I thought was technical and proficient, but turned out not to be.
I have been forced to hire people I knew were not proficient because they passed a test, but not the other way around.
It's not about someone being popular and you saying it just makes me more certain you don't realize the trap. People can have well honed social skills and not act like your standard popularity contest wining politician.
They can add all the smiles and chuckles and other social niceties they want, but at the end of the day, whether they come up with the right answer or not, their logic will tell you pretty clearly whether they know what they're talking about.
That's the point of a technical interview: to distinguish those who think (or pretend) they can code sufficiently well to do the job, from those who can't.
My most successful hiring has always been based on a conversation with 3-4 practical questions. I even worked in a company that had testing down to a science with all the psychometric nonsense and in the end, it just hired many sociopath-adjacents.
Skills can be learned. Tools can be provided. But the employee’s personal values are very hard to change. These are core components of performance in some perf management theories.
I think context is important. If a company can hire on potential, I would say it will be a better hire in the long-term. But if employee turnover is high and tenures short, and you need work done now and not 6 months from now, I agree with you more.
Sure, there is some correlation between talking and doing, but I've worked with people who talk like geniuses and code like crap. And also the opposite.
For some skills, there is just no substitute for actually have people actually demonstrate using them.
It’s really easy to let the interviewee talk through talk through all of the great things they built from a product and business perspective — and assume they understand the technical perspective. There are candidates who are really good at talking in an impressive way, but manage to talk around any true implementation details or deep technical understanding.
It’s also really easy to come away with a bad impression of someone who has a tendency to give short answers and not elaborate on things, even when it turns out that person is really skilled when you dig in.
I imagine a big part of the reason for the test-style interviews we have today is that it’s easier to train an interviewer on how to give them.
We tried to have a zero coding interview. All behavioral and experiences questions followed up by "how would you design a system to do blah." Got a candidate that did well. Hired. Turned out they could talk the talk but not walk the walk. It was wildly unexpected. They simply couldn't code well. Too long to deliver, too poorly written, usually didn't work right. We insisted on _some_ coding in interviews going forward
They dropped an archive of a medium-ish codebase to my machine, that had failed unit tests. My task was to simply fix the code so the tests passed.
Not only did I feel engaged with the interview because I could speak aloud as I debugged, I also found it fun!
Could you say more about this? Were they technical or behavioral interviews?
- I did the system design at the wrong level of abstraction (too low)
- Got asked about lowish-level database details. I took the question at face value and said I didn't know. What I should have done was explain what I did know (which was at a level slightly higher than the question), make an educated guess, and say how I would find the information. I still don't understand why Id didn't do that as I've always done it in interviews before or since.
This is my own assessment, they didn't give detailed feedback. Just that I wasn't strong enough in some areas (paraphrasing).
However, I'm biased. I'm really, really good at finding and fixing bugs, and pretty much stink at LeetCode, so take my support with a grain of salt.
One problem is that, if the exercise gets known, expect an underground economy of solution cheats. Same with LeetCode, but that's sort of expected. Bug fix solutions hit harder.
Not necessarily a con. Different languages/tech stacks have very different tools. I.e. debugging a GC issue is different than debugging a network issue is different than debugging an embedded issue. If you chose a language for a very good reason, then it's not a con to filter out those who aren't familiar with that language enough to debug an issue in it
The language is based on/chosen by the candidate. We want to map the candidate to whatever language in our repository of "this question in different langs" is closest, to control for the candidate's familiarity as much as possible.
If you're screening to only candidates who can code in the language your company primarily works with, you're missing good candidates. The best are going to be able to pick up a new language rapidly, particularly if your language is a mainstream one that's probably imperative or OO-ish, or both; adding a non-esoteric language to one's repertoire is just not that hard a thing to do. But in the interview, I don't want them struggling with syntactic bull, as it's not a useful signal; I want to know how they think, whether they've seen code before, and can they reason from problem statement to debugged bug.
I agree with that. I work somewhere that uses a lot of OCaml, we don't screen out those who don't know OCaml, but it usually helps them, since static analysis is easier with an ML family language than say, javascript.
> We want to map the candidate to whatever language in our repository of "this question in different langs" is closest
If there's not a close language in any of your repositories for the candidate, then I think that's a good signal that candidate may not be a great fit. As mentioned before, we don't necessarily ask candidates to write OCaml, most functional languages will have a similar bug + fix.
> problem statement to debugged bug what if the problem you might normally run into is perf issues related to the language? I.e. HFTs usually use C++ and perf = $$$. I would agree that yes, those who have worked on say Rust could be good candidates, but if someone has years of experience in writing highly performant C++, and that's what the job requires, probably easier to look for those candidates.
I definitely agree with you in general, just pointing out that there are times where being familiar with the language used is desirable.
- People were allowed to use their favorite IDEs - so you could see how proficient some people were
- Great engineers are really really good at debugging - it was great to see how people debugged and it helped me pick up a few things as well
- People couldn't leetcode their way out of this
I've done similar interviews in the past and they are remarkably high signal.
A good performance looks like making a hypothesis for where the bug is, testing that hypothesis, and repeatedly narrowing in closer and closer. Finding and fixing the bug is irrelevant!
A bad performance might look like
- running out of hypotheses for what might be causing the bug
- making hypotheses, but never testing them
- failing to interpret the result of their test of the hypotheses (thinking it confirms one thing, when it doesn't actually confirm that, or it confirms the opposite)
I think the good middle ground is having both a canned environment and allowing candidates to use their own... Unless the job is about debugging production systems where only vi is available, in which case that interview might as well represent the actual job.
In abstract I think it's great to have people use tools their comfortable with, but I dislike dinging people because they write good code but are not good at unborking Python venvs (less of a problem now) (yes you can be a good programmer and still lose time on dumb environment stuff)
Otherwise I'm easily 4-5 slower and can't think as clearly because of errant keystrokes.
Some candidates will not have problems installing dependencies and want to use their own tools.
Other candidates will want to not have to think about their environment.
Providing an online code sandbox doesn't preclude allowing candidates to do it on their own laptop!
We take in these bug-squash/Github based repos, serve them in VScode Web/Jetbrains/etc, and give you instant results
Email is in profile if anyone's curious to see it live
> Cheating effectively is indistinguishable from debugging skill. Even with knowledge of the exact bug ahead of time, if you just open the file with the bug, barf out the code to fix it, and run the tests, you’re going to fail the interview.
Did you mean "distinguishable" here, by chance? The first sentence seems to contradict the second.
I also like the related challenge of, “add a feature that does X” to a codebase.
I like it. It feels like much more directly measuring skills than most interview questions.
Joking aside, modern fast tools like bun can make this type of interview way more viable.
I once conducted this type of interview where the candidate had to install node on their windows laptop and... we spent most of the time debugging their install :/
I think there's a valid point that any IDE != a candidate's local setup. But I think there's a compromise there - we try to offer a variety of common IDE's + a few mins of prep to download extensions, etc before you're thrown in the thick of it.
I was hired and presented with a system that didn't work. I knew nothing whatsoever about their proprietary system and wasn't even given access to their codebase. I wondered why they were being so spectacularly unhelpful with onboarding tasks. At the end of the week, I found out - the whole thing had been a test to see how well I would do, and needless to say I failed miserably.
They told me I was a bad fit, and I had to agree, but probably not for the same reasons they were thinking. I really dodged a bullet with that one.
> I’ve seen candidates wield their text editor like it was an extension of their fingertips.
So am I allowed to install my own text editor and other tools (Emacs with my own config that requires some build time)? Or is it on my own laptop (I don't have one)? It seems unfair if some candidates get to use their favourite tools and others don't.
Our question was far simpler: it was a simple class (java + python variants, no fancy syntax) and ask them to describe what it does, then find the bug, and finally ask them what they would change.
It reflects a true test of what the day to day is, and whether or not the candidate would succeed in the role.
Our best received interview question was in this style. Pick something your team fixed or did, distilled down do a 15min thing a teammate could do. Give the candidate 3x the time.
For us, it was a db value not being set as expected during a cron. The candidate got our forged bug reports, cloned a repo, ran the script, verified the unexpected db state, and off to the races
[1] https://github.com/emilybache/GildedRose-Refactoring-Kata/bl...
What if a guy could, given the business or technical issue the code solves, write something faster than he could fix others code?
May be the job is about heads down coding so this bug fix test is appropriate..
Is this hypothetical guy always writing 100% correct code?
> Cheating effectively is indistinguishable from debugging skill.
If you know the code or problem ahead of time and how to fix it, you can certainly be convincing in your walk-through of how to do it.
Do really "many of us" enjoy that? In the "day-to-day business", not interviews.
What?
Anyway, I’ve found these kind of interview questions rarely helpful because the scenario is either overly simplistic, or it’s some obscure bug they identified (which they only caught because it caused an outage, i.e. they also didn’t “solve” this when they wrote it).
A similarly poor interview question happens in IT operations when the interviewer asks super specific details about some CVE from 5 years ago that he’s particularly proud of pulling an all nighter to patch a bunch of servers.
I think this might be a typo - we're observing X but want Y, or some similar variation. In any case, there's a bug.
> What we're observing is X, but we want to see Y instead.
(I once found some 10 bugs in a pretty old and tested bond calculation engine while migrating it to the cloud, which nobody could initially believe.)
strace is great. 99% of the time, your program is looking for a missing file.
A pity it's so hard to use in modern macOS due to OS integrity protection.
"My hourly rating for figuring out your bug is $X".
I'm aware this exists, but I'll admit to not having read it directly. (HR gives me a list of questions I'm allowed to ask in an interview and they tell me those questions are based on research but I only have their word they are)
They were given a piece of code on a toy, easy to read, english-like pseudo-language, and were asked to examine it and explain what the output to a specific input would be.
They were told that we would answer any question, except what the answer was or what the code was doing, and encouraged them to explain their reasoning as they went ahead.
We wanted to asses the candidates ability to problem solve, communicate, how would they react under preassure, and how they approached the issue.
We were not necessarily looking for perfect answers, we rather rated the candidates willingness to ask for help when stuck, how well they communicated while doing the task, whether they tried different approaches, their ability to grasp what an unknown piece of code was doing and so on... all important properties for a role supporting mission critical solutions with near to zero down-time requirements.
Our reasoning was that technical knowledge is easy to acquire over time, but problem solving skills, how candidates tackle difficult and unknown challanges were more important for the role.
In my current role I try to design interview questions like that, looking both for the candidates current skills as well as their future potential.
Not easy, but IMHO more rewarding for us and them in the long run.
Umm hopefully you don't fail for this. I've definitely known and hired devs that can do this with surprising frequency. Just because the interviewer may have taken hours to find the bug doesn't mean someone else must.
I don't have issues to show the screen to a friend of mine. Or showing the screen of a work computer to a colleague. However, demoing the whole screen is violation of privacy. Please don't do that, unless you grant VNC access to a machine with a set of popular tools, code editors, etc.
How about reverse bug squash? Interviewer shares the screen with all his/her private info, notes, tabs, development environment settings, shell command history (with maybe autosuggestions turned on), and the interviewee needs to guide the interviewer towards finding the bug?
I think I don't need a plan or virtual desktop. I just say "no" if it doesn't work for me. Unless I am really desperate, I do not share.