A letter

I recently received an email from my friend Sam…

Hey Eric and cc’d Clay,

My search for the next step in my career has recently led me into researching code schools, and I was wondering if I could ping you for some advice. Currently I’m looking at a few different programs in Texas and in New York, for full-stack web development, either with Ruby on Rails or Javascript, Node.js, etc . I have no real preference, but things seem to be on the upswing for Javascript, so I’m leaning in that direction.

The schools all seem to be less than 2 years old, but they all have excellent (95%+) placement rates after completion of their courses, and, if the employers who hire the graduates are a metric to go by, the schools actually do a good job of preparing students for a job as an junior developer.

I’m curious, as someone who is a developer, if you could answer some questions for me.

First, what was it like for you when you first started out? What are some things you did that you think helped you a lot (projects, things to learn, habits, etc.)? What are some things you wish you had done, or things you wish you had done differently?

Am on I the right track? Is JavaScript, Node.js, Express.js, MongoDB and Angular.js a good way to go?

As someone who has worked in teams (I think) and also freelanced and now works at an agency, whats it like to be working more on your own as opposed to with other developers? Do you have a preference?

Is development something that still excites you now, even after you’ve been out in the professional world for a while?

What’s your day to day like?

Working as a developer executing the creative ideas of others, how do you manage interacting with non-technical managers, their vision, and your execution of their vision?

And anything else you’d like to add!

Take your time to respond, or, if you don’t have the time, that’s cool too.

Thanks either way,

Sam

There are so many good questions in there and I will attempt to answer them all with my own perspective as a reformed hack.

Should I be a developer?

First off, there is the question of whether or not someone should go into the peculiar, sometimes rewarding, and often frustrating field of software development. Programming computers for hours on end requires a mindset that embraces problem solving and logical reasoning. Contrary to popular belief, learning how to write a few lines of HTML and Javascript isn’t really that difficult, it’s just the willingness to push forward and the desire to gain a deeper understanding that eludes most people. Fortunately, there’s never been a better time to discover for yourself whether or not you enjoy programming…just try out any of the free online introductions and then maybe head over to one of the front-end sandbox platforms like jsfiddle or codepen for some freeform experimentation.

As for full-on web dev schools I don’t have any experience there, but I hear a lot of them are great for getting you up to speed quickly and placed in jobs. And honestly, going to any of those schools and working along with other students who are struggling with the same material will make a world of difference. I went the “traditional” route of studying Comp Sci in college at UNC and while those classes certainly helped me in a broad sense, they were much more focused on math and theory than what I deal with on a day-to-day basis as a web developer. Those types of skills can come in handy if you’re looking to grad school or being a teacher yourself, but the average web dev can get by just fine without them.

I'm in, how do I get started

If you do end up going to one of those schools they will of course have a whole curriculum laid out that would be much more comprehensive than what I can cover in a measly blog post. But some rules of thumb that I’ve come up with over the years may help navigate through that curriculum

Alright, so let’s say you decide to dive in with one of those schools. They will of course have a curriculum that will put you well on your way to getting a job as a developer. Whether or not you enjoy that job and grow your skills is largely up to you though. A few tips that may help you in that pursuit:

  1. ABC: Always Be Cogitating The pace of change of software is crazy. It’s like no other field of study. If you go to school for architecture or nursing or zebra husbandry you learn all there is to know, maybe take a few continuing learning courses once or twice a year and you’re good. Software changes by the day. Sam’s email mentions a bunch of hot technologies (mongodb, express, node, angular, etc) and there are literally millions of other libraries, plugins, frameworks, and platforms out there that are all changing as fast as their engineers’ little fingers can type. Utter any funny noun and chances are that you’re also naming a javascript library. Create your own and you might need help coming up with a unique name. The point being that it’s not enough to learn it all up front and then stroll off to the horizon of your career. Rather, you always have to be learning and keeping up with new technologies.
  2. Identify Your Weaknesses Starting out you’ll be weak at just about everything, but as you advance in your career, it’s important to round out your skills. My first few jobs out of school were consulting gigs that often meant fixing or augmenting existing software. In this capacity I got really good at debugging and finding my way around different systems, but I didn’t realize that I wasn’t very good at starting a project from scratch, thinking through the steps to make it happen, and then executing. When I joined Redwood I very quickly caught up to this reality and it was a painful process of backfilling my experience for a few months.
  3. Seek Motivation One thing I’ve always struggled with is finding motivation to keep learning new stuff. It’s hard to sit down with a thick programming book and just ingest knowledge. It’s much easier if you have a project in mind and slowly chip away at it while you learn up on the new language or technology. That’s kind of what I’m doing with the Over Under Game which will eventually be a working app, but for now is just a sandbox for me to try out new ideas and concepts I’m learning in Ruby on Rails.

The "Right" Technologies

The aforementioned JavaScript, Node.js, Express.js, MongoDB and Angular.js are all popular tools utilized by web developers these days and a good developer will likely know at least a bit about all of them. We’re talking about a “full stack” web developer so let’s quickly define what exactly we mean by “full stack”. Instead of specializing in front-end (presentation, UI, UX), middle tier (controls flow of information, security, etc between the user and the backend), database, or dev ops (code deployment, source control, virtualization, server administration), the full stack developer knows enough about each of these layers that he can take an idea from planning to execution to delivery by himself. Initially, it’s probably good to focus on one or two technologies for each of these different pieces of the puzzle. One possible (and popular) recipe of technologies would be:

  • Front End: HTML, CSS, Javascript (required); Jquery and AngularJS (nice-to-have)
  • Middle Tier: Ruby (language) and Rails (framework)
  • Database: MySQL (old-school, popular); MongoDB (new shit)
  • Source Control: Git
  • Dev Ops: AWS (Amazon Web Services)

Other than HTML, CSS, and Javascript there are lots of options for the other technologies and languages. Jquery and AngularJS are both tools written in Javascript that just extend the functionality of the language and make common things easier to do. Instead of using Ruby for the middle tier you could choose another interpreted language like PHP or Python or even switch over to Microsoft land (my former life) and use .NET technologies like ASP. Similarly for the database you can choose a classic SQL variant like MySQL or PostgreSQL or you can go with a schmancy NoSQL solution like MongoDB.

Teams > Individual (Most of the time)

Starting out learning programming is hard and as I mentioned above it’s super helpful to share that struggle with someone else and learn together. In the job world, working in teams is both fun and a great way to continue learning from other people. The trade-off is that you’re more likely to specialize on a particular technology and/or knowledge domain and there’s probably more red tape in the way of getting stuff done. In a company of any size there are likely to be tons of meetings and at all but the best places those meetings are stifling and boring and a waste of time. That is the one thing that a working programmer needs lots of – huge swaths of uninterrupted time. As a freelancer I get all of that I want, at the cost of camaraderie and fewer options for bouncing ideas around with others. Like most things there are tradeoffs, and there’s a certain amount of trial and error involved in trying to figure out what works best for you.

In short, programming isn’t for everyone, it’s hard, it’s rewarding, and it can be fun. Godspeed.