Episode Summary
Episode Show Notes & Transcript
About Matthew
- CDK Book: https://www.thecdkbook.com/
- cdk.dev: https://cdk.dev
- Twitter: https://twitter.com/mattbonig
- LinkedIn: https://www.linkedin.com/in/matthewbonig/
- Personal website: https://matthewbonig.com
- duckbillgroup.com: https://duckbillgroup.com
Transcript
Announcer: Hello, and welcome to Screaming in the Cloud with your host, Chief Cloud Economist at The Duckbill Group, Corey Quinn. This weekly show features conversations with people doing interesting work in the world of cloud, thoughtful commentary on the state of the technical world, and ridiculous titles for which Corey refuses to apologize. This is Screaming in the Cloud.
Corey: Welcome to Screaming in the Cloud. I’m Corey Quinn. And I’m back with my first recording that was conducted post-re:Invent and all of its attendant glory and nonsense; we might talk a little bit about what happened at the show. But my guest today is the Chief Cloud Architect at Defiance Digital, Matthew Bonig. Matthew, thank you for joining me.
Matthew: Thank you, Corey. Thanks for having me today.
Corey: So, you are deep into the CDK. You’re one of the AWS Dev Tools Heros, and you’re the co-author of the CDK Book, you’ve done a lot, really. You have a course now for Advanced CDK work. Honestly, at this point, it starts to feel like when I say the CDK is a cult, you’re one of the cult leaders, or at least very high up in the cult.
Matthew: [laugh] Yes, it was something that I discovered—
Corey: Your robe has a fringe on it.
Matthew: Yeah, yeah. I discovered this at re:Invent, and it kind of hit me a little surprised that I got called out by a couple people by being the CDK guy. And I didn’t realize that I’d hit that status yet, so I got to get myself a hat, and a cloak, and maybe some fun stuff to wear.
Corey: For me, what I saw on the—it was in the run-up to re:Invent, but the big CDK sized announcement was the fact that the new version of Amplify now is much closer tied to the CDK than it was in previous incarnations, which is great. It sort of solves the problem, how do I build a thing through a variety of different tools? Great, and how do I manage that thing programmatically? It seems if, according to what it says on the tin, that it narrows that gap. Of course, here in reality, I haven’t had time to pick anything like that up, and I won’t for months, just because so much comes out all at the same time. What happened in the CDK world? What did I miss? What’s exciting?
Matthew: Well, you know, the CDK world has been, I’ve said, fairly mature for a while now. You know, fundamentally the way the CDK works and the functionality within it hasn’t changed drastically. Even when 2.0 came out a couple of years ago, there wasn’t a drastic fundamental change in the way that the API worked. Really, the efforts that we’ve been seeing for the last year or so, and especially the last few months, is trying to button up some functionality, hit some of those edge cases have been rough for some users, and ultimately just continue to fill out things like L2 constructs and maybe try to build out some L3s.
I think what they’re doing with Amplify is a good sign that they are trying to, sort of, reach across the aisle and work with other frameworks and work with other systems within AWS to make the experience better, shows their commitment to the CDK of making it really the first class citizen for doing IaC work in AWS.
Corey: I think that that is a—that’s a long road, and it’s also a lot of work under the hood that’s not easily appreciated. You’ve remarked at one point that my talk at the CDK Community Day was illuminating, if nothing else, if for no other reason than I dressed up as a legitimate actual cultist and a robe to give the talk—
Matthew: Yeah. Loved it.
Corey: Because I have deep-seated emotional problems. But it was fun. It talked a bit about my journey with it, where originally I viewed it as, more or less, this thing that was not for me. And a large part of that because I come from a world of sysadmin ops types, where, “I don’t really know how to code,” was sort of my approach to this. Because I was reaff—I had that reaffirmed every time I talked to a developer. Like, “You call this a bash script? It’s terrible.” And sure, but it worked, and it tied into a different knowledge set.
Then, when I encountered the CDK for the first time, I tried to use it in Python, which at the time was not really well-supported and led to unfortunate outcomes—I do not know if that’s still the case—what got me into it, in seriousness, was when I tried it a few months later with TypeScript and that started to work a little bit more clearly, with the caveat that I did not know JavaScript, I did not know TypeScript, I had to learn it as I went in service to the CDK. And it works really well insofar as it scratched an itch that I had. There’s a whole class of problems that I don’t have to deal with, which include getting someone who isn’t me involved in some of that codebase, or working in environments where you have either a monorepo or a crap ton of tiny repos scattered everywhere and collaborating with other people. I cannot speak authoritatively to any of that. I will say it’s incredibly annoying when I’m trying to update something written in the CDK, and then I have touched it in a year-and-a-half, and the first thing I have to do is upgrade a whole a bunch of dependencies, clear half a day just to get the warnings to clear before I can go ahead and deploy the things, let alone implement the tiny change I’m logging into the thing to fix.
Matthew: Oh, yeah, yes. Yeah, the dependency updates are probably one of the most infuriating things about any Node.js system, and I don’t think that I’ve ever run across any application project framework, anything in which doing dependency upgrades wasn’t a nightmare. And I think it’s because the Node.js community, more so than I’ve seen any other, doesn’t care about semantic versioning. And unfortunately, the CDK doesn’t technically care about semantic versioning, either, which makes it very tricky to do upgrades properly.
Corey: There also seems to be the additional problem layered on top, which is all of the various documentation sources that I stumble upon, the official documentation, not terrific at giving real-world use case. It feels like it’s trying to read the dictionary to learn how English works, not really its purpose. So, I find a bunch of blog posts, and all of them tend to approach this ecosystem slightly differently. One talks about using NPM. Another talks about Yarn.
If you’re doing anything that involves a web app, as seems to be increasingly common, some will say, “Oh, use WEBrick,” others will recommend using Vite. There’s the whole JavaScript framework wars, and the only unifying best practice seems to be, “Oh, there’s another way to do it that you should be using instead of the way you currently are on.” And if you listen to that, you wind up in hell.
Matthew: Oh, horribly so. Yeah, the split in the ecosystem between NPM and Yarn, I think, has been incredibly detrimental to the overall comfort level in Node.js development. You know, I was an NPM guy for many, many years, and then actually, the CDK got me more using Yarn, simply because Yarn handles cross-library dependency resolution a bit different from NPM. And I just ran into fewer errors and fewer problems if I use Yarn along the way.
But NPM then came a long way since then. Now, there’s also a PNPM, which is good if you’re using monorepos. But then if you’re going to be using monorepos, there’s another 15 tools out there that you can use for those sorts of things. And ultimately, I think it’s going to be what is the thing that causes you the least amount of problems when dealing with them. And every single dependency issue that I’ve ever run into when upgrading any project, whether it be a web application, a back-end API, or the CDK, it’s always unique enough that there isn’t a one-size-fits-all answer to solving those problems.
Corey: The most recent experience I had with the CDK—since you know, you’re basically Mr. CDK at this point, whether you want to be or not, and this is what I do, instead of filing issues anywhere or asking for help, I drag people onto this show, and then basically assault them with my weird use cases—I’m in the process of building something out in the service of shitposting, because that is my nature, and I decided, oh, there’s a new thing called the Dynamo table v2—
Matthew: Yes.
Corey: Which is great. I looked into it. The big difference is that it addresses it from the beginning as a global table, so you have optionality. Cool. Trying to migrate something that is existing from a Dynamo table to a Dynamo v2 table started throwing CloudFormation issues, so my answer was—this was pre-production—just tear down the stack and rebuild it. That feels like that would be a problem if this had been something that was actually full of data at this point.
Matthew: There’s a couple of ways that you could maybe go about it. Now, this is a very special case that you mentioned because you’re talking about fundamentally changing the CloudFormation resource that you are creating, so of course, the CDK being an abstraction layer over top of CloudFormation and the Dynamo table v2 using the global table resource rather than just the table resource. If you had a case where you have to do that migration—and I’ve actually got a client right now who’s very much looking to do that—the process would probably be to orphan the existing table so that you can retain the data and then using an import routine with CloudFormation to bring that in under the new resource. I haven’t tried it yet—
Corey: In this case, the table was empty, so it was easy enough to just destroy and then recreate, but it meant that I also had to tear down and recreate everything else in the stack as well, including CloudFront distributions, ACM certificates, so it took 20 minutes.
Matthew: Yes. And that is one of the reasons why I often will stick any sort of stateful resource into their own stack so that if I have to go through an operation like this, I’m know that I’m not going to be modifying things that are very painful to drop and recreate, like, CloudFront distributions, which can take a half an hour or more to re-initialize.
Corey: Yeah. So, that was fun. The problem got sorted out, but it was still a bit challenging. I feel like at some level, the CDK is hobbled by the fact that under the hood, it really just is just CloudFormation once all is said and done, and CloudFormation has never been the speediest thing. I didn’t understand that until I started playing with Terraform and I saw how much more quickly it could provision things just by calling the service APIs directly. It sort of raises the question of what the hell the CloudFormation service is doing when it takes five times longer to do effectively the same thing.
Matthew: Yeah, and the big thing that I appreciate about Terraform versus CloudFormation—speed being kind of the big win—is the fact that Terraform doesn’t obfuscate or hide state from you. If you absolutely need to, you can go in and change that state that relates your Terraform definitions to the back-end resources. You can’t do that with CloudFormation. So CloudFormation, did release few years ago, that import routine, and that was pretty good—not great, but pretty good; it’s getting better all the time—whereas this was a complete and unneeded feature with Terraform because if it came down to the point where you already had a resource, and you just want to tie it to your IaC, you just edit a state file. And they’ve got their import routines and tie-in routines as well, but having that underlying state exposed was a big advantage, in my mind, to Terraform that I missed going to CloudFormation, and still to this day frustrates me that I can’t do that underlying state change.
Corey: It becomes painful and challenging, for better or worse.
Matthew: Yep.
Corey: But yeah, that was what I ran into. Things have improved, though. When I google various topics, I find that the v2 documentation comes up instead of the v1. That was maddening for a little while. I find that there are still things that annoy me, but they become less all the time, partially because I feel like I’m getting better at knowing how to search for them, and also because I think I’m becoming broken in the right ways that the CDK tends to expect.
Matthew: Oh, like how?
Corey: Oh, easy example here: I was recently trying to get something set up and running, and I don’t know why this is the case, I don’t know if it holds true and other programming languages, but I’m getting more used to the fact that there are two files in TypeScript-land that run a project. One is generally small and in a side directory that no one cares about, I think it’s in a lib or the bin subdirectory. I don’t remember which because I don’t care. And then there are things you have to do within the other equivalent that basically reference each other. And I’ve gotten better at understanding that those aren’t one file, for example. Though they seem to sure be a lot in all the demos, but it’s not how the init process, when you’re starting something new, spins up.
Matthew: Yeah, this is the hell of TypeScript, the fact that Node.js, as a runtime, cannot process TypeScript files, so you always have to pass them through a compiler. This is actually one of the things that I like about using Projen for all of my projects instead of using CDK init to start them is that those baseline configurations handle the TypeScript nature of the runtime—or I should say, the anti-TypeScript nature of the runtime a little bit better, and you run into fewer problems. You never have to worry about necessarily doing build routines or other things because they actually use the ts-node runtime to handle your CDK files instead of the node runtime. And I think that’s a big benefit in terms of the developer experience. It just makes it so I generally never have to care about those JavaScript files that get compiled from TypeScript. In the, you know, two years or so I’ve been using Projen, I never have to worry about a build routine to turn that into JavaScript. And that makes the developer experience significantly better.
Corey: Yeah, I still miss an awful lot of things that I feel like I should be understanding. I’ve never touched Projen, for example. It’s on my backlog of things to look into.
Matthew: Highly recommend it.
Corey: Yeah, I also am still in that area of… my TypeScript knowledge has not yet gotten to a point where I see the value of it. It feels like I’ve spent far more time fighting with the arbitrary restrictions that are TypeScript than it has saved me from typing errors in anything that I’ve built. I believe it has to come back around at some point of familiarity with the language, but I’m not there yet.
Matthew: Got you. So, Python developer before this?
Corey: Ish. Mostly brute force and enthusiasm, but yeah, Python.
Matthew: Python, and I think you said bash scripting and other things that have no inherent typing built into it.
Corey: Right.
Matthew: Yeah, that is a problem, I think… that I thankfully avoided. I was an application developer for many years. My background and my experience has always been around strongly typed languages, so when it came to adopting the CDK, everything felt very natural to me. But as I’ve worked with people over the years, both internally at Defiance as well as people in the community that don’t have a background in that, I’ve been exposed to how problematic TypeScript as a language truly can be for someone who has never had this experience of, I’ve got this thing and it has a well-defined shape to it, and if I don’t respect that, then I’m going to bang my head against to these weird errors that are hard to comprehend and hard to grok way more than it feels like I’m getting value from it.
Corey: There’s also a lack of understanding around how to structure projects, in my case, where all right, I have a front-end and I have a back-end. Is this all within the context of the CDK project? And this, of course, also presupposes that everything I’m doing is effectively greenfield, in which case, great, do I use the front-end wizard tutorial thing that I’m following, and how does that integrate when I’m using the CDK to deploy it somewhere, and so on and so forth. It’s stuff that makes sense once you have angry and loud enough opinions, but I don’t yet.
Matthew: Yeah, so the key thing that I tell people about project structure—because it does often come up a lot—is that ultimately, the CDK itself doesn’t really care how you structure things. So, how you structure, where you put certain files, how you organize them, is your personal preference. Now, there are some exceptions to that. When it comes to things like Lambda functions that you’re building or Docker files, there are probably some better practices you can go through, but it’s actually more dependent on those systems rather than the CDK directly itself. So I go through, in the Advanced CDK course, you know, my basic starting directory structure for everything, which is stacks, constructs, apps, and stages all go into their own specific directories.
But then once those directories start growing—because I’ve added more stacks, more constructs, and things—once I get to around five to maybe seven files in a directory, then I look at them and go, “Okay, how can I group these together?” I create subdirectories, I move those files around. My development tool of choice, which is WebStorm—JetBrains’s long-running tool—handles the moving of those files for me, so all of my imports, all of my references automatically get updated accordingly, which is really nice, and I can refactor things as much as I want to without too much of a problem. So, as a project grows over time, my directory structure can change to make sure that it is readable, well organized, and understandable, and it’s never been too much of a problem.
Corey: Yeah, it’s one of those things that does take some getting used to. It helps, I think, having a mentor of sorts to take you under their wing and explain these things to you, but that’s a hard thing to scale as well. So, in the absence of that we wind up defaulting to oh, whatever the most recent blog post we read is.
Matthew: Yeah. Yeah, and I think one of the truest, I think, and truthful complaints I’ve heard about the CDK and why it can be fundamentally very difficult is that it has no guardrails. It is a general-purpose languages, and general purpose languages don’t have guardrails. They don’t want to be in the way of you building whatever you need to build.
But when it comes to an Infrastructure as Code project, which is inherently very different from an API or a website or other, sort of, more typical programming projects, having guardrail—or not having guardrails is a bad thing, and it can really lead you down some bad paths. I remember working with a client this last year who had leveraged context instead of properties on classes to hand configuration value down through code, down through stacks and constructs and things like that. And it worked. It functionally got them what they needed, up until a point, and then all of sudden, they were like, “Well, now we want to do X with the CDK, and we simply cannot because we’ve now painted ourselves into a corner.” And that’s the downside of not having these good guard rails.
And I think that early, they needed to do this early on. When the CDK was initially released, and it got popular back around the 0.4, 0.5 timeframe—I think I picked it up right around 0.4, too—when it officially hit a 1.0 release, there should have been a better set of guidelines and best practices published. You can go to the documents and see them, and they have been published, but it really didn’t go far enough to really explain how and why you had to take the steps to make sure you didn’t screw yourself six months later.
Corey: It’s sort of those one-way doors you don’t realize you’re passing through when you first start building something. And I find, especially when you follow my development approach of more or less used to be copying and pasting for various places, now it’s copying and pasting from one place which is Chat-Gippity-4, then—although I’ve seen increasingly GitHub’s Copilot has been great at this and Code Whisperer, in my experience, has not yet been worth the energy it takes to really go diving into it. Your mileage may of course vary on that. But I found it was not making materially better or suggestions on CDK stuff then Copilot was.
Matthew: Yeah, I haven’t tried Code Whisperer outside of the shell. I’ve been using Copilot for the last year and absolutely adore it. I think it has completely changed the way that I felt about coding. I saw writing code for the last couple of years as being very tedious and very boring in terms of there weren’t interesting problems to solve, and Copilot, as I’ve seen it, is autocomplete on steroids. So, it doesn’t keep me from having to solve the interesting problems; it just keeps me from having to type out the boring solutions, and it’s the thing that I love about it.
Now, hopefully, Code Whisperer continues to get better over time. I’m hoping all of Amazon’s GenAI products continue to get better over time and I can maybe ditch a subscription to Copilot, but for now, Copilot is still my thing. And it’s producing good enough results for me. Thankfully because I’ve been working with it for four years now, I don’t rely on it to answer my questions about how to use constructs. I go back to the docs for those. If I need to.
Corey: It occurs to me that I can talk about this now because this episode will not air until after this has become generally available, but what’s really spanked it from my perspective has been Google’s Duet. And the key defining difference is, as I’m in one of these files—in many cases, I’m doing something with React these days due to an escalating series of weird choices—and—
Matthew: My apologies, by the way. My condolences, I should say.
Corey: Well, yeah. Well, things like Copilot Chat are great when they say, “Oh yeah, assuming that you’re handling the state this way in your component, now…” What I love about Duet is it goes, and it actually checks, which is awesome. And it has contextual awareness of the entire project, not just the three lines that I’m talking about, or the file that I’m looking at this moment. It goes ahead and does the intelligent thing of looking at some of these things. It still has some problems where it’s confidently wrong about things that really shouldn’t be, but okay, early days.
Matthew: Sure. Yeah, I’ll need to check that out a little bit more because I still, to this day, despise working with React. It is still my framework of choice because the ecosystem is so good around it. And so, established that I know that whatever problem I have, I’ll find 14 blogs, and maybe one of them is the answer that I want, versus any other framework where it still feels so very new and so very immature that I will probably beat my head more than I want to. Web development now is a hobby, not a job, so I don’t want to bang my head against a hobby project.
Corey: I tend to view, on some level, that these AIs coding assistants are good enough to get me almost anywhere I need to go, to the point where a beginner or enthusiastic amateur will be able to get sorted out. And for a lot of what I’m building, that’s all I really need. I don’t need this to be something that will withstand the rigors of production at a bank, for example. One challenge I have seen with all these things is there’s a delay in something being released and their training data growing to understand those things. Very often it’ll wind up giving me recommendations for—I forget the name of it, but there was a state manager in React that the first thing you saw when you installed it was, “This has been deprecated. This is the new replacement.” And if you explicitly ask about the replacement, it does the right thing, but it just cheerfully goes ahead and tells you to use ancient stuff or apply poor security practices or the rest.
Matthew: Yeah, that’s very scary to me, to be honest because I think these AI development tools—for me, it’s revitalized my interest in doing development, but where I get really, really scared is where they become a dependency in writing the right code. And every time I ever use Copilot to fill out stuff, I’m always double-checking, and I’m always making sure that this is right or that is right. And what I worry about is those developers who are maybe still learning some things, or are having to write in-line SQL on to their back-end and let Copilot, or Code Whisperer, or whatever tool they pick fill this stuff out, and that answer is based on a solution that works for a 10,000 record database, but fails horribly on a 100 million record database. And now all of a sudden, and you’ve got this problem that is just festering in through a dev environment, in through a QA environment, and even maybe into a prod environment, and you don’t find out that failure until six months later, when some database table runs past its magical limit and now all of sudden, you’ve got these queries that are failing, they’re crashing databases, they’re running into problems, and this developer that didn’t really know what they built in the first place is now being asked, “Why doesn’t your code work,” and they just sort of have to go, “Maybe ChatGPT can tell me why my code doesn’t work.” And that’s the scariest part of me to these things is that they’re a little bit too good at answering difficult questions with a simple answer. There is no, “It depends,” with these answers, and there needs to be for a lot of what we do in complex systems that, for example, in the AWS world, we’re expected to build complex systems, and ChatGPT and these other tools are bad at that.
Corey: We’re required to build complex systems, and, on some level, I would put that onus on Amazon in many respects. I mean, the challenge I keep smacking into is that they’re building—they’re giving you a bunch of components and expecting you to assemble them all yourself to achieve even relatively simple things. It increasingly feels like this is the direction that they want customers to go in because they’re bad at moving up the stack and develop—delivering integrated solutions themselves.
Matthew: Well, so I would wonder, would you consider a relatively simple system, then?
Corey: Okay, one of the things I like to do is go out in the evenings, and sometimes with a friend, I’ll have a few too many beers. And then I’ll come up with an idea for I want to redirect this random domain that I want to buy to someone else’s website. The end. Now, if you go with Namecheap, or GoDaddy, or one of these various things, you can set that up in their mobile app with a couple of clicks and a payment, and you’re done. With AWS, you have a minimum of six different services you need to work with, many of which do not support anything on a mobile basis and don’t talk to one another relatively well. I built a state machine out of step functions that will do a lot of it for me, but it’s an example of having to touch so many different things just for a relatively straightforward solution space that is a common problem. And that’s a small example, but you see it across the board.
Matthew: Yeah, yeah. I was expecting you to come up with a little bit of a different answer for what a simple system is, for example, a website. Everyone likes to say, “Oh, a static website with just raw HTML. That’s a simple”—
Corey: No, that’s hard as hell because the devil is in the details, and it slices you to ribbons whenever you go down that path.
Matthew: Exactly.
Corey: No, I’m talking things that a human being would do without needing to be an expert in getting that many different AWS services to talk to one another.
Matthew: Yeah, and I agree that AWS traditionally is very bad at moving up that stack and getting those things to work. You had mentioned at the very top of this about Amplify. Amplify is a system that I have tried once or twice, and I generally think that, for the right use case, is an excellent system and I really like a lot of what it does.
Corey: It is. I agree. Having gone down that, building up my scavenger hunt app that I’ll be open-sourcing at some point next year.
Matthew: Yeah. And it’s fantastic, but it has a very steep cliff where you hit that point where all of a sudden, you go, “Okay, I added this, and I added this, and I added this, and now I want to add this one other thing, but to do it, now all of a sudden, I have to go through a tremendous amount of work.” It wasn’t just the simple push button that the previous four steps were. Now, I have this one other thing that I need to do, and now it’s a very difficult thing to incorporate into my system. And I’m having to learn all new stuff that I never had to care about before because Amplify made it way too easy.
And I don’t think this is necessarily an AWS problem. I think this is just a fundamentally difficult software problem to solve. Microsoft, I spent years and years in the Microsoft world, and this was my biggest complaint about Microsoft was that they made extremely difficult things, far too simple to solve. And then once those systems became either buggy, problematic, misconfigured, whatever you want to call it, once they stopped working for some reason, the people who were responsible for figuring those answers out didn’t have the preceding knowledge because they didn’t need it. And then all of a sudden, they go, “Well, I don’t know how to solve this problem because I was told it was just this push-button thing.”
So, Amplify is great, and I think it’s fantastic, but it is a very, very difficult problem to solve. Amazon has proven to be very, very good at building the fundamentals, and I think that they function very well as a platform service, as a building blocks. But they give you the Lego pieces, and they expect you to build the very complex Batmobile. And they can maybe give you some custom pieces here and there, like the fenders, and the tires, and stuff like that, but that’s not their bread and butter.
Corey: Well, even starting with the CDK is a perfect example. Like, you can use the CDK init to create a new project from scratch, which is awesome. I love the fact that that exists, but it doesn’t go far enough. It doesn’t automatically create a repo you store the thing in that in turn hooks up to a CI/CD process that will wind up doing the build and deploy. Instead, it expects to do that all locally, which is a counter pattern. That’s an anti-pattern. It’ll lead you down the wrong path. And you always have to build these things from scratch yourself as you keep going. At least that’s what it feels like.
Matthew: Yeah, it is. And I think that here at Defiance Digital, our job as an MSP is to talk to the customer and figure out, but what are those very specific things you need? So, we do build new CDK repos all the time for our customers. But some of our customers want a trunk base system. Some of them want a branching or a development branch base system. Some of them have a very complex SDLC process within a PR stage of code changes versus a slightly less complex one after things have been merged into trunk.
So, we fundamentally look at it like we’re that bridge between the two, and in that case, AWS works great. In fact, all SaaS solutions are really nice because they give us those building blocks and then we provide value by figuring out which one of those we need to incorporate in for our clients. But every single one of our clients is very different. And we’ve only got, you know, less than a dozen right now. But you know, I’ve got project managers and directors always coming back to me and saying, “Well, how do we cookie-cutter this process?” And you can’t do it. It’s just very, very difficult.
Not in a small-scale. Maybe when you’re really big, and you’re a company like AWS who has thousands, if not potentially millions of customers, you can find those patterns, but it is a very fundamentally difficult problem to solve, and we’ve seen multiple companies over the last two decades try to do these things and ultimately fail. So, I don’t necessarily blame AWS for not having these things or not doing them well.
Corey: Yes and no. I mean, GitHub delivers excellent experience for the user, start to finish. There’s—Vercel does something very similar over in the front-end universe, too, where it is clearly possible, but it seems that designing user interfaces and integrating disparate things together is not an Amazon’s DNA, which makes sense when you view the two-pizza teams assembling to build larger things. But man, is that a frustration.
Matthew: Yeah. I really wonder if this two-pizza team mentality can ever work well for products that are bigger than just the fundamental concepts. I think Amplify is pretty good, but if you really want something that is this service that works for 80% of customers, you can’t do it with five people. You can’t do it with six. You need to have teams like what GitHub and what Vercel and other things, where teams are potentially dozens of people that really coordinate things and have a good project manager and product owner and understand the problem very well. And it’s just very difficult with these very, very small teams to get that going.
I don’t know what the future of AWS looks like. It feels like a very Microsoft in the mid-2000s, which is, they’re running off of their existing customers, they don’t really have a need to innovate significantly because they have a lot of people locked in, they would be just fine for years on years on end with the products they have. So, there isn’t a huge driver for doing it, not like, maybe, GCP or Azure really need to start to continue to innovate stronger in this space to pick up more customers. AWS doesn’t have a problem getting customers.
And if there isn’t a significant change in the mentality, like what Microsoft saw at the end of the 2000s with getting rid of Ballmer, bringing in Satya and really changing the mentality inside the company, I don’t see AWS breaking out from this anytime soon. But I think that’s actually a good thing. I think AWS should stick to just building the fundamentals, and I think that they should rely on their partners and their third parties to bridge that gap. I think Jeremy Daly at Ampt and what they’re building over there is a fantastic product.
Corey: Yeah. The problem is that Amazon seems to be in denial about a lot of this, at least with what they’re saying publicly.
Matthew: Yeah, but what they say publicly and how they feel internally could be very, very different. I would say that, you know, we don’t know what they’re thinking internally. And that’s fine. I don’t necessarily need to. I think more specifically, we need to understand what their roadmap looks like and we need to understand, you know, what, are they going to change in the future to maybe fill in some of these gaps.
I would say that the problem you said earlier about being able to do a simple website redirect, I don’t think that’s Amazon’s desire to build those things. I think there should be a third-party that’s built on top of AWS, and maybe even works directly within your AWS account as a marketplace product for doing that, but I don’t think that’s necessarily in the benefit of AWS to build that directly.
Corey: We’ll see. I’m very curious to see how this unfolds because a lot of customers want answers that require things that have to be assembled for them. I mean, honestly, a lot of the GenAI stuff is squarely in that category.
Matthew: Agreed, but is this something where AWS needs to build it internally, and then we’ve got a product like App Composer, or Copilot, or things where they try, and then because they don’t get enough traction, it just feels like they stall out and get stagnant? I mean, App Composer was a keynote product announcement during last year’s re:Invent, and this year, we saw them introduce the ability to step function editing within it, and introduce the functionality into your IDE, VS Code directly. Both good things, but a year’s worth of development effort to release those two features feels slow to me. The integration to VS Code should have been simple.
Corey: Yeah. They are not the innovative company that would turn around and deliver something incredible three months after something had launched, “And here’s a great new series of features around it.” It feels like the pace of innovation and face of delivery has massively slowed.
Matthew: Yeah. And that’s the scariest thing for me. And, you know, we saw this a little bit with a discussion recently in the cdk.dev server because if you take a look at what’s been happening with the CDK application for the last six months and even almost a year now, it feels like the pace of changes within the codebase has slowed.
There have been multiple releases over the course of the last year where the release at the end of the week—and they hit a pretty regular cadence of a release every week—that release at the end of the week fixes one bug or adds one small feature change to one construct in some library that maybe 10% of users are going to use. And that’s troublesome. One of the main reasons why I ditched the Terraform and went hard on the CDK was that I looked at how many issues were open on the Terraform AWS provider, and how many missing features were, and how slow they were to incorporate those in, and said, “I can’t invest another two years into this product if there isn’t going to be that innovation.” And I wasn’t in a place to do the development work myself—despite the fact that you can because it’s open-source and providers are forkable—and the CDK is getting real close to that same spot right now. So, this weekend—and I know this is going to come out, you know, weeks later—but you know, the weekend of December 10th, they announced a change to the way that they were going to take contributions from the CDK community.
And the long and short of it right now—and there’s still some debate over exactly what they said—is, we’re not going to accept brand-new L2 constructs from the community. Those have to be built internally by AWS only. That’s a dr—step in the wrong direction. I understand why they’re taking that approach. Contributions in the CDK have been very rough for the last four or five months because of the previous policies they put into place, but this is an open-source product. It’s supposed to be an open-source product. It’s also a very complex set of code because of all of the various AWS services that are being hit by it. This isn’t just Amplify, which is hitting a couple of things here and there. This is potentially—
Corey: It touches everything.
Matthew: It touches everything.
Corey: Yeah, I can see their perspective, but they’ve got to get way better at supporting things rapidly if they want to play that game.
Matthew: And they can’t do that internally with AWS, not with a two-pizza team.
Corey: No. And there’s an increasing philosophy I’m hearing from teams of, “Well, my service supports it. Other stuff, that’s not my area of responsibility.” The wisdom that I’ve seen that really encapsulates this is written on Colm MacCárthaigh’s old laptop in 2019: “AWS is the product.” That’s the truth. It’s not about the individual components; it’s about the whole, collectively.
Matthew: Right. And so, if we’re not getting these L2 constructs and these things being built out for all of the services that CloudFormation hits, then the product feels stalled, there isn’t a good initiative for users to continue trying to adopt it because over time, users are just going to hit more and more services in AWS, not fewer as they use the products. That’s what AWS wants. They want people to be using VPC Lattice and all the GenAI stuff, and Glue, and SageMaker, and all these things, but if you don’t have those L2 constructs, then there’s no advantage of the CDK over top of just raw CloudFormation. So, the step in the right direction, in my opinion, would have been to make it easier and better for outside contributions to get into CDK, and they went the opposite way, and that’s scary.
Now, they basically said, go build these on your own, go publish them on the Construct Hub, and if they’re good, we’ll incorporate them in. But they also didn’t define what good was, and what makes a good API. API development is very difficult. How do you build a construct that’s going to hit 80% of use cases and still give you an out for those other 20 you missed? That’s fundamentally hard.
Corey: It is. And I don’t know if there are good answers, yet. Maybe they’re going in the right direction, maybe they’re not.
Matthew: Time will tell. My hope is that I can try to do some videos here after the new year to try to maybe make this a better experience for people. What does good API design look like? What is it like to implement these things well so they can be incorporated in? There has been a lot of pushback already, just after the first couple of days, from some very vocal users within the CDK community saying, “This is bad. This is fundamentally bad stuff.”
Even from big fanboys like myself, who have supported the CDK, who co-authored the CDK Book, and they said, “This is not good.” So, we’ll see what happens. Maybe they change direction after a couple of days. Maybe this is— turns out to be a great way to do it. Only time will really tell at this point.
Corey: Awesome. And where can people go to find out more as you continue your exploration in this space and find out what you’re up to in general?
Matthew: So, I do have a Twitter account at@mattbonig on Twitter, however, I am probably going to be doing less and less over there. Engagement and the community as a whole over there has been problematic for a while, and I’ll probably be doing more on LinkedIn, so you can find me there. Just search for Matthew Bonig. It’s a very unique name.
I’ve also got a website, matthewbonig.com, and from there, you can see blog articles, and a link to my Advanced CDK course, which I’m going to continue adding sessions to over the course of the next few months. I’ve got one coming out shortly about the deadly embrace and how you can work through that problem with the deadly embrace and hopefully not be so scared about multi-stack applications.
Corey: I look forward to that because Lord knows, I’m running into that one myself increasingly frequently.
Matthew: Well, good. I will hopefully be able to get this video out and solve all of your problems very easily.
Corey: Awesome. Thank you so much for taking the time to speak with me. I appreciate it.
Matthew: Thank you for having me. I really appreciate it.
Corey: Matthew Bonig, Chief Cloud Architect at Defiance Digital, AWS Dev Tools Hero, and oh so much more. I’m Cloud Economist Corey Quinn, and this is Screaming in the Cloud. If you’ve enjoyed this podcast, please leave a five-star review on your podcast platform of choice, whereas if you’ve hated this podcast, please leave a five-star review on your podcast platform of choice along with an angry comment that you will then have to wind up building the implementation for that constructs that power that comment yourself because apparently we’re not allowed to build them globally anymore.
Corey: If your AWS bill keeps rising and your blood pressure is doing the same, then you need The Duckbill Group. We help companies fix their AWS bill by making it smaller and less horrifying. The Duckbill Group works for you, not AWS. We tailor recommendations to your business, and we get to the point. Visit duckbillgroup.com to get started.