The Most Valuable Skill I’ve Seen Engineers Lose, and Why It Matters Now

This time of year has a way of slowing things down.

As winter settles in and we all spend a little more time with family and friends, there’s often a moment when the noise quiets just enough to think. For most people, I’m sure it’s about the magic of the holidays, time with family and friends, or maybe even a warm-weather vacation. For me, my head wanders to my work. Not the next sprint or the next feature, but what actually matters over the long haul.

This year, that reflection keeps coming back to a simple question:

What really makes a great engineer?

After decades in this industry, I’ve seen tools change, paradigms shift, and entire job descriptions come and go. But I’ve also watched one critical skill slowly fade into the background.

And right now, that skill matters more than ever.

It Isn’t Coding Speed or Tool Knowledge

The most valuable skill I’ve seen engineers lose isn’t typing speed, language fluency, or familiarity with the latest framework.

It’s not PR velocity or anything measured by DORA metrics. It’s definitely not who has the deepest front-end framework expertise.

All of those things are valuable. But something else is more important.

It’s the ability to reason through ambiguity.

When I was coming up, we didn’t have the luxury of abstraction layers everywhere. If something didn’t work, you traced it. You reasoned about it. You figured out why.

I’ve mentioned before that I used to test on algorithms in my hiring assessments. They mattered. Not because engineers would be implementing them every day, but because algorithms expose reasoning, tradeoffs, and comfort with uncertainty.

The final part of my assessment was a four-question story titled “One Bad Day.” In it, engineers were faced with real-world problems and incomplete information. There were no right or wrong answers. What mattered was how they handled uncertainty when confronted with it.

Those questions revealed how someone thinks when there isn’t a clear path forward.

As software evolved, we got very good at assembling systems. We got much less comfortable sitting with ambiguity.

Abstraction Is Powerful, But It Has a Cost

Modern tools are incredible. They let us build faster and bigger than ever before. But they also hide complexity, and when complexity is hidden long enough, people forget it exists.

That’s how we end up with engineers who are productive, but uneasy the moment something doesn’t behave as expected. When the happy path breaks, the thinking muscle hasn’t been exercised.

AI accelerates this trend if we’re not careful.

Why This Skill Matters More Now, Not Less

There’s a fear that AI will do the thinking for us.

I believe the opposite.

AI is very good at producing output. It’s much worse at knowing when that output is wrong, incomplete, or misaligned with intent. That gap is where human reasoning becomes invaluable.

The real present in this new era isn’t faster code generation. It’s the opportunity to refocus engineers on judgment, evaluation, and problem framing.

Those are learned skills. They compound over time. And they don’t disappear when tools change.

The Gift That Actually Lasts

As you head into the end of the year, maybe while you’re opening presents or just enjoying a quieter moment, this is the thing worth investing in.

The greatest gift you can give yourself as an engineer isn’t another tool or certification. It’s the willingness to slow down, sit with ambiguity, and reason your way through it.

That skill never goes out of style.

A Peek Under the Hood, How I Think About Building the Next Generation of Dev Tools

When I first got into software, there were no libraries waiting for us. No package managers. No Stack Overflow. No copy-paste from GitHub.

If you wanted to build something, you built it. Top to bottom.

If I needed to talk to another system, I opened a socket. I connected via TCP. I handled the protocol. If something failed, I debugged it at the wire level. Applications were handcrafted end to end, and you were responsible for everything you shipped.

That experience shaped how I think about software to this day.

From Building Software to Assembling Software

As my career progressed and I started hiring engineers, I noticed something changing. We stopped teaching people how software works and started teaching them how to assemble it.

That’s not necessarily bad, but it does change the skill set.

When I built hiring assessments, one of the things I always tested was algorithms. Not because I expected everyone to be writing sorting routines every day, but because algorithms tell you how someone thinks. They reveal reasoning, tradeoffs, and how a person approaches a problem when there isn’t already a solution handed to them.

Over time, that kind of thinking became less emphasized. We got very good at wiring packages together. We got worse at understanding what was actually happening underneath.

That shift matters more than most people realize.

Automation Isn’t New, Context Is

Long before AI entered the conversation, I used to tell teams the same thing over and over. I can automate almost anything, but we need to start with people.

You let humans run the process first. You iron out the edge cases. You understand where things break. Then you automate the boring, repeatable parts and kick the exceptions back to humans.

That model has worked for me for decades.

What’s new now isn’t automation. What’s new is that software can finally understand a little bit of context. Not perfectly, but enough to participate instead of blindly executing instructions.

That distinction is everything.

The Real Cost of Babysitting Software

At one company, I had a peer who was incredibly good at keeping things running. Customers were happy. Issues were handled quickly. From the outside, everything looked fine.

When he eventually left, I dug into the system and realized how much time had been spent babysitting instead of fixing root problems. Not because he didn’t care, but because there simply weren’t enough hours in the day.

The company didn’t push for deeper fixes because the work was getting done. In reality, they were paying a premium for reactive support instead of investing in durable solutions.

