<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Danica Fine</title>
    <description>The latest articles on DEV Community by Danica Fine (@thedanicafine).</description>
    <link>https://dev.to/thedanicafine</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1019791%2F0aa326d2-abe8-4286-bf90-0ab1917566db.jpg</url>
      <title>DEV Community: Danica Fine</title>
      <link>https://dev.to/thedanicafine</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thedanicafine"/>
    <language>en</language>
    <item>
      <title>A Dive into Apache Iceberg™'s Metadata</title>
      <dc:creator>Danica Fine</dc:creator>
      <pubDate>Wed, 08 Oct 2025 07:01:22 +0000</pubDate>
      <link>https://dev.to/thedanicafine/a-dive-into-apache-icebergs-metadata-gpp</link>
      <guid>https://dev.to/thedanicafine/a-dive-into-apache-icebergs-metadata-gpp</guid>
      <description>&lt;p&gt;The promise of the data lakehouse is simple: combine the scalability of data lakes with the reliability of data warehouses. Apache Iceberg™ has emerged as the de facto table format for delivering that promise. But why?&lt;/p&gt;

&lt;p&gt;The answer lies in Iceberg’s robust metadata layer. It’s a structured, versioned system that enables features like time travel, schema evolution, and efficient query planning. This post explores how Iceberg’s metadata architecture works, and why it’s the foundation of reliable, high-performance data operations in the modern lakehouse.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Challenge: Finding Data Reliably in a Massive Data Lake
&lt;/h2&gt;

&lt;p&gt;A data lake may contain billions of files, constantly being updated, merged, or deleted. To query it reliably, you need to be able to answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which files belong to a specific table?&lt;/li&gt;
&lt;li&gt;What was the table's state at a particular point in time?&lt;/li&gt;
&lt;li&gt;How has the schema changed?&lt;/li&gt;
&lt;li&gt;Which files are relevant to a query without scanning everything?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Traditional approaches often relied on directory listings, which are slow, inconsistent, and prone to errors. Iceberg solves this with a structured, versioned metadata system and a catalog.&lt;/p&gt;

&lt;p&gt;Let's dive in. &lt;/p&gt;

&lt;h2&gt;
  
  
  Iceberg's Metadata Layer: A Hierarchical View
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fep587iym10a4luop20mm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fep587iym10a4luop20mm.png" alt="A sample view of Iceberg's metadata layer situated between a catalog and the data layer of your data lake." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Catalog
&lt;/h3&gt;

&lt;p&gt;The catalog maps table identifiers to their current metadata file, acting as the “address book” for tables. It's the entry point for query engines and compute engines that what to interact with your Iceberg tables. &lt;/p&gt;

&lt;p&gt;Examples include REST catalogs like Apache Polaris (incubating), Hive Metastore, or custom implementations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Metadata Files
&lt;/h3&gt;

&lt;p&gt;Each commit (transaction) to an Iceberg table generates a new Metadata File. This file contains useful (non-data) information on the table, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Schemas:&lt;/strong&gt; The columns in the table, including a full history of the schema as it’s evolved over time. Field IDs are also stored here to ensure that changes are handled correctly across versions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Partition specs:&lt;/strong&gt; How the data is physically partitioned, including a full history of the partition specs as they’ve evolved over time. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Snapshot IDs:&lt;/strong&gt; A unique ID for each version of the table. Many snapshots can be stored, and you can configure the table to expire snapshots after a certain time has passed or number of snapshots have been accumulated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pointers to Manifest Lists:&lt;/strong&gt; Specifically, each snapshot ID maps to a Manifest List file. This is important, because the Metadata File doesn’t list all data files, but rather pointers to Manifest Lists.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Manifest Lists
&lt;/h3&gt;

&lt;p&gt;Each snapshot links to a Manifest List, which points to one or more Manifest Files. Summary statistics are aggregated in the manifest list and include row counts, partitions, and min/max values across all files in the snapshot.&lt;/p&gt;

&lt;h3&gt;
  
  
  Manifest Files
&lt;/h3&gt;

&lt;p&gt;Each Manifest File tracks a subset of individual Data Files (e.g., Parquet, ORC, Avro) within a single Iceberg table. For each Data File, it stores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;File Path:&lt;/strong&gt; The exact location in your object storage (S3, ADLS, GCS).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File Format:&lt;/strong&gt; Parquet, ORC, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Partition Data:&lt;/strong&gt; Which partition this file belongs to.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Column-level Statistics:&lt;/strong&gt; Min/max values, null counts, value counts for each column within that specific Data File. This is incredibly useful for pruning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content (ADD, DELETE, EXISTING):&lt;/strong&gt; Whether the file was added, deleted, or existed in this snapshot.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note: As the table evolves, a Manifest File can be referenced by multiple Manifest Lists.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Metadata Matters
&lt;/h2&gt;

&lt;p&gt;By building out the metadata layer in this way, Iceberg is able to give users a ton of useful features that unlock more flexibility of how they can use and evolve their data—efficiently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Time Travel
&lt;/h3&gt;

&lt;p&gt;Every commit creates a new metadata file, resulting in a version history of your entire table. Time travel is invaluable for auditability of your data and to ensure that you always know what the result of a query was at any given point in time.&lt;/p&gt;

&lt;p&gt;Want to see the data from a specific snapshot? Or data from last Tuesday? It's easy!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Query the system metadata table to see the snapshots and the time at which they became current.&lt;/li&gt;
&lt;li&gt;Point to an older snapshot ID in the metadata with &lt;code&gt;VERSION AS OF &amp;lt;SNAPSHOT_ID&amp;gt;&lt;/code&gt; or a specific timestamp by adding &lt;code&gt;TIMESTAMP AS OF ‘2025-09-30 17:53:01.284’&lt;/code&gt;. &lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Schema Evolution without Rewrite
&lt;/h3&gt;

&lt;p&gt;Because Iceberg tracks columns by unique ID (not position), adding, dropping, renaming, or reordering columns is a metadata-only operation. Old schemas are maintained so that you can continue to query your data without issues.&lt;/p&gt;

&lt;h3&gt;
  
  
  Efficient Query Planning
&lt;/h3&gt;

