Launching Hello, Web Dev – a weekly newsletter for web developers

Tomorrow I’m launching the first issue of Hello, Web Dev, a weekly newsletter on web development. Each week, I’ll deliver a concise set of articles and projects that I’ve found interesting over the last week.

Interested? Sign up here. Here’s tomorrow’s, so you can get a sense of how it works.

Hello, Web Dev


Airbnb’s excellent engineering team has a great writeup of jscodeshift, a tool for rewriting large portions of JavaScript with new code rules. If you’re working on a large JavaScript project that seems past the point of code standards, check out this post, and jscodeshift.

The average web page is now the size of the 1993 game, Doom. Web performance is important–in the post, Ronan Cremin suggests that while this trend is concerning, 2016 could be the best year for web optimization and performance so far.

Open source tools:

HEAD is an exhaustive list of elements that appear in the HTML head section. If you’ve ever needed to look up a meta tag for Facebook or Twitter cards, this is the kind of resource you wish would’ve existed then. The perfect kind of lightweight project that should exist on GitHub.

Ignite is a really awesome React Native blueprint/generator. I’ve used it personally – it’s a smart approach to some usual React problems (redux-saga over redux-thunk, an API client over manual fetch in actions), and Infinite Red is using it on a ton of client projects, so they’re constantly updating it. If you’re looking to try out React Native, it’s a great resource.

Hello, Web Dev is free (always!) and is bi-directional, by design. If you have a suggestion for something to include in the list, or have more questions about something in the newsletter, simply reply to the email.

Still haven’t signed up? Visit the signup form.

The best is the worst

I was baptized into the cult of programmer “tooling” around day one. It was simple–which text editor should I use? The answer is… complicated.

There are two high-level categories of programming tools: software and hardware. Software, like Vim, Emacs, and Git, are often free (and open source). People have strong opinions about software because they can often just install them and try them. 

I know I like Git because I’ve used it in projects over the span of many years. It’s been hugely helpful. I would have had less opportunity to use and recommend Git if it had a $1,000 a year license.

Here’s the flipside of that scenario: because a lot of these tools are free, we also have the luxury of ignoring opinions, and just trying things ourselves. If someone hates Git, it might just be that it doesn’t work for them, or their method of working. It might still work for you.

Hardware is, pardon the pun, harder. It exists in the world as an actual thing. It has a cost attached to it. This makes it difficult to test. We have proxies–reviewers, who have actually used the product. I might not be able to go out and buy a $2,500 laptop for another six months, so I have to find a technology site that has reviewed it (objectively, we would hope) and determine whether it’s worth my money.

This is why hardware is a hard value proposition. Here’s a statement that I know is true for me – it may not be for you, and that’s okay. Ready? Expensive seems better. 

(I know, it sounds terrible, but bear with me! I’m having a sea change here.)

Would I pick a $2,500 MacBook Pro, or a $500 Chromebook? Hello, Apple.

Would I pick a $100,000 Tesla, or a $20,000 Honda? Hello, Elon. 

Would I pick a $400 ergonomic, mechanical keyboard, or a $40 Logitech keyboard made of mostly plastic? Well…

I’m trying to be better about this, and the above example is a real-life example of that. Here’s my recent revised version of that statement, the mantra that I have to keep repeating to myself: 

Disposable is better.


If I can build products with the Chromebook, isn’t it better to have something I have almost no attachment to? If I’m sitting at a coffeeshop and someone runs by and grabs the laptop, will I feel worse knowing that I just lost $2,500, or just $500?

I’m trying this with any new purchase nowadays. My custom-built ErgoDox keyboard that has a custom split-hand layout? Honestly? It works like 60% of the time, and I paid $400 for it. The Logitech keyboard I’m typing this on was $40. I can break this keyboard ten times and it won’t hurt as bad as the ErgoDox. 

Attachment is hard, and a lot of the time, it’s a distraction. This year I’m trying really hard to stop focusing on useless things like what phone or laptop I have, and start getting down to building stuff. Join me?

I made it!

I mentioned a couple months ago that my girlfriend and I were going to move to Los Angeles! We finally made it here. After a beautiful drive down I-5 over the course of a weekend, this marks the end of my first work week in LA. I’m excited to be in the city and start exploring a bit. It’s going to be a really incredible year–I’ve been heads-down on a few things over the last couple months, and I’m excited to come up for air soon with a couple of them.

We don’t have time for assholes

José Valim, one of the leads at Plataformatec and creator of the Elixir programming language, has left Twitter:

Around the same time, this Gist (URL, not embed, because the comments are the relevant part to this post) caught my attention, which seems to be directly related to José’s departure.

The comments are a frustrating read. It’s not worth giving trolls the attention they want, so I’ll speak without mentioning anyone in particular…

