HACKER Q&A
📣 catwind7

Essential skill needed to be a programmer?


In the book Coders at Work by Peter Siebel, he asks peter norvig this question:

"So is there any essential skill needed to be a programmer? Different domains obviously have different requirements but ultimately is there some commonality to writing code regardless of domain?"

Peters answer to this _really_ resonated with me - his first two sentences were "You've got to be able to make progress and then improve on it. That's all you need to be able to do in life."

How would you answer this question?


  👤 therealplato Accepted Answer ✓
I consider this essential: The ability to decouple the task from your ego.

Specifically:

- Never say "Got it" or "OK" when someone is explaining a problem or solution and you don't follow. It feels awkward to say "Sorry, I'm still not following. Do you mean that when..." five times in the same conversation but it is worth your time and embarrassment to come away with a correctly framed and well understood situation. Otherwise you will figure out what they meant after wasting hours/days/months solving the wrong thing.

- You'll be faced with situations where your colleagues/organization expect you to implement solutions you think are not the best. Understand that "the best way" for the team or business is not necessarily the same as "the best way" for you personally or "the best way" overall. You are likely missing some context about the choice. Be mindful of reputation risks, time costs and maintenance costs involved in changing the approach.

When you're asked to code something you don't agree with (including ethical issues) your options include: silently accept their approach, refuse to do their approach, propose an approach (with conversation or code) and gracefully accept the result, or find another job. Be aware that different organizations will react differently to those approaches. Under no circumstances should you fall into the trap of spending a week to convince the team to adopt a change that would save a week of costs.


👤 Apreche
To simply be a programmer, one must only write a program, nothing more. The essential skill I guess would be literacy, knowing how to read and follow directions, knowing how to use a keyboard, not much.

To be a good programmer, if I have to pick only one "skill" I would pick systemic thinking/understanding. This starts with the ability to learn and eventually understand how a system works. The next level is the ability to create a working model of that system in ones mind. Someone who can do that will be very successful at programming anything in any language on any platform given sufficient documentation.


👤 Scandiravian
- Communication skills

Being able to clearly explain why your solution will solve a given problem better than the alternative and listen to your colleagues when their suggestion is better than yours, will save you an incredible amount of frustration. It is in my opinion the most important skill I have learned

- Asking why when debugging

