The worst programmer I know
dannorth.net
dannorth.net
At the time, I was known as a "Windows expert", so they hired me to help improve that version and help the team get more familiar with Windows programming.
I would often spend the first part of the day on what I called "house calls": visiting other developers' offices to either pair program or troubleshoot bugs or just talk about Windows API best practices and the like. (Yes, we all had private offices!)
After a while, one of my colleagues asked a question that stuck in my mind: "How can you afford to be so generous with your time?"
Sure enough, a few months later I got a review with a mediocre rating and a comment: "Your productivity hasn't been quite we hoped, especially considering that the rest of the team has gotten more productive lately."
Which was exactly what I thought they had hired me for!
I think this makes sense especially for smaller companies, but it does put a extra emphasis on hiring well. Basically, I'm expected to code and helping my team is secondary to that. If I want the team to succeed I need to hire people who are self motivated and competent enough that they only require a little guidance here and there.
Turns out that's very difficult to hire consistently for. Finding self motivated and highly skilled developers just isn't all that easy in todays climate of boot campers.
There’s an article that was going around again about ‘glue work’ ([1]) that has a story where an engineer gets caught up doing all this kind of mentoring, coordination and other work like that and then is passed over for promotions because they don’t have technical achievements (though they claim to have become instrumental in enabling everyone else’s technical achievements).
The article never gets to quite the right conclusion - it’s actually massive management failure - what I was thinking the whole way through was “why hasn’t somebody sat them down and told them to do their actual job??”
Mentoring and code review are both super important, but if the organisation wants you to focus on getting tickets done then you basically just have to, unless you can convince them to actually add the additional work to your actual role description or get enough seniority to add it yourself.
But it’s good to have feedback on what kind of work you’re actually going to be measured on in performance reviews, promotions etc.
I also had a very good relationship with both the VP of engineering and the senior VP who oversaw the entire product and who I'd worked with before on other projects.
I did leave eventually, but it was for unrelated reasons.
I think the reaction to your story is so strong, because many can relate to having a good work situation which eventually turns sour through something like this. It is also good to hear that handling it can be done gracefully. Like many things, it is a two-way street.
I was hired at a company to help scale their development because their app was growing fast but they needed a leap forward in architecture and approach or they couldn’t keep up with growth.
I documented everything I did from day 1, from what I was doing as well as why.
When it came review time, everything ended up reflecting really well, for I may have closed less tickets than my peers, my peers where closing more tickets than ever, and there was a direct line from my work with them to that productivity increase.
Once upper management wrapped their heads around this they completely understood why I was effective at helping shift features: the A -> B wasn’t possible without me spending lots of time with others and helping with their projects, and we would have needed more headcount to achieve what we did by having me work with the org the way I was vs trying to juggle feature work with it
It’s all about the metrics at the end of the day, in some ways. If you can demonstrate your impact across the board it’s hard to dismiss
Luckily 2 years later I went a startup and similar great experience of team work and supporting each other continued. I worked at 2 more startups which grew a lot and were super successful and the culture continued.
Only in recent times, (post 2019) I have noticed that people are obsessed with performance rating systems and gaming them. I notice junior engineers are not as curious to learn or challenge-seeking as engineers a decade. And I notice recently promoted senior engineers are not as talented either. I used to think this had to correlate with dominant programming language – c/c++/go vs ruby/java etc. but I don't know if that fully explains it.
The problem is financials on both employee and employer side.
If you actually want to have a chance at a decent lifestyle without being born into existing wealth, there aren't that many options in the first place, and of these IT is the only sector that doesn't take care much about formal qualifications/education - although you're almost guaranteed to make money if you have a CS degree, you still have a very high chance of doing so if all you have is a coding bootcamp and willingness to learn.
However, unless you land in a well funded startup that has money to burn and not much oversight / managers have actual freedom, the organizations capable of paying that kind of money tend to be very large, very bureaucratic, and pay rises are closely tied to some sort of "performance metric" - hence if you want to rise in level and pay, you gotta game the system because HR won't just give you a pay rise based on your manager's good word, they want something as evidence, even if only to insulate themselves against claims of discrimination or nepotism.
And to make it worse, even if you're in the first case of a well funded startup, if it succeeds and grows eventually "professionalism" will creep in sooner or later - either because the company hires enough experienced people (particularly in HR and finance) that bring it with them, because the company gets pressured to do so by investors/boards/unemployment insurance/legal requirements, or because inevitably complaints of discrimination crop up.
There most definitely is a correlation here. Language shapes Thought and the more complex/expressive a language is the more does that Programmer have opportunities to explore new paradigms/ideas that expand his mind. Your knowledge footprint increases and you do get better than somebody else who learns a "simpler" language and/or just stays at the surface level without any exploration (i.e. i will just use this API and not learn about anything else).
Each repair job had the same priority but some were much simpler than others - one month I thought I’d take the base station jobs to learn and because no one else was repairing them. They took longer to fix but obviously were more crucial to operations.
At the end of the month PHB held a team meeting where pie charts of utilisation were shown and I had performed terribly against the rest of the (senior and experienced) team. That was the moment I learned that the senior staff were picking off quick and easy jobs for a reason, and that office politics was a thing.
PHB couldn’t understand my reasoning of selecting those jobs and the outcome was his dislike of my performance… glad I learned about poor bosses that early in my career.
I was reading it to a close friend just now, and I have to confess that I choked up a couple of times reading it.
So again, thank you, my friend.
p.s. You don't happen to be anywhere near the SF Bay Area? If you are (or even if you're not), please drop me a note at the email address in my HN profile.
Anyone else who is in the mid-Peninsula area, feel free to do the same. It would be nice to meet up with people who have an interest in this topic.
The result was that my annual review was meh. They recognized and appreciated my work helping the department as a whole, but my individual metrics were lacking.
As I had a family to feed, I just started keeping my door closed and cranking out my own work. My reviews then imporoved. I realized that the large law firm just didn't have a system in place to reward the work I was previously doing, so I adjusted to what they wanted. "There is no spoon." :-)
I’ve seen too many stories of people optimising for the “team”, but losing their job or being looked over for promotion due to negative perception from those higher up.
The opposite is also true, sometimes unfortunately. Once a good reputation has been established (whatever is currently valued in the company), any amount of misbehaviour will be tolerated for a long time.
It shouldn’t be this way, but that’s been my experience.
One important ingredient for this is to know many companies will actively lie about their values. Typical case is, everyone tells you they value quality and feedback, while in reality everything is rushed and actual suggestions are at best thrown away in the "later" bin.
> Once a reputation has been established, it’s then possible to go about changing things, but not before.
I've noticed 2 patterns in my various gigs in the past: The virtuous cycle where I'm trusted to build something with significant autonomy from the start, I end up being happy, motivated, productive; and the vicious cycle when I'm just a new untrusted cog in their machine, my motivation & productivity plummet.
As far as I can tell I have no control over the initial condition, and the only way I could break the cycle was to start fresh in a new assignment. Some would suggest I suck it up and work my way up, but to be honest I no longer have the energy to pay my dues over and over again.
Yeah, I feel your pain on the viscous cycle. For what it’s worth, I have managed to “hang in there” in such situations and the situation turned around. Normally it requires some change in the upper management or getting into a different team/role though (as you said, a “new assignment”).
> Some would suggest I suck it up and work my way up, but to be honest I no longer have the energy to pay my dues over and over again.
I hear this too! It’s a massive pain to have to go through the “we don’t trust you” phase at a new company. Hopefully as we become more senior, this is less of a thing, but for me there’s always been a period of pain when changing jobs.
There is something: as part of the hiring process, arrange with your boss to get a warm introduction to the team. Make sure that your boss describes the challenges that led to your hiring, your qualifications (and that they're excited to have you on the team!) and present the vision of the positive future impact that you are likely to have.
I've benefited from these kind of intros when I was a consultant. The senior consultant would hand off the engagement to (junior) me by making me look like a star. Also, meeting people in person as soon as possible after you're hired boosts trust.
> Which was exactly what I thought they had hired me for!
It's good to regularly update your manager with what you're doing and accomplishing, as they may not realize it at all.
Ah, the good ol early 2000s, where devs had "offices" or "cubicles" to themselves.
I have a distinct memory from not that long ago when I was unemployed and asking people for advice on what to put on LinkedIn and on my resume.
One consistent piece of advice was "Don't list anything more than five years ago. People will think you're old!"
I thought, "Screw that, everyone already knows I'm old."
So I decided to just tell my story, all the way back to the beginning in the days of punch cards and Teletypes.
I am grateful that you appreciated that.
As it is a holiday weekend, I may not be able to get back to every reply right away.
I am grateful that zdw's submission and my comment led to such an interesting discussion! Thank you all.
My new boss admitted at our first review that he had written up a performance plan, but threw it out not long before. What happened was we just transitioned to an open office, and he got to see the line of people who would come to me for help, and how I wouldn't turn anyone away.
I was a little salty about losing my cubicle, but that experience definitely made me appreciate being in an open office.
Of course, I haven't worked in an office of any kind for years and will never take a job that isnt WFH again, so take that last bit with a grain of salt ;)
Did the culture around questions change compared with working from a shared office?
That said, the challenge is getting over the hump of being proactive. I'm not sure if it was working in an office or the agency model of hourly billing plus time sheets, but I find people are far more likely to spin their tires and waste time until I finally convince them that they can ask me questions any time.
Perhaps there's something about working remotely that people feel the need to be more independent workers, I'm not sure. I'll initiate pair programming sessions and ad hoc design discussions to get the ball rolling, and encourage them to do the same. That tends to do the trick, though as I mentioned at the start, my day to day the past 6 years has had much less mentoring responsibilities and opportunities.
Well after a few weeks it turned out not so positive. They had quite a broad knowledge of things, but not in depth. They didn't think far enough (like for example, giving the tip to "use a FIFO SQS queue" despite not really understanding the fine-print, but still they persisted and it ended up in a prod rollback), they preferred educating about code style, didn't really listen to feedback (not in the sense of ignoring it, they didn't even realize that they weren't so senior compared to the rest of the team at all) and in general slowed everyone down without bringing much benefit to the table.
In the end they didn't get fired or something like this. They did another lateral move as the team explained why the team doesn't want to continue this. After their next team change, they talked about that this specific team didn't want to accept their help and that they had received bad feedback since they didn't produce code.
Obviously this is just an anecdotal counterexample, but still this can happen as well.
A director said to me: "I can't remember the last thing you worked on." In that moment I knew it was time to leave. I was gone a few weeks later.
'In the midst of Shannon’s career, some lawyers in the patent department at Bell Labs decided to study whether there was an organizing principle that could explain why certain individuals at the Labs were more productive than others. They discerned only one common thread: Workers with the most patents often shared lunch or breakfast with a Bell Labs electrical engineer named Harry Nyquist. It wasn’t the case that Nyquist gave them specific ideas. Rather, as one scientist recalled, “he drew people out, got them thinking.” More than anything, Nyquist asked good questions.'No, you probably shouldn't be saying that:
https://en.wikipedia.org/wiki/Harry_Nyquist
https://en.wikipedia.org/wiki/Nyquist_frequency
> but what's stopping a dozen other things at least that useful from being part of the answer?
Because someone needs to act, and that's exactly what Nyquist did, in a very unobtrusive and non-confrontational manner.
> Because someone needs to act, and that's exactly what Nyquist did, in a very unobtrusive and non-confrontational manner
Seems like your headcanon. It reality they ate lunch together and passed ideas around.
I.e. there's no check or control on their output without lunch or breakfast with him, maybe it'd have been little different.
Engineering excellence is not a prerequisite to business success. Managers know this.
Why else many things any one of us could list from the computing business.
Woe is us. Five or ten years is not considered short term
> . I try to give more to the clients that pay more, or at least create something that I can reuse in the future, while making sure what I deliver is stable and not a big ball of spaghetti to make the next developer/engineer cry at night.
I am not sure about the "...who pay more". As I am currently woefully underpaid I am more sympathetic to that view than once I was, but, I still view myself as a professional, and I act with professional ethics.
Partly that means speaking up when I see a project going near the rocks. I do not make too much fuss, but I do say it out loud.
That has cost me plenty. Our industry is full of people who are very good at one thing or another, but do not know their limits.
Part of my "being professional" is knowing my own limits.
It is important to know what you can and can't get away with, and my clients don't pay the cost of the business I'm employed by making bad decisions. Where I am able to, I strive to provide a product that is better than the average, in the hopes that I've developed a solution that can possibly benefit the company or myself in the future in regards to software quality or speed (along with stability) of deployment.
I have heard of the Nyquist frequency, the nyquist limit, the nyquist sampling rate and the Shannon nyquist theorem.
As far as I know no other individual has had this many “things” named after him.
Note that the "Known for" section on his main page has 119 elements. But they're not all named after him.
"In an effort to avoid naming everything after Euler, some discoveries and theorems are attributed to the first person to have proved them _after_ Euler."
I always remember as “questions are harder than answers”.
Woah. He has a huge list of "Known for"!
Good people amplifiers are domain/technical experts; Scrum Masters/Agile Coaches are neither.
At this point i think it is rather well established; eg. "Taskmasters" in - https://en.wikipedia.org/wiki/Bullshit_Jobs
And yes . . . I do code.
It has nothing to do with coding but everything to do with adding tangible value towards achieving an Objective Goal (Business/Technology/whatever). Hence the Problem Domain and technologies used in the Solution Domain are what matter and everything else is ancillary. The Processes/Methodologies used are only useful in as much as they help us understand the problem domain better and map it to a specific solution. Thus the application of the former is informed by knowledge of the latter and cannot exist by itself. Hence the reason we have so many types/variations of Processes/Methodologies; there are some common principles but will always need to be adapted/customized to the problem and tools at hand.
This is what is the problem with modern-day Management/Leadership and eloquently pointed out by David Graeber(Bullshit Jobs - https://en.wikipedia.org/wiki/Bullshit_Jobs) and Jeffrey Pfeffer(Leadership BS - https://jeffreypfeffer.com/books/leadership-bs-fixing-workpl...).
I highly recommend reading this speech by David Packard (one of the founders of Silicon Valley via HP) to new Managers given in 1960 and note how relevant it is for all companies today - https://gizmodo.com/the-hp-way-how-bill-hewlett-and-i-built-...
Relevant Excerpt:
Over the years we have developed the policy that it is important for the supervisor to thoroughly know and understand the work of his group. A debate on this has been carried on by management people for years. Some say you can be a good manager without having the slightest idea of what you are trying to manage, that the techniques of management are all important. There are many organizations which work that way. I don't argue that the job can't be done that way but I do argue strongly that the best job can be done when the manager or supervisor has a real and genuine understanding of his group's work. I don't see how a person can even understand what proper standards are and what performance is required unless he does understand in some detail the very specific nature of the work he is trying to supervise. We have held closely to this philosophy and we intend to continue to do so. We expect you who are supervising to learn techniques of supervision and keep up to date. I want to emphasize you can supervise best when you know a great deal about the work you are supervising and when you know the techniques of supervision as well.
I've had multiple Producers who "understand the work" of creating mobile games as a whole and understand how the team needs to work and interact to produce a result on time.
None of them could code a mobile game to save their life.
What your example is talking is a situation where a fresh off the press MBA is shoved in to a very specific field and they start just doing pure numbers and Excel management out of a management book without knowing how that specific industry operates.
Managing a team of deep-sea welders is VERY different from managing a software team, which is again different from managing a team of people building a physical machine.
True. However, the relationship between them need not be a "Total Function" but definitely needs to be a "Partial Function" to a certain degree. You cannot be completely divorced from the "How" and hope to have a good "understanding" of the system.
>Managing a team of deep-sea welders is VERY different from managing a software team, which is again different from managing a team of people building a physical machine.
This is precisely the point; domain/technical knowledge is needed to effectively Manage a project. This is independent of knowledge of techniques of Management. The problem today is that entire industries have been created out of thin air which posit that the latter is sufficient if one follows a certain process/methodology which is patently absurd.
No, I think at least in large part, you missed the point.
> It has nothing to do with coding but everything to do with adding tangible value towards achieving an Objective Goal (Business/Technology/whatever).
As I understood _Bullshit Jobs,_ "adding tangible value" to some business that doesn't actually add anything of actual (non-monetary) value to the world is bullshit. There are whole industries that make billions of dollars, but everyone who works in them is still doing a bullshit job. (I often think I do.)
From https://en.wikipedia.org/wiki/Bullshit_Jobs :
... as he describes, five types of entirely pointless jobs: ... 5. Taskmasters, who create extra work for those who do not need it, e.g., middle management, leadership professionals.
In companies, he concludes that the rise of service sector jobs owes less to economic need than to "managerial feudalism", in which employers need underlings in order to feel important and maintain competitive status and power.
From https://en.wikipedia.org/wiki/Bullshit_job :
Graeber also formulated the concept of bullshitization, where previously meaningful work turns into a bullshit job through corporatization, marketization or managerialism.
The best amplifier I've met was hired as a junior coder to my team and was paired with a couple of 10x coders on a project with a client who was "hands-on" and loved to micro-manage, having been a software developer themselves a long time ago.
The Amplifier's coding output wasn't that good, but the team as a whole was doing better than before so I investigated.
Turns out the 10x guys weren't that keen on communicating with ... well anyone outside of the team, much less with non-technical clients (or technical clients who loved micromanage). Both were your stereotypical cold pizza and warm cola coders with limited social skills. They could kinda sorta manage the meetings and emails directly from customers but didn't exactly relish it.
The junior hire was more like a 0.5x coder, but had ample social and organisation skills and worked extremely well as a liaison between the team and any external contacts they needed, taking over most "useless" meetings with the product owner and customer.
The junior coder ended up receiving some training and was "promoted" to a Scrum Master/Producer/Project Manager (the exact title escapes me) for the team. Everyone was happy and productive.
Your "Amplifier" is more like what is known as a "Field Applications Engineer" in the Embedded industry i.e. somebody with enough Domain/Technical/Marketing/Sales skills fulfilling a tangible need for the Business. They are more a "Business Process Optimizer" than a "People Amplifier"(a term i made up :-) who i define as somebody who can spark creativity/insights/viewpoints etc. which push others forward in their problem-solving endeavours. It is not merely removing hurdles/book-keeping/time management/liaisoning but an active role involving discussions/brainstorming/idea generation. This cannot be done without bringing some expertise to the table relevant to the problem at hand.
While I did go out to lunch with coworkers more often while working in the office it was almost exclusively with direct teammates, and other groups I occasionally saw where also on the same team.
Now that I'm fully remote, I will typically do a few "hacking sessions" over Zoom every week. Its much easier and more comfortable than standing over their shoulder in tiny cubes we used to have.
That said, especially now that i am fully remote, I've been trying and mostly failing to get developers especially across teams to talk and collaborate more. But its not too suprising: I was recently in a call and I was introduced to another developer who I replied, "Yeah, I know you. I was in the cube next to you for 2 years and on your team for 6 months."
Remote creates some new challenges, but its a culture thing, not a technology thing.
It's not the same as having lunch together but it is enjoyable and useful.
The answer is that I never was good at social things like inviting people to coffee.
But it doesn't help that we're taught to "protect" our time and avoid unnecessary calls and meetings. Presumably so we can write more lines of code, close more tickets, or earn more points like the story and other anecdotes here.
I think I may try something new in my calendar. Worst case I'll end up sitting in front of my computer alone with a block for the next hour and nothing to do but work on all those things I need to do anyways.
Teams that attempted to measure the points in good faith were stessed and most of them showed signs of burn out. They regularly worked 60 hours a week.
Teams that gamed the system and understood the impossible task they were assigned always gave the highest points total to a ticket they could or broke it down into smaller achievable tickets that continuously added to their points totals. These teams were filled with happy stress free developers.
In an environment like that playing by the rules is a suckers game.
When I eventually quit, every sr engineer at the company; 7 total, followed me within 4 months.
So in the short term, the company benefited, yeah? They got more work out of the same people than they would have if they didn't apply the pressure.
Reminds me of an old boss I had who would flat-out say that to get a project done we would "hire someone and burn them out" - he planned to only get six months of useful work out of someone, and if they were stupid enough to stick around for high stress and low pay, that's just a benefit to the company.
(I didn't last very long there either)
But it sure is a shame we're past the days where you actually want to retain and nurture tribal knowledge. imagine if other engineering disciplines simply hopped companies every 2 years, or if they cut half their civil engineers for a better earnings call (thankfully, he government doesn't have "shareholders". just taxpayers to disappoint).
The management decided to base bonuses on "number of open tickets assigned to a person measured on day X". Smaller being better.
(Un)surprisingly I got a bunch of tickets assigned to me on day X-1 and they were reassigned on day X+1. I didn't mind, since my bonuses were determined by customer satisfaction =)
But that is part of the point of scrum. To break down stories into consistently stress-free achievable stories, rather than big risky ones filled with unknowns.
I'm not saying this was a good workplace, it doesn't sound like it at all. But to me, it sounds like the devs who you think gamed the system, were mostly behaving the way scrum is meant to incentivize. Happy, stress-free development that delivers consistently improving software.
(Minimum point totals per week leading to inflated point values is terrible management, though.)
The issue with scrum or any process that involves estimating is that every software project will inevitably have some risky element or difficult to estimate task that is essential to the execution of the project. Scrum will incentivize teams to avoid the essential work and guide them towards work that is easier to estimate.
Certainly having a good product owner can mitigate this because she can do the work of identifying and breaking down the intractable to something more actionable.
But in that case you’re depending on the people on the team to make good choices. Smart people can do that regardless of the development process they’re using. It’s unclear what value scrum brings to teams at all. It doesn’t make bad teams work any better and it restricts how smart teams can operate.
One thing that scrum does give is it provides management metrics they can use to measure performance.
You are exactly right here. At this company though, that risk on a personal level could mean a pip. So the happy teams inflated the story points massively to ensure that any or no risk was accounted for and they survived to code another day.
Say you’re developing software for the next Super Bowl broadcast - it’s useful to know whether you’ll deliver what you said you would. If it’s looking like you can’t, you can start to make educated decisions about what work to cut and get a better idea of what you actually will deliver.
In your Super Bowl example, you'd either get a team that would focus on doing the scrum activities but never deliver anything useful regardless of how many points it would take, or you'd get a burnt out team that's on the verge of flaming out. In either case "Story points" provide you with no predictive capacity even though predicting would provide value.
But it's an important tenet of scrum that velocity is only meaningful in a single team[0], the root management failure in OP's case is comparing different teams.
[0] and teams cheat themselves too. I recall one advice early in my career that a velocity increase with no underlying process change was likely to mean.. that the team started to overestimate complexity, and one should understand what went wrong.
When a team shifts projects, and changes members, there are too many variables and not enough data points, so points become useless.
Since most teams change both of those thing fairly frequently, in the close to 20 years I’ve been doing this, points are generally not helpful.
You can't estimate non-trivial software, and if you are doing trivial predictable work, you should be automating it, not endlessly estimating it.
I didn't say I would "deliver" anything. It's done when it's done. You can't predict the outcome of a software project. Many of them fail and micromanagement makes them more likely to fail.
so if you automate trivial predictable work (for example by making a CRUD app generator), you're moving to non-trivial software territory with costs unknown (as you said, you can't estimate), potentially very high
On the teams that played fair, it was a mix of sr. and jr. and the sr. measuring that story at a 3 meant the jr. was working the weekend. Over and over again.
Note: On the happy team, we had almost no supervision, not even a scrum master. We just looked out for each other. That 3 point story often suddenly became an 8 as the end of the week approached and no one blinked. That team incidentally was the only one that consistently got good reviews from management.
What does "played fair" mean? Did this organsiation have a fixed definition of the value of a story point?
EDIT: The reason I ask is because when story points are used "correctly" their value is defined entirely relative to the previous output of the team which produced the estimate. Like, their purpose is to allow dev teams to do relative estimation (which is pretty easy to do), but also enable someone to produce absolute estimates based on the team's track record of delivery. Team says a story is a 5 pointer? Query previously delivered stories which the team also said were 5 points and if there's enough data you'll be able to forecast with reasonable certainty how long it will take them to deliver this new story. Used this way there's no "fair" value of a story point - it doesn't matter if one team uses point values in the range 0 - 1 while another uses point values in the range 1,000 - 1,000,000.
The whole thing breaks if you start comparing point values across teams, or say that 1 point is 1 day's work or whatever.
I left engineering for an engineering job in finance. No scrums, no POs, just trader driven development and I haven’t looked back once. Glorious.
In my experience this is usually handled by pushing back on the requirement or kicking the can down the road.
Maybe as-written but not really ever as-practiced.
I’ve worked at places where it was more important for management to know what to expect than to achieve raw productivity towards a goal.
The people who were estimating in good faith may have assumed that management was acting in good faith. Whereas a lot of projects are created aspirationally or have artificially short deadlines to “motivate” people. The stress they incurred may have just been for the emotional satisfaction of a manager and not have provided any more value than that.
I read this as the teams that attempted to measure in good faith did a poor job at estimating. If management tells you that you are required to deliver 10 points per week, then 10 points should take you 40 hours with rare exception. Whatever other idea you had in your head of what 10 points "should" mean is simply incorrect.
If its 10 points a week then you estimate based on the assumption that 2 pts is a days worth of work.
That, coincidentaly, is what ours roughly shakes out to be.
Sounds like the stressed teams were lacking in common sense.
Even in an environment where story points essentially mean nothing it already ends up with some people just wanting to put high numbers on everything.
The only usage of points is to improve the predictability of the output of a team. It cannot be used to measure performance in an absolute way.
If performance metrics are built on points, it just ruins the meaning of points. There is no reason to be honest anymore.
Let me tell you a story about a friend of mine, codenamed tommy. Tommy was an IT guy with incredible skills in networking. He moved to an energy company, fully-owned and operated by the government. Just a few weeks from his arrival, they had to rebuild the entire network from scratch with new, modern, equipments as well as extending the network to all the buildings of the company’s headquarters. They started to look for external contractors to outsource this project but Tommy was shocked by the price the financial department was willing to pay to get this work done, obviously, some non-tech people made the estimates. Tommy interrupted the operation and told the appropriate department he can do the work and needs only the physical equipments (routers, switches, cables) and two guys who can do the cabling. They agreed, and he took the challenge and delivered the work as expected within just a few weeks within less than a tenth of the initial budget. All that he got was a ”Thank you, you did good work” oral endorsement by his boss.
What a time to be an IT techie when your boss(es) are just old-school, who will never understand your true value.
Then leave, become an outside contractor and you can be the benefactor.
Save exceptional work for small companies that will reward it or your own startup.
2. Start a consultancy company and overcharge clients to do this work.
3. Realize that many companies will not reward you for your efforts as you expect and go back to 1
If you're just looking at numbers, something that costs $$$ is "harder to do" than something that costs $$. Any consultant that costs $$$ provides better work (Why would I have paid $$$ if the work wasn't better? Why would anyone charge $ to give the some quality?)
Or ask for more work and don’t be surprised when you do or don’t get rewarded for it.
Not to say things like this don't happen in private industry too - it certainly does. But at least you've got a chance. In most companies there is room to meaningfully bonus or promote or otherwise reward exceptional performance. You may or may not get something, but at least you can ask or push for it, and if they want to do it they can.
Neither do private companies. The measurement becomes the goal. And that measurement often has nothing to do with legitimate performance.
In a system that doesn’t have any forms of rewards, this should be a logical path to follow. In fact, Tommy has considered this approach as the way to go from now on but only when he got hit hard by his first experience.
The only way (I think) $Tommy could have done it cleanly would be to quit and instead start the enterprise with $friend before approaching $job.
It’s not just about potential corruption but also about how risk averse large organizations are. The tender would definitely include revenue, employee count, and potentially other thresholds, as well as require that X such projects have successfully been carried out during the past Y years.
The value of writing good code is self explanatory. You probably use some of his code today.
But he was also great in a firefight: customer is dead in the water and it might be our fault. He’d show up cold and “jam his fingers in the holes in the dam”: quickly figure out what was wrong and then rapidly write and install the most hideous spaghetti code that cot the customer up and running. Code that could not be checked in, or be refactored. Eye-bleeding stuff. Someone would have to take the time to engineer a proper fix, but the immediate crisis was averted.
I was actually much more impressed by the latter skill — among other reasons it’s simply rare. Also he was just a nice guy and everybody loved him.
(Won’t name him since I described some of his code as hideous)
Not exactly something to encourage, but it sounds like he has experience in competitive competitions, where generating code to a problem on the fly is necessary. It's not something you can't learn yourself, but rote memorization of common problems and solutions (to the point where you can mechanically type down some algorithm from memory) is the bane of my existence
In my experience production fires are rarely put out by rote algorithmic knowledge, the skill is more having a detailed knowledge of the inner workings of every layer of the system so that you can come to the right conclusion based on the very limited information available in the average production monitoring system.
.
>the skill is more having a detailed knowledge of the inner workings of every layer of the system so that you can come to the right conclusion
Yup, and that's transferable skills from competition coding. You're not juggling algorithms in your head per se, but you juggle whatever tribal knowledge needed as options to cycle through. That combined with the above mindset can lead to such skills.
Yes it is. Putting out fires, quickly, is very important.
The problem comes later when the breathing sapce arrives to regularise the fix and replace the band-aid with good quality code.
At this point no fire is burning, the problems are not immediately visible, and it takes very good management, right up the stack, to fix that sort of problrm.
> Not exactly something to encourage
Yes. Exactly right. Because the band-aid with all its ugliness becomes the permanent fix because there is no revenue box to place the work in takes to fix it into
Yeah, that's what I was getting at. Especially in my industry, we don't get too many chances to convince the product managers to "go back and actually fit the code". From a business sense, it's a great skill, but business realities equate it to the ability to plug up a dam with a cork.
"This will fix the problem for now, BUT it will make _everything_ harder in the long run unless we spend time to do it properly".
Then when they complain about stuff taking longer than it should I can just refer to the ticket/email/meeting memo and remind them that I did say so.
We're set up a weekly meeting to alleviate the issue and it's working OK. The hardest is finding out which "type" is the right one, when it's not an emergency but there's a tight schedule/unclear specifications... At least we make a common decision
Just to be clear, I’m not talking about programming skill or value. I’m talking about employment and evaluations which I think most people are commenting on.
And also, it’s not mutually exclusive. I know many people who are very productive and also manage their optics well.
Helping juniors do their job is great and all, but you still need experienced people to work on the hard and complex stuff that juniors can't because they don't have the knowledge/experience/people-skills. No amount of pair programming can replace that.
You don't want to be in a situation where you have really really well implemented low-value features, but the high-impact and high-priority hard stuff was not done because some of your most experienced folks were helping the less-experienxed people write effective unit tests or whatever.
The firms that claim to do that almost invariably do not hire people with 20 years of experience, they hire people with 2 years of experience 10 times over. Sometimes that's fine. Usually it's not.
Often the long-term guys I met are the shit guys who are coasting, still writing code as if it were 2005.
Worse still is when their language knowledge has coalesced around an old language version and they're not using any of the new stuff, as I've seen code bases that are entirely incompatible with new libraries.
Like all new libraries generally depend on DI, but all the code is written in static methods and classes so nothing can be easily injected and you get all sorts of threading issues when you try.
Also, I get what you’re saying, but DI was around in 2005 and some good engineers (older than I) were using it back then. It seems lot of good ideas skipped a generation!
Being employed as a programmer may or may not gain you new experience (which is what matters if you are to be a good generalist). Whether it does depends on whether you are _doing things new to you_ while being employed.
Also, all concepts are “made up”. By definition.
Sorry, no. Those concepts are unrelated to what we're describing.
> Also, all concepts are “made up”. By definition.
I was trying to be polite. Made up by you and nonsensical, is the more accurate phrasing. Respectfully. But I'll be stopping here. Enjoy the day!
No they aren’t. They’re literally the subject of the conversation before you joined it.
The pool for experienced senior level talent won't grow unless _someone_ spends the resources to hire and train juniors.
The incentive being that they can keep the best juniors for themselves and let the others back into the pool for others.
But yeah, the job of every senior cannot be to only help the juniors.
It's very nice of Tim to help everybody else, but doesn't anybody find it odd that all the other programmers need lots of help in the first place, so much that Tim has zero time to deliver anything himself? Seems that the problem is not with Tim, but with management that thinks it's ok for a professional to need help all the time, and for a volunteer like Tim to be there for them any time regardless of what he's paid for (which in this case, was story points as made clear by the author).
Or, it could be said, you need to refactor your codebase so no job is all that "hard and complex".
Should have had one of those seniors build it in the first place, eh, then juniors could be trusted to modify it. Or, what you say, he did? Then why is he "a senior" in the first place, if stuff is "hard and complex" because of how he built it...?
Team players, mentors, software architects; they tend to be tossed aside to make room for coders who can churn out large amounts of code, even as the company's capacity to deliver and maintain features declines over time due to tech debt. Managers always love a developer who can consistently write 5000+ lines per code per week, regardless of how many features they actually ship and how many bugs they introduce.
As a team lead and engineer who has managed some complex projects, the idea of someone writing over 2000 lines of code per week terrifies me... That's over 100K lines of code a year. Think of the unnecessary complexity. There is a very good chance that the same feature set could have been implemented with just 10K lines of code, less buggy and in half the time though that would only amount to 380 lines of code per week! Management won't like that.
I tend to think that the dev who can churn out thousands of lines isn't thinking deeply enough about the long term direction of the project; all the code they're writing is essentially throwaway code.
Because lins of code churned out is not and has never been a good measure of productivity.
That "shower thought generator" might very well be more productive than the person they're sitting next to churning out tens of thousands of lines of unmaintainable code if their shower thoughts are causing people to find better ways to solve a problem.
Which is basically the entire point of the article.
Why not? Peer feedback is a prime component of most performance/rewards discussions at companies. Work outside of points is certainly not a new concept. A manager's job is to distill this information amongst others to their own management chain at the right time.
> We don't have the counterfactual where Bob didn't ask the questions, and Alice did great anyways.
Bob's time isn't unlimited. There are surely instances where he was helping out Joe, Suzie, Darren, and James and had no time for Alice.
Based on your other comment, you seem to think someone being an unblocker/idea generator/dev lead is a "low performer" who weighs the team down. That's just fundamentally wrong.
> The people that can do this without needing Bobs around are the people that will be rewarded.
Unicorns are few and far between, but sure, you do you.
Also, solving the same problem with less code is a lot more valuable than many think. Not only are there fewer code paths to test, the system probably has fewer unnecessary constraints and edge cases to consider. How do you account for negative LoC?
It will take me far longer to come up with the correct 100 lines that is both maintainable and can be worked on by others down the line.
I can pad my lines of code in seconds if I wanted to before pushing the changes. That padding provides no business value and might even introduce bugs.
And how do you handle refactoring? If I come in and refactor everyone else's shitty padding by combining helpers and optimizing code, I'll have negative lines of code. Am I an unproductive worker?
Sure, most code is not some complex algorithm but lines of code is a stupid metric that is not representative of the work done and can be gamed by anyone knowing what they're doing.
It's better to have tests more sensitive to failure, like integration or regression tests.
The key there is caching your results. Don’t run unit tests for code that hasn’t changed.
They still serve the important purpose of checking validity of the code under test though, so if they do get modified downstream at some point and they fail you then know the changes aren’t conforming to expectations of the system.
This of course assumes people aren’t writing highly coupled tests and that is more rare than I wish it to be
It's the team that creates that kind of opportunity for feedback though. If the team has dysfunctions like rejecting deeper discussion or not working beyond jira tickets or checking out at meetings, etc. then it's not going to work. Someone that's good at that kind of supporting discussion will feel push back when fostering those discussions so it will fall off over time.
The teams that do the best work and are the most fun to be on can host those types of discussions though, even remotely. It's worth experiencing if you haven't!
I assume you mean the thoughtful person whose probing questions unlock and unblock everyone else.
Lunchtime conversation is only one enabler of this.
I suspect the person is Hamming, as he makes reference to this in his book The Art of Doing Science and Engineering.
This aspect of what it takes to be a Hamming is curiosity about what other people are doing; you can track this by reading shipped emails or lurking in slack channels, then reaching out individually to the people/teams involved when you wonder about something.
Hamming was intentional about doing this at lunch. The magic isn't lunch, it is in intentionally seeking the information and then acting on it.
You do need to cultivate a culture in the team of people being willing to lower their guard and ask questions though. And I think the key to this is just staying humble so people feel comfortable approaching you.
It has become taboo to say things like "This code is too tightly coupled", "You don't need to add an external dependency for that", "The inputs to those methods are too complicated; your components are micromanaging each others' state", "You're violating separation of concerns", "The cyclomatic complexity of this code is too high; you could simplify all your if-else statements"... When it's not my company, it's impossible to dismiss code when it works right now, even though it is likely to break later.
Warning: it looks like you’re trying to pack too much crap into a single PR and your peers are unlikely to understand what they are accepting.
"This change is hard for me to read and understand"
or
"This is a large PR, and it may be difficult for me to schedule time to review it. Can it be split up into a series?"
I also configure linters and code quality tools to automatically flag some of the more egregious problems.
I'm 33 but I feel like I already have to make an effort to avoid the dinosaur label. I disagree with a lot of modern tech trends but I simply cannot express my view about them even though I could explain the problems very clearly and logically and can provide far better and simpler alternatives. Unfortunately, hype does not yield to reasoning... And sometimes, you're too far into the tech debt and it doesn't make financial sense to rewrite.
My current reality is that I'm a 33 year old working with 20 year olds who think they're geniuses who are going to take over the world in 5 years; from that viewpoint, I'm essentially a failed engineer because I didn't build a Facebook, Uber or AirBnB even though I had 10 years to do it.
Believe it or not, I consulted at one place where the manager decided I was the problem because I was consistently assessing problem code and team processes in similar ways. She asserted that "everyone else understood", even when they plainly didn't understand but where just going through the motions.
Said manager had a number of other issues as well. Worst gig I can recall having in the last couple of decades.
Edit to add: in 1:1s with the manager I was more direct. About the best I can say about that is "at least I tried".
The last greenfield project which I managed from scratch, we didn't have this problem because all developers shared the same mental model of what we were building before we wrote any code. We had a lot of discussions beforehand to get to this shared understanding. There was literally not a single PR which surprised me throughout the entire project and I'm sure none of my PRs were a surprise to any of my team mates either. There was plenty of disagreement throughout but it was always fully resolved through discussion before we started coding each major feature.
I've found that kind of feedback to be useful actually. And when giving similar feedback it is received better with a small change in wording to make it more about the code and not the person. Even if that is the intention the wording does matter. For example:
"An external dependency isn't needed here, try implementing with XYZ instead." "Split this function into x and y for better separation of concerns"
Removing the "you" removes some resistance to receiving the message .
I’ve become fond of mostly asking questions.
I wonder if we could avoid this dependency? Maybe [idea] would work?
Can you see a way to separate the X concern into a module?
Can we split this function up a bit so the nesting won’t be so deep? Would this loop body make a good standalone function?
Without going into specifics, there was a case where I reviewed a PR, asking "this isn't usually how people do file operations, are you sure this is really fine?" To address my concerns, they even wrote a specific test program to "prove" that there weren't any problems with the code. I reluctantly approved the PR since I couldn't just ask them to rewrite the whole patch due to just a hunch.
Lo and behold, after a kernel upgrade and file system change, that weird piece of code caused a multi-week panic for the whole team. The extra funny thing is that the test program above made it trivial to confirm and reproduce the issue once we identified this was the cause.
The idea of measuring everything and acting on the numbers you can get is from the 19th century. Managers have been doing that same kind of practice since then, with the same kind of result (it's a very reliable result), without a change.
When you do things right, people won't be sure you've done anything at all.
He did experiments where he would have workers shovel piles of ash from one side of a line to the next, giving them a new shovel size each day. Found that the ideal shovel size holds 21 pounds [1].
The ideological assumption of his work is that management exclusively does the thinking and the workers exclusively do the doing. This falls apart when the workers have unique knowledge and insight that management does not have.
[1] https://www.mentalfloss.com/article/63341/frederick-winslow-...
AKA every time.
AFAIK, Taylor himself wasn't nearly as radical about doing measurements and only acting on them nor about managers deciding everything and not listening to the workers as Taylorism preaches. His work was one of the many, many management theories that was completely modified to appeal to incompetent power-hungry wannabe dictators (and yet blamed on the person proposing the original theory).
He asked "can you do it faster" and I agreed, thinking I'll make a throwaway version first and fix it later. Needless to say the project was a disaster, rapidly became unmaintainable.
That's how I learned my job isn't to do what the client asks, it's to make sure their project succeeds even if it means making them (temporarily) unhappy.
And I learned that doing it my way will get me fired because the manager has asked to do faster.
The way I have learned to get around this is by making the manager publicly document the request to go faster. If they don't document, I don't see or act on it. Once they document it, I happily go faster and let it all crash and burn. Then when they inevitably try to blame me, I point at the public documentation of the request to go faster and let the blame fall on the person responsible.
if time is the only actual concern for the project's success, a good approach is to explicitly re-scope the feature list and start asking managers things like:
"do we really need feature X to release? can feature Y wait until after beta? did the request for feature Z come from a user or a stakeholder?"
document all that too of course ;) but then at least there is a chance for safety _and_ success
Yes the project will fail. But if my manager only cares about speed, why should I care about anything more? Why should an engineer be responsible for a manager's poor decisions?
Because the corporate hierarchy demands it. Front-line workers are expendable, much like front-line soldiers. Corporations are not democracies, and neither are militaries.
If your job is to write and commit code, you are the corporate equivalent of infantry. In short: a grunt.
And if I am being treated as a grunt, I will act like a grunt aka I don't care more than my bosses. I will even abandon ship at the sign of incompetence and point out the incompetence to others.
Regardless, it’s an important life skill to learn that it’s generally not enough to ask people to do what you want, you need them to actually “buy in” to what you want, and then they’ll actually care enough to at least try make it happen.
This applies to managers and their employees, or also when trying to get on the ground employees to adopt a product initially sold to their manager/execs.
I don't feel the need to get "buy in" for bad faith managers.
An overly broad statement which, my experience, is not true. Managers come in many shapes.
Although, I suppose ironically, if you act in bad faith as a response to this perception, then I think that perception will quickly become true.
If the project fails, and the manager tries to blame it on you, they are de facto acting out of bad faith given the request. Documenting it just identifies this. If the project succeeds or fails, but no one blames you, then the documented request is just there for the record.
If we don’t know if anyone will want the product, the quality of the product is less valuable than validation of product market fit.
Later, I care much more about avoiding accidental complexity and having a great technical foundation.
This sounds like an improvement over the opposite, a code base that is rarely touched and uses eol frameworks. Software is a living thing and if you don’t act as a ruthless gardener you wind up a museum curator with 1990s DEC hardware running in the 2010’s.
The right balance of staying current and not reinventing the wheel is not trivial.
And yes, 10 years is quite possible these days. Besides the infamous Javascript framework churn, things are moving quite a bit slower in recent years.
In part, this is due to the risks inherent to change have been spread out over 10 years instead of backloaded to the end.
Practicing mitigating risks by proactively taking them has value of its own. The parable of ergodic cakes shows this.[0] What % of cakes will fail if 10 people each bake one, versus one person baking 10 over time?
reactjs came out in 2013, so it meets the 10y metric, but it has some internal churn, such as classes, hooks, etc
There are PDP-11s running nuclear plants today with support contracts to keep them running until 2050.
PDP-11s.
Indeed, business people do not typically model depreciation curves for software as they should. That doesn't mean that the plant control system becomes less valuable (the value is tied to the operation of the plant, probably for the lifetime of the plant), but in many other situations it does mean that.
I'm not going to drive off a cliff just because the OKR tells me there's actually a road there but I wonder about some people...
This is my company. Engineer skills, tech-debt, teamwork, camaraderie don't matter. Do as the management says, in the time they've promised to others or else....
https://www.folklore.org/StoryView.py?story=Negative_2000_Li...
It doesn't always work as designed (ok, maybe rarely works as designed), and TLs can get too bogged down in cat herding, planning, and bike shedding to actually work as an engineer. But at least the spirit of the role is sound.
Now TLM (Tech Lead + Manager), however......there's a role that's set up for failure. Be a manager but be judged entirely on your technical contributions.
Any meaningful contribution or engineering is extra credit.
If you are immature or competitive, you cease being a force multiplier to be a morale destroyer.
If you are more of a domain expert than your Product Managers, you will spend your time fighting and refining tasks to build features the right way.
If you don't have enough time to code, you'll go obsolete.
Where I disagree is with the idea of fighting with product owners. If there's a disagreement around approach or tech choices that's a sign we don't have enough information. Fighting or refining won't solve that. It's a signal that we need to do more discovery work and understand the problem better.
The problem is not needing discovery work or understanding the problem. The problem is when the Tech Lead is the one who's providing all the data for that discovery, or helping them understand the problem better, because of lack of expertise of PO/PM. Or having to push back because of incomplete knowledge.
If there is lack of information or incorrect information, POs should be able to get that information themselves. If a TL is the sole source of that info, then it becomes an issue.
IME this is very common. And it takes too much time of a Tech Lead's day.
If you are more of a domain expert than the product managers, argue for the product managers to be fired - they serve no purpose.
This is a strong statement. There are both people who are writing throwaway code and people who are writing essential code that match the description.
And one will never get to be the latter part without going through a phase where they are doing the first.
The parent comment doesn't contest this. I think it's about the throwaway code author being valued more than the other.
Managers love metrics. There's nothing wrong with metrics, of course. It's when metrics become targets that things fall apart.
https://www.folklore.org/StoryView.py?story=Negative_2000_Li...
What managers care about this at all?
You know, most companies.
One sign I see if a healthy workplace is one that tracks bugs and QA issues downstream against the same unit of work.
You quickly get a sense for what teams and even individuals are introducing the most bugs and issues.
If you can close tickets fast and your bug rate is low: that’s key, but I have found often that the people introducing the most bugs and issues into the codebase that others have to spend time dealing with are those that seemingly close their tickets rapidly every sprint
https://en.m.wikipedia.org/wiki/Carry_On_at_Your_Convenience
I am not against Unionizing "per se" but the role of Unions has never been "tell the management how to run their business". There has been some cases of (smallish) company being "acquired" by their own workforce, and the Unions might have helped with formalizing the deal, but this is rare, and anyway happens only when the company goes bankrupt or decides to shut down.
So I do not understand exactly what you mean here.
A Union can organize and sustain a strike. But they cannot "toss leadership out". Not the CEO, the Board or any manager at any level.
They could theorethically "blackmail" a company saying "strike will not end until X is fired" where X is a PM or manager or whatever but I never really heard of anyone trying this tactic, not to say actually succeed...
Some of that is indeed earned by the businesses reputation, but ultimately this is what I think spurred the decline of union membership in the US because businesses don’t get a lot if any value out of having a union around and the organized workers often find the benefits stagnant after some time
Its not fun to lose your job, but that can be better than being stuck just getting by at a company where your work isnt appreciated.
A significant part of my personal code review process, is going back through my code, and factoring out complexity. It takes time and humility, but is very much, in my opinion, worth it.
Documenting my code is a trick that helps. When I am writing why I did something, I sometimes reflect, and say to myself "Didn't I just do this a few lines back?"
My code tends to be complex, by necessity, but it should be no more complex than absolutely needed.
A big, big tool for that, is OOP inheritance, which is considered "bad coder" smell, these days.
Is it? I’d agree that there’s increasing awareness of the limitations of OOP, and I’d agree that using inheritance excessively can be one of the limiting factors, but I don’t think I’ve ever personally seen anyone criticised or penalised for using inheritance appropriately.
I have run into folks that don't understand polymorphism. It seems that it is not even being taught.
Old Boomer Yells at Sky
(Exceptions exist, of course, like libraries inherently dealing with reflection)
One thing that geeks love doing, is telling other geeks they are bad at what they do. It gets a bit grating, but I’ve come to the realization that I need be true to myself, because it’s a losing proposition, hanging my self-respect on the opinions of others.
I do what I do, and get the results I get. I don’t spend much time, worrying about how I compare to others.
One of the benefits of working at the direction of my own muse.
That should make you even better equipped to design simple interfaces that require as little depth of understanding as possible from the next person.
Similarly I've happily spent my couple of years with functional purity and higher-level types in academic languages - function signatures sometimes orders of magnitude longer than the implementation itself - yet I dip into those depths only as necessary and try to keep my TypeScript interfaces as "stupid" as I can get away with without compromising on semantics. Enums are too fancy for me. I try to keep state at minimum but there's a 'let' every few thousand lines or so.
And all that venturing into lower-level concurrent C++, agent systems, parallel programming, erlang? You ain't gonna know about any of that looking at my concurrent Rust.
> One of the benefits of working at the direction of my own muse.
Oh, well, what I'm writing above is from the point of code meant for collaboration - either open source or professionally. If you're coding for yourself only, or in academia, by all means stop trying to please the crowd and start cranking out some poetry!
I write code that I want to see in a year.
You can see my documentation philosophy in this treatise: https://littlegreenviper.com/miscellany/leaving-a-legacy/
I’ve also seen composition go sideways too.
Sometimes it feels like nobody takes software engineering seriously anymore, if I’m being honest
I never warmed to that. In my experience, it resulted in unholy messes.
“Produce a procedure documentation” gets keyword fulfilled into “here is a document with some steps”, instead of “here is a procedure we wrote, used spelling and grammar checker upon [I’m still shocked so few take the few seconds to correct as they go], run through an automated editor, then iterated through random people from the user population until someone who never saw it before accomplishes the procedure without assistance”.
Some startups succeed because they’re forced into conscientiously thinking through these ramifications in just the right contexts because they’re so close to the coal face. It is also possible to overdo this in the wrong context and end up bikeshedding.
Edit: Take rock stars 3000 lines of code a week and divide by one rock star + six experienced developers now doing nothing but bug fixes and it doesn't seem so super.
Not everywhere. I’ve casually suggested five big changes to the startup I’m currently working for that others ran with. I’m proud that my ideas even make sense, and my reward is that others come to me for leadership. I would get more glory if I had also carried them out. But I’d rather do the things that others can’t, than what shines the most.
> 2000 lines of code per week terrifies me... That's over 100K lines of code a year
That would be incredible (and scary). But productive people I’ve seen the contributor metrics for who write vastly more than they read, still have a number of deleted lines growing with their added lines in some proportion.
There is a style of less re-use, more copy-pasting that just grows faster but also needs constant refactoring in trivial ways.
I've got a colleague like that. It's all good and management praises him, but this is a time ticking bomb. When he leaves, someone will have to maintain that code.
Or I could elaborate, expound, simplify, and expand my solution.
It depends what I’m getting paid for.
If I’m getting paid for lines of code, guess who’s going to re-implement functions that could have been a single line of code?
Why bother writing a loop function when I could just copy-paste the same code as many times as needed?
Turning one line of code into 3,000 - easy.
Turning 1,000 lines into 100 - that’s when you know you’re working with a professional.
When a market is competitive, the things that matter are roughly: hard work, candlepower, and optics/neurotypicality/maneuver in that order.
When a market is fairly sewn up that order becomes roughly: optics, candlepower, ethical flexibility, hard work in that order.
The hard-ass nerds who don’t give a shit about corporate culture du jour are treated like royalty when someone might fuck your business up.
While “purged” is a strong word, I take your meaning, and whatever we want to call it, it happens when competition is largely pro-forma.
Human beings will do anything to avoid selecting on merit except lose. That’s just human nature. Being mad about it is like yelling at the wind, but compared to even a decade ago, I’m not sure how high I’d be holding my head in today’s competitive landscape for high-prestige achievement.
This is very, very analogous to software teams. It’s the mix and results that matter most.
It is never good to measure the "one" metric and manage to that, it results in people who game the metric "winning" and fosters the promotion of such behavior. I pointed this out to Google leadership and to quote Lazlo, "This is the system we have, it isn't perfect but we're going with it, either work within it or don't, it is up to you." :-). That meeting told me everything I needed to know about whether senior leadership was trying to have a better engineering environment or not.
To many new managers come into the job (especially if they were engineers individual contributors before) with the idea that if they keep the "best" members, and move out the "bad" members both team morale will be great and so will the teams output. But they miss that their understanding of "best" is not based on managing people, its based on getting their original job done. As a result they favor people who mirror their skills and habits and disfavor those who have different skills and habits. Getting them to see this and having their eyes go wide with realization is always interesting.
Yes, but to be fair it was an IT organization which had settled on a metric of "tickets processed" for their quality metric. As a result people who processed a bunch of tickets but never addressed root causes were seen as "good" vs people who wanted to fix fundamental problems that would reduce the number of tickets. It was, for me, a pretty classic case of picking the wrong metric. And to be fair the "best" IT/Service org is one that looks like it has nothing to do because it is always ahead of the curve of upcoming issues, and upper management has a hard time with that.
If you work on a factory line, you can measure widgets per hour and quality. In construction, you can measure distance or area completed. But in programming, you are not making a repeatable product like the factory line. You can say that developers deliver story points; that is the product, not the work.
I invite you to come up with your own answer before you read mine.
----
----
----
I think the inner cycle of development is learning and trying. You learn about a system, make a theory, try that theory out, try to extend that theory, then you test. That test will let you learn some more - was I right or wrong, was there some side effect. Then you repeat.
I don't think this learning and trying is a good unit of measure for performance, but I do think it's a good basis for an engineering notebook, which may be reviewed with a manager.
Non-junior developers are essentially managing themselves when it comes to getting the work done. So how do you manage a manager, when that manager is not responsible for widgets?
Dollars.
Duh!
It just takes one jealous colleague or one "efficiency minded" manager type to completely rug pull you. I know it's valuable because I have benefitted from that person many many times, but it takes empathy and a lot of balance.
I think this is what we can do to help: Remember sometimes we are also those co-workers who took help from Tim around us and conveniently forgot to Thank their contribution in success of our project. A simple thank you note in the right meeting, slack channel or in the project delivery mail goes a long way. Measuring the indirect impact of an employee is hard, even if you were the manager at any level. Taking help is not a sign of weakness or acknowledging the contribution of a co-worker doesn't make your effort any smaller.
A common refrain in basketball is that people forget it’s a team sport. Doesn’t matter how good you are individually if your team sucks (see Michael Jordan in 1988 or Lebron most of his career). Similarly programming is a team sport. Individual stats are not the same as team success.
https://www.espn.com/nba/statistics/rpm
For 2022/23 Green ranks 38. His defensive impact is very high but it is offset by his negative offensive impact.
It’s easy to fall victim to the McNamara fallacy (I’ve certainly been guilty of it), before you start understanding the innumerable intricacies in the domain. And basketball is the only domain I probably know better than 99% of HNers lol.
That being said, GP’s general point about Draymond is very true. Yes he’s one of the best defensive players of all time and one of the smartest as well. I think the main point is his incredible self awareness (yes get the jokes off). On defense it’s more subtle, such as not over committing and leaving his man etc but on offense is where it’s obvious. As his own shooting has fallen off a cliff, more and more when he’s dribbling unguarded he frantically looks around for Steph or klay to flow into a dribble hand off to pry them free for a shot.
He’s talked extensively about the criticism he’s faced for lack of shot attempts, with his rational being why would he ever shoot if he can instead try to get Steph a shot. He’s also mentioned if Klay hasn’t touched the ball in a few possessions, he makes sure to get Klay the ball with at least a decent look; otherwise the next time Klay gets the ball he’s shooting it regardless of how bad the shot is. He also frequently pushes the break[1] to catch the defense off guard and before they can set up.
He is still a negative offensively, but why I appreciate draymond so much is for the above reasons and the myriad other subtleties he does to maximize his benefit to the team and diminish the detrimental elements of his.
And lastly, standard plus minus is still a hell of a lot better than box score garbage, I don’t mean to crap on it.
[0]: https://squared2020.com/2017/09/18/deep-dive-on-regularized-...
[1]: http://stats.inpredictable.com/nba/onoff.php?season=2022&tea...
(Steph actually ranked higher than Dray last year in pace (seconds per possession) on/off which is why separating Draymond himself is so difficult. Their relationship is certainly symbiotic, but Draymond is the one that optimizes for best interplay of their skills)
In this case, Tim from the blog post is a football defender or a linebacker if you're an American. Measuring them based on the amount of goals they scored or a touchdowns they caught is stupid. Instead they're stopping costly errors and providing the foundation that allows others to go on and score. You're probably not going to win very much if you field 11 strikers or 11 wide receivers.
Then then socialize with managers outside of the team, bragging about how much 'value' they're adding and they can talk as if they helped others. They move around a lot, getting promoted each, adding no value other than just talk with no clue on how to do things.
His English wasn't great. His Javascript wasn't "modern" - he kept using callbacks etc. He often poo-poohed ideas the younger wizz-bang devs had. And so I was warned - basically he's an old curmudgeon, set in his ways, he can't take any criticism but he'll dole it out, a pain to deal with.
I quickly learnt how untrue that all was. OK, his code isn't great. BUT he's 100% committed to delivering customer value. He understands the ins-and-outs like no one else. He thinks through every scenario from the customer's perspective, and absolutely NAILS it every time. The young devs didn't like him because he didn't give a shit about "GraphQL versus REST" or "Hapi.js vs Express vs Koa vs whatever".
Where the other teams would avoid involving him in design conversations, I'd pull him in straight away. And our team reaped the rewards of integration projects that delivered right out of the starting gate, rather than customers kicking them right back with complaints.
A lot of these little things came back to bite hard
He was let go and the project became a lot less successful and enjoyable, once he was gone a large group left soon afterwards...
High performance teams at Thoughtworks really had almost full autonomy over how they worked. At a particular credit card bank in Delaware circa 2006, Jay Fields and I demanded (and got) flat screen monitors, our own conference room to use as a dedicated bullpen and most importantly, unfettered access to the open internet via custom holes in their firewall. Crazy times.
What the author describes is the effect on a solid senior engineer working in a terrible organizational system for a not very skilled or savvy manager.
Such managers (and directors and VPs) are common, even in the top tech companies. They may occur less frequently in those companies, but skilled, savvy managers are much rarer than excellent engineers, so the dysfunction described continues unabated in all companies.
> Instead we would measure stories delivered, or it may have been story points (it turns out it doesn’t matter), because these represented business value. We were using something like Jira, and people would put their name against stories, which made it super easy to generate these productivity metrics.
I have never worked anywhere where middle management measured individual engineers via issue-tracker metrics. That seems almost implausibility dysfunctional. It’s not just measuring a hilariously wrong thing at the wrong level of granularity, it’s also disempowering the line manager from evaluating their own people. Is this a real thing companies do?
Like, for someone in tier 1 / tier 2 helpdesk, or the regular developer pushing relatively normal tickets through, simple ticket or story throughput is one indicator of productivity. As long as you pair it with some success measurement, like re-reports from people within a short time, or work caused by the implementation. Or just feedback from the rest. Someone has to put down code to make the feature work in the end.
But this changes when you get more specialized and overall more experienced. If we bring a new technology into the team, my productivity based on the first metric will drop to zero. I'll be busy supporting other people. Or, the incidents on my desk will be far more weird ones. Other people get clear click paths and an exception. I had to debug JVM crashes due to faulty hardware. That took a bit longer than an afternoon in a debugger and adding an if-statement, if I may embellish a bit.
But that's why soft skills become important. It's concerning how little that manager knows about his team. But it's also concerning how Tim didn't make sure his manager knows what's going on. For example if we're bringing in new tech, I'm informing superiors first that I'll prioritize support of team-members with the new tech just below business critical incidents and I most likely won't do any regular work for some time.
Without quantifying it or comparing to an alternative, this is just feel good commentary. If you deliver any value, that does not consequently make you a good business decision. You have to pit your value against your cost and the companies best alternative option.
Also, if a company measures my value in widgets, I have found my career does quite well assuming widgets is the right way to measure my value. Assuming you know better than everyone in management is prideful and not good teamwork.
The argument here is which metric, or are metrics good for anything? [1]
[1] Except ditch digging and children. It is well known that 9 people will dig a ditch in 1/9 the time one person will, and 9 women will make a baby in 1 month instead of 9.
People like the one described in the article prepare a pipeline of good engineers, who also have experience in the domain and in the organization.
So if one cares about fast delivery, get a good number of sr engineers who work on their own thing, share little and are not encumbered by each other. If a company needs to deliver urgently this works, but is an (expensive, short term) option.
I think the managers who don't understand this type of role are the ones who were largely mediocre engineers, but were able to get to that position regardless. They just don't understand the process of engineering and that's it's not just churning out tickets or doing the bare minimum if you're working on something non-trivial.
This was the money quote.
Teams do big stuff.
Good teams do good big stuff (very good).
Bad teams do bad big stuff (very, very bad).
It seems that the hyper-competitive nature of today's workplace means that engineers consider their own teammates to be "competition," and we never really get a good team. This is especially true, with the mayfly tenures of most engineers, these days.
I'm fairly happy with the fact that I was able to keep a stable team of experienced, high-performing, senior C++ image pipeline engineers together, for decades.
Other managers would bust my chops for being a "Santa Claus" manager, because I refused to burn them out, and often intervened, when other managers were being too hard on them.
It seemed to work. When my team was finally rolled up, in 2017, the engineer with the least tenure had a decade.
That meant they stayed for other reasons.
I wonder what those reasons could be?
(Although in my experience the raises you get from changing between smaller companies are still worse than just staying at one FAANG.)
Not sure why this is the #1 article on HN right now, other than maybe the (what I would consider) click-baity headline. But I wish there was an acceptable way for HN to use more fitting titles for articles (especially since most articles always use a click-baity headline). E.g. would it be at the top if the title was "Don't measure performance by story points"?
I guess some interesting anecdotes have resulted in the post, but the message of the article itself doesn't seem to share anything particularly new or enlightening.
TBH it's a non-zero chance here on HN. "Don't measure by story points" is still preaching to the choir to a community like this after all.
>I guess some interesting anecdotes have resulted in the post, but the message of the article itself doesn't seem to share anything particularly new or enlightening.
1. Lucky 10k. Especially if it involves some managers who may in fact be doing this stuff as we speak
2. Generally, I come to the comments because some anecdotes are more interesting than the article.
Enough commenters here on HN are disagreeing with the article's conclusion that I think we can infer this is not a point everyone here agrees on, and the article was needed after all...
I’ve also met a lot of project managers who are there because they’re incompetent. They lean heavily on “agile” and “best practices” and say moronic stuff like, “can you show me how many lines of code each developer has added this month?” (this happened to me. I fought it hard, explaining that it’s not a meaningful metric. I showed him a month that I wrote -1500 lines of code).
I feel like I could say the same about managers, coders, executives. The incompetent exist everywhere and they lean heavily on bureaucracy to protect their existence.
"OK, last sprint the team did 150 points, so we should do 160 points this sprint."
The funny thing is that point estimates just went up to compensate for productivity gain demands. "More productivity" yay!
Maybe best as well because you quickly know to pack things up and look for a new job.
Don't spend all your "empowerment" energy at one company. Companies WILL undervalue "glue" developers (and also "glue" teams). Eventually being so focused internally can hurt you.
Instead, if you're good at helping others, do it publicly. Speak, blog, participate in open source. Turn your "helping others" energy into one of helping the broader development community. Pay it forward there and it will reap more dividends.
Senior engineers in my knowledge and experience are all delivering on something relatively high impact while contributing massively to the team by occasional/often "pairing".
I've seen rare examples who don't "pair" but just deliver by themselves.
I've never seen an example where they don't deliver on anything (planning, design, architectures included) but only "pair" as their job every day.
But I don't sit over someone's shoulder at all times. I only try to help when I'm needed, otherwise I'm knee deep in my own deliverables.
I asked to swap teams. Two levels up both said "no way you can't be replaced. "
I have a reputation and didn't know.
Also these activities might not always result in a lot or any artifacts. E.g. being in a meeting, making sense of messy stream of requirements and using institutional knowledge to help set the right priorities on a project or prevent team from spending months on a dead end idea might not leave any paper trail at all.
Also: the business established a metric it wanted ICs to meet, the guy in the story refused to participate in it at all. At the very least, he's demonstrating resistance to following the expectations of leadership. He might be a good team player at the smallest scope, but great engineers can do that and simultaneously play along with management/biz interests.
(I'll also agree with the article that measuring "story points" or whatever is probably a bad metric, like most measures of software productivity.)
That said I believe the author that Tim was a huge net positive.
>Enabling technology teams to operate at their full potential
Sounds like he is a very particular type of developer focused precisely on enabling teams in this manner.
-----
also, I can just post the obvious here but: he may be doing work but not tracking it. I've never been perfect at creating stories for every task I get, especially retroactive ones that pop up in the middle of the week.
The real reason Tim showed up as having zero productivity was because he always let his pair put their name on the ticket, and so get the credit for it. This is really a story about how things go wrong when a ticket tracker designed for solo work is used by a team which pairs.
I’ve already spent the last quarter either complaining about coworkers or praising them, now you write the damn report! And as for the self evaluation, again, you write the damn report… unless you have no clue as to how I’m doing, to which I say, your performance really sucks as a manager.
This is, of course, rectifiable in Jira by allowing a ticket to have multiple people assigned to it.
...unless they aren't using Jira and some tool that doesn't allow this.
He ended up promoted; in many organizations, people that hack the code rather than properly design and build sustainable solutions are highly valued.
Anw when I was data engineer at a big corp data team, I was the one the 2 seniors there with 20 juniors, like fresh out of the colleges. So the juniors ended up ask me with everything since it was faster than googling them self. I still deliver things in my responsibilities since I can do it quick, also spend like one third of my times to mentoring them. Later, I found out that my manager thought I was slacking off, not working to my full potential.
Yes, the manager never payed attention to how the team worked. All the juniors thought that I was the reason the team was running smoothly and quickly. Ok, fine, I realized sometimes you cannot just work, you need to sell your work, even in your companies.
The nature of data engineer job is to ensure things run ok. So everything too well for a long time, then the higher ups might think it is easy. It might sound like bad thing, but when a bug happened, sometimes I let it be if it is not too serious, to let it rises to the higher ups. Of course being able to solve it quickly is a must.
BREAKING NEWS: Pair programming improves software quality, more at 5!
But you can't deny that it's an amazing tool to open silos in terms of knowledge. I wish people would be more open to it, because I've never been able to get someone up to speed faster with a tool or codebase, than with pair programming. And vice versa too. If you're the person that knows less about the topic, pair programming with a senior is like a one on one tutoring session with a really skilled instructor. It's worth the time in gold imo.
Given that the thread is no longer visible without an account. They might want to do that sooner than later if they want people to actually read it
I dont see a downside to doing this.
It's the one used by all the major ones: airlines, auto manufacturers, and teachers. What institution do you know of that has a greater emphasis on measuring performance?
I'm sure most unions would love performance based pay where union reps decide what constitutes good performance. For some mysterious reason management is as keen on unions exercising their judgement as unions are on management deciding.
Where unions agree policies that treat members as interchangeable (e.g. age based pay) it is usually as a result of a compromise brooked with management who would love to have the latitude to give pay raises to scabs, kiss asses and spies.
The shape of the union is whatever the membership wants it to have.
At least programming has some verifiable realities that can be witnessed objectively by multiple observers. Not that such things are often used on "metrics", but they could be.
The quality of someone's management is hard to assess from outside, much less objectively verify. Has your manager increased or decreased your productivity today? Was it necessary that they do so for a larger goal you're not considering? Were they just power tripping?
Measuring is an aggressive act intended to invoke control that has a veneer of innocence.
That said I'm now wondering if there wouldn't be some metrics which might prove useful to workers either way.
Let me know if you find any downsides.
Anyway, management will of course argue that developers under them are incapable of seeing everything management does. After all, management's job is to shield developers from other managers, so if the developers think all the managers at the company are worthless, that's actually a sign of how well management did their job of shielding each other's teams from each other.
There are also plenty of successful companies and projects without management too. Basically every 1-to-5ish-man consulting shop has zero managers and some of those do wildly well. Some of the best indie games, produced by teams of 3 or 4, had zero dedicated management. Most open source projects have effectively 0 management.
Valve, famously, kept a flat organizational structure for a long time, and certainly was somewhat successful.
So, yes absolutely, administrative work now can finally be replaced, and we can free up all the tormented souls in these managerial positions to do something more meaningful with their lives.
These companies are even more stratified than before with the lumpenproletariat doing human-mechanized tasks while executives program their lives using software we write in exchange for the unbridled luxuries like the chance to own a roof over our head one day.
It's not exactly the future I wanted.
What a coincidence! Thats one of the first thoughts that crept into my head when code metrics started being used on me.
This "voyage of discovery" you've alluded to is exactly what I meant by no downsides.
If managers feels threatened by being measured by their employees after their employees start measuring them, well, that's also an interesting reflection is it not?
People at the top of the hierarchy probably do care about people at the bottom, but it's difficult to care about a large number of people as individuals, so they resort to metrics that probably models what's going on. Unfortunately, the metrics don't always work.
Instead of measuring and gaming numerical metrics, enforcing a particular culture might be a better way to go:
Ultimately the best way of measuring programmer productivity is by the assessments of the programmers on the team. This isn't as easy as it seems. For example, I once worked on a team where the best Heroku guy just had the absolute wrong idea about "easily understandable python code" since he would prefer to raise and catch an exception instead of rely on a built-in to test attribute existence or type compatibility. But nobody could get around large scale Heroku deployments like this guy. The juniors understand this nuance less well than seniors do, but even so, it does sorta come out in the wash. Your team does know its best people and they're usually happy to say it in a private one on one.
The funny example is that the hasattr built-in just tries to getattr, and then catches the exception to tell if it has the attribute.
https://docs.python.org/3/glossary.html#term-EAFP comments:
> Easier to ask for forgiveness than permission. This common Python coding style assumes the existence of valid keys or attributes and catches exceptions if the assumption proves false. This clean and fast style is characterized by the presence of many try and except statements. The technique contrasts with the LBYL style common to many other languages such as C.
and there are any number of essays on the topic, like (random DDG search) https://programmingduck.com/articles/lbyl-eafp .
If there are situations where you have no choice but to drive without airbags, those are holes in safety.
Essentially if you have to have runtime checks to prevent the program from full on crashing those are holes. Not everything is checkable with static checks but the way to go is to move as much of your code away from runtime checks as much as possible.
So for opening a file for example, using try/except instead of checking if the file exist and is readable first.
Both achieve the same results but the first is more "pythonic".
My point is that this way of writing code is not at all incompatible with using a type checker for said code.
I'm saying "incompatible" isn't even a relevant concept here. Here's an analogy:
You're telling me that running with shoes is compatible with running without shoes thus I can run with one shoe on one foot and the other foot is barefoot.
The goal is to objectively put shoes on both feet. Sometimes you're missing a shoe so you have no choice. But this has nothing to do with "compatibility" it's a completely different thing.
We are getting a bit into pedantic territory here, but THAT was my point and I am simply clarifying it because you MISSED the point.
The fact that the language doesn't have your back means you need to be more careful about types, not less. The type of the arguments is a function precondition. It's the callee's responsibility to document preconditions and ideally recover cleanly from a violation, but the caller's responsibility to ensure preconditions are met. Illegal states should be caught early, not allowed to percolate until an exception is thrown.
I don't much care if what I just wrote is "Pythonic" or not. I don't think too much careful design up front is responsible for every Python codebase I've ever seen reading like Finnegan's Wake.
I dunno. I don’t love Python for big projects either. If we want to go around and tell all the people using this very popular language to stop shipping their successful products because they look messy to us, I’ll happily take the second shift (after you), haha.
So if you have a manager who is a dialed-in coder who's going to keep updating the jira-point formula based on spending more than 1 hour a day reading code, and keep tuning it around the ever-more creative loopholes engineers employ, then yes, you may end up with a workable system. But never yet in my long career have I seen that.
The story includes a part where they dropped the crappy metric and changed to a better one.
Maybe ... Productivity itself is difficult to define. Different people will value aspects of the work differently
At one Internet Advertising company I worked for, the founder had written most of the original code. Written in the late 1990s, it was Perl, JavaScript, HTML, and SQL jumbled together. Completely ignoring the notion of 'separation of concerns'. Huge amount of code duplication. Source code control? Phhht! Nary a test in sight. Ran programs as root to work around permission problems. Self modifying code ... you betcha. He worked right on the production servers. He could and would push out a feature the same day a customer asked for it. VERY quick to make the customers happy. The company was being bought out at the time I came on board. Pocketed his millions, headed down the road, yay for him.
My own take is that the company would never have 'made it', if a software team had been hired to 'do it properly'.
After his departure, as we rewrote our code base to 'professional' standards, much time was spent refactoring that produced few or no new features. How productive was that? A very complex question.
As a digression, I sometimes found his original code easier to maintain that the stuff done 'the right way' because there WAS no 'separation of concerns'. I didn't have to hunt in a different part of the source tree for where something was done. It was all 'right there'. YMMV.
In the end, 'productivity' is way more subjective that we'd like.
This is my take too as I have gained experience. The way I did code from the get go, was the overall best way. Long function that did the stuff one thing at a time. Like no functions called from different parts of the call tree. I breeze to debug and understand or modify.
But it's usually contained to someone like a junior calling me up and saying "can you help me?". The answer is always "yes of course!" and I share as much as I possibly can. But it ends there.
I just want to sit down and show them things. Teach them in a way that makes things "click" the way I found they clicked with me. But I don't think management really values this approach. We get siloes of knowledge and then when someone leaves it's all hands on deck to transfer that knowledge.
I'm often brought onto projects as a firefighter because I'm seen as productive. But I think the more important thing for the team would be to have me upskill everyone else below me. But for whatever reason, it's hard to get that point across to management. I can see myself in a few people and that they have potential, they just need encouragement.
But at the moment I have work to do and deadlines to meet, so it's a hard sell to suggest stepping back from active development and focusing more on incubating our less experienced devs. Even though it's better in the long term, and my manager would even agree on that, important short term projects just take priority.
I don't actually say it though because I don't know how to express it.
Which senior manager is this, out of interest?
Mentorship is hard, regardless of management buy in :/
- code isn’t changing in code review except for really good reasons
- people who need help are reaching out
- projects that need help get additional help brought in
what else are you looking for? this example is about as pair programming as it gets at most places. they’re called silos when people don’t like them and layers of abstraction otherwise but they’re the same thing: no team will have 100% shared info on all parts and knowledge transfers on exits are a decent step to bridge this
if you want to teach the team more, teach them more. usually the best way to do this is in code review. it’s direct comments on code. write a good review you want more people to see? post it in the chat. set up additional time to share ideas with the team. all of these things you can do as an IC while producing code
sorry but this post comes off as “i’m smarter than everyone.” i’m guessing the reason management hasn’t gotten your message is the message isn’t clear. what exactly do you want to do? and what do you need their help for?
Now, as a reviewer your spidey sense tingles and you get the feeling there's a better way. But now it's significantly more effort to pull that change apart or start from scratch and experiment with a new approach, then write this all up on the pull request with the caveat "but what you've written works, so in the interest of time we can merge this".
Pair programming would get you on the right track from the start. You are able to assist an inexperienced dev and guide them through the process step by step. Imbuing your knowledge, raising questions, suggesting fixes. This is exactly what the blog post describes. The developer was seen as unproductive because their time was spend pair programming rather than directly doing the work themselves.
I don't see how my post comes across as "I'm smarter than everyone". I know things that less experienced developers don't know, and that's a fact I know from talking to them and reviewing their code. But the culture just isn't there to be able to spend significant portions of my day effectively being their teacher (which I would love to do!). Instead it's often "the blind leading the blind" while the more senior members of the team are off delivering important projects and not having the capacity to imbue their knowledge onto the less experienced members of the team.
It's a culture thing and I wouldn't say it's a good environment for nurturing new staff. Spending 2 hours in a Teams call or at someone's desk is uncomfortable for both parties in a company that doesn't encourage this sort of collaboration. And so there's a sense to not "waste someone's time". The person you're helping sees themselves as a burden rather than seeing themselves as a student. And as a teacher, you're conscious of the other work you're supposed to deliver because it's not expected for you to be spending significant parts of your day pair programming.
this is your issue. you’re approving prs due to perceived time constraints that you wish you could say no to. are these time constraints real? even for significant prs of 1-2k lines responding to a comment of rewrite another way only takes 1-2 days. code review isn’t about finding the best solution. it’s the best solution given the current trade offs. things to ask yourself are
- are the time constraints real?
- does the team agree on the “right” way?
if there’s time constraints sure i get it. these are external commitments. public deadlines. it’s hard to ask for additional work like this. but in my experience these are rare. usually management is smart enough to avoid external deadlines
does the team agree this is the right way? are you pushing your own narrative? if it’s a team strategy, it’s very easy to tell people to rewrite an entire pr for. if it’s your opinion but you can defend it, make your case, and if it’s strong you can still get someone to write it. is this so bad it’s going to be rewritten soon?
> the more senior members of the team are off delivering important projects and not having the capacity to imbue their knowledge onto the less experienced members of the team
i thought you were saying you are this senior engineer?
i don’t get this. you want to spend more time helping people but think it’s uncomfortable to be on a call with someone for 2 hours getting through a problem. you want to pair program and feel this way about a shared coding session? i’ve spent literally 7 hours on zoom screen shares. if you’re actually helping people they appreciate it
you say the culture isn’t there to support this but then list examples of good places you could create this culture and choose not to
if you truly are this smarter, better engineer that should spend all your time helping your team, why aren’t you doing these things on your own?
You can me ask "why don't you do X". And the answer is that the culture does not support it. I have work to do, work I've been given because as senior members of the team we are pushed into bigger and more important projects. The less experienced members of the team just have more time to do things.
For me to spend 7 hours a day sitting in a call with someone would mean 7 hours of not delivering work that my manager and project managers expect to be delivered. No person in the business is going to want to spend 7 hours on a call because the culture does not encourage it. This is why I said it is uncomfortable for both parties. Taking hours of someone's time isn't seen as a good thing, it's seen negatively. Of course the person you're helping appreciates it. But the culture makes them feel guilty for asking.
Should that be the case? No. Is that the case? Yes. Am I working toward that not being the case? Yes.
I don't know why you think I'm not trying to change the culture. I've literally listed all the issues and ways to fix it. It's not an overnight switch.
I was on a team that paired all the time and it's sort of ruined me for anything else. We switched pairs daily and everyone would pair with everyone else (on the team). When a junior joined the team they would very quickly lose their junior status.
The important part of pair programming isn't really the programming per se, it's the discussion.
It also requires some amount of conversational art. As for being self conscious about things, you would have poor coworkers who make you think that or some unfounded worry. A good pair programmer can have a discussion without making you feel like an idiot - much the same as a good code review.
Copilot is as much a pair programmer as stack overflow is... So not at all
I am a disagreeable giver myself and I have experienced a lot of backlash by the higher ups inside companies for being one, while also being praised a lot by my colleagues that were working alongside me.
A previous discussions about it:
"The best employees are not the agreeable ones" - https://news.ycombinator.com/item?id=17386640
Unfortunately in my current experience my manager is not at all like Tim.
Communication skills. Week 1 Tim could’ve brought up the issue of overall developer productivity with his manager and his manager would’ve at least been aware that Tim wasn’t just playing Minecraft all day.
If you aren’t communicating what you’re working on, it’s hard to get credit or recognition. And it’s not an ego or bragging thing: It’s just fundamental team communication.
For example, there may have been constraints that the manager knew about that sheer velocity was key for some reason. Or maybe the manager disagreed that Tim was adding enough value floating around all day. Who knows. But if Tim and his manager were in open communication, at a minimum there wouldn’t be confusion so great that a good engineer almost got shit-canned.
The author has obviously never tried to build anything non-derivative in a team. This metric only identifies the noisiest inexperienced programmers, that go through other peoples work... like a monkey on crack throws its poo. These folks are often successful in business, because anyone that actually grasps real workmanship is already busy. The main problem is meritocracy eventually fails, as someone biased must choose what constitutes "good" work. Thus, a pseudo-Technocrat just follows foolish idealism with extra steps... and becomes a Marketer in time.
The truth is "all software is terrible, but some of it is useful..." depending on the end use-case.
Happy computing, =)
The issue now is of course you are just incentivising taking overestimated stories. This cat and mouse never ends. Crucially you are punishing/removing the glue people that do the stuff not specified that needs to be done. So now you need every little thing on the board. And a lot of time on arguing about what should be on.
It is worse when the tasks allowed on the board have to be agreed by a committee that meets on a Wednesday. Not joking that has happened! But that is another story.
Too bad I quit before the CTO, CEO and most of the board members got fired. Would have enjoyed sitting there and going. Yes, yes, yes.
In this particular case, I can think of a few reasons why the original scenario that this team was in would still be considered "bad". For example, maybe Tim received tasks to do and he didn't do them, now the company is behind on things. Maybe the other people are not as good as their job as they should be, but because of Tim's interference that's being hidden. Maybe the expectation is that the other people are as good as Tim, so why are they not helping each other out as much as Tim is? Should Tim get a promotion, or are the other people performing badly compared to their position and salary? Maybe the tasks that Tim was supposed to do are more important than the ones he's helping others with. Maybe the company didn't budget this much investment (2 people) for a specific thing that needs doing, and as there's just so much engineering time going around, what other tasks are now receiving less time than budgetted?
There's so many ways where this story may fall apart in a real context. Obviously, something has to change (expectations, budgetting, salaries, job levels, etc...) to align reality with the direction that the company wants to go into, and that change is not necessarily (limited to) "keep Tim around and have him help everyone out and everyone will be OK and this is the optimal scenario and management bad".
The implication also being that "evaluating people on story points is bad", but that completely disregards the fact that doing this has surfaced an issue in the department that needs resolving (and before I get pitchforks thrown at me - that issue may very well be that Tim needs a change of job title and a promotion) - but obviously expectations and reality didn't align beforehand, and the story point metric surfaced it and allows for resolving it. In that sense, the story point thing yielded benefits that otherwise wouldn't have been had.
There's no indication in the article that the team was struggling or under-performing, and there's no reason to promote someone out of a position they're thriving in just because the way they deliver value doesn't neatly align with how you're measuring value, especially if you can plainly see the value.
Here's what I've seen in the past: exactly the scenario you described, the "Tim" is promoted to team lead or architect or something similar, and now their calendar is booked up and they no longer have time to do the thing that brings value (and that they enjoy). No one on the team is happy, everyone is stressed, and in a year or so you'll start bleeding members. Tim either hangs around and is a mediocre whatever position he is, or he leaves to be a whatever position somewhere else where he can start with a new context and without loaded expectations.
I think the part in the article where a manager wanted to fire Tim because he delivered 0 story points, and the teamlead (?) refused, is made up for dramatic effect. I can't imagine any manager seeing those type of results and instead of asking the teamlead what's going on there, jumping to the conclusion that Tim should be fired.
Edit: By that I mean that I am highly skeptical of metrics used to evaluate people. It's a lazy way to make the job easy and avoid doing the hard work of getting in the trenches, gaining unquantifiable insight into what's going on, and effectively communicating that up the chain.
Yeah it's a few hypotheticals onwards, and there's probably better ways to surface those problems, but companies are messy and no one is without flaw or 100% competent, no engineer and no manager.
(Note that I'm not saying evaluating a person based on delivering story points is optimal, or even useful)
Well I do know why just don't agree with the principle of seeing how much the company can get out of a developer in x hours.
How on earth, you might wonder, did we ship software that worked?
I then saw all these things come down the pike one after another during the last half of my career.
Clearly to me every one of these benefit management who found themselves apparently unable to function without numbers, graphs, data of some sort. It has been a very obvious (to me) power struggle: management trying to get the upper hand and wrest any and all power (and autonomy, and decision making) from engineering.
It has been sad to me to have heard some new engineers come on board who like these things. It's just as well I retired when I did: it's probably me that is the odd man out now.
To my understanding even IBM in the 70s had stupid ways of measuring productivity (KLOCs?).
They did all that by walking around, chatting with everyone, helping devs, assigning tasks depending on the expertise level, sometimes doing boring work (like manual testing) to help devs, etc.
Of course, if a manager that has to handle Jira and Scrum meetings all day, then it gets difficult to do that.
Apple very much was engineer-driven when I began. That changed when Steve Jobs returned.
It's obviously cost cutting niggling and get-it-out-the-door histrionics causing this chaos. There is significant impact to longevity and durability, and required maintenance. Very wasteful from a global warming perspective.
Watch out for these late model ICE engines...do your research. If it's "newly redesigned!" step back and dig in.
Management though use the "percent coverage by unit tests" as some sort of safe/buggy software metric.
Management at one team I worked on was pushing for minimal 95% coverage with unit tests. I thought it was odd that they were so singularly focused on this issue. The impression I had was a that they felt that if you have full code coverage with unit tests, and the test pass — you can lay off the QA team because you are assured that you are shipping perfect software.
They are going to manage risk of low quality with risk of wrong product.
I was assigned to help team members on the lowest rungs of "performance" metrics. My stats went to shit.
Some teammates smashed it, others didn't. My influence and pay increased and nothing felt right.
Ended up leaving the best org of the company because I couldn't (at the time) understand what was happening.
IMO, looking back, as amazing and 'right' as this scenario feels (OP and myself), it needs the full support of the entire company to make it work.
Pretty clickbaity title. This isn't a story about a bad programmer, it's a story about a bad metric, and an even worse manager who followed it blindly
The clickbait is made so that this document can be shared with a future shitty manager. If you send them a link titled "The Worst Manager" - I assure you their first reaction will be to figure out how to get rid of you.
Managers are the bane of this industry and sadly, engineers have to spend an immense amount of time dancing around shit managers.
Good. I hope it made you read the article and learn from it.
Yes it's a bad metric but so many engineers (not just managers) fail to understand that.
And apparently has zero idea of the team's internal working patterns.
I've worked with people like that, who were pretty bad individually, but brilliant when part of the right team.
Writing code and directly enabling the productivity of others who are writing code are different skillsets.
Obviously there's some overlap, but you're most productive in Tim's role in you're complimenting the skillset of the person writing the code.
Suppose the bank Tim worked at decided to measure the number of pairing sessions each developer participated in—I suspect this too would destroy the team.
When you measure people doing X, you are really measuring people pretending to do X.
Well, last 2 years i played that without the coding part (as a CTO!).. but not sure if anyone up-there noticed.
So i slowly start to dispirit and go bitter.. Seems Consumerism (throw-away-buy-new culture) ate the software/knowledge profession too.
i don't know, either noone needs deep, experience-backed, 360' looking knowledge, or it started grow on trees?
Bingo.
If I ever hear anyone in my company attempt to deliver a sentence like that then I will go postal.
But that is balanced by the threat of people trying to use metrics to measure developer productivity. It doesn't seem to be possible, any metric falls apart. If people are focusing on a metric, the greats aren't going to be leading any more. It'll be some junior who has misunderstood the system and has accidentally trained themselves to game metrics.
Metrics do not drive good software. Repeatable processes love metrics. Repeatable software suggests bad development practices because that is a big hint of a library or bigger opportunity that nobody on the ground properly identified.
...when they're actually hands-on-keyboard writing software. The best programmers I know write as little code as possible.
Product team: Hmm, we need to do a thing that looks very complex and difficult.
Senior dev: I'll start making a project plan and story breakdown.
Very senior dev: That sounds like a special case of a thing we already have. That should take about an hour.
Of course that's a generalization, but I think the trend holds. The most illustrative metric for the best engineers wouldn't be "lines written" but "lines avoided".
I don’t mean they use the latest fashion library, I mean the amount of code they type is less simply because they understand the problem and know how to write a minimal solution.
This makes their code easy to read and therefore easier to debug.
It’s worth noting that the less you type, the fewer bugs you’ll create.
To be fair, this is often due to the coder having significant experience.
Red flag!
A "very senior dev" will not be handing out "1 hour" estimates to a product team. An hour of what? Billable hours? Wall-clock time? It's just not the right framing. You will notice a good senior dev will be incredibly cautious about any commitment and not hand out "ego estimates" like one hour. They will make commitments that they can keep and it will be terms of releases.
They will have experienced a decade of "one hour jobs" that have exploded so they know that even the error bars on a slam dunk 1 hour of butt-in-seat time means it's not a 1 hour estimate. An hour of butt-in-seat coding time is not a 1 hour of employee time - they've got that training course, those interviews, they need to support that thing, oh the presentation, the intern to look after. That feature you are copying? What is it copy-paste or some refactor generalisation? Measure that shit in weeks. Oh and there are 6 feature branches overlapping that area already. You also have a policy to improve the tech debt of this crusty code. There is also the documentation, training material, translations, the test suite, code review, the issue tracker... But hey, you can do it, you are x10, you boot up your machine and... your IDE is crashing because of some security update. Doesn't count in that one hour eh?!
That's not even the main issue, odds are the first over the shoulder demo of this new feature will be just the start of eliciting the real requirements.
If I say 1 hour, I mean that I know exactly which knob needs to be twiddled, perhaps because I wrote it in the first place, and that there'll be a pull request ready for review an hour from now.
That's clearly not always possible. Sometimes it is. If I say that it is, then I can deliver it.
> Sometimes it is.
What's the worst case of the other times? These "one hour" estimates are the golden path, nothing goes wrong, minimum. It's not the average of horror shows or an amortisation all the related support work required to sustain efficient development over time. They are often too coding-focused and ignore the level of interpersonal work to agree and sign off features or to change code in collaboration with others. Talking through a demo can take more time than the code.
Not if they game the metrics, as a way to force change.
A classic example of an exceptional programmer doing worse on a (bad) metric is at https://www.folklore.org/StoryView.py?story=Negative_2000_Li... , titled "-2000 Lines Of Code".
"Some of the managers decided that it would be a good idea to track the progress of each individual engineer in terms of the amount of code that they wrote from week to week. ... Bill Atkinson ... thought that lines of code was a silly measure of software productivity. ... [He] made region operations almost six times faster. As a by-product, the rewrite also saved around 2,000 lines of code. ... when it was time to fill out the management form ... he thought about it for a second, and then wrote in the number: -2000. ... after a couple more weeks, they stopped asking Bill to fill out the form, and he gladly complied."
For small companies, engineering managers & direngs should be aware enough through working with the team members individually & through PR review who is performing and who isn't, and not need to deploy metrics.
- 10x productivity yourself - Adding 2x to five 1x engineers
Non-technical management will never appreciate the engineering multipliers like Tim
Or maybe Tim didn't care about story points, he knew his worth, and he felt that if the company wanted to fire him on such an arbitrary metric, it wasn't a company worth working for anyways. In the end, he did well because he kept his job and the company dropped an inappropriate metric.
Then exclude non-export numbers and divide that by the number of KWh used to generate that revenue.
Edit: Please comment on down vote, otherwise we learn NOTHING!
Tim’s productivity score was zero
I also have a Tim in my team but he is a net negative.Most of the time he would try to pair up. He just make noises that implies he is following your work. But you can see that is not the case when he tries to make a comment or a suggestion, he is clueless. Trying explaining things to him is a waste of time.
Rarely he decides to work on a task himself. No matter how trivial the task is, he needs someone to spell out what to do step by step. Even then when he sends a code review, you can find some surprises. He becomes a net negative because he can take a task that should take 2-3 hours top for a regular dev and then spends 1-2 week on it while also wasting more than 2-3 of someone else's time.
It is always fun to see him grab an easy looking task that is way beyond his capabilities and then struggle for weeks and tries to weasel himself out of it.
I never saw someone so immune to learning. He is in the team for over 2 years yet has a productivity of zero. I don't understand why companies keep such people
There are so many people doing jackshit which make me go insane. I guess, good for them and I'm glad I'm not a shareholder.
Management handle the most blatant cases in 6 months. There are so many people who are not completely clueless at pretending to do something and they go undetected for their entire career.
From previous experiences, in a US startup they would be fired in 2 weeks.
The unpredictable layoffs and terminations of US companies are their own issue, but companies pay unemployment insurance to let people go with some safety net. I can’t imagine UI is more expensive than keeping an underperforming employee.
Or, the past isn't the present. It was very difficult to get a job in the US in 2008 and now it's easy because it's 2023. (slightly harder for some kinds of tech)
Every team knows their best performers, and their lowest performers. The number of points aren't going to line up with performance most of the time, precisely because time helping others is never going to show up. And if suddenly getting help lowers your review, you are going to ask for less help, not more: Trading accuracy in external performance tracking for lowered team performance sounds really dubious.
It's whoever owns the issue. You can make it an epic and assign particular sub-tasks to team members if it's a teamwork.
You can even add some prestidigitation by having them take 30 seconds to Google it and your name comes up. Play it off as a joke and now everyone has a little smirk/chuckle over it.
Now they know you have a good personality and can tell a funny joke about yourself. Goes a long way to putting you in that “I can work with this person” category.
Also, if they can’t appreciate the joke, that’s an easy red flag for you that you probably don’t ever want to work for that team.
"According to a 2018 CareerBuilder survey, 70% of employers check out applicants’ profiles as part of their screening process, and 54% have rejected applicants because of what they found."
I'm basing this on real world experience.
HR's job, like legal, or many other departments, is to facilitate what you actually do which in this case means work like chasing references and ensuring the candidates have somebody who can answer stupid logistics questions without bothering the interviewer, not figuring out who is the best fit for any particular job, that's the job of the people making the hiring decision.
Maybe if you're hiring fifty people to stand outside in the rain holding signs you can let HR pick who gets a job. Picking software engineers, especially if you actually care whether they're any good, is not the purpose of an HR department.
What I said was different. How many CVs should we eliminate before calling people back for the two openings? What if the pile is 500 CVs? Call all of them? I guess you stop coding for the next two months and that's ok? Or maybe you let HR help you sort the CVs by priority.
> who have no idea what they're doing
I've worked with some very talented HR people. Maybe you haven't been so lucky.
> HR's job, like legal, or many other departments, is to facilitate what you actually do which in this case means work like chasing references and ensuring the candidates have somebody who can answer stupid logistics questions without bothering the interviewer.
HR does more than facilitate. They protect the company from legal threats, just as one example. In the case of needing to trim down a huge stack of applicants to an actually manageable stack, then HR will do things like search the internet for people's reputation. If you think that's not their job, that doesn't change the fact that they are going to do it anyway. HR very often has a say in candidate fit. Especially if HR is responsible for company culture, as is often the case these days.
> Picking software engineers, especially if you actually care whether they're any good, is not the purpose of an HR department.
At most companies the HR department is pretty involved in the hiring process no matter what the position is. At smaller companies maybe less so.
> I've worked with some very talented HR people.
No doubt, since apparently you expect worse than useless it's likely hard not to exceed your expectations. What a buffoon.
You've offered no alternatives other than your schoolboy insults.
Sometimes we need to pay rent and deal with obnoxious HR departments.
I do not like people who do this. just tell me the answer. this is such a gigantic waste of everyone's time. you figured something out months/years ago, great for you. give it to me NOW, so I can get on with my day. if we BOTH run into something unknown, we can tackle it together. but dont force me to go through the same painful learning process you went through. YOU suffered, because at the time no one knew how to do whatever it was. now that someone knows (you), your job should be to spread that knowledge across the business as quickly as possible, not hoard it to yourself until someone is deemed "worthy" of knowing it.
Your situation is a waste of time where no one grows. The article is describing growing skills which is a net productivity benefit.
You're not going to learn from being handed an answer on a silver platter.
You'll implement it, get on with your day, and not at all think about why the answer is what it is.
this is an incorrect assumption. some people (like me) have an analytical mind. if I am given an answer, I will usually reverse it back to the question, so that I understand how it came about. or I will ask follow up questions until I have that understanding.
all this method is doing is forcing multiple people to go through the discovery process, when all that should be needed is for one person to do so. its a waste of business resources. person A can share with person B, then person B can go on to make their own discoveries. we dont need to force every employee to discover EVERYTHING on their own. thats just a huge waste of time. it would be like forcing everyone to discover Pythagorean theorem on their own, instead of giving them that tool and letting them use it to create other stuff.
> thats just a huge waste of time.
Instilling knowledge and discovery rather than rote completion of work based on others' ideas is far from a "waste of time" for people who actually understand the learning process. Growth is generally desired in the business world, even if it results in a short term hit.
Someone who makes a comment like this, isn't arguing in good faith, or even intelligently. So I will give this comment the respect it deserves: none.
I'd personally find someone shadowing me and asking questions super annoying.
I don't think this would work with all teams, the takeaway I got from the article is about artificial metrics.
That's a disgusting way to think about productivity, the result of otherwise smart people growing up in a capitalist exploitative system.