Balance

After watching Star Wars: The Last Jedi two times this past weekend, I am thinking a lot about the underlying themes of the Star Wars universe. One of those is balance. It seems like an appropriate discussion topic in so many ways.

  • Our diet needs a balance between different types of foods with different nutritional values
  • Our bodies need a balance between heavy activity and rest
  • Our minds need to be engaged and stressed at times, but relaxed at other times
  • Our relationships are usually a mix of different types of relationships which serve different purposes in our lives

When we are out of balance (regardless of which way out of balance), there are typically negative consequences. For example, if I am stressed about work unable to focus at home, then my loved ones may become stressed about my stress…which perhaps even cycles back to me and creates even more stress.

So, the key is finding ways to achieve and maintain balance. This is hard. Really hard. But, as hard as it is to do ourselves, it is even harder to help others achieve balance. Here are a few things I have been thinking about that you can use yourself or you can use to help those around you:

  • Bring it back to basics. What are were trying to achieve here? What are your goals in life? Forget about all the specific things going on right now and let’s think about the long term.
  • Look outside yourself. Forget about your own personal feelings, thoughts and desires. What do my closest friends and family think? How are my actions affecting them?
  • What, when and how are you getting out of balance? Stop being reactionary to the events in your life and proactively control those things that adversely impact your ability to achieve balance.

 

 

Stress

We all experience stress to some degree. Sometimes stress can be good (i.e. short term stress that propels you to accomplish a goal such as a deadline, a test, giving a speech, etc.). I personally like this type of stress and thrive off of it. Working at a startup, good stress is par for the course.

Unfortunately there is also bad stress which often occurs when you feel helpless, trapped and/or have lost control. When we experience this type of stress, it can be damaging to ourselves and the people around us. However, there are way to mitigate and manage bad stress such that you avoid it in many cases or are at the very least able to quickly get past it. The specifics end up being different for different people, but the one thing I have noticed is that in most cases the key is knowing yourself.

One simple thing you can do is identify different situations that create a lot of stress in your life and simply avoid them. Sometimes this is difficult to do (ex. source of stress is family member), but other times it can be quite easy (ex. source of stress is Twitter). Try taking out a piece of paper and just write down a list of ten things that cause you stress. If you can avoid anything on your list without any negative repercussions, do it.

Of course, it is likely that a lot of the stuff on your list can’t be avoided for one reason or another. In that case, it comes down to setting up tripwires for yourself and having a few coping mechanisms. Some examples of tripwires may include things like:

  • Your sleep pattern drastically changes
  • You lose/gain weight
  • You lash out at a loved one

The more you can be self aware of what you naturally do when you are stressed, the easier it will be to do something about it. In terms of coping mechanisms, each person is going to be different but one really strong suggestion I have is to extract yourself from the situation and sleep. Now, in full disclosure, I will admit that I am absolutely terrible about this. I know how much sleep helps alleviate stress and reset your brain, but I continue to have a hard time doing it on a regular basis. Typically my wife is the one who hits my upside the head and forces me to rest. That said, once I actually get 8 hours of sleep (which is very rare for me these days) it is like magic.

Inline CSS

As much as I have strong opinions about front end JavaScript development, I am totally lost when it comes to CSS. That is not to say I don’t understand CSS. I do. In fact, I have probably tried every CSS framework and technology under the sun.

LESS, Sass, JS-in-CSS, Flexbox, etc., etc.

At the end of the day, while I understand all of these and can use them, I don’t actually like any of them. I have always wanted something that looks and feels like JavaScript or (even better) is just part of the JavaScript language. You may think that naturally means one of the JS-in-CSS libraries, but…none of the current generation of libraries fulfills the promise (yet).

So, for now at least I file away pretty much all style related work as a hack. With that in mind, I want to share one hack that has been pretty useful for us at GetHuman. Namely, the use of generated inline CSS for increased initial load performance. The way it works is like this:

  1. At build time in a non-production environment, use Addy Osmani’s critical library to generate inline CSS for each route
  2. In production, have your server side page look to see if an inline CSS file exists for that template.
  3. If it does, stick the inline css directly into the server view and lazy load the rest of the CSS using loadCSS.
  4. If there is no inline CSS, then just have a CSS tag in the header for the main CSS file like you normally would.

By doing this, the page can render lightning fast without waiting for any CSS file at all to download. The main CSS file loads in the background.

SEO = Optimizing User Experience (and making sure google knows about it)

