Why lack of confidence can make you a better programmer
codewithoutrules.com
codewithoutrules.com
You need a lack of fear to delve into the unknown to fix the root causes of things, to follow a thread all the way through an application and not make the minimal local change that invariably hurts the overall design of the software. This is how maintained software rots: lots of local changes without regard for the global design. Making the bigger change (usually not actually bigger, just more global) is required to keep the architecture supple.
But you need to be concerned about breaking stuff. Everything you touch, you need to look at what relies on it. If testing is insufficient, it should be beefed up beforehand. Often testing is at the wrong level and is too closely linked to implementation changes, preventing the more global change required. It's less fear, though: more like paranoia combined with obsessive, iterated list-making + list-checking.
The worst thing is when you find yourself hours or days into a task only to hit a blocker - finding out that doing the right thing will be a lot harder than expected, while doing the hacky short-term thing will be unreliable or fragile or otherwise difficult to maintain.
So you need to start out with a research phase. Think through the code changes required for a local change, look at the component parts, consider how they could change to make a more global fix, then look at their dependencies, test coverage, etc. until you're confident the task can be accomplished. Think before acting.
Acting without enough thought and planning is the biggest problem I've found with junior devs. I've found it at both extremes of the "fear" discussed here: some devs that had no fear and made big global changes without considering the knock-on effects, who broke all sorts of other bits and pieces along the way that weren't central to their task so they never even checked them (these devs generally don't last long); and other devs who hyperactively make local changes, use a lot of copy and paste (including tests - the code turns out functionally correct), and generally seem really productive, but are actually generating technical debt.
The basic finding is similar to what the article says: too much confidence is bad because it makes you miss things, but so is too little confidence if it makes it hard for you to do anything. The trick is calibrating confidence and how you react to under/over-confidence.
In a situation of low confidence, you want to take action to grow your confidence by getting feedback, learning new skills, or collaborating to get new ideas. When you have too much confidence, you need to figure out what you're missing or get a more realistic perspective on where you are.
For better or worse, there's also social value in projecting confidence (not arrogance, but confidence) in certain situations.
Regarding actual "self-confidence" based on a proper assessment of self-efficacy, I find it makes me a better programmer. It allows me to experiment and play more freely.
When I was a wee young lad, I used to be very scared of the command line. I read that you could really mess up your system with just a single typo. This imagined danger held me back from learning things. With my unfounded fear, even testing something like "python3 script.py" would make me double guess each character I wrote.
Now, I know that I can just reinstall the system if I mess up. Or play in a VM. There's negligible danger to that. With prudent precautions, I can afford to be bold with it. Pull up a virtualbox, and do a "rm -rf" and see how it burns. I believe playing with a system, breaking it and fixing it is necessary for getting a feel for it. You can't do that when you're scared our doubtful.
When destroying a local system on a VM, the line is very easy to find. When developing components in a large system, it's almost impossible to locate.
I think it might be useful to have a playing server/system as well, similar to the staging server which houses the version currently in production with mock data, intended for rapid testing and iteration or playing through failure scenarios. Let's see if we can put feature X into it. Let's see what happens when Y fails catastrophically. Let's do a practice deployment with one of the devs. Let's see how quick can we get it back up if the cleaning lady pulls the plug by accident. That kind of stuff.
`chmod` can be interesting as well.
sudo chmod -R -x /It's actually termed "Google employee".
If I'm writing a tool for the dev team, I'm not going to scrutinize the code as much as something that will be deployed and will cost $$ if there's downtime. Also withing the software itself, some components will be scrutinized more than other, because their failure have larger impact.
Throughout the whole process I'm the same confident developer, I'm just more careful and place more scrutiny where appropriate.
Being careful and trying to rubber duck first and code second has gotten me into some hot water with a couple of them. It's frustrating.
As humans we have a finite amount of resources, whether it's time, concentration...the key is to pick wisely and balance.
I am so confident in my abilities (or lack thereof) that I know when something is simply out of my realm and I should seek the advice of someone more knowledgeable than me.
Being confident isn't the same as being arrogant.
Of course, there is the "play the daft laddie" tactic that I do all too well! :-)
I don't think it's about a lack of confidence, it's just awareness about how far your knowledge extends and honesty surrounding that.
> The competent programmer is fully aware of the strictly limited size of his own skull; therefore he approaches the programming task in full humility, and among other things he avoids clever tricks like the plague.
(E.W. Dijkstra, in 1972)
You can be confident in what you know, all while humbly accepting that there's a lot you don't know (and even more you don't know you don't know).
Confidence in yourself, that you'll reach your goals and succeed despite any fuck ups, well that's a good thing.
And of course there is the corollary...that it almost surely will be rewritten if its something that is truly useful to the business and its bottom line.
Self-reliance sticks around even when you lose everything. You lose your house, money, job, partner, career, etc. and if you can still build yourself back up, you are self-reliant.
Most confident people are confident in something they have. Money, fame, house, looks, diploma, knowledge, etc.
The self-reliant, however, lives from the first car of his very own train of life — money, fame, or anything else do not precede him. Even when he loses everything, he is still in the front, navigating.
Those confident in external things will falter when they lose those very things that are leading them.
Perhaps lack of confidence can make you a better programmer. But lack of self-reliance bodes fear of the unknown.
Which is why I invest heavily in alerting and monitoring services, but I am confident that someday, they will fail me too, or two bugs simultaneously somehow will create an illusion that everything is fine (and report it to monitoring), but it won't be fine.
I accept the inevitable. Compared to the fact that someday I (and everyone else I know — I don't believe in mind transfer and biological immortality) will inevitably die, this is a small thing to accept.
I work in high frequency trading.
People who lack confidence are more likely to cover up their weaknesses and ignore their mistakes.
This is the thinking behind the growth-mindeset/fixed-mindset paradigm:
https://chrishildrew.files.wordpress.com/2014/03/fixedgrowth... https://www.farnamstreetblog.com/2015/03/carol-dweck-mindset...
There is an interpersonal "professional" confidence, which is needed to function in the business world (although as many mention, you need to avoid arrogance so balance is needed).
But the article is referring to a different kind of confidence: The belief that your work is automatically good. Nobody needs that kind of confidence, because no one's work is always correct the first time.
Lacking the latter confidence can give you more of the former, as after you've double/triple checked your work you can confidently assert the quality of your work.
You need confidence at the end of an iteration cycle. Continually vouching for code on which you're not confident is stressful and would lead to burnout.
In some fields (Sales?) overconfidence can spur achievement. In many others it's dangerous. ("The US housing market will never drop", "We can make up the time by efficient testing", "Their party will never nominate that clown.")
After some time, when I see things lining up and working as expected, it starts to come back up but it never reaches the heights I had initially. I lose the enthusiasm and courage for wild and crazy ideas. Which is a shame because if I can teach myself to retain my enthusiasm as my confidence sinks, when I'm actually capable I'd be more brave.
If you think that the code you wrote must be correct because you're a hotshot, then you're taking self confidence beyond the "self", projecting it onto external things connected to you. It's not that you have too much self-confidence, but that it has the wrong scope.
To me that mindset is very different from thinking that every piece of code I write is particularly amazing, it just helps free me from some of the paralysis of worrying about going down dead-ends.
The one reason, in my personal experience, that I've benefitted from calling it confidence in bugs rather than a helpful humility and lack of confidence in my ability to produce bug free code is that it's easier to sell testing and code safety structures to managers, who never seem to enjoy budgeting for time that doesn't produce new features.
I've seen lack of confidence limit programmers in most cases than not. They refuse to try new technology because of the unknown. They are afraid to learn new things. They are afraid to fix things. They are afraid to speak up and let other's do the speaking for them.
I prefer to say it in a slightly different manner.
Ask yourself: could I have implemented this better? Better can imply more efficient, readable, in terms of design ...
Essentially realizing the fact that one might not have done a perfect (or even a reasonable) implementation and that it might be possible to improvise upon.
I've often found myself redoing pieces after thinking about the maintainability, readability aside from worrying about functional aspects.
The end result is you either get comfortable enough with what you're working on that you can figure out where it will likely break, or you move on to another project (maybe more quickly than you normally would).
In the end, confidence (to me) is about how one personally feels. IMHO, the great thing about programming is that it removes personal feelings from the equation.
How about just actually, I dunno, LEARN TO CODE! I see too many of these articles and they all come down to the same thing, people not taking the time to actually learn the fundamentals, how to program, concisely, systematically, methodically etc, to learn the language and tools they're using.
People who doubt their code or design usually end up bad programmers as they are not sure what their code does and it's side effects and they constantly seek other's opinion in the name of 'better implementations' - but there is no right design in reality, all one can do is produce small, concise, to-the-point side effect free functions that does solve one and only one problem at a time.