Why Contexts Matter

​One of the words you’ll see *a lot* in these posts is ​context​.

Context is probably the most important word when you’re running a team, or you’re an architect, or in general you just want to enact change on your team or your organization.

There’s a lot of advice out there about ‘best practices’, and generally that advice lacks ​context.

​In your business, your team, and even in this moment in time, you exist in a particular set of contexts:

Social Context: What is the social structure of your team? Who gets along with whom? Who has lunch together? Who does everyone tolerate but not really ​talk to​?  Who if they left today would make the biggest hole socially?

Financial Context: Has your business given you a raise in the past year?  Did it track inflation?  Was it a 1-2% raise?  Did your company make its sales goals last quarter? Last year?  When’s the last time you asked about the financial health of the company? Do people even do that in your company? Are there all-hands meetings where the financials are brought up? Do they talk about profit or just revenue?  What’s your run rate?  What does it take to get a book in your company? Any book related to your job? What does it take to get a conference approved? A new piece of software?  Is pay a big secret? Do you know what your coworkers make?​ How long can projects last before they’re considered a failure?

Technical Context: How does your team and business feel about the word ​legacy​? Is your software considered ​legacy ​or ​modern​? How do team members feel about making changes to your system? What did the last big project feel like? Did it succeed? fail? What caused it to fail? What helped it succeed?

Cultural Context (can also be called “Political Context”): Who gets ahead and how? Who is rewarded?  Why was the last person fired? Do you know? Does anyone? What’s the turnover rate, voluntary and involuntary? Does the messenger routinely get shot?  How long does it take you to hire? To fire?  Do you have yearly reviews? How are they conducted?  

​Business Context​: What’s your team’s business model? Your company’s?  How does the code you write get translated into value? Is your team considered a profit center or a cost center? (Do you make the business money or cost the business money with each new thing you build?)  If the former, is your value creation axis centered around saving money or making money? How do new initiatives get approved? Who has the easiest time getting new initiatives approved? Who has the hardest?  Quite simply: Who holds the power in your chain of command? Is it the person who is in charge by title? or is there a shadow chain of command? People who have the influence but not the title? Is your boss or your boss’s boss a key decision maker or do they report to the key decision maker?  Does your CTO sit on your company’s board? If not, who does besides your CEO?


Why do all these questions matter?

They matter because whether we realize it or not, all architectural decisions your team makes has to take all of these contexts into account.  Let’s say for the sake of this discussion that you want to ​modernize​ your .NET application. Maybe move it to .NET Core, maybe containerize it, maybe even split it up into microservices.  All of these questions matter, because they help you decide what you ​can​feasibly do​. If a project that last longer than three months is culturally or fiscally shunned, then you’re going to need to find a way to make a splash in 3 months, something that will help the business respond ​positively​ to the changes you want and need to make.  Technical decisions aren’t simply technical decisions. They’re decisions that are made with all these questions in mind, because change — technological change — is a tactic to fulfill a goal or improve one or more of these contexts. If it’s not made with these contexts in mind, it’s busy work at best, and damaging to your organization and reputation at worst.

And most importantly, if you don’t have the pulse of your organization — if you can’t readily answer these questions, then you’re ignoring the part of the organization that ultimately dictates success and failure: the human part.

Organic Design or Planned Design?

Do you want all data Up To Date or The Best We Know right now?
Do you want to Wait or Work?
Do you want to Ask or Know?
​Do you want action Soon or Now?
Do you want action to be Global or Local?
When building new features, do you care more about Velocity or Repeatability?

Microservices design is about tradeoffs, and answering those questions will help you decide whether you want synchronous communication or move to an event-driven architecture.

