Picture of Michael Lee
:wave: Hey hey, I'm @michaelsoolee! I'm a full-stack developer, maker of one too many side projects and dad.

You are a software engineer

Written on October 19, 2019

A friend of mine is currently on the job hunt. He was sharing with me how hard it’s been. I’ve been on the job hunt before as a software engineer and know how hard it could be. It is scary, can be demoralizing and imposter syndrome feels like it is at its peak.

As a way to encourage him, I’ve been thinking about truths that I feel could be said to him to help uplift him. The truths about him as a software engineer.

I wanted to share these truths here for him, for those who might also be in the job hunt and also for me, to serve as encouragement for someone who often battles with imposter syndrome.

You are extremely smart.

You create enormous value.

You can solve hard problems.

You understand complex things.

You are patient.

You deserve what you’re being compensated and more.

You are not a coding monkey.

You make good contributions to your team.

You ask great questions.

You have the ability to do so much good.

You are creative.

You are resourceful.

You know enough.

You aren’t defined by an interview.

You don’t need to understand everything.

Your skills are highly desired.

You’re doing a great job.

You are not an imposter.

You are a software engineer.

After I was done writing this list of truths, it reminded me of the Holstee manifesto. So I fired up Figma and also put together a poster-like version as well.

You are a software engineer poster

Moved site from Netlify to Render

Written on October 18, 2019

This site was built, deployed and hosted on Netlify for almost two years. There’s a lot to like about Netlify, from its easy-to-use interface to the thoughtful features that allows statically generated sites to have dynamic like features like analytics to forms.

But for a few months now there was a part of my publishing process that was causing a little bit of resistance. That was that Netlify doesn’t support the latest versions of Bundler. My site is built using Jekyll. Jekyll being written in Ruby, relies on Bundler to handle package management.

My own machine uses the latest version of Bundler, but Netlify is quite behind. At first, I got around this issue with just manually changing the Bundler version in the Gemfile.lock that is versioned. But that becomes a nuisance because I can’t just “publish” my latest changes.

A few months back I had heard about a new service called Render. I had first heard about it through Lynne Tye of Key Values. Render looks to be creating a sweet set of products for web developers. One of them being, building, deploying and hosting static sites. So last night, I took Render for a spin.

All I had to do was hook up my site’s repo. I made sure the Gemfile.lock file had the latest Bundler version and committed. Render immediately picked up the commit and started working away. I was expecting a build failure warning but to my delight, my site actually was built and deployed to their CDN.

No doubt, Render had won me over. I pointed my DNS over to Render and that was that. My site is now happily hosted on Render. If you’ve got a Jekyll site and have issues deploying on Netlify, definitely give Render a try.

By no means, is this article suggesting I’m not a fan of Netlify anymore. But for building Jekyll sites, Render doesn’t hinder me from publishing.

I’m also looking forward to hosting an application on Render soon with their app hosting and managed PostgreSQL databases.

Ephemeral software

Written on October 17, 2019

I often drive by construction sites and have this feeling of envy. I romanticize about how nice it must be for a construction worker to be able to labor all day and at the end of it be able to stand back and look at the progress he/she has made for the day. How it must make them proud. That what they eventually build, could be seen for years if not decades to come.

As a software developer, I’ve often felt I’ve put much effort into a day’s work. But don’t have the same satisfaction at the end of the day. I mean don’t get me wrong, I enjoy being able to solve problems. But at the end of the day, it’s hard for me to feel progress of something intangible. I mean yes, it’s lines and data that show up on the screen. But without electricity or even the Internet, what I build is so temporal in nature. And I’ve struggled with this dissatisfaction of working hard but often finding it hard to see tangible product.

I recently heard Jared White describe the feeling that I’ve had as a software developer and the work that I produce. In episode 41 of Jared’s podcast (which by the way is a great episode on mental health, give it a listen) he uses the word ephemeral to describe the nature of what we produce as folks who work in the digital realm. I thought the word, ephemeral concisely described how I felt about my work—that it is short-lived or temporary.

This afternoon, while on my usual lunch walk, I was passing by this park I often walk past. In the days past, I had noticed that there were some folks there cutting and doing some work at the park. I had assumed that they were doing repairs or building new benches. But today as I walked past, I took a peak at what they were doing. To my surprise they were making mosaics out of stone and placing it in a path.

I saw one of the guys who was working on the mosaic and gave him a thumbs up as a way to show that I was admiring the work that he was doing. He took off his ear muffs and waved me over. When I walked closer, past the lines of hazard tape, he uncovered a piece of tarp to reveal the latest mosaic. It was an amazing piece of dark gray stone, chiseled to look like a beetle. I was amazed at the meticulous care that he and his coworker had put into the piece.