Since the dawn of the search engine universe, a never-ending army of determined webmasters have tried to hack search ranking. The problem, unfortunately, is that most of the time this army focuses too much on Google and not enough on the user. That is not to say you ignore Google and just assume everything will work out. Rather, the point is that the initial main focus should be on the user and then worry about Google. Here is a quick priority list that encapsulates the order in which I like to think through any SEO efforts:

  1. Why do users come to the site?┬áThis may be tough at first since Google doesn’t provide the original search term from the user anymore. You can, however, collect data from the user once they are on your site. It always amazes me how many people will answer small survey questions. Also related to this question is whether the users you want to come to the site match up with the ones that already are there today.
  2. Are the users that do come to the site happy? Of course it helps to get props on Twitter or whatever, but generally speaking if you have a funnel set up and someone gets all the way to the end of that funnel (i.e. they reach the goal) then that is probably a good indication that what you are offering is in some way fulfilling their needs. We use Amplitude tracking pretty heavily for this including a lot of A/B testing between different potential options.
  3. OK, now that we have the right users and they are happy, does Google see that they are happy? In the ideal case, you wouldn’t have to worry about this last question at all. Google would just know that your users are happy and your search ranking would naturally increase. Unfortunately, this is not how it normally happens. In many cases, website inadvertently block those positive signals from getting to Google. Perhaps a lot of the experience is behind the login wall (i.e. where Google has no visibility) or perhaps they user is happy with the results but not motivated to do anything about it (i.e. share on Twitter, Facebook, etc.).

Again, I can’t stress enough that jumping straight to #3 (which most people try to do) is not nearly as effective as going in this order. When you try to think about Google before your users then you inevitably start trying to “fake” user happiness…which…may work for you for a short period of time, but is not a long term winning strategy.

Creating a Habit

Creating a new habit is super hard. If you manage to do something consistently every day for at least two weeks however, they say that it is much more likely that thing will become a lasting habit. They trick is to just focus on making one habit at a time.

For the next 2 – 4 weeks, my one new thing is going to be writing.

I love to write. I really do. I actually had an old version of this blog on Ghost.org that I ended up deleting at one point. I currently write (on occasion) on my medium blog and I even wrote a chapter in a book at one point. The problem is that it takes me A LONG time to write. I am a super perfectionist and often end up completely re-writing any content at least 3 or 4 times. That approach is a major problem now that my time is so limited these days.

So, I have decided to write for 10 minutes every day on my resurrected personal blog. Little to no editing. No pre-planning. Just pick the top subject on my mind and write. My hope is that after doing this for a month or so it will become easier to get into the flow and I can potentially churn out the larger more involved posts more efficiently.

I am super excited about this. Thanks to my wonderful wife, Carolyn, for the idea.

Performance Experiments with United Airlines

For most of the past 5 years I have dedicated countless hours trying to figure out the best way to get the best of all worlds in web development. I wanted to have a super fast initial load time which is great for any landing page and at the same time, I wanted an awesome rich client interface for users to interact with.

The problem is that it is crazy hard to optimize for both.

So, I have done a complete 180. I am in the process of completely separating landing pages vs rich client pages on GetHuman.com. For example, check out the new United Airlines phone number page. As I was doing this, I figured out one cool thing.

If you go directly to the United Airlines phone number page it will now only load server side with no client JavaScript whatsoever. If, however, you navigate to that page from the home page (do a search for “United Airlines”) then you will see the client view.

In other words, there is a client view, but it is only used when needed. This approach has yielded the following benefits:

  • Crazy fist Time to First Byte (was 800ms, but now 150ms)
  • Crazy fast Time to Interactive (was 5.6 seconds, but now 1.1 second)
  • Crazy fast navigation load (I haven’t measured, but it is client loaded so a few ms)
  • Code for the landing page is 100 lines (including HTML template) instead of 1000
  • Rich functionality all pushed to a separate page
  • Makes it MUCH easier to AMPify the page…which we have done (check out the AMP United Airlines phone number page)

The one downside is that you do need to have the user go to a different page in order to do any rich interactions and you have some limitations on what types of things you put on this page…but, tbh, I think these limitations are actually really good. Most initial users don’t want/need all that rich functionality right off the bat. It feels good to click on something that then gets you into a richer experience.

Up next is implementing service worker on landing pages in order to prefetch the client side JavaScript that will be used on other pages if the user clicks on any links.