The Long Game

On Friday, September 8th, I celebrated my 8 year Netflix work anniversary. I consider myself to be extremely fortunate, lucky, and privileged getting to say Netflix is my employer.

New employee college.

Reflecting back on my experiences so far, I wanted to share more broadly, the Serendipity (shameless plug for my company!) that have guided me thus far in my career and not only at Netflix.

This post is meant for folks wondering, “What to do next?”, “Where do I get a job?”, or “What company do I apply to?”

Cube Life

My vacated cube at BAE Systems after I was laid off.

I was never one of those people going through high school or college, that knew exactly what I wanted to do or who I wanted to be. The only thing I really wanted to do was work with technology and computers, and make enough money to have hobbies and buy nice things. I distinctly remember I dreaded the thought of sitting in a cube farm all day.

It took me a while to really understand and figure out what problems interested me and what I was proficient at. At the same time, it also took me a while to understand where to apply my focus and find industries that resonated with my skills and education.

With that said, I started using the the framework below, crafted through lots of trial and experiences.

The Framework

  1. Determine your personal values, ethics, and goals.
  2. Find interesting industries that align with your personal values.
  3. Identify the problems those industries are facing or will have to face in the next 2, 5, or 10 years.
  4. Identify the companies that are solving the interesting problems in those resonating industries.
  5. Identify the priorities in your personal life (health, career, family, lifestyle, income).
  6. Identify the priorities in your professional life (challenges you enjoy, work culture, responsibilities, income).
  7. Determine the intersection of your personal and professional priorities.
  8. Continued self assessment.

Values

As you progress through your career, it’s important to define your values and how you personally define success.

The definition of success means different things to different people: climbing the corporate ladder, parenthood, giving back to community, having time to pursue hobbies, earning buckets of money, maybe all of the above!

What do you actually value out of life and where do you willingly want to spend your time? That’s what you value.

By determining your values, which will change over time, you can better guide and plan your career decisions. As the seasons of your life change, these values will also change – meaning it may be time to shift your career focus.

Having your values defined keeps you true to yourself and provides a framework to determine, “Does this job add value to my life or help me live my values?” or “Is this the right employer for me, right now?”

Industry

Finding an industry that resonates and aligns with your values, will help provide focus. This is very different than the adage of do something you’re passionate about. Passion like any emotion, even curiosity, fades. Focus though, is an invaluable skill and trait that stays sharp as a tool as long as you practice.

Often times, when planning a career, people lean towards a certain set of companies or brands that hold some special gravity. There’s nothing wrong with this approach as long as you understand, why are you choosing those companies. It’s often challenging to find a definitive answer to, “Why this company?” but throughout the various seasons of your career, it’s extremely important to answer this question. Gravitating towards a brand-name company is easy but it may not contribute to your short, medium, and long term career and personal goals / values.

This is where focusing on a specific industry or set of industries is important. By aligning your values with an industry, it suddenly becomes very clear which direction you should drive towards. Focus allows you to eliminate the noise and perceived glamour of a brand-name company. Focus grants you the privilege of really understanding an industry, understanding yourself, and how a career fits into your life.

With a handful of industries in view, focus shifts your perspective. You can now build a life around an industry instead of your life being built around a single company.

Opportunities

Now with a set of industries in hand and your new found focus – it’s time to search for unique problems and opportunities those industries are facing.

Identifying the unique problems an industry faces will help you filter which employers or companies are serving those unmet needs or growing problem spaces and what skills you need to learn and hone.

Because these areas have unmet needs, we’ve opened the door for opportunity. I hesitate to use a start up cliché but this is what start ups do best – providing solutions for unsolved problems (most of the time…).

Another facet of this “problem-hunting” – consider the time horizon of your goals and the time horizon when these companies may be able to deliver a solution. These two should have some overlap. Why the overlap? Having similar time horizons means you can plan for how you want to grow your skills within that industry.

Let’s go to an example. A few questions that often comes up when I speak to inexperienced engineers include:

  • What programming language should I learn?
  • What framework should I pick up?

Without going into a long-winded explanation, by understanding what problems an industry faces, you can begin to infer the tools, technologies, and practices needed to solve these problems. The question of what programming language to learn suddenly becomes less important when perhaps, that industry may invent something organically.

Now the questions and focus become:

  • What are the companies that will enable me through training, experience, or exposure, to build solutions in the next 2, 5, or 10 years?
  • What skills do I need to learn to be successful solving problems in this space?

