<?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: Gintautas Musketas</title>
    <description>The latest articles on DEV Community by Gintautas Musketas (@gintautasm).</description>
    <link>https://dev.to/gintautasm</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%2F745540%2F15be6e70-8796-400f-ae47-03820c871f16.png</url>
      <title>DEV Community: Gintautas Musketas</title>
      <link>https://dev.to/gintautasm</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gintautasm"/>
    <language>en</language>
    <item>
      <title>Mastering Prompt Engineering: My Journey with GenAI</title>
      <dc:creator>Gintautas Musketas</dc:creator>
      <pubDate>Wed, 01 Oct 2025 14:04:07 +0000</pubDate>
      <link>https://dev.to/gintautasm/mastering-prompt-engineering-my-journey-with-genai-170l</link>
      <guid>https://dev.to/gintautasm/mastering-prompt-engineering-my-journey-with-genai-170l</guid>
      <description>&lt;p&gt;The current hype around Generative AI (GenAI) has led many to believe it’s a mythical genie that grants wishes on demand. However, the reality of working with these models is far more nuanced. As a professional software engineer, I’ve come to see GenAI as a powerful tool that requires time, practice, and a methodical approach to master. In this post, I’d like to share my personal journey into the world of prompt engineering and the lessons I’ve learned along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Prompt Engineering Matters
&lt;/h2&gt;

&lt;p&gt;As humans, we often have a clear idea of what we want to achieve and the steps needed to get there, based on our experiences. For me, this usually involves writing code to solve problems—whether it’s creating API endpoints or automating workflows. However, when working with language models, every prompt you make in a new session starts from scratch. Unlike humans, these models lack historical context, making it essential to provide clear, detailed instructions every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges in Prompt Engineering
&lt;/h2&gt;

&lt;p&gt;One of the hardest parts of prompt engineering is defining exactly what you want to achieve. For example, creating a function with specific inputs and outputs sounds simple, but crafting a prompt that is flexible yet specific enough to apply to a wide range of situations can be surprisingly difficult. That’s where techniques like SMART goals and attribute-driven design principles come into play.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Attributes of Effective Prompts
&lt;/h2&gt;

&lt;p&gt;To create reusable and effective instructions, prompts must meet the following criteria:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Accurate&lt;/code&gt;: Clearly state the desired outcome.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Unambiguous&lt;/code&gt;: Avoid confusion or multiple interpretations.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Concise&lt;/code&gt;: Keep it short and to the point.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Actionable&lt;/code&gt;: Provide clear steps that the model can follow.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These attributes mirror the qualities of a well-designed programming language, making prompt engineering an interesting intersection of technical and linguistic skills.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Goal: Automating the Software Development Lifecycle
&lt;/h2&gt;

&lt;p&gt;My ultimate goal is to use tools like GitHub Copilot to automate the software development lifecycle (SDLC) from a technical architecture document to a deployable application. This includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Selecting desired architectural services.&lt;/li&gt;
&lt;li&gt;Creating actionable tasks on GitHub Project.&lt;/li&gt;
&lt;li&gt;Writing Infrastructure-as-Code (IaC) based on tasks.&lt;/li&gt;
&lt;li&gt;Implementing actual business logic.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tools and Approach
&lt;/h2&gt;

&lt;p&gt;Here’s the setup I’m using to tackle this challenge:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Confluence page or Markdown file as the source for the technical architecture.&lt;/li&gt;
&lt;li&gt;GitHub Project for task management.&lt;/li&gt;
&lt;li&gt;VSCode with the GitHub Copilot plugin.&lt;/li&gt;
&lt;li&gt;One software engineer (me!).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Approach:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define a desired output—ideally something familiar.&lt;/li&gt;
&lt;li&gt;Initiate a brainstorming session using self-prompting techniques.&lt;/li&gt;
&lt;li&gt;Set the model’s role to focus on the specific problem.&lt;/li&gt;
&lt;li&gt;Provide enough context to the model.&lt;/li&gt;
&lt;li&gt;Ask the model to generate a few initial ideas.&lt;/li&gt;
&lt;li&gt;Guide the model through the process until the desired outcome is reached.&lt;/li&gt;
&lt;li&gt;Generate accurate, concise, and unambiguous instructions based on the steps performed.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  What’s Next?
&lt;/h2&gt;