&lt;p&gt;Query engines don't need to list directories in Iceberg. Instead, they read the current metadata file (&lt;code&gt;O(1)&lt;/code&gt; operation), then efficiently scan manifest lists and manifest files to put together an efficient query plan. The column-level statistics within manifest files allow for aggressive file and column pruning. If your query only needs &lt;code&gt;customer_id&lt;/code&gt; and &lt;code&gt;order_total&lt;/code&gt; and filters by &lt;code&gt;region='US'&lt;/code&gt;, Iceberg knows exactly which data files and which columns within those files to read, skipping the rest of a potentially wide table.&lt;/p&gt;

&lt;h3&gt;
  
  
  ACID Transactions
&lt;/h3&gt;

&lt;p&gt;Updates, deletes, and merges are managed by creating new snapshots in the metadata, atomically swapping out old data files for new ones. Readers always see a consistent snapshot, preventing dirty reads—crucial for dependable analytics.&lt;/p&gt;

&lt;h3&gt;
  
  
  Open Format, Decoupled Engines
&lt;/h3&gt;

&lt;p&gt;The metadata files themselves are open (JSON, Avro) and self-describing. This allows any Iceberg-compatible compute engine (Apache Spark™, Apache Flink®, Trino, Presto, Snowflake, Dremio, etc.) to read the same table reliably, fostering true vendor-neutrality and interoperability.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Metadata Difference
&lt;/h2&gt;

&lt;p&gt;Iceberg's popularity and power as a table format isn't just in its features, but in the metadata system that makes those features possible. By managing tables through structured, versioned metadata, Iceberg transforms the raw sprawl of the data lake into a reliable, high-performance lakehouse that data engineers and data scientists alike can trust.&lt;/p&gt;

&lt;p&gt;So if you haven't done so yet, check it out and &lt;a href="https://iceberg.apache.org/spark-quickstart/" rel="noopener noreferrer"&gt;get started&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>dataengineering</category>
      <category>iceberg</category>
      <category>database</category>
      <category>architecture</category>
    </item>
    <item>
      <title>The Apache Iceberg™ Small File Problem</title>
      <dc:creator>Danica Fine</dc:creator>
      <pubDate>Wed, 11 Dec 2024 18:13:08 +0000</pubDate>
      <link>https://dev.to/thedanicafine/the-apache-iceberg-small-file-problem-1k2m</link>
      <guid>https://dev.to/thedanicafine/the-apache-iceberg-small-file-problem-1k2m</guid>
      <description>&lt;p&gt;If you've been following Apache Iceberg™ at all, you've no doubt heard whispers about "the small file problem". So what is it? And why does it matter when building the data lakehouse of your dreams? &lt;/p&gt;

&lt;p&gt;You've come to the right place! Let's dive in!&lt;/p&gt;

&lt;h1&gt;
  
  
  Small Files, Big Problem
&lt;/h1&gt;

&lt;p&gt;To start, the small file problem is exactly what it sounds like at the surface. We have some dataset. In the case of Iceberg, our dataset is a bunch of data files bound together through metadata as a single Iceberg table. The issue is that, over time, as we add data to this dataset, we find that the dataset is made up of many, smaller files rather than fewer, bigger ones.&lt;/p&gt;

&lt;p&gt;Having more small files might not sound like a big deal, but it actually has quite a few implications for Iceberg and can ultimately  negatively impact performance, scalability, and efficiency in a number of ways, for a number of reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;🗄️ &lt;strong&gt;High Metadata Overhead&lt;/strong&gt;: As we know already, an Iceberg table IS its metadata. So in Iceberg, we're constantly tracking every file in metadata for each table version. More small files increases the size of metadata files and, in turn, the cost of maintaining table snapshots.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🐢 &lt;strong&gt;Inefficient Query Planning and Execution&lt;/strong&gt;: When it comes time to interact with our data, query engines like Apache Spark, Trino, or Snowflake need to read those many small files, which results in higher I/O overhead, slower data scanning, and reduced parallelism.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;💰 &lt;strong&gt;Costs of Object Storage Operations&lt;/strong&gt;: We've all experienced the frustration of unexpected cloud bills! In cloud object stores like S3 or GCS, frequent API calls for listing or retrieving many small files incur significant latency and cost. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🔊 &lt;strong&gt;Write Amplification&lt;/strong&gt;: If you're unfamiliar, write amplification just means that more data is written, touched, or modified than originally intended. So, for Iceberg, many small writes will eventually generate unnecessary work for compaction and cleanup processes down the line.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now that you know a bit more about it, you can see how the small file problem is actually a problem. But what can we do about it? 🤷‍♀️ &lt;/p&gt;

&lt;h2&gt;
  
  
  Taking Action
&lt;/h2&gt;

&lt;p&gt;The good news is that the broader Iceberg community isn't just sitting on this issue. You just have to know what's out there and how to take advantage of it!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;🤖 The biggest fix is to eliminate existing small files through compaction and expiring snapshots. Iceberg already has compaction built-in to Spark through the &lt;code&gt;rewriteDataFiles&lt;/code&gt; Action. The v2 Apache Flink Sink that was released as part of &lt;a href="https://www.youtube.com/watch?v=OP8VOo39Q-E" rel="noopener noreferrer"&gt;Apache Iceberg 1.7&lt;/a&gt; includes support for small-file compaction, as well!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;⚙️ Check your configs! You can set the target file size during writes in Iceberg with the configuration parameter, &lt;code&gt;write.target-file-size-bytes&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🔀 Leveraging the Copy-on-Write (CoW) mode is helpful to get around some of the headaches of small files. Keep in mind that CoW means that any changes to existing files (think row updates or removals), will result on the &lt;em&gt;entire&lt;/em&gt; file being copied over to a new file. This sounds horribly inefficient, but it's only a little inefficient because CoW will try to consolidate data files when it can so that the rewrite doesn't just affect one data file. This means more work up front on the writer, but fewer small files and less work for readers later on.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;😵 Speaking of updates and removals, if you're using Merge-on-Read (MoR) mode, then you'll be introducing delete files into the mix to track which rows need to be removed when you query against your data files. For sparse deletes against your dataset, this can result in a number of small delete files floating around. And that's no good! Thankfully, with the upcoming Iceberg v3 table spec, we'll be introducing deletion vectors, which means that multiple files' worth of deletes can be stored in a single file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📋 Query engines are also stepping up with smarter query planning that still allows for the existence of small files but optimizes how data is accessed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;That was kind of a big post on a what's otherwise a... &lt;em&gt;small&lt;/em&gt; problem 😂 . But now you have a better idea of what the small file problem is, why it's important for folks building out a data lakehouse with Apache Iceberg, and what your options are for tackling it.&lt;/p&gt;