Finding the code that's causing a bug is only the first step. The next is preventing a similar one happening again. By constantly asking "why was this choice made", you end up finding the actual weak points in both the code and your process. Whether it's because a hack some other place forced you to write another hack, that then failed or because there was a deadline so the commit was made at 3am, there is an important lesson to be had. If you combine that with good communication, you can talk to the team about changing things, so you avoid creating similar bugs in the future. (Pro-tip: 99% of bugs are there because there wasn't time to do things better)


👤 lordnacho
Tenacity is the short version of what Norvig is saying.

A curious thing that happens every time I write code is that some unexpected error occurs. Sometimes it's trivial stuff, other times it's deep structure. Either way, you have to be bothered to make changes and test them. Sometimes this tree gets very very deep. See an error, Google it, find an example that mentions a new keyword, explore that cave for a day, return to previous branch, etc.

Something about this is related to addiction, I think I'm somehow fortunate to be addicted to something useful rather than just some molecule.


👤 ideal_stingray
You need to believe that computers are understandable. There’s no magic involved. Eventually, every abstraction leaks — so if you have fear or learned helplessness blocking you from trying to understand the leaky abstraction layer, the only way you can debug it is by squeezing your eyes shut and trying random things, which is ineffective. You really need to internalize that even things that seem mysterious happen for reasons, and that those reasons are something you could in principle figure out.

👤 MrBuddyCasino
Just "to be a programmer"? Frustration tolerance. Thats pretty much it.

To be a good programmer: very much depends on your area of expertise. Most of them need good communication skills, some machine-level understanding, some math or algorithm skills, some require high velocity / long hours... It really is a very diverse field.

But like for most jobs, frustration tolerance gets you surprisingly far.


👤 ardit33
By essential, it is what most engineering disciplines have in common:

Good logical reasoning, and spatial thinking/skills, ability to build up complex systems from smaller ones, and ability to understand/debug how complex systems work, and no 'magical thinking', but ability to analyze things logically.

I am seeing here a bunch of answers that mention 'communication', 'write docs', etc... etc but those are essential skills for any employee in a large company, no matter what the discipline is.

They are not core engineering skills per se (though they are necessary to perform in a large company). If you can't code, or don't understand concepts your communication skills will not help you that much. Maybe become a PM, or some kind of manager, but not an engineer.

P.s I know communication is not core, as i have worked with many 'brilliant' engineers that they had poor communication skills due to be foreigners, or just personality quirks. While that will hamper their ability to get promoted to managers, or architects, they all were respected and did well as engineers.


👤 bobwall
Learning what questions to ask into Google is a critical aspect. Most of the time, coding is the process of writing some code, and then debugging it. Knowing to ask, my graphql endpoint is failing with a status of 500, vs. my graphql doesn't work. The first will help you narrow down the issue, the second is far too generic. I have been coding for over 20 years now, and I feel it is rinse and repeat in terms of hitting a roadblock, and finding the answer. Also, a lottttttt of patience. You might take two hours to figure out something that ends up being really trivial, and then you have that moment of feeling good that you solved it, and then you are right back into the next hurdle.

👤 ajhurliman
The ability to stay with a problem for a long time. I think some folks will see something they don't understand and just disengage with it, but a lot of successful programmers that I've seen will continue to think about situations/ problems a lot longer after realizing they haven't fully grokked it, until eventually they do.

👤 hprotagonist
old, but ever-green:

Although high general intelligence is common among hackers, it is not the sine qua non one might expect. Another trait is probably even more important: the ability to mentally absorb, retain, and reference large amounts of ‘meaningless’ detail, trusting to later experience to give it context and meaning. A person of merely average analytical intelligence who has this trait can become an effective hacker, but a creative genius who lacks it will swiftly find himself outdistanced by people who routinely upload the contents of thick reference manuals into their brains.

http://www.catb.org/jargon/html/personality.html


👤 notjustanymike
The single greatest benefit to my career as a developer has been learning to draw.

I draw on whiteboards, in moleskins, on printer paper, on the back of resumes... anywhere and everywhere. I do this because I need to convey complex ideas to important teams who are NOT programmers: Product, Marketing, People Ops, and the C-suite.

Helping people understand my ideas through illustration creates buy-in from them and trust in me. You can be a great programmer, but if people don't know and don't trust in what you're doing you'll never be given the space to execute.


👤 spzb
Pessimism. Expect everything that can fail to fail and code defensively to deal with it gracefully. Doesn't make you much of a joy to work with though

👤 kazinator
Alan Perlis epigram #32: http://www.cs.yale.edu/homes/perlis-alan/quotes.html

"Programmers are not to be measured by their ingenuity and their logic but by the completeness of their case analysis."

Well-engineered programs cover all the cases: they handle what they must handle, and have an answer for the rest which is better than "oh shoot, didn't think of that".

The main programmer skill is remembering to ask yourself, "under what conditions won't this work?" or "what inputs or situations break this?" and being able to come up with excellent answers.

Also, asking this question: "though this appears to work, where are all the requirements (language, library, platform, ...) coming from which make it work, and are any missing?"


👤 edent
Empathy. You need to be able to empathise with the user. That user might be the person giving you requirements. The person using your product. The user reading your code in a year's time.

That's not all you need, obviously. No one thing is the magic bullet which will make you a better programmer. But the worst programmers I've worked with only write code which works on their machine, for their specific use-case.


👤 sajithdilshan
1. Communication Skills - Clearly understanding what others are saying and expressing one's opinion in a polite, and respectful manner is a skill one must master. Most of the time it's better to listen first rather than talking first.

2. Prioritization - Learn to prioritize and sometimes to say "NO" to people.

3. Delegation - One cannot do everything by oneself. Learn to delegate and get help from others.

4. Whenever you do some task, always question why am I doing this, why this needs to be done in a certain manner and learn all the background(domain specific) knowledge related to the task.

5. Learn how to debug - I cannot stress enough how important this is. Most of the time you would spend maintaining, coding, and changing, legacy/existing code written by someone else. If you do not know how to debug and follow the trail like Enola Holmes, you'd always have to depend on the help of others which is very inconvenient for you as well as for others.

Apart from that as mentioned in the other answers it's always good to be a smart cookie, but it's not essential.


👤 nickthemagicman
The tech skills that I think are critical to a software dev:

Git and version control, learn them as in depth as you have time for. Every decent dev environment has these and the amount of people lacking this basic knowledge is staggering.

Bash/Linux or powershell/windows same thing. You can get an amazing amount of things done with shell scripting in your OS. Unless you have an insane amount of time I would pick one and learn in depth. These are rich systems.

A dynamic programming language in depth. There are so many concepts that will transfer between languages that if you know one in depth, you'll be able to pick another one up pretty fast as it's just semantics at that point.

SQL, this is an essential part of dev life and you will understand ORMs and data management better.

The personal skills:

Communication obviously. This is such a vague term and I think is abused as people just say 'lERn to CoMmUNicate' with no actionable advice. Things like politeness, small talk, respect for other's etc.

At the same time know when to be honest. I've seen the best communicators tell management exactly what management wants to hear over and over and projects kept being behind or over budget because there was a dysfunctional connection between the manager and the engineer who kept B.S.ing them with what they wanted to hear and the nitwit manager eating it up and for some reason never learning.

Systems reasoning, learn to understand the system from the line of code up through the stacks to the whole. Sounds cliche and it is but it will make you a better programmer.

Debugging. This will be most of your life. The more you understand the system, the better you are at it.

Managing upwards. Keep your manager happy and communicate your work to them.


👤 Zelphyr
A lot of great comments here and I generally agree. One thing I think we all need to consider essential is ethics. As software continues to eat the world, programmers are being used for unethical endeavors and I think all too often we don't notice it.

I'm not suggesting every programmer who works for the likes of Facebook, Exxon, and Comcast quit their jobs. (though, if they did, wouldn't that turn some influential heads in the right direction?) Simply push back when asked to work on something that you feel might cause harm.