Having anguish over that programming language or tool won’t make a difference, when your particular industry may create something totally new in a few short years. Instead, you can look to the long term to determine the skills, tools, and experiences you need to reach your definition of success in a chosen industry.

Closing

Netflix office roof top, one of my favorite places.

All of this sounds like an academic research paper doesn’t it? Well. It is.

This whole process involves a lot of introspection, research, conversation, and honesty. As much as I personally crave spontaneity outside of my professional career, I’m not the type of person to pick a random direction in my career and leave the rest to chance. I’m also not the type of person where I obsess over sticking to a plan. I’m content with leaving room for serendipity and discovery.

The point of this whole exercise is to share with you, how I’ve built my career, and share insight into my decision making process. It’s written to help guide you along a sustainable and fulfilling career.

When looking at one’s career in hindsight or planning for the future, it’s important to realize that these decisions, goals, and adjustments all take a lot of time, often played out over years and in some cases, decades.

By shifting your perspective to be longer-term and having some focus, you begin asking yourself different questions. Hopefully, you aren’t caught up in the details of which company has the largest IPO possibility or what programming language you should learn next. Your perspective should be what opportunities, skills, and experiences can you gather to reach your definition of success, which hopefully overlaps with your lifestyle values.

As I look to the next chapter of my career, you can bet I’ll be sitting down to ponder, plan, and execute on this framework. Remember to focus on the long-term, enjoy the short-term, and learn a lot, as you gain the experiences you need to build a long-lived career in whatever industry you’ve chosen.

The First Dollar

Well, not really the first dollar, more like the first 12. And ninety-nine cents.

On Tuesday, August 15 at 12:30PM PST, I received notification that I had my first customer sign up.

I’ll spare you the excited hyperbole (I definitely did a happy dance in my chair), here’s a screenshot:

Stripe Notification Email

Today, I’d like to share with you at a high level, the work, time, and cost involved to reach this milestone. I want to highlight the details that get left out when someone says, “I’m starting a company” and provide some context into how long this took.

And before I get started – a big, big thank you to everyone that’s helped, listened, or coached me so far!

Paperwork

The biggest piece of paperwork involved was establishing an LLC here in California. I went with a LLC for a few reasons:

  • Lowest cost way to start a business
  • Protects my personal assets from any liability
  • Easily converted into a different corporate structure and tax status if/when I need to take on outside investment.

A lot of startups or technology based companies, often get pushed into pursuing an S-Corp in Delaware. For Serendipity, this would have added unnecessary complexity to operations, expenses, and taxes when I’m focused on launching the product and attaining customers.

If I were to take on any type of any amount larger than $100K for example, I’d lean towards incorporating in Delaware with S-Corp filing status. I won’t go into details here of why but I prioritized simplicity and velocity.

While there are a lot of options and companies offering incorporation services, I opted to utilize a friend’s firm, Tacsis Law & Accounting, to get Serendipity incorporated as an entity.

The main benefit of this approach alleviates any worry of, “Am I doing this right?”

The second benefit is having a close friend (and his entire team) to help me answer any legal questions, operating concerns, and accounting matters.

Finally, I’m supporting a friend’s business rather than a large company or unknown individual.

Fee breakdown:

$2000 (retainer fee for incorporation documents)

$2000 (fees for EULA draft and contractor agreement)

$200 (misc. fees and overhead for emails, correspondence, etc…)

The approximate cost: $4200

The other piece of paperwork that I obtained but wasn’t necessary, was a Los Angeles county tax certificate. This was free to obtain from the city and I plan on cancelling the certificate in the coming weeks. LA County has a tax exemption for businesses that only deal with electronic services.

Banking

This was one of the easier building blocks to stand up but still took a few weeks to actually implement and test in code. Standing up actual bank accounts took an hour and a short, 24 hour waiting period.

After an evening of research, I opted to use Mercury to perform my business banking. They offer a zero-fee and zero minimum balance service that allows me to move money from my personal accounts.

Traditional banks such as Chase, have account minimums and fees surrounding basic business checking and savings accounts. Additionally, they’re not well equipped to deal with online-only businesses and cater to brick & mortar retailers with point-of-sale terminals.

Mercury, alongside their fee structure, provides effortless integration with Stripe, my payment processing platform.

Stripe integration came in two pieces: the code implementation and linking with my Mercury accounts.