That experience stuck with me.

Software that constantly needs human babysitting isn’t efficient. It’s expensive. And worse, it hides the real cost behind “everything is working.”

How My Thinking Has Changed

Today, I care less about features and more about intent.

Where does intent originate?
How is it preserved as work moves through systems?
What happens when that intent becomes unclear?
And when should software act versus pause and ask for help?

These questions matter more to me now than which framework is trending.

Some principles I won’t compromise on anymore:

  • Tools should preserve intent, not just produce output.
  • Automation without context just accelerates the wrong outcomes.
  • Humans are not a failure mode, they are part of the design.
  • Software should adapt to people, not force people to adapt to it.

Why This Is Finally Possible

For most of my career, software was deterministic because it had to be. That made context preservation incredibly hard.

Now we have systems that can reason, summarize, adapt, and operate with uncertainty. We can design workflows that branch. That pause. That escalate. That involve humans when confidence drops.

This doesn’t replace judgment. It finally gives judgment a place to live inside the system.

A Quiet Tease

I’m working on something that reflects all of this.

It’s shaped by decades of building software the hard way, watching teams struggle with invisible friction, and seeing how often people end up doing work that tools should have handled better.

I’m not ready to talk about it publicly yet.

But if modern dev tools feel powerful and exhausting at the same time, we’re probably thinking about the same problem.

More soon.

From Monochrome to Machine Learning: Reflecting on a Lifetime in Tech Before the Next Leap

The first computer most people encounter today fits in their pocket.
Mine filled most of a desk. Actually, a desk and a printer cabinet next to it.

My very first computer experiences were on our school’s Apple I machines, playing Oregon Trail on either black and white TVs or bright green monochrome monitors. Later at home, in the late 1980s, we got an Epson Equity I+ with a 10 MHz CPU, 640K of RAM, a 10 MB hard drive, a 5.25 inch floppy drive, and an EGA monitor that felt like stepping into full color after years of monochrome. If you lived through that transition, you remember how magical it felt. Not just more pixels, but more possibility.

Since then I have watched wave after wave of transformation reshape software and the world around it.

  • The CPU evolution, from the simplicity of that first 10 MHz machine to modern processing stacks capable of teraflops.
  • Gaming advances from Pac-Man at the arcade or on Atari at home, to Super Mario on Nintendo, from 8 bit to 16 bit, to 64 bit, and eventually to fully immersive 3D experiences.
  • The rise of the internet, starting with dial up BBS systems and rapidly becoming the global information network we rely on today.
  • Communication shifting from letters and postcards to electronic messaging, long before anyone imagined what smartphones would become.
  • Social platforms growing from AOL chatrooms and small forums to worldwide communities where billions share ideas.
  • The mobile phone evolving from a clunky brick attached to a briefcase to a pocket sized computer that dwarfs the power of my first PC.
  • Music and movies becoming instantly accessible. No more waiting for release days or storing shelves full of physical media.
  • Breakthroughs in biology that finally let us map DNA and understand life in new ways.
  • Automation taking form in 3D printing, robotics, and smart home technology.
  • Machine learning taking root, followed by modern generative AI that can now write, reason, and assist in ways we only imagined in science fiction.

And these are just the highlights. After 25 years in the industry and a lifetime of tinkering, the list is a long one.

What is interesting about right now, especially with 2026 on the horizon, is that it feels like another one of those rare pivot points. Except this time the shift is not about faster processors or prettier screens. It is about the relationship between humans and software fundamentally changing.

We are entering an era where tools are not just tools. They are partners. They help us think, reason, and build. They fill gaps. They accelerate ideas. They lift creativity instead of replacing it.

For the first time in my career, I am building something that sits directly in the center of that shift. Something that focuses on how to evolve the bigger picture rather than profit from it. Something designed with everyone in mind, not tied to advancing any particular agenda.

I will be announcing something big very soon for software development. At least, I think it is big. For now, I will simply say this:

Everything I have learned since that Epson Equity, from the GW-BASIC and MS-DOS 3.2 manuals, through distributed computing, microservices, and machine learning, all the way to modern AI, has been quietly converging into a project I have been shaping for a very long time. I just did not realize it until recently.

It is close now.

And once it is ready, I believe it will change how a lot of people think about building software, and possibly grow into something far larger than that.

Rest in Peace, Coach

Still trying to get my head around the Chiefs loss in Super Bowl LV, this morning I get an alert on my phone that Marty Schottenheimer, long time coach of the Kansas City Chiefs, has passed away at the age of 77 due to complications of early onset Alzheimer’s Disease.

I wrote about the coach and his battle with this disease 5 years ago in my article titled “One Play at a Time“. Today it is very sad news to hear that he has passed away. I just wanted to write something to say, “Rest in peace” to him and think about his family at this time. Coach had a giant family in Chiefs Kingdom, and I know he will be missed by many.