We don’t have time for assholes. Elixir is a cool language, and the Phoenix web framework does a lot of things really well. Like any software project, it’s not perfect, and neither are the maintainers. If something doesn’t work like you want it to in open source, show us the code.

As soon as you begin ad hominem critiques on the person, instead of the project, you lose credibility. So when you write things like this:

Yes, there’s a maturity problem in the Elixir community. But it’s not just a matter of the inexperience of its technology. it’s also a matter of character of its leaders. And in the time that it takes a human being to develop indefatigable and steadfast character, a software platform with great potential can easily be laid waste with the personality cult sideshow that completely distract from quality and sensible design decisions.

It comes across as petty – why aren’t the people that run this project perfect, virtuous humans? Well, because none of us are. What a silly requirement to use a software project.

We really don’t have time for assholes. Find people who, even if they are responsible for challenging conversations, produce a net positive in your day-to-day.

New things

I like new, shiny things. Recently, I’ve been trying to push back on my tendency to want to get new gadgets and the best in any category of tech.

I have a Roku (3… maybe?) and it works really well. It has an app for every streaming service I use online, and the streaming itself is really fast and consistent.

But this morning, I found myself looking at the new Apple TV online and almost putting it in a cart to checkout – it was on sale for $40 off, it’s a necessity, I told myself – before deciding to close the tab and scold myself a bit.

There’s a lot of “grass is always greener” conditioning in tech: it’s part of the narrative in almost every marketing campaign. You could do X before, but now you can do X and Y.

In the Apple TV case – I could stream everything I wanted on my Roku, but now, with the Apple TV, I can also play games! Did I ever really want to play games on my Roku though? I have a Playstation that I use for two to three games a year.

It’s a hard lesson to unlearn, but I’m trying to be aware that every distraction like this is a missed opportunity for my brain to be working on a more interesting problem. I could be sitting in bed unwinding and watching a show I really like, but instead, I’m focused on the meta problem of “is the thing I’m using to watch this show really the right tool?”

Nice resource for picking up data structures and algorithms again

I’m rusty on my algorithms and data structures – there’s a ton of resources out there for learning in a very academic, CS degree-style method, but I like approaches that combine teaching with actual writing of code.

I just finished Robert Horvick’s Pluralsight course “Algorithms and Data Structures – Part 1”, which covers linked lists, stacks, queues, binary trees, and hash tables (in that order). It was a great course. Even though I don’t write .NET, I found the code to be super easy to understand. Robert did a great job of explaining trade-offs and reasons why we could pick, say, an array over a linked list in designing a stack or queue. I probably should’ve been taking notes during the course, but I found that even listening and watching the code was enough to jolt my memory for a lot of the structures.

I’d recommend it to anyone looking for those instruction on those topics who have a hard time getting through textbooks (like me). Here’s a fairly unsustainable offer: if you’re a reader of this blog and you’d like to give it a shot, I have a substantial number of Pluralsight trial invitations I can give out. Reach out via the comments or the contact page if you’re interested.

Disclosure: I am a Pluralsight author – suggesting this course to you doesn’t give me any royalties or payment in any way, however. I just happen to also be a fairly active Pluralsight subscriber!

Getting started with org-mode

I’ve been interested in org-mode, the multi-purpose notes/task/planner tool that comes with most Emacs distributions, for a while. Today I decided to dive in a bit and write up my first .org file, which now contains most of my current todos spread across home, work, and other miscellaneous projects. At some point I should migrate to a file per “section”, but for now, the folding functionality serves my needs perfectly.

Here’s a tl;dr!

Sections are organized with asterisks, and siblings/children are indicated by the number of asterisks, like so:

* Section one
** Subsection one of section one
* Section two
** Subsection one of section two
*** Subsection one of subsection one of section two (this is bananas)
* Section three

TODOs are indicated by the presence of, well, TODO at the beginning of an item:

* TODO Take the garbage can out to the street

You can mark a todo as “complete” with C-c C-t (control-c then control-t) – there’s a couple other statuses a todo can be in (“Waiting”, “Scheduled”), but a day in, I haven’t played with them much.

Here’s the two best resources I’ve found on org-mode:

  • David O’Toole’s Org tutorial is probably the best introduction to org-mode – I learned most of what I needed the first day from this.
  • Bernt Hansen’s writeup, while a bit complex for your first couple minutes in org-mode, is a good description of how a day-to-day, full-time use of the tool might look.
  • The manual for everything else. Not a fun answer, but the best one. Keyboard shortcuts and all!

It’s February?

Time can really slip by if you aren’t careful. It’s been a while since I updated the blog, so here’s what I’ve been up to as of late:

  • Photos! I’ve really been getting serious about posting on Instagram with my new camera. Lots of interesting shots there, check it out.
  • Videos! I uploaded my first vlog today – check out my YouTube page.
  • Moving! I’m moving to Los Angeles in the next couple months. Still some things to sort out up here in Washington, but the plan is to be there by the summer.