The code implementation took me a handful of weeks to develop and test, as I had to create a customer database schema, build a service to interface with Stripe, and connect their pre-built UI into my user payment workflow.

Integrating Stripe with Mercury took a few clicks and at most an hour. Since I had already implemented the Stripe service before this stage, I only had to provide Stripe with account and routing information.

Another win here, Stripe handles account cancellation from within the customer portal (which is linked from Serendipity) and refunds with zero input from me. When a customer opts to cancel or a refund occurs, my application gets an automated notification and handles terminating the user’s account using my deployed Stripe service.

The approximate cost: Free

Product Development

While I won’t provide dollar amounts of my infrastructure cost such as AWS compute, I’ll outline the cost of product development I’ve incurred so far.

In order to get the UI off the ground, I purchased a license for a set of designs and templates from Creative Tim. This was a great investment as it let me get something built with fairly high fidelity and high speed, without a large time investment of building a complete UI from scratch.

Cost: $199

With the foundation of the Serendipity UI established before launch, I started future planning of the UX/UI and prioritized getting a bespoke design in place.

A another friend connected me with the wonderful, Francisca Blaauboer, to collaborate with me on this phase of work. Francisca built a fantastic design library, including iconography, fonts, UX, and UI layouts that Serendipity can utilize immediately going forward.

Eventually, all the Creative Tim components I implemented will be replaced by the components that Francisca created.

The approximate cost: 2 months of work based on a pre-set daily rate with Francisca.

Without getting too technical, I wrote the server code for Serendipity from scratch. This part of development was definitely the easiest and cheapest part of the product. From earlier posts, using Firebase, Stripe, and other libraries made building a server quite easy and straightforward, with the only cost being my time.

The approximate cost: 18 months

Intangibles

I could write for a long, long time about the intangibles or the opportunity cost of getting that first subscriber.

I think what’s most relevant to you, is to highlight this company and idea didn’t take a “short” two years. The reality is that I’ve been working on this idea for nearly eight years in some form or another.

It wasn’t until late 2018 I had solidified the idea of what I was going to build and finished a working prototype:

Before the iteration above, I had been chasing the idea of building a hardware device, augmented with software. I spent maybe two years working on those ideas until I changed course again.

The UI you see above, transformed into the Serendipity product that’s available today:

Build Far

Building an online business can take a lot of time. I don’t think the technology industry does a good job of highlighting what it takes to bring an idea to market especially when you are bootstrapping the company and product. I think the idea of going after investor money and hiring people is great but that approach has a lot of perils and a very different set of risk vectors.

I’ll leave you with a closing thought. I spoke with someone from a larger VC firm some weeks ago, and one comment stays with me, “We want to see how far you can get with little to no investment…” I translated this into, “How far can you take your idea, given your resources (time, money, energy, focus, expertise), requirements, and product market?”

Well, after a lot of time, energy, consistency, and effort, I get to say, “Pretty damn far.”

I Dare You

That “feedback” the other coach gave you? That happens day-in and day-out at companies. Peers do it to you. Leaders do it to you. You’ve probably done it to someone else and it probably came from a good place. It usually does. Sometimes it doesn’t.

This whole experience is aptly termed, “micro-aggression”. Also known as, bullying.

I despise the term micro-aggression. Pre-pending “micro” diminishes the true, disruptive impact of these words and experiences.

At the end of the day, it’s bullying and discrimination.

I / we are not asking for less feedback, we’re not asking for sugar coating, we’re not asking for an easy pass to anything. We’re not asking for a golden ticket. We’re not asking you to avoid “triggering” us (I also despise that term).

As a side note – have you noticed this theme of rebranding vocabulary to diminish feelings?

We’re asking to be evaluated by the same rules, being held to the same requirements, being given the same number of opportunities to spotlight our work.

Ask yourself, the feedback you’ve given to a minority, when and how did you deliver the same message a non-minority? When someone was promoted, were they actually fit for the role? Did you perform your due diligence and ensure EVERYONE had a fair and reasonable attempt at this? Did you fight for them the way you’d fight for someone else? When was the last time, you truly advocated and sponsored a minority to take on leadership, take an opportunity, take a risk?

Are you feeling uncomfortable?

We want you, dear reader, to pause and really think, consider:

“What has this person already done to get here?”

“What can I meaningfully say (and do) to help them get better?”

