<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>Blog</title>
<link>https://www.gregorykapfhammer.com/blog/</link>
<atom:link href="https://www.gregorykapfhammer.com/blog/index.xml" rel="self" type="application/rss+xml"/>
<description></description>
<generator>quarto-1.8.26</generator>
<lastBuildDate>Thu, 01 Jan 2026 00:00:00 GMT</lastBuildDate>
<item>
  <title>Can mutating the code under test make a stable test go flaky? Yes, and it happens more than you think!</title>
  <dc:creator>Gregory M. Kapfhammer</dc:creator>
  <link>https://www.gregorykapfhammer.com/blog/test-flimsiness-mutation-flakiness/</link>
  <description><![CDATA[ 





<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>What if changing the code under test — not the test itself and not the execution environment — could turn a perfectly stable test case into a flaky one? That is exactly what my colleagues and I discovered in a new phenomenon that we call “test flimsiness”. The name is an acronym since <strong>FLIM</strong>siness stands for <strong>FL</strong>akiness <strong>I</strong>nduced by <strong>M</strong>utations to the code under test. In <span class="citation" data-cites="Parry2026">(Parry et al. 2026)</span> <a href="../../research/papers/parry2026/index.html"><iconify-icon inline="" icon="fa6-solid:book-open"></iconify-icon></a>, published at the International Conference on Software Engineering (ICSE), we present the first large-scale characterization of this overlooked phenomenon. After analyzing over 30 million mutant-test pairs across 28 Python projects, we found flimsiness lurking in 54% of them. Keep reading to learn why this matters for anyone who uses mutation testing or relies on deterministic test outcomes!</p>
</section>
<section id="key-contributions" class="level2">
<h2 class="anchored" data-anchor-id="key-contributions">Key Contributions</h2>
<ul>
<li><p><strong>Defining and Characterizing Test Flimsiness</strong>: We introduce and formally characterize the concept of test flimsiness, where standard mutation operators applied to the code under test cause previously stable test cases to start failing intermittently. This is the first study to systematically investigate this phenomenon.</p></li>
<li><p><strong>Large-Scale Empirical Study</strong>: We conducted an extensive empirical evaluation across 28 real-world Python projects, spanning over half a million test suite executions. Using rigorous statistical analysis with false discovery rate controls, we reliably identified transitions from stability to flakiness triggered by mutations.</p></li>
<li><p><strong>A New Lens for Flaky Test Detection</strong>: Prior work perturbed the execution environment or injected flakiness into test code. We advance these efforts by perturbing a third major source of flakiness: the code under test. Our mutation-based rerunning strategy detects far more flaky tests than standard rerunning alone.</p></li>
<li><p><strong>Comprehensive Public Dataset</strong>: We release a rich dataset comprising over half a million test suite runs and 30 million mutant-test pairs, annotated with test outcome reports and coverage data, in the paper’s <a href="https://doi.org/10.15131/shef.data.30428569.v1">replication package</a>.</p></li>
</ul>
</section>
<section id="empirical-results" class="level2">
<h2 class="anchored" data-anchor-id="empirical-results">Empirical Results</h2>
<p>Our study revealed several noteworthy findings about test flimsiness:</p>
<ul>
<li><p><strong>Flimsiness is prevalent</strong>: It occurs in 15 out of 28 projects (54%), with 0.7% of all mutants inducing flakiness in at least one test case. While the percentage may seem small, we argue that the implications for mutant-driven techniques are significant.</p></li>
<li><p><strong>Mutation operators differ in their tendency to induce flakiness</strong>: For example, mutants produced by the ReplaceUnaryOperator have over 3 times higher odds of inducing flakiness compared to other operators. Interestingly, operators that are better at producing killable mutants also tend to be better at inducing flakiness.</p></li>
<li><p><strong>Mutation-based rerunning detects far more flaky tests</strong>: The mutation-based strategy detected a median of 740 flaky tests per project compared to just 163 for standard rerunning. The flaky tests found by the mutation-based strategy are especially unlikely to be detected by the standard strategy, reinforcing flimsiness as a distinct form of flakiness worthy of further study in future research.</p></li>
<li><p><strong>Unstable coverage does not explain flimsiness</strong>: Whether a test case non-deterministically covered the mutated line prior to mutation is a poor predictor of whether the mutant will induce flakiness. This suggests that the causes of flimsiness are more nuanced than simply manifesting unstable coverage.</p></li>
</ul>
</section>
<section id="future-work" class="level2">
<h2 class="anchored" data-anchor-id="future-work">Future Work</h2>
<p>The paper opens several avenues for future investigation. My co-authors and I plan to study how flimsiness impacts specific mutant-driven techniques such as fault localization and regression testing. We also intend to survey developers to understand how they perceive flimsiness and whether they encounter it during routine use of mutation testing tools. Finally, we aim to investigate the root causes of flimsiness more systematically, potentially involving project developers in the analysis.</p>
<div class="callout callout-style-simple callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Further Details
</div>
</div>
<div class="callout-body-container callout-body">
<p>Test flimsiness represents an exciting new direction in flaky test research, sitting at the intersection of mutation testing and test reliability. If you are interested in learning more, I encourage you to read <span class="citation" data-cites="Parry2026">(Parry et al. 2026)</span> <a href="../../research/papers/parry2026/index.html"><iconify-icon inline="" icon="fa6-solid:book-open"></iconify-icon></a>. If you have questions or experiences related to mutation-induced flakiness, please <a href="../../contact/">contact</a> me. To stay updated on the latest developments in flaky test research, you can <a href="../../support/">subscribe</a> to my mailing list.</p>
</div>
</div>
<p><i class="fa-solid fa-circle-left" aria-label="circle-left"></i> <a href="../../blog/">Return to Blog Post Listing</a></p>



</section>

<div id="quarto-appendix" class="default"><section class="quarto-appendix-contents" id="quarto-bibliography"><h2 class="anchored quarto-appendix-heading">References</h2><div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Parry2026" class="csl-entry">
Parry, Owain, Gregory M. Kapfhammer, Michael Hilton, and Phil McMinn. 2026. <span>“Test Flimsiness: Characterizing Flakiness Induced by Mutation to the Code Under Test.”</span> In <em>Proceedings of the 48th International Conference on Software Engineering</em>.
</div>
</div></section></div> ]]></description>
  <category>post</category>
  <category>research paper</category>
  <category>flaky tests</category>
  <guid>https://www.gregorykapfhammer.com/blog/test-flimsiness-mutation-flakiness/</guid>
  <pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Insights from my Software Engineering Radio interview with Jennings Anderson and Amy Rose</title>
  <dc:creator>Gregory M. Kapfhammer</dc:creator>
  <link>https://www.gregorykapfhammer.com/blog/se-radio-jennings-anderson-amy-rose-overture-maps/</link>
  <description><![CDATA[ 





<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>In a recent episode of the <a href="https://www.se-radio.net/">Software Engineering Radio</a> podcast, I interviewed <a href="https://jenningsanderson.com/cv/">Jennings Anderson</a>, a Software Engineer at Meta Platforms, and <a href="https://www.linkedin.com/in/amynrose/">Amy Rose</a>, the Chief Technology Officer at the <a href="https://overturemaps.org/">Overture Maps Foundation</a>. Our conversation focused on the Overture Maps project, which creates reliable, easy-to-use, and interoperable open map data. During the interview, Amy and Jennings share insights into the foundations of geospatial information systems, the Global Entity Reference System (GERS), the challenges of normalizing diverse map data into a unified schema, and how developers can build applications using tools like DuckDB and GeoParquet. This episode was fun to record — I hope you enjoy it!</p>
</section>
<section id="insights" class="level2">
<h2 class="anchored" data-anchor-id="insights">Insights</h2>
<p>I’m thankful for this fun-loving and engaging discussion with both Jennings Anderson and Amy Rose. Before you listen to the full episode, you can preview some of its insights:</p>
<p><strong>Why is normalizing geospatial data to a single schema so important?</strong></p>
<p>Amy explains the challenge that Overture Maps solves for developers:</p>
<blockquote class="blockquote">
<p>“Imagine you’re trying to build an application that uses map data. You’re pulling all this information from different sources if each source has its own unique way of describing things. So let’s say some data refers to roads as quote unquote streets and others as highways. Or if you have in some datasets, the height is measured in meters and others in feet just because of cultural differences. It’s a total nightmare to get them to all work together, right?”</p>
</blockquote>
<p><strong>What is the Global Entity Reference System (GERS) and why does it matter?</strong></p>
<p>Jennings describes the innovation behind stable identifiers in Overture Maps:</p>
<blockquote class="blockquote">
<p>“The idea of GERS is to say, okay, well there might be different representations of each of these buildings, but each building is in fact its own building entity, the building-ness of the building, so to say. So we will define a single entity for a building, give that a unique identifier.”</p>
</blockquote>
<p><strong>How does DuckDB enable developers to query Overture Maps data efficiently?</strong></p>
<p>Jennings explains the cloud-native workflow that Overture Maps makes possible:</p>
<blockquote class="blockquote">
<p>“Our data is all released in GeoParquet format, which is a columnar format that’s optimized for the cloud native environment here. And DuckDB is a fantastic open-source query engine that allows us to investigate that data <em>in situ</em> in the cloud. … However, with DuckDB and with Geo Parquet, what that enables us is the ability to actually query the data in place.”</p>
</blockquote>
<p><strong>How is the relationship between open-source software and open data different?</strong></p>
<p>Amy highlights a distinction that is often overlooked by software engineers:</p>
<blockquote class="blockquote">
<p>“Open-source software and open-source data you might want to lump them together because it’s all open source, but they’re very different things. … How you build open-source software is much clearer. There’s a lot of tools out there already to very cleanly execute on these types of collaborations, particularly in big projects. And code is pretty easy to think about how you would release and continue to maintain and update. Data’s a very different animal, not the least of which is because it can get really big.”</p>
</blockquote>
<p><strong>Why is Overture Maps part of the Linux Foundation?</strong></p>
<p>Amy explains the governance model that guides the project:</p>
<blockquote class="blockquote">
<p>“As part of the Linux Foundation, Overture operates as a nonprofit technology consortium. So the idea of operating under that structure is that it provides a neutral, kind of vendor agnostic, home for the project. It gives us a much better way to remain open and truly collaborative.”</p>
</blockquote>
</section>
<section id="listen" class="level2">
<h2 class="anchored" data-anchor-id="listen">Listen</h2>
<p>If you’re interested in learning more about Overture Maps and open geospatial data, I highly recommend listening to my interview with Jennings Anderson and Amy Rose on <a href="https://se-radio.net/">Software Engineering Radio</a>! You can find it on your favorite podcast player, <a href="https://podcasts.apple.com/us/podcast/software-engineering-radio-the-podcast-for/id120906714">Apple Podcasts</a>, <a href="https://open.spotify.com/show/6UO3XQclSuNnGxB39QdAnL">Spotify</a>, <a href="https://www.youtube.com/playlist?list=PLHJB2bhmgB7esz0BxMCt1jJwsoaqWtFff">YouTube</a>, or you can listen to it with this handy podcast player.</p>
<figure class="figure"><audio controls="" src="https://traffic.libsyn.com/secure/seradio/694-anderson-rose-overture-maps.mp3" type="audio/mp3">Your browser does not support the audio tag.</audio><figcaption>Listen to Software Engineering Radio Episode with Jennings Anderson and Amy Rose</figcaption></figure>
<p><i class="fa-solid fa-circle-left" aria-label="circle-left"></i> <a href="../../blog/">Return to Blog Post Listing</a></p>


</section>

 ]]></description>
  <category>post</category>
  <category>software development</category>
  <category>software engineering radio</category>
  <guid>https://www.gregorykapfhammer.com/blog/se-radio-jennings-anderson-amy-rose-overture-maps/</guid>
  <pubDate>Mon, 15 Dec 2025 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Insights from my Software Engineering Radio interview with Kacper Łukawski</title>
  <dc:creator>Gregory M. Kapfhammer</dc:creator>
  <link>https://www.gregorykapfhammer.com/blog/se-radio-kacper-lukawski-qdrant-vector-database/</link>
  <description><![CDATA[ 





<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>In a recent episode of the <a href="https://www.se-radio.net/">Software Engineering Radio</a> podcast, I interviewed <a href="https://www.kacperlukawski.com/">Kacper Łukawski</a>, a Senior Developer Advocate at <a href="https://qdrant.tech/">Qdrant</a>. Our conversation focused on Qdrant, an open-source vector database and similarity search engine implemented in Rust. During the interview, Kacper shares insights into vector embeddings and similarity search, the performance benefits of implementing a search engine in Rust, the principles behind benchmarking vector databases, and how developers can get started building AI-powered applications with Qdrant. I learned a lot from this interview and I hope you do as well!</p>
</section>
<section id="insights" class="level2">
<h2 class="anchored" data-anchor-id="insights">Insights</h2>
<p>I’m thankful for this action-packed and informative discussion with Kacper Łukawski! Before you listen to the full episode, please checkout some of its insights:</p>
<p><strong>What is a vector database and how does similarity search work?</strong></p>
<blockquote class="blockquote">
<p>“It’s a service that can efficiently store and handle high dimensional vectors for the proposals of similarity search and similarity of these vectors is defined by the closeness of the vectors in that space. So vector databases are built to make that process efficient.”</p>
</blockquote>
<p><strong>What are vector embeddings and why are they important for semantic search?</strong></p>
<blockquote class="blockquote">
<p>“Vector embeddings are just numerical representations of the input data and the main idea is that they keep the semantic meaning of the input data that was used to generate them. And if we have two different vectors which are similar in some way, then we assume that the objects that are used to generate them are also similar in their nature.”</p>
</blockquote>
<p><strong>Why did the Qdrant team choose Rust as the implementation language?</strong></p>
<blockquote class="blockquote">
<p>“Definitely the biggest factor behind choosing Rust is its safety. And we can achieve almost similar performance like C or C++ sometimes even better. While keeping this language safety and this strong type system that Rust provides is very helpful in preventing us from making some mistakes in a highly concurrent system. So reading or writing some value from multiple threats concurrently because that’s ultimately what you can expect from a search engine.”</p>
</blockquote>
<p><strong>What metrics does Qdrant use when benchmarking performance?</strong></p>
<blockquote class="blockquote">
<p>“Depending on a specific use case you have or maybe some budget constraints, you might prefer to optimize for a particular metric from those four. But we measure all of them and report them in our benchmarks just so you can have understanding of what you can expect in a very specific setup. For example, low latency might be important if your users expect immediate response, and we measure an average latency P95 and P99 so we can see like what the majority of users can expect from the system and how fast it is going to be.”</p>
</blockquote>
<p><strong>What is the future of vector databases in the AI landscape?</strong></p>
<blockquote class="blockquote">
<p>“The main problem of AI or LLMs … even the latest LLM can suffer from knowledge cutoff because they were trained on some specific data sets and definitely don’t know that most recent news and none of them could have been trained on your own data. So definitely some sort of retrieval is needed and vector databases will definitely serve that functionality.”</p>
</blockquote>
</section>
<section id="listen" class="level2">
<h2 class="anchored" data-anchor-id="listen">Listen</h2>
<p>If you’re interested in learning more about Qdrant and vector similarity search, I highly recommend listening to my interview with Kacper Łukawski on <a href="https://se-radio.net/">Software Engineering Radio</a>! You can find it on your favorite podcast player, <a href="https://podcasts.apple.com/us/podcast/software-engineering-radio-the-podcast-for/id120906714">Apple Podcasts</a>, <a href="https://open.spotify.com/show/6UO3XQclSuNnGxB39QdAnL">Spotify</a>, <a href="https://www.youtube.com/playlist?list=PLHJB2bhmgB7esz0BxMCt1jJwsoaqWtFff">YouTube</a>, or you can listen to it with this handy podcast player.</p>
<figure class="figure"><audio controls="" src="https://traffic.libsyn.com/secure/seradio/691-kacper-lukawski-qdrant-vector-database.mp3" type="audio/mp3">Your browser does not support the audio tag.</audio><figcaption>Listen to Software Engineering Radio Episode with Kacper Łukawski</figcaption></figure>
<p><i class="fa-solid fa-circle-left" aria-label="circle-left"></i> <a href="../../blog/">Return to Blog Post Listing</a></p>


</section>

 ]]></description>
  <category>post</category>
  <category>software development</category>
  <category>software engineering radio</category>
  <guid>https://www.gregorykapfhammer.com/blog/se-radio-kacper-lukawski-qdrant-vector-database/</guid>
  <pubDate>Sat, 15 Nov 2025 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Insights from my Software Engineering Radio interview with Samuel Colvin</title>
  <dc:creator>Gregory M. Kapfhammer</dc:creator>
  <link>https://www.gregorykapfhammer.com/blog/se-radio-samuel-colvin-pydantic-ecosystem/</link>
  <description><![CDATA[ 





<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>In a recent episode of the <a href="https://www.se-radio.net/">Software Engineering Radio</a> podcast, I interviewed <a href="https://www.linkedin.com/in/samuel-colvin/">Samuel Colvin</a>, the CEO and founder of the Pydantic company. Our conversation focused on Pydantic, a popular data validation library for Python, and its ecosystem, including Pydantic AI and Logfire. During our interview, Samuel offers many insights into how these tools can help Python developers build more robust and reliable applications.</p>
</section>
<section id="insights" class="level2">
<h2 class="anchored" data-anchor-id="insights">Insights</h2>
<p>I’m thankful for this thought-provoking discussion with Samuel Colvin! Before you listen to the full episode, please checkout some of its insights:</p>
<p><strong>What is Pydantic and how does it help with data validation?</strong></p>
<blockquote class="blockquote">
<p>“So Pydantic, to all intents and purposes, is a data validation library for Python. But it does a bunch more stuff above and beyond simple data validation — like controlling serialization, coercion when you’re validating and generating JSON schema.”</p>
</blockquote>
<p><strong>What were the motivations for rewriting Pydantic V2 in Rust?</strong></p>
<blockquote class="blockquote">
<p>“Initially the internals of Pydantic were all Python. I wasn’t particularly proud of the internals. And so at the beginning of 2022, I started working full-time on Pydantic, rebuilding the core in Rust. There’s an amazing library called Py03 that allows you to write Python extensions in Rust, which gives you an enormous performance improvement. But it’s actually, it goes beyond simply the performance. It allows you to write fundamentally more robust and scalable and maintainable code when you’re building these big, performance- critical complex applications.”</p>
</blockquote>
<p><strong>How does Pydantic AI help developers interact with large language models (LLMs)?</strong></p>
<blockquote class="blockquote">
<p>“So the number one piece of value I think that Pydantic AI brings is this model agnosticism. You can switch in and out of OpenAI, Anthropic, Gemini, Grok, DeepSeek, et cetera, et cetera, Mistral, Cohere, with one line of code.”</p>
</blockquote>
<p><strong>What is Logfire and how does it help with observability?</strong></p>
<blockquote class="blockquote">
<p>“Logfire is an observability platform. We do logs, traces and metrics that let you understand and monitor your application. It is very useful when you’re building applications in Python in general, but particularly AI applications.”</p>
</blockquote>
</section>
<section id="listen" class="level2">
<h2 class="anchored" data-anchor-id="listen">Listen</h2>
<p>If you’re interested in learning more about Pydantic and its ecosystem, I highly recommend listening to my interview with Samuel Colvin on <a href="https://se-radio.net/">Software Engineering Radio</a>! You can find it on your favorite podcast player, <a href="https://podcasts.apple.com/us/podcast/software-engineering-radio-the-podcast-for/id120906714">Apple Podcasts</a>, <a href="https://open.spotify.com/show/6UO3XQclSuNnGxB39QdAnL">Spotify</a>, <a href="https://www.youtube.com/playlist?list=PLHJB2bhmgB7esz0BxMCt1jJwsoaqWtFff">YouTube</a>, or you can listen to it with this handy podcast player.</p>
<figure class="figure"><audio controls="" src="https://traffic.libsyn.com/secure/forcedn/seradio/676-samuel-colvin-pydantic-ecosystem.mp3" type="audio/mp3">Your browser does not support the audio tag.</audio><figcaption>Listen to Software Engineering Radio Episode with Samuel Colvin</figcaption></figure>
<p><i class="fa-solid fa-circle-left" aria-label="circle-left"></i> <a href="../../blog/">Return to Blog Post Listing</a></p>


</section>

 ]]></description>
  <category>post</category>
  <category>software development</category>
  <category>software engineering radio</category>
  <guid>https://www.gregorykapfhammer.com/blog/se-radio-samuel-colvin-pydantic-ecosystem/</guid>
  <pubDate>Fri, 15 Aug 2025 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Is slicing or mutation testing better at automatically identifying weaknesses in your test suite?</title>
  <dc:creator>Gregory M. Kapfhammer</dc:creator>
  <link>https://www.gregorykapfhammer.com/blog/pseudosweep-identify-oracle-gaps/</link>
  <description><![CDATA[ 





<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>Are your tests as effective as you think they are? While statement coverage is a common metric for test suite quality, it often doesn’t tell the whole story. High coverage scores can create a false sense of security, leaving critical “gaps” in your testing strategy. In the paper <span class="citation" data-cites="Maton2025">(Maton, Kapfhammer, and McMinn 2025)</span> <a href="../../research/papers/maton2025/index.html"><iconify-icon inline="" icon="fa6-solid:book-open"></iconify-icon></a>, my colleagues and I investigate how to identify an “oracle gap” that comprises the code that is executed by the tests but not actually checked by any assertions. A key contribution of this paper is a tool called <code>GapGrep</code> that uses three distinct methods to helps researchers and practitioners identify these oracle gaps in their test suites. Interested in learning more about this paper? Keep reading!</p>
</section>
<section id="key-contributions" class="level2">
<h2 class="anchored" data-anchor-id="key-contributions">Key Contributions</h2>
<p>This paper’s research offers a comprehensive empirical comparison of three different Oracle Gap Calculation Approaches (OGCAs) and the gaps that they produce:</p>
<ul>
<li><strong>Checked Coverage using a Dynamic Slicer (CCDS)</strong>: This technique uses dynamic slicing to identify statements that influence the outcome of a test assertion.</li>
<li><strong>Checked Coverage using an Observational Slicer (CCOS)</strong>: This approach repeatedly deletes lines of code to see if the program’s behavior changes.</li>
<li><strong>Pseudo-Tested Statement Identification (PTSI)</strong>: This method identifies the pseudo-tested statements that can be removed without causing any test to fail.</li>
</ul>
<p>This paper’s study gives a quantitative and qualitative analysis of these techniques, helping developers choose the most suitable approach for their needs. Read on to learn more!</p>
</section>
<section id="empirical-results" class="level2">
<h2 class="anchored" data-anchor-id="empirical-results">Empirical Results</h2>
<p>We conducted an empirical study on 30 Java classes from six open-source projects. This paper identifies several interesting results such as the following:</p>
<ul>
<li><strong>PTSI is the most efficient and effective OGCA</strong>: This method consistently identified the oracle gaps with the lowest mutation scores, indicating that it is the best at pinpointing areas where the test suite’s fault detection is weak.</li>
<li><strong>PTSI is the fastest approach</strong>: Using pseudo-testedness to identify program statements in the oracle gap has the best performance, making it a practical choice for developers who need to quickly assess the strength of their test suites.</li>
<li><strong>Distinct oracle gaps</strong>: The three OGCAs created oracle gaps that were largely distinct, suggesting that they uncover different types of testing weaknesses.</li>
</ul>
</section>
<section id="future" class="level2">
<h2 class="anchored" data-anchor-id="future">Future</h2>
<p>While our study focused on programs implemented in Java, the concept of oracle gaps is applicable to a wide range of programming languages. Future work will involve expanding our analysis to other languages and exploring how these techniques can be integrated into the software development lifecycle to provide developers with real-time feedback on their tests. Ultimately, we hope that the current and future versions of the <code>GapGrep</code> tool can offer developers an automated approach to identifying how their test cases fall short.</p>
<div class="callout callout-style-simple callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Further Details
</div>
</div>
<div class="callout-body-container callout-body">
<p>My colleagues and I are keen to help developers improve the quality of their software. If you have any questions about this research or want to share your own experiences with test suite analysis, please <a href="../../contact/">contact</a> me. If you want to learn more about oracle gaps, you can read <span class="citation" data-cites="Maton2025">(Maton, Kapfhammer, and McMinn 2025)</span> <a href="../../research/papers/maton2025/index.html"><iconify-icon inline="" icon="fa6-solid:book-open"></iconify-icon></a>. To stay up-to-date on my latest research and blog posts, please <a href="../../support/">subscribe</a> to my mailing list. As always, your feedback is welcome!</p>
</div>
</div>
<p><i class="fa-solid fa-circle-left" aria-label="circle-left"></i> <a href="../../blog/">Return to Blog Post Listing</a></p>



</section>

<div id="quarto-appendix" class="default"><section class="quarto-appendix-contents" id="quarto-bibliography"><h2 class="anchored quarto-appendix-heading">References</h2><div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Maton2025" class="csl-entry">
Maton, Megan, Gregory M. Kapfhammer, and Phil McMinn. 2025. <span>“Where Tests Fall Short: Empirically Analyzing Oracle Gaps in Covered Code.”</span> In <em>Proceedings of the 19th International Symposium on Empirical Software Engineering and Measurement</em>.
</div>
</div></section></div> ]]></description>
  <category>post</category>
  <category>research paper</category>
  <category>software testing</category>
  <guid>https://www.gregorykapfhammer.com/blog/pseudosweep-identify-oracle-gaps/</guid>
  <pubDate>Fri, 15 Aug 2025 00:00:00 GMT</pubDate>