&lt;p&gt;If you're interested in more Apache Iceberg content, like, follow, and find me across social media.&lt;/p&gt;

</description>
      <category>bigdata</category>
      <category>apacheiceberg</category>
      <category>datalakehouse</category>
      <category>dataengineering</category>
    </item>
    <item>
      <title>What’s in a name? Making Sense of Apache Kafka’s auto.offset.reset</title>
      <dc:creator>Danica Fine</dc:creator>
      <pubDate>Wed, 22 May 2024 15:17:16 +0000</pubDate>
      <link>https://dev.to/thedanicafine/whats-in-a-name-making-sense-of-apache-kafkas-autooffsetreset-1dn0</link>
      <guid>https://dev.to/thedanicafine/whats-in-a-name-making-sense-of-apache-kafkas-autooffsetreset-1dn0</guid>
      <description>&lt;p&gt;Users of Apache Kafka® have varying opinions on so many things—it’s what makes the community diverse and interesting. But regardless of what your policy on schemas is (they’re obviously good) or whether you believe that adding partitions to a Kafka Topic is okay (it’s definitely not), I’ll bet you can still find some common ground with your fellow users. &lt;/p&gt;

&lt;p&gt;Case in point: pretty much everyone that works with Kafka can agree that &lt;code&gt;auto.offset.reset&lt;/code&gt; is quite possibly the worst named Kafka configuration out there.&lt;/p&gt;

&lt;p&gt;Driven by my frustration as a user and my own curiosity as a developer, I decided to dive into this configuration and try to understand it and its awful name, once and for all. &lt;/p&gt;

&lt;p&gt;But first…&lt;/p&gt;

&lt;h2&gt;
  
  
  Some background on &lt;code&gt;auto.offset.reset&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;I strongly believe that this particular origin story will be helpful for anyone, regardless of whether they’ve been using Kafka for years or days. So let’s start by getting everyone on the same page.&lt;/p&gt;

&lt;p&gt;Kafka Consumers. You know them, right? They’re pretty useful in helping you to consume messages from Kafka Topics. As you read messages from a Topic, every so often, the Consumer will record the last message that it saw and processed using the offset of that message. This is really helpful so that, if the Consumer goes down for any reason, you can rest assured that, when it comes back online, the Consumer can use that stored offset to pick back up from its last committed position. &lt;/p&gt;

&lt;p&gt;Once our Consumers are up and running, offsets and Consumers go hand-in-hand. But what about &lt;em&gt;before&lt;/em&gt; the Consumer has started running? What about brand new Consumers that have never seen a single message from the Kafka Topic? That’s where &lt;code&gt;auto.offset.reset&lt;/code&gt; comes in. &lt;/p&gt;

&lt;p&gt;Consumers that don’t have an offset available to use still need to know where to start reading from in the Topic. To put it simply, &lt;code&gt;auto.offset.reset&lt;/code&gt; is a &lt;a href="https://kafka.apache.org/documentation/#consumerconfigs_auto.offset.reset" rel="noopener noreferrer"&gt;Kafka Consumer configuration&lt;/a&gt;, which can be set to either &lt;code&gt;earliest&lt;/code&gt; or &lt;code&gt;latest&lt;/code&gt; (or &lt;code&gt;None&lt;/code&gt;), that defines where a Consumer should begin reading from in the Kafka Topic &lt;em&gt;when it doesn’t have any other valid offsets to start from&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;That last bit is really important, and it’s what trips folks up when they first try to use and understand this configuration parameter.&lt;/p&gt;

&lt;h2&gt;
  
  
  So, what &lt;em&gt;is&lt;/em&gt; in a name?
&lt;/h2&gt;

&lt;p&gt;The biggest issue that folks appear to have with &lt;code&gt;auto.offset.reset&lt;/code&gt; is its name, which is a little disappointing because one would think that a three-word configuration would have the potential to be short, sweet, and to-the-point. Alas, &lt;code&gt;sasl.oauthbearer.jwks.endpoint.retry.backoff.ms&lt;/code&gt; appears to both be more descriptive and far less problematic than &lt;code&gt;auto.offset.reset&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So what does &lt;code&gt;auto.offset.reset&lt;/code&gt; &lt;em&gt;imply&lt;/em&gt;? What does someone using this configuration for the first time assume, erroneously, that it does? I’ve heard a number of variations, but generally folks assume that it automatically resets the stored Consumer offset to &lt;code&gt;earliest&lt;/code&gt; or &lt;code&gt;latest&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;That… would make sense, right? Except that we all know the frustration, the pain, the anguish, when we set &lt;code&gt;auto.offset.reset=earliest&lt;/code&gt; and realize that our Kafka Consumer is not, in fact, automatically reading from the beginning of the Topic, nor did it reset our offsets. The reality is that, if there's a valid offset, &lt;code&gt;auto.offset.reset&lt;/code&gt; doesn't do a single thing.&lt;/p&gt;

&lt;p&gt;So what gives? Where is this disconnect with &lt;code&gt;auto&lt;/code&gt; and &lt;code&gt;reset&lt;/code&gt; coming from?&lt;/p&gt;

&lt;h2&gt;
  
  
  Auto vs. Manual
&lt;/h2&gt;

&lt;p&gt;Let’s start with &lt;code&gt;auto&lt;/code&gt;. Take a look at the rest of the Kafka Consumer configurations that have &lt;code&gt;auto&lt;/code&gt; in them; they all, truly, have to do with handling something automatically for the Consumer. &lt;/p&gt;

&lt;p&gt;What does &lt;code&gt;auto.offset.reset&lt;/code&gt; do for us automatically? It certainly doesn't appear to be to overriding Consumer offsets automatically. But to really make sense of what &lt;code&gt;auto.offset.reset&lt;/code&gt; does for us behind the scenes, we have to think about the manual version of this offset-setting process.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Consumer without an offset
&lt;/h3&gt;