He shared about how he made the piece and what techniques and materials he used and I could tell I was talking to a master. He then showed me the rough layouts of what he claims will be a butterfly mosaic. He showed me a drawing of a template on a piece of cardboard box and he shared how it’s been keeping him up at night trying to figure out the design and layout. In my mind, I thought to myself, we aren’t so different him and I. As we’re both creatives who make things.

He then made reference to the mosaic just a few feet away. He had shared that that was his work too but it was done several years back. He then pointed out the old mosaic—which was made out of stones and seashells—had flaws that he’s now able to see with the new skills and techniques he’s gained since the project.

I shared a few more compliments then asked if he had a website and walked away. While walking back to the office I thought about the man who had made the dragonfly mosaic. That although he was commissioned once to make this piece, he could see the start and end. What was fascinating to me was that for him, he has a tangible product once he finishes his work. The constraints which determines whether his work is done is either a deadline or the resources for the mosaic is depleted.

The mosaic will be there for a very, very long time. And the cool thing is, it’ll be there until the park either gets replaced, weather wears it away or some act of nature. But the mosaic has its purpose and doesn’t need to be enhanced. It does its thing, which I’m guessing is to provide an elegance to the park and that’s it.

With software it’s quite the opposite and I think that’s the discomfort that I’m feeling about the work at times. Software is so volatile in nature. Operating systems are constantly being updated. A piece of software you put out has to constantly be updated to support the OS it is running on. Or if it’s a web application, something as little as the domain name expiring can cause the software to be rendered useless.

If you’re building software for an employer, if the business is shut down, the server is simply turned off and the software doesn’t exist anymore. All the hard work you’ve put in with you colleagues…gone.

While the work of the stone mason or the construction worker, long after his or her time is done with the work. It will persist. It will most likely exist longer than those who created it. Without the need to be modified or enhanced. Serving the purpose in which it was built for.

I’m still wrestling with this feeling. I think it is something I’ll always battle with for as long as I’m a software developer. I mean don’t get me wrong, I still find it really cool that I could take what’s in my imagination and use the digital tools at my fingertips and create something. It’s just that what is built is so temporary in nature.

Perhaps this just means I need to spend some time outside of the digital realm and create something tangible that could be felt/held and is more “permanent”. Perhaps I’ll get back into making notebooks or furniture with my wife for our house. That might be the remedy for my battles with the ephemerality of my work.

Photo of notebook I made in 2015

Anyways I’d also suggest you check out the stone mason, Brooks Burleson’s work on his website. If you scroll down and click on the section labelled, Mosaic Garden Art, you’ll be able to find the dragonfly mosaic I spoke about earlier.

Git not working in macOS Catalina with xcrun error

Written on October 9, 2019

macOS Catalina was released on October 7, 2019. If you’re a developer and upgraded your Mac to the latest OS version, you might’ve been greeted with an error that look something like this if you use Git as your version control system,

xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

The error itself provides a hint as to what you’d need to do to resolve the issue. In particular the part about the developer path /Library/Developer/CommandLineTools. You’ll need to reinstall the command line developer tools. To do this you’ll want to run this command in Terminal,

xcode-select --install

Terminal should respond with,

xcode-select: note: install requested for command line developer tools

Afterwards a system modal will be started indicating the progress of the installed of the command line developer tools. Once this process completes, you can get back to interacting with Git without errors.

Business lessons from a lemonade stand

Written on August 21, 2019

Yesterday was Duke University’s move-in day. I work two blocks away from Duke University so the streets around Duke were a little backed up on the way to lunch.

While driving up a road that runs parallel to the campus, I noticed a little sign near a street that ran perpendicular to the street that I was on. It read coffee & donuts for sale. Within a few feet was a table with two kids — perhaps in elementary school — and an adult. On the table were stacks of Krispy Kreme donut boxes and pitchers of coffee. In front of the stand, an extremely long line of cars, seemingly stuck in gridlock.

I only glimpsed at this scene and took it in in a matter of minutes, but my mind started to fixate on as much of the scene it had registered. As I thought about it more, I couldn’t help but extract business lessons from this simple scene.

Lesson 1: Running a business based off an existing idea is ok

As the title of this post goes, essentially what the kids and adult were running is the classic lemonade stand. But instead of a lemonade stand, they took the idea and put a slight twist on it.

Instead of lemonade, sell Krispy Kreme donuts and coffee.

Lesson 2: Instead of charging more for the same thing, charge more on a slightly different thing

