March 8, 2017
What Skills Does it Take to Code?
There have been interesting discussions about what skills coding actually entails. Is learning a programming language like learning a new language - or is it more similar to learning math? There have even been studies that measure which parts of the brain are activated when coding.
The truth of the matter - based on my personal experience as a developer and educator - is that learning to code is not really like learning a foreign language, nor is it like learning math. It’s really a self contained subject that boils down to the ability to do one thing: Communicate with a hunk of metal that has no intuition.
Before computers existed, the ability to communicate with mindless metal was a completely useless (and impractical) skill. “Computer Science” only became a thing when computers were first conceptualized.
Because talking to metal is an independent skillset, that results in both bad news and good news. The bad news first: No one is born with an innate ability to learn to code. It requires lots and lots of practice. The good news, however, is that anyone can learn to code. You can be bad at math and foreign languages (like me!), and still become a software engineer.
Learning to code is really about learning a new way of thinking: How can I get this piece of metal to do what I want? And this is very different than the communication you’re used to - which is the communication of human to human.
If someone called you on the phone and asked how you made that delicious stew you served last night, you might say: “Oh, it was easy! I just threw in a bunch of potatoes, ground beef, and spices - I’ll send you the list of spices in a text.”
Now, let’s imagine that we were to describe to a computer how to make that same stew. (Let’s even assume the computer had robotic arms so that it can actually make the stew itself!)
We’ll begin with the potatoes. To the human, you said “I just threw in a bunch of potatoes.” Now, a computer has absolutely no idea what to do with that instruction. Why? Here are just a few reasons:
- Since it doesn’t know how to estimate, it doesn’t know how many potatoes to put in. You need to give it an exact number.
- You never mentioned that you’re placing the potatoes into water! Without specifying that, the computer will skip that step.
- You also never mentioned peeling the potatoes - so the computer will add them unpeeled. Eww!
- It might literally throw the potatoes, causing them to smash into bits.
Let’s discuss a more realistic example. Imagine that you’re coding a Wheel of Fortune app, where a user can play that game show against computerized contestants. Building the game so that there’s a wheel, letters, and puzzles is the easy part. But how can you make it so that the computer plays against the human user in a realistic way? If the computer does not truly have a brain of its own, how can you make the users feel like they’re playing against other intelligent human beings?
If we analyze the situation, we’re faced with a very challenging set of constraints:
- The computer doesn’t have any real world knowledge of phrases, sayings, or concepts.
- The computer doesn’t know which letters form a word. To it, “asdfads” is a word just like “pizza.”
- The computer already knows the true answer to each puzzle! If it’s loading the puzzle in the first place, and can check whether the user’s guesses are correct, by definition it already knows the puzzle’s solution.
Now, there are some things that a computer can do that we may be able to take advantage of:
- A computer can be given any set of arbitrary rules that we provide it.
- A computer can randomly select an item from among a set of stuff.
- A computer can count and make mathematical calculations.
Software engineering boils down to figuring out how to use the computer’s tools to accomplish a particular task despite the computer’s constraints. How can we utilize the computer’s abilities to make a human-like Wheel of Fortune player?
Here’s one approach, that although simplistic, may be good enough that a human might feel like they’re playing against another real human player:
We’re going to write code that gives the computer the following set of rules:
- We’re going to divide consonants into three categories: The common letters are [T N S R H L]. The semi-common letters are [D C M F P G]. The uncommon letters are [Y B V K X J Q Z]. (I just Googled “most common letters of alphabet” and found this info.)
- When it’s the computer’s turn, it will first randomly select one of the common letters.
- When all those letters are exhausted, it will then randomly choose a letter from the semi-common category.
- Finally, when all of those letters are exhausted, it should randomly pick one of the uncommon letters.
- The computer should buy a random vowel on its every third turn if it has money to do so.
- If 85% or more of the letters of the puzzle have already been revealed, the computer should just “solve” the puzzle. Really, it knew the solution the entire time. But when the 85% of the letters are revealed, it just reveals the rest of the letters and wins the round.
We just worked with the computer’s capabilities to mimic human intelligence!
Learning to code boils down to one thing: It’s learning to give a computer a set of very specific instructions so that it can perform a particular task.
Is this a skillset that people have naturally? Absolutely not. But anyone can learn it. I’ve seen people of all backgrounds go through Actualize and succeed in the field of software engineering. I’ve seen construction workers, taxi drivers, social workers - people whose backgrounds have nothing to do with coding - all successfully launch careers as software engineers.
While learning to code is primarily learning how to communicate with a computer, there are a number of character traits that are also important to be a successful software developer:
Persistence: No day goes by in the life of a developer where you aren’t working through tough problems. Some coding is routine, but most of it is solving a challenge you’ve never encountered before. In fact, many of these problems are challenges that no one has ever solved before. If you’re looking for easy street - or a job where you do the same thing every day - coding is not for you. However, if you’re ready to wake up every day and tenaciously tackle new problems - some of them which may take hours to solve - then coding might be right up your alley.
Creativity: Most people associate creativity with the arts. However, software engineering is truly a creative process that makes you use every part of your brain. Here’s a little puzzle: Imagine that you are locked in a room whose walls are made of wood, and you have a match, a thimble, a glass bottle, and a rope. How can you escape? I have no idea what the answer is, but you might already start to feel your creative juices flowing when asked such a question. Coding is the art of getting things done despite constraints. It’s like solving a puzzle: You’re given a mindless computer, that has limited but powerful abilities - now go figure out how to achieve X. There are no wrong approaches - you can use all the computer’s capabilities to get the job done. How do you do it? If that excites you, software development may be fun enough for you that it may not even seem like a job.
Attention to detail: If you’re missing even a single comma in a file containing thousands of lines of code, it’s possible that your program won’t even be able to run. If that “s” is lowercase when it should be uppercase, that might also make your code flop. Now, the good news is that when you have a bug in your code, an error message will let you know which line of code is problematic and what about that line is faulty - so you don’t have to go searching for a needle in a haystack. However, you do need to care about the details. Detail oriented people make for very good software engineers.
Always be learning: Technology is always evolving, and the stuff you know how to do now might change significantly in a year or two. If you want a job in which you learn a set of skills and then stick to those skills for the rest of your life, coding may not be your cup of tea. A developer always needs to be learning new things to become more effective and to stay relevant. If you love to learn, and want to always keep your brain in full gear - then being a software engineer might be your thing!
Want to learn more? Book a tour here to see if Actualize can help you become a software engineer.