</item>
<item>
  <title>When flaky tests fail together: Empirical evidence for systemic flakiness</title>
  <dc:creator>Gregory M. Kapfhammer</dc:creator>
  <link>https://www.gregorykapfhammer.com/blog/discover-systemic-test-flakiness/</link>
  <description><![CDATA[ 





<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>Have you ever noticed that when one flaky test fails in your continuous integration pipeline, several others seem to fail at the same time? Well, you’re not imagining things! My colleagues and I recently completed a comprehensive study that reveals flaky tests often exist in clusters, failing together due to shared root causes. We call this phenomenon <em>systemic flakiness</em>, and we think it represents a major shift in how both software developers and software engineering researchers should think about and address flaky tests.</p>
<p>Our research paper “Systemic Flakiness: An Empirical Analysis of Co-Occurring Flaky Test Failures” <span class="citation" data-cites="Parry2025">(Parry et al. 2025)</span> <a href="../../research/papers/parry2025/index.html"><iconify-icon inline="" icon="fa6-solid:book-open"></iconify-icon></a> reveals that that 75% of flaky tests belong to clusters with an average of 13.5 tests per cluster. As explained in this post, our discovery of the clustering of flaky tests may have profound implications for how developers can reduce the time and cost of fixing flaky tests! Interested in learning more about systemic flakiness? You can read this post for an overview of both the key empirical findings and the future research suggestions presented in <span class="citation" data-cites="Parry2025">(Parry et al. 2025)</span> <a href="../../research/papers/parry2025/index.html"><iconify-icon inline="" icon="fa6-solid:book-open"></iconify-icon></a>.</p>
</section>
<section id="summary-of-key-results" class="level2">
<h2 class="anchored" data-anchor-id="summary-of-key-results">Summary of Key Results</h2>
<ul>
<li><p><strong>The Prevalence of Systemic Flakiness</strong>: Our analysis of 810 flaky tests across 24 Java projects revealed that 75% of flaky tests belong to clusters with an average of 13.5 tests per cluster. This means that when one flaky test fails, it’s likely that 12 or 13 other test cases will also fail at the same time due to shared root causes.</p></li>
<li><p><strong>Predicting Systemic Flakiness with Machine Learning</strong>: Rather than requiring thousands of test suite runs to identify which tests fail together, we found that machine learning models can predict systemic flakiness using simple static analysis. Extra trees models achieved the best performance with 74% accuracy, and surprisingly, the structure of test names (like package and class hierarchy) was more predictive than analyzing the actual source code.</p></li>
<li><p><strong>Root Causes of Systemic Flakiness</strong>: Through manual inspection of error messages and stack traces, we discovered that systemic flakiness is primarily caused by networking issues (e.g., domain name service failures or connection timeouts) and external dependencies (e.g., unstable services or library version conflicts). This differs significantly from individual flaky tests, which are usually caused by concurrency or timing issues.</p></li>
</ul>
</section>
<section id="future-research-suggestions" class="level2">
<h2 class="anchored" data-anchor-id="future-research-suggestions">Future Research Suggestions</h2>
<p>This paper’s results suggest several exciting avenues for future investigation:</p>
<ul>
<li><p><strong>Expanding Beyond Java</strong>: The current study focused on Java projects, but systemic flakiness likely occurs across all programming languages and testing frameworks. Research should examine whether similar clustering patterns exist in other ecosystems.</p></li>
<li><p><strong>Automated Root Cause Analysis</strong>: While our manual inspection revealed important patterns, the process was time-consuming and sometimes inconclusive. Developing artificial intelligence (AI)-powered techniques to automatically analyze test code and stack traces could significantly accelerate the identification of systemic flakiness causes.</p></li>
<li><p><strong>Integration with CI/CD Tools</strong>: Current flaky test detection tools normally focus on individual tests without considering failure co-occurrence. Research should explore how to integrate systemic flakiness prediction into existing continuous integration (CI) and continuous delivery (CD) pipelines on platforms like GitHub Actions.</p></li>
<li><p><strong>Developer Studies</strong>: Our research was based on quantitative analysis, but we need to understand how developers currently perceive and handle systemic flakiness. Surveys and interviews could reveal whether practitioners are already aware of this phenomenon.</p></li>
<li><p><strong>Realistic Testing Impact</strong>: Previous studies evaluated how flaky tests affect fault localization and mutation testing using simulated individual failures. These assessments should be revisited using realistic models that account for clustered failures.</p></li>
<li><p><strong>Benchmark Datasets</strong>: The research community needs datasets that explicitly capture failure co-occurrence patterns and the phenomenon of systemic flakiness. These benchmarks would enable comparative evaluation of systemic flakiness detection tools.</p></li>
</ul>
<div class="callout callout-style-simple callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Further Details
</div>
</div>
<div class="callout-body-container callout-body">
<p>This research paper represents a fundamental shift in how we understand flaky tests. If you’re interested in learning more about systemic flakiness or have experiences with clustered test failures, I’d love to hear from you! Please <a href="../../contact/">contact</a> me with your insights. To stay updated on the latest developments in flaky test research, consider <a href="../../support/">subscribing</a> to my mailing list.</p>
</div>
</div>
<p><i class="fa-solid fa-circle-left" aria-label="circle-left"></i> <a href="../../blog/">Return to Blog Post Listing</a></p>



</section>

<div id="quarto-appendix" class="default"><section class="quarto-appendix-contents" id="quarto-bibliography"><h2 class="anchored quarto-appendix-heading">References</h2><div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Parry2025" class="csl-entry">
Parry, Owain, Gregory M. Kapfhammer, Michael Hilton, and Phil McMinn. 2025. <span>“Systemic Flakiness: An Empirical Analysis of Co-Occurring Flaky Test Failures.”</span> In <em>Proceedings of the 29th International Conference on Evaluation and Assessment in Software Engineering</em>.
</div>
</div></section></div> ]]></description>
  <category>post</category>
  <category>research paper</category>
  <category>flaky tests</category>
  <guid>https://www.gregorykapfhammer.com/blog/discover-systemic-test-flakiness/</guid>
  <pubDate>Fri, 30 May 2025 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Insights from my Software Engineering Radio interview with Will McGugan</title>
  <dc:creator>Gregory M. Kapfhammer</dc:creator>
  <link>https://www.gregorykapfhammer.com/blog/se-radio-will-mcgugan-text-interfaces/</link>
  <description><![CDATA[ 





<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>In a recent episode of the <a href="https://www.se-radio.net/">Software Engineering Radio</a> podcast, I interviewed <a href="https://willmcgugan.github.io/">Will McGugan</a>, the creator of <a href="https://github.com/Textualize/rich">Rich</a> and <a href="https://github.com/Textualize/textual">Textual</a> and the CEO and founder of <a href="https://www.textualize.io/">Textualize</a>. Our conversation focused on building text-based user interfaces (TUIs) and command line interfaces (CLIs) using the aforementioned Python frameworks. Will explained how concepts from web technologies can be adapted for terminal applications, strategies for optimizing the performance of TUI and CLI frameworks, and the future of text-based interfaces in software development.</p>
</section>
<section id="insights" class="level2">
<h2 class="anchored" data-anchor-id="insights">Insights</h2>
<p>I’m thankful that Will took the time for this interview! Here are some key insights from it:</p>
<p><strong>What makes text-based user interfaces compelling for developers?</strong></p>
<blockquote class="blockquote">
<p>“They tend to be very responsive and very quick and very snappy and there’s less contact switching. I mean I used to be a web developer, I kind of use the web a lot like most people do, but there’s quite a lot of contexts switching when you go between web application, browser tab, etc. But the benefits of running in the terminal is that it stays in your own flow. So it’s like everything’s in one place and it’s snappy and responsive and it comes up when you need it. It’s very quick to interact with and then it goes away as quickly when you don’t need it.”</p>
</blockquote>
<p><strong>How does bringing web technologies to the terminal improve development?</strong></p>
<blockquote class="blockquote">
<p>“So I come from the web world and the great thing about the web is that building user interfaces has been iterated on very rapidly for the last 10, 20 years. People have been trying new ways, new interfaces, refining it and creating new technologies to create these user interfaces. But none of that made it to the terminal. The terminal was considered a bit archaic and people used it for more simplistic outputs. So I took web technologies and essentially ported what I think is the best of them to the terminal.”</p>
</blockquote>
<p><strong>What performance strategies are crucial for smooth terminal interfaces?</strong></p>
<blockquote class="blockquote">
<p>“You consider the terminal to be a matrix of characters. That’s essentially all, it’s that composes all the elements that run inside the terminal and if you change it, you can build up a new frame. If you were to clear the screen, which might be obvious and then write your new screen on top of it, you get flicker because the terminal was never really designed. In a sense it was, but it’s not good at displaying user interfaces. That’s not really its primary purpose even though it can, the way around that is instead of clearing the screen, you just write the new content on top of it and do you need to change the bits of the screen which have logically changed.”</p>
</blockquote>
<p><strong>How does caching with immutable objects improve performance?</strong></p>
<blockquote class="blockquote">
<p>“Immutability is the opposite of mutability. Mutability means the ability to change, mutate your data. If an object isn’t mutable, it’s immutable and it can’t change and it might seem like a restriction, like you’ve got a data, you’ve got an object, you can’t change it. It feels like a restriction but it is massively beneficial. It means that when you change it, you create a new object rather than modifying the existing one. And when you do that, caching works a lot better.”</p>
</blockquote>
</section>
<section id="listen" class="level2">
<h2 class="anchored" data-anchor-id="listen">Listen</h2>
<p>If you’re interested in learning more about Rich, Textual, and building text-based user interfaces in Python, I highly recommend listening to my interview with Will McGugan about text-based user interfaces on <a href="https://se-radio.net/">Software Engineering Radio</a>! You can find it on your favorite podcast player, <a href="https://podcasts.apple.com/us/podcast/software-engineering-radio-the-podcast-for/id120906714">Apple Podcasts</a>, <a href="https://open.spotify.com/show/6UO3XQclSuNnGxB39QdAnL">Spotify</a>, <a href="https://www.youtube.com/playlist?list=PLHJB2bhmgB7esz0BxMCt1jJwsoaqWtFff">YouTube</a>, or you can listen to it with this handy podcast player.</p>
<figure class="figure"><audio controls="" src="https://traffic.libsyn.com/secure/forcedn/seradio/669-will-mcgugan-text-based-ui.mp3" type="audio/mp3">Your browser does not support the audio tag.</audio><figcaption>Listen to Software Engineering Radio Episode with Will McGugan</figcaption></figure>
<p><i class="fa-solid fa-circle-left" aria-label="circle-left"></i> <a href="../../blog/">Return to Blog Post Listing</a></p>


</section>

 ]]></description>
  <category>post</category>
  <category>software development</category>
  <category>software engineering radio</category>
  <guid>https://www.gregorykapfhammer.com/blog/se-radio-will-mcgugan-text-interfaces/</guid>
  <pubDate>Wed, 21 May 2025 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Insights from my Software Engineering Radio interview with Eran Yahav</title>
  <dc:creator>Gregory M. Kapfhammer</dc:creator>
  <link>https://www.gregorykapfhammer.com/blog/se-radio-eran-yahav-tabnine-assistant/</link>
  <description><![CDATA[ 





<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>In a recent episode of the <a href="https://www.se-radio.net/">Software Engineering Radio</a> podcast, I interviewed <a href="https://csaws.cs.technion.ac.il/~yahave/">Eran Yahav</a>, the CTO of <a href="https://www.tabnine.com/">Tabnine</a> and a faculty member in the <a href="https://www.cs.technion.ac.il/">Computer Science Department</a> at the <a href="https://www.technion.ac.il/en/">Israel Institute of Technology</a>. Our conversation focused on Tabnine, an artificial intelligence (AI) coding assistant that uses large language models (LLMs) to help software engineers with tasks like code completion, explanation, and test case generation. In this podcast interview, Eran offers insights into how Tabnine bridges the gap between powerful LLMs and practical software engineering needs through enterprise context and trust.</p>
</section>
<section id="insights" class="level2">
<h2 class="anchored" data-anchor-id="insights">Insights</h2>
<p>I’m thankful for this thought-provoking interview with Eran Yahav! Here are some of its insights:</p>
<p><strong>How does Tabnine’s enterprise context engine make AI assistants more effective?</strong></p>
<blockquote class="blockquote">
<p>“From the LLM to an actual use of software engineer, there is a hole that has to happen in the middle, right? Part of that is the context that I mentioned earlier. So Tabnine has what we call the enterprise context engine, which is something that basically knows how to draw relevant context from all code sources of information and non-code sources of information in the organization to make sure that again, Tabnine operates like an onboarded employee of the organization and not as a foreign engineer in the org. So Tabnine knows everything about the org, and which informs the code that it generates, how it reviews code, etc.”</p>
</blockquote>
<p><strong>What is the vision for AI assistance across the software development lifecycle?</strong></p>
<blockquote class="blockquote">
<p>“Tabnine provides assistance across the entire SDLC. It helps you write code with code completions that are very advanced. It has a chat interface that allows you to create new code, review code, refactor code, translate between languages, generate tests as you mentioned initially, document code, explain it. So it basically helps you do anything that you have to do as a software engineer and the vision is really to provide agents that help you do anything and everything a software engineer does just faster and with a higher quality.”</p>
</blockquote>
<p><strong>How should software engineers think about the future of AI in programming?</strong></p>
<blockquote class="blockquote">
<p>“I think really the future is every engineer is really a team lead and that team lead is leading a team of AI engineers. They could be specialized in different domains, the AI engineers, they could have varying expertise, but I think every engineer would have to start thinking like an engineering manager in a sense, or at least like a team lead.”</p>
</blockquote>
<p><strong>What makes the difference between AI assistants and existing tools like ChatGPT?</strong></p>
<blockquote class="blockquote">
<p>“You can think about the LLM as a kind of an ignorant genius. It knows how to do many, many, many things, but not in in the relevant context in which I’m operating, right? And you can think about the best engineer in the organization as someone who really knows the nuts and bolts of how things operate, right? […] So you want really to bridge these two things, make the LLM as aware of the org as your best engineer and this is how you get like to 10x productivity of the AI engineer, right? To onboard the AI to your organization.”</p>
</blockquote>
</section>
<section id="listen" class="level2">
<h2 class="anchored" data-anchor-id="listen">Listen</h2>
<p>If you’re interested in learning more about Tabnine and exploring the landscape of AI-powered software engineering tools, I highly recommend listening to my interview with Eran Yahav about Tabnine on <a href="https://se-radio.net/">Software Engineering Radio</a>! You can find it on your favorite podcast player, <a href="https://podcasts.apple.com/us/podcast/software-engineering-radio-the-podcast-for/id120906714">Apple Podcasts</a>, <a href="https://open.spotify.com/show/6UO3XQclSuNnGxB39QdAnL">Spotify</a>, <a href="https://www.youtube.com/playlist?list=PLHJB2bhmgB7esz0BxMCt1jJwsoaqWtFff">YouTube</a>, or you can listen to it with this handy podcast player.</p>
<figure class="figure"><audio controls="" src="https://traffic.libsyn.com/secure/forcedn/seradio/666-eran-yahav-tabnine-coding-assistant.mp3" type="audio/mp3">Your browser does not support the audio tag.</audio><figcaption>Listen to Software Engineering Radio Episode with Eran Yahav</figcaption></figure>
<p><i class="fa-solid fa-circle-left" aria-label="circle-left"></i> <a href="../../blog/">Return to Blog Post Listing</a></p>


</section>

 ]]></description>
  <category>post</category>
  <category>software development</category>
  <category>software engineering radio</category>
  <guid>https://www.gregorykapfhammer.com/blog/se-radio-eran-yahav-tabnine-assistant/</guid>
  <pubDate>Wed, 30 Apr 2025 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Flaky tests are just one symptom — your test suite needs a health check!</title>
  <dc:creator>Gregory M. Kapfhammer</dc:creator>
  <link>https://www.gregorykapfhammer.com/blog/holistic-test-suite-health/</link>
  <description><![CDATA[ 





<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>When software developers talk about problematic test suites, the conversation often begins and ends with flaky tests. And while flakiness is certainly a serious concern, is it really the only symptom of an unhealthy test suite? My colleagues and I argue that it is not. In <span class="citation" data-cites="McMinn2025">(McMinn, Roslan, and Kapfhammer 2025)</span> <a href="../../research/papers/mcminn2025/index.html"><iconify-icon inline="" icon="fa6-solid:book-open"></iconify-icon></a>, published at the 2nd International Flaky Tests Workshop, we present a manifesto that identifies nine distinct indicators of test suite health and argues that researchers and practitioners should take a holistic view rather than fixating on any single metric.</p>
</section>
<section id="key-contributions" class="level2">
<h2 class="anchored" data-anchor-id="key-contributions">Key Contributions</h2>
<ul>
<li><p><strong>Nine Health Indicators</strong>: We identify a checklist of indicators that signal an unhealthy test suite, starting with flakiness but extending to low code coverage, pseudo-testedness, low mutation scores, long-running test suites, low test diversity, high brittleness, low realism, and high variability of indicator metrics.</p></li>
<li><p><strong>Trade-offs Between Indicators</strong>: We argue that some indicators are complementary while others are in tension. For instance, a test suite with fewer assertions may be less flaky but also more pseudo-tested, meaning it executes code without actually checking it. Pursuing a high mutation score might increase brittleness if tests become tightly coupled to implementation details rather than intended behavior.</p></li>
<li><p><strong>A Research Agenda</strong>: We outline seven challenges for the research community, ranging from identifying further indicators and quantifying trade-offs to building tooling that can give developers actionable recommendations for improving the overall health of their test suites.</p></li>
</ul>
</section>
<section id="key-insights" class="level2">
<h2 class="anchored" data-anchor-id="key-insights">Key Insights</h2>
<p>Since this is a short position paper and manifesto, the contribution is conceptual rather than experimental. The paper synthesizes insights from across the software testing literature to make the case that indicators like pseudo-testedness, brittleness, and realism deserve the same level of research attention that flakiness has received. The accompanying <a href="https://github.com/test-suite-health">resource page</a> catalogs existing detection and improvement tools for each indicator, showing where tooling already exists and where gaps remain.</p>
</section>
<section id="future-work" class="level2">
<h2 class="anchored" data-anchor-id="future-work">Future Work</h2>
<p>The paper outlines several open challenges, including how to measure less well-understood indicators like test realism and brittleness, how to combine multiple indicators into a composite picture of test suite health, and how to study the evolution of test suite health over the lifecycle of a project. Ultimately, the goal is to move toward automated tools that not only diagnose problems but also recommend concrete actions for developers to improve their test suites.</p>
<div class="callout callout-style-simple callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Further Details
</div>
</div>
<div class="callout-body-container callout-body">
<p>If you are interested in thinking about test quality beyond flakiness, I encourage you to read <span class="citation" data-cites="McMinn2025">(McMinn, Roslan, and Kapfhammer 2025)</span> <a href="../../research/papers/mcminn2025/index.html"><iconify-icon inline="" icon="fa6-solid:book-open"></iconify-icon></a>. If you have thoughts on what makes a test suite truly healthy, please <a href="../../contact/">contact</a> me. To stay updated on the latest developments in software testing research, consider <a href="../../support/">subscribing</a> to my mailing list.</p>
</div>
</div>
<p><i class="fa-solid fa-circle-left" aria-label="circle-left"></i> <a href="../../blog/">Return to Blog Post Listing</a></p>



</section>

<div id="quarto-appendix" class="default"><section class="quarto-appendix-contents" id="quarto-bibliography"><h2 class="anchored quarto-appendix-heading">References</h2><div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-McMinn2025" class="csl-entry">
McMinn, Phil, Muhammad Firhard Roslan, and Gregory M. Kapfhammer. 2025. <span>“Beyond Test Flakiness: A Manifesto for a Holistic Approach to Test Suite Health.”</span> In <em>Proceedings of the 2nd International Flaky Tests Workshop</em>.
</div>
</div></section></div> ]]></description>
  <category>post</category>
  <category>research paper</category>
  <category>software testing</category>
  <guid>https://www.gregorykapfhammer.com/blog/holistic-test-suite-health/</guid>
  <pubDate>Wed, 01 Jan 2025 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Using eXtreme mutation testing to discover hidden test suite weaknesses</title>
  <dc:creator>Gregory M. Kapfhammer</dc:creator>
  <link>https://www.gregorykapfhammer.com/blog/pseudosweep-extreme-mutation-testing/</link>
  <description><![CDATA[ 





<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>Ever wondered if your test suite is truly good at finding bugs? What if there are hidden weaknesses that traditional testing methods miss? In the paper <span class="citation" data-cites="Maton2024">(Maton, Kapfhammer, and McMinn 2024a)</span> <a href="../../research/papers/maton2024/index.html"><iconify-icon inline="" icon="fa6-solid:book-open"></iconify-icon></a>, my colleagues and I explore how eXtreme mutation testing (XMT) can uncover these hidden weaknesses in your test suite. By identifying pseudo-tested methods — or those methods in your program that appear to be tested even though they are not — XMT can help you improve your test suite’s effectiveness and ensure more robust software. Let’s dive into how these XMT works and why it may be a game-changer for software testing!</p>
</section>
<section id="understanding-xmt" class="level2">
<h2 class="anchored" data-anchor-id="understanding-xmt">Understanding XMT</h2>
<p>An XMT tool automatically detects deficiencies in a test suite by deleting method bodies in covered code and observing whether the test suite detects their absence. If a method deletion goes unnoticed, then the method is labeled as “pseudo-tested,” meaning that the test suite calls the method but its result isn’t checked by the assertions, indicating a potential blind spot in the test suite. As an extension to XMT, our paper explores the use of the statement deletion mutation operator (SDL) to uncover pseudo-tested statements within methods.</p>
</section>
<section id="research-insights" class="level2">
<h2 class="anchored" data-anchor-id="research-insights">Research Insights</h2>
<p>Using the <code>PseudoSweep</code> tool <span class="citation" data-cites="Maton2024a">(Maton, Kapfhammer, and McMinn 2024b)</span> <a href="../../research/papers/maton2024a/index.html"><iconify-icon inline="" icon="fa6-solid:book-open"></iconify-icon></a> to perform mutation testing with the XMT and SDL operators on four Apache Commons projects and 23 projects randomly selected from the Maven Central Repository, this paper’s experiments find 722 different cases of pseudo-tested statements. Interestingly, the results show that 48% of pseudo-tested statements exist outside of pseudo-tested methods! This suggests that XMT alone is insufficient and should be combined with pseudo-tested statement evaluation to find testing oversights that a developer should tackle before using standard mutation testing.</p>
</section>
<section id="future-directions" class="level2">
<h2 class="anchored" data-anchor-id="future-directions">Future Directions</h2>
<p>While our research focused on Java programs, the concepts of XMT and pseudo-tested methods are broadly applicable. These techniques can be used in various programming languages to improve test suite effectiveness and ensure more robust software. We’re excited about the potential of combining XMT with other testing techniques to further enhance test suite robustness. Future work will involve extending our approach to different programming languages and exploring additional ways to detect and repair pseudo-tested methods.</p>
<div class="callout callout-style-simple callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Further Details
</div>
</div>
<div class="callout-body-container callout-body">
<p>As we continue to explore how mutation testing can support the detection and enhanced assessment of pseudo-tested methods, your insights and suggestions are appreciated! If you have ideas or experiences related to assessing the quality of a test suite or finding testing blind spots, please <a href="../../contact/">contact</a> me. Or, if you want to stay informed about new developments and blog posts related to mutation testing and other software testing topics, you can <a href="../../support/">subscribe</a> to my mailing list.</p>
</div>
</div>
<p><i class="fa-solid fa-circle-left" aria-label="circle-left"></i> <a href="../../blog/">Return to Blog Post Listing</a></p>



</section>

<div id="quarto-appendix" class="default"><section class="quarto-appendix-contents" id="quarto-bibliography"><h2 class="anchored quarto-appendix-heading">References</h2><div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Maton2024" class="csl-entry">
Maton, Megan, Gregory M. Kapfhammer, and Phil McMinn. 2024a. <span>“Exploring Pseudo-Testedness: Empirically Evaluating Extreme Mutation Testing at the Statement Level.”</span> In <em>Proceedings of the 35th International Conference on Software Maintenance and Evolution</em>.
</div>
<div id="ref-Maton2024a" class="csl-entry">
———. 2024b. <span>“PseudoSweep: A Pseudo-Tested Code Identifier.”</span> In <em>Proceedings of the 35th International Conference on Software Maintenance and Evolution – Tool Demonstrations Track</em>.
</div>
</div></section></div> ]]></description>
  <category>post</category>
  <category>mutation testing</category>
  <category>developer productivity</category>
  <guid>https://www.gregorykapfhammer.com/blog/pseudosweep-extreme-mutation-testing/</guid>
  <pubDate>Tue, 01 Oct 2024 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Insights from my Software Engineering Radio interview with Itamar Friedman</title>
  <dc:creator>Gregory M. Kapfhammer</dc:creator>
  <link>https://www.gregorykapfhammer.com/blog/se-radio-itamar-friedman-automated-testing/</link>
  <description><![CDATA[ 





<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>In a recent episode of the <a href="https://www.se-radio.net/">Software Engineering Radio</a> podcast, I interviewed <a href="https://www.linkedin.com/in/itamarf/">Itamar Friedman</a>, CEO and Co-founder of <a href="https://www.qodo.ai/">Qodo</a> (a company previously called CodiumAI). Our conversation focused on automated testing with generative artificial intelligence (AI), exploring how large language models (LLMs) can augment existing test suites and increase code coverage. Itamar and I discussed the design, implementation, and use of <a href="https://github.com/qodo-ai/qodo-cover/tree/main">Qodo-Cover</a> (previously called Cover-Agent), an open-source tool that uses LLMs to automatically enhance a provided test suite.</p>
</section>
<section id="insights" class="level2">
<h2 class="anchored" data-anchor-id="insights">Insights</h2>
<p>I’m thankful that Itamar took the time for this interview! Here are some key insights from it:</p>
<p><strong>What testing tasks does Qodo-Cover automatically perform?</strong></p>
<blockquote class="blockquote">
<p>“Qodo-Cover can try to generate all types of testing, but the sweet spot that we saw is mostly around component testing. If you provide an initial few tests that cover one or more components and you run Qodo-Cover, it’ll try to generate many more. It takes the first few tests that were given as part of the test suite and exploits these to inspire it to generate more.”</p>
</blockquote>
<p><strong>Why is code coverage still a valuable metric despite its limitations?</strong></p>
<blockquote class="blockquote">
<p>“Many would say that code coverage is a proxy metric. I think almost 100% people would say that. But I think that also some percentage of developers and managers would say that code coverage is actually a vanity metric. Practically what we’re trying to say is that did we check that the code work exactly as expected? Okay and now how do you check that?”</p>
</blockquote>
<p><strong>What is a flaky test case? How does Qodo-Cover handle flaky test cases?</strong></p>
<blockquote class="blockquote">
<p>“If you have a test and you’re running it five times and it doesn’t give you the same result each time, especially if sometimes it’s passed, sometimes it fails, that’s the most obvious flakiness, then it’s flaky. It means how can you trust that test if it passed four times the same test, you know, just run it five times and pass four times and fail one that’s a flaky test. LLMs, you can try to prompt it not to generate the flaky test. I think the prompting to start with will try to do that and because there are tests smells that can be smelled for example if there is an obvious API call an obvious one.”</p>
</blockquote>
<p><strong>What advice do you have for developers adopting AI-powered development tools?</strong></p>
<blockquote class="blockquote">
<p>“About dev tools, I think developers love writing code, they love building and now they can, you know, use code completion to do even a bit more, probably save time and go drink more coffee. I don’t think it’s really helpful for generating more features. But actually let’s think about the real bottlenecks. I don’t think it’s writing more lines of code. It’s about code quality, it’s about code reviewing, it’s about testing, etc. So I think that when you want to start integrating, you know, different AI dev tools to improve your productivity, think what are your ‘today bottlenecks’ and what are your ‘today problems’?”</p>
</blockquote>
</section>
<section id="listen" class="level2">
<h2 class="anchored" data-anchor-id="listen">Listen</h2>
<p>If you’re interested in learning more about automated testing with generative AI and how tools like Qodo-Cover can enhance your development workflow, I highly recommend listening to <a href="https://se-radio.net/2024/09/se-radio-633-itamar-friedman-on-automated-testing-with-generative-ai/">Itamar Friedman on Automated Testing with Generative AI</a> from <a href="https://se-radio.net/">Software Engineering Radio</a>! You can find it on your favorite podcast player, <a href="https://podcasts.apple.com/us/podcast/software-engineering-radio-the-podcast-for/id120906714">Apple Podcasts</a>, <a href="https://open.spotify.com/show/6UO3XQclSuNnGxB39QdAnL">Spotify</a>, <a href="https://www.youtube.com/playlist?list=PLHJB2bhmgB7esz0BxMCt1jJwsoaqWtFff">YouTube</a>, or you can listen to it with this handy podcast player.</p>
<figure class="figure"><audio controls="" src="https://traffic.libsyn.com/secure/forcedn/seradio/633-itamar-friedman-testing-generative-ai.mp3" type="audio/mp3">Your browser does not support the audio tag.</audio><figcaption>Listen to Software Engineering Radio Episode 633</figcaption></figure>
<p><i class="fa-solid fa-circle-left" aria-label="circle-left"></i> <a href="../../blog/">Return to Blog Post Listing</a></p>


</section>

 ]]></description>
  <category>post</category>
  <category>software development</category>
  <category>software engineering radio</category>
  <guid>https://www.gregorykapfhammer.com/blog/se-radio-itamar-friedman-automated-testing/</guid>
  <pubDate>Wed, 11 Sep 2024 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Insights from my Software Engineering Radio interview with Goran Petrovic</title>
  <dc:creator>Gregory M. Kapfhammer</dc:creator>
  <link>https://www.gregorykapfhammer.com/blog/se-radio-goran-petrovic-mutation-testing/</link>
  <description><![CDATA[ 





<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>In a recent episode of the <a href="https://www.se-radio.net/">Software Engineering Radio</a> podcast, I interviewed <a href="https://www.linkedin.com/in/goran-petrovi%C4%87-1a94641ba/">Goran Petrovic</a>, a senior staff software engineer at Google. Our conversation focused on mutation testing at Google, a practice that assesses the efficacy of a test suite by inserting small faults into programs and measuring the test suite’s ability to detect them. In this interview Goran offers insights into mutation testing and how it fits into broader software engineering practices.</p>
</section>
<section id="insights" class="level2">
<h2 class="anchored" data-anchor-id="insights">Insights</h2>
<p>I’m thankful that Goran took the time for this interview! Here are some key insights from it:</p>
<p><strong>What is mutation testing and how does it work?</strong></p>
<blockquote class="blockquote">
<p>“Mutation testing is just a step further in this to ensure that the code is not only covered with tests, but actually properly tested in terms of assertions. You could imagine that you can have a function that you call from a test and don’t assert anything. It can have 100% coverage, but it will never catch any real bugs. And mutation testing comes to help in terms of validating that these tests do something useful.”</p>
</blockquote>
<p><strong>Why was it initially hard to convince engineers at Google to use mutation testing?</strong></p>
<blockquote class="blockquote">
<p>“Mutation testing generates a huge amount of mutants and then shoves them down your throat. And when I started implementing this, what I did is I read a bunch of research papers. I was really excited. I started coding and in a few weeks I had something that worked originally for C++. And then I started generating these mutants. […] And my first run, I remember it took a few hours to run. I ran it on my on a small code base of my team. […] And when I when it finished, I looked at the file and could barely open it in Vim. It was huge! There were thousands, tens of thousands of mutants. And after three pages and two coffees, I was so tired that I just closed the file and forgot about it for a few weeks because there was a huge amount of mutants. And most of them were not things that I would actually be adding tests for!”</p>
</blockquote>
<p><strong>How did you know that it was the right time to introduce mutation testing at Google?</strong></p>
<blockquote class="blockquote">
<p>“I joined the team in Google Shopping. And as it used to be the case, everyone had a 20% project. And my manager said, oh, we started this mutation testing last hackathon. Maybe you can inherit it. And I’m like, oh, I have no idea what this is. I’ve never heard of this, but I will inherit it because I don’t really have a choice. So I started reading those papers and eventually rewrote all of their code because it was a hackathon project one week of like just try to get a proof of concept working. And then that it became my project over time!”</p>
</blockquote>
</section>
<section id="listen" class="level2">
<h2 class="anchored" data-anchor-id="listen">Listen</h2>
<p>If you’re interested in learning more about mutation testing and software engineering practices at Google, I highly recommend listening to <a href="https://se-radio.net/2024/09/se-radio-632-goran-petrovic-on-mutation-testing-at-google/">Goran Petrovic on Mutation Testing at Google</a> from <a href="https://se-radio.net/">Software Engineering Radio</a>! You can find it on your favorite podcast player, <a href="https://podcasts.apple.com/us/podcast/software-engineering-radio-the-podcast-for/id120906714">Apple Podcasts</a>, <a href="https://open.spotify.com/show/6UO3XQclSuNnGxB39QdAnL">Spotify</a>, <a href="https://www.youtube.com/playlist?list=PLHJB2bhmgB7esz0BxMCt1jJwsoaqWtFff">YouTube</a>, or you can listen to it with this handy podcast player.</p>
<figure class="figure"><audio controls="" src="https://traffic.libsyn.com/secure/forcedn/seradio/632-goran-petrovic-mutation-testing-at-google.mp3" type="audio/mp3">Your browser does not support the audio tag.</audio><figcaption>Listen to Software Engineering Radio Episode 632</figcaption></figure>
<p><i class="fa-solid fa-circle-left" aria-label="circle-left"></i> <a href="../../blog/">Return to Blog Post Listing</a></p>


</section>

 ]]></description>
  <category>post</category>
  <category>mutation testing</category>
  <category>software engineering radio</category>
  <guid>https://www.gregorykapfhammer.com/blog/se-radio-goran-petrovic-mutation-testing/</guid>
  <pubDate>Wed, 04 Sep 2024 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Insights from my Software Engineering Radio interview with Jonathan Schneider</title>
  <dc:creator>Gregory M. Kapfhammer</dc:creator>
  <link>https://www.gregorykapfhammer.com/blog/se-radio-jonathan-schneider-openrewrite/</link>
  <description><![CDATA[ 





<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>In a recent episode of the <a href="https://www.se-radio.net/">Software Engineering Radio</a> podcast, I had the opportunity to interview <a href="https://www.linkedin.com/in/jonkschneider/">Jonathan Schneider</a>, a co-founder of <a href="https://www.moderne.ai/">Moderne</a> and the creator of <a href="https://docs.openrewrite.org/">OpenRewrite</a>. Our conversation focused on the unique features of OpenRewrite, an automated refactoring tool for software modernization. I’m thankful that Jonathan took the time to participate in this energizing discussion about automated refactoring with OpenRewrite!</p>
</section>
<section id="insights" class="level2">
<h2 class="anchored" data-anchor-id="insights">Insights</h2>
<p>I learned a lot from Jonathan during this interview. Here are some of his key insights:</p>
<p><strong>What is automated refactoring and what are its benefits?</strong></p>
<blockquote class="blockquote">
<p>“Automated refactoring is writing software that rewrites other software. Its main benefits are to achieve some modernization in that software, to fix security vulnerabilities, and to ensure a consistent style or fix inconsistencies in codebases.”</p>
</blockquote>
<p><strong>How does OpenRewrite ensure the correctness of automated refactoring?</strong></p>
<blockquote class="blockquote">
<p>“The correctness really stems from some of the characteristics of that data that we mentioned earlier. It’s when a recipe is able to use the type attribution information that the compiler knows that this info method comes from a particular type that we’re able to make that change. So type attribution is one of the essential elements of correctness in a recipe.”</p>
</blockquote>
<p><strong>How does OpenRewrite handle the challenge of code quality issues?</strong></p>
<blockquote class="blockquote">
<p>“We’ve been taking those recommendations and then matching them to the recipe catalog, those 2,200 recipes that exist, pre-running them, and when they make change, then we have a signal that there is something to do on the codebase at large.”</p>
</blockquote>
</section>
<section id="listen" class="level2">
<h2 class="anchored" data-anchor-id="listen">Listen</h2>
<p>In conclusion, if you’re interested in learning more about automated refactoring with OpenRewrite, I highly recommend that you listen to <a href="https://se-radio.net/2024/07/se-radio-625-jonathan-schneider-on-automated-refactoring-with-openrewrite/">Jonathan Schneider on Automated Refactoring with OpenRewrite</a> from <a href="https://se-radio.net/">Software Engineering Radio</a>! You can find it on your favorite podcast player, <a href="https://podcasts.apple.com/us/podcast/software-engineering-radio-the-podcast-for/id120906714">Apple Podcasts</a>, <a href="https://open.spotify.com/show/6UO3XQclSuNnGxB39QdAnL">Spotify</a>, <a href="https://www.youtube.com/playlist?list=PLHJB2bhmgB7esz0BxMCt1jJwsoaqWtFff">YouTube</a>, or listen to it with this handy podcast player.</p>
<figure class="figure"><audio controls="" src="https://traffic.libsyn.com/secure/forcedn/seradio/625-jonathan-schneider-automated-refactoring.mp3" type="audio/mp3">Your browser does not support the audio tag.</audio><figcaption>Listen to Software Engineering Radio Episode 625</figcaption></figure>
<p><i class="fa-solid fa-circle-left" aria-label="circle-left"></i> <a href="../../blog/">Return to Blog Post Listing</a></p>


</section>

 ]]></description>
  <category>post</category>
  <category>regression testing</category>
  <category>software engineering radio</category>
  <guid>https://www.gregorykapfhammer.com/blog/se-radio-jonathan-schneider-openrewrite/</guid>
  <pubDate>Mon, 01 Apr 2024 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Insights from my Software Engineering Radio interview with Marcelo Trylesinski</title>
  <dc:creator>Gregory M. Kapfhammer</dc:creator>
  <link>https://www.gregorykapfhammer.com/blog/se-radio-marcelo-trylesinski-fastapi/</link>
  <description><![CDATA[ 





<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>In a recent episode of the <a href="https://www.se-radio.net/">Software Engineering Radio</a> podcast, I interviewed <a href="https://fastapiexpert.com/">Marcelo Trylesinski</a>, a senior software engineer at <a href="https://docs.pydantic.dev/latest/">Pydantic</a> and a maintainer of open-source Python tools including <a href="https://www.starlette.io/">Starlette</a> and <a href="https://www.uvicorn.org/">Uvicorn</a>. Our conversation focused on the unique features of <a href="https://fastapi.tiangolo.com/">FastAPI</a>, a modern and high-performance web framework for building APIs with Python 3.6+ based on standard Python type hints. I’m thankful that Marcelo talked with me about the design, implementation, and use of FastAPI — it was a fun and fast-paced conversation!</p>
</section>
<section id="insights" class="level2">
<h2 class="anchored" data-anchor-id="insights">Insights</h2>
<p>These three questions overview my discussion with Marcelo about FastAPI:</p>
<p><strong>What is FastAPI and why is it important?</strong></p>
<blockquote class="blockquote">
<p>“FastAPI, it’s a framework that’s used to build APIs in Python. It leverages type hints and it’s very fun to develop with.”</p>
</blockquote>
<p><strong>How does FastAPI ensure high performance and developer productivity?</strong></p>
<blockquote class="blockquote">
<p>“So for me I always saw, I mean even if I’m the maintainer of Uvicorn, the server that makes is one of the reasons that FastAPI to be fast on my perspective, the fast is more about the user perspective. Because in any case you’re still working with Python and there are certain limitations but the idea is that since you’re leveraging the async world, you don’t need to use the threads. So you can have more tasks running in a single thread and then you have more capacity to run more tasks and that means that you can receive and process more requests and that makes the server faster I would say.”</p>
</blockquote>
<p><strong>How does FastAPI handle authentication and authorization?</strong></p>
<blockquote class="blockquote">
<p>“So FastAPI does not handle that for you. So you need to implement the layer yourself. What it does is you can define a way for how to interpret some data that comes from the request. So for example, you have HTTP basic class, which it’s used for FastAPI to get the authorization header and then get the username and the password and it provides that to your endpoint. So you have, you use that class just to kind of parse that data for you, but it does not handle that for you.”</p>
</blockquote>
</section>
<section id="listen" class="level2">
<h2 class="anchored" data-anchor-id="listen">Listen</h2>
<p>In conclusion, if you’re interested in learning more about the design and implementation of FastAPI or approaches to building APIs in Python, I highly recommend that you listen to <a href="https://se-radio.net/2024/07/se-radio-624-marcelo-trylesinski-on-fastapi/">Marcelo Trylesinski on FastAPI</a> from <a href="https://se-radio.net/">Software Engineering Radio</a>! You can find it on your favorite podcast player, <a href="https://podcasts.apple.com/us/podcast/software-engineering-radio-the-podcast-for/id120906714">Apple Podcasts</a>, <a href="https://open.spotify.com/show/6UO3XQclSuNnGxB39QdAnL">Spotify</a>, <a href="https://www.youtube.com/playlist?list=PLHJB2bhmgB7esz0BxMCt1jJwsoaqWtFff">YouTube</a>, or listen to it with this handy podcast player.</p>
<figure class="figure"><audio controls="" src="https://traffic.libsyn.com/secure/forcedn/seradio/624-marcelo_trylesinski_on_fastAPI.mp3" type="audio/mp3">Your browser does not support the audio tag.</audio><figcaption>Listen to Software Engineering Radio Episode 624</figcaption></figure>
<p><i class="fa-solid fa-circle-left" aria-label="circle-left"></i> <a href="../../blog/">Return to Blog Post Listing</a></p>


</section>

 ]]></description>
  <category>post</category>
  <category>developer development</category>
  <category>software engineering radio</category>
  <guid>https://www.gregorykapfhammer.com/blog/se-radio-marcelo-trylesinski-fastapi/</guid>
  <pubDate>Fri, 01 Mar 2024 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Insights from my Software Engineering Radio interview with Wolf Wollprecht</title>
  <dc:creator>Gregory M. Kapfhammer</dc:creator>
  <link>https://www.gregorykapfhammer.com/blog/se-radio-wolf-vollprecht-python-tooling-rust/</link>
  <description><![CDATA[ 





<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>As a co-host of the <a href="https://www.se-radio.net/">Software Engineering Radio</a> podcast, I interviewed <a href="https://wolfv.github.io/">Wolf Vollprecht</a>, the founder and CEO of <a href="https://prefix.dev/">Prefix</a>, to discuss the creation of <a href="https://pixi.sh/latest/">Pixi</a>, a Rust-based workflow manager for Python. During our conversation, Wolf shared some fascinating insights into both his development process and the unique features of Pixi. I’m thankful that Wolf took the time to participate in this thought-provoking discussion about Rust-based tooling for Python!</p>
</section>
<section id="insights" class="level2">
<h2 class="anchored" data-anchor-id="insights">Insights</h2>
<p>Here are three takeaways from my interview with Wolf Vollprecht:</p>
<p><strong>Why did Wolf choose the Rust programming language to build Pixi?</strong></p>
<blockquote class="blockquote">
<p>“It was not initially a completely obvious decision because I already had a lot of experience with C++ and Mamba and we could have stuck to the C++ ecosystem, but in hindsight I’m very happy that we chose Rust. It comes with this rich ecosystem; it helped us to use the same sort of underlying code in our website as well and our platform and we want to capitalize on that in the future much more by building awesome services.”</p>
</blockquote>
<p><strong>How does Pixi ensure reproducibility in Python projects?</strong></p>
<blockquote class="blockquote">
<p>“Reproducibility in the scientific world is also a big problem. And with Pixi we want to make sure that the scientist that uses Pixi can get the same results now and then also get the same results in 10 years if you run the same data pipelines and things like this. And we make sure of that by creating a very tight lock file that locks down packages down to the SHA hash.”</p>
</blockquote>
<p><strong>How does Pixi handle the challenge of cross-platform compatibility?</strong></p>
<blockquote class="blockquote">
<p>“So the majority of work was already done because, well we are piggybacking on the Conda ecosystem and Conda Forge specifically as a really large repository of existing packages. And so a lot of the nice tools that we want to use, or our users might want to use are already available. But then there are some more intricate challenges because Windows and Unix are usually quite different.”</p>
</blockquote>
</section>
<section id="listen" class="level2">
<h2 class="anchored" data-anchor-id="listen">Listen</h2>
<p>In conclusion, if you’re interested in learning more about the challenges and benefits of implementing Python tooling in Rust, I highly recommend that you listen to <a href="https://se-radio.net/2024/06/se-radio-622-wolf-vollprecht-on-python-tooling-in-rust/">Wolf Vollprecht on Python Tooling in Rust</a> from <a href="https://se-radio.net/">Software Engineering Radio</a>! You can find it on your favorite podcast player, <a href="https://podcasts.apple.com/us/podcast/software-engineering-radio-the-podcast-for/id120906714">Apple Podcasts</a>, <a href="https://open.spotify.com/show/6UO3XQclSuNnGxB39QdAnL">Spotify</a>, <a href="https://www.youtube.com/playlist?list=PLHJB2bhmgB7esz0BxMCt1jJwsoaqWtFff">YouTube</a>, or listen to it with this handy podcast player.</p>
<figure class="figure"><audio controls="" src="https://traffic.libsyn.com/secure/forcedn/seradio/622-wolf_vollprecht_python_tooling_in_rust.mp3" type="audio/mp3">Your browser does not support the audio tag.</audio><figcaption>Listen to Software Engineering Radio Episode 622</figcaption></figure>
<p><i class="fa-solid fa-circle-left" aria-label="circle-left"></i> <a href="../../blog/">Return to Blog Post Listing</a></p>


</section>

 ]]></description>
  <category>post</category>
  <category>developer productivity</category>
  <category>software engineering radio</category>
  <guid>https://www.gregorykapfhammer.com/blog/se-radio-wolf-vollprecht-python-tooling-rust/</guid>
  <pubDate>Thu, 01 Feb 2024 00:00:00 GMT</pubDate>
