mr. r. s. braythwayt,

JavaScript Allongé
JavaScript Allongé

What I've Learned From Failure
What I've Learned From Failure

Creative Commons License Tweet Follow @raganwald

My Advice for a Programming Beginner

I found this question on Reddit:

Hey Guys,

I came across this video series today on YouTube which talked about modular JavaScript, using different OO techniques in JavaScript to create applications.

As a beginner Angular.js and Node.js developer, I already find it quite hard to memorise all the tool-specific, and often even language-specific constructs such as string methods and directives among other things.

As I learn more, I find myself being overwhelmed by the vastness of the language and all the methods and design patterns one must know to be considered proficient.

I know that ‘Google’ is a programmer’s best friend, but I feel that it severely hinders my productivity. Simply copying and pasting the same piece of code every time I need to use (even though I largely understand what it does), i feel like I still don’t ‘know’ JavaScript, even though I’ve been coding in it daily for more than 6 months and am building a rather large app for an established organisation.

Where would one draw the line between memorizing the language/tools and looking them up?

I see this sentiment all the time. A lot of people are working in the field (be it JavaScript or any other programming community), and do not have a mentor, and feel like they do not have competency. So clearly, this concern is something a lot of people share, and finding a good way forward is important for the community as a whole.

What strikes me about many such questions is that people say they are a “beginner,” but go on to describe professional problems. For example, “I am a JS beginner, and I’m having trouble deciding whether to use Gulp, Grunt, Broccoli, or Webpack on this project at work.”

This question above is a good example of that: The author is building a rather large app for an established organization, they are clearly a professional. But they describe issues with understanding JavaScript as well as issues being competent within the profession.

The word “beginner” is a little ambiguous. There are students, and there are inexperienced professionals. A student applies themselves to a field of study, whereas a professional applies a field of study to solving problems.

The needs of a student are to progress towards mastery. The needs of a professional are to be competent and to manage risk. Sometimes, both needs can be satisfied with the same advice. Sometimes, they are in tension.

If you attempt to learn-on-the-job, you are going to hobble your mastery. This is true of almost any job. One of the most important ways to learn something it to experiment with it. You cannot treat a professional project–where people’s livelihoods are on the line–as a playground for experimentation and learning. That goes against managing risk.

In our industry, we typically handle this dichotomy by first being students, where we focus on learning and aren’t as worried about the practicality, then we focus on gaining experience. Some university programs have coöp programs, where the students alternate between being students and being apprentices. But not at the same time! They understand that if you try to learn basic programming from a profesional project, both will suffer.

Buses for the Ted Haggard-founded New Life Church in Colorado Springs, Colorado

driving the bus

If you constantly learn just what you need to do the job, and only work within the pragmatic confines of the practices that seem productive and are low risk, you will make progress, but at the expense of understanding. This is like learning to drive a bus, but being ignorant of how engines, drive trains and traffic flow work.

Which is not a bad thing, provided you have little interest in anything except driving the bus. For example, if you are a pastor in a church, you apply your enthusiasm to your church. The church bus is just a tool for doing church things, and you are not that interested in whether the engine can be tuned to get better mileage.

Whereas, if you wake up and decide that you are in the bus business, driving a flock to a church outing is just the way you pay for the bus. you are extremely interested in gas mileage, not just as a cost saving, but because you are interested in buses and how they can be made better.

A lot of the things a “bus person” learns about buses don’t apply to the church. It rarely makes sense for a church person to spend a lot of time thinking about buses. But the bus person learns things that apply to a lot of different people who need to be moved from one place to another.

study study

back to the question at hand

So back to the question, and to everyone asking a similar question. My advice is to decide whether you are a student who happens to work for a living, or an inexperienced professional who needs to learn. If you are a student who happens to have a job, I recommend that you consciously apply yourself to studying JavaScript outside of whatever needs to be done at work. You need the freedom to do things like play with libraries and frameworks that might not become the #1 or #2 way of doing things.

Whereas, if you are an inexperienced professional who needs to learn, then focus your efforts on reading the way the wind is blowing: Your job, more-or-less, is to figure out what everyone seems to be doing, and copy it. That minimizes risk, while giving you experience.

It sounds prosaic, but if you are inexperienced, that is perfectly normal. It’s a question of picking up the basics, of being able to ask a question and get lots of answers because you’re asking about something everyone is familiar with. Once you have more experience, you can explore a little outside of the mainstream, you will have the context to understand when a problem you’re solving has a unique requirement that is served by a unique approach.

So… the summary is, Decide whether you are a student, or inexperienced. If you’e a student, study on the side. If you’re inexperienced, choose a low-risk way to gain experience.