<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Software Engineering on Brave New Geek</title><link>https://bravenewgeek.com/category/software-engineering/</link><description>Recent content in Software Engineering on Brave New Geek</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 15 Nov 2024 09:25:32 -0700</lastBuildDate><atom:link href="https://bravenewgeek.com/category/software-engineering/index.xml" rel="self" type="application/rss+xml"/><item><title>Platform Engineering as a Service</title><link>https://bravenewgeek.com/platform-engineering-as-a-service/</link><pubDate>Thu, 14 Nov 2024 13:47:29 -0700</pubDate><guid>https://bravenewgeek.com/platform-engineering-as-a-service/</guid><description>&lt;p&gt;Like most industry jargon, “DevOps” means a lot of things to a lot of different people. While many folks view it as specific to certain tooling or practices, such as CI/CD or Infrastructure as Code (IaC), I’ve always viewed it as an organizational model for how software is built and delivered. In particular, my interpretation is that DevOps is about shifting more responsibilities “left” onto developers, moving away from the more traditional “throw it over the wall” approach to IT operations. No doubt this encompasses tooling or practices like CI/CD and IaC, which are responsibilities that developers now shoulder, perhaps with the support of dev tools, productivity, or enablement teams—some companies just call this the “DevOps” team.&lt;/p&gt;</description></item><item><title>Deployment-Driven Development</title><link>https://bravenewgeek.com/deployment-driven-development/</link><pubDate>Mon, 11 Nov 2024 15:57:13 -0700</pubDate><guid>https://bravenewgeek.com/deployment-driven-development/</guid><description>&lt;p&gt;&lt;a href="https://bravenewgeek.com/wp-content/uploads/2024/11/pipeline.png"&gt;&lt;img loading="lazy" src="https://bravenewgeek.com/wp-content/uploads/2024/11/pipeline.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Most people use “DDD” to refer to &lt;em&gt;Domain-Driven Design&lt;/em&gt;, which is a useful tool for thinking about API boundaries and system architecture. It provides a way to map a business problem into software. At &lt;a href="https://realkinetic.com"&gt;Real Kinetic&lt;/a&gt;, we regularly help our clients utilize Domain-Driven Design as well as other strategies to architect their systems, avoid some of the pitfalls of DDD, and build an effective foundation for designing software. But &lt;em&gt;this&lt;/em&gt; DDD only speaks to one small aspect of building and shipping software.&lt;/p&gt;</description></item><item><title>Security, Maintainability, Velocity: Choose One</title><link>https://bravenewgeek.com/security-maintainability-velocity-choose-one/</link><pubDate>Wed, 17 Apr 2024 11:41:24 -0600</pubDate><guid>https://bravenewgeek.com/security-maintainability-velocity-choose-one/</guid><description>&lt;p&gt;There are three competing priorities that companies have as it relates to software development: security, maintainability, and velocity. I’ll elaborate on what I mean by each of these in just a bit. When I originally started thinking about this, I thought of it in the context of the “good, fast, cheap: choose two” &lt;a href="https://en.wikipedia.org/wiki/Project_management_triangle"&gt;project management triangle&lt;/a&gt;. But after thinking about it for more than a couple minutes, and as I related it to my own experience and observations at other companies, I realized that in practice it’s much worse. For most organizations building software, it’s more like security, maintainability, velocity: choose &lt;em&gt;one&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>Choosing Good SLIs</title><link>https://bravenewgeek.com/choosing-good-slis/</link><pubDate>Mon, 19 Feb 2024 14:11:17 -0700</pubDate><guid>https://bravenewgeek.com/choosing-good-slis/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="https://bravenewgeek.com/wp-content/uploads/2024/02/dashboard-1024x671.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Transitioning from an on-prem environment to a cloud environment involves a lot of major shifts for organizations. One of those shifts is often around how we monitor the overall health of systems. The typical way to measure things like the availability, reliability, and performance of systems is with SLIs or &lt;a href="https://sre.google/sre-book/service-level-objectives/"&gt;Service Level Indicators&lt;/a&gt;. SLIs are a valuable tool both on-prem and in the cloud, but when it comes to the latter, I often see organizations carrying over some operational anti-patterns from their data center environment.&lt;/p&gt;</description></item><item><title>Cloud without Kubernetes</title><link>https://bravenewgeek.com/cloud-without-kubernetes/</link><pubDate>Mon, 12 Feb 2024 11:58:13 -0700</pubDate><guid>https://bravenewgeek.com/cloud-without-kubernetes/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="https://bravenewgeek.com/wp-content/uploads/2024/02/Kubernetes-or-Cloud-Run-1024x683.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;I think it’s safe to say Kubernetes has “won” the cloud mindshare game. If you look at the CNCF &lt;a href="https://landscape.cncf.io/"&gt;Cloud Native landscape&lt;/a&gt; (and manage to not go cross eyed), it seems like most of the projects are somehow related to Kubernetes. KubeCon is one of the fastest-growing industry events. Companies we talk to at Real Kinetic who are either preparing for or currently executing migrations to the cloud are centering their strategies around Kubernetes. Those already in the cloud are investing heavily in platform-izing their Kubernetes environment. Kubernetes competitors like Nomad, Pivotal Cloud Foundry, OpenShift, and Rancher have sort of just faded to the background (or simply pivoted to Kubernetes). In many ways, “cloud native” seems to be equated with “Kubernetes”.&lt;/p&gt;</description></item><item><title>SRE Doesn’t Scale</title><link>https://bravenewgeek.com/sre-doesnt-scale/</link><pubDate>Wed, 06 Oct 2021 09:44:55 -0600</pubDate><guid>https://bravenewgeek.com/sre-doesnt-scale/</guid><description>&lt;p&gt;&lt;a href="https://bravenewgeek.com/wp-content/uploads/2021/10/sre-book.jpeg"&gt;&lt;img loading="lazy" src="https://bravenewgeek.com/wp-content/uploads/2021/10/sre-book.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We encounter &lt;em&gt;a lot&lt;/em&gt; of organizations talking about or attempting to implement SRE as part of our consulting at Real Kinetic. We’ve even discussed and debated ourselves, ad nauseam, how we can apply it at our own product company, &lt;a href="https://witful.com/"&gt;Witful&lt;/a&gt;. There’s a brief, unassuming section in the &lt;a href="https://sre.google/sre-book/table-of-contents/"&gt;SRE book&lt;/a&gt; tucked away towards the tail end of &lt;a href="https://sre.google/sre-book/evolving-sre-engagement-model/"&gt;chapter 32&lt;/a&gt;, “The Evolving SRE Engagement Model.” Between the SLIs and SLOs, the error budgets, alerting, and strategies for handling change management, it’s probably one of the most overlooked parts of the book. It’s also, in my opinion, one of the most important.&lt;/p&gt;</description></item><item><title>Structuring a Cloud Infrastructure Organization</title><link>https://bravenewgeek.com/structuring-a-cloud-infrastructure-organization/</link><pubDate>Mon, 07 Dec 2020 11:21:46 -0600</pubDate><guid>https://bravenewgeek.com/structuring-a-cloud-infrastructure-organization/</guid><description>&lt;p&gt;Real Kinetic often works with companies just beginning their cloud journey. Many come from a conventional on-prem IT organization, which typically looks like separate development and IT operations groups. One of the main challenges we help these clients with is how to structure their engineering organizations effectively as they make this transition. While we approach this problem holistically, it can generally be looked at as two components: product development and infrastructure. One might wonder if this is still the case with the shift to DevOps and cloud, but as we’ll see, these two groups still play important and distinct roles.&lt;/p&gt;</description></item><item><title>Digitally Transformed: Becoming a Technology Product Company</title><link>https://bravenewgeek.com/digitally-transformed-becoming-a-technology-product-company/</link><pubDate>Wed, 05 Feb 2020 09:46:47 -0600</pubDate><guid>https://bravenewgeek.com/digitally-transformed-becoming-a-technology-product-company/</guid><description>&lt;p&gt;More and more established businesses are attempting to reinvent themselves as technology companies. At the heart of this is the &lt;a href="https://trends.google.com/trends/explore?date=all&amp;amp;geo=US&amp;amp;q=digital%20transformation"&gt;digital transformation&lt;/a&gt;, a journey many organizations are undertaking in order to better compete and serve their customers. As a result, companies are pouring tons of cash into digital transformation strategies. For some, this means broader adoption of agile or DevOps practices. For others, it’s modernizing product offerings or moving to the cloud. Regardless of the changes, many are struggling to find success transforming themselves due to low throughput, quality issues, or failing to deliver the right thing at the right time. In a few cases, digital transformation has ended in &lt;a href="https://www.theregister.co.uk/2019/04/23/hertz_accenture_lawsuit/"&gt;&lt;em&gt;outright disaster&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Microservice Observability, Part 2: Evolutionary Patterns for Solving Observability Problems</title><link>https://bravenewgeek.com/microservice-observability-part-2-evolutionary-patterns-for-solving-observability-problems/</link><pubDate>Fri, 03 Jan 2020 14:18:10 -0600</pubDate><guid>https://bravenewgeek.com/microservice-observability-part-2-evolutionary-patterns-for-solving-observability-problems/</guid><description>&lt;p&gt;In &lt;a href="https://bravenewgeek.com/microservice-observability-part-1-disambiguating-observability-and-monitoring/"&gt;part one&lt;/a&gt; of this series, I described the difference between monitoring and observability and why the latter starts to become more important when dealing with microservices. Next, we’ll discuss some strategies and patterns for &lt;em&gt;implementing&lt;/em&gt; better observability. Specifically, we’ll look at the idea of an &lt;a href="https://bravenewgeek.com/the-observability-pipeline/"&gt;observability pipeline&lt;/a&gt; and how we can start to iteratively improve observability in our systems.&lt;/p&gt;
&lt;p&gt;To recap, observability can be described simply as the ability to ask questions of your systems without knowing those questions in advance. This requires capturing a variety of signals such as logs, metrics, and traces as well as tools for interpreting those signals like log analysis, SIEM, data warehouses, and time-series databases. A number of challenges surface as a result of this. &lt;a href="https://twitter.com/clintsharp"&gt;Clint Sharp&lt;/a&gt; does a great job &lt;a href="https://cribl.io/blog/the-observability-pipeline/"&gt;discussing&lt;/a&gt; the key problems, which I’ll summarize below along with some of my own observations.&lt;/p&gt;</description></item><item><title>Microservice Observability, Part 1: Disambiguating Observability and Monitoring</title><link>https://bravenewgeek.com/microservice-observability-part-1-disambiguating-observability-and-monitoring/</link><pubDate>Thu, 03 Oct 2019 10:55:23 -0500</pubDate><guid>https://bravenewgeek.com/microservice-observability-part-1-disambiguating-observability-and-monitoring/</guid><description>&lt;p&gt;“Pets versus cattle” has become something of a standard vernacular for describing the shift in how we build systems. It alludes to the elastic and dynamic nature of these (typically, but not necessarily) container-based systems with on-demand scaling and more transparent fault-tolerance. I’ve &lt;a href="https://bravenewgeek.com/the-observability-pipeline/"&gt;talked before about this transition&lt;/a&gt; before and specifically how it relates to monitoring. In particular, with these more dynamic, microservice-based systems, the conversation starts to shift away from traditional &lt;em&gt;monitoring&lt;/em&gt; toward &lt;em&gt;observability&lt;/em&gt;. In this series, I’ll describe that distinction, explain why it matters, and share some concrete tactical items for implementing observability in a microservice environment.&lt;/p&gt;</description></item><item><title>Planting Perennials Next to Potholes</title><link>https://bravenewgeek.com/planting-perennials-next-to-potholes/</link><pubDate>Fri, 26 Apr 2019 14:35:24 -0500</pubDate><guid>https://bravenewgeek.com/planting-perennials-next-to-potholes/</guid><description>&lt;h4 id="silos-bikesheds-and-focusing-on-what-matters"&gt;&lt;strong&gt;Silos, bikesheds, and focusing on what matters&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;If you’ve ever flown into Des Moines then you’ve had the privilege of driving on what might be the most decrepit major road in the metro area. An important artery, Fleur Drive is the &lt;em&gt;only&lt;/em&gt; way to get to and from the airport, and the pavement is marginally better than that of a dirt road. Cars weave back and forth to dodge potholes and massive cracks in the asphalt as people race to catch their flights. There always appears to be some kind of construction going on somewhere along the six mile stretch of road, and yet, it never seems to actually &lt;em&gt;improve&lt;/em&gt;. The road is also located in a major floodplain, so sometimes the city just closes it when the nearby river rises too much. It’s basically what you’d get if you agiled your way through urban planning.&lt;/p&gt;</description></item><item><title>Operations in the World of Developer Enablement</title><link>https://bravenewgeek.com/operations-in-the-world-of-developer-enablement/</link><pubDate>Thu, 24 Jan 2019 11:28:40 -0600</pubDate><guid>https://bravenewgeek.com/operations-in-the-world-of-developer-enablement/</guid><description>&lt;p&gt;&lt;a href="https://blog.realkinetic.com/scaling-devops-and-the-revival-of-operations-d647ba6e2374"&gt;&lt;em&gt;NewOps&lt;/em&gt;&lt;/a&gt; is not a replacement for DevOps, it’s an evolution of it by &lt;a href="https://www.youtube.com/watch?v=JUy3GYkPfto"&gt;looking at Operations through the lens of product&lt;/a&gt;. It’s what I’ve come to call “Developer Enablement” because the goal is to shift the focus of Ops teams from being masters of production to &lt;em&gt;enablers&lt;/em&gt; of production. Through Developer Enablement, teams are enabled—and tasked with the responsibility—to control their own destiny. This extends far beyond just the responsibility of building products. It includes how we build, test, secure, deploy, monitor, and operate systems.&lt;/p&gt;</description></item><item><title>How to Level up Dev Teams</title><link>https://bravenewgeek.com/how-to-level-up-dev-teams/</link><pubDate>Thu, 03 Jan 2019 11:21:05 -0600</pubDate><guid>https://bravenewgeek.com/how-to-level-up-dev-teams/</guid><description>&lt;p&gt;One question that clients frequently ask: how do you effectively level up development teams? How do you take a group of engineers who have never written Python and make them effective Python developers? How do you take a group who has never built distributed systems and have them build reliable, fault-tolerant microservices? What about a team who has never built anything in the cloud that is now tasked with building cloud software?&lt;/p&gt;</description></item><item><title>Multi-Cloud Is a Trap</title><link>https://bravenewgeek.com/multi-cloud-is-a-trap/</link><pubDate>Fri, 14 Sep 2018 11:16:09 -0500</pubDate><guid>https://bravenewgeek.com/multi-cloud-is-a-trap/</guid><description>&lt;p&gt;It comes up in &lt;em&gt;a lot&lt;/em&gt; of conversations with clients. We want to be cloud-agnostic. We need to avoid vendor lock-in. We want to be able to shift workloads seamlessly between cloud providers. Let me say it again: &lt;em&gt;multi-cloud is a trap&lt;/em&gt;. Outside of appeasing a few major retailers who might not be too keen on stuff running in Amazon data centers, I can think of few reasons why multi-cloud should be a priority for organizations of &lt;em&gt;any&lt;/em&gt; scale.&lt;/p&gt;</description></item><item><title>The Observability Pipeline</title><link>https://bravenewgeek.com/the-observability-pipeline/</link><pubDate>Wed, 12 Sep 2018 11:37:24 -0500</pubDate><guid>https://bravenewgeek.com/the-observability-pipeline/</guid><description>&lt;p&gt;The rise of cloud and containers has led to systems that are much more distributed and dynamic in nature. Highly elastic microservice and serverless architectures mean containers spin up on demand and scale to zero when that demand goes away. In this world, servers are very much cattle, not pets. This shift has exposed deficiencies in some of the tools and practices we used in the world of servers-as-pets. It has also led to new tools and services created to help us support our systems.&lt;/p&gt;</description></item><item><title>Scaling DevOps and the Revival of Operations</title><link>https://bravenewgeek.com/scaling-devops-and-the-revival-of-operations/</link><pubDate>Wed, 18 Apr 2018 10:07:42 -0500</pubDate><guid>https://bravenewgeek.com/scaling-devops-and-the-revival-of-operations/</guid><description>&lt;p&gt;Operations is going through a renaissance right now. With the move to cloud, the increasing amount of automation, and the increasing &lt;em&gt;importance&lt;/em&gt; of automation, Ops as we know it is reinventing itself out of necessity. Infrastructure is becoming more and more sophisticated—and commoditized—and practices are just now starting to grow up around that. So while some worry about robots taking our jobs, the reality is more about how automation will help augment us to build better software and focus on higher-value things. It’s not so much about the &lt;em&gt;distant&lt;/em&gt; future—whatever that may hold—so much as it is about the next five to ten years, what Operations looks like in that timeframe, and why I think it has to retool.&lt;/p&gt;</description></item><item><title>More Environments Will Not Make Things Easier</title><link>https://bravenewgeek.com/more-environments-will-not-make-things-easier/</link><pubDate>Wed, 11 Apr 2018 15:49:47 -0500</pubDate><guid>https://bravenewgeek.com/more-environments-will-not-make-things-easier/</guid><description>&lt;p&gt;Microservices are &lt;a href="https://bravenewgeek.com/service-disoriented-architecture/"&gt;hard&lt;/a&gt;. They require extreme discipline. They require a lot more upfront thinking. They introduce integration challenges and complexity that you otherwise wouldn’t have with a monolith, but service-oriented design is an important part of scaling organization structure. Hundreds of engineers all working on the same codebase will only lead to angst and the inability to be nimble.&lt;/p&gt;
&lt;p&gt;This requires a pretty significant change in the way we think about things. We’re creatures of habit, so if we’re not careful, we’ll just keep on applying the same practices we used before we did services. And that will end in frustration.&lt;/p&gt;</description></item><item><title>There and Back Again: Why PaaS Is Passé (And Why It’s Not)</title><link>https://bravenewgeek.com/there-and-back-again-why-paas-is-passe-and-why-its-not/</link><pubDate>Tue, 06 Feb 2018 16:26:31 -0600</pubDate><guid>https://bravenewgeek.com/there-and-back-again-why-paas-is-passe-and-why-its-not/</guid><description>&lt;p&gt;In 10 years nobody will be talking about Kubernetes. Not because people stopped using it or because it fell out of favor, but because it became utility. Containers, Kubernetes, service meshes—they’ll all be there, the same way VMs, hypervisors, and switches will be. Compute is a commodity, and I don’t care how my workload runs so long as it meets my business’s SLOs and other requirements. Within AWS alone, there are now &lt;em&gt;innumerable&lt;/em&gt; ways to run a compute workload.&lt;/p&gt;</description></item><item><title>Building a Distributed Log from Scratch, Part 5: Sketching a New System</title><link>https://bravenewgeek.com/building-a-distributed-log-from-scratch-part-5-sketching-a-new-system/</link><pubDate>Tue, 23 Jan 2018 12:08:53 -0600</pubDate><guid>https://bravenewgeek.com/building-a-distributed-log-from-scratch-part-5-sketching-a-new-system/</guid><description>&lt;p&gt;In &lt;a href="https://bravenewgeek.com/building-a-distributed-log-from-scratch-part-4-trade-offs-and-lessons-learned/"&gt;part four&lt;/a&gt; of this series we looked at some key trade-offs involved with a distributed log implementation and discussed a few lessons learned while building NATS Streaming. In this fifth and final installment, we’ll conclude by outlining the design for a new log-based system that draws from the previous entries in the series.&lt;/p&gt;
&lt;h3 id="the-context"&gt;The Context&lt;/h3&gt;
&lt;p&gt;For context, &lt;a href="https://nats.io/"&gt;NATS&lt;/a&gt; and &lt;a href="https://nats.io/documentation/streaming/nats-streaming-intro/"&gt;NATS Streaming&lt;/a&gt; are two different things. NATS Streaming is a log-based streaming system built on top of NATS, and NATS is a lightweight pub/sub messaging system. NATS was originally built (and then open sourced) as the control plane for Cloud Foundry. NATS Streaming was built in response to the community’s ask for higher-level guarantees—durability, at-least-once delivery, and so forth—beyond what NATS provided. It was built as a separate layer on top of NATS. I tend to describe NATS as a dial tone—ubiquitous and always on—perfect for “online” communications. NATS Streaming is the voicemail—leave a message after the beep and someone will get to it later. There are, of course, more nuances than this, but that’s the gist.&lt;/p&gt;</description></item><item><title>Building a Distributed Log from Scratch, Part 4: Trade-Offs and Lessons Learned</title><link>https://bravenewgeek.com/building-a-distributed-log-from-scratch-part-4-trade-offs-and-lessons-learned/</link><pubDate>Thu, 18 Jan 2018 16:01:13 -0600</pubDate><guid>https://bravenewgeek.com/building-a-distributed-log-from-scratch-part-4-trade-offs-and-lessons-learned/</guid><description>&lt;p&gt;In &lt;a href="https://bravenewgeek.com/building-a-distributed-log-from-scratch-part-3-scaling-message-delivery/"&gt;part three&lt;/a&gt; of this series we talked about scaling message delivery in a distributed log. In part four, we’ll look at some key trade-offs involved with such systems and discuss a few lessons learned while building NATS Streaming.&lt;/p&gt;
&lt;h3 id="competing-goals"&gt;Competing Goals&lt;/h3&gt;
&lt;p&gt;There are a number of competing goals when building a distributed log (these goals also extend to many other types of systems). Recall from &lt;a href="https://bravenewgeek.com/building-a-distributed-log-from-scratch-part-1-storage-mechanics/"&gt;part one&lt;/a&gt; that our key priorities for this type of system are performance, high availability, and scalability. The preceding parts of this series described at various levels how we can accomplish these three goals, but astute readers likely noticed that some of these things conflict with one another.&lt;/p&gt;</description></item></channel></rss>