&lt;p&gt;Prompt engineering is still a growing field, and there’s much to learn. I’d love to hear your thoughts! Do you agree with the key attributes I’ve outlined? Have you used similar techniques in your work? Share your experiences in the comments below!&lt;/p&gt;

</description>
      <category>promptengineering</category>
      <category>genai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Creating data product using Confluent Kafka, Flink, Tableflow, PyIceberg and AWS</title>
      <dc:creator>Gintautas Musketas</dc:creator>
      <pubDate>Sat, 12 Jul 2025 11:00:47 +0000</pubDate>
      <link>https://dev.to/gintautasm/creating-data-product-using-confluent-kafka-flink-tableflow-pyiceberg-and-aws-5g5c</link>
      <guid>https://dev.to/gintautasm/creating-data-product-using-confluent-kafka-flink-tableflow-pyiceberg-and-aws-5g5c</guid>
      <description>&lt;h1&gt;
  
  
  Table of Contents
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;What is data streaming&lt;/li&gt;
&lt;li&gt;Why data streaming is needed&lt;/li&gt;
&lt;li&gt;What is Confluent Flink&lt;/li&gt;
&lt;li&gt;What is Confluent Tableflow&lt;/li&gt;
&lt;li&gt;Business use case&lt;/li&gt;
&lt;li&gt;
Solution overview

&lt;ul&gt;
&lt;li&gt;Purpose&lt;/li&gt;
&lt;li&gt;Benefits&lt;/li&gt;
&lt;li&gt;Challenges&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Conclusion&lt;/li&gt;

&lt;li&gt;References&lt;/li&gt;

&lt;li&gt;Code&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  What is data streaming
&lt;/h1&gt;

&lt;p&gt;Data streaming is the continuous transfer of data from one or more sources at a steady, high speed for processing into specific outputs. Data streaming is not new, but its practical applications are a relatively recent development [4]. &lt;/p&gt;

&lt;p&gt;Data streams are generated by all types of sources, in various formats and volumes. From applications, networking devices, and server log files, to website activity, banking transactions, and location data, they can all be aggregated to seamlessly gather real-time information and analytics from a single source of truth [2].&lt;/p&gt;

&lt;h1&gt;
  
  
  Why data streaming is needed
&lt;/h1&gt;

&lt;p&gt;Real worlds data is arriving gradually overtime, as your users are producing it now, produced it yesterday and will produce it in future. Unless you go out of business, this process never ends, and so the dataset is never complete in meaningful way [1, 439 p.]. &lt;/p&gt;

&lt;p&gt;Todays users expect instant results, whether it would come in form of a analytical dashboard providing insights into business, showing system metrics or even military and intelligence systems to raise alerts on signs of attack [1, 465 p.].&lt;/p&gt;

&lt;p&gt;Streaming data allows to process data in small time windows or even continuously, using single event as it arrives.     &lt;/p&gt;

&lt;h1&gt;
  
  
  What is Confluent Flink
&lt;/h1&gt;

&lt;p&gt;Apache Flink® is a powerful, scalable stream processing framework for running complex, stateful, low-latency streaming applications on large volumes of data. Flink excels at complex, high-performance, mission-critical streaming workloads and is used by many companies for production stream processing applications. Flink is the de facto industry standard for stream processing [3].&lt;/p&gt;

&lt;p&gt;Confluent’s fully managed Flink service enables you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easily filter, join, and enrich your data streams with Flink&lt;/li&gt;
&lt;li&gt;Enable high-performance and efficient stream processing at any scale, without the complexities of managing infrastructure&lt;/li&gt;
&lt;li&gt;Experience Kafka and Flink as a unified platform, with fully integrated monitoring, security, and governance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For additional details: &lt;a href="https://docs.confluent.io/cloud/current/flink/overview.html#what-is-af-long" rel="noopener noreferrer"&gt;Confluent Flink overview&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  What is Confluent Tableflow
&lt;/h1&gt;

&lt;p&gt;Tableflow enables you to represent Apache Kafka® topics and associated schemas as open table formats such as Apache Iceberg™ or Delta Lake in a few clicks to feed any data warehouse, data lake, or analytics engine, eliminating the complexities of data pre-processing, preparation, and transfer [5]. &lt;/p&gt;

&lt;p&gt;Tableflow automates key tasks, such as schematization, type conversions, schema evolution, Change Data Capture (CDC) stream materialization, table metadata publishing to catalogs, and table maintenance.&lt;/p&gt;