To me, Marty was the epitome of a football coach. He looked like a coach. He sounded like a coach. You could watch the Chiefs play and always see the man coaching. He was constantly talking to players and trying to motivate them as men. He was a great coach. He won over 200 games in his career. He only had two losing seasons across a head coaching career with 4 NFL teams.

Marty was a good as it gets when it comes to being a coach, a leader, and a man. He was a leader of men. He will truly be missed. I will always remember him and think fond thoughts of the man that taught me the game of football. My dad got me into watching the 49ers in the 1980s. In the 1990s, my dad introduced me to Chiefs football with Marty, and my views on football were forever changed.

Rest in peace, Coach. You earned it.

Virtually Yours!

Due to the COVID-19 global pandemic we are all living through at this time, I’ve decided to grow my side hustle into a real business. The name of the company is Transcendent Software. Don’t feel obligated to click through or feel like I’m trolling you for my services. For some background, I originally started this business in 2009 to make some extra money and help some friends with different projects from time to time as things came up. My goal with my career in technology has always been to make the world a better place through the use of technology, so this fit right in with my personal mission statement.

One of the service offerings I am most excited about is a Virtual CIO / Virtual CTO Service. If you are not familiar with this, it is sometimes referred to as vCIO, Fractional CIO, Part-time CIO, or something close to that. The service is geared for small to mid-sized businesses. I would be able to serve as CIO or CTO for several companies at one time. We would agree to a fee and hour limitations, but I could help them out and eliminate the need for a full-time employee when it would be very cumbersome for them to take that salary on. The nice thing is that I would still fulfill every aspect of leading an IT department, but not be as involved in the day-to-day part of the business.

If you’ve been reading me for any time throughout my career and my several attempts at blogs, I have spent the better part of my career as a CTO (Chief Technology Officer). When I wasn’t that, I usually carried IT Manager or IT Director in my title, because the management side was part of my job for almost my entire career.

I started my career as a Software Engineer I, but within a year on the job I was really starting to design our systems, and very shortly after took the title Chief Software Architect. When I was given the responsibility of running the IT department as well, I was then IT Manager / Chief Software Architect and eventually Chief Technology Officer.

So, back to the Virtual CIO / Virtual CTO Service, I am very excited to be offering this service to small to mid-sized businesses. It gives me the opportunity to take what I’ve done for several companies over the years and be able to do it for even more companies in many different industries. I think the role can be applied into any business, even businesses you wouldn’t think would be in need of technology leadership. Another thing I am excited about is that eventually, it will allow me to bring on other resources to do the same role and keep pushing my mission of making the world a better place through the use of technology one vCIO gig at a time! I’m psyched and ready to go!

The Right Stuff

I know it’s been a long time since I last posted, but I think it is relevant to discuss training and education, especially in software development. This has been a topic weighing on my mind a lot the past several years.

In the past 20 years since I made the leap into my career path, I have witnessed many changes in technology. The microprocessor and the internet have taken over nearly every facet of our daily lives. It is quite remarkable where we came from to where we are today, and to think it has only been that short of a time while I’ve been a professional.

When I first started writing software, we didn’t have the rich toolsets we have now. We had some very basic compiler suites, or command line compilation using a text editor to edit the source files. We also didn’t have the libraries available today. Most problems we had to solve from scratch. Finally, to top it off, we didn’t have Google to save the day when we needed that snippet of code to hybridize into our own solution. We had to know how to write algorithms to solve problems. The solutions weren’t handed to us, and we weren’t coddled to the answer via great tools that auto complete our lines of code, and format our code and give us instant feedback to errors or omissions without compilation and trial and error.

I may sound like an codgidy old man, and maybe I am, but I think having to solve problems from scratch taught my generation a lot about problem solving. I think this is the magic bullet that is missing from the college curriculum, work training programs, or coding bootcamps. I think all of those things are great, and there is some foundational stuff there, but these folks are missing out on algorithm design. This is the foundation for which all software works. You have to be able to solve problems. You can’t just rely on Google or great tools to solve them for you.

So, here I plead to anyone affiliated with these software development educational programs, spend some time on bubble sort or binary search. Teach your students about how to extract a subset of text from a string, or how to increment numbers exponentially. Spend some time on conditional logic, and order of operation. All of these things have value, and while pretty basic, they are the building blocks that we are skipping over to get to the cool IDE or the latest tool or JavaScript library.

What Yoda taught me about being a mentor

Like I mentioned in my blog post, What I’ve Learned from Mr. Miyagi, the elderly, wise, green alien creature from the Star Wars saga, Yoda, was another model for how I learned to be a great mentor. I didn’t know it at the time, but while I watched The Empire Strikes Back when I was a young boy, I was learning many life skills while I dreamed of being Luke Skywalker flying an X-Wing, commanding the force, taking on the bad guys, and learning to overcome the dark side, and in particular, Darth Vader.

