Hey there!

Greg on Half Dome

I’m Greg Read

Software Development Manager

Solutions Architect


When you work with me, I want you to think this is the best place you’ve ever worked and that you’ve grown more than you ever thought possible.


Current Resume


I want my team to be successful, so it’s easy to set aside my ego to help and encourage them. I get a thrill when I can show a colleague a new way to do something. I believe that changing culture starts with me, by modeling the behavior I want to see.

For the past 25 years I’ve been a software developer and I love participating in the changing landscape of technology, it’s a fantastic and exciting challenge.

Tech

Technology

If you read this far, you’re probably curious about my technical experience. I’m primarily a .Net developer with a focus on Azure and CI/CD pipelines.


Azure

A few years ago we moved all new development to Azure. I created the ARM templates to automatically stand-up our resources. Since the ARM templates are Infrastructure as Code (IaC), they can easily be deployed in every environment using our CI/CD pipelines.

When we opened our new season this year, we kept an eye on our performance metrics. Our Azure Sql instance needed to be scaled up, but that happened with a click. We also saw that we could scale back our App Host Plans late at night and on weekends, so we just set up a schedule in Azure to handle that.

Logic Apps and Service Bus

We deployed some Logic Apps to handle some out-of-band work for our normal user workflows. The Logic Apps triggered on Service Bus messages, and we were only interested in a small subset of the messages. I miscalculated the number of messages I thought we would see (we were getting many more) and we were getting charged for all the messages we weren’t interested in. Yikes!

It turns out the fix was pretty simple; I just slapped a filter on our subscription, so the subscription only saw messages we were interested in. I added some properties to the messages when they were generated and now our Logic Apps ran only when they were needed.

Cosmos DB and Redis cache

Azure makes things easier, but you can’t neglect your monthly spend. Architecture choices should take into consideration the dollar cost of Azure resources.

I wrote a feature switch library to keep our unfinished code from being seen in production. Because we were familiar with Cosmos DB, I chose that as the backing store, not realizing the how expensive it would be in our production environment. Our feature switches get read frequently during app execution and we had to increase the RUs our Cosmos collection to a painful level.

To take the load off Cosmos DB, I used a much less expensive cache, Redis. Putting Redis cache into the feature switch library allowed us to drop the RUs on Cosmos to the lowest level and keep our costs down.


CI/CD

We’re using Azure DevOps (Visual Studio Team Services) for all of our builds and releases. We have multiple lower environments that we can easily promote code through until we end up in production.

Why is CI/CD so important?

For years, my teammates and I wrote code, had it pass QA, and then prayed it made it into production without problems. And when we did have problems, we were comparing files and directories to figure out what was different or trying to remember if some config file needed special consideration on the prod boxes. And of course, the boss is wondering when the new code is going live, and hopefully the sites aren’t down too long, and… what a mess.

Now I help our developers setup their CI/CD pipelines and we work together to make sure new code is working in each environment, including production. Once the pipelines are set, we rarely have to touch them.
Our QA team can promote up the latest builds whenever they need to test features or fixes and scheduling a worry-free release to production happens with a couple of clicks.

I recently helped one of our developers and a contractor get their pipelines setup to release to WP Engine. It took some concentrated effort, but we ended up with a solution that used an SSH key to automate our file transfers with SCP.

Once our developers realized that they’re code wasn’t “done” until it was running in production, everyone’s life became much easier.


Unit Tests

I’m the champion for unit tests in our shop, they give me a great feeling of security.
We actually run our unit tests in our CI/CD pipeline during the build. After leap day (Feb 29th), we had a few pipelines stopping because of broken builds. It turns out that we had some wonky age calculations that our unit tests failed after leap day. We knew it was fixed when the unit tests passed.

Load Tests

It can be a tough sell to leadership but making time to load test critical infrastructure and code can eliminate doubts about performance. Your CIO will sleep better at night knowing that her bases are covered.

Prior to opening our busy season, we load tested a critical API and its underlying storage layer. This revealed a missing database index and also gave us a good starting point on how to scale the App Host Plans. We used artillery.io to quickly build GET and POST requests with a single YAML file.
We used our ARM templates to quickly stand-up a new environment for load testing so we didn’t disrupt our developers and QA team from their critical work. When the tests were done, we tore everything down, so the cost was minimal.

Load testing a historically poor performing legacy application required some more mature tooling. We switched to JMeter to generate a load test for a subset of our Web Forms application. After removing some un-needed sql queries, the JMeter tests showed that our modifications had the desired effect and eliminated database deadlocks that had been a headache for years.


Security