&lt;p&gt;Tableflow introduces support for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Iceberg: Now Generally Available, exposing streaming data in Confluent Cloud-hosted Kafka topics as Iceberg tables.&lt;/li&gt;
&lt;li&gt;Delta Lake: Now in Open Preview, enabling you to explore materializing Kafka topics as Delta Lake tables in your own storage. These tables can be consumed as storage-backed external tables from Databricks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For additional details: &lt;a href="https://docs.confluent.io/cloud/current/topics/tableflow/overview.html#tableflow-in-ccloud" rel="noopener noreferrer"&gt;Tableflow in Confluent Cloud overview&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Business use case
&lt;/h1&gt;

&lt;p&gt;Let's put theory into practice, global e-commerce organization with multiple sales channels would like their analysts to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Analyze sales channel data on weekly bases for past week in order to understand product demand and customer behavior based on current offering.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additionally following requirements must be met: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aggregated weeks data is required to be a flat file (CSV) export.&lt;/li&gt;
&lt;li&gt;Sales channel data contains product, order and customer information, thus PII data has to be obfuscated.&lt;/li&gt;
&lt;li&gt;Data is streamed into existing managed Confluent Kafka as a separate events.&lt;/li&gt;
&lt;li&gt;Deduplicated data is required for accurate analysis. &lt;/li&gt;
&lt;li&gt;Events uses AVRO encoding with Schema registry.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Solution overview
&lt;/h1&gt;

&lt;p&gt;There are multiple ways to solve this problem, for instance using AWS Lambda native support for AVRO [8] for consuming channel events, performing obfuscation and deduplication of data before storing them in DynamoDB, while preparing export. &lt;/p&gt;

&lt;p&gt;Alternatively Confluent Flink snapshot queries maybe used, however at the time of writing (2025-07-11) feature is in early access.&lt;/p&gt;

&lt;h2&gt;
  
  
  Purpose
&lt;/h2&gt;

&lt;p&gt;However goal for today will be test feasibility of solution based on Confluent Cloud managed Flink and Tableflow. The following high level architecture is displayed in figure.&lt;/p&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%2Fgard2et9pup27a9rap3v.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%2Fgard2et9pup27a9rap3v.png" alt=" " width="800" height="205"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The solution consists of the following steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sales channel data is received as it is and is stored in Kafka input topic.&lt;/li&gt;
&lt;li&gt;Managed Flink processes channel event:

&lt;ul&gt;
&lt;li&gt;Performs deduplication on events.&lt;/li&gt;
&lt;li&gt;Obfuscates PII data (out of scope in PoC code).&lt;/li&gt;
&lt;li&gt;Stores processed data in Kafka output topic for consumption.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;AWS Lambda on schedule queries Tableflow enabled output topic and stores query result as flat file on object store.&lt;/li&gt;

&lt;li&gt;On file creation email notification with a link to export is sent to business analyst (out of scope in PoC code)&lt;/li&gt;