Yoda was introduced into the story when Luke Skywalker crash lands into Dagobah, a swampy forest planet. After a moment trying to gather his surroundings, Yoda arrives in scene as a quirky, curious, alien creature who speaks in broken english, but still shows some sarcastic and quippy wisdom when he speaks. For instance, when Yoda asks Luke why he is there, after some banter, Luke states, “I’m looking for a great warrior.” Yoda immediately in his broken english language states, “Great warrior? War’s not make one great.”

You can watch the entire dialog above, but the truth of the introduction is that Luke is overconfident, and almost cocky. He has many thoughts about how everything works, how he is supposed to become a Jedi Knight, how his destiny is supposed to pan out, and in reality, he has much growing up to do. Luke is like many of us when we start out on our career paths. We have a small education and maybe some bits and pieces of real world experience, but in practice, we don’t have much experience at all.

Many of us, when seeking mentorship, are ready to receive it. Luke, on the other hand, was not. He argues with Yoda and Obi Wan Kenobi’s force ghost about whether he is ready to be a Jedi Knight or not. Eventually, they all agree he will finish what he starts and become the Jedi Knight he is meant to become. This submission of will is important, because being a good mentee is about submitting to the process, knowing that in the future you’ll be able to expand your wings and fly on your own.

Yoda trained Luke on calming his mind and approaching challenges in a clear frame of mind and to stay focused. He also taught Luke small concepts and allowed him to build upon them later, even though he didn’t know why he was doing them in the first place. This idea of foundational building was something I explored with how Mr. Miyagi trained Daniel in The Karate Kid. This was the same with Yoda. He started by having Luke move small objects with the force. Later in the training scenes, he had Luke try and move his X-Wing from the swamp as it began to sink. He utters some of his best lines during this scene, “No. Try not. Do or do not, there is no try.” or Luke saying, “I don’t believe it,” when Yoda uses the force to move his X-Wing from the swamp and Yoda replies, “That is why you fail.”

I use these same techniques when I mentor. I often only give out bite size pieces of information which are enough to get the job at hand completed. This allows my mentees to become masters of that technique faster, and later one we can connect the dots. Keeping things simple is a core value of mine. Not only is it the best way to keep things progressing, but there are many times I learn new techniques as well. As I have explored in many of my previous posts, including Teach a Man To Fish, I point out that the best leaders and mentors surround themselves with smart people, and allow them permission to fail. Everyone gets an opportunity for growth this way.

In conclusion, Yoda and many other wise sages in many movies taught me much about how I mentor today. Lessons such as keeping things simple, staying focused and submitting to the process are all key to growth. We will explore this more in the future, but for now, venture out and try these things out for your teams.  May the force be with you.

How to deploy an ASP.NET app to the cloud from Visual Studio Web Deploy – Comparing Azure vs AWS vs Google Compute

Introduction

So, you’re a Rockstar developer and you’ve constructed an app that is primed and ready to be the next big thing. All that stands between you and millions of users is deploying it to the cloud. While you’ve narrowed your choices to Microsoft Azure, Amazon Web Services (AWS), or Google Compute, you just aren’t sure about where to park your creation for the long haul. After all, you expect to be publishing new features and updates daily for quite some time. The future home of your masterpiece can’t slow you down on your quest to conquer the computing universe! You’ve done your pricing research and all three options are comparable, so really the decision comes down to first time configuration ease, first time deploy time, subsequent deploy times, and any other perks that might save you steps in the future as this juggernaut scales.

Well my friend, this guide was written for you!

Prerequisites

Since you probably aren’t going to hand over the source code to your ultimate creation, for purposes of demonstration, we will call upon our old reliable and trusty friend, “Hello World”, written in C#, ASP.NET Core, and utilizing Visual Studio 2015.

This guide assumes you have accounts setup at Azure, AWS and Google Compute. For Azure, you’ll want to install the latest Azure SDK for Visual Studio 2015. For .NET Core, make sure you have installed Visual Studio Update 3 or greater. It’s also a good idea to do all of your updates for Visual Studio under Extensions and Updates.

Azure

First, we will deploy our web app to Microsoft Azure. One nice thing about deploying to Microsoft’s cloud service when using Microsoft’s development studio is that the two are very nicely integrated. The first advantage that Azure has over any other platform is in configuration. When you open Visual Studio to build your web app, click “New Project…”:

New Project

Next, select Templates->Visual C#->.NET Core->ASP.NET Core Web Application (.NET Core).  Uncheck “Add Application Insights to project” and give your project the name “HelloWorldAzure”:

NewProject_HelloWorldAzure

On the next screen, select “Web Application” and you’ll see in the bottom right quadrant of the screen, “Host in the cloud” is checked.  This is great, because this helps us configure our cloud deployment without having to bounce between interfaces.

Web Application

After clicking “OK”, the following screen loads. You’ll notice everything will preselect and fill.  A unique name will be generated for your Web App Name. You can change this to whatever you want it to be as long as it is unique. Your subscription will preselect from the list, however if you have multiple subscriptions you’ll need to select the correct one. If already you already have a Resource Group and App Service Plan created in the same region, they will preselect.  If not, you can select the correct one(s) or create new ones by clicking “New…”. For this example, we’ll create a new resource group and app service plan.

