Always Be Creating. It’s as simple as that. Reading about programming alone does not give you the experience or knowledge necessary to succeed. Experience helps your brain assimilate new information by forcing you to connect the dots between concepts and information using observation and inductive reasoning. In computer science, it’s all about what you create. Make a little app. Make a website. If you make one tiny app per week for a year, you’ll have 52 apps within one year. All of those one-off endeavors can go on your resume and help you think like a programmer. Better yet, you can garner enough experience and know-how to start your own business. Create a blog post, create something. Many prolific programmers got their start in open source. What stops you from going out and creating your own open source project or contributing to someone else’s? To be an expert programmer, problem solving through creation should be one of your life goals. No expert learns casually. Creating something every day forces you to think critically on a regular basis. Creation is not a casual exercise. It’s not like watching episodes of Breaking Bad or spooning with your girlfriend. Creating something forces you to think about the world in ways that you would have never thought of were you merely observing. Through building a bunch of little projects, your expertise will soar. Want to become a full stack engineer? Build a front-end web app one week, the next week build a php backend for it, the next week build an android app that also uses the backend, the next week build an iOS app that also makes simple requests to your backend. Wash, rinse, repeat with different languages and different technologies. The goal should be to hone your creative problem solving skills and just to absorb as much as you can about the intricacies of what you are doing and how you are doing it. If you want to be an expert programmer, one day should not pass in which you are not creating something. All that is left of us after we leave this earth is that which we create. Whether it be offspring, companies, legacies, or and app that improves the lives of 10 people, we have the power to create something every day. While doing this we can also become experts. What did you create today?
I am not an expert programmer nor do I claim to be one. I know that one day, I will be. I have immersed myself in the field for the past 9 months after leaving my previous career of 5 years. For some people, the following concepts come naturally and/or early on during childhood development. For others, they may come after years of practice. These are concepts that can be applied to any field, not just programming. Heres what I’ve learned, in no particular order of importance:
The Big Picture
Programming, or more appropriately, software engineering, is not about learning any particular language, it’s about representing and creating useful systems of varying size and complexity. Systems that enrich peoples lives in some way. Systems that are maintainable, and in today’s world, scalable. Systems that can be maintained by others. Systems that are robust and do not become obsolete as soon as they are built. Programming is more of a philosophy and a way of life than it is a traditional field of study. The act of architecting and building out complex programs is not tied to any particular programming language, and the skills needed are not specifically programming skills, but critical thinking skills. These can be developed just like any other skill. The ability to analyze a problem, look at the inputs, outputs, the visible and invisible context, and make informed inferences and decisions transcends any particular programming language. This is the skill that will most benefit you as a software engineer.
Programming, like anything, requires practice. However, one may find oneself practicing in vain if the type of practice isn’t conducive to learning and growth. Deliberate practice in programming means that you should scrutinize your code from every possible angle. I analyze every syntactical element when I’m coding, including how it relates to the rest of the program – even if it’s where a bracket should be placed. It’s easy to get into the automatic mode of copying and pasting lines of code from stack overflow and similar sites. This can be detrimental if you do not know how that code works on a deep level. You are not growing as a programmer if you do not know how your own code works. You should know what every method does, what parameters they accept, what outputs they return, what objects they belong to, when that object is used, what unique language features are being used (and why), etc. I can’t tell you how many times i’ve ignored the “virtual” keyword in C++ before I started practicing deliberately(and before my very kind co-worker told me what it was for). I now look up every unknown symbol encountered and try to commit its use and context to memory. Doing this enables you to learn increasingly difficult patterns and code styles without having to go back and look up what you’ve already seen – usually the building blocks of such complex patterns.
Every word you read can be qualified or quantified mentally. As you read something about programming, its easy to let your mind wander if that something is very boring. I found this happening to me while reading about the Android NDK. Not a very interesting subject at all(at least not while just learning it). To combat my waning attention span and to stop losing sight of the details, I decided to attribute something physical to each word I read. Heres a sample excerpt from the NDK documentation “A
jni/ directory contains the native activity, main.c, which uses the
android_native_app_glue.h interface to implement the activity. The Android.mk that describes the native module to the build system also exists here.” When reading this, you can think of a folder called JNI(maybe with “JNI” printed on it” ) – a physical folder, with a physical file “main.c” in it – taking note of the word “main” and the extension “.c” . And you can think of the other file, android_native_app_glue(taking a mental note of every word in this filename and the meaning behind every word) being physically used by main.c (maybe with main.c actually grabbing it with a hand in your mind’s eye) to implement the activity. And if your not sure what an “activity” is in that sentence, look it up right away. The same goes for “Android.mk”. This may seem like common sense, but its easy to gloss over a detail represented by a particular unattractive looking word, just to be stymied later by it and realize that it was a key piece of the puzzle. Take it all in, don’t let anything you read slide. The more symbolic representations you can create in your mind of these abstract concepts, the easier you will remember them. The human mind is meant to understand abstractions – after all, we do not see on a microscopic level, therefore everything we see and encounter in real life is an abstraction of some more complex system.
Find a mentor, someone who knows way more than you and has been doing this for years. Your mentor should be able to tell you deep and hard to find secrets about the field that are only learned through years of hard work, toil, and experience. There is no shortcut to being an expert yourself, but no one is more qualified to lead you on your path than another expert. Experts possess a deep knowledge that allows them to see the field as a whole. With the details out of the way, they can see how the entire system works and have unparalleled insight. Studies have shown that expert tennis players can predict the direction of the ball before the other player hits it. They pick up on cues that the non-expert would not. They analyze the opponent’s posture, head and elbow position, stance, etc. and deduce where the ball will go. Knowledge like that can only be attained from an expert tennis player or from years of experience.
Live in a big city and go to a lot of meetups. There is programming knowledge everywhere. Just go to meetup.com and look for groups of programmers. There are countless groups dedicated to specific languages, domains, operating systems, etc. Frequenting these meetups allows you to see what other people are doing and how they are approaching problems. Being in a bubble does not help any programmer. The proverbial programmer sits in his parent’s basement and codes his way to fame and success. This just doesn’t happen as often as people like to believe, and is very, very rare. Programmers need people too. Ideas are only attained through the minds of other people, and what better way to get ideas in this field than surrounding yourself with people who have ideas in the field? Sort of a no brainer. You can combine the ideas attained from chatting with someone or hearing them speak with ideas from other people or ideas that you have gained through experience and practice.
On Programming Books
Always remember that you are making software for people to use. Take heed of who those people are and what they expect. Professional software should have a professional feel. An Image editing app will have a slicker user interface than an enterprise email client. UX is a whole other discipline, and people spend their entire professional careers designing cool user experiences. Every good programmer should have a sense of what is the right “feel” for what they are creating. This can come from working closely with UX people on a project or observing the finished work of others. Dribbble.com and Behance.net are some good places to find good work in design and UX.
Learn to use Google
Google doesn’t have all the answers. However, it does have most. Every programming language API documentation can be found through Google, and you can find many examples of their use on stackoverflow.com. The key to using Google is knowing exactly what to search for. I usually find that the simple approach works best. For example – “Why is putImageData not working”. Search for the simplest way to express your problem. This will generally be how other people write about it and look for it. More than likely, you are not the only one who has experienced it. Once you get to a page that looks promising and may have your answer – follow the breadcrumbs. People may put links there with the solution to your problem. Keep digging deeper until you find it. If you can’t find your answer, repeat the search again for another phrase or go to another result from the original phrase. Usually you can get what you want in the top 10 results if the right search phrase is used.
On Happiness, Passion and Love
One of the keys to happiness is to find something that you are deeply passionate about. If you are deeply passionate about something, you will be intrinsically motivated to get better at it. No amount of money would make you stop doing it. The interesting part is that you will be so good at it just out of love for it, that money will come to you because of your expertise. Your passion and expertise will breed creativity and innovation in what you are doing. Many people flounder around without a passion. I was one of them. These people are just as intelligent and capable as people who have found their passion. Either they have not been motivated enough by anything to be good at it, or they have chosen not to explore their passions for extrinsic reasons. Doing something just for the money and doing it for love yields two very different levels of success. Once you find that thing(hopefully it’s programming 🙂 ), you will not need the lure of money, prestige, or any other extrinsic factors to keep getting better. Doing it just makes you feel good. If you are not passionate about software engineering, and you are just doing it to pay the bills, for job security, or because your parents pressured you into it, chances are you will never become an expert or be happy in what you are doing. The same goes for any field.
This is definitely not an exhaustive list of ideas and practices required to be an expert programmer, but they definitely help the cause. Heres a tentative list of topic headings that I will write about in the future:
Create rules and constraints to get things done.
Build a mental model to hang things off of .
Realize that all the information is there, its just a matter of finding it
Work on building mental pictures
Design Patterns, Algorithms, and Data structures
The idea Generation Trap
The expertise of others
Learn by recursion
Don’t be afraid to fail
Work on one component at a time
If there are any questions , you notice any typos or grammatical errors, disagree or agree with me, please leave a comment :).
Reading Material that influenced this article:
Seminal works in software engineering that every good programmer should read
http://www.amazon.com/Design-Patterns-Elements-Object-Oriented-ebook/dp/B000SEIBB8 (Also known as the “gang of four” book)
Great philosophy and insight into the world of startups:
When working on an indie commercial app theres so much to consider. Marketing strategy, user interface, app functionality, user context including when , where and how the user will use the app, graphical assets, quality assurance, what’s going to be in version 2.0, market research, competition, and the list goes on. As an independent developer it’s not good enough to just know a programming language. You have to wear many, many hats including that of entrepreneur, businessman and salesperson.
How meditation can help you program better.
Programming is very much about flow, focus and keeping a context in your head. Your context includes what you are currently working on – the location of code, the location of files, the structure of code, any programs that you have open and their contexts, and so on. It’s a lot for the human brain to manage. Programmers’ livelihoods depend on the ability to focus and keep a coherent context in their head. Context is like a blueprint for what is currently on the screen and in the programmer’s mind regarding the state of the programming environment and past or future actions that act on that environment.
When a thought pops into your mental context, you can choose whether or not to let that thought permeate your mind and interrupt your flow, destroying your fragile programming context – which in theory is just a configuration of neurons firing in sync. Lets say your random thought is about a television show- your brain could go on a tangent thinking about that television show. Maybe you’d think about a character on the show, or a certain scene or joke. When you resume programming again, depending on your level of focus and strength of context(how fast or powerful those neurons were firing) your context will be some degree weaker. Note this can all happen in a matter of milliseconds. It’s possible to take slightly longer to remember where certain code or files are in relation to your project after the context switch. It’s even possible forget what you were working on completely. Has this ever happend to you after an interruption? Studies freely accessible on the internet have shown that it can take up to 1 hour to rebuild your context and get back into the mental state of ‘flow’.
Meditation teaches you how to block out unnecessary thoughts. You can just will them away, preserving your fragile context. After practicing meditation for a few days, you may start seeing that it’s easier to preserve and strengthen your context in spite of internal and external distractions(people, music, noise outside).