“How much did they miss the mark and what can I do, to help them get there?”

“What can I do, to ensure the target DOES NOT move?”

“Was the target stationary when they took their shot?”

“What advantages have others had, that this person doesn’t?”

Challenge Accepted

My challenge has and always will be, showing that I belong, that I’m smart and capable enough.

My challenge is showing, to everyone that feeds that monster, I’m very capable of hitting that bullseye at 20 yards. Even if the target is moving. Even with scarcity.

The other challenge that goes unspoken, is helping show the path for others, illustrating how to start their own journey, equipping them with the knowledge, experience, and tools they need to forge a path for themselves.

Do you, accept the challenge of helping others?

This essay, while focused on the immigrant experience, isn’t meant to be divisive. As I mentioned earlier, we (EVERYONE) do this to each other, often. It’s particularly salient if you’re a minority.

Collectively, let’s do better. Let’s support each other, help each other be successful.

There’s that famous American euphemism, “Everyone gets their slice of pie!”

We shouldn’t use that anymore. Because, some of us don’t like pie (what the hell am I saying, I love apple pie!) but we don’t need to fight over a single dessert. Let’s share our ingredients, recipes, and make multiple deserts so everyone can enjoy.

Dear reader, I dare you.

I dare you to:

  • Talk to me about everything I’ve written.
  • Take action, advocate for someone you’ve never advocated for.
  • Receive extremely uncomfortable feedback from an outsider.
  • Understand how and why this feedback monster lurks.
  • Understand how scarcity drives us.
  • Acknowledge the work we do and are capable of.
  • Push an opportunity for someone that truly deserves it.

In closing, I hope you:

  • Are more aware of the minority, immigrant context.
  • Understand how to wield your feedback so you don’t feed the monster.
  • Take action to support, sponsor, and grow those around you.

Catastrophic Failure

A bad day for you is considered a catastrophic failure for us.

You’re probably asking what’s catastrophic failure (apart from being fun to say)? What’s a bad day? Why do we see this as a catastrophic failure? Why the hell, do I (we) think we become the best?

Catastrophic failure is this overwhelming sense that we have failed severely. It makes us feel like we cannot provide, it makes us feel like we do not belong, it makes us feel like we are less than everyone around us.

A bad day is when you’re off the mark, by a small margin, but you feel every millimeter of being off bullseye.

For example, take my pistol marksmanship at 10 yards, in particular, the one round closest to the center of the target. That’s a bad day. I was so close!

Now, why do we see a bad day as a catastrophic failure? Being approximately 5mm off bullseye is pretty good in most cases, right?

No. It’s not.

Welcome to the immigrant mindset. It’s instilled within us.

Let’s transition away from the bullseye analogy briefly.

The story goes, our parents immigrated here, to America, with a single suitcase, the clothes on their back, and maybe enough money to buy food for a week (if that).

We (albeit not all of us) grew up with scarcity. This same narrative is true for millions of immigrants. Alongside that single suitcase, is an attitude, work ethic, and an ethos – failure is not an option.

There is no room for failure. And there is certainly no room for waste.

One single fuck up, the family won’t have food on the table.

One single fuck up, the rent doesn’t get paid.

One single fuck up, your sibling can’t get medical care.

One single fuck up, you have to somehow immigrate to where you came from.

One single fuck up.

Let’s deep dive about this idea of fucking up and how it relates to scarcity.

Do you remember the early days of the pandemic, where we all had to wait, in neat, single file lines to get our groceries?

Questions that probably ran through your head while waiting include:

“What if they don’t have toilet paper?”

“What if they’re out of baby formula?”

“What if they’re out of food?”

Do you remember how you felt, when that one critical ingredient (maybe flour?) was not in stock?

That feeling of not getting what you want, without any consistency, is scarcity. Take that feeling and amplify it. Amplify it again. And amplify 1000x more times.

Our parents (and some of us) lived through an early life with A LOT of scarcity. Scarcity was the only constant in their lives.

Remember what grocery stores shelves looked like at the beginning of the pandemic? I took this photo on March, 15th, 2020.

Imagine holding that feeling of scarcity for nearly 80% (if not more) of your adult life. Imagine going to the grocery store and always seeing empty shelves.

Imagine. Every. Day. You wake up and you have that sense of dread. That sense of not having enough of anything to sustain you, your family, or anyone else close to you.

That’s scarcity.

Let’s bring scarcity together with fucking up and catastrophic failure.

Suddenly, after missing the mark (a bad day), the feedback monster rears its ugly head and our brains go into survival mode.

We have now hit catastrophic failure.

Will I have a job tomorrow?
Will I get fired for this?

How can I be so dumb as to not think this out?

What if I lose my job and my house?

How did I forget to add that one task to the agenda?

How did I mess up that feature?

Then your brain really goes into overdrive.

If I lose my job, how will I take care of my family and my aging parents?

If I lose my job, it’ll be impossible for me to get a new job.

If I lose my job, I’ll have to move away from everything I love.

If I lose my job, I’ve lost EVERYTHING.

A single fuck up can trigger all this emotion with a relentlessness that is difficult to quiet and subdue.

This type of scarcity trauma, no matter how much therapy you’ve had, stays with you (it takes about 1 generation to go away).

Any professional “bad day” triggers immigrants (us) to work harder. It dictates that we stay up later, learning, reading, researching, practicing.

This failure dictates that we never, ever, let that same mistake happen ever again.

You can view the feedback monster as the parents of imposter syndrome. Makes sense?

Now, why do we think we’re better (than most)?

We take the time, energy, and resources necessary to learn, educate, and find an optimization, a better solution, or pick a definitive, concise way of communicating an idea.

That time with a leader is scarce, the time you have on stage to present is scarce, the opportunity to show up and be seen is scarce.

We have learned to use scarcity as our scalpel. We know how to work with less. Less time, less money, less people. Less tools.

How many times have you seen a peer, repeatedly make the same mistake? How many times have you seen a peer, refuse to learn more context about their role? How many times have you seen a peer, fumble over a presentation or a meeting?

We see this anti-pattern aptly called, “failing upwards”. We refuse to fail either upwards or downwards. So we invest ourselves until there’s nothing to spend. Then, when we’re ready for that meeting, that project, that presentation, we suddenly have a discovery.

The bar has been moved. Again.

The rules of the game have changed Again.

Let’s go back to the bullseye analogy.

South Korean rifle shooter Kwon Eun-ji (third from left) prepares to fire a shot during a 10-meter air rifle qualification round in Tokyo Olympics on Saturday (Yonhap) – Korean Herald

Imagine you’re behind the shooting stand. You learned from prior matches what you need to do to hit that bullseye at 10 yards. You have good posture, proper technique, and the right equipment. Practice has shown, hitting a 10 yard bullseye while challenging (for most), is a known, proven process for you and your equipment.

You line up to take your shot, only to realize someone has moved the target an additional 10 yards away. That additional 10 yards has introduced a slight breeze, ever so gently moving the target around. Your target stares back at you, waiving, from 20 yards away. Additionally, you’ve only been given five founds of ammunition.

You had no say in the matter nor have any control over where that target could have been placed much less moving it back to a proper 10 yards.

For months, you prepared with the documented requirements, for a stationary target at 10 yards and 5 rounds. You trained to hit your target with 3 rounds – you already know ammunition scarcity would be a risk. You trained to hit your target at 15 yards. You knew there would be a risk of distance inflation.

Now, imagine the person next to you, quite arbitrarily, moving their target to be within 5 yards of the bench versus your current 20 yards. You discover, they have been given twenty rounds of ammunition to hit bullseye.

At twenty yards with the breeze, you managed to be 5mm off center using 4 of your 5 rounds. The other person? They were able to hit 4mm off bullseye by their 15th round. They win because they were simply closer to the bullseye regardless of circumstance.

Let’s wrap up this analogy.

After the competition, your competitor gets applause, wins the trophy and award money. As a courtesy, they come by and wish you well. Then, a coach from the other team, stops at your stand, and quite loudly exclaims, “Hey, I’ve got some feedback on your form that may help you hit bullseye. Did you factor wind with your training? How did you train your stance, you should have trained to hit bullseye at 25 yards and you need to adjust your posture. Next time, don’t forget to account for wind! Today was simply a bad day, you’re still a good marksman!”

“Thanks!” you say while proceeding to pack up your equipment, walking the 20 yards to retrieve your target, with the other team, the other coach, the audience watching.

Do you, dear reader, have an understanding why a bad day to us, feels like catastrophic failure? Do you see, how scarcity drives us? Do you feel the weight of the feedback monster, sitting across from you?

Arrival (2016)

Fraught with Peril