&lt;p&gt;Consider what would happen if  you didn’t want to set &lt;code&gt;auto.offset.reset&lt;/code&gt;, but you had a brand new Consumer (or a Consumer whose offsets you've deleted).&lt;/p&gt;

&lt;p&gt;If you read the &lt;code&gt;auto.offset.reset&lt;/code&gt; &lt;a href="https://kafka.apache.org/documentation/#consumerconfigs_auto.offset.reset" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; closely, you’ll find that you don’t actually have to set it. But, when &lt;code&gt;auto.offset.reset=None&lt;/code&gt; and you have no stored offsets, when your Kafka Consumer tries to poll the Topic, it will throw an exception. This implies that, oops, our Kafka Consumers need initial offsets to actually read from the Topic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting offsets manually
&lt;/h3&gt;

&lt;p&gt;A brand new Consumer or a Consumer without offsets doesn’t have to rely on &lt;code&gt;auto.offset.reset&lt;/code&gt;, though. You have the option to manually set your offsets using &lt;a href="https://kafka.apache.org/37/javadoc/org/apache/kafka/clients/consumer/KafkaConsumer.html#seek(org.apache.kafka.common.TopicPartition,long)" rel="noopener noreferrer"&gt;&lt;code&gt;Consumer.seek()&lt;/code&gt;&lt;/a&gt;—as well as the related methods &lt;a href="https://kafka.apache.org/37/javadoc/org/apache/kafka/clients/consumer/KafkaConsumer.html#seekToBeginning(java.util.Collection)" rel="noopener noreferrer"&gt;&lt;code&gt;Consumer.seekToBeginning()&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://kafka.apache.org/37/javadoc/org/apache/kafka/clients/consumer/KafkaConsumer.html#seekToEnd(java.util.Collection)" rel="noopener noreferrer"&gt;&lt;code&gt;Consumer.seekToEnd()&lt;/code&gt;&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;seek()&lt;/code&gt; is an in-memory operation that takes in a TopicPartition and an offset and manually overrides the offset that the Consumer has for that partition—even if it currently has no offset for that partition. &lt;/p&gt;

&lt;p&gt;Never heard of &lt;code&gt;Consumer.seek()&lt;/code&gt;? That’s probably because it’s mostly used in manual one-off scripts—at least, that’s been my experience with it.&lt;/p&gt;

&lt;p&gt;Now that you know about the existence of a way to manually set Consumer offsets, doesn’t the &lt;code&gt;auto&lt;/code&gt; in &lt;code&gt;auto.offset.reset&lt;/code&gt; make just a little bit more sense? That is, until we think a bit more about the fact that it doesn’t reset anything…&lt;/p&gt;

&lt;h2&gt;
  
  
  Reset, but only just sometimes
&lt;/h2&gt;

&lt;p&gt;Okay, bear with me, here.&lt;/p&gt;

&lt;p&gt;Let’s go back to the official Apache Kafka &lt;code&gt;auto.offset.reset&lt;/code&gt; &lt;a href="https://kafka.apache.org/documentation/#consumerconfigs_auto.offset.reset" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; and focus on a bit that I’ll bet you missed the first time around:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What to do when there is no initial offset in Kafka &lt;em&gt;or if the current offset does not exist any more on the server (e.g. because that data has been deleted)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bingo.&lt;/p&gt;

&lt;p&gt;Unless you have infinite retention set up, data doesn’t live in a Kafka Topic forever. Eventually, it’ll be deleted or compacted. If, for some reason, our Consumer is inactive and the message with the last offset that that Consumer has seen is deleted, then suddenly we have an invalid offset for that Topic—which, when you think about it, is just as bad as having no offset at all because having no offset is just a special case of an invalid offset...&lt;/p&gt;

&lt;p&gt;Gee, it sure would be nice if our Consumer knew where to start from when it comes back online. If we have &lt;code&gt;auto.offset.reset&lt;/code&gt; set up, automatically the Consumer would reset its invalid offset to one of &lt;code&gt;earliest&lt;/code&gt; or &lt;code&gt;latest&lt;/code&gt;, meaning that we don’t have to worry about the Consumer throwing an exception. &lt;/p&gt;

&lt;h2&gt;
  
  
  Automatic and resetting
&lt;/h2&gt;

&lt;p&gt;So where are we with &lt;code&gt;auto.offset.reset&lt;/code&gt; now?&lt;/p&gt;

&lt;p&gt;In the event that there aren’t any valid offsets available for a Kafka Consumer—whether that means no offsets at all or a stale offset from a deleted message—&lt;code&gt;auto.offset.reset&lt;/code&gt; defines how to &lt;em&gt;automatically reset&lt;/em&gt; the invalid offsets and allow the Consumer to continue operating.&lt;/p&gt;

&lt;p&gt;This probably isn’t what you wanted to hear, but, after all of that, the name &lt;code&gt;auto.offset.reset&lt;/code&gt; does a pretty decent job describing exactly what it does. Kafka users everywhere just needed a little bit more context to understand why this frustrating configuration is called what it’s called.&lt;/p&gt;

&lt;p&gt;So what do you think? Is this explanation enough to make you just a little bit less frustrated at &lt;code&gt;auto.offset.reset&lt;/code&gt;? If not, what would you call it?&lt;/p&gt;

</description>
      <category>kafka</category>
      <category>opensource</category>
      <category>backend</category>
      <category>programming</category>
    </item>
    <item>
      <title>Quick Tips for a Winning Abstract</title>
      <dc:creator>Danica Fine</dc:creator>
      <pubDate>Thu, 18 Jan 2024 18:07:40 +0000</pubDate>
      <link>https://dev.to/thedanicafine/quick-tips-for-a-winning-abstract-dnn</link>
      <guid>https://dev.to/thedanicafine/quick-tips-for-a-winning-abstract-dnn</guid>
      <description>&lt;p&gt;If you’ve kept up with the rest of this blog series, you saw the components that make up a solid conference abstract along with some examples to inspire you. By now, you should have a pretty good idea of how you can get started writing great conference submissions. &lt;/p&gt;

&lt;p&gt;But all of my advice is meant to be a foundation—a scaffolding for you to run with and build something that’s truly your own. You saw some of that in the examples in the previous post. So how do you get to that point? Once you’ve internalized the key information that you need to include in your abstract, it’s time to let your creative juices flow! To make it your own! ... just make sure your abstract is still achieving what you set out to do.&lt;/p&gt;

&lt;p&gt;To help you stay on track and rein you in as you artfully craft your abstract, here are a few dos and don’ts that I’d recommend you keep in mind. &lt;/p&gt;

&lt;h2&gt;
  
  
  A few tips
&lt;/h2&gt;

&lt;p&gt;Note: Some of these tips are going to boil down to personal preference, but I (and other members of my Program Committee) feel that they’re generally best practice:&lt;/p&gt;

&lt;p&gt;❌ &lt;strong&gt;DON’T&lt;/strong&gt; waste precious abstract space describing who you are or what your company is unless it’s absolutely necessary. Let the technical details speak for themselves. Instead, use the speaker biography section to talk about yourself and what you do.&lt;br&gt;
👍 &lt;strong&gt;DO&lt;/strong&gt; cut straight to the point. Be concise and clear in your problem statement and goals.&lt;/p&gt;

&lt;p&gt;👍 &lt;strong&gt;DO&lt;/strong&gt; be yourself and write as yourself. If this means being casual, then be casual. Your ideas are going to come across more clearly and your abstract will read as genuine.&lt;br&gt;
❌ &lt;strong&gt;DON’T&lt;/strong&gt; feel the need to use an artificially academic or potentially alienating tone (unless an academic tone is required by the conference).&lt;/p&gt;

&lt;p&gt;❌ &lt;strong&gt;DON’T&lt;/strong&gt; include links or references to other talks in your abstract. &lt;br&gt;
👍 &lt;strong&gt;DO&lt;/strong&gt; feel free to reference big picture ideas or an author, e.g. Data Mesh and Zhamak Dehghani, but remember to express your own ideas.&lt;/p&gt;

&lt;p&gt;👍 &lt;strong&gt;DO&lt;/strong&gt; break your abstract up into sections and separate paragraphs for readability.&lt;br&gt;
❌ &lt;strong&gt;DON’T&lt;/strong&gt; write a novel. Generally speaking, the abstract is what is printed on the conference agenda. It should be concise and able to be read within a minute or two.&lt;/p&gt;

&lt;p&gt;❌ &lt;strong&gt;DON’T&lt;/strong&gt; overcommit. It’s easy to go overboard and promise the world in your abstract. Keep the length of the conference session in mind, and only include material that you think you can reasonably cover.&lt;br&gt;
👍 &lt;strong&gt;DO&lt;/strong&gt; feel free to add more content later on! Not every detail needs to be included in your abstract in order for you to bring it up during your actual session. While I advise not trimming content, I find it perfectly acceptable to add additional, relevant information.&lt;/p&gt;

&lt;p&gt;❌ &lt;strong&gt;DON’T&lt;/strong&gt; rely exclusively on bullet points to outline your talk in your abstract.&lt;br&gt;
👍 &lt;strong&gt;DO&lt;/strong&gt; try to tell a story. It’s okay to use bullet points where appropriate, but, for the most part, it’s meant to be prose. You’re explaining to an attendee what they can expect and the journey that they’ll go through in attending your talk.&lt;/p&gt;

&lt;p&gt;👍 &lt;strong&gt;DO&lt;/strong&gt; add personal touches... and maybe a pun or two!&lt;br&gt;
❌ &lt;strong&gt;DON’T&lt;/strong&gt; let your flair get in the way of the content.&lt;/p&gt;

&lt;p&gt;❌ &lt;strong&gt;DON’T&lt;/strong&gt; make [too many] assumptions; a lot of this boils down to knowing your audience. If you're unsure, it's always safe to start from 0 and build from there!&lt;br&gt;
👍 &lt;strong&gt;DO&lt;/strong&gt; have peers and friends from a variety of backgrounds review your abstract before submitting. Bonus points if they have absolutely nothing to do with tech and still understand your abstract!&lt;/p&gt;

&lt;h2&gt;
  
  
  A final request
&lt;/h2&gt;

&lt;p&gt;The above list is, by no means, exhaustive. In fact, it took me multiple conference seasons to assemble what's here, and I still feel there's so much more I could share!&lt;/p&gt;

&lt;p&gt;So, with that in mind, now I'm curious to hear from &lt;em&gt;you&lt;/em&gt;. What have you found that works (and doesn't work) when writing abstracts and submitting to a conference? 🤔&lt;/p&gt;

