July 19th 2017
There’s been an interesting Reddit thread circling my corner of the internet for the last week or so. It started with a question:
I’m making the following assumptions about the question
Pre-existing means that these are things that somebody is expected to know before taking the job. Learning the details of a company’s technology stack, style guide and engineering philosophy are all important, but you shouldn’t be expected to know them in advance, and in many cases doing so is impossible.
Specific knowledge means that these are things that you can learn with some effort and study. They should not be broad categories like “security”, “design”, or “server-side development”. They should be things you know or know how to do, not things you “have experience with”. And they should be specific enough that somebody can feel comfortable saying they understand the topic or don’t. Most of the things I list below are topics, but I try to lay out a specific set of things that you would need to know to understand it.
The most difference between success and failure means that these are the things that are really going to make a difference in how effective you are at understanding and completing the work assigned to you. There are many such things, and their importance will vary situationally, so this is just my educated take on a generalists list.
1. You should know the core language
2. You should understand async code
3. You should get comfortable with at least one set of developer tools
5. You should be comfortable with basic design tasks
When I talk design, I mean both the basics of implementing a visual design with HTML and CSS3, and enough of an understanding of design basics to create a simple UI that looks ok and isn’t confusing. That last requirement is harder than you’d think. Design is hard and mostly orthogonal to the set of skills most folks pick up while learning to code. For learning design theory, I’d recommend finding a simple resource on visual design first like White Space is Not Your Enemy, and ideally supplementing that with a more UX focused resource like Don’t Make Me Think. The practical side of HTML/CSS is easiest to pick up with experience. If you’re using devtools you can see what other people are doing with CSS and tweak and explore using the elements panel. And there are lots of good online resources for learning about CSS and HTML syntax like MDN for API info or CSS-Tricks for ideas, tutorials and keeping up with new stuff.
6. You should have a basic understanding of networking and HTTP-based APIs
7. You should be comfortable with Node.js based tooling
8. You should know how to use a framework to structure a moderately sized program
This is probably the most controversial item on this list, since I know a lot of folks believe it’s better to learn architecture ideas outside the constraints of a framework. My stance here is that frameworks are practical: they’re most likely to translate to an actual employment background and it’s easy to find practical explanations of how they solve architecture problems.
Like design, performance is a deep well of things you can learn. But knowing the basics is important and can go a long ways. For performance “the basics” is more about process than knowledge. You need to learn how to debug slow processes and understand where the problems are coming from. For browser environments in particular there are some baseline things to understand. You’ll want to be able to tell the difference between code that is running slowly due to parsing slowness, runtime slowness, and network latency. It’s important to learn how to keep a UI responsive and not block rendering with other calculations. And it’s great to understand how to cache data and avoid making too many requests to the server.
This is also an area where learning more about Computer Science theory can be beneficial. Studying data structures and algorithms can help give you good intuitions on how to handle data, and learning about Big O notation gives you a language for discussing performance tradeoffs. This is the type of background knowledge that pays off in occasional subtle ways though, not something that is always obvious applicable in the moment.
10. You should have a process for learning new things
You also need to get comfortable finding information about specific technologies, either to learn to use them or troubleshoot problems. These resources will likely be more varied, but it’s important to learn to Google well, and also helpful to get familiar with Stack Overflow or some other resource for getting help when you have specific questions or problems.
Do you have a different list? Feel free to post it and then link in the comments!
If you don’t learn all the pitfalls here, at least learn that there are pitfalls.↩
Disclosure: Some of these book links are affiliate links↩
Or SASS/LESS/CSS in JS/whatever↩
This can be explained at several levels, but its good to at least know that a request is sent from the users computer to a server somewhere, and that server returns resources like HTML, CSS, JS, and image files.↩