Create App Service

After I click “New…” on Resource Group, it asks for me to give the Resource Group a new name.  I’ll choose HelloWorldAzureResourceGroup.  After I click “New…” on App Service Plan, I get the following dialogue prepopulated with all of the options I need, so I’ll click “OK”.

Configure App Service.png

Now that you see these changes to the Create App Service dialogue:

App Service Resource Group

I now click the Create button and get a familiar progress dialogue:

Creating Project HelloWorldAzure

At the completion of the progress dialog, our project is now created. To make this a real “Hello World” web app, navigate to the Index.cshtml view under Home and replace the HTML in the view with the following and save.

<h1>Hello World!</h1>

Now, it’s time to get our project deployed to Azure. First, right click on the project and click “Publish…”.

Publish to Azure

You’ll notice right away that all of the setup work took and the project is ready to publish.

Publish to Azure Dialog

As long as you don’t need to reconfigure you are safe to click Publish. After waiting a minute or so, your environment will be created in Azure and your project will be deployed. You’ll see Publish Succeeded in the bottom left corner of your Visual Studio and a browser will open with your website in it deployed on an azurewebsites.net domain.

Hello World Browser View

There are many more Azure features to explore, but that summarizes the basics of getting a project published to the cloud.

AWS and Google Compute

To get a “Hello World” project ready for AWS or Google Compute, we need to bypass all of the Microsoft Azure platform integration during project creation. First start by reading the beginning of the Azure guide above, but name the project HelloWorld instead of HelloWorldAzure and when prompted to “Host in the cloud” uncheck that box.

Host in Cloud disabled

I now click the OK button and get a familiar progress dialogue:

Creating Project HelloWorld

At the completion of the progress dialog, our project is now created. Just like in our Azure setup, to make this a real “Hello World” web app, navigate to the Index.cshtml view under Home and replace the HTML in the view with the following and save.

<h1>Hello World!</h1>

At this point, our project is now ready to deploy, but the process is different for each platform, while the overall process is going to be the same. First, we need to create a compute instance on each platform. Next, we need to configure that instance to receive our web application. Then we configure our application for deploying to that instance. Finally, we deploy to the instance by using the Publish wizard like we did in the Azure example, but our new publish profile will target our compute instance and not Azure.

AWS

The way we are going to get our application to AWS is to build an AWS EC2 instance and configure it for Web Deploy. To do this, we need to sign into our AWS Console. From here, click Services->EC2.

AWS EC2

Click the blue “Launch Instance” button:

AWS Launch Instance

Scroll about halfway down the list and select:

AWS Windows Server Selection

By default, the AWS EC2 wizard will select t2.micro. This is fine for our purposes, but you can pick whichever computing power you think you’ll need here. Remember that you are building a virtual machine to run as a web server, so it needs to be able to support your application. In the future, you can tear it down and replace it, but these are considerations you’ll want to think through.

AWS Created Server Progress

Next, you’ll need to configure your webserver. Click “Next: Configure Instance Details”.

AWS Config Inst Button

Here you can configure many details about your web application, including number of instances and other details. For our purposes, we will leave the defaults and click “Next: Add Storage”.

AWS Add Storage Button

Again, the defaults here are fine for our purposes, but you might want more or less storage, more volumes, different speeds, etc.. These are all things to consider. Click “Next: Add Tags”.

AWS Add Tags Button

On this screen you can assign Tags to your EC2 instance. Tags are the way in AWS to help you identify your resources and categorize them for different purposes. For our example, click “Next: Configure Security Group”.

AWS Config Sec Group Button

Finally, a screen we need to affect to get our app working. Since we are building a web server, we need to allow HTTP traffic at minimum, but we’ll also add web deploy traffic too. If you are going to configure your application for SSL/TLS or other ports and traffic, you’ll have more work to do here.

First, you’ll notice RDP is added already. This rule allows you to be able to use Remote Desktop to remotely administer your server. Leave this in there, we’ll need that access later, but change the Source to Anywhere.

Next, click “Add Rule” to add our HTTP rule. Scroll to HTTP in the drop down and that is all we need. It automatically sets up port 80, which is the default HTTP port. Again, use Source Anywhere.

For web deploy, click “Add Rule” and leave it as Custom TCP Rule. For the Port Range, pick 8172, which is what web deploy listens on. You guessed it, set the Source to Anywhere as well.

At this point, your screen should look like:

AWS Config Sec Group Screen

Click the blue “Review and Launch” button. On the next screen you can review what you have configured. Once you are satisfied, you can click the blue “Launch” button.

AWS Review Instance Screen

You’ll now be prompted to “Select an existing key pair or create a new key pair”. Once you’ve created a key pair, you can select it, but since this is our first time running through, we’ll “Create a new key pair”. To do so, give the key pair a name and click “Download Key Pair” to download the PEM file. You need to do this, because you won’t be able to do it later. You’ll need this file to be able to access your instance after it is created.