This essay is broken up into three parts and I will publish each piece separately over the next few days:

  • The Feedback Monster
  • Catastrophic Failure
  • I Dare You

I hope you find the writing enlightening, educational, and empathetic.

Weeks ago, a close friend and I were enjoying beers, catching up. I lamented several stories about my professional journey, sharing ups and downs in my 15+ years of working in technology.

I shared some particularly acute stories about my personal journey and how being a minority is challenging. It must have been the beer, because I had a terrible explanation when he asked, “What can I do better?”

So. Thomas (names have been changed). This one is for you.

This essay is a culmination of personal experiences, as well as shared stories from those around me in my professional and private circle. All opinions are my own and no one else’s.

After reading this essay, it is my intent that you:

  • Have heightened awareness to the minority experience in corporate America.
  • Increase your knowledge and context in how you apply feedback and foster growth.
  • Take action to support, sponsor, and grow those around you.

The Feedback Monster

The minority experience in corporate America is fraught with peril. Everything you say or do can be scrutinized, marginalized, or ignored. Days and weeks are spent crafting emails, messages, or ideas.

What is peril in this context? Peril is the very real possibility you will be penalized for speaking your mind, making a minor mistake, or even attending any meeting being slightly unprepared.

What is a penalty? Feedback.

It takes the following form:

You weren’t clear when you were articulating that thought.

You cursed too much in that meeting.

You didn’t consider ALL the options for that solution.

Use this word versus that other word.

Did you run this past your manager already?

What do others think of this idea?

Our inputs are met with constant feedback, criticism, and skepticism.

We pay a significant tax. This tax comes in the form of ensuring we’re meeting goals, understanding business requirements, and striving to be heard, acknowledged, and valued.

The challenge becomes, demonstrating to a broad audience, we’re just as good as “everyone else”.

The truth is, we’ve always been good, if not better than, “everyone else”.

This creates and feeds a “feedback monster”.

We spend an immense amount of time interpreting, “Do I take this feedback as true, legitimate input or do I file this away as an attack on my abilities?”

Because, I can tell you, it’s often the latter.

Why is it the latter?

When compared to those that are in the majority, in most cases, we’re being held to a much higher standard than our non-minority peers. This is evident when you look at salaries, titles, and promotions across a non-homogenous group of peers. A simple Google search results in hundreds of hits.

So.

When we receive feedback and we witness our peers’ lack of polished behavior, ill-formed work product, ill-planned solutions, or laissez-faire work ethos, this monster, looms in the corner of the conference room (or that dark part of your Zoom call).

But, you’ll never see or hear us complain. You’ll never hear us bemoan the feedback.

Thank you.

We say thank you.

We hear, acknowledge, and receive that feedback, and push ourselves to be better. At some point though – there is no better. We’re doing everything in our power to be the best. We become the best.

Then the system hits a failure point.

We’re Sailing the Seven Seas!

Hey gang,

It’s been a while – after launching in September, the holidays came swiftly. That time was not wasted! During that period, I performed outreach to customers, asking for help smoke-testing the platform.

After approximately 2.5 weeks, I collected a few pieces of feedback that confirmed feature functionality and validated my engineering and launch strategy.

I also took this time to test a hypothesis surround communication and specifically, the way I communicate.

Communication

From prior experiences, I tend to provide too much context and detail when I answer questions or explain a concept to someone. When reaching out to customers, I wanted to ensure they could experience a normal onboarding process without getting caught up on things that weren’t important.

In this particular case, I wanted the users to focus on the core feature of my product, launching and using their own Nightscout server.

My hypothesis: Can I still get customers to test the product without going into too much detail and ask them to focus on specific areas?

In order to ensure ease of use and focused testing, I assembled an instruction manual in PDF form, that contained screen shots and callouts for the user to follow.

I know this shouldn’t be a surprise but it was a great reminder that when building, selling, or using a product, keep the message short and sweet:

  • Click here
  • Look here
  • Wait.
  • Perform this action (preferably with with an image)

In the same vein, the instructions were very concise and focused when probing for feedback, complete with contextual links to return the feedback or report any issues.

I have to constantly remind myself that everyone is hammered with information and text every day – the last thing they want is some wall of text sharing context they don’t need to know or care about. And with this longer post, I appreciate you indulging me if you’ve kept reading!

Updates

On to updates!