</description>
      <category>writing</category>
      <category>techtalks</category>
      <category>speaking</category>
      <category>learning</category>
    </item>
    <item>
      <title>Learning by Example</title>
      <dc:creator>Danica Fine</dc:creator>
      <pubDate>Mon, 10 Jul 2023 14:24:15 +0000</pubDate>
      <link>https://dev.to/thedanicafine/learning-by-example-i8c</link>
      <guid>https://dev.to/thedanicafine/learning-by-example-i8c</guid>
      <description>&lt;p&gt;In my last post on responding to Calls for Papers, I outlined a few things to consider and some questions to ask yourself to get started with writing an abstract.  While it’s easy for me to say “Consider X…” or “Ask yourself Y…”, I realize that it might still feel a bit fuzzy. To counter that, I want to take that hand-wavy, intangible process and bring it back down to earth with some concrete examples.&lt;/p&gt;

&lt;h2&gt;
  
  
  Abstracts that do it well
&lt;/h2&gt;

&lt;p&gt;Let’s make it real by taking a look at a few abstracts that I and other Kafka Summit and Current Program Committee Members thought were particularly good… And more importantly, &lt;em&gt;why&lt;/em&gt; they were good.&lt;/p&gt;

&lt;h3&gt;
  
  
  The basics
&lt;/h3&gt;

&lt;p&gt;To give you a good starting point, here’s a solid, no-frills abstract on the subject of event-driven architectures.&lt;/p&gt;