👤 k__
As with everything in life: Get your ego out of the way.

People tend to identify themselves with technology they mastered and miss out on all the improvements that happen. This works for a few decades if they're lucky, but someday they're old and wonder why nobody values their skills in an obsolete technology.

We can't all maintain Cobol code bases when we are 50.


👤 crispyambulance
The question is too broad, but along the lines of Norvig's answer...

There's a particular micro-expression I sometimes notice with people who are working on a software problem. I notice it when something goes wrong unexpectedly.

People who aren't particularly talented at SW development, for a brief instant, give a facial expression of disgust when something crashes or behaves incorrectly. People who are awesome at development, instead, have a look of amusement like they're actually looking forward to see what happened. These facial "micro-expressions" are really fast and subtle, you really have pay attention and it doesn't always work but I've seen it enough times to believe it shows something.

I think this goes back to the impulse to "improve" things that Norvig mentions. You really have to enjoy the act of programming, to be willing to improve on it. It's a kind of feedback loop. Just MHO.


👤 goatcode
Most anyone can learn how to write code, however adding different skills can increase both the quality of what you produce, and the breadth of problems you can solve. You don't "need" to learn things like program complexity, but knowing it can help you write more efficient programs; you don't need to know math, but it helps if you want to work with encryption, and in a way testing, too.

What does that all boil down to? Probably curiosity, practically speaking. If you're genuinely interested in programming, and it's not just about money, status or proving some point, you'll be drawn to learn different things and have different discussions, over the whole course of your career, that will make you a good programmer, rather than just a passible coder.


👤 lcuff
The essential skill needed to be an is to be interested in it and enjoy it. Paul Graham writes (somewhere in his essays, couldn't find it with a quick scan) that the notion of 'aptitude' is highly suspicious. We get better at things by doing them, and after doing them for a long time we look like we have an aptitude.

A caveat: Just as being interested in and liking to play a sport won't get you to play at the top levels without talent as well, there are lots of programmer's jobs that will be out of reach, but others WILL be in reach.


👤 pier25
There are many skills (curiosity, persistence, willingness to improve, etc) but IMO the most essential is being able to deal with your own frustration.

👤 giancarlostoro
I would say humility is the most crucial skill. If you can't admit when you're wrong or you lose your mind when peer reviewed, you are going to find yourself in more trouble than working correctly in a team setting. It also allows you to question your own code to confirm if it's the existing code or yours (usually whatever is new is broken, not always, but usually there's a high probability). I have had coworkers that have lacked simple humility and self-destruct verbally when you question their code, and I've heard of coworkers having worked with people that will never admit to their code being wrong until you point to the exact line and the change they need done to fix the issue.