In this current phase of the project, I’m focused on:

  • Shipping one more critical feature (user settings), this feature spans both UI and back-end work and I have estimated at 1 week’s worth of time.
  • Customer acquisition / marketing.
  • Finishing up the last steps for incorporation and getting banking set up.

I’ll be slowly shifting away from engineering work and more towards business growth and selling. I had wanted to hire a contractor to begin working on that last UI feature but I found that shipping this last feature set is a good stopping point for any further engineering work.

My short-term goal is to ship the feature by mid-Feb and then really focus on putting a marketing campaign together to acquire users. Longer term, by spring time, I hope to have my first paying customers.

It’s been an adventure so far but aside from talking about the product, it’s time to get back to building.

All the best,


Jonathan

Sailing to Production

6 months after my initial deadline – I have finally shipped my first version of the application to Production!

In other projects, I have a bad habit of shipping code directly to master/main branches or messing around in a “production” environment directly. This time around, I realized that I need to have some discipline and create a TEST environment first

The work was broken down into the following categories (in ascending, priority order):

  • Enable client and server code to interact with non-local infrastructure
  • Track and abstract environment variables for the entire codebase (including API keys, secrets, etc…)
  • Abstract and script build commands for three environments (local, TEST, and PROD)
  • Set up Firebase, Stripe, and AWS to support TEST and PROD environments.

It took me the better part of 2 – 3 months to get a TEST environment up and running smoothly. I’ll explain more on those growing pains at the end of this post.

Enabling Client and Server Code

The bulk of this work was to utilize environment variables so my application knows where it’s operating.

The scope of this was mostly around Firebase and Stripe. For development, I’ve been heavily utilizing Firebase’s authentication and Real Time Database emulators.

For Stripe, my code was modified so that Stripe can emit (and my application can receive) webhook events based on the Stripe payment API.

Tracking Environment Variables

I took some time to audit and create “.env” files so I could quickly reference environment variables for my deployed environments.

Up until now, both applications were loading environment variables from various locations, including start scripts and configuration files.

These environment variables contain everything from API keys, environment information, debug settings, redirect URLs (for Stripe), and build parameters (for the React client build), and various settings for Firebase.

Build Scripts

Once I had the environment variables buttoned up, it was quick work to author a handful of scripts to utilize the write configuration files to create my TEST and PROD assets. The remaining task for me here is to author some automation to upload the bundles to S3 and ElasticBeanstalk.

For the server, I create a ZIP file of the entire codebase (including an ElasticBeanstalk configuration). For the client, I run the CRA (Create React App) build command that creates a nice build folder I upload to S3.

Right now, I manually upload client and server artifacts between TEST and PROD which is a small time-sink, I’ll automate both compression and upload of the assets in the coming days.

Deployed Environments

With TEST and PROD builds operational – the next big step was to harden and clean up my TEST environment before cloning things to PROD.

In AWS this meant standing up a new environment in ElasticBeanstalk (EBS) and ensuring I have the correct IAM policies in place for the environments (I provision other AWS infrastructure when my application starts).

I ran into a small speed bump at this point – EBS in test had trouble obtaining my SSL certificate. After a few days, I realized EBS needs an SSL certificate to be available in the same region you are deploying too. Oops. I had provisioned an SSL certificate to US-EAST-1 instead of US-WEST-2. With that out of the way (and TEST working smoothly), I moved over to migrating Firebase.

Firebase was also trivial to provision a PROD environment for both authentication and the Real Time Database (RTDB). Since I was on the free-tier of service, I upgraded to their Blaze plan so I could have multiple databases and sets of infrastructure.

Stripe made this migration even more elegant, they provide a simple “COPY TO PROD” button on their dashboard – and suddenly all my important settings in TEST were moved over to my PROD environment. I can actually accept real payments!

Bringing it all Together

With a PROD environment operational (and the aforementioned environment configuration files), shipping to PROD is simple as calling the build scripts and uploading the code. AWS, Firebase, and Stripe work very well together with the abstractions and scripts in place.

While getting PROD up and running was “easy”, I learned a lot getting TEST up and running smoothly.

Infrastructure Details

The big head scratcher I had to tackle was getting my client code (hosted on S3) connecting to my API server (hosted on EBS), with SSL/TLS in the loop.

The problem I was facing, my client code is being served from https://www.serendipitybio.com but my server code is served from https://api.prod.serendipitybio.com.