My strategy for 2016 was to make so many things that I didn’t have time to reflect on whether I was doing 2016 correctly. It seems to be going well so far.

Bye 2015

I am really bad at taking vacations – the last time I tried to take a couple days off, I ended up writing most of a short programming book (which I put out at the end of last month) and getting started with my author/publisher relationship with Pluralsight. So instead of relaxing at all, I took on two more projects.

The last two weeks were quite different. No work, lots of books, and a flight to Los Angeles four days ago. My girlfriend and I spent New Year’s there, which marks (as far as I can remember) the first time I’ve spent New Year’s “on vacation”. Los Angeles is truly one-of-a-kind: it felt like we were immediately welcomed the minute we step foot out of our plane. We spent a day on the beach, nights in clubs, and a ton of time with some of our greatest friends. I feel like Los Angeles is my second home, after only a short time there. I’m excited to go back as soon as possible; it feels like so many incredible things are going on all the time that the entire city is basically its own living thing. It’s incredible to plug into, even for just a bit.

This year was spent working really hard – it’s been a lot of headaches and stress, but the eventual goal was to free myself up to do more interesting things this year. I’ve spent time building complex systems at Simple, teaching at Pluralsight, and experiments on smaller content on Kindle and YouTube. I think that people underestimate their ability to be flexible – it’s great to do one thing and do that really well, but what if you can do a couple things where you thought you only had room for one? What if the thing you’re doing isn’t the right thing? Why not “taste test” a couple things throughout the year?

We’re only a couple days into 2016 and instead of being home tonight like expected, I’ve ended up in Salt Lake City, with a flight home later this morning. I didn’t expect to be here, but as we landed, I realized that a thing like flight plans going completely haywire would have been handled a lot differently by my old self, say, eight months ago.

I spent a fair amount of time this year reading the Stoics – primarily Marcus Aurelius and Seneca – also Ryan Holiday’s great modern summation, “The Obstacle is the Way”. I don’t think I was aware of how well I had internalized their work until today: ending up in Utah is amusing and interesting, not stressful, not the end of the world. The obstacle is the way – the present is what matters, not the future. I was supposed to be home, but instead this turns out to be one of the more interesting January 3rds I have. How different would this day have been if I would’ve been afraid of anything and everything going wrong, like it did?

I’ve had the good fortune to work on a lot of interesting things over the last year. I still love programming, and I love the work I’ve done in new tools and paradigms I had no experience with in the past. Over the next year, I’m going to push myself harder to learn completely new things – for instance, the entire field of machine learning and neural networks has been out-of-reach without ever finishing calculus in school. This would have seemed insurmountable to me in the past. It’s now an interesting challenge. I’m also going to work on a couple smaller projects. My last side project was overly ambitious and was infinite in scope – now, I’m building things that start really small and are easily verifiable and testable. This decision was no doubt due to the introduction of Lean Startup and Scrum books over the last year.

This last year has been setup for 2016 to be great. More travel, more interesting work, more diversification. I have a lot of crazy plans and I’ve spent the last two weeks not working on them, but allowing myself to dream a bit bigger and how to get from this point in time to where I know I can be in 365 days.

I don’t believe in resolutions – I think ambitious goal-setting because of an arbitrary date change is just a way to procrastinate. Instead, I’m thinking of each project and goal that I have as part of a larger “sprint”, where the project is simply this year as a whole.

Move fast, break things, don’t look back. Those are my plans for this year. It’s going to be awesome. As always, you can find out what I’m working on (and keep me accountable) via my Now page.

Integrating Payments with Ruby on Rails

I’m really happy to announce that my first course with Pluralsight, Integrating Payments with Ruby on Rails, is now live.

The course is a three-hour long dive into integrating the Stripe API into a Ruby on Rails 4.2 application. Specifically, we integrate the Subscription API by building a digital product subscription site. Tools used include Devise, Stripe.js, the Stripe Ruby gem, the dotenv gem, and Postgres.

If you’re interested in learning how to begin accepting credit cards in your Rails application, this course will be really helpful. It’s a summation of the work I’ve done in a couple Rails applications around this topic, and simplifying it to what you need to know to get started. The application provided as sample code is generic enough that it could pretty easily be adjusted to fit your needs, as well. The idea of sample code was an idea I hadn’t played much with before, but Pluralsight requires it, and now I see how it could be hugely beneficial to viewers.

I had a good time recording the course, and learned a lot about how best to create long-form teaching content like this. I made pretty much every recording mistake possible, especially around the right order to format the content in. Here’s my preferred workflow for recording courses/programming videos now: record audio first, run through the code along with the audio, then in a second take, record video while playing through the audio. This means that the audio is essentially mixed and edited in the timeline before any video is recorded – in my first coding session, I did video first, which made it really hard to match audio length and speed after the fact.