Most people get it wrong about great developers.
They think it’s about raw IQ. Or their resume packed with frameworks and certifications. Or how many hours someone can grind in front of a keyboard.
But that’s not it.
The best developers I’ve met, the ones who build truly great software, almost always share three unexpected traits: Curiosity, Obsession, and Laziness.
Curiosity drives them to explore deeper than anyone else. Obsession pushes them to polish, rethink, and improve until the work feels right. And Laziness? It forces them to build smarter, not harder. Automating what others suffer through manually.
In this article, I’ll break down each of these three virtues, explain why they matter far more than technical trivia, and show how they combine to create developers who don’t just write code, they build systems that outlast them.
Curiosity: The engine behind every great developer
When you meet an elite developer, it’s almost never their knowledge that impresses you first. It’s the way they think.
They’re the ones who can’t leave things unexplored. They ask, why does this work? What’s under the hood? Could it be better? Curiosity isn’t just a nice-to-have, it’s their superpower. They’re often the people who’d break their toys as kids just to see what’s inside.
In his essay, How to Do Great Work, Paul Graham puts it simply: “Curiosity is the best guide.” Not ambition. Not discipline. Curiosity. It pulls great developers forward. Not because someone told them to learn something, but because they can’t stand not knowing.
Jakob Greenfeld echoes this idea in ”Follow Curiosity”, arguing that when you chase what you’re genuinely curious about, you build deeper knowledge, faster skills, and more original work. You don’t just learn; you discover.
And there’s science behind it too. A 2014 study published in Neuron showed that curiosity activates the brain’s reward system, enhancing learning and memory retention (Gruber, Gelman, Ranganath, 2014). In simple terms: curiosity makes your brain want to learn better.
Curiosity in real-world coding
Curiosity shows itself in small moments that, over time, separate good developers from great ones.
- A curious developer hits a strange bug. Instead of patching it with a random fix, they dig. They trace function calls, inspect stack traces, ask why until they really know what went wrong. And in doing so, they understand the system better than the rest of the team.
- They don’t just install a new library and use it. They read the README, and maybe they’d browse the source code too.
- When a framework upgrade breaks something, they don’t rage at the changelog. They open the diffs, they follow the design decisions. And months later, when deeper issues surface, they’re the ones who saw it coming.
It’s curiosity that makes them dangerous, but in a good way.
Curiosity is faster learning, not slower
Some people think being curious slows you down. It’s the opposite.
A developer who just patches bugs blindly will get faster “fixes” in the short-term. But when the same class of problem appears again, they’ll be stuck.
The curious developer, meanwhile, builds a mental map: they know why things fail, not just what to do when they do. That map compounds over time. It makes them debug faster, build smarter architectures, and pick up new technologies in half the time.
Curiosity isn’t inefficient. It’s the only thing that makes deep expertise possible.
Curiosity drives innovation
Most real innovations in tech didn’t come from people following orders.
They came from people poking around.
- Jeff Dean at Google famously optimized CPU instructions for search performance because he was curious about microsecond-level delays.
- Linus Torvalds didn’t set out to build the world’s most important open-source project. He just wanted to understand operating systems better.
Almost every groundbreaking tool you use today (Git, Docker, React) exists because someone asked questions they didn’t have to.
How to cultivate curiosity as a developer
Good news: curiosity isn’t genetic. You can grow it.
Here’s how to start:
- Follow each thread: When you’re working and you hit a weird behavior, don’t just fix it. Spend 10 minutes pulling the thread. Where does it lead?
- Read code, not just docs: Documentation tells you what you can do. Source code shows you how it works. And often reveals things docs never mention.
- Reverse-engineer something once a month: Pick a library you use daily. Open it up. Try to understand one layer deeper than you normally would.
- Stay uncomfortable: If you always know exactly what you’re doing, you’re not growing. Seek slightly beyond your competence.
- Ask “why” even when it’s annoying: Especially when it’s annoying. That’s when breakthroughs usually hide.
Curiosity isn’t about knowing everything. It’s about not being okay with ignorance. It’s about staying uncomfortable enough to keep moving.
Obsession: The hidden advantage of elite developers
When you look closely at the best developers, you notice something strange: They don’t just finish tasks. They can’t stop until the work feels right.
This trait, obsession, is often misunderstood. Some see it as overkill. Others see it as unhealthy. But used correctly, obsession is one of the biggest advantages a developer can have.
Good obsession vs bad obsession
Good obsession means caring so deeply about the work that you can’t leave things half-finished or messy.
Bad obsession happens when you lose the ability to prioritize, endlessly polishing things that don’t really matter.
Simon Pitt describes this well in “Why All Coding Is a Little Bit Obsessive”. He points out that coding demands precision: if you’re sloppy, the computer won’t “guess” what you meant. It’ll just crash. This harshness naturally trains developers to pay obsessive attention to small details, or fail.
Research supports this too. A study published in the The Science of Interest, distinguishes between harmonious passion (good obsession) and obsessive passion (bad obsession) (Vallerand et al., 2017). The key difference? Harmonious obsession is voluntary and under control; it energizes you without taking over your life.
Real-world examples where obsession mattered
You see the effects of healthy obsession in every major tech success story:
- Jeff Dean at Google: Famous for going beyond his job description. He’d dive deep into CPU-level optimizations just because he cared. Leading to huge speed improvements in Google Search.
- Steve Wozniak and the Apple I: Woz didn’t just build a working circuit board. He spent extra months hand-optimizing the design to use fewer chips. Cutting costs massively for early Apple computers.
- Linus Torvalds and Git: When they lost access to BitKeeper, Linus personally rewrote core parts in just days to meet his standards.
These aren’t examples of people following a checklist. These are examples of developers who couldn’t leave things alone until they were better than anyone else expected.
That’s obsession working for them.
How to channel obsession positively (without getting stuck)
Unchecked obsession can be dangerous. It can delay launches, burn you out, or trap you polishing meaningless details.
Elite developers don’t kill their obsession. They control it.
Here’s how:
- Set clear boundaries upfront
Before starting a feature or fix, define what deserves your full obsessive energy.
Example:- API performance, system reliability: yes.
- Pixel-perfect email footers: maybe not.
- Use “ship, then polish” mindset
Set a hard deadline to ship something functional first. Then spend limited, focused time obsessing over improvements if truly needed. - Obsess over fundamentals, not appearances
Focus your obsession on architecture, performance, security, the foundations that affect everything, instead of superficial details. - Catch yourself “grinding”
If you find yourself endlessly tweaking without real improvement (e.g., changing button colors 20 times), step back.
Ask: Is this making the product better? Or just satisfying my perfectionism? - Choose your obsessions wisely
Paul Graham, in “The Top Idea in Your Mind“, warns that whatever dominates your thoughts shapes your output. If you let trivial things consume you, you’ll get great at trivial results. Obsess about great systems, great user experiences, great performance, and your results will follow.
Final thought on obsession
Obsession, when aimed at the right things, transforms average work into extraordinary work.
It’s what makes software feel alive.
Elite developers don’t settle because they can’t settle. They chase the extra 10% that most people ignore. They polish the code users never see. They optimize the systems others just accept.
Without obsession, you can still ship projects. With it, you build things that people trust, enjoy and remember.
Laziness: The secret weapon for building smarter software
It sounds wrong to say.
But the best developers are lazy too. And that’s exactly why they’re great.
Not lazy in the “sit around and do nothing” way.
Lazy in the way that forces them to automate, simplify, and refuse to tolerate manual, repetitive nonsense.
Larry Wall, creator of Perl, famously called laziness the first of the “Three Virtues of a Programmer”. He defined it as: “The quality that makes you go to great effort to reduce overall energy expenditure.”
That’s productive laziness.
And it’s one of the most powerful traits an elite developer can have.
What productive laziness really means
Productive laziness isn’t about avoiding work.
It’s about investing time today so you (and others) don’t waste 10x more time tomorrow.
A lazy developer asks:
- Can I automate this?
- Can I make it easier to debug?
- Can I design this so I (or anyone else) never have to touch it again?
They hate friction. They hate waste. They hate doing the same boring task twice.
And because of that hatred, they build better systems.
Real-world examples where laziness led to greatness
- Docker: Developers hated setting up environments manually. So lazy devs built containerization, allowing setups to be copy-paste reliable.
- Continuous Integration (CI/CD): Instead of manually testing and deploying every push, someone lazy enough to hate manual QA built automated pipelines. Now it’s an industry standard.
- Internal tooling: At companies like Facebook and Shopify, teams constantly build internal apps not for users, but to make developers’ own lives easier and faster.
Lazy developers build these tools to save future effort. And in doing so, speed up the whole company.
Even at a personal level: A developer who spends 2 hours writing a script that saves 5 minutes every day breaks even in just 24 workdays. And then starts saving hours monthly.
That’s not wasted time. That’s compounding returns.
How to cultivate productive laziness
You don’t just “decide” to be productively lazy. You build habits that reward efficiency over grind.
Here’s how:
- Notice when you’re doing boring work
Every time you do something tedious: setting up a project, fixing a common error, formatting files manually. Pause.
Ask: Could this be scripted, automated, or eliminated? - Automate early, automate small
You don’t need to build a giant tool. Start tiny. Even a 5-line bash script that saves you 30 seconds is a win. - Use good tools aggressively
Don’t be a hero doing things the hard way.
Use Linters, Prettiers, Git hooks, deployment scripts. Lean on infrastructure. Smart lazy developers win by standing on the shoulders of other smart lazy people. - Refactor when friction appears
If part of your system feels slow, repetitive, or confusing today, it will become a nightmare in six months. Fix it now, while it’s still small. - Learn to distinguish procrastination from productive laziness
Procrastination is avoiding the real work. Productive laziness is optimizing the real work.
If you find yourself avoiding a hard but meaningful task, that’s procrastination.
If you find yourself automating a painful manual task before doing meaningful work, that’s good laziness.
Final thought on laziness
Laziness gets a bad rap because people confuse it with being passive.
But in reality, productive laziness requires intelligence, foresight, and short-term pain for long-term gain.
Elite developers don’t grind harder than everyone else.
They remove the need for grinding in the first place.
That’s why their projects scale better.
That’s why their systems are cleaner.
That’s why, over time, they outpace everyone else, even if it looks like they’re “working less.”
Because they’re not working less. They’re just working smarter.
How curiosity, obsession, and laziness create elite developers
Each virtue on its own is powerful. But when curiosity, obsession, and laziness come together in one developer, something different happens. Something rare.
You don’t just get a person who can write code. You get someone who builds systems that are smarter, cleaner, and more resilient than anyone expects.
Here’s how it plays out:
- Curiosity finds the hidden problems. It asks why is this slow? Why does this fail? What if there’s a better way?
- Obsession refuses to leave the solution half-baked. It polishes the architecture, handles the edge cases, tests the ugly paths others ignore.
- Laziness demands that the solution is simple, maintainable, and efficient. It avoids duct-tape fixes in favor of systems that don’t create future headaches.
Virtue | Average Developer | Elite Developer | Outcome |
---|---|---|---|
Curiosity | Applies quick fixes to bugs without investigating causes. | Digs into root causes, reads source code, and builds a mental map of systems. | Deeper expertise, faster debugging, and better system understanding. |
Obsession | Ships functional code but moves on without refining it. | Polishes architecture and edge cases until the solution is robust. | Reliable, scalable systems that require fewer revisions. |
Laziness | Manually repeats tasks like testing or deployments. | Automates repetitive tasks and designs low-maintenance systems. | Time savings, cleaner code, and scalable workflows. |
Let’s make it real:
Imagine a new feature: a real-time notifications system.
An average developer slaps together a polling endpoint, ships it, and moves on.
It mostly works. Until traffic spikes, database load balloons, and users start complaining.
An elite developer approaches it differently:
- Their curiosity wonders, Is polling really the best option? What’s the load cost? How do large-scale apps handle this?
- Their obsession pushes them deeper. They research websockets, server-sent events, queueing systems. They benchmark solutions. They refuse to ship until the feature is fast, reliable, and scalable.
- Their laziness stops them from over-engineering. They design a system that’s lightweight, easy to extend, and requires minimal manual upkeep. They document it so the next developer can understand it in minutes.
Months later, when new features need notifications too, the system holds strong. No rewrites. No downtime. No panic.
That’s the quiet magic of these three virtues working together.
Developers who cultivate just one of these traits improve.
Developers who cultivate all three? They compound.
They build things that feel effortless, even though they aren’t.
They leave projects better than they found them.
They quietly, relentlessly raise the standard everywhere they go.
And that’s what makes them elite.
Conclusion: Build smarter, not harder
The best developers aren’t the ones grinding 16 hours a day, writing endless lines of code.
They’re the ones who think differently.
They cultivate curiosity, to see problems others don’t even notice.
They channel obsession, to polish solutions until they’re rock-solid.
And they embrace laziness, to build systems that are clean, efficient, and effortless to maintain.
It’s not about doing more work. It’s about doing the right work, in the smartest possible way.
If you want to level up as a developer, don’t just collect new frameworks or memorize syntax.
Focus on growing these three virtues. Let curiosity pull you deeper. Let obsession push you to higher standards. Let laziness demand smarter designs.
Because over time, these habits will quietly separate you from the pack. Not by shouting louder or working longer. But by consistently delivering work that lasts. Work that feels inevitable, even though it was anything but.
Great developers aren’t born. They are shaped by the questions they ask, the standards they hold, and the shortcuts they refuse to take.
How we reviewed this article:
- Content Process
- I get an Idea
- Get feedback from fellow developers if they want a detailed post on it
- Research existing blog posts to see if there's a well written article on it
- Write the post
- Get feedback from colleagues, improve and publish!