You waste more time defending something that will always need updates and fixes than you do getting things done when you lack humility. It is something I learned early on and I hope more developers learn it.

I will take a 'good enough' dev with a wonderful personality over an above and beyond developer with the most toxic personality any day of the week, unless I'm under an extremely tight deadline. A toxic developer can poison a whole team and ruin their productivity.


👤 908B64B197
First of all, a programmer turns a spec into working code. That's the easy part. Engineering is gathering requirements, designing the spec and ultimately coding it.

To be an engineer one must love to learn, learn fast and be able to learn on his own. It's not a job where you can expect to get training, it's a profession where you must be able to do some of the growing by yourself. It's a constant stream of new tech and new business domain knowledge. Here reading skills are absolutely required: a lot of questions can simply be answered by the relevant man page or by finding a reliable source for whatever knowledge is required for the task. You'll effectively have to become a domain expert several times in a career.

Systematic thinking and pattern recognition are essential skills to have. Our industry creates buzzwords every month and new fads in programming languages and frameworks but most core concepts remain unchanged since their inception.

Logic is absolutely required, and the ability to use the scientific method. This is crucial when debugging where you'll have to observe a problem, collect data on state, formulate an hypothesis on what caused the invalid state and verify your hypothesis. There's no "big picture" here, and every detail matters when doing this so in practice an engineers will often have to be able to keep the whole state of the system in his mind and step through it.

Communication skills are great to have; they effectively allow you to delegate and help colleagues onboard to whatever you are working on faster. From an outside point of view it's effectively super-powers, and if you want to play the politics game, allows you to get the best engineers to want to work with you.


👤 lalaithion
If you intend to work on a team larger than, say, 4 people, writing english (or your team's common language that isn't english) is supremely important.

I spend a lot of time reading the writing of other programmers. I've read 4 page documents that are a slog and 20 page documents that are a joy. Your writing, in a lot of cases, will be people's first impression of you, NOT your code.


👤 bitwize
You need a few skills to be a good programmer:

1) Literacy. You have to know how to read (and ideally write in) your native language at a relatively high level. So much of our craft's knowledge is written down, in technical if not arcane terms, that in order to learn you really have to read.

2) The ability to reason about causes and effects, that is, to envision in your head what the computer will do when it evaluates a statement in your program. Also, the ability to back-reason which statements will produce a desired effect. You need to be able to predict what will happen before you write the code and test it out after the code is written. You'd be surprised how few people have this ability developed and how hard programming is for the general population as a consequence.

3) The ability to be humble and stay focused. Your program will take much longer to write than you think it will, and there will be more bugs. You have to have the diligence and passion to see it through.


👤 sys_64738
The ability to write down in a few sentences what you're actually trying to do. The number of people who can't frame the problem they're trying to solve is unbelievable.

👤 nicoburns
Lots of people have put less obvious skills required, but IMO a decent level of logical thinking is a definite requirement. I think we often take this for granted because most of us who make a career out of programming find it so easy, but I've never seen anyone succeed at programming unless they had this.

👤 Dowwie
Grit. Don't give up on hard problems. Manage your feelings. Overcome obstacles. Practice patience.

👤 jayd16
My usual answer to what it takes to be a career programmer is 'you need to be able to sit down and concentrate on a problem for most of the day.'

If you can do that, the rest of the techniques can be learned with time and effort.


👤 pratik661
A mental model I use all the time when programming is "Chesterton's Fence" (When removing a fence, you must know why the fence was placed there in the first place).

When making changes to an existing system (whether its adding new functionality, extending existing functionality, or refactoring the code while maintaining existing functionality), try to understand the intent behind the current structure of the code and why certain design choices were made.

