Developing skill in any field requires dedicated learning and a lot of time. Some subjects, like programming, require more time due to their diversity. You must develop many skills, either at the same time or one after another. A lot of programmers falter on this path. They find their skills lagging and aren’t sure why it happened or how to correct it. Sometimes a simple prod in the right direction is all it takes.
Programmers always begin with a love for problem solving. The act of taking a problem, solving it then transforming that solution into small discrete steps exercises the mind. This typically feels great. It’s easy to find problems that put you into the zone of proximal development. This happens when you encounter a problem just beyond your current skills, one that requires a struggle and growth to complete. This is the true joy of new programmers. This doesn’t require a job, just a guy having fun in his own time. Programmers who become experts do these projects for fun, even if they program professionally. During work they do routine projects and in their own time they do fun projects. Fun projects improve skill far more rapidly than routine projects.
Programmers who do it just for money, or those who can’t feel joy when programming, will usually change careers. Improving skill requires a great deal of effort and must be driven by an equally powerful motivator. For experts, it’s the joy of problem solving and learning that drives us ever forward. This defines the core skill needed in programming, which is Problem Solving. Great programmers don’t only solve problems they also study the process of problem solving. Their skill improves until it becomes difficult to find problems in the zone of proximal development. At this point, many switch to new careers. Those who remain search for joy in new aspects, such as optimization.
Optimization is doing more with less. It could mean doing more with fewer instructions or doing more with less memory or doing more with less disk/network access. When solving a problem becomes easy, the real challenge becomes solving it better than you solved it before. This becomes the new driving force and the new joy of programming. It’s an intellectual challenge that pushes us into the zone of proximal development and helps us grow.
At first optimization is chaotic, but we soon find patterns in it. Low level optimization involves changing programming instructions to more efficient ones. Mid level optimization is when we analyze algorithms. Algorithms can be described with equations that predict how long they run or how much memory they use. Different algorithms have different equations. Programmers quickly realize that selecting algorithms based on their equations provides excellent results. After years of this and using it until it becomes intrinsic, programmers glimpse high level optimization. High level optimization involves a project’s organizational concepts. Do you use a layered approach, object approach, repeatable architectural elements or more. You should know when to split code into a library and what kind of library to make. The purpose of high level optimization is project elegance. An elegant solution does an incredible amount with very little code. High level optimization can take a great deal of time to learn and master.
Thankfully this is not the end point of programming. Even mastering everything till this point leaves a lot to study and master. QA is one such skill. Many novice programmers scoff at QA, thinking it’s beneath them. However QA is an essential skill for expert programmers. 10% of QA is making sure something works while the rest is learning how to break things. By learning how to break things, a programmer learns how to make code that can’t be broken. This is also essential for secure software. This leads to the more general skill of bug free programming.
Project planning is another essential skill. It’s one that’s hard to find in increasingly agile workplaces. Since you can program without learning how to plan a project, most programmers don’t learn it. Then they use an approach that doesn’t require planning. If they learn how to plan then planning becomes invaluable to programming. Planning naturally happens when projects become too large to hold in your head. A plan helps organize code. When you become good at planning, you don’t have to code the project to know how it turns out. You can tell from the plan if a project will work and what it is like to use. You can also determine the parts that could be improved. Rewriting a plan takes far less time than rewriting all the code. So while a plan takes time, you can rewrite it several times to polish the project before ever coding it. If you use a code-only approach, it will take five or six complete rewrites to reach the same level of polish.
Another skill involves interfaces. Designing a good interface requires a unique set of skills. There are methods of placing controls, overall patterns to use, what each of the fonts were made for and how to best use them and so much more. A great interface designer can create interfaces that people like to use.
You’ll also need experience using other applications, such as IDEs, databases, profiling tools and more. Word processors are also essential for writing documentation. Paired with this is the ability to communicate. Communication is essential when writing documentation or even within a team environment.
Most skilled developers go through an assembly stage. They work in pure assembler for a time just to learn more about it. This is a great way to understand how things work in low level. It will also get you very comfortable with pointers.
For skilled developers looking for a challenge, you can always delve into the hardware end. Digital circuits can be quite fun. You can even get an FPGA and make your own cores. You can also build your own devices, such as USB devices.
So far all the skills discussed directly relate to programming. Programmers also require skills in the area that your software touches. Any program that involves statistics means you need statistics skills. Computer graphics mean understanding of geometry and matrix math along with common graphics libraries. Business software means you need to understand accounting. Since programs provide solutions for many different industries, an understanding of those industries is essential when writing those programs.
For programmers who wish to assess their skills, there is one simple method. This comes from the study of expertise. Expertise is a field of research. This field began with chess, because chess has a method to quantify skill. This lets researchers understand what it takes to develop skill. It’s a fascinating field of study and is well worth reading more about. Research into experts has shown the best method to determine skill in any subject is working memory. An expert has a greater working memory for their field of expertise. In programming, ask yourself how many lines of code you hold in your head as you code. Novices only hold a few lines. Experts hold a minimum of 30,000+ lines. Experts don’t hold every individual line of code, rather they hold patterns. Use this simple metric to measure your skill and you can quickly gain an accurate assessment.