&lt;h4&gt;
  
  
  4 Patterns to Jumpstart your Event-Driven Architecture Journey
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;The shift from monolithic applications to microservices is anything but easy.&lt;/em&gt;&lt;/strong&gt; Since services usually don't operate in isolation, it's vital to implement proper communication models among them. A crucial aspect in this regard is to avoid tight coupling and numerous point-to-point connections between any two services. One effective approach is to build upon messaging infrastructure as a decoupling element and employ an event-driven application architecture.&lt;br&gt;&lt;br&gt;
During this session, we explore selected event-driven architecture patterns commonly found in the field: &lt;strong&gt;&lt;em&gt;the claim-check pattern, the content enricher pattern, the message translator pattern, and the outbox pattern&lt;/em&gt;&lt;/strong&gt;. For each of the four patterns, we look into a live demo scenario based on Apache Kafka and discuss some variations and trade-offs regarding the chosen implementation.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;You will walk away with a solid understanding of how the discussed event-driven architecture patterns help you&lt;/em&gt;&lt;/strong&gt; with building robust and decoupled service-to-service communication and how to apply them in your next Apache Kafka-based project.   &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  What it does well
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The author uses the opening sentence as a way to connect with the audience over something that most folks can agree on—transitioning between monoliths and microservices is difficult. What’s even better here is that connecting with the people who have gone through this process doesn’t necessarily alienate people who haven’t undergone this process just yet. In my opinion, it’s a solid way to open the abstract.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After introducing the subject of the session, we see more detail on the event-driven patterns that the talk will cover. The author then goes into more specifics about the technical demo that will be a part of the session and the goals of that demo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Finally, he summarizes the takeaways that the audience should expect—a &lt;em&gt;must&lt;/em&gt; IMO.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks to Hans-Peter Grahsl, then Developer Advocate at Red Hat, for agreeing to include his abstract in this blog. For more, watch this &lt;a href="https://www.confluent.io/events/current/2023/4-patterns-to-jumpstart-your-event-driven-architecture-journey/" rel="noopener noreferrer"&gt;talk&lt;/a&gt; from Current 2023.&lt;/p&gt;

&lt;h3&gt;
  
  
  Non-standard subject-matter... or how to make the serious content fun.
&lt;/h3&gt;