Once you understand that, you can add new features/extend existing features using the same design OR refactor the code with a new design without impacting existing functionality (assuming you don't have universal test coverage... which frankly will be the case a lot of the time).

Another tactic I use is verbalizing my design choices before/during the implementation of a feature/product. When programming, a lot of developers create a mental structure/map of the code base and what changes they are implementing. They know the changes they are making in their mind and know how to execute them. However, if they were to explain what they were doing to another developer (for collaboration, handoff, etc) or to business/product (ie. in order to explain estimations), they freeze up. Verbalizing your design choice will strengthen your technical communication skills.

Those 2 things aren't necessarily skills, but they are tactics that can be used to be a better programmer.


👤 muzani
Building on Peter's answer, I've always strived for three things: Better, Faster, Cheaper.

Better: I try to build things that are sturdier, more beautiful, and solves the problem better.

Faster: Each time I build something, it has to be done faster. Code is faster to read, modify, replicate. Code functions more predictably and is quicker to debug.

Cheaper: I'll keep charging more, but it will cost less. A fresh graduate might do the same for $2000/month, 3 months. I try to get it done in $9000/month, 10 days. Part of this is not spending too much time on something that might be scrapped later, knowing when to plan ahead and when not to.

The essential skills are not really math or writing. Some of it is raw technical ability - know when and how to use reactive programming, declarative, imperative, and so on. Sometimes it's leadership, speaking up when you're stuck or something looks pointless. Sometimes it's just knowing how to learn and unlearn, and how to filter out the golden bits of knowledge from the sea of useless, self-promoting articles and books out there. And it seems trivial, but one of the skills that lets you do all three is knowing how to type 20 WPMs faster and use keyboard shortcuts.


👤 blackcat201
Just my 2cents, alot of people mentioned alot criteria which I heard during my days as (empathy : backend engineer, abstract thinking : android dev, communication: company tech lead). But I think the core is the mindset to self improve that's best for you right NOW (self discipline).

This is really really really hard to do, since we are mostly lazy beings who rather click 50 arrow up key to find the one important command than remembering it or just dont mind to repeat a mundane process without finding a shortcut to do it faster. Programmers who I met that manage to finish a task in 10 minutes instead of 1 day usually have this trait. But I guess this applies to other jobs as well ¯\_(ツ)_/¯

Btw, I used to work as a part timer at my university department. One day one of the staff ask me to reformat about 90 Excels document to her desire format, she spend 10 minutes showing me how to type them out one by one. After this, I went to setup Python environment in that computer and google how to read excel docs. In a few hours I have finish the work that what would took me more than half a day to finish.


👤 gmassman
Programmers and problems come in a bunch of varieties. Some programmers only need to solve a small subset of problems, so understandably their skill set doesn't need to be particularly broad. It's ok to be capable in a niche area if that brings value to you or your organization. Largely though, programming does come down to problem solving.

The best programmers have an eye for detail that can see below the surface of a system. When someone says "we need feature X because Y", they take a Socratic stance and ask "Why do they believe X will solve Y? Why is there a Y? Is there also a Z or a W to consider?" These aren't necessarily coding questions, they're engineering and process questions. Anyone with some familiarity with a system and the tools can add feature X, but the best developers will think about the precursors and implications of X first in hopes of improving the system as a whole.


👤 dirtnugget
While many smart people here I believe said the most important things, I would like to add:

Do not accept "magical" behaviour.

I came across quite some projects which had Cypress E2E tests which were, according to the developers, "unstable".

So what is the magic part which makes it fail? There is no such thing as an instable test as such in a test environment, in this case it was a broken test with unmocked data which occasionally threw errors, depending on the OS and speed of the machine it was running on.

In another scenario the was a random number involved, which randomly chose a picture in the test development and depending wether it needed cropping or not, an additional popup would open.

I was told: "well, sometimes it works, sometimes it doesn't". Nobody actually investigated further, tests were excluded instead. Noone ever looked at the artifacts/screenshots/logs.

Always investigate, there is a reason for every "magical" behaviour.


👤 jaaron
I like the differentiation that engineering is programming integrated over time. [1]

To be a programmer you need the direct hard skills of coding literacy, analytical and logical thinking, combined with enough grit and creativity to see a problem through to completion. If you have that, you'll be a decent programmer, but you may not be a good engineer.

Engineering requires the maturity of thought to consider your actions and your solution over time. It requires more wholistic thinking and not just from the tech architecture point of view. Human soft skills tend to be more important over these time scales: communication, empathy, humility, courage. It's these skills that sustain success.

[1] https://www.oreilly.com/library/view/software-engineering-at...


👤 quickthrower2
I’ve been studying beginner programmers recently on forums plus I’ve done some mentoring. This is market research if you like.

What resonates with me is the sheer persistence of these learners in the face of the rediculous complexity.

I learned basic at < 10 yo but there wasn’t much to it i the 80s on a home computer. No browsers. No closures. No NPM. No errors because “Yer on Windows”.

You have people doing freecodecamp pushing arch other along, many self taught getting complex apps working with React. Starting from no experience.

So yes keep on going when you hit a wall, struggle through it, and the next thing, and same shit for the job interviews.

Persistence and a love of learning are essential and it’s horrible working with coders that don’t have this trait.

Also:

* team work

* emotional intelligence

* testing and quality

* understanding the business impact

* humility - it’s a skill!

* estimation

* pushing back

* job interview skills

* career strategy (I suck at!)

* going wide and learning lots of things

* going deep in some things

* communication

* inquisitiveness

* getting things done / staving off perfectionism

* some ui/ux awareness

* cloud architecture basics or sys admin basics

* and that’s not all! Etc. etc.

All of which you’ll definitely learn on the job so no need to stress :-)