[Last Week in .NET #53] – Requiem for a use case

🕵️‍♀️ Using Secrets in .NET Core Console Applications Console applications remain one of the least documented parts of the .NET Core experience (compared to ASP.NET), and I’m always happy to share content on that topic. Why are console applications important? If you’re in an event-driven microservices world in .NET, using a Console application to connect to your message queue and receive messages and put them into a database of some sort is an integral part of the work; as are services that respond to events but don’t necessarily expose HTTP APIs.

🔨 Erik J markets his EF Core Power Tools Visual Studio Extension I did not know this existed. I mean, I vaguely had heard of it, but had no idea what EF Core Power Tools would even do. Luckily Erik shared a link to his extension, which according to the download page, lets you Reverse engineer a context and classes from an existing SQL Server Database, has diagramming support, right-click migration support in Visual Studio, and more.

🔌 The .NET Download Site had an outage last week and there is not, and I quote, “There is no workaround using Azure DevOps.”
Can you imagine the protocols Microsoft put in place to push Azure at all times?

👨‍💼 “Mention Azure.”
👨‍💻”But sir, this is an outage on our public website.”
👨‍💼”MENTION AZURE.”

🦜 David Fowler tweets about some new additions to ASP.NET in C# 10 and .NET Core 6: Default Global Usings, File Scoped Namespaces, and a “minimal” Hosting API.

🐈 Nicole Express blogs about the cause and fix for a long standing ALF Bug. Yes. That adorable animatronic 80s TV star that had its own movie and video game, and liked to eat cats.

🧟‍♂️ What if Github Copilot worked like a real programmer Not listed: Copilot engaging in a flame war over whether The Last Jedi was the worst Star Wars movie ever made, and reminding other programmers that programming is a meritocracy, while failing to see how self-serving that statement is. This is satire, of course. The Last Jedi is arguably the best Star Wars movie ever made.

🍪 If You use Chocolately, a fresh install of Visual Studio can inadvertantly nuke your nuget package source configuration oops.

🐢 How To: Use Azure AD Powershell to Work With Extension Properties (User Attributes) This blog post does what it says on the tin, but for you the use case here is you need to use Powershell to retrieve and set extension properties from Azure AD. If you know what that sentence means, please reach out and let me know. Thanks.

🐿 On July 27th, 1993, Windows NT 3.1 was released. I know it wasn’t NT, but Windows 3.1 was glorious, but only for me because that’s the first OS I played Chip’s Challenge on. Also Chip’s Challenge and its sequel is available on Steam. You’re welcome.

❤️ Brent Ozar has released an update to his First Responder and Consultant’s Toolkit. Ok, naming aside. If you use SQL Server, and you’re a DBA or even a C# developer that needs to interact with Sql Server,you will want to download, install, and run these scripts. They’re very useful in understanding performance issues in SQL Server, in understanding if your table structure and indexes are optimal, and helping you resolve emergent issues with SQL Server. These scripts should be in every team’s toolkit that uses SQL Server.

🍭David Lee Roth retells the famous “brown M&Ms” story that Van Halen used in its Rider. The reason they used it is not what you think. It’s well worth your time to listen to. Thanks to @textfiles on Twitter for sharing a link to this.

🆙 Visual Studio 2022 will not be able to build .NET Applications that target anything in .NET 4 before .NET 4.5.2. The writing is on the wall: Upgrade your framework, folks.

📢 Dapr v1.3 has been released and this minor update includes several minor updates but still no explanation of why drop-in-replacement architecture is such a ‘win’. Developing to the Lowest Common Denominator gets you… The most boring and undifferentiated features of all of your options.

✈️ I asked the CEO of Jetbrains for an update to the Solarwinds/Team city mess and he obliged. If you’re new to this, the NYTimes ran an article that claimed — anonymously, of course — that TeamCity was why the Solarwinds attack happened. Because of that, some companies and organizations have dropped using Jetbrains products. We hadn’t heard from the CEO of Jetbrains since their ‘update’ several months ago, and I asked them to let us know if anything ahd changed. They obliged by reinforcing that the NYTimes article probably shouldn’t have been published in the first place.

🔈 .NET Conf Call for Speakers is Open I have submitted a session that will undoubtedly be turned down because I don’t mention Azure in the abstract at all.

🤯 C# 10 will also support var as a lambda expression initializer, and I’ve hit the point where I’m now souring on var. I have no idea what that type is or well be, and I can’t see how that’s a good thing. @ me @gortok on twitter if you think I’m wrong, and why.

💸 Marten, the Generic Host Builder in .Net Core, and why this could be the golden age for OSS in .Net. Jeremy Miller spells out why the addition of Generic Host Builder has made his life better as an OSS Maintainer. Personally I think the problems with OSS in .NET are mostly commercial interference by Microsoft; and I’m not so sure we can fix that.

😥 Abel Wang passed away last week He was a Principal Program Manager, and Technical Assistant to the CTO of Azure. Take a moment and read the accompanying link to learn more about Abel and his life.

The virtues of Autonomy

Pretty often when teams start out with microservices; they split up a monolith and make the intra-monolith calls into remote RPC calls. Or, in every day terms: They put an HTTP API over those old function calls and now call that instead.

Why would anyone do that? What do you gain?

You’re still coupled to that service being available.

You don’t have request autonomy.

You’ve added extra network latency and another point of failure.

Sure you can scale that new service; but the same problems remain.


That’s one of the reasons why if you’re going to pursue microservices; you should pursue an architecture that allows each service to stay autonomous.


Event Driven Architecture does just that.

I’m hosting a webinar on August 18, 2021 at 12pm EDT titled “Event Driven Systems: Bringing Order to Chaos” that helps you understand what Event-Driven means, and how it’s a good choice for microservices.

[Last Week in .NET #52] – TwinCVEs

Several Zero-Days, and some more pontificating on the future of Programming as it relates to CoPilot. It’s been a busy week, so let’s see what happened Last week in .NET:

🧱 Next-generation firewall capabilities with Azure Firewall Premium. Microsoft is literally charging a premium for better security. Not a great plan.

🔓 Let’s make Visual Studio even more accessible together This is a wonderful shift in focus, and I hope Visual Studio accessibility continues to improve.

👨🏼‍🤝‍👨🏼Cecil Philips and David Pine talk positional pattern matching in C# and how it works and true to the internet there’s at least two commenters who thinks they know better than the language creators.

🌃🐎Kevin Beaumont validates that Microsoft made the SAM database (user passwords) accessible to non-admin users on Windows 10 which is… problematic, to say the least. Kevin followed up with a blog post that goes deeper into how #HiveNightmare works.

I would like one week. Just one week where it doesn’t feel like the sky is falling in info-sec.

🟥 Speaking of the sky falling, Windows Hello bypassed using infrared image. We call it science fiction because it isn’t realistic — and that’s true: They put more effort into security than real life.

🕵️‍♂️ DevSecAI: Github Copilot prone to writing security flaws Microsoft’s designs of monetizing CoPilot seem like it’s fading. The problem with artificial intelligence is that it mimics our own intelligence.

🗃 Jonathan Blow, creator of the Braid and The Witness, says Don’t use fopen() on Windows turns out there’s a bug when you do file stuff in multiple threads where file flushes don’t happen at predictable times.

🔮 Github Copilot: Fatally Flawed or the Future of Software Development? Yes.

✌ Ars technica writes: Two-for-Tuesday vulnerabilities send Windows and Linux users scrambling Exploit #1 was the aforementioned SAM Database vulnerability; and the second is a vulnerability in the linux kernel, by creating, mounting, and deleting a deep directory structure with a total path length that exceeds 1GB and then opening and reading the /proc/self/mountinfo file.

💻🏫 The ML.NET Community standup happened last week, and they talked about ML.NET 1.6 and more.

🔐 Christo Matskas has a blog post out on how to Secure Open API (Swagger) calls with Azure Active Directory.

😴 Azure SDK Release (July 2021) and yes, the word Azure is in the title but not much else, which means it is definitely an azure blog post. The Azure SDK includes new App configuration settings, features for iOS in Azure Communication Services, and releases Azure Cosmos DB for Java, Azure Data Tables, and Azure Metrics Advisor for .NET, Java, JavaScript, and Python, and more. Yes. And more. I’m going to fall asleep if I have to type all these services out. So if you use the Azure SDK, check this post out — but pour yourself some coffee first.

🆘 Miguel Ramos tweets that if you do Windows UI development, they’re going to want to know what you think.

📢 Visual Studio 2019 16.10.4 has been released. This update includes several bug fixes and performance improvements, as usual.

🍾 There is a new System.Text.Json source generator in .NET 6. This allows you to have System.Text.JSON serialization classes auto-generated for you and results in more optimized serialization and deserialization.

💁‍♂️ Github Policy releases Minimum Viable Governance: lightweight community structure to grow your FOSS projects. It’s a document that gives some… sensible defaults for open source project governance on Github.

🚫🐜 Michael Peña (not that one) gave a talk to the Philippine .NET Users Group on the state of .NET on Mac OS and it’s well worth your time.

📃Looking for the 20 best C# and .NET Blogs? Seb Nilsson has you covered. It’s my personal opinion that Eric Lippert’s blog is criminally underrated.

There is a self-reported Intuitive Gudie to Understanding Closures in C# and while I won’t pass judgement on ‘intuitive’, I will call it informational.

And that’s it for what happened Last Week in .NET.

Event Driven Systems: Bringing Order to Chaos

I’m hosting a free 1-hour webinar on August 18, 2021 that is titled Event Driven Systems: Bringing Order to Chaos.

This webinar is for you, if:

  • You’re contemplating Microservices
  • You already have Microservices that communicate over HTTP or gRPC
  • Your monolith is driving you nuts and you’re looking for a way to make the transition to Microservices easier

In this hour long webinar, we’ll go through the boring sounding “Finite State Machine (FSMs)”, and the features of FSMs and event driven architecture that power everything from embedded firmware to the largest web applications. We’ll work through how Event Driven architecture works at scale, and the benefits and challenges you’ll face.

You’ll be introduced to how different software applications use FSMs and Event Driven Architecture, where they make the most sense, and how those principles can bring order to chaotic systems and de-couple parts of your system from each other, making debugging and solving painpoints your customers face easier.

By the end of this webinar, you’ll have a good high-level understanding of Event Driven Architecture and you’ll be able to decide if it’s right for your system.

Sign up here!

[Last Week in .NET #51] – The Next Three Zero Days

📆 July 29th is .NET “Focus on F#” Day. You can sign up to watch a whole day of videos on F# at focus.dotnetconf.net. I haven’t ever seen a CFP for these “Focus” events so I’m unsure of how they pick their speakers; but it looks like a good lineup.

🏪 Microsoft publishes its own applications through the Microsoft Store, making it about 95% of the Microsoft Store.

📹 On July 8th, Kathleen Dollard, Rich Lander, and Immo Landwerth ‘sat down’ on youtube to talk about What’s new in .NET 6 Preview 6 & 7, and how they handle “breaking changes”. Which they can handle now that they aren’t wed to “Don’t break anything at all costs” .NET Framework.

💁‍♀️ Bill Wagner and Beth Massi talk to .NET Notts about what the .NET Foundation does, and that’s important because

☑ The .NET Foundation 2021 Board Nominations are open but don’t get your hopes up because there’s a nomination committee who will decide who actually gets voted on. There’s also a job description of what board members do, if you’re interested.

The ASP.NET Community Standup – Building with Blazor happened last week and it shows how Powered4.tv was built using Blazor.

📢 .NET 5.0.8 has been released. The interesting bit here is that now you can use Windows Forms and WPF are supported for Arm64. This was initially in .NET 6 Preview 1 and backported to .NET 5.0 with this release.

📢 .NET Core 3.1.17 has been released. Several non-security bug fixes are in this release.

0️⃣ Microsoft Patches 3 Under-Attack Windows Zero-Days the big news here is that if you have Windows Systems, you’ll have already wanted to patch them. If not, patch them now. One of the three Zero-days includes a drive-by attack via web browsers. Second to that is that there are 117 vulnerabilities patched, with 17 labeled ‘critical’.

👨‍👩‍👧‍👦 You know you can run multiple projects when you hit ‘F5’ in Visual Studio, right? I love the gif method of teaching; and because of that I’ll forgive the horrible experience we’ve taught ourselves is adequate with debugging multiple projects via F5.

🌎 Global Usings are in .NET 6 and this seems like something that will in no way ever be abused or lead programmers to wonder what namespaces are avialable.

Microsoft introduced the Windows 365 Cloud PC last week and the interesting bit here is that now you can build Windows applications without needing windows. You’ll never have to worry about zero-days plaguing your personal computer, and you’ll get to snobbishly remind people that you use linux all at the same time! As usual the licensing situation with Windows 365 is inscrutable to mere mortals.

📢 Announcing .NET 6 Preview 6 with the previously mentioned Arm64 support, Apple Silicon support.

📢 Visual Studio 2022 Preview 2 is out and it includes Web Live Preview for ASP.NET? Wait a second. ASP.NET… Webforms? That’s still a thing? There’s doubling down on an old technology, and then theres… this.

📝 The Microsoft Windows Developer Team has their ‘notes’ publicly visible for Windows Development and these pages are chock-full of interesting tidbits. If you find yourself doing native Windows development, you’ll want to bookmark this.

📢 ML.NET 1.6 has been released and it now supports Apple’s Silicon, along with several other fixes.

😜 Microsoft released a new emoji introduction video and whatever team did this needs to be responsible for the Windows Experience in general. I have a feeling they could do better than what we’ve got.

🚫🐧 System.Drawing.Common will be Windows-only in .NET 6. While a good move, it feels like ‘Common’ isn’t. Programmer hubris comes for us all in the end.

and Lastly,

A helpful tip for debugging, you can use Debugger.IsAttached as a way to catch Exceptions, but wouldn’t you just click the ‘Break on All Exceptions’ checkbox in Visual Studio? How is this different from that?

And that’s it for what happened Last Week in .NET.

[Last Week in .NET #50] – Copilot or JEDI?

🍄 Jetbrains’ Simon Cropp is hosting an “OSS Power-ups: Verify” event and I have no fracking idea what any of these words put together means. Which, if you think about it is entirely on brand for OSS, where marketing is shunned.

⏳ Rick Strahl has a lengthy blog post about converting the Desktop application Markdown Monster to use C#’s Async/Await. This is as an indepth dive into real-world async that you’ll ever see and worth your time.

🖨🌙🐎 Microsoft released a patch against the PrintNightmare vulnerability and lo-and-behold it doesn’t actually mitigate the vulnerability, writes Brad Sams. Who among us hasn’t had a patch that “Worked on my machine”? Now none of us are worth 2.09 Trillion, but does that really change things?

🗣 .NET Conf “focus on F#” is July 29th, and you can sign up here Now’s your chance to learn about F# and tell the world about it.

🚫⚔ The Pentagon has canceled the disputed JEDI cloud contract with Microsoft and in order for the project not to spend the next ten years in litigation will pursue a multi-cloud strategy — with Amazon, Microsoft, and possibly other cloud vendors. We are in the “Too big to deal with” stage of capitalism decline.

👮‍♀️ Did you ever want to check to see if if the app is being run as sudo or admin on linux? This code snippet will help you do just that.

🕵️‍♂️ Several Netfilter Rootkits — signed by Microsoft — hit the wild today. In case that sentence didn’t sufficiently scare the shit out of you; a rootkit is bad. Microsoft signing rootkits is about as bad as it gets. It’s like your spouse giving a crook the keys to your house and letting them know when you all will be gone.

🔟 Wassim Chegham writes about 10 Things to Know about Azure Static Web Apps and this is a good write up and a reminder that Microsoft is very late to this party but markets as if they created sliced bread.

🏫 Oskar Duycz has you covered with an updated readme and tutorial on event sourcing in .NET (Core). If you think of event sourcing like that annoying kid in your 6th grade class that reminds the teacher when she forgot to assign homework and when the teacher forgot to give a scheduled quiz, it makes a lot more sense.

🐕 Scott Carey of Infoworld talks to developers about their reactions to Copilot Surprisingly none of them were upset at the lack of lubrication involved in getting ‘Copiloted’ by Microsoft. Yes, that is a euphemism now.

🎥 On Friday, July 16th, 2021, Jon Skeet will be talking about the .NET Functions Framework that is available for Google Cloud Functions. Google has a better name for it (.NET Functions) than Microsoft does — and no shit the name Microsoft gave it (according to the website title) is “Azure Functions Serverless Compute”.

📢 The June 2021 (version 1.58) release of Visual Studio Code came out on July 8th. It includes the ability to move terminals to the editor, the Debugger now remembering your previous environment choices, Jupyter code improvements and debugging, and Workspace trust — which sounds vaguely enterprisey but really means “browse code without worrying about the 25 years of macro-exploits that made Microsoft Office synonymous with getting hacked”.

💸 This next one is a commercial plug I didn’t catch; but I’ll own that. If you’re still on silverlight, support ends in 101 days and Mobilize.NET wants to help you modernize your silverlight application through this webinar. Honestly at this point if you’re still using Silverlight you need a commercial partner to get you out of the hole you’ve dug yourself into. Also, this webinar talks about “Reserving your seat” but does not specify a date or time so I can only assume it’s a marketing trick to get you to sign up and it’s actually an on demand webinar. In related news I have found the an extra category for the 9th circle of hell.

💯 Last week i shared Part 1 of how StringBuilder works; and Steve Gordon is back this week for Part 2 of how StringBuilder works. I applaud the effort Steve put into this post; I love the visualizations and it’s a good overview.

🔫 For the InfoSec (and cyber security, sigh @ govies) folks among us, Zac talks about a CobaltStrike hunting tip. I refuse to read the contents of the tweet into this newsletter because it is functionally indistinguishable from the contents of a hex editor. For the people who know, it will make sense though.

👽As a bonus for making it through last week, here’s an oral history of movie Independence day titled “You Can’t Actually Blow Up the White House”: An Oral History of ‘Independence Day’ — which turned 25 last week.

And that’s it for what happened Last Week in .NET. It was Independence Day / listen to fireworks at midnight all week here in the States, so that could attribute to the lack of releases. Stay frosty and I’ll see you next week.

Put That Microservice Down.

We need to have a no-shit moment, you and I.

Put that Microservice down.

Microservices aren’t for you, yet.

Let’s reach over to the well of software development conventional wisdom and draw out a slogan we all live by. Here, I’ll pick a random one:

Do the simplest thing that can possibly work.

Are Microservices really the simplest thing? Really?

Hell, I’ll pick another random slogan from the well:

You Ain’t Gonna Need It.

Maybe these aren’t random; but they are our best known slogans. In fact, going through all of the truisms I can think of in Software Development, none of them advocate for something remotely like Microservices.

I’ve tried, but I can’t find the “purposefully break up one piece of software into independent and autonomous collaborating systems that none of our tooling is really built to support and that the tooling that tries to support it tries to treat all of it like a monolith anyway (Hi to Dapr, Thrift, et. al.).” truism in our industry.

So why the hell are we creating microservices like our livelihood depends on it?

We don’t even know what the word “microservices” means. At least with its former name, Service Oriented Architecture, the name gave us an idea what direction to head in.

So putting aside for the moment that we don’t even know what that word means,

Have we gotten to the point where these slogans are necessary, but no longer sufficient?

Is there a point where YAGNI, TIMTOWDI, Worse Is Better, Don’t Repeat Yourself and the rest just fall flat on their face as truisms?

Have we reached that point where we have built so much complexity around software development that the old ways of building software are windows into a past we’ll never see again?

I remember starting out in Web Development in 2000 with Perl, and it was simple. It wasn’t easy, but the steps were simple. Looking back, we also didn’t know what we didn’t know, cross-site scripting, XSRF, click-jacking and the like were barely known industry wide. Whether it’s because of the fragile nature of the internet or because those living history don’t have time to write it down, it was hard for me to find the original online first mention of cross-site scripting. It’s hard even today finding what was representative of web development in the year 2000. You can still do it; but the flavor isn’t quite right.

Instead, today, we have lots of moving parts: Webpack, npm, nuget, MVC, API, caching, varnish, pubsub, the myriad of services you would use from a cloud provider: Elastic Beanstalk (is that still a thing?), Elastic Container Service, Elastic Kubernetes Service, API Gateway. Fargate, EC2. And that’s just Amazon’s. Microsoft’s Cloud is similarly situated, except they stick “Azure” before everything because how else can they meet their marketing KPIs? Azure DevOps, Azure Container Instances, Azure Kubernetes Service, Azure App Service, etc.

Once you’ve survived those sets of choices, you still have to decide what front-end you would like to use, if any: Angular, React, Vue, Vanilla JavaScript With Server Rendered Views. And that front end doesn’t even take into account the visual — Bootstrap, Tailwind, Bulma, and dozens more I don’t even know about.

I recognize it’s boomer-ish to pine for the good ol’ days; and in this case, the pining is for a simpler software development model, but I have to ask: Is it gone, never to be here again? Are we just stuck with all this complexity to make anything useful for our customers?

Put another way: Monoliths are a way for us to hold on to the last remaining vestige of our development stack in the year 2000: The code that does the work lives in one place, together. Of course it’s in one repo; but the entire thing is deployed together.

Monoliths may be the last simple thing we have in a world where a new developer needs to understand several disciplines to get a website to work. And now, unceremoniously, we’ve decided that new work should be done in small chunks, deployed separately, collaborating with other small chunks of functionality, and that somehow we’ll be able to make all of this work without going insane.

Microservices tear apart that last remaining bit of simplicity. We shouldn’t do that lightly. Gall’s Law comes to mind:

A complex system that works is invariably found to have evolved from a simple system that worked. A complex system designed from scratch never works and cannot be patched up to make it work. You have to start over with a working simple system.

John Gall, Gall’s Law.

Success comes from simplicity. You keep success by managing that complexity and keeping it as simple as possible.

And that’s what moving to microservices has to be about. To be successful, it has to be a transition from simplicity because of a small problem set to managing complexity as that system grows. It becomes a way to manage complexity using another dimension — with hopefully better outcomes than other discarded methods.

What discarded methods you ask? Well, how many teams do you know of that strive to put code under test before it’s written (TDD)? Or teams that relentlessly refactor code to reduce technical debt? Or teams that practice loose-coupling and high cohesion of code? Or teams that keep slack in their sprints so they can focus on ensuring they’re adding value without adding in accidental complexity?

How many teams do you know that practice one of those things more than 20% of the time, let alone all of those things?

And that’s just development team practices; ‘agile’ delivery methods like kanban or scrum seek to reduce complexity on another axis: making it easier to deliver value on a regular cadence.

Those are all methods to manage complexity, and microservices attack a combination of delivery and maintainability: breaking down parts of the system into its discrete pieces; allowing developers to reduce their cognitive load, to only think about the part of the system they’re changing without the rest of the system creeping in; but that has a cost.

Before you pick that Microservice back up, why do you want to move to microservices?

Is it because that’s what the cool kids are doing?

Is it because that’s where software development is going?

If so, don’t. Stay in the world of the monolith as long as possible. That’s the only way to escape the complexity you’re about to encounter.

But, if you’re pursuing microservices because:

You want to manage the complexity and cognitive overhead of your system, and other approaches haven’t worked.
You want to open up new lines of business without modifying existing parts of your system.
You want to scale your system and make it easier to adopt cloud native services.
You want to replace your aging monolith in a graceful fashion, without a big-bang rewrite.

Then you’re doing it for the right reasons, and you’ll get the most out of the move to microservices.

But let’s be real: It’s not an easy road, but it’s worth it if you are solving the right problem.

8 Reasons to Adopt Microservices, in fewer than 100 words

  1. You find yourself copying and pasting code to enable new lines of business.
  2. “We don’t know why this happens” becomes a familiar refrain.
  3. You have at least one ETL or ELT process.
  4. Enterprise customers want you to segregate their instances from your standard multi-tenancy practices.
  5. You’re on .NET Framework, but you want to embrace .NET Core while keeping your production .NET Framework instance working.
  6. You’re on .NET; but want to develop new features in another stack.
  7. You want to make work streams independent.
  8. Easier to adopt cloud-native services.