&lt;li&gt;Business analyst downloads the file and prepares report.&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Benefits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Shift-left stream processing. Confluent Cloud for Apache Flink powers real-time stream processing on Kafka topics, which are subsequently materialized into tables using Tableflow. With Flink, you can implement business-specific logic such as filtering, deduplication, personally identifiable information (PII) removal, and data stream-level joining. This approach significantly minimizes the need for expensive post-processing in data lakes or data warehouses [12].&lt;/li&gt;
&lt;li&gt;Tableflow removes need of copying data to temporary storage.&lt;/li&gt;
&lt;li&gt;It is fully managed solution, thus you can focus on core business, as proactive maintenance and security, scalability etc. are handled by Confluent.&lt;/li&gt;
&lt;li&gt;Predictable monthly cost.&lt;/li&gt;
&lt;li&gt;Looks good on CV :).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Challenges
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Flink queries are running continuously, for thus running costs has to be measured, multiple use cases might be needed to justify cost [10].&lt;/li&gt;
&lt;li&gt;Tableflow adds additional cost [11], as you will be charged by amount you are running the service on a topic.&lt;/li&gt;
&lt;li&gt;Events in output topics are earliest after deduplication as Tableflow only supports append only Flink tables (Kafka topics) [9].&lt;/li&gt;
&lt;li&gt;Although completely managed, relatively complex solution.&lt;/li&gt;
&lt;li&gt;There's a learning curve to it, as multiple different technologies and tools involved, PyIceberg, Flink, AWS.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;After performing this experiment we have arrived at the following conclusions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Solution is relatively high cost, thus requires careful consideration if to be used for this use case, may require accompanying use cases to proceed.&lt;/li&gt;
&lt;li&gt;The solution is fully managed and can cope with large amounts of data.&lt;/li&gt;
&lt;li&gt;For particular use case Flink Snaphot query may be more suitable, however it is early access [13] or AWS only based solution.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  References
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;[1] Designing Data-Intensive Applications, Martin Kleppmann, O'Reilly, 2017, 590 p.&lt;/li&gt;
&lt;li&gt;[2] &lt;a href="https://www.confluent.io/learn/data-streaming/" rel="noopener noreferrer"&gt;https://www.confluent.io/learn/data-streaming/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[3] &lt;a href="https://docs.confluent.io/cloud/current/flink/overview.html" rel="noopener noreferrer"&gt;https://docs.confluent.io/cloud/current/flink/overview.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[4] &lt;a href="https://www.techtarget.com/searchnetworking/definition/data-streaming" rel="noopener noreferrer"&gt;https://www.techtarget.com/searchnetworking/definition/data-streaming&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[5] &lt;a href="https://docs.confluent.io/cloud/current/topics/tableflow/overview.html" rel="noopener noreferrer"&gt;https://docs.confluent.io/cloud/current/topics/tableflow/overview.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[6] &lt;a href="https://py.iceberg.apache.org/" rel="noopener noreferrer"&gt;https://py.iceberg.apache.org/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[7] &lt;a href="https://iceberg.apache.org/" rel="noopener noreferrer"&gt;https://iceberg.apache.org/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[8] &lt;a href="https://aws.amazon.com/blogs/compute/introducing-aws-lambda-native-support-for-avro-and-protobuf-formatted-apache-kafka-events/" rel="noopener noreferrer"&gt;https://aws.amazon.com/blogs/compute/introducing-aws-lambda-native-support-for-avro-and-protobuf-formatted-apache-kafka-events/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[9] &lt;a href="https://docs.confluent.io/cloud/current/topics/tableflow/overview.html#topic-and-table-limitations" rel="noopener noreferrer"&gt;https://docs.confluent.io/cloud/current/topics/tableflow/overview.html#topic-and-table-limitations&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[10] &lt;a href="https://docs.confluent.io/cloud/current/flink/concepts/flink-billing.html#many-data-streaming-apps-and-statements" rel="noopener noreferrer"&gt;https://docs.confluent.io/cloud/current/flink/concepts/flink-billing.html#many-data-streaming-apps-and-statements&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[11] &lt;a href="https://docs.confluent.io/cloud/current/topics/tableflow/concepts/tableflow-billing.html" rel="noopener noreferrer"&gt;https://docs.confluent.io/cloud/current/topics/tableflow/concepts/tableflow-billing.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[12] &lt;a href="https://docs.confluent.io/cloud/current/topics/tableflow/overview.html#shift-left-stream-processing-with-af-long" rel="noopener noreferrer"&gt;https://docs.confluent.io/cloud/current/topics/tableflow/overview.html#shift-left-stream-processing-with-af-long&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[13] &lt;a href="https://docs.confluent.io/cloud/current/flink/concepts/snapshot-queries.html" rel="noopener noreferrer"&gt;https://docs.confluent.io/cloud/current/flink/concepts/snapshot-queries.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[not-used] Tableflow Confluent explanation video &lt;a href="https://youtu.be/O2l5SB-camQ?t=680" rel="noopener noreferrer"&gt;https://youtu.be/O2l5SB-camQ?t=680&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[not-used] Apache Iceberg (OTF open table format) explained &lt;a href="https://youtu.be/TsmhRZElPvM?t=233" rel="noopener noreferrer"&gt;https://youtu.be/TsmhRZElPvM?t=233&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Code
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://github.com/gintautasm/data-engineering-blueprints/blob/main/confluent-topic-to-csv-with-flink-tableflow/confluent-flink.md" rel="noopener noreferrer"&gt;https://github.com/gintautasm/data-engineering-blueprints/blob/main/confluent-topic-to-csv-with-flink-tableflow/confluent-flink.md&lt;/a&gt;&lt;/p&gt;

</description>
      <category>flink</category>
      <category>kafka</category>
      <category>tableflow</category>
      <category>dataengineering</category>
    </item>
  </channel>
</rss>
