[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.
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?
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.
[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] 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.
Took a 16.5 hour flight today to get from Delhi to Newark. Then tomorrow morning I’ll fly home to California. Thank goodness for solid airplane wifi! Check out my reading list from today’s flight.
[article] How to Stay Grounded Through Organizational Chaos. If you’re surrounded by stability, that’s great. That’s not typical nowadays. This is a good article about how to handle turbulence at work.
[blog] What is a long context window? Maybe there’s less need for RAG if you can stuff most of the necessary supporting info into the model’s context window. Learn more about what that means.
[blog] Introducing vector search in BigQuery. Perform vector similarity searches on BigQuery data. There’s no data service anywhere quite like BigQuery.