👤 UncleOxidant
In addition to tolerance of frustration and tenacity (as has been mentioned several times here already), I'll go with being good at the old Sesame Street game "One of these things is not like the other, One of these things is not the same" - I feel like I'm playing that game a lot when I'm debugging.

👤 overgard
Frustration tolerance! Don't get me wrong, programming is frequently joyful, but sometimes you'll run into bugs that are maddening and require a lot of divide and conquer sort of work, and being able to separate yourself from the natural frustration is key to making progress.

👤 tboyd47
You have to be comfortable enough with computers (real computers with keyboards) to be open to using one 8 hours a day. It may sound obvious but it's not obvious to a lot of people especially with the way programming is marketed to young people through board games, tablets, etc.

👤 maire
Abstraction.

When my kids were little I thought I would teach them programming. The biggest problem I had was teaching them what a variable was. They finally did figure it out after a lot of work.

Abstraction is the same barrier between elementary school math and algebra. Some people never do learn algebra.


👤 camjohnson26
Critical thinking. The ability to evaluate ideas against reality and reject them if they don’t match.

👤 rantwasp
3 things: 1) curiosity 2) learning 3) growth

you need to be curious about why things in a certain way or why they don’t work, to take them apart, to continuously ask why

along with curiosity you need to learn. ALL THE TIME. you job learning is never done. there are fundamental things that will not change with time but a lot of things will and mastering anything will be a lot of work.

and last: growth. you need to tackle bigger and bigger problems and understand more and more in order to not get into a dead end career-wise. your goal is that by learning basic building blocks (programming languages, frameworks, tools) you get to work on or learn more advanced building blocks. the abstraction level you work on should go up


👤 jabroni_salad
I'm not sure if this really qualifies a skill. How do you improve it?

I'm an outside consultant and I'm often called to fix stuff that other outside consultants built. Pretty much 100% of the time, I am there because somebody was lacking in attention to detail. Whether it is a misplaced semicolon or a 100mbit interface in a virtual switch or some doodad doing a TCP handshake in the wrong order, I think over half of the 'edge cases' that make it to me are because somebody did not cross their Is and dot their Ts.

I think that good attention to detail is essential not just in programming or systems, but every technical profession.


👤 stephc_int13
The ability to focus for extended period of time is important and well known.

I think that good programmers also have a better than average short-term working memory space, so they can keep relatively complex structures in their head.


👤 fardeem
This is an incredible thread. Thank you all for sharing.

For me, a good programmer realizes that "everything is code". Like, sometimes it's easy to think X problem is too hard for me or I don't have enough experience or this bug is unfixable but end of the day, it's all just code. You can change it however you want and if someone else did implemented something before, it's highly likely that you'll be able to do the same. Having a level of distance from the code one writes really helps.


👤 bradwood
Dogged persistence. Keep trying, don't be intellectually lazy. Ask someone else only once you've had numerous tries at solving a problem yourself. That, and a logical mind.

👤 thisisbrians
To be able to write code, you must first be able to read code. This means you must be able to 'simulate' what the computer is doing when it executes a program — or at least the bit of it you're working on — in your own head before you can write it. Tools can and do help with this, but they cannot think for you.

Competence in engineering and architecture come from expanding the capabilities of your mind to simulate more complex programs and to think in abstractions.


👤 InTheArena
"Don’t only practice your art, but force your way into its secrets, for it and knowledge can raise men to the divine." - Ludvig van Beethoven

I would say it comes down to a character attribute, and a simple skill. The attribute is curiosity - why does something do what it does, and the simple skill is how to google. That's it. I've seen the most traditionally under-qualified people become excellent, simply by always asking why, and trying to find a answer.