We use OpenId Connect to secure our APIs and our client facing applications. This allows us to use Azure Active Directory as an IDP when needed or use our own user store. Getting new Api Resources and Clients into our CI/CD pipeline was an interesting challenge but paid big dividends.


Tools

  • .NET, .NET Core
  • Azure
    • Service Bus
    • Azure Sql
    • Cosmos DB
    • App Service Plans
    • App Host Plans
    • Logic Apps
    • Storage Accounts
    • Application Insights
    • Redis
  • CI/CD
    • Azure DevOps
    • Jenkins
  • git
  • Angular
  • Graylog
  • Unit testing
    • Xunit
    • Fixie
    • Moq
    • Autofixture
  • MS SQL Server
  • SSIS
  • IIS
  • Entity Framework
  • Dapper
  • Load testing
    • Artillery.io
    • JMeter

Technology that’s more of a hobby

  • F#
  • Docker
  • Kubernetes
  • JavaScript game building
Goals

What keeps me motivated?

I work with a great team, but we have limited resources. If we don’t focus on doing things well, our success will also be limited. We want to punch above our weight class, so we agreed on some goals.

  • Shorten feedback loops
  • Automate everything
  • Measure everything
  • Pave our roads with best-practices
  • Take ownership

These goals aren’t something that can be achieved in a sprint or two, they’re more like guiding principles.


Quick story

Our production releases used to be painful; they required multiple teams to coordinate after-hours, took websites offline, and were generally more complicated than a mortgage closing. If something went wrong, it might be several days before we could attempt another release to production.

I championed getting zero-downtime production releases. I worked closely with our Infrastructure team to get our CI/CD pipelines automatically talking with our on-prem load balancer. Now our releases happen in the middle of the day, multiple times a sprint!

Zero-downtime releases required some automation, but it gets our code to production faster, which shortens our feedback loops. Production releases are now super simple, and there’s no more fear. The simplicity makes it so any teammate can take ownership and move our code forward.

passion

I’m serious about my work, but I don’t take myself seriously.

Working hard with a good attitude is where I find fulfillment. I’m not perfect, and I don’t expect anyone else to be perfect either. If I’m not worried about my ego, I can see where I can help others.

Greg in Denver


I love to teach, almost as much as I love to learn

If you write code, you know it’s an error prone process. I share my mistakes, especially the dumb ones, with my team so they don’t have to repeat them. Being vulnerable forces me to put my ego aside and makes it easier to communicate with teammates and learn from them. Showing my team where I’m wrong produces better results than if I show them where (I think) I’m right.


I like to share

Not all work environments are as collaborative and productive as we’d like them to be. Changing this is possible, but it takes work; that’s right, changing culture takes work.

What is culture?
The most succinct definition I’ve heard is “It’s how we do things around here”.

How can you change culture?
Model the behavior you want to see.

Is that new guy struggling to understand your CI/CD pipelines?
Take some time to show him the ropes, schedule some extra meetings to get him up to speed.

Did your teammate just accomplish something really cool?
Give her some enthusiastic praise and encouragement!

Is someone struggling with a problem or too much work?
Offer to help, then lend a helping hand.

Did you get to spend some time learning new technology?
Make time to pass that knowledge to your team.

You will be surprised at how quickly encouragement and sharing become the new normal.


I want to remove the fear

Too many of the decisions we make are driven by fear. At work, a common fear is getting criticized or yelled at. This demolishes trust and ruins innovation.

If my team is worried about pressure from above, I tell them to blame me. That way, they can work freely and they know I’ll protect them.

I think this article about leadership has some great insights.


I’m paying it forward

One of our teammates mentors students at the local university and she invited me to help. The seniors in computer science are assigned a software project to help a local non-profit. The software they develop provides a real boost to the over-burdened non-profits.

This a win-win! The non-profits get some much needed help and the senior students get some great experience. What an opportunity we have to influence the next generation of software developers and change our city’s culture.

We invited another team member, an alumni, to mentor this year and he’s also found it fulfilling. It was a great feeling when one of our students told us that he looks forward to being able to mentor in a few years!

Life

Books I love

The following books have impacted my thinking in a great way and I can’t recommend them strongly enough!

I love reading, especially fiction, so let me know if you want to discuss the latest sci-fi like The Expanse, Brandon Sanderson’s magic systems, or the genius of Philip K. Dick. Having great conversations about literature is a true joy.


I’m not a robot

(no offense to our robot overlords)
Greg Kate Matanzas Greg Kids Snow Tubing Greg Kids Snow Tubing Greg Thomas Board Game Marathon Greg Kate SD Sunset Greg Bananaphone