Good day, and I’m heading out to meet a friend for tacos by the beach. No complaints! I really enjoyed the items I read today, and I think you will too.
[blog] Building a flexible platform for optimal use of LLMs. I think we’re going to see a LOT of this in 2024. Most every company will be building generative AI platforms for their teams to use. Here is what Intuit is doing.
[blog] Go slices, deleting items, and memory usage. Did you think that so much went into creating a “delete” operation on an array type? I was fascinated by Val’s explanation of what he added to the Go standard library.
[article] The open source problem. Matt says the big problems with OSS isn’t corporations using it without contributing. Rather, it’s that users/devs really only have one choice when licensing their creations.
[article] Using AI to Help Developers Work with Regular Expressions. Are you good at writing regular expressions? My friends, I am not. This seems like a good scenario for AI assistance. This article looks at a few options at your disposal.
[article] This Is The Easiest Way To Make Your Life More Awesome. Eric’s point is that you can improve your life through subtraction. There may be stages of life where you ignore this for good reason, but you likely settle into this reality over the long term.
[blog] Regional vs. zonal GKE clusters: making the right choice for your workloads. High availability is a choice in the public cloud. Sometimes it’s cheaper to be down then pay for extra resilience. Other times, downtime isn’t tolerable so you pay for better scale. This post explains some of the considerations.
Last Friday we had the day off, so I walked around our local zoo by myself. It was great! But I’m back in the saddle today, and this promises to be a very busy week. There’s always time for reading though, so please enjoy what I consumed today.
[blog] 4 Reasons to Use Angular for Your Next Web App. Love it. There are good reasons, but I also appreciate the quiet confidence of those using something good, who aren’t personally crushed if you don’t make the same choice.
[blog] The four tenets of SOA revisited. yes, tech is changing faster now than likely at any time in history. But there are plenty of durable ideas that stick around. Mark is starting a look at service oriented architecture principles.
[article] “Good enough” code is just not good enough. There are times when “good enough” is ok, but continuously adopting that approach doesn’t yield excellence in the long run.
##
Want to get this update sent to you every day? Subscribe to my RSS feed or subscribe via email below:
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.
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.
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.
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.
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!
[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.
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.
[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.
[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] 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:
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] 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.
[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.
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.
[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.
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] 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] 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] 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.
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] 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.
[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.