👤 eyelidlessness
The ability to understand and effectively seek clarity on the specifics of the problem you’re solving (both “what does the prospective user actually want?” and “what makes this problem and/or solution distinct from seemingly similar problems and/or solutions?”), and the corresponding ability to map that understanding and clarity to the selection and appropriate application of generalized tools that will achieve those specifics.

In other words:

- Empathy

- Listening

- Communicating

- Collaborating

- Abstract thinking


👤 chrisvalleybay
Programming as a whole is too wide to have a single answer.

It depends on the problem domain. If you're writing low level code for a microcontroller that might require you to be able to do problemsolving on a whole other level than say writing CSS or arranging pre-built React components in a modern web application. In the same way styling those components might require a very different skillset in terms of taste, A/B testing etc.


👤 allo37
Here's one I find doesn't get enough credit: Reading comprehension.

That can be interpreted as reading someone else's code, but even more importantly: Just being able to understand plain English (or whatever human language).

I've seen so much code that used an API incorrectly, or misunderstood (or simply ignored) documentation. Being able to RTFM, imo, is essential. See also: Understanding what your boss wants and delivering it.


👤 TrackerFF
Core skill: Being able to read and write documentation.

After the inception of stackexchange, the ability (or motivation) to read man pages seems to have have plummeted.


👤 xfour
It’s applied problem solving. I often think of programming as invisible legos that you put together that build some sort of Rube Goldberg machine.

At many times during the process the formation isn’t expressed in code yet, so it’s up to the mind of the programmer to keep the pieces fitting together as intended until the code can be written and take a little bit of the lift from the programmers brain to expressed code.


👤 User23
Discipline. It powerfully affects code and documentation quality, time management, operations, and interpersonal relations, just to name a few.

👤 gambler
The IT industry doesn't really need "programmers". It needs people who build quality software systems. There is a difference.

The essential skill to look for is the ability to imagine some system working differently from how it works right now. A good engineer should be able to imagine several novel, alternative states and compare them, thinking of various consequences and trade-offs.


👤 mmargerum
You gotta be smart and able to think abstractly. You are building virtual legos and keeping that all suspended in your brain and that's hard to do. I hear people throwing out general terms like literacy and communication. Not really. There's a certain type of brain that's built for programming if it comes easy to you. If it doesn't come easy just bail now.

👤 spratzt
A capacity to endure endless mind-numbing boredom.

👤 dopamean
Communication is probably the biggest skill needed if you're trying to be an employed programmer working on a team.

If you're just trying to be a hobbyist and do stuff for fun then I'd say you need some things that aren't necessarily skills like curiosity, a love of challenging problems, and ability to easily retain information that you read.


👤 davide_v
I've a MSc in Computer Engineering and I think the most important stuff I learnt are "Design Patterns" and in general any Principle that guides you to write code that is: flexible, clean, maintainable, efficient and reusable. Any programmer can write code, but how many can meet the requirements mentioned?

👤 funcDropShadow
- Understanding cache hierarchies

- Selecting good names

- And thinking straight forward, being able to count from zero to one and two and so on.

And no, it is not just a joke, but my actual opinion, that understanding the underlying machinery, communicating well, and being to able to think on your own through complicated matters are the most valuable skills in programming.

[edited layout]


👤 whoomp12342
I think that largely depends on what kind of programmer you are. Like it or not, systems development, app development, backend, frontend, integrated circuit development all have their own mindset and associated challenges and skills. What is your most essential skill? the drive to learn.

👤 le-garden-fox
The ability to learn and adapt. The first few years as a programmer you are going ton have a billion aha! moments. At every turn you will think you are a bad ass, only to be humbled. Have an open mind ready to learn and adapt.

👤 hill613
Critical thinking is the most essential skill in my opinion to be a good programmer

👤 latenightcoding
Being able to memorize things.

👤 chasd00
a thirst for new knowledge and the ability to communicate that knowledge to others in a way they understand. Speaking to a fellow programmer is different than speaking to a manager is different than speaking to a customer.

also, knowing how to say "no" professionally and firmly is an important and respected skill.

finally, being able to see the forest through the trees and value the business side of what you're doing is a key perspective. Everyone loves to trash talk Sales/Marketing/Management but those people turn your programming into your paycheck so a little understanding is deserved.


👤 livingdeadpgmr
One issue with learning to program,many people think learning the syntax of a particular language is programming. The one thing all programmers need is a way of thinking about problems and systems. Hard to teach.

👤 euske
It's like asking how to become a cook. There's just so much variety to it - it could be hobby, professional, corporate, or artisanal, etc. You can't give any more specific answer to that.

👤 rootlocus
Maybe not essential, but definitely useful: Abstract thinking and visualization.

Being able to create mental metaphors of systems or problems, solve the metaphors and apply the solution to the original problem.


👤 LoSboccacc
programming is most like looking at a lego set and being able to figure out the instruction working backward.

problem decomposition is maybe not the central skill, but the one that helped me most so far.


👤 bluetwo
Thinking abstractly with a sense of curiosity and humor. Only hire programmers who like Monty Python.

Second would be the ability to write a one-page summary of problem and proposed solution.


👤 gjvc
"Dealing with failure is easy: Work hard to improve. Success is also easy to handle: You've solved the wrong problem. Work hard to improve." -- Alan Perlis

👤 PopeDotNinja
The best way I could summarize it is that coding is the easiest part of my job (unless I have to touch CSS). Working with people is by far the hardest part.

👤 MrDresden
Know when to seek out assistance from others. I would much rather spend 30 minutes in cooperation with others than multiple hours by my self.

Work smart, not hard.


👤 saluki
y, just being able to take the plunge and try, innovate and improve is the first step.

I think it also helps if you have a skill for quickly deducing what's wrong when there is an error.

So being able to troubleshoot an error or bug quickly is my favorite coding super power.

Being able to Google a solution or something close to your coding problem/challenge and being able to adapt it and make it your own is a huge plus as well.


👤 sizeofchar
Proper literary training. With it comes memorization skills, structuring of ideas, comprehension of abstraction, naming and defining skills.

👤 tester756
Google hacking or Google in general is very useful

👤 aristofun
#1 skill programmers are paid for is converting requirements (wants, ideas) from human to deterministic reproducable algorithms.

👤 caviv
Not mine, I read it somewhere: "A good programmer is one who looks both sides when crossing a one-way street".

👤 mraza007
In order to be successful programmer you need a lot persistence and patience. Plus having a long term vision is a must

👤 rvr_
English, for those of us not born into it.

👤 damontal
A high tolerance for frustration helps.

👤 tmaly
the ability to communicate well is an essential skill.

If you think about it, software is driven by business requirements in most cases. But business requirements are open to interpretation. How do we know what people really want? This comes down to good communication.


👤 markus_zhang
I consider curiosity and perseverance to be the most important characteristics for any career.

👤 marcuswebb
Look up things you don't know before you become frustrated that you don't know them.

👤 Madmallard
No particular skill is needed.

Sincere interest is.


👤 solus_factor
Thinking. It's the _only_ skill programmers need. Everything else will follow.

👤 WalterBright
You have to like it. Or you'll never be worth anything at it.

👤 student2k
I would say curiosity..

👤 hooby
Willingness and ability to learn and to never stop learning.

👤 AlphaGeekZulu
Curiosity, playfulness and no fear of the machine.

👤 WrtCdEvrydy
Curiosity, Fearless, and Listening skils.

👤 sidyapa
"The want to create something"

👤 Bambo
Imagination, to come up with solutions!

👤 aYsY4dDQ2NrcNzA
Being able to read other people’s code.

👤 b20000
negotiating top compensation and demanding respect for your work, and learning to say no.

👤 naringas
learn to read and follow instructions. after all programming is all about writing them

👤 matthewadams
Insatiable curiosity. Period.

👤 haakonhr
Sitzfleisch

👤 dave_sid
The ability to drink coffee

👤 matthewadams
Insatiable curiosity.

👤 the_70x
working in teams

👤 bradwood
Boolean algebra

👤 BerislavLopac
Abstraction.

👤 RickJWagner
1) Curiosity

2) Aptitude


👤 adultSwim
Listening

👤 MrXOR
Teamwork

👤 salihagenter
Agenter is the best place for anyone who wants to earn more money online. Here you can make money in the form of commission by working for the business offers or referring them to the right individuals. You can also help others to make money online by referring to the leads. To know more visit how" rel="nofollow">https://www.agenter.com/how-to-earn">how to earn money [url=https://www.agenter.com/how-to-earn]how to earn money[/url] https://www.agenter.com/how-to-earn