I thought it was clever that instead of lemonade, they were selling coffee. While I think the raw materials in order to make lemonade and coffee cost roughly the same, the final product I feel have a different perception or value.

After all there are coffee shops by the dozens popping up but there aren’t specialty lemonade shops popping up. Coffee instantly feels like something you can charge more, thus you get higher margins.

Thanks to the likes of Starbucks, it isn’t uncommon to pay $5-7 bucks for a coffee when it probably cost cents to make it. A squirt of hazelnut syrup and boom, add an additional $0.50.

I also thought it was quite clever that instead of lemonade they decided to sell coffee. You see I would guess based on the license plates that I saw, probably the majority of the cars stuck in gridlock were from out of state. It’s also likely that those were parents who drove their kids long distances to get there and exhausted from the long ride.

Just getting to school isn’t the final goal, it’s get to school, find the dorm then help your kid unload and get settled in their new environment. What these parents needed was a pick me up. Coffee to give them a shot of caffeine and donut to give them a quick hit of sugar. A little pick me up to carry them through the traffic, finding the dorm and getting settled in.

Lesson 3: Know who you’re selling to

Tired, famished parents. No close Starbucks in sight. Cost to attend Duke University, according to their office of financial support, $72,000 a year.

I don’t know for sure, but based on where they were and what they were selling, something tells me these kids who were running their lemonade coffee & donut stand did their homework.

They knew the location in which they set up shop was going to be a high traffic area on Duke University’s move-in day. They knew coffee and donuts would probably sell better than lemonade and that they could charge more. They knew most of the folks were out-of-towners who needed a little pick me up to get to their final destination.

Lesson 4: Go where there is traffic

This coffee stand could’ve set up shop three or four blocks down from where they are, on a street that sees pretty light traffic. But they are at the mercy of luck to see any business.

But instead they took advantage of this street that seemed to be a mainline into Duke University’s campus on move-in day. Everyone who decided to come down that street had no choice but to slow down and probably make eye contact with the kids running the coffee stand.

It’s like girl scouts during girl scout cookies season standing in front of your grocery store. You have no choice but to make eye contact with them as they flash their boxes of yummy cookies. Making you feel guilty if you don’t end up buying at least a single box of cookies, every, single, time you visit that particular store.

It’s easier to set up shop near an established, high-ish traffic location instead of an isolated or a lesser traffic area and driving traffic there yourself.

It makes me think of online shops. It is easier to get your first sale on an established market place like Etsy or Amazon because they already have the traffic. But not only that, the traffic already has a high intent to purchase. As opposed to setting up your own online shop. Where you’d have to put in the work to send traffic and then you’re not guaranteed they’ll buy what you’re selling.

Lesson 5: You either want it or you don’t

I don’t recall if the kids gave out samples, but I could guess with a high level of confidence that they didn’t. The reason being of the scenario. The folks are stuck in traffic, but the stand was at the intersection and not further down the traffic line. Which means the potential customer has to still keep most of their attention on the intersection to gauge whether it’s their turn to cross. Not only that, you don’t want to be the car holding up traffic.

Being the driver, you’d have to make a quick decision, you either want the coffee and donut or you don’t. If the kids offered samples, the customer would try it. They would decide whether they wanted one, then a kid would have to run back and grab the consumables and a transaction would occur.

Instead you can cut out the sample and help reduce strain on the customer’s decision. A kid could walk up to a car and wave a cup of coffee and donut. The customer decides they want it. If they want more, the other kid runs out with extras.

If the kids and the adult was clever, they would’ve set up some form of digital payment. Cause who carries cash these days? Digital is so much faster and less of a hassle.

If the kids did offer samples, the customer could’ve easily been satisfied with the sample, got the value that they wanted and driven away. I highly doubt they would’ve gone away done their thing and thought, oh I’ll park and come back to the stand to now grab coffee and a donut. If I was a potential customer, I would be like heck no I’m not going back to that street. I’m going to find me a nice local coffee shop with easy access and a lot more time to make my decision.

While I merely observed this interaction and some of it I imagined what it would’ve been like to be a customer of this coffee stand. I thought it was interesting the lessons that I was able to extract from this scene.

Such a simple business and yet it was able to hit on so many business lessons that I think folks — including myself — often overlook or don’t consider. It was a good reminder to think through some of these lessons the next time I have a business idea.

Random number generator

Written on August 15, 2019

This is a random number generator between two numbers. To use, give a number to the lowest number field and a number to the highest number field and press the Generate random number button to get your random number. The randomly generated number will be a number between the range of the two numbers and is inclusive of the two numbers.