The Mediocre Programmer
themediocreprogrammer.com
themediocreprogrammer.com
I was hoping to find some combination of a breakdown of potential paper cuts that hold programmers back, and an insightful breakdown of seemingly insurmountable problems that keep programmers in their provincial comfort zones, providing a series of bite-sized victories to lead one to greatness.
Instead I found number of already well-tread tropes of self-acceptance, limiting the amount one compares one's self to others, finding friends, and taking breaks. Furthermore, it does this without presenting any kind of new model to achieve this within the programmers existing emotional, executive and motivational budget.
I don't know if I'm staggeringly abnormal but I'm already acutely aware of those requirements. Absent some seemingly miraculous improvement in my executive function, in order to effect change (at least in me), the content needs to provide either compelling anecdotes as to why I should try harder, or a new model that provides a path where the extra smashing of face is not required.
I fully acknowledge I have no claim of liability for the content not meeting my hopes, given the generous lack of cost, but I must say I'm disappointed.
The authors own explanation:
> There are plenty of books on how to become a better programmer out there. Books like this tend to have checklists and other advice that the author deems important enough for you to do in order to become a better programmer. They tend to focus on specific improvements like choosing a better editor, writing better test cases, or drinking lots of water. Those books have lots of useful advice, but they read like a laundry list of things that you must do all at once in order to succeed. This book will try not to saddle you with more work (you likely have enough as it is). Rather, we'll discuss what it feels like to be a programmer. We'll talk about the emotions in being a programmer; the feelings of frustration, guilt, anger, and inadequacy. We'll cover the struggles in learning new things and keeping your skills current. We'll talk about those times when you feel like giving up and walking away from computing and whether those feelings come from a place of love or a worry that you're not keeping up.
The dark matter developers that don't care one second online communities like HN and Reddit do exist, never got paid to attend a conference even on their own town, and have more things to do with their life than hunting for stars on github after work.
See the biblical book of Job. Countless self-help books. Scientology. Paulo Coelho books.
And so on.
In terms of managing the struggle, though, at least in my experience, a lot of it comes from having broken models of effectiveness. The net result is having to use a lot of emotional energy attempting to discern what the optimal answers are in a deeply ambiguous sea of grey, with the added difficulty of especially ruthless hindsight. Again, maybe my expectations were grossly miscalibrated, but there wasn't much in terms of orienteering in that environment.
What advice there was: the regular, time-boxed 'containers' of learning, struck me as deeply taxing on someone who struggled with context switching or executive function. Further the exhortation to seek out like-minded peers would be especially painful (non-?) work for someone with social anxiety.
I guess what I wrestle with reconciling is the desire to unconditionally affirm and pastor those in the depths of their struggle, with the advocated actions that would often be inconceivably costly to those most in need of that affirmation and support.
Maybe the impersonal written word is a sub-optimal medium for this mission?
There are many many meanings of the word "better", in "better programmer".. i'd prefer the ones closer to "better person" than to "ultimate machine". And.. the ambition.. may not be the best tutor. Persistence.. might be better.
It is important to find yourself a project/s of your own. Nothing too great, can be tiny or insignificant to others. Then don't give up until you do it.
And.. Have Fun. If there's never fun, then this isn't your thing. Abstractly said, programming is the ultimate boredom, and i only manage to do it for 35+ years by searching new ways of finding fun. Nowadays it's mentoring people. What's next.. will see :)
Sure it's true, but it leaves out a fundamental truth about programming (and technically complex disciplines in general): most people that attempt programming will never be a good programmer - indeed most never even cross through the gate of mediocrity.
There seems to me to be a superegalitarian notion that all people given the same opportunities will be capable of achieving, if not the same, then comparable results on a given task (or set of tasks of a given type).
That simply is not true - "fake it 'till you make it" is not universal.
Writing complicated and unmaintainable code is not the hallmark of an exceptional programmer.
Rather it is writing simple code to solve simple problems and writing understandable code to solve hard problems.
Code other's cannot wrap their head around is not good code and even the clever author will have a harder time debugging, re-factoring or adapting it. Chances are it would be a liability even on a solo project.
If you are that good but work at a regular company, build an awesomely good script that is maintainable by even a mediocre programmer that comes after you and spend the other 55 minutes of that hour doing the next task. Then go home when everyone else goes for lunch without anyone noticing because you did the work of 2 people already anyway. If you have a good boss they won't care and give you awesome life work balance that you definitely would not get at Bell Lab, IBM, Microsoft or Amazon because they know how to exploit your drive and passion for their own good. No you don't make enough money to get that time of your life back.
That's not an "exceptional" programmer. An exceptional programmer who does mundane stuff has this posted on their cubicle wall: https://xkcd.com/1205/
Lets say that automating a task saving you 1 hour takes 10 hours. Is it worth it? No, you'd say. But what if you had 100 such tasks, and the time to automate them goes down as you become a better programmer taking a total 50 hours? Then it would be worth it, but you would never achieve that level of expertise and therefore lose that productivity increase if you followed the advice of that comic, since none of the tasks you'd come across would be worth automating when you got to them.
I'd argue it can help skill acquisition to avoid getting into one thing too deeply, because the more different items you do, the more the commonalities appear; the more chances you have to see if your approach is optimal.
I think there's a tension between this and the deep concentration or "flow state" that people like to talk about on HN. In effect, there are different value systems, and people have a hard time stepping outside of that.
This. Moreover, the frequency of a task may depend on its automation. We would not have Continuous Delivery today if someone didn't make the effort to automate deliveries, would we?
The worst part is he’ll feel extra smart afterward, because he finally figured out enough of the bugs in his horrible implementation to call it “done”, and he’ll likely be re-visiting this code for a long time to come, as issues pop out that he still doesn’t understand fully.
Eventually, guardrails and processes get put in place to protect against their damage, and the whole team slows down. Good coders walk, and you're left with the dummies, cranking out a high volume of low quality code. It's absolutely tragic.
When you build a flexible high-performance templatized system, hand it off, and realize a few weeks later that an energetic stupid coder has "written" more than 50 copied and pasted hard-coded classes from that codebase for the different places it was called from, only to have him and the non-coding manager push hard for sticking with that approach because the work is "nearly done", that's when you brush off the resumé and walk.
Teams need workaday coders sometimes, and every coder should know how to just grind out a big refactor or massive change. However, I aim for coders who are lazy enough to find a cleaner way to do it and smart enough to know they can.
I think programmers have a chip on their shoulder about the importance of the work they do. You are not painting the sistine chapel
Most programming is what you refer to as "workaday"
Much of what we do is mundane, and, if we do it right, more of what we do should feel mundane because the right abstractions and metaphors already worked their way into the tools and systems we use. However, I still contend (and I’m far from the only one to hold to this) that the worst thing you can have on your team is someone with a lot of energy but poor judgement/awareness. Doing it well is hard. Doing it poorly is far easier, to the point that there are folks that will be a team net negative.
This is very uninspiring and destructive thinking. Just think of detailed and pristine handworks of everyday tools found at excavations, or the charters of guilds in the middle ages. It's not about what you do. It's about you doing it.
Good! The code most people write are not things that will last the ages. the romantic notion of guilds in the middle ages is silly and what I was referring to regarding the chip
At the end of the day, it's a paycheck for something you hopefully enjoy. And no matter how well crafted you think it is. Someone else is going to come along in the future and think its crap
Again going back to the chip on the shoulder
There are reasons to care about code quality beyond a chip on one's shoulder. Scalable, extensible, and readible systems retain optionality and can provide substantial business upsides that were unknown (and often unknowable) at creation.
Conversely, analysis paralysis can prevent progress. It's a balance.
Organizationally, energetic stupid programmers (those who fail to see around corners and fail to carry the lessons of these principles with them in their work but still have high "output"), left unchecked, will drain organizations of talent.
We work hard to avoid this heavy delivery bias on our teams because the metrics-focused race to the bottom is a very tough thing to undo. Quality is much easier to keep than to add.
This is a stupidly common problem, and one that is hard to fight against. Why would you decline a good / inspiring part of the codebase, coupled with the unsureness that during the lifetime of the software this would come handy.
There's plenty of working software that's good enough. Made by fair programmers who don't care about lisp or FP.
Is your scale of good affected by what you see here on HN? Because I feel like the front page of this site has the same effect as Facebook for skewing views of reality.
Edit to add: and yeah, I’m also not sure it’s relevant outside OS-level programming, which most people never get near at this point.
But things like: - don't copy, paste and tweak a piece of code when additional parameters are a better option, - don't grossly overload a definition with parameters instead of breaking up a function.
There's nuance there, and the question of what amount of technical complexity is reasonable for a given problem - but if I start thinking about that I'll never stop digressing.
I have dealt with an entire office of people who seemed to code purely in bug-filled technical debt: you could tell when they clocked on because the build broke an hour later.
As far as FP is concerned, I think that the memory and performance penalties are often too heavy: there's certainly a place for mathematically provable programming - I just don't know what it is.
FP isn't necessary for mathematically provable programing. Dijkstra and Scholten did a ton of work in this area that conclusively demonstrated that. I can't do them justice in a post here, but to a first approximation the trick is that you reason about imperative programs as transformations on a state space, which is to say you think about functions.
A simple example: We want the predicate x = 3 to hold for all preconditions. The code "x := 3" establishes that predicate everywhere in the state space. That is to say, no matter what x was before the assignment, afterwards the predicate holds. While plenty of bytes have been spent on discussing why this is totally impracticable for real programs, whatever that means, we also have buzzwords like "defensive programming" that follow the same philosophy: we should write code such that when it has executed no matter what the state of the system was initially, afterwards it satisfies some specification.
Given exactly the same opportunity you think they cannot get comparable result? So you are saying there is genetic (dis)advantage to technical things that cannot be overcome?
The bulb paradox isn’t really a thing... just a single opinion from Pg right? I’m not sure I agree with it.
Makes me wonder what it's like to be both smarter and less smart than I am. What pieces am I missing? What advantages do I have?
I’ve met lots of people smarter than me too and I can easily identify why: oh she really knows more about x than me, or he’s very good at destructuring things...
(So I dismissed you with a sarcastic quip.)
That's not how evolution works, no matter how unfair you deem it to be. Life does not give a shit about fair - all that matters is what survives long enough to proliferate.
Feelings be damned.
The genes that convey contextually useful characteristics (although generally inclined to spread rapidly) are not at any point evenly distributed.
In some context genes that were useful in ancestoral context loose their use, or even become a burden.
Genes for intelligence may increase the ability to handle novel situations, but they also increase energy utilisation - which makes them a dietary burden.
Apologises for the trigger. Not my intent.
“ most people that attempt programming will never be a good programmer”
“ all people given the same opportunities will be capable of achieving, if not the same, then comparable results on a given task”
Persistence is exceedingly rare. Falling short of your capabilities is exceedingly common.
On the one hand, I don't know anyone who has put in thousands of hours and not been a decent programmer. On the other, that mixes cause and effect a bit, since it takes a certain type of person to even want to throw a thousand hours into programming in the first place.
I will say this though: there is nothing magic about programming, or really any technical skills like it. It’s all about practice and getting better with time. I do sincerely believe that anyone can be a productive programmer that delivers within the constraints that are demanded of them.
If you’re talking about “prodigies” or “polymath” or people that have certain conditions that allow them to be more productive without the same amount of effort, yes, I do agree such people exist. And they exist in every field. I don’t think they should be what most programmers should try to emulate though.
The four quadrants of competence applies.
Q1. Unconscious Incompetence. Q2. Conscious Incompetence. Q3. Conscious competence. Q4. Unconscious Competence.
Most people never leave Q1 phase, just muddling through their career and stagnate or burn out.
It takes lot of effort to jump from Q1 to Q2 and become aware how difficult things are in reality. Some take effort to become better and these types will usually succeed over time.
Lot of senior level people end up in Q3 and it's comfortable zone to be in. But, it takes more significant effort to jump to Q4, where they can gain additional pull to be able to lead and make significant more money.
It's significant journey and the timescale is not linear, it's logarithmic in some situations and extremely long in other situations.
Isn’t this true of almost everything?
Most people who attempt [x] will never be at a good at [x].
Technical fields aren’t special in this regard. Replace [x] with running and it’s just as true despite the fact that just about everyone attempts to run at some point. And yet the vast majority of people aren’t proficient runners in any shape or form. But just about any activity could replace running and it’d be just as true.
Attempts aren’t worth much. Intention and dedication are what make most people at least OK at their craft.
Anyone who is mediocre in their profession should still feel pride in what they do. Are you among the best? Maybe not, but you are good enough that people value what you do and that is what matters the most. If you find yourself in a position where nobody values what you do then you have a problem and need to fix it as soon as possible. But in that situation you aren't mediocre, instead your main goal will be to work hard so that you can become mediocre.
Great idea.. We're all mediocre programmers at some aspect of development even after spending a decade in the industry. And conversely many still suffer imposter's syndrome. Seems like a great topic to address.
I'm not sure if the book discusses it, but I think the top number differentiation between being a mediocre to an expert programmer is actually being an expert in the problem domain and less in computer/programming specific.
This is a refreshing change from the productivity-focus that seems prevalent here. Thank you.
A book about minimalism boils down to "It's ok to say no". But that doesn't mean it's wasted breath to talk through it. Sometimes simple, valuable lessons take time to digest.
Likewise; This book may have a simple lesson at its core, but such a valuable lesson is worth unpacking. It's worth taking some time to relax and digest it.
I'm looking forward to reading this. :)
I have everything I need. I do not need to learn about nature. Caves are very comfortable.
Raw meat is tasty, chewing it with my 3 remaining teeth is great.
I do not need innovation. I can happily live to my 30s... if I am lucky, and do not get killed by a wild animal or a member of my tribe. By the way, what is a justice system? sounds very complex, I do not care about it. I will fix all my grievances through violence.
Oh, by the way, some guys showed up mounting horses and using metal weapons and enslaved us. Perhaps I should have spent more time trying to innovate.
This is exactly what the mediocre programmers and mediocre organizations sound like. People about to get rekt by people that develop an understanding of their world and their craft and innovate.
If you show developers thay you do not care about how they do things, they will become mediocre. Unless they are ethical and do it anyways.
In my experience the worst programmers usually have some bad personality traits, either lazy, unqualified or whatever else or sarcastic, rude, arrogant and runs across the spectrum of bad to good in terms of ability.
I think one of the keys to being a better programmer/person is having a good ability for self reflection and self awareness. Unfortunately these skills are developed at a very young age and in many cases it is too late to cultivate that mentality except some rare cases.
Generally true, but it also sounds like you’ve not made big mistakes.
Big mistakes often involve slight twinges of fear and doubt also.
[1]- http://themediocreprogrammer.com/build/html/the_mediocre_pro...