AWS Select Key Pair

Once you download your PEM file and store it in a safe place, click the blue “Launch Instances” button. It’ll take a few minutes, but your instance will be created. Click the blue “View Instances” button at the bottom of the screen.

AWS View Inst Button

Next you’ll see your instance “Initializing” on the next screen:

AWS Inst Init Screen

Once the Status changes from “Initializing” to “2/2 checks passed”, your instance is ready to connect to and finish the configuration.

AWS Inst Init Passed Screen

At this point, we will RDP to the server. To do this, right click on the instance and click “Connect”.

AWS Connect Inst Screen

Click “Download Remote Desktop File”. The file will save by default to your downloads on your computer. Next, click “Get Password”. Now the PEM file we downloaded comes into play. You can either copy and paste the contents of the file into the next dialog or browse to the file and upload it. Either way, once you have it in the text box on the screen, click “Decrypt Password”.

AWS Connect Inst Password Screen

Now you can get your password to use for the Administrator account. Open the RDP file and connect using this information. You’ll be prompted to accept the security certificate. Click “Yes”.

Because both AWS and Google Compute are so similar once you connect to the server to configure it, I’ll explain how to build a Google Compute instance next. You can skip to the Configure IIS headling if this doesn’t interest you.

Google Compute

To create a Google Compute instance, log in to your Google Compute Console. Click “Create Project” from the drop down at the top. You will be prompted to give your project a name. We’ll call this project “Hello World”. Google Compute will assign a project ID that is unique to this project.

GC New Project

Click “CREATE” and after about a minute you’ll be taken to the dashboard for your project.

GC Dashboard

Click the hamburger menu (GC Hamburger) at the top left and click:

GC Cloud Launcher Button

From the Cloud Launcher, scroll to OS and click:

GC Server Selection

Then on the next screen click the blue “Launch on Compute Engine” button.

GC Server Selection Win

You’ll now be prompted to select your billing account.

GC Billing Account

Select it from the list and click “SET ACCOUNT”. You are now in the Google Compute Engine and your server is initializing:

GC VM Instances

Wait about another minute or so and you’ll be prompted to complete the setup. From this screen, you can change any settings you want, but for this example, check Allow HTTP traffic. If you were configuring this server for SSL/TLS you’d want to also check Allow HTTPS traffic too.

GC Firewall

Once you’ve done this, click the blue “Create” button.

GC You be billed

After clicking, you’ll be taken back to the VM Instances page. Creating your new server takes a few minutes. You can watch and wait on this screen.

GC Server building

Your sever is configured when it gets the green checkmark:

GC server configured

Now that our server is created, we need to open up a port in the network to allow Web Deploy. Click on the server name to take you to the edit screen. Scroll down to the network section and click the “default” link.

GC more firewall

Scroll down to your firewall rules and click “Add firewall rule”.

GC FW rules

Fill out your rule just like this:

GC create FW rule

When you are finished, click the blue Create button. Then click the back arrow 2 times to get you back to the VM Instances screen.

At this point, we need to configure a Windows account, so click on the server name to take you to the edit screen. Click on “Create or reset Windows password” at the top of the page.

GC RDP pass
GC set win pass

Click “SET” and on the next screen copy the password from the dialog and click “CLOSE”.

GC new win pass

Now that you have a windows account, you need to download the RDP file to connect to the server. To do this, click the RDP dropdown on the VM instances edit screen for your server. Then click “Download the RDP file”.

GC download rdp file

You may be prompted to login to your Google account again, but afterwards the file will download to your Downloads folder. Move this file to another location and open it. Use the username and password you created in the previous steps. You’ll be prompted to accept the security certificate. Click “Yes”.

Configure IIS

Now that you have your compute instance created in either AWS or Google Compute and you have logged into your server, you need to configure your server to host your website. First, you need to go to Server Manager and click on Local Server.  From the Manage menu, select “Add Roles and Features”. This opens the Add Roles and Features Wizard.

Server Config IIS

From here, click Next, then select Role-based or feature-based installation and click Next. On the next screen, select “Select a server from the server pool” and click Next.

From this screen you’ll need to select “Web Server” then click Add Features.

Server Select Roles
Server Select Roles dialog

After that, click Next. On the next screen select ASP.NET 4.5 under .NET Framework 4.5 Features. We’ll install .NET Core on a different step.

Server Select Roles net

Click Next. Then click Next on the following screen. Then you will have the Web Server installation tree. Click Next on this screen. Then click Install on the following screen.

Server Select Roles confirm

Wait about one minute and the installation will finish.  Click Close.

Server Select Roles complete

Next we need to get ASP.NET Core installed, as well as Web Deploy. Open Internet Explorer and navigate to https://www.microsoft.com/web/downloads/platform.aspx to download Microsoft Web Platform Installer.

After you install the Web Platform Installer, it’ll open with a screen like this:

