Author: Richard Seroter

  • No cloud account, no problem. Try out change streams in Cloud Spanner locally with a dozen-ish shell commands.

    No cloud account, no problem. Try out change streams in Cloud Spanner locally with a dozen-ish shell commands.

    If you have a choice, you should test software against the real thing. The second best option is to use a “fake” that implements the target service’s API. In the cloud, it’s straightforward to spin up a real instance of a service for testing. But there are reasons (e.g. cost or speed) or times (e.g. within a CI pipeline, or rapid testing on your local machine) when an emulator is a better bet.

    Let’s say that you wanted to try out Google Cloud Spanner, and it’s useful change streams functionality. Consider creating a real instance and experimenting, but you have an alternative option. The local emulator just added support for change streams, and you can test the whole thing out from the comfort of your own machine. Or, to make life even easier, test it out from a free cloud machine.

    With just a Google account (which most everyone has?), you can use a free cloud-based shell and code editor. Just go to shell.cloud.google.com. We’ve loaded this environment up with language CLIs for Java, .NET, Go, and others. It’s got the Docker daemon running. And it’s got our gcloud CLI pre-loaded and ready to go. It’s pretty cool. From here, we can install the Spanner emulator, and run just a few shell commands to see the entire thing in action.

    Let’s begin by installing the emulator for Cloud Spanner. It takes just one command.

    sudo apt-get install google-cloud-sdk-spanner-emulator
    

    Then we start up the emulator itself with this command:

    gcloud emulators spanner start 
    

    After a couple of seconds, I see the emulator running, and listening on two ports.

    Great. I want to leave that running while having the freedom to run more commands. It’s easy to spin up new tabs in the Cloud Shell Editor, so I created a new one.

    In this new tab, I ran a set of commands that configured the gcloud CLI to work locally with the emulator. The CLI supports the concept of multiple configurations, so we create one that is emulator friendly. Also note that Google Cloud has the idea of “projects.” But if you don’t have a Google Cloud account, you’re ok here. For the emulators, you can use a non-existent value for “project” as I have here.

    gcloud config configurations create emulator
    gcloud config set auth/disable_credentials true
    gcloud config set project local-project
    gcloud config set api_endpoint_overrides/spanner http://localhost:9020/
    

    It’s time to create a (local) Spanner instance. I ran this one command to do so. It’s super fast, which makes it great for CI pipeline scenarios. That second command sets the default instance name so that we don’t have to provide an instance value in subsequent commands.

    gcloud spanner instances create test-instance \
       --config=emulator-config --description="Test Instance" --nodes=1
    gcloud config set spanner/instance test-instance
    

    Now, we need a database in this instance. Spanner supports multiple “dialects”, including PostgreSQL. Here’s how I create a new database.

    gcloud spanner databases create example-db --database-dialect=POSTGRESQL
    

    Let’s throw a couple of tables into this database. We’ve got one for Singers, and one for Albums.

    gcloud spanner databases ddl update example-db \
    --ddl='CREATE TABLE Singers ( SingerId bigint NOT NULL, FirstName varchar(1024), LastName varchar(1024), SingerInfo bytea, PRIMARY KEY (SingerId) )'
    gcloud spanner databases ddl update example-db \
    --ddl='CREATE TABLE Albums ( SingerId bigint NOT NULL, AlbumId bigint NOT NULL, AlbumTitle varchar, PRIMARY KEY (SingerId, AlbumId) ) INTERLEAVE IN PARENT Singers ON DELETE CASCADE'
    

    Now we’ll insert a handful of rows into each table.

    gcloud spanner databases execute-sql example-db \
      --sql="INSERT INTO Singers (SingerId, FirstName, LastName) VALUES (1, 'Marc', 'Richards')"
    gcloud spanner databases execute-sql example-db \
      --sql="INSERT INTO Singers (SingerId, FirstName, LastName) VALUES (2, 'Catalina', 'Smith')"
    gcloud spanner databases execute-sql example-db   \
      --sql="INSERT INTO Singers (SingerId, FirstName, LastName) VALUES (3, 'Alice', 'Trentor')"
    gcloud spanner databases execute-sql example-db   \
      --sql="INSERT INTO Albums (SingerId, AlbumId, AlbumTitle) VALUES (1, 1, 'Total Junk')"
    gcloud spanner databases execute-sql example-db   \
      --sql="INSERT INTO Albums (SingerId, AlbumId, AlbumTitle) VALUES (2, 1, 'Green')"
    

    If you want to prove this works (thus far), you can execute regular queries against the new tables. Here’s an example of retrieving the albums.

    gcloud spanner databases execute-sql example-db \
        --sql='SELECT SingerId, AlbumId, AlbumTitle FROM Albums'
    

    It’s time to turn on change streams, and this takes an extra step. It doesn’t look like I can smuggle utility commands through the “execute-sql” operation, so we need to run a DDL statement instead. Note that you can create change streams that listen to specific tables or columns. This one listens to anything changing in any table.

    gcloud spanner databases ddl update example-db \
    --ddl='CREATE CHANGE STREAM EverythingStream FOR ALL'
    

    If you want to prove everything is in place, you can run this command to see all the database objects.

    gcloud spanner databases ddl describe example-db --instance=test-instance
    

    I’m now going to open a third tab in the Cloud Shell Editor. This is so that we can continuously tail the change stream results. We’ve created this nice little sample project that lets you tail the change stream. Install the app by running this command in the third tab.

    go install github.com/cloudspannerecosystem/spanner-change-streams-tail@latest
    

    Then, in this same tab, we want the Go SDK (which this app uses) to look at the local emulator’s gRPC port instead of the public cloud. Set the environment variable that overrides the default behavior.

    export SPANNER_EMULATOR_HOST=localhost:9010
    

    Awesome. Now we start up the change stream app with a single command. You should see it start up and hold waiting for data.

    spanner-change-streams-tail -p local-project -i test-instance -d example-db -s everythingstream
    

    Back in the second tab (the first should still be running the emulator, the third is running the change stream tail), let’s add a new record to the Spanner database table. What SHOULD happen is that we see a change record pop up in the third tab.

    gcloud spanner databases execute-sql example-db   \
      --sql="INSERT INTO Albums (SingerId, AlbumId, AlbumTitle) VALUES (2, 2, 'Go, Go, Go')"
    

    Sure enough, I see a record pop into the third tab showing the before and after values of the row.

    You can mess around with updating records, deleting records, and so on. A change stream is powerful for event sourcing scenarios, or simply feeding data changes to downstream systems.

    In this short walkthrough, we tried out the Cloud Shell Editor, spun up the Spanner emulator, and experimented with database change streams. All without needing a Google Cloud account, or installing a lick of software on our own device. Not bad!

  • Daily Reading List – February 29, 2024 (#269)

    Tomorrow we get a Google-wide day off to recharge. I appreciate things like that. So, this will be the last reading list of the week.

    [news] Stack Overflow and Google Cloud Announce Strategic Partnership to Bring Generative AI to Millions of Developers. I like this. Great StackOverflow content gets surfaced to devs on Google Cloud. And StackOverflow gets a great hosting partner, and access to the best AI tech. More from TechCrunch, and a piece from StackOverflow on how they partner.

    [article] Improving Developer Experience Drives Profitability. You can ignore (important) outcomes like happier developers and high-quality software if you want. Even if you invest in dev experience for financial motives, the effort will be appreciated.

    [article] Product-Focused Reliability for SRE. Outstanding piece from the Google SRE team that proposes a product-focused model for defining SLOs and service overall.

    [blog] The industries leading on gen AI aren’t the ones you’d think. Would you have guessed that insurance, construction, and luxury goods companies would be the early adopters? Not me. Cool to see.

    [article] Sigstore: Secure and Scalable Infrastructure for Signing and Verifying Software. You’d be right if you thought this was an in-the-weeds topic, but it does matter a ton. Skim through this to get smarter on this project.

    [blog] Build AI-Powered Angular Apps with Google Gemini. Solid writeup here that gives plenty of examples of incorporating generative AI into web apps.

    [blog] Strangulating the monolith to a pluggable and scalable architecture. The McDonalds team shares how they’re adopting microservices.

    [blog] BigQuery and AlloyDB hit major milestone with AI-enabled updates. Big stuff here, including new support for models in BigQuery, vector search in our cloud databases, LangChain integrations, and more. Also see the BigQuery post and databases post.

    [article] Kubernetes clusters are typically using just 13% of CPU: CIOs could save a small fortune. Cloud-based elastic clusters can definitely help here. I suspect that many folks provision Kubernetes like they (over)provisioned classic hardware.

    [article] The Key to a Fulfilling Career? Variety. I get bored quickly at jobs, so this definitely resonated with me!

    ##

    Want to get this update sent to you every day? Subscribe to my RSS feed or subscribe via email below:

  • Daily Reading List – February 28, 2024 (#268)

    I’m wiped after a busy day; it’s the 1:1 conversations that really do it to me. I’m an introvert, so it takes extra effort to dial up the listening, engaging, and emoting. Worth it, but exhausting. My “relaxation” time often involves stealing a couple minutes to read the items below.

    [article] Meta’s new LLM-based test generator is a sneak peek to the future of development. Here’s a review of a paper from Meta about using LLMs to generate code improvements without regression and improve upon human-written tests.

    [blog] Gemma, Ollama and LangChainGo. I’ve seen a lot of experiments with Gemma. Here, Eli shows how straightforward it is to run locally on your machine.

    [guide] Infrastructure for a RAG-capable generative AI application using Vertex AI. This is an excellent new reference guide for a generative AI architecture consisting of data ingest, serving, and quality evaluation components.

    [article] How Netflix Really Uses Java. The presentation and transcript includes lots of details about what’s running at Netflix, their key tech choices, and what they’re excited about.

    [blog] Monitoring your latest app release just got easier. If you’re like me, you have very little patience for finicky mobile apps. This new Firebase dashboard lets you see key metrics in real-time after a release, which means you can fix things faster, and keep users happier.

    [article] Periodic Face-to-Face. Martin Fowler says that even remote-first teams need face to face time to build trust, uncover ideas, and confirm direction.

    [blog] The story of Google Nest’s migration to Cloud SQL on Google Cloud. Sometimes you switch cloud provider because an acquiring company asks you to! This is Nest’s story of moving self-managed data to a managed service in Google Cloud.

    [blog] India’s bloated IT services firms must learn from their startups to avoid GenAI meltdown. Generative AI represents a fundamental change that I services firms need to adjust to. This piece has some frank advice.

    [blog] How to prevent lateral movement techniques on Google Cloud. You don’t want attackers navigating across the network to find vulnerable resources. This post explores recent research from Palo Alto Networks, and how to avoid cloud misconfigurations.

    ##

    Want to get this update sent to you every day? Subscribe to my RSS feed or subscribe via email below:

  • Daily Reading List – February 27, 2024 (#267)

    Today’s list has some fun content to chew on and consider more deeply. Look at items on productivity, interviewing, and figuring out AI for your company.

    [blog] Build A Human-Centered Productivity Strategy. I’ve shared a lot here about developer productivity, but obviously it relates to a much broader discussion of how we work. This Forrester blog (which links to a $$ report) has good details on a better approach.

    [article] 5 Ways to Prepare for Situational Interview Questions. Are you on the job market? I liked the simple interview frameworks put forth by this Harvard Business Review article.

    [article] How Capable Leaders Navigate Uncertainty and Ambiguity. Speaking of interviewing, check out these excellent interview questions for those trying to judge whether a candidate is good at navigating uncertain and complex situations.

    [blog] Explore Duet AI to assist with React frontend application development. Here’s a good example of using AI-assisted prompting to build something that can be complex for newcomers. And, even those with plenty of experience!

    [article] How to cut through the AI noise. Enterprise companies making CapEx bets on AI-based tech seems … risky. There’s a lot of learning and scaling going on, and public cloud is designed for that.

    [blog] Introducing internal range API: simplify IP address management in Google Cloud. This seems useful for those with big IP blocks in the cloud.

    [blog] Cross-Cloud Network: Private, customizable and flexible networking. A double-dose of networking today, but I also liked this post about setting up a good cross-cloud network.

    [article] We CAN Have Nice Things: Upgrading to Java 21 Is Worth It. When Josh talks about Java, I listen. These look like great additions to the language.

    [blog] Increase Test Fidelity By Avoiding Mocks. Straightforward advice here: use the highest fidelity option to execute tests against dependencies.

    ##

    Want to get this update sent to you every day? Subscribe to my RSS feed or subscribe via email below:

  • Daily Reading List – February 26, 2024 (#266)

    Did you have a good weekend? I think I did. This work week started fast, so the weekend is a distant memory. I really enjoyed today’s reading list, and I hope you do too.

    [blog] How startups beat incumbents. Simply outstanding post. Study this for a way to think about disrupting incumbents, while also protecting yourself from disruption.

    [blog] Minimal downtime migration from PostgreSQL database to Spanner PostgreSQL dialect database. Your code may have a lot of PostgreSQL-aware syntax, but that doesn’t mean you can’t use a cloud-native database like Spanner. This post shows how you can migrate the backend without changing the frontend.

    [blog] Running machine learning in the cloud for live service games. You might not be in the gaming industry, but sometimes reference scenarios in other domains inspire us. This post (and accompanying GitHub repo) explain some valuable cases where gen AI will improve the experience.

    [blog] Rust developers concerned about complexity, low usage. There’s no shortage of viable programming languages out there. Rust is popular, but these seem like legit concerns to work on.

    [blog] Respond to Incoming SMS with NodeJS and Google Cloud Functions. The Twilio folks like to show how their platform works with others. Smart. They also just published one on sending SMS messages through Cloud Functions.

    [blog] AI: The Difference Between Open and Open Source. Stephen looks at our recent Gemma AI model release, and not confusing “open” with “open source.”

    [blog] Routing Enhancements for Go 1.22. These are common sense updates, and make Go much easier to use for HTTP services out of the box.

    [blog] Auto-provisioning Artifact Registry though Cloud Run Source Deploys. Nice little post by my colleague that shows how to deploy serverless workloads without NEEDING to set up a specific spot to store app artifacts.

    [article] What Makes a Code Change Easier to Review? Relatively short post that explores a paper about code changes. Specifically, it highlights the change description, size, and history as important factors.

    [article] Sabre completes migration to Google Cloud, closes 17 data centers. Being halfway done a cloud migration isn’t a fun place to be. Companies like Sabre moved fast, and now they get to reap the benefits of being almost fully in cloud.

    ##

    Want to get this update sent to you every day? Subscribe to my RSS feed or subscribe via email below:

  • Daily Reading List – February 23, 2024 (#265)

    Today’s reads are fairly Google-centric. On Fridays, I prepare 1-2 different newsletters, so I’m browsing through lots of that sort of content. Adjust your expectations accordingly!

    [blog] Gemini image generation got it wrong. We’ll do better. I was embarrassed by these results, and I’m glad other folks at Google were too. Not ok. Accuracy is paramount to earning trust.

    [blog] go run. This simple command lets Go developers run their app without any fuss. Chris writes a post celebrating its sneaky power.

    [article] 3 Ways to Help Struggling Open Source Communities. It’s not someone else’s job to keep the open source we depend on healthy. It’s all of us, right? This article looks at how to keep showing support to your favorite community.

    [blog] Orchestrate Vertex AI’s PaLM and Gemini APIs with Workflows. Chatbots won’t be the only way we interact with AI models. I can imagine a lot of back-office processes that can take advantage of AI in their workflows.

    [blog] Cut Container Startup Time for Better Performance and Costs — Part2. Here’s a good deep dive into the various configuration and cluster changes you’d make to improve container startup time for a workload.

    [blog] Summarizing meeting notes and amplifying visibility (prompt engineering). Can AI make meeting notes better? Probably. Tom has example prompts and workflows you can use too.

    [blog] Test-Driven Development with Java, Spring Boot and Duet AI in GCP. This example uses one particular AI-assisted dev tool, but you can follow these terrific instructions in most other tools too.

    [blog] What I like about Google’s Managed Prometheus. Some thing are inherently complex. Good products can still make it feel relatively simple to use. This is an example.

    ##

    Want to get this update sent to you every day? Subscribe to my RSS feed or subscribe via email below:

  • Daily Reading List – February 22, 2024 (#264)

    Whew. Busy day, with lots going on. There’s always time to learn, however, and I learned a few things from today’s reading list.

    [blog] Maturing Istio Ambient: Compatibility Across Various Kubernetes Providers and CNIs. Deep dive into the work needed to build a sidecar-less proxy Istio that works across distinct environments.

    [blog] Making AI more Open and Accessible to Cloud Developers with Gemma on Vertex AI. Laurent offers useful details and examples of this new open model.

    [blog] How the New York Times Games Data Team Revamped Its Reporting. Sometimes, a event triggers a long overdue change. Buying Wordle caused the NY Times team to get flooded with new data, and old reporting mechanisms weren’t sufficient.

    [blog] gemini-cli: Access Gemini models from the command-line. Cool experiment that I may actually take advantage of. Eli wanted to feed info about old blog posts to create a “related posts” feature for his blog. So he built a tool that any of us could try.

    [blog] Introducing Managed Instance Groups standby pool: Stop and suspend idle VMs. If you had a managed fleet of VMs in Google Cloud, you couldn’t stop or suspend them. Now, you can.

    [article] Nitpicking at code reviews is bad for everyone. Put machinery in place to do syntax and formatting checks. Use code reviews for more meaningful validation.

    [blog] Guide to Function Calling with Gemini and Google Apps Script. There’s no one “right” pattern for feeding data into generative AI-powered apps. Maybe you fine-tune a model. Or use a RAG-style architecture to feed extra context. And function-calling is another exciting option.

    [paper] Considerations for Evaluating Large Language Models for Cybersecurity Tasks. New, short paper that lists out some considerations for security scenarios with LLMs.

    [blog] Expanding our Partnership with Google. From the Reddit crew. Our post is here. Some media writeups exist too. In an LLM world, I can imagine that useful data sources will rightly monetize access.

    ##

    Want to get this update sent to you every day? Subscribe to my RSS feed or subscribe via email below:

  • Daily Reading List – February 21, 2024 (#263)

    We had some fun news today—more AI models that everyone can use—but lots of other things are going on too. My reading list rarely includes “news”; I skim those headlines, but I care more about long-form pieces that teach me something. Today’s list is mostly about those items.

    [blog] Gemma: Introducing new state-of-the-art open models. This made some news today. These new lightweight models from Google are ready to use and high quality. News coverage here, and another blog post about running Gemma in Google Cloud is here.

    [blog] Formula Pie Charts in Google Sheets. Who doesn’t like pie? This is a cool way to get mini pie charts in the rows of your spreadsheet.

    [blog] The Best of Both Angular Worlds: Standalone & Modules Combined. Admittedly, front-end frameworks still intimidate me. Just give me some JavaScript and CSS and I’m happy. Angular has gotten easier to use over the years, and this post is a good example.

    [blog] Web frameworks we are most excited for in 2024. Why am I reading so much today on web frameworks? I dunno. But this is a useful look at some of the ones with growing mindshare.

    [article] The State of Jamstack: Developers Want Return to Simplicity. Speaking of frameworks, there was also some bloat to the world of static sites and JavaScript. Looks like a return to simplicity is on the way.

    [article] Kubernetes Predictions Were Wrong. I remember when folks (and I likely said it myself) claimed that Kubernetes would be invisible by now. Just melted into the infrastructure and only a few folks would care about it. Not the case, at least not yet.

    [blog] Stable Diffusion WebUI on GKE Autopilot. You can do awesome things with Kubernetes. Such as running the text-to-image Stable Diffusion experience.

    [blog] A Brief History of Dependency Management in Go. Brief indeed. But, I liked the described evolution of how Go handled dependencies.

    [blog] Serverless data architecture for trade surveillance at Deutsche Bank. Serverless (or fully-managed) systems aren’t just for lightweight scenarios. Deutsche Bank uses this for a key regulatory scenario.

    ##

    Want to get this update sent to you every day? Subscribe to my RSS feed or subscribe via email below:

  • How I’d use generative AI to modernize an app

    How I’d use generative AI to modernize an app

    I’m skeptical of anything that claims to make difficult things “easy.” Easy is relative. What’s simple for you might draw blood from me. And in my experience, when a product claims to make something “easy”, it’s talking about simplifying a subset of the broader, more complicated job-to-be-done.

    So I won’t sit here and tell you that generative AI makes app modernization easy. Nothing does. It’s hard work and is as much about technology as it is psychology and archeology. But AI can make it easier. We’ll take any help we can get, right? I count at least five ways I’d use generative AI to make smarter progress on my modernization journey.

    #1 Understand the codebase

    Have you been handed a pile of code and scripts before? Told to make sense of it and introduce some sort of feature enhancement? You might spend hours, days, or weeks figuring out the relationships between components and side effects of any changes.

    Generative AI is fairly helpful here. Especially now that things like Gemini 1.5 (with its 1 million token input) exist.

    I might use something like Gemini (or ChatGPT, or whatever) to ask questions about the code base and get ideas for how something might be used. This is where the “generative” part is handy. When I use the Duet AI assistance in to explain SQL in BigQuery, I get back a creative answer about possible uses for the resulting data.

    In your IDE, you might use Duet AI (or Copilot, Replit, Tabnine) to give detailed explanations of individual code files, shell scripts, YAML, or Dockerfiles. Even if you don’t decide to use any generative AI tools to write code, consider using them to explain it.

    #2 Incorporate new language/framework features

    Languages themselves modernize at a fairly rapid pace. Does your codebase rely on a pattern that was rad back in 2011? It happens. I’ve seen that generative AI is a handy way to modernize the code itself while teaching us how to apply the latest language features.

    For instance, Go generics are fairly new. If your Go app is more than 2 years old, it wouldn’t be using them. I could go into my Go app and ask my generative AI chat tool for advice on how to introduce generics to my existing code.

    Usefully, the Duet AI tooling also explains what it did, and why it matters.

    I might use the same types of tools to convert an old ASP.NET MVC app to the newer Minimal APIs structure. Or replace deprecated features from Spring Boot 3.0 with more modern alternatives. Look at generative AI tools as a way to bring your codebase into the current era of language features.

    #3 Improve code quality

    Part of modernizing an app may involve adding real test coverage. You’ll never continuously deploy an app if you can’t get reliable builds. And you won’t get reliable builds without good tests and a CI system.

    AI-assisted developer tools make it easier to add integration tests to your code. I can go into my Spring Boot app and get testing scaffolding for my existing functions.

    Consider using generative AI tools to help with broader tasks like defining an app-wide test suite. You can use these AI interfaces to brainstorm ideas, get testing templates, or even generate test data.

    In addition to test-related activities, you can use generative AI to check for security issues. These tools don’t care about your feelings; here, it’s calling out my terrible practices.

    Fortunately, I can also ask the tool to “fix” the code. You might find a few ways to use generative AI to help you refactor and improve the resilience and quality of the codebase.

    #4 Swap out old or unsupported components

    A big part of modernization is ensuring that a system is running fully supported components. Maybe that database, plugin, library, or entire framework is now retired, or people don’t want to work with it. AI tools can help with this conversion.

    For instance, maybe it’s time to swap out JavaScript frameworks. That app you built in 2014 with Backbone.js or jQuery is feeling creaky. You want to bring in React or Angular instead. I’ve had some luck coaxing generative AI tools into giving me working versions of just that. Even if you use AI chat tools to walk you through the steps (versus converting all the code), it’s a time-saver.

    The same may apply to upgrades from Java 8 to Java 21, or going from classic .NET Framework to modern .NET. Heck, you can even have some luck switching from COBOL to Go. I wouldn’t blindly trust these tools to convert code; audit aggressively and ensure you understand the new codebase. But these tools may jump start your work and cut out some of the toil.

    #5 Upgrade the architecture

    Sometimes an app modernization requires some open-heart surgery. It’s not about light refactoring or swapping a frontend framework. No, there are times where you’re yanking out major pieces or making material changes.

    I’ve had some positive experiences asking generative AI tools to help me upgrade a SOAP service to REST. Or REST to gRPC. You might use these tools to switch from a stored procedure-heavy system to one that puts the logic into code components instead. Speaking of databases, you could change from MySQL to Cloud Spanner, or even change a non-relational database dependency back to a relational one. Will generative AI do all the work? Probably not, but much of it’s pretty good.

    This might be a time to make bigger changes like swapping from one cloud to another, or adding a major layer of infrastructure-as-code templates to your system. I’ve seen good results from generative AI tools here too. In some cases, a modernization project is your chance to introduce real, lasting changes to a architecture. Don’t waste the opportunity!

    Wrap Up

    Generative AI won’t eliminate the work of modernizing an app. There’s lots of work to do to understand, transform, document, and rollout code. AI tools can make a big difference, though, and you’re tying a hand behind your back if you ignore it! What other uses for app modernization come to mind?

  • Daily Reading List – February 20th, 2024 (#262)

    Yesterday was a holiday here in the States, so I’m back today with extra content. Enjoy!

    [article] Engineering Practices for LLM Application Development. Some of the engineering tasks and practices will differ based on the stack(s) you use, but many items seem universal. This article looks at automated and adversarial testing of LLM apps.

    [article] What is Hugging Face? Funny name, important platform. This was a surprisingly in-depth look at the platform that matters a lot in 2024.

    [blog] What’s new in Flutter 3.19. I like that a quarter of the community contributions in this release of the popular app framework came from first-time contributors. More on Dart SDK for Gemini. And Flutter’s 2024 roadmap.

    [blog] Reduce, reuse, recycle: McDonald’s reusable workflows. This post from their engineering team looks at how they use GitHub Actions to create some golden paths for continuous integration.

    [blog] The Future of Java Performance in Cloud Run: Native Java, CRaC and Project Leyden. The Java ecosystem continues to explore ways to build more performant apps. Here’s a look at some projects you should keep an eye on.

    [blog] Choosing Good SLIs. Do you have a useful set of service level indicators? Tyler has a useful post that calls out 3 that matter.

    [blog] Coming of age in the fifth epoch of distributed computing, accelerated by machine learning. How did we get to this wacky AI age? What computing paradigms set everything in motion? This is a good view (and infographic!) of the major epochs.

    [article] Making cloud infrastructure programmable for developers. Maybe we’ve hit peak YAML for infrastructure as code? The use of general programming languages for infrastructure management seems more appealing nowadays.

    [blog] Cloud CISO Perspectives: Guidance from our latest Threat Horizons report. Tons of links in this update. Good read if you want a view on current thinking on security.

    [blog] One Billion Rows Challenge in Golang. Java folks started this “one billion row challenge” to see how fast they could process a giant data file. Shraddha wanted to try it in Go and shares thoughts on ways to do it.

    [article] Orchestrating Resilience: Building Modern Asynchronous Systems. Distributed systems offer solutions to many problems, but also create problems of their own. One of those is handing retries for failed requests.

    ##

    Want to get this update sent to you every day? Subscribe to my RSS feed or subscribe via email below: