Sometimes they can code, but slowly and their output is unacceptable. This creates a burden on the rest of the team to either try to review it into something good (this doesn’t actually work) or to fix/rewrite it after it’s committed (typical in shops that don’t have a review/PR culture or process). IMO this is the worst of the three types. In it’s worst form it’s also the most obvious and these bad hires tend to get managed out fairly quickly.
Sometimes they can’t seem to get anything done on their own. Questions from new hires are expected, yes, but the questions are supposed to wane over time. This group doesn’t have that curve. Having talked to coworkers after these people have left, I’ve later realized that these people have bothered a lot of people on the team with a lot of questions, to the point where most of their work has been done by other people. This is only slightly better than the group above, but it’s still a waste of a lot of productivity.
Sometimes they just hide out. I guess they dodge questions about output from managers? Or are otherwise very poorly managed? I’ve only observed this in environments with a very weak management system. Honestly if I had to choose a bad hire situation, this would be my preference. They’re leeching from payroll but they mostly don’t get in the way of work that I have to get done.
I'd say that 90% of the new graduates we hire straight up cannot program beyond what you'd need for your typical uni assignment (a few months ago one asked me what 'git' was). If they're motivated and eager to learn, I can usually get them to productivity in a month or two. The ones who are not take months to get up to speed and become a real drain on the team's productivity.
The more senior colleagues I interact with are kind of a mixed bag, some are really good and a pleasure to work with others have learned just enough to get by in their current role and become useless as soon as they have to do something slightly different.
That being said I do think that the level at my company is above average in relation to "the industry". If you want to see truly large amounts of non-contributing employees, have a look the IT-department of a large bank, pension fund, government agency or some other technology adjacent big organization. They can't hire the most talented engineers to start with and then most of them are actively kept from doing productive work by layers of middle-managers and bureaucratic procedures.
On my new team, there is an incompetent senior engineer. Damn... how I miss my incompetent junior, who aside from wasting some time, never really affected the team. The incompetent senior produces impressive amounts of badly architected, untested code which breaks subtly and is impossible to maintain. They are also totally unreceptive to mentorship because they are so senior and know everything.
That seems very logical. The outcome is in line with the optimization. For a different outcome choose a different optimization.
CS !== Programming
And much more often than not, the underlying issue for those crappy devs was less their lack of coding skills and more general lack of critical thinking skills. Making bad decisions when faced with a choice, that sort of thing
Same, in 25+ years I've never met these developers who can't code.
There are many who make problematic decisions in other aspects of the engineering lifecycle. But actual lack of being able to write working code, no.
1. pair programing where they "want to watch you", but never modify your code and submit it
1. talks a lot about progress, but it takes days to get a commit out of them
1. will build "solutions" to perceived problems that really only serve to make them the single failure point and are not usable
1. says shit like "i don't write tests" or "it works for me, can you show me what you mean?" and clearly has no idea what you're doing
1. you repeat the same comments in loops, because they aren't taking your feedback, they're trying to hit a KPI
these people fall into two major groups, the people doing it on purpose, and the folks that don't realize that this is them. a lot of people lie to themselves about their ability, and this is the end result of them being incapable of acknowledging that they've got work to do!
I agree on pair programming, as a tech lead, pair programming is my single best tool to get some understanding of my team member capabilities.
"Talks a lot about progress"... this is a mixed bag. In most cases you are right. But in some cases.. I have worked with people who obsess about quality of what they produce (and I am the same) who will spend a lot of time polishing things after they are nominally done. It is not that they don't deliver, they need some help defining what done is.
"Says shit like I don't write tests". I don't write tests. There are good reasons that are out of scope of this discussion. When somebody says shit like "I don't write tests" I want to hear a follow up explanation on why is it. Because if you do not write tests you have to be doing other things.
"You repeat same comments in loops because thy aren't taking feedback". Guess what, a lot of good programmers are bad in some other respects. Just because they aren't taking feedback doesn't mean they are bad. I stress to people it is not enough to be good at programming, development is about building things and programming is just one skill. Development is a team sport that requires multiple people to work together to build something.
if you're producing code, it is not just talk. i'm talking about a scenario where you've heard about the great struggles they've faced, and after a week you get a commit with 4 files cahnged, and it's on a "sample" of the full work. overdone is fine and not what i meant.
- "Says shit like I don't write tests". I don't write tests. There are good reasons that are out of scope of this discussion.
This mindest is the same to me as saying "we only need a single point of failure for all things". "I can just read the source" is the same thing as saying "i can just take a course on it later that will take hours without the help of the original context". I firmly believe that anytime you build a big suite of software without tests, you're just unloading tech debt on an org with no guidance on how to handle it. comments, tips, and tricks can drift from the code overtime, a test can't and is the only provable way to validate your code. if you don't have time for testing at work it's an organizational failure that will only come due in the worst of times. Remember when Jira deleted a bunch of shit and couldn't get it back without one engineer fixing it manually? boy, i bet it would've paid to have _any_ testing in there!
- "You repeat same comments in loops because thy aren't taking feedback".
When you tell someone "commiting secrets to the repo means they are no longer secret" and they go oh yeah, makes sense, and then proceed to dump credentials into the next four commits, that's what i'm talking about. not this "i dropped a whole new concept on you. learn it in one" concept that i may have implied. i'm talking about poeple who just aren't even trying to listen, they just want an approval or w/e from you to move on.
fwiw: i'm a bit of a stickler for testing, and will acknowledge that my stance comes from my experience, and is therefore a known bias, just one i have a hard time letting go of
It is not that I believe tests do not work. Tests is a viable solution to a problem. The issue with tests is that you have to do a lot of things right and you have to structure your development in certain way for tests to be productive. And if you don't do a lot of things right then tests will just cost a lot of development time without much benefits.
Introducing unit testing is hard if your team isn't already doing it and costs a lot of effort for practically no immediately visible effect to stakeholders.
Very few organisations I worked in would be at maturity level when investing in unit testing would be the highest return on investment thing you could do at the moment. There is usually many other problems that cause less disruption to development practices and bring much more benefits than unit testing.
On the other hand I am a huge fan of functional testing where you create a test harness that ensures that public interface of your product (application) functions as expected. The effort is much smaller (you only evaluate public interface which already is integrated with other things and which isn't expected to be changing a lot anyway), the benefits are clearly demonstrable and understood by stakeholders.
Sounds like there are existing problems more severe than lack of tests.
Recall that tests, like comments, are not for you in the here and now.
Particularly needed a lack docs and tests, and a surfeit of cash.
One was doing absolutely nothing at all for months on end.
One was doing negative work - every line of code made things worse, every document was unintelligible, and they would approve every PR from other devs the second it was opened.
Suffice it to say, the dev that did nothing at all was the most productive of the two.
And these people frequently last surprisingly long at companies because it is pretty hard for managers to understand how individual team members contribute to overall productivity. Managers tend to focus on short term goals (like getting a feature delivered or a bug solved) but have hard time understanding long term implications of bad decisions their people make.
It is pretty easy to fix a bug or write a feature but a bad developer will cause large amount of debt along with it that will slowly deteriorate productivity in ways that will be difficult to understand. The people who understand what is happening -- senior devs -- will frequently not speak up about it or their voice will be downplayed ("Hey, this guy can't be that bad, he is delivering after all?")
- You close a feature ticket by cutting all corners possible
- Every corner cut will later become a bug ticket, that you can solve quickly as you are more familiar with the feature
Total: you have closed more tickets than a dev that did the feature right the first time... sadExactly! This can be very difficult to quantify; as this kind of debt is undetectable by standard gates (linter, static analysis, etc.). Instead, it is more nefarious... introducing coupling, where none was needed, or long-winded tests; that test very little, and make the code hard to refactor. I don't have a measure for this beyond my intuition of working with code for decades.
What makes it all worse, is when the features are 'delivered' and marked as 'complete' by these folks, they are difficult to take back! Especially if their delivery was identified as a key objective to a quarter.
It not only lets me know how the person works, how they solve problems. It lets me remediate some of the problems. And just get to know the person on personal level.
The only issue with this is it takes time and does not scale. You can honestly manage up to a dozen devs this way and when I have larger teams I have to skip it (for example I no longer pair with juniors -- I pair with seniors and then teach them to pair with juniors more productively).
Good luck to their new manager.
There are a large number of SWEs that are not worth keeping but the incentive structure is misaligned to deal with it. If tomorrow you realize more than half of your staff should be cut and replaced, how much effort would it be to do it, what do you gain and how much risk do you put on yourself if it back fires?
I recently watched a fellow leader try to go down this path to get stonewalled by HR about respect, moral and cultural values.
Disclaimer: Own personal opinions.
Why is it a problem that some people do the bare minimum? By and large they still contribute in some small way to the project, hopefully. I'd much rather work with people who are less competent but easy to get along with than someone who is above average but also cocky and inapproachable and won't take feedback well.
Most software and business problems aren't that hard. You don't need the best people to work on them. Superstar devs are sometimes just a pain in the ass and not worth the small improvements to code they can bring if they are a thorn in everyone's sides. Coding is just routine groupwork, not an Olympic sport.
My 2c as someone who's slightly below or slightly above average, can't really tell and don't really care lol.
I want to be able to set a certain bar of quality and work ethics and I want the average developer to meet that bar, not for them to be so far below it that I have to hire way above average people just to reach the bar.
I agree with you that you want people that you can work with. The star developers with the attitude you describe is not someone I want to hire. However doing the bare minimum is so way below the bar that this better not be what the average developer does. I want those people to be the exceptions - way below average.
If code is not where you want it to be, reject the PR, leave specific comments about what was done well and what was done poorly, then repeat the cycle until code is where you need it to be.
Now with that said, of course we have standards. That's the bar ;)
The point I was making is that it seems that the average developer is so far below the bar, that I don't want to hire average developers.
Of course there are some juniors (and even some seniors) that will take to code review comments, pairing with them, mentoring them, giving feedback etc. and will improve. Many many don't. Like mentioned elsewhere in the threads here, I think at least some of that has to do with the fact that so many developers have entered the market but they actually aren't good at it. They're in it for the money. They pull the average so far down that hiring average developers is excruciatingly frustrating.
These people with terrible work quality and work ethics... how do you end up with them to begin with? There can't be THAT many of them. Are you working for a huge company that hires by the hundreds and just don't have time to properly vet/interview individual hires? I don't even mean LeetCode, just casual questioning, code samples, etc.
I believe you, I just have a hard time understanding how somebody so terrible gets onto your teams to begin with. None of the coworkers I've ever worked with have ever been like that, and though all we all start at different skill levels for different things when we start, that tends to equalize itself after a few months of working together.
Why is it a problem that some people do the bare minimum? By and large they still contribute in some small way to the project
I sense that your bar might be quite a bit lower than the bar I would apply, solely based on that comment. If you think doing the bare minimum is OK, your bar very likely is below the bar that I set. While it's hard to actually define and talk about the standards we think are to be met or not, here is one thing I value and that thus goes into the bar.You should put 100% of your effort into your work, when you work. I'm against the overwork culture that exists in a lot of Corporate America. Don't do 150%. Don't work 60 hour weeks. That doesn't impress me. What I expect from an employee is that they work however many hours their contract says they should ("nominal hours" if you will in places where this isn't well defined by contracts) and that they give 100% of what they can do during that time. After that time is done, stop working. Do other things. Be with family. Be with friends. Go on a date and start a family or whatever floats your boat but stay away from work. But if I see you on your phone, looking through Facebook or Reddit or HN every time I enter the room (and you quickly put it away) we're not going to be friends. I love WFH btw. Never want to go back into the office. But you better not "do the bare minimum", i.e. be on HN 80% of your time that you "work".
I don't think people can give 100% to anything 8 hours a day, 5 days a week. That's just a recipe for burnout. Our productivity ebbs and flows like moods. I mean, we're really not that more evolved than apes, and to expect us to behave like finely tuned robots is kinda unrealistic to begin with.
My quality bar is basically "does it work, is it readable, can it be modified and maintained without too much frustration". It's not going to win any awards but it's also never caused any major complaints that I know of or any major catastrophes. And to deliver that, I give 80 to 90% pretty consistently, between 30 and 50 hours a week depending on circumstances. My peers too. Sometimes my coworkers have kids who are sick, sometimes they have some personal errand to run, sometimes they're moving or having a bad breakup or just needing a mental health day. And sometimes they work late because they have nothing else to do and really want to wrap up that new feature for the next version. My managers follow similar balances too. I don't expect them to behave like machines, because they're not. And it goes both ways.
I never once thought, "I'm going to try to get away with being lazy today because the boss is away". I value my contributions at work, and even if it's just mediocre code, it's stuff I still pour a lot of energy and sometimes emotion into. It's just paced so as to not cause burnout. I also don't think of my employers as temporary steps on some treadmill to riches. I work with them as much as I work for them, because I believe in the company's projects and values.
Shrug. Different cultures, maybe? I don't work for assembly line code mills. They don't think of me commodity labor. With a bit of mutual respect and empathy, it seems to work out pretty well in the end. That's just my anecdotal experience though.
"does it work, is it readable, can it be modified and maintained without too much frustration"
I think that's a really good base. I suspect there's more behind this that meets the eye. While we can debate what exactly constitutes "readable and maintainable code" just the fact that you mention these things tells me that we could probably have a really nice philosophical discussion about what exactly that means to each of us, learn from each other, maybe make each other learn something new or see something from a different angle. There's a lot of opinion vs. cold hard fact in what is "readable" for example. The kind of "average person I don't want to work with" wouldn't even know where to begin regarding those things. They copy and pasted stackoverflow posts together to try and pretend they "worked" and got "stuck".You mention between 30 and 50 hours. I don't think this is incompatible w/ what I wrote and how I see things. I just didn't spell them out in more detail (long enough post already but this time I'll try to just write it all out). Let's say your nominal hours are 40. I think it's fine and should be normal to sometimes do 30 hours and sometimes 50 hours. It should just even out. Like you say, sometimes you have an errand to run in the middle of the day but you have kids and can't just do a couple hours longer in the afternoon that day. But you can get up earlier one of the next days and add the two hours of your time that you promised your employer there. Sometimes you'll have hours of nothing but brain farts but other times you'll have a stroke of genius while you're in the shower and you code it up in 10 minutes the next morning. There are your mood and productivity ebbs and flows. I'm not saying you have to deliver that task that nominally takes 8 hours to do in exactly 1 wall clock work day. An 8 hour task is probably going to be spread across 2 actual wall clock work days. Not that anyone could actually make such an accurate task estimate.
And yes, it should be OK to work late sometimes because you just want to finish something off. In fact, I expect this kind of flexibility from my employers. I must be able to start at 6a.m. one day because I couldn't sleep as well as working till 10p.m. another day because the S.O. and kids are gone that evening and I want to do that refactoring I never have time to do otherwise. If my employer forces me into a 9-5 instead (i.e. hours outside of that don't "count") then I will be looking for a different employer. I also expect the employer not to expect me to work 60+ hour weeks. I don't want to have to pretend to work 60+ hours while actually goofing off. So of course those extra hours I did that evening have to even out as well. I'll maybe take the Friday after that off or do a half day or something. The last bit is important I think, because otherwise it leads to peer pressure and the aforementioned overwork culture. I don't want to have lots of people on the team that "have nothing else to do" than to code for the company till 10pm every day. Even if they're all about code and that's the only thing they love doing (been there earlier in my life), do it for a side project, open source work, you name it.
Like I said in the edit, when I say 100% it doesn't mean there's not time to talk at the water cooler or answer a personal message here or there and sitting around discussing soccer results w/ someone after lunch while having a coffee. But it does mean not taking 1 1/2 hour lunches every day of the week and counting them as work time. Or walking around w/ a cup of coffee all day, chatting and distracting everyone else. Someone that feels "caught" and quickly stashes the phone away when you enter the room wasn't just answering the S.O. about who's gonna drive little Joe to soccer practice later. They've been on HN since you left the room 3 hours ago.
I guess you can see how we're not really that far off. Empathy and respect, for sure. But I have to actually be able to respect the other person. Some people I really can't bring myself to respect. I rather wonder how they got where they are and I want to be as far away from them as possible. I want to work with like minded people with similar work ethics. I don't want to work with people that spend 7 hours of their "work" time on HN and then invent reasons for why they got stuck on the task and when you take a look yourself (to help them get unstuck) it takes you all of 5 minutes to do the entire task. OK 5 minutes is a bit exaggerated but I guess you get the point. Unfortunately there have been people that I had to work with (that were at similar "experience levels" with me) that took entire weeks to not finish a task that when I took it over was able to complete within 2 hours while doing it from scratch. I'm really sorry, but I just can't respect someone like that (professionally).
Regardless of the initial reasons, if you are continuously detached from your work you are extremely unlikely to get very good at it.
Our brains are actually wired to filter out information that you don't find interesting and even if somehow get aware of the information -- to quickly forget it.
Our RAS (reticular activation system) is part of brain that wakes your attention to facts that your subconscious is programmed to recognise as interesting. Have you ever noticed that when you get interested in some topic (for example cycling) you immediately start noticing a lot more about the topic in your life (like when somebody rides a particularly interesting bike) even though nothing about the world changed in the meantime (no more interesting bikes today than a month ago)?
Now that I think it might be enough explanation for why devs these days seem to be so weak compared to what I remember from decades ago. Because if the same problem of detachment from work applies to large portion of population then this large portion of population will be doing very poorly at getting better at what they are doing.
In software development the additional problem is that the number of developers has been growing exponentially for quite a long time and so there is only very small proportion of devs who remember world from before "big tech" boom.
(For the record, I also copy SO code into my projects, but I at least leave a note on what specific problem I’m solving and a pointer back to the question.)
This seems like an oft repeated myth, but you say it's your personal experience, so I'm really curious what you mean by this. These are folks you've seen in SWE who just like, not opening any PRs? Just pretending to do busy work while some nice coworkers do their assigned tasks? How does this work?