Server WPI.png

Search for Web Deploy 3.6 for Hosting Servers:

Click Add, then click Install, then click “I Accept”.

After a few minutes, you’ll see this screen and see that it succeeded.

Server WPI complete.png

Click Finish, then click Exit to exit the Web Platform Installer.

Now open Internet Explorer and download and run the latest ASP.NET Core Server Hosting Bundle installation from https://go.microsoft.com/fwlink/?linkid=837808.

Follow the wizard to install. After the installation is complete, reboot your server.

Deploy to the Cloud

Regardless of if you chose AWS or Google Compute, now we need to configure our application to deploy to our compute instance.

In Visual Studio, right click on the project name and click Publish.

web deploy publish

This opens the Publish wizard. Select Custom and then give your publish profile a name. I’ll use CloudDeploy as mine.

web deploy publish name.png

Click OK and for Publish method pick Web Deploy.

web deploy publish server info

For Server, put in the IP address or host name of the compute instance. For “Site name” put in Default Web Site. For “User name” put in the user name (probably Administrator) and for Password put in the password. Check “Save password” and click “Validate Connection”.

At this point you will have to validate a certificate for Web Deploy. Be sure and check “Save this certificate for future sessions of Visual Studio”.

web deploy publish cert error.png

If everything went well so far, you’ll see:

web deploy publish cert error validate

Click Next. On this screen expand “File Publish Options” and check “Remove additional files at destination”.  This will be useful when publishing updates to your application so you aren’t left with remnants of previous deployments.

web deploy publish remove old

Now click Publish.  The publish will most likely error with an error code of ERROR_CERTIFICATE_VALIDATION_FAILED. This is expected because of the untrusted certificate issued by the compute instance. In your Solution Explorer, find your publish profile file with the .pubxml file extension. Open this, and add the following on a new line before the </PropertyGroup> tag.

<AllowUntrustedCertificate>True</AllowUntrustedCertificate>

Save the file, close it, right click on your project and click Publish again. Now when you click the Publish button the publish will succeed. Open your IP address or server host name in your browser and you should see your application:

Hello World Browser View not azure

Voila! You’re done! You have succeeded in building a web server on your platform of choice and deploying your application to the cloud.

Conclusion

Congratulations! You are now an expert on deploying your ASP.NET Core web application to Microsoft Azure, AWS, and Google Compute. As you can see, all three systems, with the proper configuration can accept your web application from Web Deploy and deploy and run with ease.

Comparing the different platforms, there is really not very much difference in configuration between AWS and Google Compute. They both are very powerful, and give you good wizards to walk through the setup on their websites. The only downside is having to RDP to the server to configure it, but these things can be scripted and probably should be scripted using a system like Chef or Jenkins to reduce user error.

Microsoft Azure seems to be the most direct way to deploy, but you’d expect that since you are using Microsoft Visual Studio to configure and deploy the application. Azure, from it’s tight integration, doesn’t give you the server level granular control right out of the box using an App Service, like we had on the other two platforms. Azure does have this capability using Web Roles or just building a VM and installing .NET Core and Web Deploy on the server like we did on the other platforms. Likewise, there are volumes of Chef recipes or different scripts online to build and tear down AWS or Google Compute servers.

Finally, your choice should come down to cost, preference and possibly geography, although all three of these platforms have great worldwide geographical coverage. You really can’t lose, so get out and take advantage of what ASP.NET Core and the cloud have to offer in rapid development, continuous integration and scale! Happy coding!

What I’ve Learned From Mr. Miyagi

Like many kids who grew up in the 1980’s, I learned a lot about life from two wise sages. First, was Yoda, the green, grumpy, 900 year old Jedi master, who trained Luke Skywalker to reach his potential and overcome against all odds to destroy the dark side forever (Well, at least until Episode VII came out in 2015, because the dark side somehow came back again). I often quote Yoda to my wife’s dismay with, “No. Try not. Do or do not. There is no try.”

We’ll tackle Yoda in a future post, but in the interest of staying more grounded in reality, I’d like to focus on my second choice, and that is Mr. Kesuke Miyagi or Mr. Nariyoshi Miyagi, as he went by both names in the movie series. For the purposes of how I knew him, Daniel Laruso, his student in most of the movies, called him Mr. Miyagi, so that is how I knew him as well.

Mr. Miyagi was a fictional character, but the things he did and said in the three Karate Kid movies (I know there was a fourth one much later and then a remake after Pat Morita died featuring Jackie Chan as the Karate mentor) were very much things that shaped who I am and how I live my own life, even today. I constantly find myself quoting Mr. Miyagi as well. “Walk on the road? Walk right side safe. Walk left side safe. Walk middle, sooner or later get squished just like grape.”

