POOR, POOR CHILD. YOU HAVE NO IDEA.

The letter I wish I could write to my former self, and have beamed at light-speed through some kind of vacuum tube and delivered at the precise moment when I finally decided to learn to program.

Programming is hard. It's harder than you think. Right now you're probably underestimating the amount of frustration and discomfort you're about to experience, without realizing that by doing so you're creating all sorts of subtle barriers to obtaining a deep understanding of programming. The problem is that while you've uncovered a wonderful world that makes coding seem so approachable and fun, you're unknowingly making a giant leap by thinking it's somehow also easy. This might not seem like a big deal, but it's huge. Every single time (and this will happen constantly) you come across a concept that seems foreign or difficult or even just unintuitive, instead of thinking "It's OK. Programming is hard." you're going to be thinking "This is supposed to be easy. What's wrong with me? I must be stupid." These feelings will keep you from seeking help or pushing through to discover why things work the way they do, and that is what's stupid. Programming is not always intuitive, it's inherently complex, and it's challenging. Once you start feeling like you've gotten a handle on it, you'll learn something new that will make things seem even more complex for a while. Your level of stupidity is certainly up for debate, but not being able to program without long hours of steady practice is not an indicator of intelligence one way or the other. The discomfort is normal, so get over the self-consciousness now and fight it whenever it appears in the future.

Language does matter. You're lucky to have stumbled across a very good first language, but you're likely to encounter developers who will tell you that this decision doesn't matter. These people are wrong, plain and simple. Your first programming language provides you with a base vocabulary through which you begin to understand all other computer programs. As a linguistics major, you're no stranger to the idea that a person is only capable of having thoughts and ideas that can be expressed in their language, and there is no reason to expect programming languages to differ from spoken languages in this area. It is absolutely crucial to pick a first language with a deep, expressive vocabulary for this reason, and all programming languages are not created equal. Furthermore, the first language you become comfortable with will influence the way you learn other languages in the future. You'll notice that programming books will often say things like "this might be strange if you're coming from Java or C++". This is for the obvious reason that people learn new ideas and concepts by relating them to other ideas and concepts they are already familiar with. Picking a first language that doesn't smoothly transition into your second or third will cause you unnecessary headaches. Finally, since you currently don't know a whole lot about the vocabularies and intricacies of different programming languages, see if you can feel out a language's community. I'm sure I don't need to elaborate on why picking a language with a vibrant community of helpful and intelligent people who share code, have regular local meetings, and seem up-to-date on emerging technologies will have a positive impact on your learning as opposed to the alternative. Here again, all programming languages are not created equal.

Programming is the best way to learn programming. You'll be surprised how much you'll eventually rely on memorization. You'll slowly learn to keep as much information about your program in your head as possible at any given time, allowing you to more fluidly move through your code and express yourself to the computer efficiently. But to achieve this, you can't always be thinking of all the minute details of what you're doing. Much of it has to happen on a subconscious level. You'll regularly need to look things up, of course, but the more you can do from memory, the more you'll be able to get into a productive flow. My point is that no amount of reading or talking about programming will help you here. The only solution is to spend many hours actually writing code. So do as much code writing as you possibly can, and while there certainly are lessons to be learned from programmery discussions, realize that they're usually little more than a distraction from your real learning.

It's OK to suck at math; you won't be using much anyway. I'm not sure how this stereotype got instilled in me, but I'm slightly embarrassed to admit that I was surprised to discover how little math is involved in day-to-day programming, especially for a web developer. A command of the written word is far more important. Intelligent, clearly-articulated prose is probably the most significant goal for both writers and programmers alike. The math I do regularly is much more similar to the logic truth table exercises I learned in ninth grade than the complex algorithms you hear mentioned so frequently by programmers. Knowing whether an evaluation is true, false, or nil and how my programming language specifically treats each state is the extent of the "math" I do regularly. Occasionally I've had to calculate discounts or sales tax, but that's less mathematical than managing a cash register at a restaurant. Besides, computers are way better at math than you are anyway. By learning to program, you'll learn to let them handle it for you.

Don't be too hard on yourself, but don't be too easy either. You're about to start a very exciting but stressful period trying to make sense of computers and learning how to build new stuff with them. Many people will tell you to take it nice and slow and not overdo it, and while that's certainly true, pushing yourself hard will be worth it. You'll have many of your biggest breakthroughs at 4 AM after hours of late-night coding, many more still will come from getting in over your head by taking on projects you have no idea how to build and figuring it out by necessity. After a year of intense, focused practice, you might have missed out on some good nights with friends and some sleep, but you'll also have learned enough to begin creating the stuff you've always wanted. Take your learning seriously. Explicitly plan time for it. Remember you're probably not stupid and learning something difficult takes many hours of study. And yes, you probably should get out a little more often. Reward yourself for an accomplishment, no matter how small it seems. Every squashed bug, every discovery of a single-line solution built in to your framework, and every other time you learn a new trick or technique is just another ounce of proof that your understanding is becoming deeper and that you're improving. That's worth a moment of proud reflection. And finally...

You'll never have finished learning programming, so learn to enjoy learning.