At its heart, coding is expression and problem solving. You can focus on its applications, on programming languages, but no matter how you practice it, you’ll cultivate these two essential skills, which will help you in all aspects of life. Besides existential value, learning to code proficiently will offer you myriad job opportunities, the ability to create your own schedule/work from anywhere, high wages for less hours of labor, eager to please clients that need/search for your help, and much more. Coders have more time to work on their passions, side projects, and enjoy a sense of self-reliance most workers don’t. They spend their time making websites, applications, and systems work, while building real solutions, and improving experiences for end users and employers alike. Coders have enhanced focus, because the issues they tackle require sustained, concentrated effort. This leads to greater productivity in all sectors of life. One of the greatest benefits from coding is consistently entering a state of flow, in which time, distraction and frustration melts away, allowing the coder to form a union with the task at hand. For all these reasons, coding casually or professionally can improve your life. So how to begin? Here we’ll examine ten skills that every coder needs.
This one is huge. When you start out coding, it can feel completely overwhelming. Should you focus on front end or back end? What programming languages should you use? Where to begin? Keeping in mind that the only way to eat an elephant is a bite at a time, pick something and start. There are infinite resources where you can learn to code, but it’s up to you to seek them out, and engage with them. There will be times where you want to give up, or have someone else show you how to do something, but the more you resist those urges and try and fail on your own, the greater your longterm success. To have any success in coding, you’ll have to master impatience, frustration, distraction and the dependence on external forces to solve technical problems (something we’re all increasingly reliant on). In order to combat these obstacles, there are several things you can do. The first is accepting responsibility.
You have the greatest influence on where you are, what you know, your capabilities, and how to change all of them. It’s never too late to recognize this and change your approach and efforts. Once you’ve taken responsibility, the information you consume and how you apply it, (your interest, study and effort) will dictate your ability to transcend your limitations (in this case, not being able to code vs. learning how to). It’s important to have a goal in mind. Why do you want to code? What problem do you want to solve, or what project are you hoping to manifest? Knowing the answers to these questions will help you narrow down where to focus your efforts, what languages to learn, etc. Finally, self-reliance boils down to the choices you make. You can’t just put in work blindly. The same way you need to have goals the work is aimed towards, you need to choose a path that will bring you towards them, independent of what others have done, or leaving it up to chance.
Were you a master of Geometry in high school? Love proofs? Live to assess the facts at hand and come to useful conclusions for problem solving? You may have a skeleton in one of the most important skills for coders. There’s a reason so many people that study math and physics end up as coders. Figuring out what mistake/bug/bad line of code led to an issue in a project is partially intuitive, but often an exercise in logic. So how do you build up your logic skills? Treat them like muscles, and exercise them. There are tools like Dcoder which gives you challenges/problems that will develop your reasoning. Another way to build logic skills is through conditional thinking, which essentially means, if this, then that. For example, let’s say if you climb more than halfway up the mountain, you’ll get a nose bleed. If you stay below the halfway point, you won’t. In programming, this style of thinking is used to test variables against values, and order action based on what conditions are met. It can be understood like this:
if (a condition evaluates to True):
then do these things only for ‘True’
otherwise do these things only for ‘False’.
Simple mechanisms can’t do this. It’s these conditional statements that let the program take on an analytical life of its own and not just follow one set of instructions to its end. It’s important to use conditional thinking or statements to your benefit, but not live or die by them. They’re a tool to help expand the abilities of what you’re creating, but shouldn’t box you in in your ability to troubleshoot. Take the previous example. It’s important to realize just because someone’s nose is bleeding, doesn’t mean they went halfway up the mountain. Nose bleeds happen for all kinds of reasons. Removing yourself, and your subjective experiences from the situation at hand will be helpful. What you’ve encountered, or think you know, should be used as a suggestion, but not an end all. Be open to being proven wrong. Observe any problem or task as it is, and let that dictate how you approach it, doing so so from a what, how and then why progression.
4) Attention to Detail
Many programmers and coders don’t go to school to learn their trade. There are different ways to measure aptitude for coding, but nothing can substitute the effort a person makes, on their own. It’s one of the few areas in the world where self-taught hard work can lead to a lucrative, highly demanded career. What you won’t NEED to have learned, or have prerequisite abilities, will be mitigated by how closely you can pay attention to details. The understand of the interconnectivity in commands, general awareness and lingual precision are all extremely important parts of a coder’s toolkit. One way to do this is through organization. Instead of hammering yourself each time you overlook an important detail, build a game plan from which you can assess, review and improve your work. Maybe taking laps through the code you write, or promising to reread pertinent information at different times of the day, while working intermittently. Whatever works for you, just make sure you have a system beyond, “I will pay attention to the small stuff.” Scheduling your time leads to more productive, efficient work.
Improving your attention to detail has a lot to do with knowing what to look for. Towards that end, make lists. When you learn something that you know will be useful again and again, write it down. When you have work, research, new skills or languages to do or learn, list what you’re hoping to accomplish, and how you do it. When you achieve something on the list, put a check mark next to it (don’t cross it off, you may need to come back to it). Another way to improve your prescience is maintaining a schedule. You may not going to be as sharp after big meals, or first thing in the morning. You’ll figure out best when you’re most on point, but take note of it, and do your programming or coding work when you’re on top of your game. Another time-honored way to improve focus is meditation. Even focusing on your breath for 10-20 minutes a day will pay dividends in the rest of your life. Another surprising way to improve concentration? Exercise. At least 30 minutes a day leads to a marked improvement in focus. Most importantly, be gentle with yourself. Develop a sense of when to push through despite wanting to break, but also make sure to give yourself brief breaks when you’re feeling unmotivated or having trouble paying attention to details. Then when you come back you’ll be fresher and get better use of your effort.
5) Recognition of Stupidity
This could also be “understanding how computers think.” We’ve all been told not to make assumptions, but assuming common sense on behalf of a computer while programming or coding is a recipe for disaster. Computers are dumb, and ruthless. Their strength is their processing power, not independent or creative thought. They’ll do exactly what they’re told to, even when it might seem obvious to gently tweak instructions, or not follow the same ones again and again. People like Bill Gates and Stephen Hawking have warned about artificial intelligence leading to the apocalypse. Nick Bostrom, a student of super intelligence and the director of the Future of Humanity Institute at Oxford University, laid out how the world could be destroyed by artificial intelligence under instructions to maximize the number of paper clips in the world. If that AI was able to invent technology and build manufacturing plants…look out. “How could an AI make sure that there would be as many paper clips as possible?” asked Bostrom. “One thing it would do is make sure that humans didn’t switch it off, because then there would be fewer paper clips. So it might get rid of humans right away, because they could pose a threat. Also, you would want as many resources as possible, because they could be used to make paper clips. Like, for example, the atoms in human bodies.” So when you’re coding, make sure what you’re inputting is what you expect to be output, no more, no less. The program can’t make adjustments or improvements that it’s not told to do first.
Some of the greatest achievements in programming have been creating algorithms that get computers to think in more independent, brilliant and productive ways. Look into algorithms like Quicksort, Huffman Compression, the Fast Fourier Transform, and the Monte Carlo method to see what I mean. All of these have helped develop a major goal for coders: getting computers to do more of the heavy lifting through artificial intelligence, yet doing so in a way that is useful, focused and doesn’t lead to our species’ destruction. So when you’re coding, try to think the way a computer does, and use your attention to detail skills to make sure you specify exactly what you want, without leaving anything to chance or adaptation. You won’t have to specify EVERYTHING, some calculations will be made automatically to free you up to directing the program. But maintaining a mind frame where you don’t trust what you’re working on to do anything it wasn’t explicitly told to is extremely important.
6) Abstract Thinking
Abstract thinking is thinking done without the object of the thought present, or even physical. It’s a foundation of coding. Because the written code, and what it produces can never be observed and measured physically, successful coders have to develop an ability to think abstractly, in larger, more comparative ways than they may be used to. Abstract thinking is also the ability to think about a subject, object or project on many levels at once. Being able to balance different symbols, commands, and processes that are in place, running automatically, vs. those that you need to more directly oversee/renovate is an important, often overlooked part of coding. Abstract thinking is often improved through discussions with others. It involves a willingness to see things from a different angle, or to draw analytical conclusions from what might seem straightforward.
Let’s say for example that you told someone to go buy a pizza. That would work out great if the person automatically knows how to get to the pizza store, what money to bring, the pizza you’d like ordered, and even smaller, more minute calculations like how to drive, walk, or continue breathing. You might even bring back a pizza that I wouldn’t think I’d enjoy. But perhaps after eating it, I learn to love it. An abstract thinker could recognize something in my newfound reaction to a previously undesired pizza that speaks to the ability to change our feelings and desires even when we don’t think we will or want to. Being able to separate, create and visualize what a program knows, what it can know, what it’s compartmentalized already and how these factors interact are all essential to coding.
On horribly hot days, you have the choice to rebel against the heat, huffing, puffing, and letting agitation overheat you even further. Or you can give in to it. Accept that you’re cooking in the sun, picture yourself melting into the pavement, erasing separation from the heat in your mind. Coding is extremely difficult. Nothing that you’ve read here, or read somewhere else should be interpreted differently. At all stages, but especially when beginning, you should expect to feel extreme frustration. However, your ability to withstand that frustration, and move through it, without letting it discourage you will serve you in all that you do. Look at your frustration as a tool to develop your patience. When you’re coding, you’ll likely go through this experience: you write something. You’re extremely confident in it. You double and triple check it, and it still doesn’t work. You have no idea why it doesn’t work, what you did wrong, how to fix it, etc. It can be a crushing weight. You can feel useless, or like you’ll never be successful, not just at this project, but in life. Take comfort in the fact that countless people have felt this way before you. How you deal with this feeling is all that matters. If you believe in your ability to overcome, find a new route, or even start from scratch and improve, you can and will (or at least you’ll have a way better shot than those that give up completely).
Paying attention to details goes hand in hand with taking time to let their meaning develop. “Details matter,” Steve Jobs said. “It’s worth waiting to get it right.” Recognize that when you’re struggling, what you’re dealing with is uncomfortable, but not intolerable. Repeating that to yourself until it becomes ingrained will be very helpful. Let the pain you feel from frustration push you to find solutions. Solutions rarely come from desperation, or the quickest, wildest approach. A big part of patience is talking to yourself. When you hear the voice of, “you’ll never do this, this is impossible, just give up,” be ready to counter it with a more determined, softer, kinder voice that represents your deeper, persevering core. One of the best ways to build patience is through reading, or really any sustained activity that requires focus. The longer you can do one thing, despite the temptation to quit, or go do another, the better your ability to overcome the frustration of coding will be.
8) Strong Memory
Innovation and improvisation are extremely important to coding. In many cases you’ll find yourself completely baffled, or faced with a problem, project or situation you think you know nothing about. Sometimes you’ll be right. Often, if you think hard enough through your experiences, you’ll realize something you’ve already encountered may prove useful again. It might be from direct coding experience, or it might be an abstract, unrelated memory that somehow seems pertinent, or just through recalling it makes you think of something useful for the moment at hand. While working with the same languages, you’ll internalize syntax, and it will feel less like using memory and more second nature to recall important commands.
When it comes to long term memory, you’ll be aided by infinite manuals, websites and tools that will help you recall important information. As you develop your abilities (and want to complete projects faster), memorizing more information will be useful, but it’s not something to worry about immediately. However, when it comes to short term memory, you’ll want to do whatever you can to cultivate and improve your natural faculties. Coders need to be aware of many different pieces of information at once, and know how they’ll all react to each other. Being aware and able to visualize design, data flow, algorithms, data structures, and how they effect each other will separate you from the average coder. At first it can feel like juggling herring with ravenous dolphins jumping all around you, but it gets easier. This is where memory and flow coincide. The more you can lose yourself in the project, the less it will seem like a struggle to remember different aspects of the work. Meditation techniques and memory exercises can help with this as well.
9) Scientific Method
The problems/challenges of coding can seem infinite, daunting, and impossible to begin. That’s where using the scientific method to break down obstacles and projects themselves can become extremely helpful. In most jobs, you develop and learn many ways to solve problems in the first year or so, then apply them from there on, occasionally developing new solutions as well. But in programming, a good deal of your time will be spent developing solutions to problems that have never been solved (at least not in the exact way you’re encountering them). You won’t have information on how to go about solving them, you’ll have to use trial and error. Seeing coding as research or experimentation will be extremely useful. It’ll also aid you in terms of deadlines. Because you’re doing something new, you can honestly expect leeway because it’s unclear how long it will take to properly solve a problem. Following these steps will help you with whatever project you’re working on.
Start with a hypothesis. What do you think the program you’re writing will accomplish? Or, what do you think a program look like that could solve a particular problem? Next, you outline how you will write the code, either on paper or in your head. Then you take a crack at it, and see what you came up with. That’s followed by comparing what you created, and the control, or what the program was supposed to do. It’s also aided by showing the program to others and getting their input on what you’ve done. Does the program you created match what you expected? Does it serve the function it’s supposed to? Finally, you begin debugging, or bringing the program closer to the ideal you’d imagined.
10) Communication and Empathy
Perhaps the most overlooked aspect of programming has little to do with the manual and mental labor of writing code. Coding is an insular world that effects our lives more each day. Coders need to be able to work with, and explain what they do to employers, clients, consumers and coworkers that don’t understand what they do. Writing clean, effective code is great, but when you pair it with strong empathy and communication skills for beginning coders, end users, you become the rising cream. Anyone can say, “this is how we’re doing it,” or, “you just don’t understand.” Elite coders listen to feedback and adjust, even if those providing it don’t understand the ramifications of their words. An effective coder can manage expectations, interpret vague desires and honestly assess and communicate what is, and isn’t possible. Coders are known for their egos, but those willing to patiently give and accept advice and direction are far more respected than snarling programmers that only relate to their desktops.
Empathy is the art of comprehension, awareness, sensitivity and sharing of other people’s emotions. When coupled with the ability to express and prioritize others’ priorities and feelings, it’s extremely potent. Communication and empathy breeds positive, actionable accountability, and will make your job far easier in the long run. You’ll better understand others’ needs, feelings, and how your behavior and work are received and interpreted. And irregardless of coding, or work life, better communication and empathy will make you happier, more convincing and more durable to the negativity of others and hardships of life. These are skills that require proactive, consistent development, with the same level of focus and commitment you’d apply to learning a language or working on an important project.