&lt;p&gt;Next, we’ll mix things up a bit with an abstract covering a less-standard technical subject. Even so, there are some similarities between this and the previous example, and you might start to see a pattern emerge.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;em&gt;🎶🎵Bo-stream-ian Rhapsody: A Musical Demo of Kafka Connect and Kafka Streams 🎵🎶&lt;/em&gt;
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;You’ve heard of Apache Kafka. You know that real-time event streaming can be a powerful tool to power your project, product, or even company. But beyond storing and relaying messages, what can Kafka do?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;In this talk, get an overview of two key components of the Kafka ecosystem beyond just brokers and clients:&lt;/em&gt;&lt;/strong&gt; Kafka Connect, a distributed ingest/export framework, and Kafka Streams, a distributed stream processing library. Learn about the APIs available for developing and deploying a custom source and sink connector, and for bringing up a Streams application to manipulate the data in between them. &lt;strong&gt;&lt;em&gt;Through a musical demonstration involving Kafka Connect and Kafka Streams, audio will be recorded, distorted, analyzed, and played back–live and in real time.&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Audience members should expect to come away with a good understanding of how to develop Kafka Connect connectors and Kafka Streams applications&lt;/em&gt;&lt;/strong&gt;, as well as some basics of digital signal processing.  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  What it does well
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Before we even get into the abstract, we’re hit with a fun, attention-grabbing title. Who wouldn’t want to attend a talk with a live demo… and a live musical performance? Obviously this has more to do with the subject at hand, but the author could have just as easily used a more technical title without the fun. Making it fun was a stylistic choice. (You should always feel free to add your own stylistic flair to your abstracts; read on for more on this.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The abstract is then supported with technical details: the talk will go beyond Kafka Brokers and Kafka Clients and instead will focus on the APIs for Kafka Connect and Kafka Streams. He follows this with an outline of the stages of the demo. Cool! Now we know what technical content to expect from the talk!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then he brings it home with the final paragraph. Even though this talk is a fun repose from the usual, heavy content of a conference, it still has relevant and interesting technical takeaways. Just because you’re presenting something fun doesn’t mean that the audience won’t get something out of attending the session.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This abstract was written by Chris Egerton, then Staff Apache Kafka Open Source Developer at Aiven, and is being showcased here with his permission. (If this talk sounds super cool—and it should—check out the recording from &lt;a href="https://www.confluent.io/events/kafka-summit-london-2024/bo-stream-ian-rhapsody-a-musical-demo-of-kafka-connect-and-kafka-streams/" rel="noopener noreferrer"&gt;Kafka Summit London 2024&lt;/a&gt; to see an awesome live performance!)&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding personality
&lt;/h3&gt;

&lt;p&gt;For our final example, let's consider... what happens when you let your personality shine through in an abstract? Let’s take a look at a session introducing very useful, deeply technical content in an honest, accessible way.&lt;/p&gt;

&lt;h4&gt;
  
  
  Pragmatic Patterns (and Pitfalls) for Event Streaming in Brownfield Environments
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Unlike Greenfield development where everything is new, shiny and smells like cheese sticks most developers must integrate with existing systems, aptly named, brownfield development.&lt;/em&gt;&lt;/strong&gt; Event streaming can be complex enough when starting from scratch; throw in a mainframe, existing synchronous workflows, legacy databases and an assortment of EBCDIC and it can seem impossible. &lt;strong&gt;&lt;em&gt;Using Kafka Streams as our library of choice we will discuss patterns that enable successful integration with the solid systems from our storied past&lt;/em&gt;&lt;/strong&gt;, including:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Translating synchronous workflows to async using completion criteria and the routing slip pattern
&lt;/li&gt;
&lt;li&gt;Getting Ghosted: Detecting missing responses from external systems with the Absence of an Event and Thou Shall Not Pass patterns
&lt;/li&gt;
&lt;li&gt;Change Data Capture, the Outbox Pattern, Derivative Events and transaction pitfalls
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Armed with these pragmatic best practices, you will be able to successfully bring eventing into your stack and avoid turning your brownfield…into a minefield.&lt;/em&gt;&lt;/strong&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  What it does well
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The opening sentence presents a heavy topic in a comical way, and you see a bit of the author’s personality shine through. What does the smell of cheese sticks have to do with tech? Almost nothing. But it’s fun, it’s attention-grabbing, it sets the tone for the audience.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It gets to the point. After introducing the legacy systems that form the basis of the talk (and connecting with audience members using these systems), the author dives into the technology that they’ll be using and includes examples of the patterns that will be covered.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;And again, as expected, she summarizes the talk with a set of takeaways… and ends it with a pun. I love that this abstract finds balance between the technical details that form the foundation of the abstract and having a bit of fun.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This abstract was written by the incredibly talented Anna McDonald, Principal Customer Success Technical Architect at Confluent, and is included here with her permission. (If you want to see the whole talk, she delivered this session at &lt;a href="https://www.confluent.io/events/kafka-summit-london-2023/pragmatic-patterns-and-pitfalls-for-event-streaming-in-brownfield/" rel="noopener noreferrer"&gt;Kafka Summit London 2023&lt;/a&gt;.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;The three examples shown here are different from one another; they each cover a different subject at a different level, and they’re meant to appeal to different audiences. Even so, you may have noticed that they all more or less follow the abstract formula that I introduced in the last blog post on responding to a CfP. You don’t (and shouldn’t!) have to reinvent the wheel each time you want to write a new abstract.&lt;/p&gt;

&lt;p&gt;So make it easy for yourself. Take inspiration from great abstracts that you see out in the wild and follow these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Determine your topic&lt;/li&gt;
&lt;li&gt;Answer the questions, being sure to write for your future audience&lt;/li&gt;
&lt;li&gt;Follow the abstract template&lt;/li&gt;
&lt;li&gt;(Optional) Add a bit of personal flair&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you liked this post and thought these examples were helpful, be sure to check out the rest of the blogs in this series! And, on that note, be sure to keep an eye out for more posts on this topic in the future... 👀&lt;/p&gt;

</description>
      <category>techtalks</category>
      <category>writing</category>
      <category>speaking</category>
      <category>learning</category>
    </item>
    <item>
      <title>Responding to a CfP</title>
      <dc:creator>Danica Fine</dc:creator>
      <pubDate>Tue, 27 Jun 2023 16:22:37 +0000</pubDate>
      <link>https://dev.to/thedanicafine/so-you-want-to-speak-at-a-technical-conference-responding-to-a-cfp-54m6</link>
      <guid>https://dev.to/thedanicafine/so-you-want-to-speak-at-a-technical-conference-responding-to-a-cfp-54m6</guid>
      <description>&lt;p&gt;The technical conference season never stops. Hundreds of technical conferences are always occurring around the globe, giving engineers and developers the chance to share their knowledge and experiences with members of the community. But even as these events are occurring, the Calls for Papers (CfPs) for next season are already opening.&lt;/p&gt;

&lt;p&gt;If you’ve ever felt compelled to deliver a talk at a conference, there’s no time like the present to submit to a CfP.&lt;/p&gt;

&lt;p&gt;And I’d like to help you do just that by beginning with the most important part—writing an abstract.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why listen to me?
&lt;/h2&gt;

&lt;p&gt;I’ve had the privilege of serving on a technical conference Program Committee for a couple of years now. During which time, I’ve reviewed hundreds of technical abstracts and offered personalized feedback on a large percentage of those. On top of that, I’ve successfully seen 5 globally-recognized events through, start-to-finish, as Program Committee Chair.&lt;/p&gt;

&lt;p&gt;After all of that, I have a few thoughts on what we looked for in abstracts on the Program Committee, how you might extrapolate that for any technical conference, and what you can do to prepare to submit for your next conference CfP. &lt;/p&gt;

&lt;h2&gt;
  
  
  The Secret: Write a Good Abstract
&lt;/h2&gt;

&lt;p&gt;It shouldn’t come as a surprise to anyone that the secret to getting into a technical conference (or really any conference, for that matter) is by writing a good, relevant abstract. After all, the conference organizers and the Program Committee only have your abstract to base their decisions on. You may as well make it easy for them.&lt;/p&gt;

&lt;p&gt;Conference abstracts can be beautiful pieces of prose that introduce your topic, summarize your session, and provide some proof that you are articulate enough to present on the subject at hand. That's a heavy ask for a short write up... If you don’t necessarily write on a regular basis, that might sound daunting. But it doesn’t need to be. &lt;/p&gt;

&lt;p&gt;Let’s break it down.&lt;/p&gt;

&lt;h3&gt;
  
  
  💭 Decide on a Relevant Topic
&lt;/h3&gt;

&lt;p&gt;I shouldn’t have to say this, but I’ve seen enough irrelevant CfP submissions that I feel the need to bring it up. The biggest favor you can do for yourself is understanding the conference that you're submitting to and the audience that will be attending. This is going to involve a little bit of research on your part. To guide you in that, consider asking yourself these questions:&lt;/p&gt;

&lt;h4&gt;
  
  
  Is the topic I want to speak on relevant to the conference to which I’m submitting?
&lt;/h4&gt;

&lt;p&gt;(And vice versa for those of you who would like to speak at a specific conference.) If it is your dream to speak at Blah Blah Generative AI Conf, maybe don’t try submitting a talk on your experience working with OCaml. Unless you have a good angle. Which leads to the next question…&lt;/p&gt;

&lt;h4&gt;
  
  
  Does it make sense for an attendee of Conference XYZ to come to your talk?
&lt;/h4&gt;

&lt;p&gt;Someone at a .NET conference might not necessarily find Apache Kafka useful to them and their everyday work. But that doesn’t mean that there couldn’t be an Apache Kafka talk at a .NET conference, and that’s where having the right angle comes in. If you are targeting a specific conference with a specific (perhaps non-obvious) topic, I would challenge you to start by convincing yourself that a nontrivial number of attendees from Conference XYZ would be interested in your talk before you spend time crafting an abstract and submitting.&lt;/p&gt;

&lt;h4&gt;
  
  
  Are there any conference themes or tracks to be aware of?
&lt;/h4&gt;

&lt;p&gt;Some conferences are general and bring together a variety of subject matter, speakers, and presentation types. In which case, the world is your oyster—submit away!&lt;/p&gt;

&lt;p&gt;But keep in mind that even some general developer conferences use themes and tracks to ensure that their audience can still get enough of a certain type of content. For example, a conference might have an AI/ML theme for that year, or perhaps they’re committing to a handful of specific content tracks like Big Data, Streaming Data, and MLOps. It’s worthwhile for everyone that you check into those themes and tracks ahead of time; tailoring your content and abstract will do wonders for increasing your chances of acceptance. &lt;/p&gt;

&lt;p&gt;And on the other hand, not abiding by the tracks can really make it difficult for the committee to evaluate and accept your session.&lt;br&gt;
&lt;iframe class="tweet-embed" id="tweet-1671226112779616257-103" src="https://platform.twitter.com/embed/Tweet.html?id=1671226112779616257"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1671226112779616257-103');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1671226112779616257&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  🛠️ Build a Foundation
&lt;/h3&gt;

&lt;p&gt;Alright, so you’ve done the research and have a topic and conference you plan to submit to. The next step is to begin to formalize exactly what you will include in your abstract. I usually start doing this by writing a rough outline of key details.&lt;/p&gt;

&lt;p&gt;As you do this, keep one thing in mind: every talk and session is there to benefit the people in the audience, and each abstract should reflect that. The conference is for the attendees.&lt;/p&gt;

&lt;p&gt;Here are some questions to get you started:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Why should someone care about your talk?
&lt;/h4&gt;

&lt;p&gt;Put yourself in the shoes of an attendee at that conference. They’re looking through the conference agenda and trying to figure out which relevant sessions they should attend. Make it easy for them! An attendee should know from the very first sentence of your abstract (or better yet, the title) what they can expect to get out of your session. Oftentimes, attendees are choosing sessions in the 5 minutes prior to the talk, so you need to be quick to capture their attention. Don’t waste your precious first sentence explaining who you are or which company you work for—focus.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. What technical details are you covering?
&lt;/h4&gt;

&lt;p&gt;After the attendee has been reeled in by a good title or opening sentence, now’s your chance to really prove to them that they’re going to get something good out of this session. Show them what they should expect to be covered in your conference talk. Explain exactly what tech you’ll be presenting on or using in your demo. Tell them how you accomplished what you did. Convince them (and the Program Committee) that you know your stuff. &lt;/p&gt;

&lt;h4&gt;
  
  
  3. What takeaways can an attendee expect?
&lt;/h4&gt;

&lt;p&gt;Finally, make it super explicit what an attendee should expect to get out of the talk. Will they know the ins and outs of a specific API? Will you be giving them all the tools they need to build a certain app? Tell them! It may not make for beautiful prose, but know that there’s absolutely no reason why you can’t use the final (short) paragraph of your abstract to explicitly state your takeaways.&lt;/p&gt;

&lt;h3&gt;
  
  
  📝 Put Pen to Paper
&lt;/h3&gt;

&lt;p&gt;Now for the easy part—write the abstract. 🙃&lt;/p&gt;

&lt;p&gt;Don’t let this intimidate you. You don’t need to be a great writer to craft an incredible abstract. Really. You start with your foundation—conveniently, these are just the facts and key details from your outline—and build from there. &lt;/p&gt;

&lt;p&gt;What does this look like? Here’s a template:&lt;/p&gt;

&lt;h4&gt;
  
  
  Abstract Template
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;[Descriptive Title]&lt;br&gt;&lt;br&gt;
[Opening sentence with a good hook based on your answer to question #1 above.] [Optional sentence to segue into the details of the talk.]&lt;br&gt;&lt;br&gt;
[The meat of your abstract. 2-4 sentences on the technical details of the talk based on question #2 above.]&lt;br&gt;&lt;br&gt;
[Summary and takeaways based on question #3.]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bam, look at that! If you answered the questions from the previous section, you basically have an abstract right there! But remember, this is meant to be a starting point. This first draft should not be your final draft. &lt;/p&gt;

&lt;h4&gt;
  
  
  Ready, Set, Iterate
&lt;/h4&gt;

&lt;p&gt;Now we refine. And I’m going to purposefully do a little hand-waving here. &lt;em&gt;How&lt;/em&gt; you refine and &lt;em&gt;how much&lt;/em&gt; you refine will be up to you and your writing style. I mean that—use this time to find your style and what works for you. &lt;/p&gt;

&lt;p&gt;Generally speaking though, with your draft in hand, do roughly the following until it’s done (by some definition of ‘done’):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read the draft out loud to yourself. Does it flow? Does it sound good? Before you completely discount this part and skip to the next one, stop. Reading out loud is important; written text can look fine, but saying it out loud will help to point out parts that don’t feel natural, put it more comfortably in your own words, and also identify any pesky grammatical and spelling errors.&lt;/li&gt;
&lt;li&gt;Remove unnecessary information. It’s common for CfPs to request that your abstract be relatively short. To maximize how many you can submit to, it's beneficial to be short.&lt;/li&gt;
&lt;li&gt;Confirm that your draft contains all of the information from the questions you asked yourself in the previous section. If not, add it back in! At a bare minimum, the audience should know what your session is about, what technical details it will cover, and what they will get out of it.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  A final note… and a dose of reality
&lt;/h2&gt;

&lt;p&gt;I strongly believe that technical conferences are meant to be by the community for the community. Anyone who wants to present should have the tools and resources at their disposal to make that possible. If you’ve been looking to submit to speak at a technical conference but haven’t known where to start, I hope that this post serves as the nudge that encourages you to finally do so. &lt;/p&gt;

&lt;p&gt;As you start on your journey of writing abstracts and submitting to CfPs, I have one final thing for you to keep in mind: &lt;em&gt;even if you write an objectively incredible abstract, there’s no guarantee that you’ll be accepted to every conference you submit to&lt;/em&gt;. You shouldn’t let that discourage you. Speaking from experience, sometimes conference organizers have to reject even some great sessions due to time and space constraints. &lt;/p&gt;

&lt;p&gt;To stay on track:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start small—apply to local or regional technical conferences that may have a smaller pool of applicants. &lt;/li&gt;
&lt;li&gt;Take advantage of your rejections and iterate. If you’ve been rejected, reach out to the conference organizer and see if they have any advice or feedback as to why your session was rejected. &lt;/li&gt;
&lt;li&gt;Know that it’s a numbers game. Even great speakers that I know of still receive rejections, so they increase their chances of acceptance by submitting to many conferences. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;And watch this space for followup posts in this series to make this process feel a little more tangible.&lt;/strong&gt; 👀&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With that, get on out there and start applying to CfPs; with any luck, I’ll see you on stage at a conference someday soon!&lt;/p&gt;

</description>
      <category>writing</category>
      <category>techtalks</category>
      <category>speaking</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
