Author: Richard Seroter

  • Daily Reading List – July 16, 2024 (#356)

    Today’s reading list is once again full of lots of thought-provoking content and solid advice. Check out some good pieces on open source strategy, controlling LLM output, creating pull requests, and making software for a living.

    [blog] New Atlassian research on developer experience highlights a major disconnect between developers and leaders. These are good data points to have when trying to justify investment in dev experience. Many devs are losing time to inefficiencies, and devs place a high value in working at places with an investment in dev experience.

    [docs] Google models. We shipped a new page in our Cloud docs that explains our LLMs well, and, lets you click through to run them in Vertex AI even if you don’t have a Cloud account.

    [blog] The Post-Valkey World. Launch an open source project, reach scale, and relicense to something proprietary. This has been a popular playbook as of late, but Stephen wonders if the tide has turned.

    [article] Presti is using GenAI to replace costly furniture industry photo shoots. This is another case where you see how companies of all sizes can compete differently with AI at their disposal.

    [blog] Control LLM output with response type and schema. Mete helpfully walks through each step of getting incrementally more structured output from the LLM.

    [blog] Amazon GenAI Services. I saw a lot of hand-wringing last week from AWS customers/superfans after the AWS Summit. Maybe it was ok when other clouds focused heavily on AI, but not when AWS does it? Or, the concern could be that the AWS approach isn’t differentiated, and they’re clearly behind in mindshare? Either way, interesting.

    [article] Watch a robot navigate the Google DeepMind offices using Gemini. Fun, but informative, look at where large context helps this office-dwelling robot.

    [blog] In Praise of Small Pull Requests. A small pull request (or changelist, in Google terms) isn’t always possible, but should be the goal. That’s according to this short post from our Testing blog.

    [blog] The CEO’s Guide To Building Generative AI. Some optimistic and helpful guidance from the CEO at Forrester Research.

    [docs] Advanced load balancing overview. Some of the planet-scale, battle-tested load balancing algorithms used by Google itself are now available in the Cloud Service Mesh product.

    [blog] Lessons learned in 35 years of making software. Wonderful lessons here, especially for those that want to leave a positive mark behind.

    [blog] New Spanner geo-partitioning improves performance and lowers costs. Super cool. Partition your table’s data at the row level, but still get all the cohesion of a unified table.

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

  • Daily Reading List – July 15, 2024 (#355)

    Happy Monday! I had a productive weekend and also a lot of fun with the family. During some quiet time, I wrote up a blog post about using Apache Kafka in the cloud. That was the result of a dozen or so hours of experimentation during my vacation week.

    [article] What exactly is an AI agent? There’s not exactly consensus here, so this article explores how a handful of folks are defining it.

    [youtube-video] The software engineering industry in 2024: what changed in 2 years, why, and what is next. Here’s an excellent talk from Gergely on a wide range of topics including career progress in tech, choosing boring tech, and what to do with AI.

    [docs] Disaster recovery planning guide. How often are you exercising your DR plans? Be honest with me. Do you have DR plans that you trust? This is a great set of documentation for those properly planning for disasters.

    [article] Are You Done Yet? Mastering Long-Running Processes in Modern Architectures. I shared some pieces last week about long-running HTTP requests, and here’s more about design considerations for long-running processes.

    [blog] Text classification with Gemini and LangChain4j. This is a terrific look at text classification techniques with generative AI. All Java fans should be reading Guillaume if they aren’t already.

    [article] As CISOs grapple with the C-suite, job satisfaction takes a hit. There’s a lot of pressure on the top security folks, and their satisfaction seems connected to how well they can access and impact senior leaders.

    [blog] Cloud CISO Perspectives: How to think about security budgets. Phil offers fresh guidance for CISOs as they plan for budget requests.

    [article] Designing a Successful Reskilling Program. Are you planning or running a reskilling program right now? I thought this article had good guidance on metrics, bringing the team along, and providing the right air cover.

    [blog] Flexible committed-use discounts are now even more flexible. Smart tech leaders use whatever financial instruments they have at their disposal, and CUDs are an important one. I like that you can now use them across compute products in Google Cloud.

    [blog] GenAI or Die. Some blazing hot perspective, but I do think the underlying point is right. This time it’s different, and disruption is going to hit some harder than others.

    [blog] Safeguarding App Health and Consumer Experience with Metric-Aware Rollouts. The Doordash Engineering team does a nice job explaining the metrics they track during rollouts, how they support experimentation, and more.

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

  • Three Ways to Run Apache Kafka in the Public Cloud

    Three Ways to Run Apache Kafka in the Public Cloud

    Yes, people are doing things besides generative AI. You’ve still got other problems to solve, systems to connect, and data to analyze. Apache Kafka remains a very popular product for event and data processing, and I was thinking about how someone might use it in the cloud right now. I think there are three major options, and one of them (built-in managed service) is now offered by Google Cloud. So we’ll take that for a spin.

    Option 1: Run it yourself on (managed) infrastructure

    Many companies choose to run Apache Kafka themselves on bare metal, virtual machines, or Kubernetes clusters. It’s easy to find stories about companies like Netflix, Pinterest, and Cloudflare running their own Apache Kafka instances. Same goes for big (and small) enterprises that choose to setup and operate dedicated Apache Kafka environments.

    Why do this? It’s the usual reasons why people decide to manage their own infrastructure! Kafka has a lot of configurability, and experienced folks may like the flexibility and cost profile of running Apache Kafka themselves. Pick your infrastructure, tune every setting, and upgrade on your timetable. On the downside, self-managed Apache Kafka can result in a higher total cost of ownership, requires specialized skills in-house, and could distract you from other high-priority work.

    If you want to go that route, I see a few choices.

    There’s no shame in going this route! It’s actually very useful to know how to run software like Apache Kafka yourself, even if you decide to switch to a managed service later.

    Option 2: Use a built-in managed service

    You might want Apache Kafka, but not want to run Apache Kafka. I’m with you. Many folks, including those at big web companies and classic enterprises, depend on managed services instead of running the software themselves.

    Why do this? You’d sign up for this option when you want the API, but not the ops. It may be more elastic and cost-effective than self-managed hosting. Or, it might cost more from a licensing perspective, but provide more flexibility on total cost of ownership. On the downside, you might not have full access to every raw configuration option, and may pay for features or vendor-dictated architecture choices you wouldn’t have made yourself.

    AWS offers an Amazon Managed Streaming for Apache Kafka product. Microsoft doesn’t offer a managed Kafka product, but does provide a subset of the Apache Kafka API in front of their Azure Event Hubs product. Oracle cloud offers self-managed infrastructure with a provisioning assist, but also appears to have a compatible interface on their Streaming service.

    Google Cloud didn’t offer any native service until just a couple of months ago. The Apache Kafka for BigQuery product is now in preview and looks pretty interesting. It’s available in a global set of regions, and provides a fully-managed set of brokers that run in a VPC within a tenant project. Let’s try it out.

    Set up prerequisites

    First, I needed to enable the API within Google Cloud. This gave me the ability to use the service. Note that this is NOT FREE while in preview, so recognize that you’ll incur changes.

    Next, I wanted a dedicated service account for accessing the Kafka service from client applications. The service supports OAuth and SASL_PLAIN with service account keys. The latter is appropriate for testing, so I chose that.

    I created a new service account named seroter-bq-kafka and gave it the roles/managedkafka.client role. I also created a JSON private key and saved it to my local machine.

    That’s it. Now I was ready to get going with the cluster.

    Provision the cluster and topic

    I went into the Apache Kafka for BigQuery dashboard in the Google Cloud console—I could have also used the CLI which has the full set of control plane commands—to spin up a new cluster. I get very few choices, and that’s not a bad thing. You give the CPU and RAM capacity for the cluster, and Google Cloud creates the right shape for the brokers, and creates a highly available architecture. You’ll also see that I choose the VPC for the cluster, but that’s about it. Pretty nice!

    In about twenty minutes, my cluster was ready. Using the console or CLI, I could see the details of my cluster.

    Topics are a core part of Apache Kafka represent the resource you publish and subscribe to. I could create a topic via the UI or CLI. I created a topic called “topic1”.

    Build the producer and consumer apps

    I wanted two client apps. One to publish new messages to Apache Kafka, and another to consume messages. I chose Node.js and JavaScript as the language for the app. There are a handful of libraries for interacting with Apache Kafka, and I chose the mature kafkajs.

    Let’s start with the consuming app. I need (a) the cluster’s bootstrap server URL and (b) the encoded client credentials. We access the cluster through the bootstrap URL and it’s accessible via the CLI or the cluster details (see above). The client credentials for SASL_PLAIN authentication consists of the base64 encoded service account key JSON file.

    My index.js file defines a Kafka object with the client ID (which identifies our consumer), the bootstrap server URL, and SASL credentials. Then I define a consumer with a consumer group ID and subscribe to the “topic1” we created earlier. I process and log each message before appending to an array variable. There’s an HTTP GET endpoint that returns the array. See the whole index.js below, and the GitHub repo here.

    const express = require('express');
    const { Kafka, logLevel } = require('kafkajs');
    const app = express();
    const port = 8080;
    
    const kafka = new Kafka({
      clientId: 'seroter-consumer',
      brokers: ['bootstrap.seroter-kafka.us-west1.managedkafka.seroter-project-base.cloud.goog:9092'],
      ssl: {
        rejectUnauthorized: false
      },
      logLevel: logLevel.DEBUG,
      sasl: {
        mechanism: 'plain', // scram-sha-256 or scram-sha-512
        username: 'seroter-bq-kafka@seroter-project-base.iam.gserviceaccount.com',
        password: 'tybgIC ... pp4Fg=='
      },
    });
    
    const consumer = kafka.consumer({ groupId: 'message-retrieval-group' });
    
    //create variable that holds an array of "messages" that are strings
    let messages = [];
    
    async function run() {
      await consumer.connect();
      //provide topic name when subscribing
      await consumer.subscribe({ topic: 'topic1', fromBeginning: true }); 
    
      await consumer.run({
        eachMessage: async ({ topic, partition, message }) => {
          console.log(`################# Received message: ${message.value.toString()} from topic: ${topic}`);
          //add message to local array
          messages.push(message.value.toString());
        },
      });
    }
    
    app.get('/consume', (req, res) => {
        //return the array of messages consumed thus far
        res.send(messages);
    });
    
    run().catch(console.error);
    
    app.listen(port, () => {
      console.log(`App listening at http://localhost:${port}`);
    });
    

    Now we switch gears and go through the producer app that publishes to Apache Kafka.

    This app starts off almost identically to the consumer app. There’s a Kafka object with a client ID (different for the producer) and the same pointer to the bootstrap server URL and credentials. I’ve got an HTTP GET endpoint that takes the querystring parameters and publishes the key and value content to the request payload. The code is below, and the GitHub repo is here.

    const express = require('express');
    const { Kafka, logLevel } = require('kafkajs');
    const app = express();
    const port = 8080; // Use a different port than the consumer app
    
    const kafka = new Kafka({
        clientId: 'seroter-publisher',
        brokers: ['bootstrap.seroter-kafka.us-west1.managedkafka.seroter-project-base.cloud.goog:9092'],
        ssl: {
          rejectUnauthorized: false
        },
        logLevel: logLevel.DEBUG,
        sasl: {
          mechanism: 'plain', // scram-sha-256 or scram-sha-512
          username: 'seroter-bq-kafka@seroter-project-base.iam.gserviceaccount.com',
          password: 'tybgIC ... pp4Fg=='
        },
      });
    
    const producer = kafka.producer();
    
    app.get('/publish', async (req, res) => {
      try {
        await producer.connect();
    
        const _key = req.query.key; // Extract key from querystring
        console.log('key is ' + _key);
        const _value = req.query.value // Extract value from querystring
        console.log('value is ' + _value);
    
        const message = {
          key: _key, // Optional key for partitioning
          value: _value
        };
    
        await producer.send({
          topic: 'topic1', // Replace with your topic name
          messages: [message]
        });
    
        res.status(200).json({ message: 'Message sent successfully' });
    
      } catch (error) {
        console.error('Error sending message:', error);
        res.status(500).json({ error: 'Failed to send message' });
      }
    });
    
    app.listen(port, () => {
      console.log(`Producer listening at http://localhost:${port}`);
    });
    
    

    Next up, containerizing both apps so that I could deploy to a runtime.

    I used Google Cloud Artifact Registry as my container store, and created a Docker image from source code using Cloud Native buildpacks. It took one command for each app:

    gcloud builds submit --pack image=gcr.io/seroter-project-base/seroter-kafka-consumer
    gcloud builds submit --pack image=gcr.io/seroter-project-base/seroter-kafka-publisher

    Now we had everything needed to deploy and test our client apps.

    Deploy apps to Cloud Run and test it out

    I chose Google Cloud Run because I like nice things. It’s still one of the best two or three ways to host apps in the cloud. We also make it much easier now to connect to a VPC, which is what I need. Instead of creating some tunnel out of my cluster, I’d rather access it more securely.

    Here’s how I configured the consuming app. I first picked my container image and a target location.

    Then I chose to use always-on CPU for the consumer, as I had connection issues when I had a purely ephemeral container.

    The last setting was the VPC egress that made it possible for this instance to talk to the Apache Kafka cluster.

    About three seconds later, I had a running Cloud Run instance ready to consume.

    I ran through a similar deployment process for the publisher app, except I kept the true “scale to zero” setting turned on since it doesn’t matter if the publisher app comes and goes.

    With all apps deployed, I fired up the browser and issued a pair of requests to the “publish” endpoint.

    I checked the consumer app’s logs and saw that messages were successfully retrieved.

    Sending a request to the GET endpoint on the consumer app returns the pair of messages I sent from the publisher app.

    Sweet! We proved that we could send messages to the Apache Kafka cluster, and retrieve them. I get all the benefits of Apache Kafka, integrated into Google Cloud, with none of the operational toil.

    Read more in the docs about this preview service.

    Option 3: Use a managed provider on your cloud(s) of choice

    The final way you might choose to run Apache Kafka in the cloud is to use a SaaS product designed to work on different infrastructures.

    The team at Confluent does much of the work on open source Apache Kafka and offers a managed product via Confluent Cloud. It’s performant, feature-rich, and runs in AWS, Azure, and Google Cloud. Another option is Redpanda, who offer a managed cloud service that they operate on their infrastructure in AWS or Google Cloud.

    Why do this? Choosing a “best of breed” type of managed service is going to give you excellent feature coverage and operational benefits. These platforms are typically operated by experts and finely tuned for performance and scale. Are there any downside? These platforms aren’t free, and don’t always have all the native integrations into their target cloud (logging, data services, identity, etc) that a built-in service does. And you won’t have all the configurability or infrastructure choice that you’d have running it yourself.

    Wrap up

    It’s a great time to run Apache Kafka in the cloud. You can go full DIY or take advantage of managed services. As always, there are tradeoffs with each. You might even use a mix of products and approaches for different stages (dev/test/prod) and departments within your company. Are there any options I missed? Let me know!

  • Daily Reading List – July 12, 2024 (#354)

    Finished the week mostly caught up and ready for the weekend. I’m trying to finish writing a tech blog post for publication here, but my demo app is misbehaving. Hopefully better luck this weekend.

    [article] How To Measure Platform Engineering. This article proposes using a series of specific metrics to measure how useful your platform is for developers and the business overall.

    [blog] How to Implement OAuth 2.0 into a Golang App. I’ll be honest with you, authentication protocols (SAML, OAuth, OIDC) are not my love language. I like my security stuff to be as invisible as possible. But this is a good walkthrough of the plumbing.

    [blog] IAM so lost: A guide to identity in Google Cloud. Relatedly, identity management is my kryptonite. It’s easy for it to kill my momentum when building an app. However, I liked the way it was explained in this post.

    [blog] How to Run Hugging Face Models Programmatically Using Ollama and Testcontainers. It’s been interesting to watch how the Docker team has leveraged their acquisition of AtomicJar (testcontainers). Posts like this make me think this was a great match.

    [docs] From multi-cluster edge to mesh: Globally distributed applications exposed through GKE Gateway and Cloud Service Mesh. I read through this brand new architecture guide that shows you how to build a resilient architecture with Kubernetes clusters and a service mesh.

    [article] CIOs resist vendor-led AI hype, seeking out transparency. Make good choices, pick tech for the right reasons. But it’s also interesting to read this take where CIOs are saying their being too cautious on using generative AI. I don’t know what to believe anymore.

    [blog] Firebase Just Got Smarter: Meet Your New AI Development Assistant. This offers a deeper dive into the AI assistance included in this mobile and app platform.

    [article] Barriers to AI adoption. So good. This summary of a recent research paper provides such a relatable set of concerns that AI superfans need to consider as they try to grow adoption.

    [blog] Google BigQuery vs. Snowflake: A head-to-head comparison of cloud data warehouses. Here’s a fairly massive deep-dive into these two platforms, with details that may help you choose the right one for your situation.

    [paper] Speculative RAG: Enhancing Retrieval Augmented Generation through Drafting. This new paper proposes a different RAG framework that can increase accuracy and decrease latency.

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

  • Daily Reading List – July 11, 2024 (#353)

    You’ll find a whole lot of advice in today’s reading list. Advice on public speaking, changing IT culture, being resilient in a crisis, and even how to A/B test!

    [blog] Long Document Summarization Techniques with Java, Langchain4J and Gemini models. Dan looks at three techniques you can use to summarize big docs with Java and your favorite LLM.

    [blog] The Product Model in Traditional IT. Can you bring the product model to other types of orgs? This post looks at when it can work with traditional IT teams, when it doesn’t, and what has to change.

    [blog] Programming, Fluency, and AI. Important post from Mike. If you’re not fluent in the thing you’re doing with the AI, you’re easily replaceable by AI. Don’t skip depth.

    [article] The Anatomy of Slow Code Reviews. Slow reviews are a motivation killer. Google measures this closely. Here’s a post that explores the source of code review challenges.

    [blog] The secrets of public speaking. Brian offers up some very good advice for those trying to improve their public speaking, or build up their confidence in the first place.

    [blog] How I sent 500 million HTTP requests to 2.5 million hosts. Loved this. It’s a good answer to “what happens when I submit a web request” while also showing how you’d optimize a lot of calls.

    [article] How To Be More Resilient: 6 Steps To Success When Life Gets Hard. There’s no pill or item to purchase to make you more resilient. Most of this advice from Eric relates to attitude.

    [blog] BigQuery QUALIFY Clause: Towards Cleaner SQL Queries. I’ve got very dated SQL syntax knowledge. QUALIFY is not in my wheelhouse, but now I know more about it.

    [article] Why Ruby on Rails Is Still Worth Your While as a Developer. Ruby is a tier-2 language at this point—viable, but not as vendor-supported or used as others—but that doesn’t mean it’s not a good language to work with.

    [article] There’s a Smarter Way to A/B Test. Running A/B tests on your product can be expensive. This article proposes different assignment rules that let you run shorter trials.

    [article] AI Success Depends on Tackling “Process Debt.” Don’t use AI to automate or augment bad processes. Use this technology moment to rethink processes and start fresh.

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

  • Daily Reading List – July 10, 2024 (#352)

    Folks on my team are analyzing (digital) watering holes where developers hang out. There’s no one place! It seems to differ by experience, region, and whether you’re in a big company or a freelancer. What are your top three hangouts? Tell me in the comments.

    [paper] Searching for Best Practices in Retrieval-Augmented Generation. Good paper that expresses opinions after an investigation of techniques and practices for RAG with LLMs.

    [blog] Vertex AI Studio vs. Google AI Studio: Choosing the Right AI Tool for Your Startup. We offer a couple of different surfaces today for those building with AI. I thought this was a solid comparison.

    [blog] State of the Cloud 2024. I’m not ready to start using “AI Cloud” as a term, but what are tech leaders and investors thinking about the future of cloud? This report sheds some light.

    [article] You could learn a lot from a CIO with a $17B IT budget. JPMorgan Chase has a massive IT budget and team, and does a ton of meaningful work. Here’s a good story about their approach.

    [blog] Building PDF Open Source Services with Angular & GCP — Handling long processing tasks. Yesterday’s reading list contained an item about long-running HTTP requests. This post shows a real implementation of such a pattern.

    [article] Creating Stability Is Just as Important as Managing Change. I work in a fairly dynamic place where things change often to meet the changing market needs. This post on “stability management” is important for those that don’t want to overly unnerve teams during times of change.

    [blog] Optimizing CI with Bazel and Kaniko in Cloud Build. Bazel is used by lots of folks as a flexible build tool. This post goes keep into how to use it with a cloud-based CI tool.

    [blog] Meta’s approach to machine learning prediction robustness. Learn more about how the Meta Ads business delivers a reliable and high-quality ML predictions solution.

    [blog] Get started with Gemma on Ray on Vertex AI. Do some fine-tuning of the newest open Gemma model and see what the steps look like.

    [article] The Big Interview: Solo.io CEO Idit Levine gets “Ambient.” I don’t see many long-form interviews of tech folks anymore, so this was refreshing. It’s a good read about a leader and space that’s evolved over time.

    [article] 8 reasons developers love Go—and 8 reasons they don’t. Love and hate are strong emotions, but better than feeling “meh” about something. These are valid reasons you’ll like or dislike Go.

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

  • Daily Reading List – July 9, 2024 (#351)

    I’m still emptying out a long reading queue from the vacation break. You’ll find some good advice in the items listed below.

    [blog] Avoiding long-running HTTP API requests. Good post from Derek. There are a few patterns to consider when dealing with a request that can take a long time to process.

    [blog] Building Flexible and Maintainable Go-Lang Apps. I admittedly didn’t know Google created a dependency injection framework for Go named Wire. Now I do.

    [blog] RAG API powered by LlamaIndex on Vertex AI. This offers up a good walkthrough of a powerful LLM orchestration framework that you can use to customize results based on your corpus of data.

    [blog] Chrome Prompt Playground. AI is definitely going to replace some work that engineers do. Simon used Claude to quickly build a playground interface for the built-in Chrome LLM.

    [blog] Understanding BigQuery data canvas: how to easily transform data into insights with AI. I need to play with this more, but I like the idea behind this UX for exploring and analyzing data. The post points to a demonstration you can run yourself.

    [blog] Boost performance of Go applications with profile-guided optimization. This is a very cool Go feature. Pass in CPU profiling info and get an optimized build. Here’s how to test that out.

    [blog] Share your streaming data with Pub/Sub topics in Analytics Hub. This is very cool. Most hyperscale clouds offer a “data exchange” type experience to sell your business data. But we’ve added the ability to also publish streaming Pub/Sub topics for outsiders to subscribe to.

    [blog] Introduction to Federated Learning. Train locally (on device, in your data center), upload a trained model, and aggregate all those models into a complete model. It’s a powerful concept that’s applied today in a few cases.

    [article] Survey Surfaces Lots of Software Supply Chain Insecurity. AI chatter can drown out other topics, but don’t sleep on supply chain security. Security professionals aren’t.

    [blog] AI Conundrums. Here’s a series of musings from Stephen that is well worth your time to read.

    [blog] Scaling Chick-fil-A’s Design System from Tool to Service. I don’t think I’ve heard the term “DesignOps” before, but let’s roll with it. The CFA team takes a broad approach to design team work.

    [blog] Counting Gemini text tokens locally. Maybe you use on LLM for small requests, and another for giant ones? How can you count input tokens to know which LLM to call? Our latest Python SDK has a local tokenizer that does the job.

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

  • Daily Reading List – July 8, 2024 (#350)

    And I’m back. That was an excellent week off full of sun and fun. I tinkered around with a few tech things—reading books on data science, building a Kafka demo—but I mostly disconnected and embraced the free time. My reading queue was full of interesting items, hot takes, and educational material. Dig in.

    [article] How DevProd teams got funded: 20 real-world examples. Do you have a formal developer productivity program in your team? Where does the funding come from?

    [article] This AI cloud: How Google Gemini will help everyone build things faster, cheaper, better. I chatted with David at ZDNet about AI-assisted development and the future of this type of technology.

    [blog] Serving a billion web requests with boring code. Here’s an excellent post with a good set of lessons learned about technology choices and design patterns.

    [blog] FleetOps: Can the GKE Enterprise Stack Help Self-service Platforms Sync and Swim? Are integrated stacks “back”? Did they ever leave? Paul writes up a post that looks at an integrated GKE experience that forms the foundation of a good developer platform.

    [docs] Migrate from AWS to Google Cloud: Migrate from Amazon RDS for SQL Server to Cloud SQL for SQL Server. I thought this provided a good set of advice for most any “from –> to” database migration. There are obviously some specific details to the target and destination listed here, but many parts of the workflow are general purpose.

    [blog] What is Spring Modulith? Introduction to modular monoliths. If you like some of the loose coupling of a distributed system but appreciate the understand-ability of a monolithic app, you might like the “modular monolith” pattern. Here’s an example in Spring Boot.

    [blog] TDD. You’re Doing it Wrong. Test-driven development is a useful practice, but there are wrong ways to do it, as John points out here.

    [podcast] Navigating Corporate Giants: Jeffrey Snover and the Making of PowerShell. Listen (or read the transcript) to this conversation with Jeffrey who fought hard to build PowerShell within Microsoft.

    [blog] DevRel’s Death as Zero Interest Rate Phenomenon. Not wrong, and it’s a good thing. No more devrel talking to devrel and working on whatever seems interesting. Now it’s about being aligned to biz priorities, demonstrating deep expertise, and owning the delivery of an outstanding dev experience.

    [article] AI’s moment of disillusionment. Matt’s been on this “skeptic” thread for a while, but always with an eye towards folks making good choices. Don’t fall into either extreme of recklessly applying AI to everything, or, sitting entirely on the sidelines.

    [blog] Latest Gemini features support in LangChain4j 0.32.0. I’m not disillusioned about AI when I keep seeing the positive progress towards quality tooling and libraries that help folks build useful systems. Great new stuff in this Java library.

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

  • Daily Reading List – June 28, 2024 (#349)

    I’m glad to be home after a busy work week out of town. I’m a single dad next week while my wife and son are on a trip together, so I’m taking it as vacation. I’ll be back with this reading list on July 8th!

    [blog] Making Vertex AI the most enterprise-ready generative AI platform. Lots of news here, including Gemini 1.5 Flash going GA, Gemini 1.5 Pro introducing 2 million input tokens, the Imagen 3 image-generation model is in preview, context caching, provisioned throughput, and much more.

    [blog] Google Cloud expands grounding capabilities on Vertex AI. There’s a really good story here for those building low-code or code-based AI agents.

    [blog] 5 Myths About Zero Trust in the Cloud, Busted. There’s a vendor angle here, but it’s still a useful look at zero trust if you’re unfamiliar with the idea.

    [blog] Doubling calculation speed and other new innovations in Google Sheets. I might spend more time in Google Sheets than VS Code. That’s not a flex; it’s a cry for help. But, it’s a good thing I like Sheets.

    [blog] Open challenges for AI engineering. Great presentation and writeup from Simon that looks at what’s new in AI and open challenges for the industry.

    [blog] Gemma 2 is now available to researchers and developers. This open model has proven fairly popular, and the new version is performant, fast, and efficient.

    [blog] Developer Experience Is Still Developing. Forrester folks have been doing solid research into developer experience, and this post teases a new report they have. Worth reading!

    [blog] How to: Build a Chat Web Application with Streamlit, Cloud Run and Gemini Flash. Very straightforward demo, and it shows off the power of APIs, frameworks, and serverless.

    [blog] Deploy Python pipelines on Kubernetes using the Flink runner. If you want to geek out on data streaming this weekend, you could try following along with this post.

    [blog] My 5 favorite ways of keeping the technical axe sharp. How do you stay on top of things? Maybe reading this daily list is one of your strategies. This post looks at a few ways to stay sharp.

    ##

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

  • Daily Reading List – June 27, 2024 (#348)

    We had a great customer council meeting today in New York, and I love it when customers can be in a room with us for a day to provide feedback and hear about roadmaps. Back home tomorrow.

    [blog] Gemini 1.5 Pro 2M context window, code execution capabilities, and Gemma 2 are available today. Each of these is super valuable. Even larger input context for one-shot requests into the LLM. Use Gemini to execute and iterate on Python code. And access our latest open model.

    [article] What GitHub Pull Requests Reveal about Your Team’s Dev Habits. Looking for hidden patterns in your git transactions? Some researchers did just that.

    [blog] “It’s a Balance” isn’t always the answer. I liked this post that explored a handful of decision making approaches to use based on the situation at hand.

    [blog] Infrastructure as Code Landscape Overview 2024. Brian uses this post to look at declarative resource-oriented provisioning tools, so not things like Ansible, Chef, or Docker. If you’ve heard of all of these tools, you are a wizard.

    [blog] Transformation Regrets. We often just hear survivor stories about how great something was. History is written by the winners! But where have things gone wrong on product transformations? Marty covers that here.

    [blog] 110 new languages are coming to Google Translate. More than half a billion people speak the languages we just added to Google Translate.

    [blog] Structuring Go Code for CLI Applications. The “right” project structure is the one that works for you, but most of us can pick up good practices from others.

    [article] How Expedia Group Moved From 21 Platform Stacks to 1. Consolidation is so hot right now! Good teams are looking to reduce redundancy is their platforms, tools, and stacks.

    [blog] Enhancing Netflix Reliability with Service-Level Prioritized Load Shedding. Cool post from Netflix about how they smartly throttle pre-fetch requests to ensure that user-initiated requests get priority under load.

    ##

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