A modern browser won’t allow you to make connections to a second domain if it differs from the domain you’ve currently loaded, unless you have specific CORS headers returned to you by the server. Additionally, with the way I’ve set up and deployed my application, I can’t easily route everything through a single domain.

AWS offers various solutions for this problem but none of them fit my particular requirements. Instead, of spending a ton of time on this, I opted to enable CORS on my server (with a specific list of origins) and host my client code using CloudFront (with SSL/TLS).

My API server(s) now sit behind an application load balancer that terminates SSL and proxies incoming requests to the servers. I also leverage CloudFront to enable fast and secure static asset hosting.

This set up enables me to have full TLS/SSL connections and splits the codebase between client and server (which is a huge velocity win for deployments). Another big win here was that I didn’t have to make a large code change to enable CORS or get this deployment model operational. It was literally 4 lines of code!

What made shipping to prod PROD easier? I took detailed notes while figuring this all out for the TEST environment! I created a checklist of items and gotchas I would need to work through during the PROD deployment – and the bulk of the work was to simply go through that checklist.

What’s Next

Now that PROD is up and running – I’ll be shifting gears to customer acquisition! More on that soon.

Thanks!

  • Jonathan

P.S. A big thank you to that special person in my life. You’ve been up with me during those late nights and encouraging me to keep going. You know who you are.

July 11th – Launch Updates

Sorry for being incommunicado – there’s been a lot of change at Netflix and I really haven’t had the bandwidth to write since April.

My app is nearly ready for deployment to production!

I spent the better part of last week getting the user sign-up flow implemented and debugged. I had to adjust my implementation to account for my two sign up flows:

  • Free monthly subscribers
  • Paid monthly subscribers

The implementation I had deployed meant that both sets of users would land on the Stripe payment page instead of only the paid monthly subscribers.

It took me about two days to understand the problem before I could implement a working solution, which I’ll walk through now:

  • When a user starts sign up, the first thing they have to do is create an account (handled with Google’s Firebase Auth library)
  • Upon successful login, a callback in the auth flow is executed and determines where the sign up requested originated (handled by setting a query parameter provided by the sign-up button component).
  • If the request originated from the free account option, my auth flow provisions the user (account settings) and stores a future entry in Stripe in case the user chooses to upgrade. Once that callback finishes executing, the user is redirected to their dashboard.
  • If the request originated from the paid account option, the auth flow provisions the user and sends the user to the Stripe page for payment. Once payment succeeds, the user’s account is updated (on the backend) and they’re redirected to their dashboard.

With that buttoned up, I’ve began the work of scrubbing the site for two main buckets of work:

  • Grammar, spelling, and punctuation mistakes
  • Environment variables that need to be abstracted

As for deployment, I’ll be reusing some ElasticBeanstalk infrastructure I had deployed for my MVP. I’m targeting deployment to Production by the end of this month.

Once deployed, I’ll have to reactivate those MVP users and see if I can convert those folks onto the new platform.

Have a great week.

  • Jonathan

April 11 – Launch Updates

Hi all,

Lately, I’ve been getting things like payment and pricing set up. In terms of technical work, I’ve had to build a pricing / payment page (done) and test the Stripe integration (in progress).

The launch list never seems to shrink either:

  • Bug bashing
  • Deployment infrastructure
  • Beta / UAT testing
  • Deploy infrastructure

At this point here in April, I’m well beyond my “launch by January” goal, and as Vonnegut wrote, “So it goes.” I’ve always been a fan of “move fast and break things” but I’d rather get a full night’s of rest and build something “good enough and working” versus rush through another prototype that won’t make sense launch.

Coding and testing the payment page has provided some much needed momentum to the project. Working on an application by myself and without anyone actively using it, I find these small moments worthy of celebration. For me, it’s the intrinsic satisfaction of knowing I have built something, nearly from the ground up, into a functioning application that people will use.

This momentum is really important because I have plenty of evenings (and early mornings) where I ask myself, “Is this even worth it?” My fear and anxiety isn’t about how much money I will hopefully make but whether people will actually find it useful. My original hypothesis says yes, but that’s merely the outcome I want.

I have to keep this fear and anxiety in-check though – I know if I succumb to those pieces of negativity, this will merely become a fancy side-project that never sees the light of day or actual users.

I have fairly strong convictions (and good data) that this is a value-adding product, so I will keep building. And hopefully soon, I’ll be deploying as well.

Have a great week!

  • Jonathan