Mr. Miyagi seemed to always have a solution, but I think it was just a confidence in his response, even if he didn’t know how the outcome might play out. In the first movie, there was a scene on the beach where some racist drunk guys didn’t want to move from their spot so Mr. Miyagi and Daniel could leave. They had taken up shop on Mr. Miyagi’s truck and had placed several empty beer bottles there. Mr. Miyagi asks them to remove the bottles so they can leave and they refuse. He then proceeds to Karate chop the beer bottles in half, and the guys remove them and scurry off. Daniel asks Mr. Miyagi how he did that, and he simply replies, “I don’t know. First time.” You can watch below, skip ahead to about 2:36 for the scene.

This scene is perfect Mr. Miyagi with a little humor and humility, simplicity and yet in complete control. This is a theme with Mr. Miyagi throughout the entire series. Another scene that demonstrates this is when he takes Daniel to the Cobra Kai dojo to talk to the bully kids and their sensei in hopes that they might leave Daniel alone. When Mr. Miyagi realizes this won’t happen he volunteers Daniel to fight in the All Valley Karate Tournament in return for no more bullying. The sensei agrees. After leaving Daniel is furious that he has to fight, and Mr. Miyagi says something to the effect of, “I just saved you two months beatings!”

Mr. Miyagi taught Daniel lessons using cryptic methods, but it all came back to simplicity. I’m sure nearly everyone knows “Wax on. Wax off.” or “Sand the floor.” or “Paint the fence.” or “Side to side”. These being his way of instructing Daniel in the basics of self defense. He also had him do manual labor to build strength and endurance.

Mr. Miyagi understood how to live a rewarding life, even though you knew throughout the films that he struggled with this himself. He was an immigrant and veteran of World War II. He lost his wife and unborn child during the time he was away at war and never really let go of this, and while they never stated it directly in the movie, they definitely implied he probably battled some sort of alcohol abuse grieving these losses. He at least commemorates the anniversary each year by dressing up in his military uniform and by getting hammered to the point he passes out. Daniel finds him during an anniversary and sees a side of his friend and mentor to show he is just a man with flaws who is doing the best he can.

In the second movie, we discover that Mr. Miyagi also had a relationship before he left Okinawa. He and his best friend were going to fight to the death over a woman, and Mr. Miyagi knew he couldn’t kill his friend, so he gave up his love and left the island. When he returns he finds that he still loves her and she never married and never stopped loving him either. Of course, as these things go, he leaves to go back home at the end, but he and his friend patch up their relationship before he leaves, and all is well (I guess?).

Mr. Miyagi, while a man with flaws, also shows great wisdom in the entirety of the series (even the fourth film I suppose). He says statements of simplicity and devises simple challenges to get his points across and be the best mentor and friend to Daniel he can be. As a leader, there is much to be learned from Mr. Miyagi’s approach to leadership. Keeping things simple is often the best way to empower those you lead to take ownership themselves and become the best they can be while you nudge them in the right direction from time to time.

One Play at a Time

Today brings sad news that former NFL head coach, Marty Schottenheimer, is suffering from early onset Alzheimer’s Disease. There are plenty of news sources reporting that he has been suffering from this terrible disease now for about five years.

Legendary NFL Coach Marty Schottenheimer Selling Carolina Mansion ...

As a Kansas Citian who is still in his 30’s (barely), my formative years were spent watching Marty lead the Kansas City Chiefs using awe inspiring quotes about getting the gleam, igniting the rocket ship, or taking it one play at a time. His voice was familiar to me, as every time I turned on the radio or television, I couldn’t escape his voice saying, “Nothing stops a Trane”, as the spokesperson of Trane HVAC systems. His voice was so familiar he seemed like someone I knew, like a long lost uncle.

Marty was an iconic figure in my mind and to me was the epitome of a head coach. He was known for Martyball, with his run dominated offense and outstanding defenses. He even got a polka song written for him! He led talented and not so talented teams to really good records. He only had two losing seasons in his career, his final one in Kansas City in 1998, where the promising season derailed and finished at 7-9 and his second season in San Diego in 2003, where they went 4-12, but followed that record in 2004 with a 12-4 record and first place finish in the AFC West.

Schottenheimer smitten with Thomas from the start - News - The ...

With all of his success, he still kept things very simple. He was very focused on the task at hand and didn’t get caught up in looking backwards or forwards. This is something I try and do in my career and life. In any situation, you only have control over your next action. You can’t hit the undo button and get another shot at what you already did and you can’t skip forward and change the future.

Marty Schottenheimer's congratulatory message for Andy Reid | The ...

This is the lesson that I learned by watching Marty Schottenheimer coach the Kansas City Chiefs in the 90’s. His teams were so good at moving onto the next play and not dwelling on the past. I can recall countless times I watched defensive stands, last second field goals, blocked kicks or kick returns for a win. If you think of all of the times you have failed before, you’ll never be prepared to succeed when called upon. This is what Marty represents to me. He now has an incredible fight ahead of him as he undergoes experimental treatments and continuing loss of his faculties as this disease progresses. Knowing Marty from being the fanatic observer I was, I know he will continue to live his life one day at a time and appreciate every moment, because that is all he can do.

Go get ’em coach!