</item>
<item>
  <title>CANNIER gives software developers a best-of-both-worlds approach to flaky test detection</title>
  <dc:creator>Gregory M. Kapfhammer</dc:creator>
  <link>https://www.gregorykapfhammer.com/blog/cannier-flaky-test-detection/</link>
  <description><![CDATA[ 





<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>Have you ever been stuck between the proverbial “rock and a hard place” when it comes to flaky test detection? On the one hand, you can repeatedly rerun your tests, which is accurate but can take an enormous amount of time and computational resources. On the other hand, you can use a machine learning model to predict flaky tests, which is fast but often not accurate enough to be reliable. This trade-off between prediction accuracy and speed has been a long-standing challenge for software developers who tackle flaky tests.</p>
<p>In a recent paper, my co-authors and I introduced CANNIER, an approach that offers a “best-of-both-worlds” solution to the problem of flaky test detection. Our paper, “Empirically Evaluating Flaky Test Detection Techniques Combining Test Case Rerunning and Machine Learning Models” <span class="citation" data-cites="Parry2023">(Parry et al. 2023)</span> <a href="../../research/papers/parry2023/index.html"><iconify-icon inline="" icon="fa6-solid:book-open"></iconify-icon></a>, presents a way to combine the strengths of both test rerunning and machine learning to create a flaky test detection technique that is both fast and accurate. Read this post to learn more about CANNIER!</p>
</section>
<section id="key-contributions" class="level2">
<h2 class="anchored" data-anchor-id="key-contributions">Key Contributions</h2>
<p>Our paper makes the following key contributions to the field of flaky test detection:</p>
<ul>
<li><p><strong>CANNIER Approach</strong>: A novel technique that uses machine learning models as a heuristic to significantly reduce the problem space for rerunning-based flaky test detection. For many projects, CANNIER leads to a dramatic reduction in the time cost of detection with only a minimal decrease in performance.</p></li>
<li><p><strong>Extensive Tooling</strong>: The lead author developed and released a comprehensive framework of automated tools to facilitate the replication of our results and to empower other researchers to build upon our work in hybrid flaky test detection.</p></li>
<li><p><strong>Comprehensive Empirical Evaluation</strong>: A study involving nearly 90,000 test cases from 30 Python projects that not only demonstrates the effectiveness of CANNIER but also reveals new insights into machine learning-based flaky test detection.</p></li>
<li><p><strong>Public Dataset</strong>: We have made our entire dataset publicly available to foster further research and innovation in the flaky test detection community.</p></li>
</ul>
</section>
<section id="empirical-results" class="level2">
<h2 class="anchored" data-anchor-id="empirical-results">Empirical Results</h2>
<p>Our empirical evaluation shows that, while only slightly dropping accuracy, CANNIER can decrease the time cost of rerunning-based flaky test detection techniques by an average of 88% across three different techniques. For instance, when applying CANNIER to the rerunning technique, we were able to reduce the time cost by 89% while maintaining a high Matthews correlation coefficient (MCC) of 0.92 for the correlation between the technique’s flakiness predictions and the actual flakiness labels. This result demonstrates that CANNIER is a practical and effective solution for developers struggling with the high cost of flaky test detection. Please read the paper for its many other empirical findings!</p>
</section>
<section id="future-work" class="level2">
<h2 class="anchored" data-anchor-id="future-work">Future Work</h2>
<p>The findings in this paper open up several avenues for future research. For instance, we plan to further investigate the features associated with test flakiness, potentially using causal inference techniques to gain a deeper understanding of the root causes of flakiness. We also intend to evaluate the performance of CANNIER on more specific categories of flaky tests. Since this paper’s experiments were done on open-source Python projects, we are also interested in applying CANNIER to both commercial software projects and programs and test suites written in other programming languages like Java.</p>
<div class="callout callout-style-simple callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Further Details
</div>
</div>
<div class="callout-body-container callout-body">
<p>If you are interested in learning more about CANNIER and our research on flaky test detection, I have encourage you to read the full paper <span class="citation" data-cites="Parry2023">(Parry et al. 2023)</span> <a href="../../research/papers/parry2023/index.html"><iconify-icon inline="" icon="fa6-solid:book-open"></iconify-icon></a>. I welcome any feedback or questions you may have. Please feel free to <a href="../../contact/">contact</a> me. To stay up-to-date on my latest research, please consider <a href="../../support/">subscribing</a> to my mailing list.</p>
</div>
</div>
<p><i class="fa-solid fa-circle-left" aria-label="circle-left"></i> <a href="../../blog/">Return to Blog Post Listing</a></p>



</section>

<div id="quarto-appendix" class="default"><section class="quarto-appendix-contents" id="quarto-bibliography"><h2 class="anchored quarto-appendix-heading">References</h2><div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Parry2023" class="csl-entry">
Parry, Owain, Gregory M. Kapfhammer, Michael Hilton, and Phil McMinn. 2023. <span>“Empirically Evaluating Flaky Test Detection Techniques Combining Test Case Rerunning and Machine Learning Models.”</span> <em>Empirical Software Engineering Journal</em> 28 (72).
</div>
</div></section></div> ]]></description>
  <category>post</category>
  <category>research paper</category>
  <category>flaky tests</category>
  <guid>https://www.gregorykapfhammer.com/blog/cannier-flaky-test-detection/</guid>
  <pubDate>Mon, 15 Jan 2024 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Insights from my Software Engineering Radio interview with Hyrum Wright</title>
  <dc:creator>Gregory M. Kapfhammer</dc:creator>
  <link>https://www.gregorykapfhammer.com/blog/se-radio-hyrum-wright-google/</link>
  <description><![CDATA[ 





<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>In a recent episode of the <a href="https://www.se-radio.net/">Software Engineering Radio</a> podcast, I had the pleasure of interviewing <a href="https://www.hyrumwright.org/">Hyrum Wright</a>, a senior staff software engineer at Google and one of the editors of the book <a href="https://abseil.io/resources/swe-book">Software Engineering at Google</a>. During our conversation, we discussed various aspects of software engineering practices at Google, including testing, static analysis, large-scale code changes, and the importance of time, scale, and trade-offs.</p>
</section>
<section id="insights" class="level2">
<h2 class="anchored" data-anchor-id="insights">Insights</h2>
<p>I’m thankful that Hyrum took the time for this interview! Here are some key insights from it:</p>
<p><strong>How does a project’s lifespan influence engineering decisions?</strong></p>
<blockquote class="blockquote">
<p>“As you write software, think about how long does this software have to last? Am I just going to throw this away tomorrow? Is it a bash script that’s going to exist on my command line, or is this something I need to have for the next 10 years? At Google, we actually think a lot about whether or not this is software that’s going to last for a long time.”</p>
</blockquote>
<p><strong>What role do constraints play in software engineering?</strong></p>
<blockquote class="blockquote">
<p>“Picking appropriate constraints as an organization scale is actually a really powerful way of enabling that kind of scalability. We kind of knew that going in, but it’s amazing to me how that came out in the book, whether it’s, again, large-scale changes or build systems or testing infrastructure or style guides. All those things benefit from having appropriate sets of constraints.”</p>
</blockquote>
<p><strong>What role do automated changes play in software engineering?</strong></p>
<blockquote class="blockquote">
<p>“Early on when we were doing a lot of these automated changes, people would push back, how do I know that this change is correct? Do I trust you? There’s a strong culture of stewardship within Google’s code base. Everyone can read all the source code, but specific individuals and teams are responsible for maintaining specific parts of the code base.”</p>
</blockquote>
</section>
<section id="listen" class="level2">
<h2 class="anchored" data-anchor-id="listen">Listen</h2>
<p>In conclusion, if you’re interested in learning more about software engineering practices at Google — including testing, static analysis, large-scale code changes, and the importance of time, scale, and trade-offs — I highly recommend listening to <a href="https://se-radio.net/2024/03/se-radio-609-hyrum-wright-on-software-engineering-at-google/">Hyrum Wright on Software Engineering at Google</a> from <a href="https://se-radio.net/">Software Engineering Radio</a>! You can find it on your favorite podcast player, <a href="https://podcasts.apple.com/us/podcast/software-engineering-radio-the-podcast-for/id120906714">Apple Podcasts</a>, <a href="https://open.spotify.com/show/6UO3XQclSuNnGxB39QdAnL">Spotify</a>, <a href="https://www.youtube.com/playlist?list=PLHJB2bhmgB7esz0BxMCt1jJwsoaqWtFff">YouTube</a>, or you can listen to it with this handy podcast player.</p>
<figure class="figure"><audio controls="" src="https://traffic.libsyn.com/secure/forcedn/seradio/609_hyrum_wright_software_engineering_at_google.mp3" type="audio/mp3">Your browser does not support the audio tag.</audio><figcaption>Listen to Software Engineering Radio Episode 609</figcaption></figure>
<p><i class="fa-solid fa-circle-left" aria-label="circle-left"></i> <a href="../../blog/">Return to Blog Post Listing</a></p>


</section>

 ]]></description>
  <category>post</category>
  <category>developer productivity</category>
  <category>software engineering radio</category>
  <guid>https://www.gregorykapfhammer.com/blog/se-radio-hyrum-wright-google/</guid>
  <pubDate>Mon, 01 Jan 2024 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Insights from my Software Engineering Radio interview with Zac Hatfield-Dodds</title>
  <dc:creator>Gregory M. Kapfhammer</dc:creator>
  <link>https://www.gregorykapfhammer.com/blog/se-radio-zach-hatfield-dodds-property-based-testing/</link>
  <description><![CDATA[ 





<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>In a recent episode of the <a href="https://www.se-radio.net/">Software Engineering Radio</a> podcast, I had the pleasure of interviewing <a href="https://zhd.dev/">Zac Hatfield-Dodds</a>, a leading researcher, software engineer, and maintainer of open-source software. Zac currently leads the assurance team at <a href="https://www.anthropic.com/">Anthropic</a>, an artificial intelligence (AI) safety and research company. He is also known for his contributions to open source projects like <code>Hypothesis</code>, <code>Pytest</code>, and <code>HypoFuzz</code>. We discussed property-based testing and how it can be effectively implemented using <code>Hypothesis</code>, an advanced testing library for Python. I’m really thankful that Zac took the time to share his knowledge with me!</p>
</section>
<section id="insights" class="level2">
<h2 class="anchored" data-anchor-id="insights">Insights</h2>
<p>I learned a lot from Zac during this interview. Here are some of his key insights:</p>
<p><strong>What is property-based testing and how does it work with the Hypothesis tool?</strong></p>
<blockquote class="blockquote">
<p>“Property-based testing gives us a different attitude to what we check and a much richer set of tooling to help computers generate those inputs for us. … So when I think about writing software tests and the kind of unit test style, maybe they’re testing small units, maybe they’re testing whole programs. There are basically two problems that you have to solve in order to have a software test. The first is that you need to work out what kind of input data you run, and the second is that you need to check in some way that your code didn’t do the wrong thing.”</p>
</blockquote>
<p><strong>What challenges or limitations may developers face when using Hypothesis?</strong></p>
<blockquote class="blockquote">
<p>“The first thing I do wanna say before I get into the downsides is that I think almost every good test suite will involve some or maybe many example based tests. … The problem with basing your entire test suite on example based tests is just that it takes a long time and it gets really tedious to write them. … And so I think most of the downsides are a combination of requiring a lot of manual effort to define a rigorous test suite like this. And also that it’s really easy to miss the edge cases that you didn’t think of.”</p>
</blockquote>
<p><strong>How does Hypothesis work and how can developers effectively use it?</strong></p>
<blockquote class="blockquote">
<p>“What you do with Hypothesis is you write a test function which should work for any valid input and then you describe to Hypothesis what kind of inputs are valid. … And then Hypothesis can try to generate many valid inputs according to that specification you gave it looking for one which makes your test fail.”</p>
</blockquote>
</section>
<section id="listen" class="level2">
<h2 class="anchored" data-anchor-id="listen">Listen</h2>
<p>In conclusion, if you want to explore property-based testing for Python programs and the <code>Hypothesis</code> tool, I strongly suggest that you listen to <a href="https://se-radio.net/2023/11/se-radio-589-zac-hatfield-dodds-on-property-based-testing-in-python/">Zac Hatfield-Dodds on Property-Based Testing</a> from <a href="https://se-radio.net/">Software Engineering Radio</a>! You can find it on your favorite podcast player, <a href="https://podcasts.apple.com/us/podcast/software-engineering-radio-the-podcast-for/id120906714">Apple Podcasts</a>, <a href="https://open.spotify.com/show/6UO3XQclSuNnGxB39QdAnL">Spotify</a>, <a href="https://www.youtube.com/playlist?list=PLHJB2bhmgB7esz0BxMCt1jJwsoaqWtFff">YouTube</a>, or listen to it with this handy podcast player.</p>
<figure class="figure"><audio controls="" src="https://traffic.libsyn.com/secure/forcedn/seradio/589_Zac_Hatfield-Dodds_Property-Based_Testing_in_Python.mp3" type="audio/mp3">Your browser does not support the audio tag.</audio><figcaption>Listen to Software Engineering Radio Episode 589</figcaption></figure>
<p><i class="fa-solid fa-circle-left" aria-label="circle-left"></i> <a href="../../blog/">Return to Blog Post Listing</a></p>


</section>

 ]]></description>
  <category>post</category>
  <category>developer productivity</category>
  <category>software engineering radio</category>
  <guid>https://www.gregorykapfhammer.com/blog/se-radio-zach-hatfield-dodds-property-based-testing/</guid>
  <pubDate>Mon, 02 Jan 2023 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Insights from my Software Engineering Radio interview with Zach Lloyd</title>
  <dc:creator>Gregory M. Kapfhammer</dc:creator>
  <link>https://www.gregorykapfhammer.com/blog/se-radio-zach-lloyd-terminal-emulators/</link>
  <description><![CDATA[ 





<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>As a co-host of the <a href="https://www.se-radio.net/">Software Engineering Radio</a> podcast, I interviewed <a href="https://www.linkedin.com/in/zachlloyd/">Zach Lloyd</a>, the founder and CEO of <a href="https://www.warp.dev/">Warp</a>, to discuss the innovative features and the development process behind the Warp command-line terminal. During our discussion, Zach highlights the unique aspects of Warp, such as its use of artificial intelligence (AI) for command completion and error explanation, its GPU-accelerated text rendering for enhanced performance, and its “command block” feature for improved command organization and sharing. He also delves into the technical details of implementing Warp in the <a href="https://www.rust-lang.org/">Rust</a> programming language and using <a href="https://developer.apple.com/metal/">Metal</a> for macOS GPU API, and shares his vision for Warp’s future, including its expansion to other platforms and the web. I’m thankful that Zach took the time to participate in this discussion!</p>
</section>
<section id="insights" class="level2">
<h2 class="anchored" data-anchor-id="insights">Insights</h2>
<p>I learned a lot from Zach during this interview. Here are some of his responses to my questions:</p>
<p><strong>How is the Warp terminal different from other terminals?</strong></p>
<blockquote class="blockquote">
<p>“The big sort of product innovations that we’re trying to bring to the terminal is to make it work not just for individuals, but for teams. And so one of the features I talked about earlier, the ability to take a block, get a link to it and share it to people on your team is the start of that.”</p>
</blockquote>
<p><strong>Why does the Warp terminal use the GPU?</strong></p>
<blockquote class="blockquote">
<p>“The primary reason that we use the GPU is performance. When you’re a developer using the terminal, there’s a lot of reasons why you might want to use the terminal, but one of the things I think that’s absolutely essential is that the terminal performs really, really well.”</p>
</blockquote>
<p><strong>Why did Zach and his team choose Rust to build the Warp terminal?</strong></p>
<blockquote class="blockquote">
<p>“Rust is a great language. It’s … I think you typically call it a systems language. It compiles down to binary … It has great community support and it has great cross-platform support, which is another really key thing for us.”</p>
</blockquote>
</section>
<section id="listen" class="level2">
<h2 class="anchored" data-anchor-id="listen">Listen</h2>
<p>In conclusion, if you’re interested in learning more about the design and implementation of Warp or programming in Rust, I highly recommend that you listen to <a href="https://se-radio.net/2023/09/se-radio-581-zach-lloyd-on-terminal-emulators/">Zach Lloyd on Terminal Emulators</a> from <a href="https://se-radio.net/">Software Engineering Radio</a>! You can find it on your favorite podcast player, <a href="https://podcasts.apple.com/us/podcast/software-engineering-radio-the-podcast-for/id120906714">Apple Podcasts</a>, <a href="https://open.spotify.com/show/6UO3XQclSuNnGxB39QdAnL">Spotify</a>, <a href="https://www.youtube.com/playlist?list=PLHJB2bhmgB7esz0BxMCt1jJwsoaqWtFff">YouTube</a>, or listen to it with this handy podcast player.</p>
<figure class="figure"><audio controls="" src="https://traffic.libsyn.com/secure/forcedn/seradio/581_Zach_Lloyd_Terminal_Emulators.mp3" type="audio/mp3">Your browser does not support the audio tag.</audio><figcaption>Listen to Software Engineering Radio Episode 581</figcaption></figure>
<p><i class="fa-solid fa-circle-left" aria-label="circle-left"></i> <a href="../../blog/">Return to Blog Post Listing</a></p>


</section>

 ]]></description>
  <category>post</category>
  <category>developer productivity</category>
  <category>software engineering radio</category>
  <guid>https://www.gregorykapfhammer.com/blog/se-radio-zach-lloyd-terminal-emulators/</guid>
  <pubDate>Sun, 01 Jan 2023 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Programming is not software engineering</title>
  <dc:creator>Gregory M. Kapfhammer</dc:creator>
  <link>https://www.gregorykapfhammer.com/blog/programming-is-not-software-engineering/</link>
  <description><![CDATA[ 





<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>At Allegheny College, a class of students and I are embarking on a developer development adventure as we take a hands-on approach to learning software engineering. You can participate in our adventure by reading the collaboratively published content on the <a href="https://developerdevelopment.com/">Developer Development</a> web site and joining our <a href="https://discord.gg/aNfn8DNEMx">Developer Development Discord Server</a>. As part of the software engineering class the students and I are reading and then publishing an executive summary about selected articles from the following online books:</p>
<ul>
<li><a href="https://abseil.io/resources/swe-book">Software Engineering at Google</a> (abbreviated as <strong>SE</strong>): a compelling introduction to the processes and tools used by engineers at Google.</li>
<li><a href="https://www.fuzzingbook.org/">Fuzzing Book</a> (abbreviated as <strong>FB</strong>): a savvy, code-focused introduction to the automated tools and techniques for generating software tests.</li>
<li><a href="https://www.debuggingbook.org/">Debugging Book</a> (abbreviated as <strong>DB</strong>): an interactive introduction to automated methods for debugging and fixing programs.</li>
</ul>
</section>
<section id="ideas" class="level2">
<h2 class="anchored" data-anchor-id="ideas">Ideas</h2>
<p>The idea is that the <strong>SE</strong> book will help the students and I to learn the <em>professional knowledge and skills</em> that we need to develop as developers while the <strong>FB</strong> and <strong>DB</strong> books will equip us with the <em>technical knowledge and skills</em> necessary for us to both understand how software engineering tools are built and to build and apply our own software engineering tools.</p>
<p>In accordance with advice from well-known software engineers like <a href="https://addyosmani.com/">Addy Osmani</a>, who recently published a blog post entitled <a href="https://addyosmani.com/blog/write-learn/">“Write about what you learn. It pushes you to understand topics better.”</a>, the students and I will be writing a short précis about each of the articles in the <a href="https://developerdevelopment.com/schedule/">Developer Development schedule</a>. Today’s article, and the subject of the remainder of this post, is the <a href="https://abseil.io/resources/swe-book/html/pr01.html">preface</a> of <strong>SE</strong>! This précis is written from the perspective of an instructor who wants to effectively teach undergraduates how to engineer software.</p>
<p>The preface of <strong>SE</strong> makes it clear that <em>programming</em> is not the same as <em>software engineering</em> — even though software engineering certainly involves programming! The authors of <strong>SE</strong> make the compelling point that software is different than programming due to the following concerns:</p>
<ul>
<li><p><strong>Time and Change</strong>: while focused on solving problems with software, engineers must maintain software systems over long periods of time.</p></li>
<li><p><strong>Scale and Growth</strong>: all of the people within an organization who build and use software must adapt in both a daily and long-term fashion.</p></li>
<li><p><strong>Trade-offs and Costs</strong>: bearing in mind that software and people are always changing, and organization must make decisions informed by trade-offs.</p></li>
</ul>
<p>The <strong>SE</strong> book’s preface explains that it will introduce how the culture, processes, and tools at Google help the organization to effectively create and deploy global-scale software. I’m hoping that the students and I can learn lessons from the engineers and managers at Google so that we can develop as developers! With that said, I see that, as an instructor, I face challenges on the time, change, and scale fronts. How can I ensure that students develop as software developers during a sixteen-week course? What is your advice for software engineering education?</p>
</section>
<section id="plans" class="level2">
<h2 class="anchored" data-anchor-id="plans">Plans</h2>
<p>I plan to introduce a number of my strategies through blog posts that I will write until the course concludes at the end of December 2023. With that said, here is an insight into one aspect of my current plans, which are documented further on the <a href="https://developerdevelopment.com/">Developer Development</a> web site. You will notice that I’ve integrated team-work into every conceivable aspect of the course, ensuring that students learn how to engineer software in an organization. Together, the students and I will run class sessions, write and publish articles, give presentations, assign software engineering tasks, and implement, deploy, and maintain software. We will work in pairs, small teams, and large-ish teams! So, is it possible to effectively teach software engineering, as defined in the <strong>SE</strong> book? I’m not yet sure — let’s see! Please check the course site and follow my blog posts for more details!</p>
<div class="callout callout-style-simple callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Stay Connected
</div>
</div>
<div class="callout-body-container callout-body">
<p>Are you interested in following along with the experiences that the students and I have as we developer as developers in a software engineering course at Allegheny College? If you are, then I hope that you will check out our <a href="https://developerdevelopment.com/">Developer Development</a> web site that features our writing and offers status updates about our software engineering experiences and also join our <a href="https://discord.gg/aNfn8DNEMx">Developer Development Discord Server</a>. Finally, what do you think are the best ways to organize effective software engineering education? Please <a href="../../contact/index.html">contact</a> me with your tips!</p>
</div>
</div>
<p><i class="fa-solid fa-circle-left" aria-label="circle-left"></i> <a href="../../blog/">Return to Blog Post Listing</a></p>


</section>

 ]]></description>
  <category>post</category>
  <category>developer development</category>
  <category>software development</category>
  <guid>https://www.gregorykapfhammer.com/blog/programming-is-not-software-engineering/</guid>
  <pubDate>Sun, 01 Jan 2023 00:00:00 GMT</pubDate>
</item>
</channel>
</rss>
