2017 Review

2017 Review

2017 was…a mixed bag. Some of the highlights included:

On the downside:

  • The primary business model for my startup failed and we were forced to pivot
  • As a result, we had to lay off a large portion of the team
  • Also not unrelated I unfortunately accumulated significant credit card debt for the first time in my life
  • Probably also not unrelated (but also just a byproduct of growing old), I had more health related issues than normal including my 3rd knee surgery

So, like I said. A mixed bag.

In addition to these specific highlights/lowlights there were also several intangible constants. I love my kids more than anything and it has been so amazing seeing them grow up throughout the year. More than anything else, I am just grateful that we are all (relatively) happy and healthy. Regardless of the stress I feel on a seemingly more regular basis these days, I thank God every day for everything. We are extremely lucky to be alive and truly blessed.

Echos From The Past

Echos From The Past

A friend of mine from SoCal randomly reached out yesterday by responding to an email I sent on my last day at Wells Fargo over 6 years ago. I wanted to post it here because it got me thinking a lot about how much things change and how much they stay the same:

“There’s always a way – if you’re committed.” – Tony Robbins
“I’ve failed over and over and over again in my life and that is why I succeed.” – Michael Jordan
“Always bear in mind that your own resolution to succeed is more important than any other” – Abraham Lincoln

It is very difficult for me to express the wide range of emotions I have on my last day onsite at Wells Fargo Dealer Services. As tried to pick out the names for this email of team members, IT partners, business partners and external vendors I have worked with over the past 7 years, each name brought up different memories of tough challenges, frustrating setbacks and exhilarating successes that we all shared together. Through it all…mergers, late-night deployments, sev issues, Holloweens, audits, security policy reviews, Christmas Parties, scrums, OPICs, all hands on deck, emergency fire drills, lunches, code reviews, strategy sessions, Leadership Conferences, project meetings, 8:30s, post-8:30s, 1pms, war rooms, interviews, goal planning sessions…I have been amazed by the relentless drive to succeed, resiliency from setbacks and determination to overcome obstacles so that we can achieve our goals. It is something that is built into the fabric of our culture and it will ensure even bigger and better success in the future. I can’t thank each and every one of you enough for everything you have given me including your friendship.

I plan on keeping in close contact with Atul and the rest of the team, so I look forward to hearing about all the great things you achieve in the future.

As much as I love what I do today building a small startup from scratch, I forget how much I actually appreciated certain aspects of being at a much larger organization. Among other things, I was lucky enough to have two people above me (Bryan Kim and Reza Leaali) who were amazing mentors and helped me more than I could ever imagine throughout my time at Wells. Creating and growing a small startup is at times a lonely, isolating experience. I guess part of what drives me today, though, is the thought that at one point in the future perhaps I will have helped to create a culture that embodies the best of my old company in its heyday.



There is a disturbing and (unfortunately) growing trend to embrace deceit, distort truth and avoid accountability. Make no mistake that this trend will die and those that go down this dark path will forever regret it. In many ways it does remind me of the dark side in Star Wars. There are often ways to trick and scheme your way to gain some level of success, but it is never sustainable. Sure, some people may even get really lucky and manage to skate on a razors edge all the way to the top. But…it won’t last.

The reason is quite simple. Accountability (or the lack thereof) is infectious.

For example, let’s say you work at a company where everyone is really good about getting their work done on time but then a new person joins who ignores deadlines and never works hard. That person may be a junior employee, but if the organization allows him or her to continue for some time, other people in the organization will inevitable start slacking as well.

“Eh, I don’t have to get this done by tomorrow. Bob is always a week late with his stuff and no one seems to care.”

And that is just for an entry level employee. Obviously the situation would be much worse if the leaders in the organization did not hold themselves accountable.

But…it happens. Too often, unfortunately. And once it starts, it can become a cancer that spreads quickly and could eventually destroy the organization.

That is why it is extremely important to do the following:

  1. Heavily promote and encourage accountability throughout your organization. In particular, ensure all leaders are shining examples for everyone else.
  2. Set up a system that creates transparency so there is no question about what actually happened.
  3. When someone makes a mistake (as is normal), ensure that they have a chance to hold themselves accountable and take the appropriate actions.
  4. If someone doesn’t take the appropriate actions after a mistake, ensure that they have the right coaching structure so that team members can help hold each other accountable.
  5. If someone proves after some time that they are unwilling or unable to be accountable, then it is time to part ways since they clearly do not belong.

Yes, this is hard and it takes work. But a focus on accountability is how an organization continues to grow and thrive.



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.





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

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)

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 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

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.