<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:gd="http://schemas.google.com/g/2005" xmlns:georss="http://www.georss.org/georss" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:thr="http://purl.org/syndication/thread/1.0"><id>tag:blogger.com,1999:blog-15045980</id><updated>2026-03-04T12:08:54.986-08:00</updated><category term="TotT"/><category term="GTAC"/><category term="James Whittaker"/><category term="Misko Hevery"/><category term="Code Health"/><category term="Anthony Vallone"/><category term="Patrick Copeland"/><category term="Jobs"/><category term="Andrew Trenk"/><category term="C++"/><category term="Patrik Höglund"/><category term="JavaScript"/><category term="Allen Hutchison"/><category term="George Pirocanac"/><category term="Zhanyong Wan"/><category term="Harry Robinson"/><category term="Java"/><category term="Julian Harty"/><category term="Adam Bender"/><category term="Alberto Savoia"/><category term="Ben Yu"/><category term="Erik Kuefler"/><category term="Philip Zembrod"/><category term="Shyam Seshadri"/><category term="Chrome"/><category term="Dillon Bly"/><category term="John Thomas"/><category term="Lesley Katzen"/><category term="Marc Kaplan"/><category term="Markus Clermont"/><category term="Max Kanat-Alexander"/><category term="Sonal Shah"/><category term="APIs"/><category term="Abhishek Arya"/><category term="Alan Myrvold"/><category term="Alek Icev"/><category term="Android"/><category term="April Fools"/><category term="Chaitali Narla"/><category term="Chris Lewis"/><category term="Chrome OS"/><category term="Diego Salas"/><category term="Dori Reuveni"/><category term="Jason Arbon"/><category term="Jochen Wuttke"/><category term="Kostya Serebryany"/><category term="Marc Eaddy"/><category term="Marko Ivanković"/><category term="Mobile"/><category term="Oliver Chang"/><category term="Simon Stewart"/><category term="Stefan Kennedy"/><category term="Test Flakiness"/><category term="Titus Winters"/><category term="Tony Voellm"/><category term="WebRTC"/><category term="Yiming Sun"/><category term="Yvette Nameth"/><category term="Zuri Kemp"/><category term="Aaron Jacobs"/><category term="Adam Porter"/><category term="Adam Raider"/><category term="Adel Saoud"/><category term="Alan Faulkner"/><category term="Alex Eagle"/><category term="Amy Fu"/><category term="Anantha Keesara"/><category term="Antoine Picard"/><category term="App Engine"/><category term="Arham Jain"/><category term="Ari Shamash"/><category term="Arif Sukoco"/><category term="Benjamin Pick"/><category term="Bob Nystrom"/><category term="Bruce Leban"/><category term="Carlos Arguelles"/><category term="Carlos Israel Ortiz García"/><category term="Cathal Weakliam"/><category term="Christopher Semturs"/><category term="Clay Murphy"/><category term="Dagang Wei"/><category term="Dan Maksimovich"/><category term="Dan Shi"/><category term="Dan Willemsen"/><category term="Dave Chen"/><category term="Dave Gladfelter"/><category term="David Bendory"/><category term="David Mandelberg"/><category term="Derek Snyder"/><category term="Diego Cavalcanti"/><category term="Dmitry Vyukov"/><category term="Eduardo Bravo Ortiz"/><category term="Ekaterina Kamenskaya"/><category term="Elliott Karpilovsky"/><category term="Elliotte Rusty Harold"/><category term="Espresso"/><category term="Felipe Sodré"/><category term="Francois Aube"/><category term="Gene Volovich"/><category term="Google+"/><category term="Goran Petrovic"/><category term="Goranka Bjedov"/><category term="Hank Duan"/><category term="Havard Rast Blok"/><category term="Hongfei Ding"/><category term="Jason Elbaum"/><category term="Jason Huggins"/><category term="Jay Han"/><category term="Jeff Hoy"/><category term="Jeff Listfield"/><category term="Jessica Tomechak"/><category term="Jim Reardon"/><category term="Joe Allan Muharsky"/><category term="Joel Hynoski"/><category term="John Micco"/><category term="John Penix"/><category term="Jonathan Rockway"/><category term="Jonathan Velasquez"/><category term="Josh Armour"/><category term="Julie Ralph"/><category term="Kai Kent"/><category term="Kanu Tewary"/><category term="Karin Lundberg"/><category term="Kaue Silveira"/><category term="Kevin Bourrillion"/><category term="Kevin Graney"/><category term="Kirkland"/><category term="Kurt Alfred Kluever"/><category term="Kyle Freeman"/><category term="Manjusha Parvathaneni"/><category term="Marek Kiszkis"/><category term="Marius Latinis"/><category term="Mark Ivey"/><category term="Mark Manley"/><category term="Mark Striebeck"/><category term="Matt Lowrie"/><category term="Meredith Whittaker"/><category term="Michael Bachman"/><category term="Michael Klepikov"/><category term="Mike Aizatsky"/><category term="Mike Wacker"/><category term="Mona El Mahdy"/><category term="Noel Yap"/><category term="Palak Bansal"/><category term="Patricia Legaspi"/><category term="Per Jacobsson"/><category term="Peter Arrenbrecht"/><category term="Peter Spragins"/><category term="Phil Norman"/><category term="Phil Rollet"/><category term="Pooja Gupta"/><category term="Project Showcase"/><category term="Radoslav Vasilev"/><category term="Rajat Dewan"/><category term="Rajat Jain"/><category term="Rich Martin"/><category term="Richard Bustamante"/><category term="Roshan Sembacuttiaratchy"/><category term="Ruslan Khamitov"/><category term="Sam Lee"/><category term="Sean Jordan"/><category term="Sebastian Dörner"/><category term="Sharon Zhou"/><category term="Shiva Garg"/><category term="Siddartha Janga"/><category term="Simran Basi"/><category term="Stan Chan"/><category term="Stephen Ng"/><category term="Tejas Shah"/><category term="Test Analytics"/><category term="Test Engineer"/><category term="Tim Lyakhovetskiy"/><category term="Tom O'Neill"/><category term="Vojta Jína"/><category term="Zhe Lu"/><category term="automation"/><category term="dead code"/><category term="iOS"/><category term="mutation testing"/><title type="text">Google Testing Blog</title><subtitle type="html">If it ain't broke, you're not trying hard enough.</subtitle><link href="http://testing.googleblog.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/15045980/posts/default?redirect=false" rel="self" type="application/atom+xml"/><link href="http://testing.googleblog.com/" rel="alternate" type="text/html"/><link href="http://pubsubhubbub.appspot.com/" rel="hub"/><link href="http://www.blogger.com/feeds/15045980/posts/default?start-index=26&amp;max-results=25&amp;redirect=false" rel="next" type="application/atom+xml"/><author><name>Adam Bender</name><uri>http://www.blogger.com/profile/05413987656859050490</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><generator uri="http://www.blogger.com" version="7.00">Blogger</generator><openSearch:totalResults>398</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-15045980.post-7470985732802821212</id><published>2026-03-03T06:47:00.000-08:00</published><updated>2026-03-03T06:47:35.748-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="TotT"/><category scheme="http://www.blogger.com/atom/ns#" term="Zhe Lu"/><title type="text">Set Safe Defaults for Flags</title><content type="html">&lt;style&gt;
@media only screen and (max-width: 600px) {
  .body {
    overflow-x: auto;
  }

  .post-content table, .post-content td {
    width: auto !important;
    white-space: nowrap;
  }
}
&lt;/style&gt;

&lt;div class="body"&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;This article was adapted from a Google &lt;/span&gt;&lt;a href="https://testing.googleblog.com/2024/12/tech-on-toilet-driving-software.html" style="color: #4184f3; font-family: Roboto, sans-serif; font-size: 17px; text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;Tech on the Toilet&lt;/span&gt;&lt;/a&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; (TotT) episode. You can download a &lt;/span&gt;&lt;a href="https://docs.google.com/document/d/1_Dc1Fe5AGZCm4Eu1kpSl834QyXKQA0ocl_YfT-PIoRo/preview?tab=t.0" style="color: #4184f3; font-family: Roboto, sans-serif; font-size: 17px; text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;printer-friendly version&lt;/span&gt;&lt;/a&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; of this TotT episode and post it in your office.&lt;/span&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: Times New Roman, serif; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;By Zhe Lu&lt;/span&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;span id="docs-internal-guid-d27b8c98-7fff-1f1b-06d4-91c0b590d6b4"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;We all make mistakes. But big mistakes can cause big headaches! Suppose you're writing a utility to update production data for a launch. Before making changes to production data, you want to perform a dry run to validate the expected changes. In your excitement, you forget to include the&lt;/span&gt;&lt;span style="font-size: 12pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="color: #188038; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;--dry_run&lt;/span&gt;&lt;span style="font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; flag in your command:&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none;"&gt;&lt;colgroup&gt;&lt;col width="733"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #fff2cc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;$ /scripts/credit_accounts --amount=USD10&amp;nbsp; # Oops, I forgot to include --dry_run&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 10pt;"&gt;&lt;span style="font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;You realize your mistake too late. &lt;/span&gt;&lt;span style="background-color: white; color: #980000; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;Safe flag defaults can prevent a simple mistake from turning into a major outage:&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none; table-layout: fixed; width: 554.4pt;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: white; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;i&gt;Flag has unsafe default:&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;cliArgs.addBoolFlag(name="dry_run", default=&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;False&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;, help="If set, print change summary, but do NOT change data.")&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: white; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;i&gt;Flag has safe default:&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;cliArgs.addBoolFlag(name="dry_run", default=&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;True&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;, help="If set, print change summary, but do NOT change data.")&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 10pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;Safety depends on context: When defining flags,&lt;/span&gt;&lt;span style="font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;choose the default that minimizes the cost of potential mistakes&lt;/span&gt;&lt;span style="font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;. This might involve defaulting to a "dry" run, asking for user confirmation before irreversible actions, requiring a confirmation flag on the command line, or other strategies. If you’re writing documentation that contains commands, always set values to minimize the damage if run blindly:&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none; table-layout: fixed; width: 554.4pt;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: white; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Flag in documentation has unsafe default:&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;## How to commit changes&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Use this command to commit changes. &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Use --dry_run to test and compute and report changes.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;```shell&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;/scripts/credit_accounts --amount=[value] --filter=[conditions]&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;```&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: white; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Flag in documentation has safe default:&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;## How to commit changes&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Use this command to compute and report changes. &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Use --nodry_run to commit the changes.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;```shell&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;/scripts/credit_accounts --amount=[value] --filter=[conditions]&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;```&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;span style="color: #980000; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;Similarly, consider requiring that environment-specific flags (e.g., backend addresses and output folders) be explicitly set&lt;/span&gt;&lt;span style="font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;span style="font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; In this situation, unspecified environment flags will crash your program, instead of potentially mixing configuration across environments.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/15045980/posts/default/7470985732802821212" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/15045980/posts/default/7470985732802821212" rel="self" type="application/atom+xml"/><link href="http://testing.googleblog.com/2026/03/set-safe-defaults-for-flags.html" rel="alternate" title="Set Safe Defaults for Flags" type="text/html"/><author><name>Google Testing Bloggers</name><uri>http://www.blogger.com/profile/03153388556673050910</uri><email>noreply@blogger.com</email><gd:image height="7" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdMvmFPVLU3JodSkp-aAbNab12mpvIjMuLkNIgbRH6LHNds3HjRtN56Q7wiZxoHklUQmwE97HdRbjTd4rnyuXMVroVk0ChzQOba6fs1doitqFw64aFHGjaikWMor7wQA/s1600/gtb3.png" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-15045980.post-8012847255464638866</id><published>2025-10-20T06:53:00.000-07:00</published><updated>2025-10-20T06:58:34.405-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arham Jain"/><category scheme="http://www.blogger.com/atom/ns#" term="TotT"/><title type="text">Simplify Your Code: Functional Core, Imperative Shell</title><content type="html">&lt;style&gt;
@media only screen and (max-width: 600px) {
  .body {
    overflow-x: auto;
  }

  .post-content table, .post-content td {
    width: auto !important;
    white-space: nowrap;
  }
}
&lt;/style&gt;

&lt;div class="body"&gt;
&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;This article was adapted from a Google &lt;/span&gt;&lt;a href="https://testing.googleblog.com/2024/12/tech-on-toilet-driving-software.html" style="color: #4184f3; font-family: Roboto, sans-serif; font-size: 17px; text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;Tech on the Toilet&lt;/span&gt;&lt;/a&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; (TotT) episode. You can download a &lt;/span&gt;&lt;a href="https://docs.google.com/document/d/1uSSL90h0vM6tLvdlnk04nZZLKfPI3By1tFdKXz_IUl8/edit?tab=t.0" style="color: #4184f3; font-family: Roboto, sans-serif; font-size: 17px; text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;printer-friendly version&lt;/span&gt;&lt;/a&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; of this TotT episode and post it in your office.&lt;/span&gt;&lt;/div&gt;&lt;div class="body"&gt;&lt;span style="font-family: Times New Roman, serif;"&gt;&lt;span style="white-space-collapse: preserve;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span style="font-family: Times New Roman, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;By Arham Jain&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;span id="docs-internal-guid-73f283bd-7fff-ea3c-2198-65d6dc483f7c"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;Is your code a tangled mess of business logic and side effects?&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; Mixing database calls, network requests, and other external interactions directly with your core logic can lead to code that’s difficult to test, reuse, and understand. Instead, consider writing a &lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;functional core&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; that’s called from an &lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;imperativ&lt;/span&gt;&lt;span style="background-color: white; color: black; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;​​&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;e shell&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcjlaWnIXkXzahgFw3l6gXUaZaX6eAS1brqLf38XD5n6JhEup-D6UDNJB5VrDqtMMsqjhyphenhyphenQEJ3ZlnOTkpGWosz4uzOJVrRoFvnLvC5gH0m3Lcs7rHV5PLRWmd1lxiHqSkVl15v-FpHCiJwMg4w7Azo8y-ipNuN6wvOjqHFjHme-X9m8V5gwrw2/s32/Screenshot%202025-10-20%20at%208.51.55%E2%80%AFAM.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img style="margin-bottom: -22px; margin-top: -8px; width: 200px;" alt="Diagram of functional core, imperative shell" border="0" data-original-height="342" data-original-width="334" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcjlaWnIXkXzahgFw3l6gXUaZaX6eAS1brqLf38XD5n6JhEup-D6UDNJB5VrDqtMMsqjhyphenhyphenQEJ3ZlnOTkpGWosz4uzOJVrRoFvnLvC5gH0m3Lcs7rHV5PLRWmd1lxiHqSkVl15v-FpHCiJwMg4w7Azo8y-ipNuN6wvOjqHFjHme-X9m8V5gwrw2/s320/Screenshot%202025-10-20%20at%208.51.55%E2%80%AFAM.png"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 3pt; margin-top: 0pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;Separating your code into functional cores and imperative shells makes it more testable, maintainable, and adaptable. &lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;The core logic can be tested in isolation, and the imperati&lt;/span&gt;&lt;span style="background-color: white; color: black; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;​​&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;ve shell can be swapped out or modified as needed. Here’s some messy example code that mixes logic and side effects to send expiration notification emails to users:&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none; font-style: normal; width: 535pt;"&gt;&lt;colgroup&gt;&lt;col width="733"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;// Bad: Logic and side effects are mixed&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;function &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;sendUserExpiryEmail&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;(): void &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;for (const user of db.getUsers()) {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (user.subscriptionEndDate &amp;gt; Date.now()) continue;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (user.isFreeTrial) continue;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;email.send(user.email, "Your account has expired " + user.name + “.”);&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 5pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;A&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;functional core&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;should contain pure, testable business logic&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;, which is free of side effects (such as I/O or external state mutation). It operates only on the data it is given.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 10pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;An&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;imperative shell&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;is responsible for side effects,&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; like database calls and sending emails. It uses the functions in your functional core to perform the business logic.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 3pt; margin-top: 10pt;"&gt;&lt;span style="color: black; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;Rewriting the above code to follow the functional core / imperative shell pattern might look like:&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none; font-style: normal; table-layout: fixed; width: 535pt;"&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: white; border-color: rgb(183, 183, 183); border-style: solid; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Functional core&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #d9ead3; border-color: rgb(183, 183, 183); border-style: solid; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;function &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;getExpiredUsers&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;(&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;users: User[], cutoff: Date&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;)&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;: User[] &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;return users.filter&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;(&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;user =&amp;gt; user.subscriptionEndDate &amp;lt;= cutoff &amp;amp;&amp;amp; !user.isFreeTrial&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;);&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;function &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;generateExpiryEmails&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;(&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;users: User[]&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;)&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;: Array&amp;lt;[string, string]&amp;gt; &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;return users.map&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;(&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;user =&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;([user.email, “Your account has expired “ + user.name + “.”])&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;);&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: white; border-color: rgb(183, 183, 183); border-style: solid; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Imperative shell&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #d9ead3; border-color: rgb(183, 183, 183); border-style: solid; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;email.&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;bulkSend&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;(&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;generateExpiryEmails&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;(&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;getExpiredUsers&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;(&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;db.getUsers&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;()&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;, Date.now&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;())));&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 3pt; margin-top: 5pt; padding-top: 10px;"&gt;&lt;span style="color: black; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;Now that the code is following this pattern, adding a feature to send a new type of email is as simple as writing a new pure function and reusing &lt;/span&gt;&lt;span style="color: black; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;getExpiredUsers&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none; font-style: normal; table-layout: fixed; width: 535pt;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #d9ead3; border-color: rgb(183, 183, 183); border-style: solid; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;// Sending a reminder email to users&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;function &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;generateReminderEmails&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;(&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;users: User[], cutoff: Date&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;)&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;: Array&amp;lt;[string, string]&amp;gt; &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;{...}&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;const fiveDaysFromNow = ...&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;email.&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;bulkSend&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;(&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;generateReminderEmails&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;(&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;getExpiredUsers&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;(db.getUsers(), fiveDaysFromNow&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;)));&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;span id="docs-internal-guid-f967e5bb-7fff-e36d-ea0f-2c61f44c9c45"&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;Learn more in &lt;/span&gt;&lt;a href="https://www.destroyallsoftware.com/screencasts/catalog/functional-core-imperative-shell" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;Gary Bernhardt’s original talk&lt;/span&gt;&lt;/a&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; about functional core, imperative shell.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/15045980/posts/default/8012847255464638866" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/15045980/posts/default/8012847255464638866" rel="self" type="application/atom+xml"/><link href="http://testing.googleblog.com/2025/10/simplify-your-code-functional-core.html" rel="alternate" title="Simplify Your Code: Functional Core, Imperative Shell" type="text/html"/><author><name>Google Testing Bloggers</name><uri>http://www.blogger.com/profile/03153388556673050910</uri><email>noreply@blogger.com</email><gd:image height="7" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdMvmFPVLU3JodSkp-aAbNab12mpvIjMuLkNIgbRH6LHNds3HjRtN56Q7wiZxoHklUQmwE97HdRbjTd4rnyuXMVroVk0ChzQOba6fs1doitqFw64aFHGjaikWMor7wQA/s1600/gtb3.png" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcjlaWnIXkXzahgFw3l6gXUaZaX6eAS1brqLf38XD5n6JhEup-D6UDNJB5VrDqtMMsqjhyphenhyphenQEJ3ZlnOTkpGWosz4uzOJVrRoFvnLvC5gH0m3Lcs7rHV5PLRWmd1lxiHqSkVl15v-FpHCiJwMg4w7Azo8y-ipNuN6wvOjqHFjHme-X9m8V5gwrw2/s72-c/Screenshot%202025-10-20%20at%208.51.55%E2%80%AFAM.png" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-15045980.post-3190209407406038686</id><published>2025-09-15T06:45:00.000-07:00</published><updated>2025-09-15T06:45:34.442-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Kyle Freeman"/><category scheme="http://www.blogger.com/atom/ns#" term="TotT"/><title type="text">Sort Lines in Source Code</title><content type="html">&lt;style&gt;
@media only screen and (max-width: 600px) {
  .body {
    overflow-x: auto;
  }

  .post-content table, .post-content td {
    white-space: nowrap;
  }
}
&lt;/style&gt;

&lt;div class="body"&gt;
&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;This article was adapted from a Google &lt;/span&gt;&lt;a href="https://testing.googleblog.com/2024/12/tech-on-toilet-driving-software.html" style="color: #4184f3; font-family: Roboto, sans-serif; font-size: 17px; text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;Tech on the Toilet&lt;/span&gt;&lt;/a&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; (TotT) episode. You can download a &lt;/span&gt;&lt;a href="https://docs.google.com/document/d/1RdpL8s_Ejo3T13Y6YQfL1MYmaAVFhJprnL81As5W-sU/edit?tab=t.0#heading=h.9e7eqnbd21f0" style="color: #4184f3; font-family: Roboto, sans-serif; font-size: 17px; text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;printer-friendly version&lt;/span&gt;&lt;/a&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; of this TotT episode and post it in your office.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;span style="font-size: 17.3333px; font-style: normal;"&gt;By Kyle Freeman&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span id="docs-internal-guid-59cff2fa-7fff-12d9-ac75-0b6d76ebfd2b"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Imagine you're adding a two-player mode to a game. When testing the feature, you launch the game but don't see the option to add a second player. The configuration looks correct; you enabled two-player mode on the last line!&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 0pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;So what happened?&lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt; Can you spot the bug in the following example?&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none; width: 660px;"&gt;&lt;colgroup&gt;&lt;col width="733"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #cfe2f3; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;allow_warping: false&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;enable_two_players: false&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;show_end_credits: true&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;enable_frost_band: false&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;enable_two_players: true&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 10pt;"&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Using &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;keep-sorted&lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt; (&lt;/span&gt;&lt;a href="http://github.com/google/keep-sorted" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;github.com/google/keep-sorted&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;) to sort lines makes the error easy to spot&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;: the flag &lt;/span&gt;&lt;span style="color: #188038; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;enable_two_players&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; is set twice, with different values:&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none; table-layout: fixed; width: 660px;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;# keep-sorted start&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;allow_warping: false&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;enable_frost_band: false&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;enable_two_players: false&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;enable_two_players: true&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;show_end_credits: true&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;# keep-sorted end&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 10pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Sorted lists and lines of code are easier to read and maintain, and can help prevent bugs. To use &lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;keep-sorted&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; in your source code, config, and text files, &lt;/span&gt;&lt;a href="https://github.com/google/keep-sorted?tab=readme-ov-file#sorting-your-file" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;install keep-sorted&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; and then follow these instructions:&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;ol style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: decimal; margin-left: -18pt; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 10pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"&gt;Add &lt;/span&gt;&lt;span style="color: #188038; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"&gt;keep-sorted start&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"&gt; and &lt;/span&gt;&lt;span style="color: #188038; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"&gt;keep-sorted end&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"&gt; comments in your file, surrounding the lines you want to sort.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: decimal; margin-left: -18pt; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"&gt;Run &lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"&gt;keep-sorted&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"&gt;: &lt;/span&gt;&lt;span style="color: #188038; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"&gt;keep-sorted [file1] [file2] ...&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: decimal; margin-left: -18pt; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"&gt;(Optional) &lt;/span&gt;&lt;a href="https://github.com/google/keep-sorted?tab=readme-ov-file#pre-commit" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;"&gt;Add &lt;/span&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;"&gt;keep-sorted&lt;/span&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;"&gt; to your pre-commit&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"&gt; so it runs automatically on &lt;/span&gt;&lt;span style="color: #188038; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"&gt;git commit&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 10pt;"&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;You can add &lt;/span&gt;&lt;a href="https://github.com/google/keep-sorted?tab=readme-ov-file#options" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;options&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt; to override default behavior&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;. For example, you can ignore case, sort numerically, order by prefixes, and even sort by regular expressions:&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none; table-layout: fixed; width: 660px;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 102.75pt;"&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;bosses := []int{&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;// keep-sorted start &lt;/span&gt;&lt;span style="background-color: #fff2cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;by_regex=//.*&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;111213, // Aethon Annie&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;52816,&amp;nbsp; // Blazing Benny&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;711,&amp;nbsp; &amp;nbsp; // Daisy Dragon&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;1003, &amp;nbsp; // Kenzie Kraken&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;// keep-sorted end&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Remember: before sorting, ensure the original order isn't intentional. For example, order can be critical when loading dependencies.&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/15045980/posts/default/3190209407406038686" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/15045980/posts/default/3190209407406038686" rel="self" type="application/atom+xml"/><link href="http://testing.googleblog.com/2025/09/sort-lines-in-source-code.html" rel="alternate" title="Sort Lines in Source Code" type="text/html"/><author><name>Google Testing Bloggers</name><uri>http://www.blogger.com/profile/03153388556673050910</uri><email>noreply@blogger.com</email><gd:image height="7" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdMvmFPVLU3JodSkp-aAbNab12mpvIjMuLkNIgbRH6LHNds3HjRtN56Q7wiZxoHklUQmwE97HdRbjTd4rnyuXMVroVk0ChzQOba6fs1doitqFw64aFHGjaikWMor7wQA/s1600/gtb3.png" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-15045980.post-5121163949762592729</id><published>2025-01-07T05:59:00.000-08:00</published><updated>2025-01-07T05:59:45.897-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Code Health"/><category scheme="http://www.blogger.com/atom/ns#" term="Sebastian Dörner"/><category scheme="http://www.blogger.com/atom/ns#" term="TotT"/><title type="text">Arrange Your Code to Communicate Data Flow</title><content type="html">&lt;style&gt;
@media only screen and (max-width: 600px) {
  .body {
    overflow-x: auto;
  }

  .post-content table, .post-content td {
    width: auto !important;
    white-space: nowrap;
  }
}
&lt;/style&gt;

&lt;div class="body"&gt;
&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;This article was adapted from a Google &lt;/span&gt;&lt;a href="https://testing.googleblog.com/2024/12/tech-on-toilet-driving-software.html" style="color: #4184f3; font-family: Roboto, sans-serif; font-size: 17px; text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;Tech on the Toilet&lt;/span&gt;&lt;/a&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; (TotT) episode. You can download a &lt;/span&gt;&lt;a href="https://docs.google.com/document/d/1S_OQnh14DgDZcvd8KJyvU0bn9u5IONFCzyv6wt6q5AM/edit?tab=t.0" style="color: #4184f3; font-family: Roboto, sans-serif; font-size: 17px; text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;printer-friendly version&lt;/span&gt;&lt;/a&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; of this TotT episode and post it in your office.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="body"&gt;&lt;span id="docs-internal-guid-e0ee5a94-7fff-167d-36c6-bb43f58b26ca"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Times New Roman, serif; font-size: 17.3333px; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;By Sebastian Dörner &lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Times New Roman, serif; font-size: 17.3333px; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;
&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;We often read code linearly, from one line to the next. To make code easier to understand and to reduce &lt;/span&gt;&lt;a href="https://testing.googleblog.com/2023/11/write-clean-code-to-reduce-cognitive.html" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;cognitive load&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; for your readers, make sure that adjacent lines of code are coherent.&amp;nbsp; One way to achieve this is to&lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt; order your lines of code to match the data flow inside your method&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;:&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none;"&gt;&lt;colgroup&gt;&lt;col width="347"&gt;&lt;/col&gt;&lt;col width="386"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 21pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;fun getSandwich(&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bread: Bread, pasture: Pasture&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;): Sandwich {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;// This alternates between milk-&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;  //&lt;/span&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; white-space-collapse: preserve;"&gt; bread-related code.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;val cow = pasture.getCow()&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;val slicedBread = bread.slice()&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;val milk = cow.getMilk()&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;val toast = toastBread(slicedBread)&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;val cheese = makeCheese(milk)&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;return Sandwich(cheese, toast)&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;fun getSandwich(&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bread: Bread, pasture: Pasture&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;): Sandwich {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;// Linear flow from cow to milk&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;  // to cheese.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;val cow = pasture.getCow()&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;val milk = cow.getMilk()&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;val cheese = makeCheese(milk)&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;// Linear flow from bread to slicedBread&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;  // to&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; white-space-collapse: preserve;"&gt;toast.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;val slicedBread = bread.slice()&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;val toast = toastBread(slicedBread)&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;return Sandwich(cheese, toast)&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 10pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;To visually emphasize the grouping of related lines, you can add a blank line between each code block.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 10pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Often you can further improve readability by extracting a method, e.g., by extracting the first 3 lines of the function on the above right into a &lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;getCheese&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; method. However,&lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt; in some scenarios, extracting a method isn’t possible or helpful&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;, e.g., if data is used a second time for logging. &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;If you order the lines to match the data flow, you can still increase code clarity:&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none;"&gt;&lt;colgroup&gt;&lt;col width="733"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;fun getSandwich(bread: Bread, pasture: Pasture): Sandwich {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #4080e8; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;// Both milk and cheese are used below, so this can’t easily be extracted into&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;  // a method.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;val cow = pasture.getCow()&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;val milk = cow.getMilk()&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;reportFatContentToStreamz(cow.age, milk)&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;val cheese = makeCheese(milk)&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;val slicedBread = bread.slice()&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;val toast = toastBread(slicedBread)&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;logWarningIfAnyExpired(bread, toast, milk, cheese)&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;return Sandwich(cheese, toast)&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;div&gt;&lt;span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;It isn’t always possible to group variables &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;perfectly&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; if you have more complicated data flows, but even &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;incremental changes&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; in this direction improve the readability of your code. A good starting point is to declare your variables as close to the first use as possible.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/15045980/posts/default/5121163949762592729" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/15045980/posts/default/5121163949762592729" rel="self" type="application/atom+xml"/><link href="http://testing.googleblog.com/2025/01/arrange-your-code-to-communicate-data.html" rel="alternate" title="Arrange Your Code to Communicate Data Flow" type="text/html"/><author><name>Google Testing Bloggers</name><uri>http://www.blogger.com/profile/03153388556673050910</uri><email>noreply@blogger.com</email><gd:image height="7" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdMvmFPVLU3JodSkp-aAbNab12mpvIjMuLkNIgbRH6LHNds3HjRtN56Q7wiZxoHklUQmwE97HdRbjTd4rnyuXMVroVk0ChzQOba6fs1doitqFw64aFHGjaikWMor7wQA/s1600/gtb3.png" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-15045980.post-2772563543852506376</id><published>2024-12-03T05:34:00.001-08:00</published><updated>2025-02-06T08:13:07.985-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Andrew Trenk"/><category scheme="http://www.blogger.com/atom/ns#" term="Kanu Tewary"/><category scheme="http://www.blogger.com/atom/ns#" term="TotT"/><title type="text">Tech on the Toilet: Driving Software Excellence, One Bathroom Break at a Time</title><content type="html">&lt;div&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #444746; font-size: 17.3333px; white-space-collapse: preserve;"&gt;By Kanu Tewary and Andrew Trenk&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #444746; font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span id="docs-internal-guid-5aa6b0a9-7fff-f361-0cd8-fcc301da06be"&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #444746; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Tech on the Toilet (TotT) is a weekly one-page publication about software development that is posted in bathrooms in Google offices worldwide. At Google, TotT is a trusted source for high quality technical content and software engineering best practices. TotT episodes relevant outside Google are &lt;/span&gt;&lt;a href="https://testing.googleblog.com/search/label/TotT" style="text-decoration-line: none;"&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;posted to this blog&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #444746; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;We have been posting TotT to this blog &lt;/span&gt;&lt;a href="https://testing.googleblog.com/2007/01/introducing-testing-on-toilet.html" style="text-decoration-line: none;"&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;since 2007&lt;/span&gt;&lt;/a&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #444746; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;. &lt;/span&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #222222; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;We're excited to announce that &lt;/span&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #222222; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Testing on the Toilet has been renamed Tech on the Toilet.&lt;/span&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #222222; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt; &lt;/span&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #444746; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;TotT originally covered only software testing topics, but for many years has been covering any topics relevant to software development, such as coding practices, machine learning, web development, and more.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #222222; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;A Cultural Institution&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #222222; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;TotT is a grassroots effort with a mission to deliver easily-digestable one-pagers on software development to engineers in the most unexpected of places: bathroom stalls!&lt;/span&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #444746; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt; &lt;/span&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #222222; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;But TotT is more than just bathroom reading -- it's a movement. Driven by a team of &lt;/span&gt;&lt;a href="https://www.cnbc.com/2021/12/16/google-20-percent-rule-shows-exactly-how-much-time-you-should-spend-learning-new-skills.html" style="text-decoration-line: none;"&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;20-percent&lt;/span&gt;&lt;/a&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #222222; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; volunteers, TotT empowers Google employees to learn and grow, fostering a culture of excellence within the Google engineering community.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #222222; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;span style="border: none; display: inline-block; height: 324px; overflow: hidden; width: 186px;"&gt;&lt;img alt="Photo of TotT posted in a bathroom stall" height="324" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXd1ILuAjIpdPtMg0VLejjx2l4BthcbRb3p8Q921JMhnBdzMHPvURKbMdCn1jWC1MjwkCAwdyA1xzeugkfxBOP-mdWT7Pls0d5n7b1FD9VPYvKBJCm6xbAJnpPeBHPDiXytHJqlR-A?key=BQOIUXBOhTuJ_VwLeXpS8g" style="margin-left: -34.2426px; margin-top: 0px;" width="248.403" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #222222; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;span style="border: none; display: inline-block; height: 323px; overflow: hidden; width: 184px;"&gt;&lt;img alt="Photo of TotT posted in a bathroom stall" height="445.7077" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdt-aU30twCL3cjcEaoQaTgMcAAR3SBkCdb2__C1I8Gwbkz1HkTcGSzBij5pYn4vflq3oOH2z86pO1pE_7ADqSbE4VzegAzktvNuES508yfTGgjTTHUpfd8cEJr95bZgUHSWQeHqA?key=BQOIUXBOhTuJ_VwLeXpS8g" style="margin-left: 0px; margin-top: 0px;" width="202.4736" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #222222; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Photos of TotT posted in bathroom stalls at Google.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #222222; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Anyone at Google can author a TotT episode (regardless of tenure or seniority). Each episode is carefully curated and edited to provide concise, actionable, authoritative information about software best practices and developer tools. After an episode is published, it is posted to Google bathrooms around the world, and is also available to read online internally at Google. TotT episodes often become a canonical source for helping far-flung teams &lt;/span&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #444746; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;standardize their software development tools and practices. &lt;/span&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #222222; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #222222; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Because Every Superhero Has An Origin Story&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #222222; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;TotT began as a bottom-up approach to drive a culture change. The year was 2006 and Google was experiencing rapid growth and huge challenges: there were many costly bugs and rolled-back releases. A small group of engineers, members of the so-called &lt;/span&gt;&lt;a href="https://mike-bland.com/2011/09/27/testing-grouplet.html" style="text-decoration-line: none;"&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;Testing Grouplet&lt;/span&gt;&lt;/a&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #222222; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;, passionate about testing, brainstormed about how to instill a culture of software testing at Google. In a moment of levity, someone suggested posting flyers in restrooms (since people have time to read there, clearly!). The Testing Grouplet named their new publication Testing on the Toilet. TotT’s red lightbub, green lightbulb logo–displayed at the top of the page of each printed flyer–was adapted from the Testing Grouplet’s logo.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: center;"&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #222222; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;span style="border: none; display: inline-block; height: 102px; overflow: hidden; width: 182px;"&gt;&lt;img alt="The TotT logo" height="102" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfOALGSJpmqlUHziDnz-NDClJicAz-avUTQFOXtLOnAB2vgqinoozjmqSQGAdou5spS0OcX7zVwgRraWCabKnBb16gxIA8jJVtJ0BH0S0XQ4vzKuWA-LZFujRFC8ZBdU2cAKTw5IA?key=BQOIUXBOhTuJ_VwLeXpS8g" style="margin-left: 0px; margin-top: 0px;" width="182" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: center;"&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #222222; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;The TotT logo.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #222222; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;The &lt;/span&gt;&lt;a href="https://testing.googleblog.com/2007/01/better-stubbing-in-python.html" style="text-decoration-line: none;"&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;first TotT episode&lt;/span&gt;&lt;/a&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #222222; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;, a simple code example with a suggested improvement, was written by an engineer at Google headquarters in Mountain View, and posted by a volunteer in Google bathrooms in London. Soon other engineers wrote episodes, and an army of volunteers started posting those episodes at their sites. Hundreds of engineers started encountering TotT episodes.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #222222; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;The initial response was a mix of surprise and intrigue, with some engineers even expressing outrage at the "violation" of their bathroom sanctuary. However, the majority of feedback was positive, with many appreciating the readily accessible knowledge. &lt;/span&gt;&lt;a href="https://mike-bland.com/2011/10/25/testing-on-the-toilet.html" style="text-decoration-line: none;"&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;Learn more about the history of TotT in this blog post&lt;/span&gt;&lt;/a&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #222222; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; by one of the original members of the Testing Grouplet.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #222222; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Trusted, Concise, Actionable&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #222222; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;TotT has become an authoritative source for software development best practices at Google. Many episodes, like the following popular episodes at Google, are cited hundreds of times in code reviews and other internal documents:&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="1" dir="ltr" style="font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;a href="https://testing.googleblog.com/2017/06/code-health-reduce-nesting-reduce.html" style="text-decoration-line: none;"&gt;&lt;span style="background-color: white; color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;"&gt;Reduce Nesting, Reduce Complexity&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;a href="https://testing.googleblog.com/2023/10/improve-readability-with-positive.html" style="text-decoration-line: none;"&gt;&lt;span style="background-color: white; color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;"&gt;Improve Readability With Positive Booleans&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;a href="https://testing.googleblog.com/2019/12/testing-on-toilet-tests-too-dry-make.html" style="text-decoration-line: none;"&gt;&lt;span style="background-color: white; color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;"&gt;Tests Too DRY? Make Them DAMP!&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;a href="https://testing.googleblog.com/2015/01/testing-on-toilet-change-detector-tests.html" style="text-decoration-line: none;"&gt;&lt;span style="background-color: white; color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;"&gt;Change-Detector Tests Considered Harmful&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;a href="https://testing.googleblog.com/2017/08/code-health-eliminate-yagni-smells.html" style="text-decoration-line: none;"&gt;&lt;span style="background-color: white; color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;"&gt;Eliminate YAGNI Smells&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #222222; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;A &lt;/span&gt;&lt;a href="https://research.google/pubs/do-developers-learn-new-tools-on-the-toilet/" style="text-decoration-line: none;"&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;2019 research paper&lt;/span&gt;&lt;/a&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #222222; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; presented at the International Conference of Software Engineering even analyzed the impact of TotT episodes on the adoption of internal tools and infrastructure, demonstrating its effectiveness in driving positive change.&lt;/span&gt;&lt;/p&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #222222; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;TotT has inspired various other publications at Google, like &lt;/span&gt;&lt;a href="https://blog.google/inside-google/life-at-google/inside-story-learning-on-the-loo/" style="text-decoration-line: none;"&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;Learning on the Loo&lt;/span&gt;&lt;/a&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="background-color: white; color: #222222; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;: non-technical articles to improve efficiency, reduce stress and improve work satisfaction. Other companies have been inspired to create their own bathroom publications, thanks to TotT. So the next time you find yourself reading a TotT episode, take a moment to appreciate its humble bathroom beginnings. After all, where better to ponder the mysteries of the code than in a place of quiet contemplation?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/15045980/posts/default/2772563543852506376" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/15045980/posts/default/2772563543852506376" rel="self" type="application/atom+xml"/><link href="http://testing.googleblog.com/2024/12/tech-on-toilet-driving-software.html" rel="alternate" title="Tech on the Toilet: Driving Software Excellence, One Bathroom Break at a Time" type="text/html"/><author><name>Google Testing Bloggers</name><uri>http://www.blogger.com/profile/03153388556673050910</uri><email>noreply@blogger.com</email><gd:image height="7" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdMvmFPVLU3JodSkp-aAbNab12mpvIjMuLkNIgbRH6LHNds3HjRtN56Q7wiZxoHklUQmwE97HdRbjTd4rnyuXMVroVk0ChzQOba6fs1doitqFw64aFHGjaikWMor7wQA/s1600/gtb3.png" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://lh7-rt.googleusercontent.com/docsz/AD_4nXd1ILuAjIpdPtMg0VLejjx2l4BthcbRb3p8Q921JMhnBdzMHPvURKbMdCn1jWC1MjwkCAwdyA1xzeugkfxBOP-mdWT7Pls0d5n7b1FD9VPYvKBJCm6xbAJnpPeBHPDiXytHJqlR-A=s72-c?key=BQOIUXBOhTuJ_VwLeXpS8g" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-15045980.post-4057571564322162588</id><published>2024-10-15T05:22:00.000-07:00</published><updated>2024-10-15T05:27:00.702-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Adam Bender"/><category scheme="http://www.blogger.com/atom/ns#" term="TotT"/><title type="text">SMURF: Beyond the Test Pyramid</title><content type="html">&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;This article was adapted from a Google &lt;/span&gt;&lt;a href="http://googletesting.blogspot.com/2007/01/introducing-testing-on-toilet.html" style="color: #4184f3; font-family: Roboto, sans-serif; font-size: 17px; text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;Testing on the Toilet&lt;/span&gt;&lt;/a&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; (TotT) episode. You can download a &lt;/span&gt;&lt;a href="https://docs.google.com/document/d/1VZZlbmkOprhzp17ttjpBQ3oaqAXxEv422O2jMezwZC8/edit?tab=t.0" style="color: #4184f3; font-family: Roboto, sans-serif; font-size: 17px; text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;printer-friendly version&lt;/span&gt;&lt;/a&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; of this TotT episode and post it in your office.&lt;/span&gt;&lt;div&gt;&lt;span style="font-family: Times New Roman, serif;"&gt;&lt;span style="white-space-collapse: preserve;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Times New Roman, serif;"&gt;&lt;span style="white-space-collapse: preserve;"&gt;By Adam Bender&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;span id="docs-internal-guid-947c9492-7fff-6044-49e8-206b4afa1207"&gt;&lt;p dir="ltr" style="font-size: 12pt; font-style: italic; line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;The &lt;/span&gt;&lt;a href="https://martinfowler.com/bliki/TestPyramid.html" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;test pyramid&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; is the canonical heuristic for guiding test suite evolution. It conveys a simple message - &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;prefer more unit tests than integration tests, and prefer more integration tests than end-to-end tests&lt;/span&gt;&lt;span style="font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;. &lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="font-size: 12pt; font-style: italic; line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt; text-align: center;"&gt;&lt;span style="font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;&lt;span id="docs-internal-guid-78feeb6b-7fff-54bc-7a3b-a0c5c1f18bd2"&gt;&lt;span style="border: none; display: inline-block; height: 129px; overflow: hidden; width: 168px;"&gt;&lt;img alt="A diagram of the test pyramid" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXej7qoczQGJ-CPfJ4LIt5l-nWvaGd9WXLPLEslXGzE5ih0C_jdCcK1Ds_QOpvLqD03hbNZXbnGvCNQ8Oy5cJOPZ5xR1qRT8pxp-CDF6KaFX1Dch9FOZjtbmBxzWK_y0OIjSnH8J6wYXV7obtmUaTX9BG5XW=s16000?key=9eA8neKwqCIgXwSUpDaoQQ" style="margin-left: 0px; margin-top: 0px;" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="font-size: 12pt; font-style: italic; line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;While useful, the test pyramid lacks the details you need as your test suite grows and you face challenging trade-offs. &lt;/span&gt;&lt;span style="color: #990000; font-size: 13pt; font-style: normal; font-weight: 700;"&gt;To scale your test suite, go beyond the test pyramid.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="font-size: 12pt; font-style: italic; line-height: 1.2; margin-bottom: 0pt; margin-top: 10pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;The &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;SMURF &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;mnemonic&lt;/span&gt;&lt;span style="font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;is an easy way to remember the tradeoffs to consider when balancing your test suite&lt;/span&gt;&lt;span style="font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;/p&gt;&lt;ul style="font-size: 12pt; font-style: italic; margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="1" dir="ltr" style="font-size: 11pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; text-wrap: nowrap; vertical-align: baseline;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span style="font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;S&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;peed: &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;Unit tests are faster than other test types and can be run more often—you’ll catch problems sooner.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-size: 11pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; text-wrap: nowrap; vertical-align: baseline;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;M&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;aintainability: &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;The aggregated cost of debugging and maintaining tests (of all types) adds up quickly. A larger system under test has more code, and thus greater exposure to dependency churn and requirement drift which, in turn, creates more maintenance work.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-size: 11pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; text-wrap: nowrap; vertical-align: baseline;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 10pt;"&gt;&lt;span style="font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;U&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;tilization: &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;Tests that use fewer resources (memory, disk, CPU) cost less to run. A good test suite optimizes resource utilization so that it does not grow super-linearly with the number of tests. Unit tests usually have better utilization characteristics, often because they use test doubles or only involve limited parts of a system.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-size: 11pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; text-wrap: nowrap; vertical-align: baseline;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 10pt;"&gt;&lt;span style="font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;R&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;eliability: &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;Reliable tests only fail when an actual problem has been discovered. Sorting through flaky tests for problems wastes developer time and costs resources in rerunning the tests. As the size of a system and its corresponding tests grow, non-determinism (and thus, flakiness) creeps in, and your test suite is more likely to become unreliable.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-size: 11pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; text-wrap: nowrap; vertical-align: baseline;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span style="font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;F&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;idelity: &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;High-fidelity tests come closer to approximating real operating conditions (e.g., real databases or traffic loads) and better predict the behavior of our production systems. Integration and end-to-end tests can better reflect realistic conditions, while unit tests have to simulate the environment, which can lead to drift between test expectations and reality.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;table style="border-collapse: collapse; border: none; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;colgroup&gt;&lt;col width="309"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 243.812pt;"&gt;&lt;td style="overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 10pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;span style="border: none; display: inline-block; height: 293px; overflow: hidden; width: 294px;"&gt;&lt;img alt="A radar chart depicting the relationship between SMURF attributes as applied to unit, integration, and end-to-end tests. Unit tests perform best on all attributes except fidelity, where they are the worst. Integration tests are mid-way performers on all aspects. End-to-end tests are worst on all aspects, except fidelity where they are the best." src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcyv0Dd8EPZJHfBuLZfvsLwVhXGVnvpBFhkhmOAOlCfCg6WZMmVyETD8ZH_oWSSYVxte2s9jTjmyGvoBxBL2sawkk-7lJVXDQKyKTaXnXulHhAugimqXk8ZocdlXTGJA6pHudUWgP4W0Zr0EHI92vzDJ_Y=s16000?key=9eA8neKwqCIgXwSUpDaoQQ" style="margin-left: 0px; margin-top: 0px;" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="overflow-wrap: break-word; overflow: hidden; vertical-align: middle;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;span face="Arial, sans-serif" style="font-size: 9pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;A &lt;/span&gt;&lt;a href="https://en.wikipedia.org/wiki/Radar_chart" style="text-decoration-line: none;"&gt;&lt;span face="Arial, sans-serif" style="color: #1155cc; font-size: 9pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;radar chart&lt;/span&gt;&lt;/a&gt;&lt;span face="Arial, sans-serif" style="font-size: 9pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp; of Test Type vs. Test Property (i.e. SMURF). Farther from center is better.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p dir="ltr" style="font-size: 12pt; font-style: italic; line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;In many cases, the relationships between the SMURF dimensions are in tension&lt;/span&gt;&lt;span style="font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;span style="font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; improving one dimension can affect the others. However, if you can improve one or more dimensions of a test without harming the others, then you should do so. When thinking about the types of your tests (unit, integration, end-to-end), your choices have meaningful implications for your test suite’s cost and the value it provides.&lt;/span&gt;&lt;/p&gt;&lt;div style="font-size: 12pt; font-style: italic;"&gt;&lt;span style="font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/15045980/posts/default/4057571564322162588" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/15045980/posts/default/4057571564322162588" rel="self" type="application/atom+xml"/><link href="http://testing.googleblog.com/2024/10/smurf-beyond-test-pyramid.html" rel="alternate" title="SMURF: Beyond the Test Pyramid" type="text/html"/><author><name>Google Testing Bloggers</name><uri>http://www.blogger.com/profile/03153388556673050910</uri><email>noreply@blogger.com</email><gd:image height="7" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdMvmFPVLU3JodSkp-aAbNab12mpvIjMuLkNIgbRH6LHNds3HjRtN56Q7wiZxoHklUQmwE97HdRbjTd4rnyuXMVroVk0ChzQOba6fs1doitqFw64aFHGjaikWMor7wQA/s1600/gtb3.png" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://lh7-rt.googleusercontent.com/docsz/AD_4nXej7qoczQGJ-CPfJ4LIt5l-nWvaGd9WXLPLEslXGzE5ih0C_jdCcK1Ds_QOpvLqD03hbNZXbnGvCNQ8Oy5cJOPZ5xR1qRT8pxp-CDF6KaFX1Dch9FOZjtbmBxzWK_y0OIjSnH8J6wYXV7obtmUaTX9BG5XW=s72-c?key=9eA8neKwqCIgXwSUpDaoQQ" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-15045980.post-7404242993300318308</id><published>2024-09-04T05:56:00.000-07:00</published><updated>2024-09-04T05:57:22.990-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Amy Fu"/><category scheme="http://www.blogger.com/atom/ns#" term="Code Health"/><category scheme="http://www.blogger.com/atom/ns#" term="TotT"/><title type="text">Write Change-Resilient Code With Domain Objects</title><content type="html">&lt;style&gt;
@media only screen and (max-width: 600px) {
  .body {
    overflow-x: auto;
  }

  .post-content table, .post-content td {
    width: auto !important;
    white-space: nowrap;
  }
}
&lt;/style&gt;

&lt;div class="body"&gt;
&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17.3333px; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;i&gt;This is another post in our &lt;a href="https://testing.googleblog.com/2017/04/code-health-googles-internal-code.html" style="color: #4184f3; text-decoration-line: none;"&gt;Code Health&lt;/a&gt; series. A version of this post originally appeared in Google bathrooms worldwide as a Google &lt;a href="https://testing.googleblog.com/2007/01/introducing-testing-on-toilet.html" style="color: #4184f3; text-decoration-line: none;"&gt;Testing on the Toilet&lt;/a&gt; episode. &lt;/i&gt;&lt;/span&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px;"&gt;&lt;i&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;You can download a &lt;a href="https://docs.google.com/document/d/1JjZQl70z2vd8hgBy2nVp7am6cxdzLAh-ar-S_XRvF3s/edit" style="color: #4184f3; text-decoration-line: none;"&gt;printer-friendly version&lt;/a&gt; &lt;/span&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;to display in your office.&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px;"&gt;&lt;i&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;By Amy Fu&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif;"&gt;&lt;span id="docs-internal-guid-08507468-7fff-33cd-27e4-13c0de66fb2f"&gt;&lt;p dir="ltr" style="font-size: 17px; line-height: 1.2; margin-bottom: 5pt; margin-top: 10pt;"&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Although a product's requirements can change&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; &lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;often, its fundamental ideas usually change slowly. This leads to an interesting insight: &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;if we write code that matches the fundamental ideas of the product, it will be more likely to survive future product changes&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="font-size: 17px; line-height: 1.2; margin-bottom: 5pt; margin-top: 10pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Domain objects &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;are building blocks&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; (such as classes and interfaces) &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;in our code that match the fundamental ideas of the product&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;. Instead of writing code to match the desired &lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;behavior&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; for the product's requirements ("configure text to be white"), we match the underlying &lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;idea&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; ("text color settings").&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="font-size: 17px; line-height: 1.2; margin-bottom: 5pt; margin-top: 10pt;"&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;For example, imagine you’re part of the gPizza team, which sells tasty, fresh pizzas to feed hungry Googlers. Due to popular demand, your team has decided to add a delivery service.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="font-size: 17px; line-height: 1.2; margin-bottom: 5pt; margin-top: 10pt;"&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Without domain objects, the quickest path to pizza delivery is to simply create a &lt;/span&gt;&lt;span style="color: black; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;deliverPizza&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; method:&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="font-size: 17px; margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none;"&gt;&lt;colgroup&gt;&lt;col width="733"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #fff2cc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;public class DeliveryService {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;public void deliverPizza(&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;List&amp;lt;Pizza&amp;gt; pizzas&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;) { ... }&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="font-size: 17px; line-height: 1.2; margin-bottom: 5pt; margin-top: 10pt;"&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Although this works well at first, what happens if gPizza expands its offerings to other foods?&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;You could add a new method:&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="font-size: 17px; margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none;"&gt;&lt;colgroup&gt;&lt;col width="733"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #fff2cc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp; public void deliverWithDrinks(&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;List&amp;lt;Pizza&amp;gt; pizzas&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;, &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;List&amp;lt;Drink&amp;gt; drinks&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;) { ... }&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="font-size: 17px; line-height: 1.2; margin-bottom: 5pt; margin-top: 10pt;"&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;But &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;as your list of requirements&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;grows&lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; &lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;(snacks, sweets, etc.)&lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;, you’ll be stuck adding more and more methods. &lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;How can you change your initial implementation to avoid this continued maintenance burden?&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="font-size: 17px; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;You could &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;add a domain object that models the product's ideas, instead of its requirements&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;:&lt;/span&gt;&lt;/p&gt;&lt;ul style="font-size: 17px; margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="1" dir="ltr" style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;A &lt;/span&gt;&lt;span style="font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;use case&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; is a specific behavior that helps the product satisfy its business requirements.&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;(In this case, &lt;/span&gt;&lt;span style="font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;"Deliver pizzas so we make more money"&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;.)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;A domain object represents a common idea that is shared by several similar use cases.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p dir="ltr" style="font-size: 17px; line-height: 1.2; margin-bottom: 0pt; margin-top: 5pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;To&lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;identify the appropriate domain object, ask yourself&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;:&lt;/span&gt;&lt;/p&gt;&lt;ol style="font-size: 17px; margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="1" dir="ltr" style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: decimal; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.32; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;What &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;related use cases&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; does the product support, and what do we plan to support in future?&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p dir="ltr" style="font-size: 17px; line-height: 1.32; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="color: black; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;A: gPizza wants to deliver pizzas now, and eventually other products such as drinks and snacks.&lt;/span&gt;&lt;/p&gt;&lt;ol start="2" style="font-size: 17px; margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="1" dir="ltr" style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: decimal; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.32; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;What &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;common idea&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; do these use cases share?&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p dir="ltr" style="font-size: 17px; line-height: 1.32; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="color: black; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;A: gPizza wants to send the customer the food they ordered.&lt;/span&gt;&lt;/p&gt;&lt;ol start="3" style="font-size: 17px; margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="1" dir="ltr" style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: decimal; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.32; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;What is a &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;domain object&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; we can use to represent this common idea?&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p dir="ltr" style="font-size: 17px; line-height: 1.32; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="color: black; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;A: The domain object is a food order. We can encapsulate the use cases in a &lt;/span&gt;&lt;span style="color: black; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;FoodOrder&lt;/span&gt;&lt;span style="color: black; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; class.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="font-size: 17px; line-height: 1.2; margin-bottom: 10pt; margin-top: 5pt;"&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Domain objects can be a useful generalization - but avoid choosing objects that are &lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;too&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; generic, since there is a tradeoff between improved maintainability and more complex, ambiguous code. Generally, aim to &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;support only planned use cases - not all possible use cases&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; (see &lt;a href="https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it"&gt;YAGNI&lt;/a&gt; principles).&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="font-size: 17px; margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none;"&gt;&lt;colgroup&gt;&lt;col width="370"&gt;&lt;/col&gt;&lt;col width="370"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 21pt;"&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve; white-space: nowrap;"&gt;// GOOD: It's clear what we're delivering.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;public void deliver(&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;FoodOrder order&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;) {}&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve; white-space: nowrap;"&gt;// BAD: Don't support furniture delivery.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; white-space: nowrap;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;public void deliver(&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;DeliveryList items&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;) {}&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span id="docs-internal-guid-97958af4-7fff-3dd7-0034-880ffa587bd4"&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 8pt; margin-top: 8pt;"&gt;&lt;i style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17.3333px; white-space-collapse: preserve;"&gt;Learn more about domain objects and the more advanced topic of domain-driven design in the book &lt;a href="https://www.oreilly.com/library/view/domain-driven-design-tackling/0321125215/"&gt;Domain-Driven Design&lt;/a&gt; by Eric Evans.&lt;/i&gt;&lt;/p&gt;&lt;/span&gt;

&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/15045980/posts/default/7404242993300318308" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/15045980/posts/default/7404242993300318308" rel="self" type="application/atom+xml"/><link href="http://testing.googleblog.com/2024/09/write-change-resilient-code-with-domain.html" rel="alternate" title="Write Change-Resilient Code With Domain Objects" type="text/html"/><author><name>Google Testing Bloggers</name><uri>http://www.blogger.com/profile/03153388556673050910</uri><email>noreply@blogger.com</email><gd:image height="7" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdMvmFPVLU3JodSkp-aAbNab12mpvIjMuLkNIgbRH6LHNds3HjRtN56Q7wiZxoHklUQmwE97HdRbjTd4rnyuXMVroVk0ChzQOba6fs1doitqFw64aFHGjaikWMor7wQA/s1600/gtb3.png" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-15045980.post-7555491885889787348</id><published>2024-08-21T05:38:00.000-07:00</published><updated>2024-08-30T07:38:03.712-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Code Health"/><category scheme="http://www.blogger.com/atom/ns#" term="David Bendory"/><category scheme="http://www.blogger.com/atom/ns#" term="TotT"/><title type="text">Less Is More: Principles for Simple Comments</title><content type="html">&lt;style&gt;
@media only screen and (max-width: 600px) {
  .body {
    overflow-x: auto;
  }

  .post-content table, .post-content td {
    width: auto !important;
    white-space: nowrap;
  }
}
&lt;/style&gt;

&lt;div class="body"&gt;
&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17.3333px; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;i&gt;This is another post in our &lt;a href="https://testing.googleblog.com/2017/04/code-health-googles-internal-code.html" style="color: #4184f3; text-decoration-line: none;"&gt;Code Health&lt;/a&gt; series. A version of this post originally appeared in Google bathrooms worldwide as a Google &lt;a href="https://testing.googleblog.com/2007/01/introducing-testing-on-toilet.html" style="color: #4184f3; text-decoration-line: none;"&gt;Testing on the Toilet&lt;/a&gt; episode. &lt;/i&gt;&lt;/span&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px;"&gt;&lt;i&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;You can download a &lt;a href="https://docs.google.com/document/d/1mxkwnBoPNqhj4qW4Y23Kq-HfRl6T_wEg-eEVbG0raHk/edit" style="color: #4184f3; text-decoration-line: none;"&gt;printer-friendly version&lt;/a&gt; &lt;/span&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;to display in your office.&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px;"&gt;&lt;i&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;By David Bendory&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px;"&gt;&lt;span id="docs-internal-guid-9df73101-7fff-b5e5-f87c-3f0ecf1bb72e"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 0pt; text-align: left;"&gt;&lt;span style="color: black; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Simplicity is the ultimate sophistication.&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; — Leonardo da Vinci&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 0pt;"&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;You’re staring at a wall of code resembling a Gordian knot of Klingon. What’s making it worse? A sea of code comments so long that you’d need a bathroom break just to read them all! Let’s fix that.&lt;/span&gt;&lt;/p&gt;&lt;ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="1" dir="ltr" style="color: black; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; list-style-type: disc; margin-left: -18pt; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 0pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;Adopt the mindset of someone unfamiliar with the project to ensure simplicity. &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap: wrap; vertical-align: baseline;"&gt;One approach is to separate the process of writing your comments from reviewing them; proofreading your comments without code context in mind helps ensure they are clear and concise for future readers.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="1" dir="ltr" style="color: black; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; list-style-type: disc; margin-left: -18pt; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 0pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;Use self-contained comments to clearly convey intent without relying on the surrounding code for context. &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap: wrap; vertical-align: baseline;"&gt;If you need to read the code to understand the comment, you’ve got it backwards!&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div align="left" dir="ltr" style="margin-left: 15pt;"&gt;&lt;table style="border-collapse: collapse; border: none;"&gt;&lt;colgroup&gt;&lt;col width="349"&gt;&lt;/col&gt;&lt;col width="125"&gt;&lt;/col&gt;&lt;col width="239"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: -4.32pt -4.32pt -4.32pt -4.32pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;span style="font-size: 11pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Not self-contained; requires reading the code&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td colspan="2" style="border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: -4.32pt -4.32pt -4.32pt -4.32pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;span style="font-size: 11pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Suggested alternative&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 15.76pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;// Respond to flashing lights in
// rearview&lt;/span&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; white-space-collapse: preserve;"&gt; mirror.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td colspan="2" style="background-color: #d9ead3; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;// Pull over for police and/or yield to&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;// emergency vehicles.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 15.76pt;"&gt;&lt;td colspan="3" style="background-color: #efefef; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;while flashing_lights_in_rearview_mirror() {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Roboto Mono, monospace;"&gt;&lt;span style="font-size: 13.3333px; white-space-collapse: preserve;"&gt;if !move_to_slower_lane() {
        stop_on_shoulder();
    }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="1" dir="ltr" style="color: black; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 5pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;Include only essential information in the comments and leverage external references to reduce cognitive load on the reader. &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;For comments suggesting improvements, links to relevant bugs or docs keep comments concise while providing a path for follow-up. Note that linked docs may be inaccessible, so use judgment in deciding how much context to include directly in the comments.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div align="left" dir="ltr" style="margin-left: 15pt;"&gt;&lt;table style="border-collapse: collapse; border: none;"&gt;&lt;colgroup&gt;&lt;col width="347"&gt;&lt;/col&gt;&lt;col width="366"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 13.5pt;"&gt;&lt;td style="border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: -4.32pt -4.32pt -4.32pt -4.32pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;span style="font-size: 11pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Too much potential improvement in the comment&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: -4.32pt -4.32pt -4.32pt -4.32pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;span style="font-size: 11pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Suggested alternative&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;// The local bus offers good average-
// case &lt;/span&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; white-space-collapse: preserve;"&gt;performance. Consider using
// the subway&lt;/span&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; white-space-collapse: preserve;"&gt; which may be faster&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; white-space-collapse: preserve;"&gt;// depending on &lt;/span&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; white-space-collapse: preserve;"&gt;factors like time of
// day, weather, etc.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;// TODO: Consider various factors to
// present&lt;/span&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; white-space-collapse: preserve;"&gt; the best transit option.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;// See &lt;/span&gt;&lt;a href="https://www.google.com/search?q=bus+vs+subway" style="text-decoration-line: none;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;issuetracker.fake/bus-vs-subway&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 15.76pt;"&gt;&lt;td colspan="2" style="background-color: #efefef; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;commute_by_local_bus();&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="1" dir="ltr" style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; list-style-type: disc; margin-left: -18pt; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 5pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;Avoid extensive implementation details in function-level comments. &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap: wrap; vertical-align: baseline;"&gt;When implementations change, such details often result in outdated comments. Instead, describe the public API contract, focusing on &lt;/span&gt;&lt;span style="font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap: wrap; vertical-align: baseline;"&gt;what&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap: wrap; vertical-align: baseline;"&gt; the function does.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div align="left" dir="ltr" style="margin-left: 15pt;"&gt;&lt;table style="border-collapse: collapse; border: none;"&gt;&lt;colgroup&gt;&lt;col width="347"&gt;&lt;/col&gt;&lt;col width="366"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: -4.32pt -4.32pt -4.32pt -4.32pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;span style="font-size: 11pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Too much implementation detail&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: -4.32pt -4.32pt -4.32pt -4.32pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;span style="font-size: 11pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Suggested alternative&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 15.76pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;// For high-traffic intersections
// prone to&lt;/span&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; white-space-collapse: preserve;"&gt; accidents, pass through
// the inters&lt;/span&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; white-space-collapse: preserve;"&gt;ection and make 3 right
// turns, which&lt;/span&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; white-space-collapse: preserve;"&gt; is equivalent to
// turning left.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;// Perform a safe left turn at a&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;// high-traffic intersection.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;// See discussion in&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;// &lt;/span&gt;&lt;a href="https://web.archive.org/web/20240804111208/https://www.popularmechanics.com/science/a36620755/eliminate-left-turns/" style="text-decoration-line: none;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;dangerous-left-turns.fake/about&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 15.76pt;"&gt;&lt;td colspan="2" style="background-color: #efefef; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;fn safe_turn_left() {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;go_straight();&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;for i in 0..3 &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;turn_right();&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/15045980/posts/default/7555491885889787348" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/15045980/posts/default/7555491885889787348" rel="self" type="application/atom+xml"/><link href="http://testing.googleblog.com/2024/08/less-is-more-principles-for-simple.html" rel="alternate" title="Less Is More: Principles for Simple Comments" type="text/html"/><author><name>Google Testing Bloggers</name><uri>http://www.blogger.com/profile/03153388556673050910</uri><email>noreply@blogger.com</email><gd:image height="7" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdMvmFPVLU3JodSkp-aAbNab12mpvIjMuLkNIgbRH6LHNds3HjRtN56Q7wiZxoHklUQmwE97HdRbjTd4rnyuXMVroVk0ChzQOba6fs1doitqFw64aFHGjaikWMor7wQA/s1600/gtb3.png" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-15045980.post-7785322005143614260</id><published>2024-07-16T06:00:00.000-07:00</published><updated>2024-07-16T06:00:07.471-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Code Health"/><category scheme="http://www.blogger.com/atom/ns#" term="Elliotte Rusty Harold"/><category scheme="http://www.blogger.com/atom/ns#" term="TotT"/><title type="text">In Praise of Small Pull Requests</title><content type="html">&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17.3333px; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;i&gt;This is another post in our &lt;a href="https://testing.googleblog.com/2017/04/code-health-googles-internal-code.html"&gt;Code Health&lt;/a&gt; series. A version of this post originally appeared in Google bathrooms worldwide as a Google &lt;a href="https://testing.googleblog.com/2007/01/introducing-testing-on-toilet.html"&gt;Testing on the Toilet&lt;/a&gt; episode. &lt;/i&gt;&lt;/span&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif;"&gt;&lt;span&gt;&lt;i&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;You can download a &lt;a href="https://docs.google.com/document/d/1QIe9iOWKcToOL2Er7gH-dzacGnShEuO5CPVmiN7dQtk/edit"&gt;printer-friendly version&lt;/a&gt; &lt;/span&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;to display in your office.&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span style="font-family: Times New Roman, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)"&gt;&lt;span style="font-family: Times New Roman, serif; font-size: 17.3333px; white-space-collapse: preserve;"&gt;By Elliotte Rusty Harold&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)"&gt;&lt;span style="font-family: Times New Roman, serif; font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)"&gt;&lt;span style="font-family: Times New Roman, serif; font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;span style="font-size: 17.3333px; font-style: italic;"&gt;Note: A “pull request” refers to one self-contained change that has been submitted to version control or which is undergoing code review. At Google, this is referred to as a“CL”, which is short for “changelist”.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)"&gt;&lt;span style="font-family: Times New Roman, serif; font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;span style="font-size: 17.3333px; font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)"&gt;&lt;span style="font-family: Times New Roman, serif; font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;Prefer &lt;/span&gt;&lt;a href="https://google.github.io/eng-practices/review/developer/small-cls.html" style="font-size: 17.3333px; text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;small, focused pull requests&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt; that do exactly one thing each. &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;Why? Several reasons:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif;"&gt;&lt;span style="white-space-collapse: preserve;"&gt;&lt;span id="docs-internal-guid-a741591b-7fff-15eb-f2e8-dec66b666179"&gt;&lt;ul style="font-size: 17.3333px; margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="1" dir="ltr" style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; text-wrap: nowrap; vertical-align: baseline;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 5pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;Small pull requests are easier to review&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;. A mistake in a focused pull request is more obvious. In a 40 file pull request that does several things, would you notice that one &lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;if&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; statement had reversed the logic it should have and was using &lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;true&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; instead of &lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;false&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;? By contrast, if that &lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;if&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; block and its test were the only things that changed in a pull request, you’d be a lot more likely to catch the error.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; text-wrap: nowrap; vertical-align: baseline;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 5pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;Small pull requests can be reviewed quickly&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;. A reviewer can often respond quickly by slipping small reviews in between other tasks. Larger pull requests are a big task by themselves, often waiting until the reviewer has a significant chunk of time.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; text-wrap: nowrap; vertical-align: baseline;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 5pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;If something does go wrong and your continuous build breaks on a small pull request, &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;the small size makes it much easier to figure out exactly where the mistake is&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;. They are also easier to rollback if something goes wrong.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; text-wrap: nowrap; vertical-align: baseline;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 5pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;By virtue of their size, &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;small pull requests are less likely to conflict with other developers’ work&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;. Merge conflicts are less frequent and easier to resolve.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; text-wrap: nowrap; vertical-align: baseline;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 5pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;If you’ve made a critical error&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;it saves a lot of work&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; when the reviewer can point this out after you’ve only gone a little way down the wrong path. Better to find out after an hour than after several weeks.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; text-wrap: nowrap; vertical-align: baseline;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 5pt;"&gt;&lt;span style="font-size: 13pt; text-wrap: wrap;"&gt;Pull request descriptions are more accurate when pull requests are focused on one task. The revision history becomes easier to read.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; text-wrap: nowrap; vertical-align: baseline;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 5pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;Small pull requests can lead to increased code coverage because &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;it’s easier to make sure each individual pull request is completely tested.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;Small pull requests are not always possible&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;. In particular:&lt;/span&gt;&lt;/div&gt;&lt;p dir="ltr" style="font-size: 17.3333px; line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Times New Roman',serif; font-size: 13pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style="font-size: 17.3333px; margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="1" dir="ltr" style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; text-wrap: nowrap; vertical-align: baseline;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 5pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;Frequent pull requests require reviewers to respond quickly&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; to code review requests. If it takes multiple hours to get a pull request reviewed, developers spend more time blocked. Small pull requests often work better when reviewers are co-located (ideally within Nerf gun range for gentle reminders).&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; text-wrap: nowrap; vertical-align: baseline;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 5pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;Some features cannot safely be committed in partial states. If this is a concern, try to put the new feature behind a &lt;/span&gt;&lt;a href="https://martinfowler.com/articles/feature-toggles.html" style="font-size: 13pt; text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap: wrap; vertical-align: baseline;"&gt;flag&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; text-wrap: nowrap; vertical-align: baseline;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 5pt;"&gt;&lt;span style="font-size: 13pt; text-wrap: wrap;"&gt;Refactorings such as changing an argument type in a public method may require modifying many dozens of files at once.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;Nonetheless, &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;even if a pull request can’t be small, it can still be focused&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;, e.g., fixing one bug, adding one feature or UI element, or refactoring one method.&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/15045980/posts/default/7785322005143614260" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/15045980/posts/default/7785322005143614260" rel="self" type="application/atom+xml"/><link href="http://testing.googleblog.com/2024/07/in-praise-of-small-pull-requests.html" rel="alternate" title="In Praise of Small Pull Requests" type="text/html"/><author><name>Google Testing Bloggers</name><uri>http://www.blogger.com/profile/03153388556673050910</uri><email>noreply@blogger.com</email><gd:image height="7" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdMvmFPVLU3JodSkp-aAbNab12mpvIjMuLkNIgbRH6LHNds3HjRtN56Q7wiZxoHklUQmwE97HdRbjTd4rnyuXMVroVk0ChzQOba6fs1doitqFw64aFHGjaikWMor7wQA/s1600/gtb3.png" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-15045980.post-3655671773377273563</id><published>2024-05-28T07:20:00.000-07:00</published><updated>2024-05-28T07:20:46.984-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Code Health"/><category scheme="http://www.blogger.com/atom/ns#" term="Dan Maksimovich"/><category scheme="http://www.blogger.com/atom/ns#" term="TotT"/><title type="text">Don't DRY Your Code Prematurely</title><content type="html">&lt;style&gt;
@media only screen and (max-width: 600px) {
  .body {
    overflow-x: auto;
  }

  .post-content table, .post-content td {
    width: auto !important;
    white-space: nowrap;
  }
}
&lt;/style&gt;

&lt;div class="body"&gt;
&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17.3333px; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;i&gt;This is another post in our &lt;a href="https://testing.googleblog.com/2017/04/code-health-googles-internal-code.html" style="color: #4184f3; text-decoration-line: none;"&gt;Code Health&lt;/a&gt; series. A version of this post originally appeared in Google bathrooms worldwide as a Google &lt;a href="https://testing.googleblog.com/2007/01/introducing-testing-on-toilet.html" style="color: #4184f3; text-decoration-line: none;"&gt;Testing on the Toilet&lt;/a&gt; episode. &lt;/i&gt;&lt;/span&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;You can download a &lt;a href="https://docs.google.com/document/d/1zdQswED3Ru7eTqeDZpx3SEaUmUZC1wegmL3_fHwgrQk/edit" style="color: #4184f3; text-decoration-line: none;"&gt;printer-friendly version&lt;/a&gt; to display in your office.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;By &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Times New Roman, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;Dan Maksimovich&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span id="docs-internal-guid-8ef5dba7-7fff-2b8b-254d-df7a8f216e1e"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Many of us have been told the virtues of &lt;/span&gt;&lt;a href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;“Don’t Repeat Yourself”&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; or DRY. Pause and consider: &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Is the duplication truly redundant or will the functionality need to evolve independently over time&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;?&amp;nbsp; &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Applying DRY principles too rigidly leads to premature abstractions that make future changes more complex than necessary.&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Consider carefully if code is truly redundant or just superficially similar.&lt;/span&gt;&lt;span style="color: #990000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;While functions or classes may look the same, they may also serve different contexts and business requirements that evolve differently over time. Think about how the functions’ purpose holds with time, not just about making the code shorter. &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;When designing abstractions, do not prematurely couple behaviors that may evolve separately in the longer term.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 0pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;When does introducing an abstraction harm our code? Let’s consider the following code:&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none;"&gt;&lt;colgroup&gt;&lt;col width="358"&gt;&lt;/col&gt;&lt;col width="382"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 126.75pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;# Premature DRY abstraction assuming
# uniform rules, limiting entity-&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;# specific changes.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;class DeadlineSetter:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span id="docs-internal-guid-fbd4cdb1-7fff-8649-12e7-e669bef58618"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;def &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;__init__&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;(self, entity_type):&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; &amp;nbsp; self.entity_type = entity_type&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;def &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;set_deadline&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;(self, deadline):&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp; if deadline &amp;lt;= datetime.now():&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; white-space-collapse: preserve;"&gt;raise ValueError(&lt;/span&gt;&lt;/p&gt;&lt;span id="docs-internal-guid-1e16987c-7fff-b54f-bf4e-8bcea2724f43"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;    “Date must be in the future”)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;task = DeadlineSetter(“task”)&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;task.&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;set_deadline&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;(&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;    datetime(2024, 3, 12))&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;payment = DeadlineSetter(“payment”)&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;payment.&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;set_deadline&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;(&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;    datetime(2024, 3, 18))&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;# Repetitive but allows for clear,&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;# entity-&lt;/span&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; white-space-collapse: preserve;"&gt;specific logic and future&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; white-space-collapse: preserve;"&gt;# changes.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;def &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;set_task_deadline&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;(task_deadline):&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp; if task_deadline &amp;lt;= datetime.now():&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span id="docs-internal-guid-9d077eb1-7fff-3387-621e-b7f91b936a73"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; white-space-collapse: preserve;"&gt;raise ValueError(&lt;/span&gt;&lt;/p&gt;&lt;span id="docs-internal-guid-9d077eb1-7fff-3387-621e-b7f91b936a73"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; &amp;nbsp; &amp;nbsp;    “Date must be in the future”)
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;def &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;set_payment_deadline&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;(
&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; white-space-collapse: preserve;"&gt;    payment_deadline):&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp; if payment_deadline &amp;lt;= datetime.now():&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; white-space-collapse: preserve;"&gt;raise ValueError(&lt;/span&gt;&lt;/p&gt;&lt;span id="docs-internal-guid-9d077eb1-7fff-3387-621e-b7f91b936a73"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; &amp;nbsp; &amp;nbsp;    “Date must be in the future”)
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;set_task_deadline&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;(&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;    datetime(2024, 3, 12))&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;set_payment_deadline&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;(&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;    datetime(2024, 3, 18))&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 5pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;The approach on the right seems to violate the DRY principle since the &lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;ValueError&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; checks are &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;coincidentally&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; the same.&amp;nbsp; However, tasks and payments represent distinct concepts with potentially diverging logic. &lt;/span&gt;&lt;span style="background-color: white; color: #1f1f1f; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;If payment date later required a new validation, you could easily add it to the right-hand code; adding it to the left-hand code is much more invasive.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 10pt;"&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;When in doubt, keep behaviors separate until enough common patterns emerge over time that justify the coupling&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;. On a small scale, managing duplication can be simpler than resolving a premature abstraction’s complexity. &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;In early stages of development, tolerate a little duplication and wait to abstract.&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 10pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Future requirements are often unpredictable. Think about the &lt;/span&gt;&lt;a href="https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;“You Aren’t Gonna Need It”&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; or YAGNI principle. Either the duplication will prove to be a nonissue, or with time, it will clearly indicate the need for a well-considered abstraction.&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/15045980/posts/default/3655671773377273563" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/15045980/posts/default/3655671773377273563" rel="self" type="application/atom+xml"/><link href="http://testing.googleblog.com/2024/05/dont-dry-your-code-prematurely.html" rel="alternate" title="Don't DRY Your Code Prematurely" type="text/html"/><author><name>Google Testing Bloggers</name><uri>http://www.blogger.com/profile/03153388556673050910</uri><email>noreply@blogger.com</email><gd:image height="7" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdMvmFPVLU3JodSkp-aAbNab12mpvIjMuLkNIgbRH6LHNds3HjRtN56Q7wiZxoHklUQmwE97HdRbjTd4rnyuXMVroVk0ChzQOba6fs1doitqFw64aFHGjaikWMor7wQA/s1600/gtb3.png" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-15045980.post-3095501520488840039</id><published>2024-05-20T06:42:00.000-07:00</published><updated>2024-05-24T08:19:30.969-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Code Health"/><category scheme="http://www.blogger.com/atom/ns#" term="Gene Volovich"/><category scheme="http://www.blogger.com/atom/ns#" term="TotT"/><title type="text">Avoid the Long Parameter List</title><content type="html">&lt;style&gt;
@media only screen and (max-width: 600px) {
  .body {
    overflow-x: auto;
  }
}
  
@media (max-width: 480px), (max-height: 480px) {
.post-content table, .post-content td {
   width: auto !important;
   white-space: nowrap;
  }
}
&lt;/style&gt;

&lt;div class="body"&gt;
&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17.3333px; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;i&gt;This is another post in our &lt;a href="https://testing.googleblog.com/2017/04/code-health-googles-internal-code.html" style="color: #4184f3; text-decoration-line: none;"&gt;Code Health&lt;/a&gt; series. A version of this post originally appeared in Google bathrooms worldwide as a Google &lt;a href="https://testing.googleblog.com/2007/01/introducing-testing-on-toilet.html" style="color: #4184f3; text-decoration-line: none;"&gt;Testing on the Toilet&lt;/a&gt; episode. &lt;/i&gt;&lt;/span&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;You can download a &lt;a href="https://docs.google.com/document/d/1lExiubN_NSaQySGO4vk-E0pXYeOI6-diMB2c0hMbi7E/edit" style="color: #4184f3; text-decoration-line: none;"&gt;printer-friendly version&lt;/a&gt; to display in your office.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)"&gt;&lt;span style="font-family: Times New Roman, serif; font-size: 17.3333px; white-space-collapse: preserve;"&gt;By Gene Volovich&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)"&gt;&lt;span style="font-family: Times New Roman, serif; font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)"&gt;&lt;span style="font-family: Times New Roman, serif; font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;span id="docs-internal-guid-cc474458-7fff-0cec-a5ac-9c7d6c3f6d9c"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Times New Roman',serif; font-size: 13pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;Have you seen code like this?&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none; table-layout: fixed; width: 540pt;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;void transform(String fileIn, String fileOut, String separatorIn, String separatorOut);&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 5pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Times New Roman',serif; font-size: 13pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;span id="docs-internal-guid-3662419f-7fff-210f-b9d8-7785befae640"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;This seems simple enough, but it can be difficult to remember the parameter ordering. &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;It gets worse if you add more parameters&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; (e.g., to specify the encoding, or to email the resulting file):&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none; table-layout: fixed; width: 540pt;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;void transform(String fileIn, String fileOut, String separatorIn, String separatorOut,&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String encoding, String mailTo, String mailSubject, String mailTemplate);&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 5pt;"&gt;&lt;span id="docs-internal-guid-5d9b0619-7fff-f7bb-c2b8-e13d65a05205"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;To make the change, will you add another (overloaded) &lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;transform&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; method? Or add more parameters to the existing method, and update every single call to &lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;transform&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;? Neither seems satisfactory.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 5pt;"&gt;&lt;span id="docs-internal-guid-87b11346-7fff-5a23-d31f-bf7e001afe5d"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;One solution is to encapsulate groups of the parameters into meaningful objects&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;. The &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt;"&gt;CsvFile&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; class used here is a “value object” &lt;/span&gt;&lt;span face="Consolas, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;—&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; simply a holder for the data.&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none; table-layout: fixed; width: 540pt;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;class &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;CsvFile&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt; {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;CsvFile(String filename, String separator, String encoding) { ... }&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;String filename() { return filename; }&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;String separator() { return separator; }&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;String encoding() { return encoding; }&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;} &lt;/span&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;// ... and do the same for the EmailMessage class&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;void transform(&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;CsvFile &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;src&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;, CsvFile &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;target&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;, EmailMessage &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;resultMsg) { ... }&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span id="docs-internal-guid-e9202146-7fff-fd5f-e872-778d2be0fb97"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;How to define a value object varies by language. For example, in Java, &lt;span id="docs-internal-guid-9feb89b1-7fff-26da-f2a2-26954f2e30f2"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;you can use a &lt;/span&gt;&lt;a href="https://docs.oracle.com/en/java/javase/19/language/records.html" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;record class&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;, which is available in Java 16+ (for older versions of Java, you can use &lt;/span&gt;&lt;a href="https://github.com/google/auto/blob/main/value/userguide/index.md" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;AutoValue&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; to generate code for the value object); in Kotlin, you can use a &lt;/span&gt;&lt;a href="https://kotlinlang.org/docs/data-classes.html" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;data class&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;; in C++, you can use an &lt;/span&gt;&lt;a href="https://abseil.io/tips/173" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;option struct&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span id="docs-internal-guid-cf9b882d-7fff-7f9d-8764-48574ed70df4"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;Using a value object this way may still result in a long parameter list when instantiating it. Solutions for this vary by language. For example, in Python, you can use keyword arguments and default parameter values to shorten the parameter list; &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;in Java, one option is to use the &lt;/span&gt;&lt;a href="https://en.wikipedia.org/wiki/Builder_pattern" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;Builder&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt; pattern&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;, which lets you call a separate function to set each field, and allows you to skip setting fields that have default values.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none; table-layout: fixed; width: 540pt;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;CsvFile&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt; src = CsvFile.builder().&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;setFilename&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;("a.txt").&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;setSeparator&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;(":").build();&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;CsvFile&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt; target = CsvFile.builder().&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;setFilename&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;("b.txt").&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;setEncoding&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;(UTF_8).build();&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;EmailMessage&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt; msg =&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EmailMessage.builder().&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;setMailTo&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;(rcpt).&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;setMailTemplate&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;("template").build();&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;transform(src, target, msg);&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 0pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;
Always try to group data that belongs together and break up long, complicated parameter lists&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;. The result will be code that is easier to read and maintain, and harder to make mistakes with.&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/15045980/posts/default/3095501520488840039" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/15045980/posts/default/3095501520488840039" rel="self" type="application/atom+xml"/><link href="http://testing.googleblog.com/2024/05/avoid-long-parameter-list.html" rel="alternate" title="Avoid the Long Parameter List" type="text/html"/><author><name>Google Testing Bloggers</name><uri>http://www.blogger.com/profile/03153388556673050910</uri><email>noreply@blogger.com</email><gd:image height="7" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdMvmFPVLU3JodSkp-aAbNab12mpvIjMuLkNIgbRH6LHNds3HjRtN56Q7wiZxoHklUQmwE97HdRbjTd4rnyuXMVroVk0ChzQOba6fs1doitqFw64aFHGjaikWMor7wQA/s1600/gtb3.png" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-15045980.post-1796746672395990587</id><published>2024-05-06T06:26:00.000-07:00</published><updated>2025-02-14T07:42:36.918-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Titus Winters"/><category scheme="http://www.blogger.com/atom/ns#" term="TotT"/><title type="text"> Test Failures Should Be Actionable</title><content type="html">&lt;style&gt;
@media only screen and (max-width: 600px) {
  .body {
    overflow-x: auto;
  }
}
  
@media (max-width: 480px), (max-height: 480px) {
.post-content table, .post-content td {
   width: auto !important;
   white-space: nowrap;
  }
}
&lt;/style&gt;

&lt;div class="body"&gt;
&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;This article was adapted from a Google &lt;/span&gt;&lt;a href="http://googletesting.blogspot.com/2007/01/introducing-testing-on-toilet.html" style="color: #4184f3; font-family: Roboto, sans-serif; font-size: 17px; text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;Testing on the Toilet&lt;/span&gt;&lt;/a&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; (TotT) episode. You can download a &lt;/span&gt;&lt;a href="https://docs.google.com/document/d/1YdwFRS4UEMlDVc3cUtVF9wB9xKODgcMCf7vYGKNdKTU/edit" style="color: #4184f3; font-family: Roboto, sans-serif; font-size: 17px; text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;printer-friendly version&lt;/span&gt;&lt;/a&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; of this TotT episode and post it in your office.&lt;/span&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Times New Roman, serif;"&gt;&lt;span style="white-space-collapse: preserve;"&gt;By Titus Winters&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Times New Roman, serif;"&gt;&lt;span style="white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Times New Roman, serif;"&gt;&lt;span style="white-space-collapse: preserve;"&gt;&lt;span id="docs-internal-guid-228c93f9-7fff-4e48-eb88-fc1834289eac"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 8pt; margin-top: 0pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;There are a &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;lot&lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt; of rules and best practices around unit testing&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;. There are many posts on this blog; there is deeper material in the &lt;/span&gt;&lt;a href="https://abseil.io/resources/swe-book" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;Software Engineering at Google&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; book; there is specific guidance for every major language; there is guidance on test frameworks, test naming, and dozens of other test-related topics. Isn’t this excessive?&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 8pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;Good unit tests contain &lt;/span&gt;&lt;a href="https://abseil.io/resources/swe-book/html/ch12.html" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;several important properties&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;, but you could focus on a key principle: &lt;/span&gt;&lt;span style="font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;Test failures should be actionable.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 8pt; margin-top: 0pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;When a test fails, you should be able to begin investigation with nothing more than the test’s name and its failure messages&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;—no need to add more information and rerun the test.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 8pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;Effective use of unit test frameworks and assertion libraries (&lt;/span&gt;&lt;a href="https://junit.org/" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;JUnit&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://truth.dev/" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;Truth&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://docs.pytest.org/en/8.0.x/" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;pytest&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://google.github.io/googletest/" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;GoogleTest&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;, etc.) &lt;/span&gt;&lt;span style="background-color: white; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;serves two important purposes. Firstly, the more precisely we express the invariants we are testing, the more informative and less &lt;/span&gt;&lt;a href="https://testing.googleblog.com/2024/04/how-i-learned-to-stop-writing-brittle.html" style="text-decoration-line: none;"&gt;&lt;span style="background-color: white; color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;brittle&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: white; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; our tests will be. Secondly, when those invariants don’t hold and the tests fail, the failure info should be immediately actionable. This meshes well with &lt;/span&gt;&lt;a href="https://sre.google/sre-book/monitoring-distributed-systems/#:~:text=Tying%20These%20Principles,user%2Dvisible%3F25" style="text-decoration-line: none;"&gt;&lt;span style="background-color: white; color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;Site Reliability Engineering guidance&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: white; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; on alerting.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;Consider this example of a C++ unit test of a function returning an &lt;/span&gt;&lt;span style="color: #38761d; font-family: &amp;quot;Source Code Pro&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;absl::Status&lt;/span&gt;&lt;span style="color: #38761d; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;(an &lt;/span&gt;&lt;a href="https://abseil.io/" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;Abseil&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; type that returns either an “OK” status or one of a number of different error codes):&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none; table-layout: fixed; white-space: nowrap;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 3.6pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Source Code Pro&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;EXPECT_TRUE&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Source Code Pro&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;(LoadMetadata().ok());&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 3.6pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Source Code Pro&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;EXPECT_OK&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Source Code Pro&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;(LoadMetadata());&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 12pt;"&gt;&lt;td colspan="2" style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: middle;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 3pt; margin-top: 0pt; text-align: center;"&gt;&lt;span style="font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Sample failure output&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 3.6pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Source Code Pro&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;load_metadata_test.cc:42: Failure&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Source Code Pro&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Value of: LoadMetadata().ok()&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Source Code Pro&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Expected: true&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Source Code Pro&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Actual: false&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 3.6pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Source Code Pro&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;load_metadata_test.cc:42: Failure&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Source Code Pro&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Value of: LoadMetadata()&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Source Code Pro&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Expected: is OK&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Source Code Pro&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Actual: NOT_FOUND: /path/to/metadata.bin&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 8pt; margin-top: 15pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;If the test on the left fails, you have to investigate why the test failed; the test on the right immediately gives you all the available detail, in this case because of a more precise &lt;/span&gt;&lt;a href="https://google.github.io/googletest/reference/matchers.html" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;GoogleTest matcher&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 0pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;Here are some other posts on this blog that emphasize making test failures actionable:&lt;/span&gt;&lt;/p&gt;&lt;ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="1" dir="ltr" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; text-wrap: nowrap; vertical-align: baseline;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 2pt; margin-top: 0pt;"&gt;&lt;a href="https://testing.googleblog.com/2014/10/testing-on-toilet-writing-descriptive.html" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap: wrap; vertical-align: baseline;"&gt;Writing Descriptive Test Names&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; - If our tests are narrow and sufficiently descriptive, the test name itself may give us enough information to start debugging.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; text-wrap: nowrap; vertical-align: baseline;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 2pt; margin-top: 0pt;"&gt;&lt;a href="https://testing.googleblog.com/2018/06/testing-on-toilet-keep-tests-focused.html" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap: wrap; vertical-align: baseline;"&gt;Keep Tests Focused&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; - If we test multiple scenarios in a single test, it’s hard to identify&amp;nbsp; exactly what went wrong.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; text-wrap: nowrap; vertical-align: baseline;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 2pt; margin-top: 0pt;"&gt;&lt;a href="https://testing.googleblog.com/2024/04/prefer-narrow-assertions-in-unit-tests.html" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap: wrap; vertical-align: baseline;"&gt;Prefer Narrow Assertions in Unit Tests&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; - If we have overly wide assertions (such as&amp;nbsp; depending on every field of a complex output &lt;/span&gt;&lt;a href="https://protobuf.dev/" style="font-size: 14.6667px; text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap: wrap; vertical-align: baseline;"&gt;protocol buffer&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; text-wrap-mode: wrap;"&gt;), the test may fail for many unimportant reasons. False positives are the opposite of actionable.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; text-wrap: nowrap; vertical-align: baseline;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 2pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;&lt;a href="https://testing.googleblog.com/2017/01/testing-on-toilet-keep-cause-and-effect.html" style="font-size: medium; text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;Keep Cause and Effect Clear&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; - Refrain from using large global test data structures shared across multiple unit tests, allowing for clear identification of each test’s setup.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/15045980/posts/default/1796746672395990587" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/15045980/posts/default/1796746672395990587" rel="self" type="application/atom+xml"/><link href="http://testing.googleblog.com/2024/05/test-failures-should-be-actionable.html" rel="alternate" title=" Test Failures Should Be Actionable" type="text/html"/><author><name>Google Testing Bloggers</name><uri>http://www.blogger.com/profile/03153388556673050910</uri><email>noreply@blogger.com</email><gd:image height="7" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdMvmFPVLU3JodSkp-aAbNab12mpvIjMuLkNIgbRH6LHNds3HjRtN56Q7wiZxoHklUQmwE97HdRbjTd4rnyuXMVroVk0ChzQOba6fs1doitqFw64aFHGjaikWMor7wQA/s1600/gtb3.png" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-15045980.post-5280176152908347979</id><published>2024-04-25T06:14:00.000-07:00</published><updated>2024-05-24T08:19:59.729-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Code Health"/><category scheme="http://www.blogger.com/atom/ns#" term="TotT"/><category scheme="http://www.blogger.com/atom/ns#" term="Yiming Sun"/><title type="text">isBooleanTooLongAndComplex</title><content type="html">&lt;style&gt;
@media only screen and (max-width: 600px) {
  .body {
    overflow-x: auto;
  }
}
  
@media (max-width: 480px), (max-height: 480px) {
.post-content table, .post-content td {
   width: auto !important;
   white-space: nowrap;
  }
}
&lt;/style&gt;

&lt;div class="body"&gt;
&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17.3333px; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;i&gt;This is another post in our &lt;a href="https://testing.googleblog.com/2017/04/code-health-googles-internal-code.html" style="color: #4184f3; text-decoration-line: none;"&gt;Code Health&lt;/a&gt; series. A version of this post originally appeared in Google bathrooms worldwide as a Google &lt;a href="https://testing.googleblog.com/2007/01/introducing-testing-on-toilet.html" style="color: #4184f3; text-decoration-line: none;"&gt;Testing on the Toilet&lt;/a&gt; episode. &lt;/i&gt;&lt;/span&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;You can download a &lt;a href="https://docs.google.com/document/d/11nk0lxX6DHBq8AJtMtJnnLKf5CG3KTcntUBhVTKWRLg/edit" style="color: #4184f3; text-decoration-line: none;"&gt;printer-friendly version&lt;/a&gt; to display in your office.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="body"&gt;&lt;span style="font-family: Times New Roman, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="body"&gt;&lt;span style="font-family: Times New Roman, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;By Yiming Sun&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="body"&gt;&lt;span style="font-family: Times New Roman, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;span id="docs-internal-guid-d49e8766-7fff-1240-7b40-6aea32795fa7"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 5pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;You may have come across some complex, hard-to-read Boolean expressions in your codebase and wished they were easier to understand. For example, let's say we want to decide whether a pizza is fantastic:&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none;"&gt;&lt;colgroup&gt;&lt;col width="733"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;// Decide whether this pizza is fantastic.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;if ((!pepperoniService.empty() || sausages.size() &amp;gt; 0)&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;amp;&amp;amp; (useOnionFlag.get() || hasMushroom(ENOKI, PORTOBELLO)) &amp;amp;&amp;amp; hasCheese()) {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 8pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;...&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 10pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;A first step toward improving this is to extract the condition into a well-named variable:&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none;"&gt;&lt;colgroup&gt;&lt;col width="733"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #fff2cc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;boolean &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;isPizzaFantastic&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; =&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(!pepperoniService.empty() || sausages.size() &amp;gt; 0)&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;amp;&amp;amp; (useOnionFlag.get() || hasMushroom(ENOKI, PORTOBELLO)) &amp;amp;&amp;amp; hasCheese();&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;if (isPizzaFantastic&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;) {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 8pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;...&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 10pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;However, the Boolean expression is still too complex. &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;It's potentially confusing to calculate the value of &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;isPizzaFantastic&lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt; from a given set of inputs&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;You might need to grab a pen and paper, or start a server locally and set breakpoints.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 10pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;Instead, try to &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;group the details into intermediate Booleans that provide meaningful abstractions&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;. Each Boolean below represents a single well-defined quality, and you no longer need to mix &lt;/span&gt;&lt;span style="color: #188038; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; and &lt;/span&gt;&lt;span style="color: #188038; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;||&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; within an expression. Without changing the business logic, you’ve made it easier to see how the Booleans relate to each other:&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none; table-layout: fixed; width: 497pt;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;boolean hasGoodMeat = !pepperoniService.empty() || sausages.size() &amp;gt; 0;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;boolean hasGoodVeggies = useOnionFlag.get() || hasMushroom(ENOKI, PORTOBELLO);&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;boolean &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;isPizzaFantastic&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; = hasGoodMeat &amp;amp;&amp;amp; hasGoodVeggies &amp;amp;&amp;amp; hasCheese();&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 15pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;Another option is to&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;hide the logic in a separate method. &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;This also offers the possibility of early returns using &lt;/span&gt;&lt;a href="https://testing.googleblog.com/2017/06/code-health-reduce-nesting-reduce.html" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;guard clauses&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;, further reducing the need to keep track of intermediate states:&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none; table-layout: fixed; width: 497pt;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 22.5pt;"&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;boolean &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;isPizzaFantastic&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;() {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;if (!hasCheese()) {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return false;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;if (pepperoniService.empty() &amp;amp;&amp;amp; sausages.size() == 0) {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return false;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;return useOnionFlag.get() || hasMushroom(ENOKI, PORTOBELLO);&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/15045980/posts/default/5280176152908347979" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/15045980/posts/default/5280176152908347979" rel="self" type="application/atom+xml"/><link href="http://testing.googleblog.com/2024/04/isbooleantoolongandcomplex.html" rel="alternate" title="isBooleanTooLongAndComplex" type="text/html"/><author><name>Google Testing Bloggers</name><uri>http://www.blogger.com/profile/03153388556673050910</uri><email>noreply@blogger.com</email><gd:image height="7" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdMvmFPVLU3JodSkp-aAbNab12mpvIjMuLkNIgbRH6LHNds3HjRtN56Q7wiZxoHklUQmwE97HdRbjTd4rnyuXMVroVk0ChzQOba6fs1doitqFw64aFHGjaikWMor7wQA/s1600/gtb3.png" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-15045980.post-34957737297835463</id><published>2024-04-18T05:50:00.000-07:00</published><updated>2024-05-24T08:20:03.565-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Titus Winters"/><category scheme="http://www.blogger.com/atom/ns#" term="TotT"/><title type="text"> How I Learned To Stop Writing Brittle Tests and Love Expressive APIs</title><content type="html">&lt;style&gt;
@media only screen and (max-width: 600px) {
  .body {
    overflow-x: auto;
  }
}
  
@media (max-width: 480px), (max-height: 480px) {
.post-content table, .post-content td {
   width: auto !important;
   white-space: nowrap;
  }
}
&lt;/style&gt;

&lt;div class="body"&gt;
&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;This article was adapted from a Google &lt;/span&gt;&lt;a href="http://googletesting.blogspot.com/2007/01/introducing-testing-on-toilet.html" style="color: #4184f3; font-family: Roboto, sans-serif; font-size: 17px; text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;Testing on the Toilet&lt;/span&gt;&lt;/a&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; (TotT) episode. You can download a &lt;/span&gt;&lt;a href="https://docs.google.com/document/d/1k0MnDDaFbfr4THk0WrUxmvbTxJTslJ35XNiCdtfJiKA/edit" style="color: #4184f3; font-family: Roboto, sans-serif; font-size: 17px; text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;printer-friendly version&lt;/span&gt;&lt;/a&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; of this TotT episode and post it in your office.&lt;/span&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Times New Roman, serif;"&gt;&lt;span style="white-space-collapse: preserve;"&gt;By Titus Winters&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Times New Roman, serif;"&gt;&lt;span style="white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span id="docs-internal-guid-92570b9e-7fff-5a60-e847-16650b55f19f"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;A valuable but challenging property for tests is “resilience,” meaning a test should only fail when something &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;important&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; has gone wrong. However, an opposite property may be easier to see: &lt;/span&gt;&lt;span style="color: #990000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;A&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; &lt;/span&gt;&lt;a href="https://abseil.io/resources/swe-book/html/ch12.html#preventing_brittle_tests" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;“brittle” test&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt; is one that fails not for real problems that would break in production, but because the &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;test itself is fragile&lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt; for innocuous reasons&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;. Error messages, changing the order of metadata headers in a web request, or the order of calls to a heavily-mocked dependency can often cause a brittle test to fail.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Expressive test APIs are a powerful tool in the fight against brittle, implementation-detail heavy tests.&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; A test written with &lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;IsSquare(output)&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; is more expressive (and less brittle) than a test written with details such as &lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;JsonEquals(.width = 42, .length = 42)&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;, in cases where the size of the square is irrelevant. Similar expressive designs might include unordered element matching for hash containers, metadata comparisons for photos, and activity logs in processing objects, just to name a few.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 10pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;As an example, &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;consider&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;this C++ test code:&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none;"&gt;&lt;colgroup&gt;&lt;col width="733"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;absl::flat_hash_set&amp;lt;int&amp;gt; GetValuesFromConfig(const Config&amp;amp;);&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;TEST(ConfigValues, DefaultConfigsArePrime) {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;// Note the strange order of these values. BAD CODE, DON’T DO THIS!&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;EXPECT_THAT(GetValuesFromConfig(Config()), &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;ElementsAre&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;(29, 17, 31));&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 10pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;The reliance on hash ordering makes this test brittle, preventing improvements to the API being tested. &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;A critical part of the fix to the above code was to provide better test APIs&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;that allowed engineers to more effectively express the properties that mattered&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;. Thus we added &lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;UnorderedElementsAre&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; to the &lt;/span&gt;&lt;a href="https://google.github.io/googletest/" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;GoogleTest&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; test framework and refactored brittle tests to use that:&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none;"&gt;&lt;colgroup&gt;&lt;col width="733"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;TEST(ConfigValues, DefaultConfigsArePrimeAndOrderDoesNotMatter) {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;EXPECT_THAT(GetValuesFromConfig(Config()), &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;UnorderedElementsAre&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;(17, 29, 31));&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;It’s easy to see brittle tests and think, “Whoever wrote this did the wrong thing! Why are these tests so bad?” But it’s far better to see that these &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;brittle failures are a signal indicating where the available testing APIs are missing, under-advertised, or need attention.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Brittleness may indicate that the original test author didn’t have access to (or didn’t know about) test APIs that could more effectively identify the salient properties that the test meant to enforce. &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Without the right tools,&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;it’s too easy to write tests that depend on irrelevant details&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;, making those tests brittle.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 10pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;If your tests are brittle, look for ways to narrow down golden diff tests that compare exact pixel layouts or log outputs. Discover and learn more expressive APIs. File feature requests with the owners of the upstream systems.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;If you maintain infrastructure libraries and can’t make changes because of brittleness, think about what your users are lacking, and invest in expressive test APIs.&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Times New Roman, serif;"&gt;&lt;span style="white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Times New Roman, serif;"&gt;&lt;span style="white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/15045980/posts/default/34957737297835463" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/15045980/posts/default/34957737297835463" rel="self" type="application/atom+xml"/><link href="http://testing.googleblog.com/2024/04/how-i-learned-to-stop-writing-brittle.html" rel="alternate" title=" How I Learned To Stop Writing Brittle Tests and Love Expressive APIs" type="text/html"/><author><name>Google Testing Bloggers</name><uri>http://www.blogger.com/profile/03153388556673050910</uri><email>noreply@blogger.com</email><gd:image height="7" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdMvmFPVLU3JodSkp-aAbNab12mpvIjMuLkNIgbRH6LHNds3HjRtN56Q7wiZxoHklUQmwE97HdRbjTd4rnyuXMVroVk0ChzQOba6fs1doitqFw64aFHGjaikWMor7wQA/s1600/gtb3.png" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-15045980.post-4119264362796792051</id><published>2024-04-04T05:47:00.000-07:00</published><updated>2024-05-24T08:20:07.033-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Kai Kent"/><category scheme="http://www.blogger.com/atom/ns#" term="TotT"/><title type="text">Prefer Narrow Assertions in Unit Tests</title><content type="html">&lt;style&gt;
@media only screen and (max-width: 600px) {
  .body {
    overflow-x: auto;
  }
}
  
@media (max-width: 480px), (max-height: 480px) {
.post-content table, .post-content td {
   width: auto !important;
   white-space: nowrap;
  }
}
&lt;/style&gt;

&lt;div class="body"&gt;

&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;This article was adapted from a Google &lt;/span&gt;&lt;a href="http://googletesting.blogspot.com/2007/01/introducing-testing-on-toilet.html" style="color: #4184f3; font-family: Roboto, sans-serif; font-size: 17px; text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;Testing on the Toilet&lt;/span&gt;&lt;/a&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; (TotT) episode. You can download a &lt;/span&gt;&lt;a href="https://docs.google.com/document/d/154ZD969jZh1ZJlhYn-SHWjNGHjFWZD9uzsM-sY_NJao/edit" style="color: #4184f3; font-family: Roboto, sans-serif; font-size: 17px; text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;printer-friendly version&lt;/span&gt;&lt;/a&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; of this TotT episode and post it in your office.&lt;/span&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;by Kai Kent&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;span id="docs-internal-guid-d64db862-7fff-8aff-83a6-6e0790e79274"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;Your project is adding a loyalty promotion feature, so you add a new column &lt;/span&gt;&lt;span style="color: #38761d; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;CREATION_DATE&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; to the &lt;/span&gt;&lt;span style="color: #38761d; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;ACCOUNT&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; table. Suddenly the test below starts failing. Can you spot the problem?&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none;"&gt;&lt;colgroup&gt;&lt;col width="733"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;TEST_F(AccountTest, UpdatesBalanceAfterWithdrawal) {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;ASSERT_OK_AND_ASSIGN(Account account,&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;database.CreateNewAccount(/*initial_balance=*/5000));&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;ASSERT_OK(account.Withdraw(3000));&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve; white-space: nowrap"&gt;&amp;nbsp;&amp;nbsp;const Account kExpected = { .balance = 2000, /* a handful of other fields */ };&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;EXPECT_EQ(account, kExpected);&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 10pt;"&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;You forgot to update the test for the newly added column; but the test also has an underlying problem:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;It checks for full equality of a potentially complex object, and thus implicitly tests &lt;/span&gt;&lt;a href="https://testing.googleblog.com/2014/04/testing-on-toilet-test-behaviors-not.html" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;unrelated behaviors&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;Changing anything in &lt;/span&gt;&lt;span style="color: #38761d; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;Account&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;, such as adding or removing a field, will cause all the tests with a similar pattern to fail. Broad assertions are an easy way to accidentally create &lt;/span&gt;&lt;a href="https://abseil.io/resources/swe-book/html/ch12.html#preventing_brittle_tests" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;brittle tests&lt;/span&gt;&lt;/a&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;&amp;nbsp; - tests that fail when anything about the system changes, and need frequent fixing even though they aren't finding real bugs.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 10pt;"&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;Instead, &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;the test should use narrow assertions that only check the relevant behavior. &lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;The example test should be updated to only check the relevant field &lt;/span&gt;&lt;span style="color: #38761d; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;account.balance&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none; table-layout: fixed; width: 660px;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;TEST_F(AccountTest, UpdatesBalanceAfterWithdrawal) {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;ASSERT_OK_AND_ASSIGN(Account account,&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;database.CreateNewAccount(/*initial_balance=*/5000));&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;ASSERT_OK(account.Withdraw(3000));&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;EXPECT_EQ(account.balance, 2000);&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 10pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;Broad assertions should only be used for unit tests that care about &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;all&lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt; of the implicitly tested behaviors&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;, which should be a small minority of unit tests. Prefer to have at most one such test that checks for full equality of a complex object for the common case, and use narrow assertions for all other cases.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 10pt;"&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;Similarly, when writing frontend unit tests, use one screenshot diff test to verify the layout of your UI, but test individual behaviors with narrow DOM assertions.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;For testing large &lt;/span&gt;&lt;a href="https://protobuf.dev/" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;protocol buffers&lt;/span&gt;&lt;/a&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;, some languages provide libraries for verifying a subset of proto fields in a single assertion, such as:&lt;/span&gt;&lt;/p&gt;&lt;ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="1" dir="ltr" style="color: black; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; text-wrap: nowrap; vertical-align: baseline;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #38761d; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;span style="color: #38761d; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;comparingExpectedFieldsOnly()&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; in Java (&lt;/span&gt;&lt;a href="https://truth.dev/protobufs.html" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap: wrap; vertical-align: baseline;"&gt;Truth Protobuf Extension&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="color: black; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; text-wrap: nowrap; vertical-align: baseline;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #38761d; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;protocmp.FilterField&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; in Go (&lt;/span&gt;&lt;a href="https://pkg.go.dev/google.golang.org/protobuf/testing/protocmp#FilterField" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap: wrap; vertical-align: baseline;"&gt;protocmp&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/15045980/posts/default/4119264362796792051" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/15045980/posts/default/4119264362796792051" rel="self" type="application/atom+xml"/><link href="http://testing.googleblog.com/2024/04/prefer-narrow-assertions-in-unit-tests.html" rel="alternate" title="Prefer Narrow Assertions in Unit Tests" type="text/html"/><author><name>Google Testing Bloggers</name><uri>http://www.blogger.com/profile/03153388556673050910</uri><email>noreply@blogger.com</email><gd:image height="7" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdMvmFPVLU3JodSkp-aAbNab12mpvIjMuLkNIgbRH6LHNds3HjRtN56Q7wiZxoHklUQmwE97HdRbjTd4rnyuXMVroVk0ChzQOba6fs1doitqFw64aFHGjaikWMor7wQA/s1600/gtb3.png" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-15045980.post-4742519303035894776</id><published>2024-03-26T05:34:00.000-07:00</published><updated>2024-05-24T08:20:10.884-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Adam Raider"/><category scheme="http://www.blogger.com/atom/ns#" term="Code Health"/><category scheme="http://www.blogger.com/atom/ns#" term="TotT"/><title type="text">What’s in a Name?</title><content type="html">&lt;style&gt;
@media only screen and (max-width: 600px) {
  .body {
    overflow-x: auto;
  }
}
  
@media (max-width: 480px), (max-height: 480px) {
.post-content table, .post-content td {
   width: auto !important;
   white-space: nowrap;
  }
}
&lt;/style&gt;

&lt;div class="body"&gt;
&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17.3333px; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;i&gt;This is another post in our &lt;a href="https://testing.googleblog.com/2017/04/code-health-googles-internal-code.html" style="color: #4184f3; text-decoration-line: none;"&gt;Code Health&lt;/a&gt; series. A version of this post originally appeared in Google bathrooms worldwide as a Google &lt;a href="https://testing.googleblog.com/2007/01/introducing-testing-on-toilet.html" style="color: #4184f3; text-decoration-line: none;"&gt;Testing on the Toilet&lt;/a&gt; episode. &lt;/i&gt;&lt;/span&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;You can download a &lt;a href="https://docs.google.com/document/d/1IFotHeIRnAjEy_FlsFuWqHyGS5A-BZgei7FMBX1QqRQ/edit" style="color: #4184f3; text-decoration-line: none;"&gt;printer-friendly version&lt;/a&gt; to display in your office.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span style="font-family: Times New Roman, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Times New Roman, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;by Adam Raider&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Times New Roman, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Times New Roman, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span id="docs-internal-guid-8f038110-7fff-31e6-82cc-70d9f7c36f9c"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 4pt; margin-top: 0pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;“There are only two hard things in computer science: cache invalidation and naming things.” &lt;/span&gt;&lt;span style="color: #434343; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;—Phil Karlton&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Have you ever read an identifier only to realize later it doesn’t do what you expected? Or had to read the implementation in order to understand an interface? These indirections eat up our cognitive bandwidth and make our work more difficult. We spend far more time reading code than we do writing it; &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;thoughtful names can save the reader (and writer) a lot of time and frustration.&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; Here are some naming tips:&lt;/span&gt;&lt;/p&gt;&lt;ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="1" dir="ltr" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;Spend time considering names—it’s worth it.&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; Don’t default to the first name that comes to mind. The more public the name, the more expensive it is to change. Past a certain scale, names become infeasible to change, especially for APIs. Pay attention to a name in proportion to the cost of renaming it later. If you’re feeling stuck, consider running a new name by a teammate.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;Describe behavior. &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;Encourage naming based on &lt;/span&gt;&lt;span style="font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;what &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;functions do rather than &lt;/span&gt;&lt;span style="font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;when &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;the functions are called. Avoid prefixes like “handle” or “on” as they describe &lt;/span&gt;&lt;span style="font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;when &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;and provide no added meaning:&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div align="left" dir="ltr" style="margin-left: 18pt;"&gt;&lt;table style="border-collapse: collapse; border: none;"&gt;&lt;colgroup&gt;&lt;col width="345"&gt;&lt;/col&gt;&lt;col width="369"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #d9d9d9 0.5pt; border-color: rgb(217, 217, 217); border-left: solid #d9d9d9 0.5pt; border-right: solid #d9d9d9 0.5pt; border-style: solid; border-top: solid #d9d9d9 0.5pt; border-width: 0.5pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;button.listen('click', &lt;/span&gt;&lt;span style="background-color: transparent; color: #660000; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;handleClick&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #d9d9d9 0.5pt; border-color: rgb(217, 217, 217); border-left: solid #d9d9d9 0.5pt; border-right: solid #d9d9d9 0.5pt; border-style: solid; border-top: solid #d9d9d9 0.5pt; border-width: 0.5pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;button.listen('click', &lt;/span&gt;&lt;span style="background-color: transparent; color: #274e13; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;addItemToCart&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="1" dir="ltr" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 10pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;Reveal intent with a contextually appropriate level of abstraction&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;:&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="2" dir="ltr" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: circle; margin-left: -9pt; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 5pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;High-abstraction functions describe the &lt;/span&gt;&lt;span style="font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;what&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; and operate on high-level types.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="2" dir="ltr" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: circle; margin-left: -9pt; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 5pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;Lower-abstraction functions describe the &lt;/span&gt;&lt;span style="font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;how &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;and operate on lower-level types.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-left: 18pt; margin-top: 5pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;For example, &lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;logout&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; might call into &lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;clearUserToken&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;, and &lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;recordWithCamera&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; might call into &lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;parseStreamBytes&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;.&lt;/span&gt;&lt;/p&gt;&lt;ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="1" dir="ltr" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;Prefer unique, precise names.&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; Are you frequently asking for the &lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;UserManager&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;?&lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;Manager&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;Util&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;, and similar suffixes are a common but imprecise naming convention. What does it do? It manages! If you’re struggling to come up with a more precise name, consider splitting the class into smaller ones.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;Balance clarity and conciseness—use abbreviations with care.&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; Commonly used abbreviations, such as HTML, i18n, and RPC, can aid communication but less-known ones can confuse your average readers. Ask yourself, “Will my readers immediately understand this label? Will a reader five years from now understand it?”&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 0pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;Avoid repetition and filler words.&lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;Or in other words, don’t say the same thing twice. It adds unnecessary visual noise:&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div align="left" dir="ltr" style="margin-left: 18pt;"&gt;&lt;table style="border-collapse: collapse; border: none;"&gt;&lt;colgroup&gt;&lt;col width="345"&gt;&lt;/col&gt;&lt;col width="369"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #d9d9d9 0.5pt; border-color: rgb(217, 217, 217); border-left: solid #d9d9d9 0.5pt; border-right: solid #d9d9d9 0.5pt; border-style: solid; border-top: solid #d9d9d9 0.5pt; border-width: 0.5pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;userData.userBirthdayDate&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #d9d9d9 0.5pt; border-color: rgb(217, 217, 217); border-left: solid #d9d9d9 0.5pt; border-right: solid #d9d9d9 0.5pt; border-style: solid; border-top: solid #d9d9d9 0.5pt; border-width: 0.5pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;user.birthDate&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="1" dir="ltr" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 15pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap: wrap; vertical-align: baseline;"&gt;Software changes—names should, too. &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;If you see an identifier that doesn’t aptly describe itself—fix it!&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 15pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Learn more about identifier naming in this post: &lt;/span&gt;&lt;a href="https://testing.googleblog.com/2017/10/code-health-identifiernamingpostforworl.html" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;IdentifierNamingPostForWorldWideWebBlog&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/15045980/posts/default/4742519303035894776" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/15045980/posts/default/4742519303035894776" rel="self" type="application/atom+xml"/><link href="http://testing.googleblog.com/2024/03/whats-in-name.html" rel="alternate" title="What’s in a Name?" type="text/html"/><author><name>Google Testing Bloggers</name><uri>http://www.blogger.com/profile/03153388556673050910</uri><email>noreply@blogger.com</email><gd:image height="7" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdMvmFPVLU3JodSkp-aAbNab12mpvIjMuLkNIgbRH6LHNds3HjRtN56Q7wiZxoHklUQmwE97HdRbjTd4rnyuXMVroVk0ChzQOba6fs1doitqFw64aFHGjaikWMor7wQA/s1600/gtb3.png" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-15045980.post-3007940237944190664</id><published>2024-02-27T10:43:00.000-08:00</published><updated>2024-05-24T08:20:21.728-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Andrew Trenk"/><category scheme="http://www.blogger.com/atom/ns#" term="Dillon Bly"/><category scheme="http://www.blogger.com/atom/ns#" term="TotT"/><title type="text">Increase Test Fidelity By Avoiding Mocks</title><content type="html">&lt;style&gt;
@media only screen and (max-width: 600px) {
  .body {
    overflow-x: auto;
  }
}
  
@media (max-width: 480px), (max-height: 480px) {
.post-content table, .post-content td {
   width: auto !important
  }
}
&lt;/style&gt;

&lt;div class="body"&gt;
&lt;p&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;This article was adapted from a Google &lt;/span&gt;&lt;a href="http://googletesting.blogspot.com/2007/01/introducing-testing-on-toilet.html" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;Testing on the Toilet&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; (TotT) episode. You can download a &lt;/span&gt;&lt;a href="https://docs.google.com/document/d/1h2wbaTg2Ve6v9JDQukHsZGqCL45LdLY_xjONPxHLm1w/edit" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;printer-friendly version&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; of this TotT episode and post it in your office.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; white-space-collapse: preserve;"&gt;By Andrew Trenk and Dillon Bly&lt;/span&gt;&lt;/p&gt;&lt;span id="docs-internal-guid-dc1a2da9-7fff-3fdf-26f1-0d114e9a820f"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 8pt; margin-top: 5pt;"&gt;&lt;span style="color: #444444; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Replacing your code’s dependencies with mocks can make unit tests easier to write and faster to run. However, &lt;/span&gt;&lt;a href="https://testing.googleblog.com/2013/05/testing-on-toilet-dont-overuse-mocks.html" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;among other problems&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #444444; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;, using mocks can lead to tests that are less effective at catching bugs.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 8pt; margin-right: -12pt; margin-top: 8pt;"&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;The&lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt; fidelity&lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt; of a test refers to how closely the behavior of the test resembles the behavior of the production code&lt;/span&gt;&lt;span style="color: #444444; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;. A test with higher fidelity gives you higher confidence that your code will work properly.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 8pt; margin-top: 8pt;"&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;When specifying a dependency to use in a test,&lt;/span&gt;&lt;span style="color: #444444; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;prefer the highest-fidelity option. &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Learn more in the &lt;/span&gt;&lt;a href="https://abseil.io/resources/swe-book/html/ch13.html" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;Test Doubles&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; chapter of the &lt;/span&gt;&lt;a href="https://abseil.io/resources/swe-book" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;Software Engineering at Google&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; book.&lt;/span&gt;&lt;/p&gt;&lt;ol style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px; text-align: left;"&gt;&lt;li&gt;&lt;span id="docs-internal-guid-23a4b702-7fff-75c3-c87b-955ca3ffbd11"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Try to use the real implementation&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;. &lt;/span&gt;&lt;span style="color: #444444; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;This provides the most fidelity, because the code in the implementation will be executed in the test. There may be tradeoffs when using a real implementation: they can be slow, non-deterministic, or difficult to instantiate (e.g., it connects to an external server). Use your judgment to decide if a real implementation is the right choice.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span style="color: #444444; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;span id="docs-internal-guid-bc85b23d-7fff-1649-0ba7-55b5f88ec7a2"&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;Use a fake if you can’t use the real implementation&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;A &lt;/span&gt;&lt;a href="https://testing.googleblog.com/2013/06/testing-on-toilet-fake-your-way-to.html" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;fake&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; is a lightweight implementation of an API that behaves similarly to the real implementation, e.g., an in-memory database. A fake ensures a test has high fidelity, but takes effort to write and maintain; e.g., it needs its own tests to ensure that it conforms to the behavior of the real implementation. Typically, the owner of the real implementation creates and maintains the fake. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span style="color: #444444; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;span id="docs-internal-guid-dc383552-7fff-3f2d-4338-5476b8954325"&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;Use a mock if you can’t use the real implementation or a fake&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;. A mock reduces fidelity, since it doesn’t execute &lt;/span&gt;&lt;span style="font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;any&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; of the actual implementation of a dependency; its behavior is specified inline in a test (a technique known as &lt;/span&gt;&lt;span style="font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;stubbing&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;), so it may diverge from the behavior of the real implementation. Mocks provide a basic level of confidence that your code works properly, and can be especially useful when testing a code path that is hard to trigger (e.g., an error condition such as a timeout).&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;(&lt;/span&gt;&lt;span style="font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;Note: Although “mocks” are objects created using mocking frameworks such as &lt;/span&gt;&lt;a href="https://site.mockito.org/" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;Mockito&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; or &lt;/span&gt;&lt;a href="https://docs.python.org/3/library/unittest.mock.html" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;unittest.mock&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;, the same problems will occur if you manually create your own implementation within tests.)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span id="docs-internal-guid-d67d67ea-7fff-ac8e-4383-533c4c742131"&gt;&lt;div align="left" dir="ltr"&gt;&lt;table style="border-collapse: collapse; border: none;"&gt;&lt;colgroup&gt;&lt;col width="359"&gt;&lt;/col&gt;&lt;col width="406"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 33pt;"&gt;&lt;td style="border-bottom: solid #999999 1pt; border-color: rgb(153, 153, 153); border-left: solid #999999 1pt; border-right: solid #999999 1pt; border-style: solid; border-top: solid #999999 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 3.6pt; vertical-align: middle;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Arial, sans-serif" style="font-size: 11pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;A low-fidelity test&lt;/span&gt;&lt;span face="Arial, sans-serif" style="font-size: 11pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;: Dependencies are replaced
with mocks. Try to avoid this.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: solid #999999 1pt; border-color: rgb(153, 153, 153); border-left: solid #999999 1pt; border-right: solid #999999 1pt; border-style: solid; border-top: solid #999999 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Arial, sans-serif" style="font-size: 11pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;A high-fidelity test:&lt;/span&gt;&lt;span face="Arial, sans-serif" style="font-size: 11pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; Dependencies use real implementations or fakes. Prefer this.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #999999 1pt; border-color: rgb(153, 153, 153); border-left: solid #999999 1pt; border-right: solid #999999 1pt; border-style: solid; border-top: solid #999999 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;@Mock OrderValidator &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;validator&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;@Mock PaymentProcessor &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;processor&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;;

&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;...&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding-top: 27px;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; white-space-collapse: preserve;"&gt;ShoppingCart cart =&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;    new ShoppingCart(&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;        validator&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;, &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;processor&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;);&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #999999 1pt; border-color: rgb(153, 153, 153); border-left: solid #999999 1pt; border-right: solid #999999 1pt; border-style: solid; border-top: solid #999999 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;OrderValidator &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;validator&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; =&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;    createValidator();&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;PaymentProcessor &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;processor&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; =&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;    new FakeProcessor();&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;...&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;ShoppingCart cart =&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new ShoppingCart(&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;        validator&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;, &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;processor&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;);&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Aim for as much fidelity as you can achieve without increasing the &lt;/span&gt;&lt;a href="https://abseil.io/resources/swe-book/html/ch11.html#test_size" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;size&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt; of a test&lt;/span&gt;&lt;span style="color: #444444; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;. At Google, tests are classified by size. Most tests should be small: they must run in a single process and must not wait on a system or event outside of their process. Increasing the fidelity of a small test is often a good choice if the test stays within these constraints. A healthy test suite also includes medium and large tests, which have higher fidelity since they can use heavyweight dependencies that aren’t feasible to use in small tests, e.g., dependencies that increase execution times or call other processes.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/15045980/posts/default/3007940237944190664" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/15045980/posts/default/3007940237944190664" rel="self" type="application/atom+xml"/><link href="http://testing.googleblog.com/2024/02/increase-test-fidelity-by-avoiding-mocks.html" rel="alternate" title="Increase Test Fidelity By Avoiding Mocks" type="text/html"/><author><name>Google Testing Bloggers</name><uri>http://www.blogger.com/profile/03153388556673050910</uri><email>noreply@blogger.com</email><gd:image height="7" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdMvmFPVLU3JodSkp-aAbNab12mpvIjMuLkNIgbRH6LHNds3HjRtN56Q7wiZxoHklUQmwE97HdRbjTd4rnyuXMVroVk0ChzQOba6fs1doitqFw64aFHGjaikWMor7wQA/s1600/gtb3.png" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-15045980.post-1768091419714226330</id><published>2023-12-12T08:06:00.000-08:00</published><updated>2024-05-17T10:49:24.538-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Code Health"/><category scheme="http://www.blogger.com/atom/ns#" term="Francois Aube"/><category scheme="http://www.blogger.com/atom/ns#" term="Shiva Garg"/><category scheme="http://www.blogger.com/atom/ns#" term="TotT"/><title type="text">Let Code Speak for Itself</title><content type="html">&lt;style&gt;
@media only screen and (max-width: 600px) {
  .body {
    overflow-x: auto;
  }
  td{
    white-space: nowrap;
  }
}
&lt;/style&gt;

&lt;div class="body"&gt;
&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17.3333px; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;i&gt;This is another post in our &lt;a href="https://testing.googleblog.com/2017/04/code-health-googles-internal-code.html" style="color: #4184f3; text-decoration-line: none;"&gt;Code Health&lt;/a&gt; series. A version of this post originally appeared in Google bathrooms worldwide as a Google &lt;a href="https://testing.googleblog.com/2007/01/introducing-testing-on-toilet.html" style="color: #4184f3; text-decoration-line: none;"&gt;Testing on the Toilet&lt;/a&gt; episode. &lt;/i&gt;&lt;/span&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;You can download a &lt;a href="https://docs.google.com/document/d/1ohtX8DsDeDolm7OgpmEB-JTITImULJZO4eSvwy_7Yo8/edit" style="color: #4184f3; text-decoration-line: none;"&gt;printer-friendly version&lt;/a&gt; to display in your office.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span style="font-family: Times New Roman, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif;"&gt;&lt;span&gt;&lt;div&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;by Shiva Garg and Francois Aube&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span id="docs-internal-guid-07d15453-7fff-46c3-1781-8d2c2d227b59"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Comments can be invaluable for understanding and maintaining a code base.&amp;nbsp; But &lt;/span&gt;&lt;span style="font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;excessive&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; comments in code can become unhelpful clutter full of extraneous and/or outdated detail. &lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Comments that offer useless (or worse, obsolete) information hurt readability.&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; Here are some tips to let your code speak for itself:&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;span id="docs-internal-guid-a88723a2-7fff-e3e2-7042-97d9e362102d"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Write comments to explain the “why”&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; behind a certain approach in code. The comment below has two good reasons to exist: documenting non-obvious behavior and answering a question that a reader is likely to have (i.e. &lt;/span&gt;&lt;span style="font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;why doesn’t this code render directly on the screen?&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none;"&gt;&lt;colgroup&gt;&lt;col width="733"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 0pt 18pt; text-indent: -18pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;// Eliminate flickering by rendering the next frame off-screen and swapping into the&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 0pt 18pt; text-indent: -18pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;// visible buffer.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 0pt 18pt; text-indent: -18pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;RenderOffScreen();&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 0pt 18pt; text-indent: -18pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;SwapBuffers();&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;span id="docs-internal-guid-c8d28ee7-7fff-3604-6ed1-81373ef791e6"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Use well-named identifiers &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;to&lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt; &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;guide the reader and reduce the need for comments:&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;table style="border-collapse: collapse; border: none; font-family: Times;"&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 3.6pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 0pt 18pt; text-indent: -18pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;// Payout should not happen if the user is&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 0pt 18pt; text-indent: -18pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;// in an ineligible country.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 0pt 18pt; text-indent: -18pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;std::unordered_set&amp;lt;std::string&amp;gt; ineligible =&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 0pt 18pt; text-indent: -18pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;{"Atlantis", "Utopia"};&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 0pt 18pt; text-indent: -18pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;if (!ineligible.contains(country)) {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 0pt 18pt; text-indent: -18pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;Payout(user.user_id);&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span id="docs-internal-guid-9a852830-7fff-04af-bf6e-89488b8518d5"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 0pt 18pt; text-indent: -18pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 3.6pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Roboto Mono, monospace;"&gt;&lt;span style="font-size: 13.3333px; white-space: pre;"&gt;if (IsCountryEligibleForPayout(country)) {
  Payout(user.user_id);
}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;span id="docs-internal-guid-163a2205-7fff-9926-c146-e0c7d0347d60"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Write function comments (a.k.a. API documentation) that describe intended meaning and purpose, not implementation details. &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Choose unambiguous function signatures that callers can use&amp;nbsp; without reading any documentation. Don’t explain inner details&lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt; &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;that could change without affecting the contract with the caller:&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;table style="border-collapse: collapse; border: none; font-family: Times;"&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 3.6pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 0pt 18pt; text-indent: -18pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;// Reads an input string containing either a&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 0pt 18pt; text-indent: -18pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;// number of milliseconds since epoch or an&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 0pt 18pt; text-indent: -18pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;// ISO 8601 date and time. &lt;/span&gt;&lt;span style="background-color: transparent; color: #0674b3; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;I&lt;/span&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;nvokes the&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 0pt 18pt; text-indent: -18pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;// Sole, Laces, and ToeCap APIs, then&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 0pt 18pt; text-indent: -18pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;// returns an object representing the Shoe&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 0pt 18pt; text-indent: -18pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;// available then or nullptr if none were.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span id="docs-internal-guid-73f821bc-7fff-2b18-2cbe-da3ba7ff45a8"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 0pt 18pt; text-indent: -18pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;Shoe* ModelAvailableAt(char* time);&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 3.6pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 0pt 18pt; text-indent: -18pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;// Returns the Shoe that was available for&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 0pt 18pt; text-indent: -18pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;// purchase at `time`. If no model was&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 0pt 18pt; text-indent: -18pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;// available, throws a runtime_error.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span id="docs-internal-guid-3c0d9ae7-7fff-a34d-d9c9-d85fe285be69"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 0pt 18pt; text-indent: -18pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;Shoe ModelAvailableAt(time_t time);&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;span id="docs-internal-guid-b39f4ef8-7fff-3271-8591-4b0021aa4687"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Omit comments that state the obvious&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;. Superfluous comments increase code maintenance when code gets refactored and don’t add value, only overhead to keep these comments current:&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none;"&gt;&lt;colgroup&gt;&lt;col width="733"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 28.5pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 0pt 18pt; text-indent: -18pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;// Increment counter by 1.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 0pt 18pt; text-indent: -18pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;counter++;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 10pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Learn more about writing good comments: &lt;/span&gt;&lt;a href="https://testing.googleblog.com/2017/07/code-health-to-comment-or-not-to-comment.html" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;To Comment or Not to Comment?&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;, &lt;/span&gt;&lt;a href="https://stackoverflow.blog/2021/12/23/best-practices-for-writing-code-comments" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;Best practices for writing code comments&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-size: 17.3333px; font-style: italic; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/15045980/posts/default/1768091419714226330" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/15045980/posts/default/1768091419714226330" rel="self" type="application/atom+xml"/><link href="http://testing.googleblog.com/2023/12/let-code-speak-for-itself.html" rel="alternate" title="Let Code Speak for Itself" type="text/html"/><author><name>Google Testing Bloggers</name><uri>http://www.blogger.com/profile/03153388556673050910</uri><email>noreply@blogger.com</email><gd:image height="7" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdMvmFPVLU3JodSkp-aAbNab12mpvIjMuLkNIgbRH6LHNds3HjRtN56Q7wiZxoHklUQmwE97HdRbjTd4rnyuXMVroVk0ChzQOba6fs1doitqFw64aFHGjaikWMor7wQA/s1600/gtb3.png" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-15045980.post-3194474835432265240</id><published>2023-12-05T05:19:00.000-08:00</published><updated>2024-05-17T10:49:27.600-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Code Health"/><category scheme="http://www.blogger.com/atom/ns#" term="TotT"/><category scheme="http://www.blogger.com/atom/ns#" term="Yiming Sun"/><title type="text">Exceptional Exception Handling</title><content type="html">&lt;style&gt;
@media only screen and (max-width: 600px) {
  .body {
    overflow-x: auto;
  }
}
&lt;/style&gt;

&lt;div class="body"&gt;
&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17.3333px; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;i&gt;This is another post in our &lt;a href="https://testing.googleblog.com/2017/04/code-health-googles-internal-code.html" style="color: #4184f3; text-decoration-line: none;"&gt;Code Health&lt;/a&gt; series. A version of this post originally appeared in Google bathrooms worldwide as a Google &lt;a href="https://testing.googleblog.com/2007/01/introducing-testing-on-toilet.html" style="color: #4184f3; text-decoration-line: none;"&gt;Testing on the Toilet&lt;/a&gt; episode. &lt;/i&gt;&lt;/span&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;You can download a &lt;a href="https://docs.google.com/document/d/1DplVjabYLpASmmr6DRXfA5L3y4NPsiiYVhW-BNVP4ZM/edit" style="color: #4184f3; text-decoration-line: none;"&gt;printer-friendly version&lt;/a&gt; to display in your office.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: Times New Roman, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17.3333px; white-space-collapse: preserve;"&gt;by Yiming Sun&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;Have you ever seen huge exception-handling blocks? Here is an example in Java, although you may have seen similar problems in Python, TypeScript, Kotlin, or any language that supports exceptions.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;Let's assume we are calling &lt;/span&gt;&lt;span style="color: black; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;bakePizza()&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; to bake a pizza, and it can be overbaked, throwing a &lt;/span&gt;&lt;span style="color: black; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;PizzaOverbakedException&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)"&gt;&lt;span id="docs-internal-guid-667a9b14-7fff-51a3-d4d8-eaee6b379caa"&gt;&lt;div align="left" dir="ltr" style="color: rgba(0, 0, 0, 0.87); font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px; margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none; table-layout: fixed; width: 545pt;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;thead&gt;&lt;tr style="height: 0pt;"&gt;&lt;th scope="col" style="background-color: #f4cccc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;"&gt;class &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;PizzaOverbakedException&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;"&gt; extends Exception {};&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;"&gt;void &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;bakePizza &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;"&gt;() throws &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;PizzaOverbakedException&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;"&gt; {};&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;"&gt;try {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;"&gt;// 100+ lines of code to prepare pizza ingredients.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"&gt;&lt;span style="background-color: transparent; color: #1c4587; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;"&gt;...&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;bakePizza&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;"&gt;();&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;// Another 100+ lines of code to deliver pizza to a customer.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;"&gt;...&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;"&gt;} catch (&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Exception&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;"&gt; e) {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;throw new IllegalStateException(); &lt;/span&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;"&gt;// Root cause ignored while throwing new exception.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="color: rgba(0, 0, 0, 0.87); font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px; line-height: 1.2; margin-bottom: 0pt; margin-top: 10pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Here are the problems with the above code:&lt;/span&gt;&lt;/p&gt;&lt;ul style="color: rgba(0, 0, 0, 0.87); font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px; margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px; text-align: left;"&gt;&lt;li&gt;&lt;span id="docs-internal-guid-42e9b2ec-7fff-f83f-4997-e34204d4b18d"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Obscuring the logic&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;. The method &lt;/span&gt;&lt;span style="background-color: #efefef; color: black; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;bakePizza()&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;, is obscured by the additional lines of code of preparation and delivery, so unintended exceptions from preparation and delivery may be caught.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;span id="docs-internal-guid-361fb7c4-7fff-2a64-c7b6-59d13bc2d4e5"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;Catching the general exception&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;. &lt;/span&gt;&lt;span style="background-color: #efefef; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;catch (Exception e)&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; will catch everything, despite that we might only want to handle &lt;/span&gt;&lt;span style="background-color: #efefef; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;PizzaOverbakedException&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; here.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;&lt;span id="docs-internal-guid-5abdef6f-7fff-563c-75a3-89958d45b451"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;Rethrowing a general exception, with the original exception ignored&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;. This means that the root cause is lost - we don't know what exactly goes wrong with pizza baking while debugging.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p dir="ltr" style="color: rgba(0, 0, 0, 0.87); font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px; line-height: 1.2; margin-bottom: 5pt; margin-top: 10pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Here is a better alternative, rewritten to avoid the problems above.&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="color: rgba(0, 0, 0, 0.87); font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px; margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none; white-space: nowrap;"&gt;&lt;colgroup&gt;&lt;col width="739"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 21pt;"&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;class &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;PizzaOverbakedException&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; extends Exception {};&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;void &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;bakePizza &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;() throws &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;PizzaOverbakedException&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; {};&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;// 100+ lines of code to prepare pizza ingredients.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;...&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;try {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;bakePizza&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;();&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;} catch (&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;PizzaOverbakedException&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; e) { &lt;/span&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;// Other exceptions won’t be caught.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;// Rethrow a more meaningful exception; so that we know pizza is overbaked.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;throw new IllegalStateException(“You burned the pizza!”, &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;e&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;// Another 100+ lines of code to deliver pizza to a customer.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;...&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/15045980/posts/default/3194474835432265240" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/15045980/posts/default/3194474835432265240" rel="self" type="application/atom+xml"/><link href="http://testing.googleblog.com/2023/12/exceptional-exception-handling.html" rel="alternate" title="Exceptional Exception Handling" type="text/html"/><author><name>Google Testing Bloggers</name><uri>http://www.blogger.com/profile/03153388556673050910</uri><email>noreply@blogger.com</email><gd:image height="7" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdMvmFPVLU3JodSkp-aAbNab12mpvIjMuLkNIgbRH6LHNds3HjRtN56Q7wiZxoHklUQmwE97HdRbjTd4rnyuXMVroVk0ChzQOba6fs1doitqFw64aFHGjaikWMor7wQA/s1600/gtb3.png" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-15045980.post-7314410554323962981</id><published>2023-11-28T05:00:00.000-08:00</published><updated>2024-05-17T10:49:30.859-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Code Health"/><category scheme="http://www.blogger.com/atom/ns#" term="Per Jacobsson"/><category scheme="http://www.blogger.com/atom/ns#" term="TotT"/><title type="text">Clean Up Code Cruft</title><content type="html">&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17.3333px; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;i&gt;This is another post in our &lt;a href="https://testing.googleblog.com/2017/04/code-health-googles-internal-code.html" style="color: #4184f3; text-decoration-line: none;"&gt;Code Health&lt;/a&gt; series. A version of this post originally appeared in Google bathrooms worldwide as a Google &lt;a href="https://testing.googleblog.com/2007/01/introducing-testing-on-toilet.html" style="color: #4184f3; text-decoration-line: none;"&gt;Testing on the Toilet&lt;/a&gt; episode. &lt;/i&gt;&lt;/span&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;You can download a &lt;a href="https://docs.google.com/document/d/1zAkHB8jMa75kpvAVAAi--tJTwXOOc6Md8CvwKHn6SsM/edit" style="color: #4184f3; text-decoration-line: none;"&gt;printer-friendly version&lt;/a&gt; to display in your office.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span color="rgba(0, 0, 0, 0.87)" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17px;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; white-space-collapse: preserve;"&gt;By Per Jacobsson&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span id="docs-internal-guid-6f346e48-7fff-b748-81f5-ec7dd2815b8a"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 10pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;The book &lt;/span&gt;&lt;a href="https://www.oreilly.com/library/view/clean-code-a/9780136083238/" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;Clean Code&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; discusses a camping rule that is good to keep in the back of your mind when writing code:&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none; table-layout: fixed;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #fff2cc; border-bottom: dotted #aaaaaa 0.75pt; border-left: dotted #aaaaaa 0.75pt; border-right: dotted #aaaaaa 0.75pt; border-top: dotted #aaaaaa 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-left: 28pt; margin-right: 28pt; margin-top: 0pt; text-align: center;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Leave the campground cleaner than you found it&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;So how does that fit into software development? The thinking is this: &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;When you make changes to code that can potentially be improved, try to make it just a little bit better&lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;This doesn't necessarily mean you have to go out of your way to do huge refactorings. &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Changing something small can go a long way&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;:&lt;/span&gt;&lt;/p&gt;&lt;ul style="margin-bottom: 0; margin-top: 0; padding-inline-start: 48px;"&gt;&lt;li aria-level="1" dir="ltr" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;Rename a variable to something more descriptive.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;Break apart a huge function into a few logical pieces.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;Fix a lint warning.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;Bring an outdated comment up to date.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;Extract duplicated lines to a function.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;Write a unit test for an untested function.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;Whatever other itch you feel like scratching.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Cleaning up the small things often makes it easier to see and fix the bigger issues.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;But what about "If it's not broken, don't fix it"? Changing code can be risky, right? There's no obvious rule, but if you're always afraid to change your code,&lt;/span&gt;&lt;span style="color: #7e0021; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;you have bigger problems. &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Cruft in code that is actively being changed is like credit card debt. Either you pay it off, or you eventually go bankrupt.&lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Unit tests help mitigate the risk of changing code. When you're doing cleanup work, be sure there are unit tests for the things you're about to change. This may mean writing a few new ones yourself.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;If you’re working on a change and end up doing some minor cleanup, you can often include these cleanups in the same change. Be careful to not distract your code reviewer by adding too many unrelated cleanups. An option that works well is to &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;send the cleanup fixes in multiple tiny changes that are small enough to just take a few seconds to review&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;As mentioned in the book: &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;"Can you imagine working on a project where the code simply got better as time passed?"&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;“Clean Code: A Handbook of Agile Software Craftsmanship” by Robert C. Martin was published in 2008.&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/15045980/posts/default/7314410554323962981" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/15045980/posts/default/7314410554323962981" rel="self" type="application/atom+xml"/><link href="http://testing.googleblog.com/2023/11/clean-up-code-cruft.html" rel="alternate" title="Clean Up Code Cruft" type="text/html"/><author><name>Google Testing Bloggers</name><uri>http://www.blogger.com/profile/03153388556673050910</uri><email>noreply@blogger.com</email><gd:image height="7" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdMvmFPVLU3JodSkp-aAbNab12mpvIjMuLkNIgbRH6LHNds3HjRtN56Q7wiZxoHklUQmwE97HdRbjTd4rnyuXMVroVk0ChzQOba6fs1doitqFw64aFHGjaikWMor7wQA/s1600/gtb3.png" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-15045980.post-6211036689612380771</id><published>2023-11-06T05:45:00.000-08:00</published><updated>2024-05-17T10:49:33.875-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Andrew Trenk"/><category scheme="http://www.blogger.com/atom/ns#" term="Code Health"/><category scheme="http://www.blogger.com/atom/ns#" term="TotT"/><title type="text">Write Clean Code to Reduce Cognitive Load</title><content type="html">&lt;style&gt;
@media only screen and (max-width: 600px) {
  .body {
    overflow-x: auto;
  }
}
&lt;/style&gt;

&lt;div class="body"&gt;
&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17.3333px; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;i&gt;This is another post in our &lt;a href="https://testing.googleblog.com/2017/04/code-health-googles-internal-code.html"&gt;Code Health&lt;/a&gt; series. A version of this post originally appeared in Google bathrooms worldwide as a Google &lt;a href="https://testing.googleblog.com/2007/01/introducing-testing-on-toilet.html"&gt;Testing on the Toilet&lt;/a&gt; episode. &lt;/i&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;You can download a &lt;a href="https://docs.google.com/document/d/1AgcBG2iOmzEWIKYs6hNDyTMZ-an0SOwmJZRsX898XD0/edit?pli=1"&gt;printer-friendly version&lt;/a&gt; to display in your office.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;By Andrew Trenk&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif;"&gt;&lt;span style="white-space-collapse: preserve;"&gt;&lt;span id="docs-internal-guid-efdb23bd-7fff-5b45-0037-501b8ba2ac7c"&gt;&lt;p dir="ltr" style="font-size: 17.3333px; line-height: 1.2; margin-bottom: 10pt; margin-top: 5pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;Do you ever read code and find it hard to understand? You may be experiencing cognitive load!&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="font-size: 17.3333px; line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;a href="https://en.wikipedia.org/wiki/Cognitive_load" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;Cognitive load&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt; refers to the amount of mental effort required to complete a task&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;When reading code, you have to keep in mind information such as values of variables, conditional logic, loop indices, data structure state, and interface contracts. &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;Cognitive load increases as code becomes more complex&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;. People can typically hold up to 5–7 separate pieces of information in their short-term memory (&lt;/span&gt;&lt;a href="https://en.wikipedia.org/wiki/Working_memory#Capacity" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;source&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;); code that involves more information than that can be difficult to understand.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="font-size: 17.3333px; line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt; text-align: center;"&gt;&lt;span style="border: none; display: inline-block; height: 186px; overflow: hidden; width: 444px;"&gt;&lt;img alt="Two brains displayed side-by-side. 

The left brain is red with a sad face. The text below it says 'Complex code: Too much cognitive load'.;

The left brain is green with a happy face. The text below it says 'Simple code: Minimal cognitive load'." height="186" src="https://lh7-us.googleusercontent.com/WzdHDiRPb_QYc-sXvRxiM_5qb07FAfm5Jp3zin9MlU92Rpjjz0KLx7JKUwe1PDPRKZsK6Fg7hGhNN50qa5ftWFpnq7fUMrar0EOckvDZQ9HgBw7nf3IHOTVf4cFrSdMOGCVwxzw5VC-UWyBivPSclWQ" style="margin-left: 8.30025px; margin-top: -5.65394e-14px;" width="435.69975305574087" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="font-size: 17.3333px; line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;Cognitive load is often higher for other people reading code you wrote than it is for yourself,&lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline;"&gt; since readers need to understand your intentions. Think of the times you read someone else’s code and struggled to understand its behavior. One of the &lt;/span&gt;&lt;a href="https://google.github.io/eng-practices/review/reviewer/looking-for.html#complexity" style="font-size: 17.3333px; font-weight: 400; text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;reasons for code reviews&lt;/span&gt;&lt;/a&gt;&lt;span style="color: black; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline;"&gt; is to allow reviewers to check if the changes to the code cause too much cognitive load. &lt;/span&gt;&lt;span style="color: black; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline;"&gt;Be kind to your co-workers: reduce their cognitive load by writing clean code.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="font-size: 17.3333px; line-height: 1.2; margin-bottom: 10pt; margin-top: 10pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;The key to reducing cognitive load is to &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;make code simpler&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; so it can be understood more easily by readers. This is the principle behind many code health practices. Here are some examples:&lt;/span&gt;&lt;/p&gt;&lt;ul style="font-size: 17.3333px; margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="1" dir="ltr" style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; text-wrap: nowrap; vertical-align: baseline;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;Limit the amount of code in a function or file. &lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;Aim to keep the code concise enough that you can keep the whole thing in your head at once. Prefer to &lt;/span&gt;&lt;a href="https://martinfowler.com/bliki/FunctionLength.html" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap: wrap; vertical-align: baseline;"&gt;keep functions small&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;, and try to limit each class to a &lt;/span&gt;&lt;a href="https://en.wikipedia.org/wiki/Single-responsibility_principle" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap: wrap; vertical-align: baseline;"&gt;single responsibility&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; text-wrap: nowrap; vertical-align: baseline;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;Create abstractions to hide implementation details&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;. &lt;/span&gt;&lt;a href="https://en.wikipedia.org/wiki/Abstraction_(computer_science)" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap: wrap; vertical-align: baseline;"&gt;Abstractions&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; such as functions and interfaces allow you to deal with simpler concepts and hide complex details. However, remember that over-engineering your code with too many abstractions also causes cognitive load.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; text-wrap: nowrap; vertical-align: baseline;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;Simplify control flow.&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; Functions with too many &lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;if&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; statements or loops can be hard to understand since it is difficult to keep the entire &lt;/span&gt;&lt;a href="https://testing.googleblog.com/2023/10/simplify-your-control-flows.html" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap: wrap; vertical-align: baseline;"&gt;control flow&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; in your head. Hide complex logic in helper functions, and &lt;/span&gt;&lt;a href="https://testing.googleblog.com/2017/06/code-health-reduce-nesting-reduce.html" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap: wrap; vertical-align: baseline;"&gt;reduce nesting&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; by using early returns to handle special cases.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; text-wrap: nowrap; vertical-align: baseline;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;Minimize mutable state.&lt;/span&gt;&lt;span style="font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; Stateless code is simpler to understand. For example, avoid mutable class fields when possible, and make types &lt;/span&gt;&lt;a href="https://en.wikipedia.org/wiki/Immutable_object" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap: wrap; vertical-align: baseline;"&gt;immutable&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; text-wrap: nowrap; vertical-align: baseline;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 5pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;Include only relevant details in tests.&lt;/span&gt;&lt;span style="font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; A test can be &lt;/span&gt;&lt;a href="https://testing.googleblog.com/2023/10/include-only-relevant-details-in-tests.html" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap: wrap; vertical-align: baseline;"&gt;hard to follow&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; if it includes boilerplate test data that is irrelevant to the test case, or relevant test data is hidden in helper functions.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; margin-left: -18pt; text-wrap: nowrap; vertical-align: baseline;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt;Don’t overuse mocks in tests.&lt;/span&gt;&lt;span style="font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;a href="https://testing.googleblog.com/2013/05/testing-on-toilet-dont-overuse-mocks.html" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap: wrap; vertical-align: baseline;"&gt;Improper use of mocks&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"&gt; can lead to tests that are cluttered with calls that expose implementation details of the system under test.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span id="docs-internal-guid-aa143d67-7fff-72bb-0c67-c9dcd32532e8"&gt;&lt;span style="font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;Learn more about cognitive load in the book &lt;/span&gt;&lt;a href="https://www.manning.com/books/the-programmers-brain" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;The Programmer’s Brain&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;, by Felienne Hermans.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/15045980/posts/default/6211036689612380771" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/15045980/posts/default/6211036689612380771" rel="self" type="application/atom+xml"/><link href="http://testing.googleblog.com/2023/11/write-clean-code-to-reduce-cognitive.html" rel="alternate" title="Write Clean Code to Reduce Cognitive Load" type="text/html"/><author><name>Google Testing Bloggers</name><uri>http://www.blogger.com/profile/03153388556673050910</uri><email>noreply@blogger.com</email><gd:image height="7" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdMvmFPVLU3JodSkp-aAbNab12mpvIjMuLkNIgbRH6LHNds3HjRtN56Q7wiZxoHklUQmwE97HdRbjTd4rnyuXMVroVk0ChzQOba6fs1doitqFw64aFHGjaikWMor7wQA/s1600/gtb3.png" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://lh7-us.googleusercontent.com/WzdHDiRPb_QYc-sXvRxiM_5qb07FAfm5Jp3zin9MlU92Rpjjz0KLx7JKUwe1PDPRKZsK6Fg7hGhNN50qa5ftWFpnq7fUMrar0EOckvDZQ9HgBw7nf3IHOTVf4cFrSdMOGCVwxzw5VC-UWyBivPSclWQ=s72-c" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-15045980.post-2502916728885468579</id><published>2023-10-30T05:43:00.001-07:00</published><updated>2024-05-17T10:49:37.240-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Dagang Wei"/><category scheme="http://www.blogger.com/atom/ns#" term="TotT"/><title type="text">Include Only Relevant Details In Tests</title><content type="html">&lt;style&gt;
@media only screen and (max-width: 600px) {
  .body {
    overflow-x: auto;
  }
}
&lt;/style&gt;

&lt;div class="body"&gt;
&lt;span style="font-family: times, &amp;quot;times new roman&amp;quot;, serif; font-style: italic; vertical-align: baseline; white-space-collapse: preserve;"&gt;This article was adapted from a Google &lt;/span&gt;&lt;a href="http://googletesting.blogspot.com/2007/01/introducing-testing-on-toilet.html" style="font-family: times, &amp;quot;times new roman&amp;quot;, serif;"&gt;&lt;span style="color: #1155cc; font-style: italic; vertical-align: baseline; white-space-collapse: preserve;"&gt;Testing on the Toilet&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: times, &amp;quot;times new roman&amp;quot;, serif; font-style: italic; vertical-align: baseline; white-space-collapse: preserve;"&gt; (TotT) episode. You can download a &lt;/span&gt;&lt;a href="https://docs.google.com/document/d/1huR_E1pEzNyQL__kcOBBw989H_IYAdmgYzadaG8IUgM/edit" rel="nofollow" style="font-family: times, &amp;quot;times new roman&amp;quot;, serif;"&gt;&lt;span style="color: #1155cc; font-style: italic; vertical-align: baseline; white-space-collapse: preserve;"&gt;printer-friendly version&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: times, &amp;quot;times new roman&amp;quot;, serif; font-style: italic; vertical-align: baseline; white-space-collapse: preserve;"&gt; of this TotT episode and post it in your office.&lt;/span&gt;&lt;div&gt;&lt;span style="font-family: times, &amp;quot;times new roman&amp;quot;, serif; font-style: italic; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: times, &amp;quot;times new roman&amp;quot;, serif; vertical-align: baseline; white-space-collapse: preserve;"&gt;By Dagang Wei&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: times, &amp;quot;times new roman&amp;quot;, serif; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: times, &amp;quot;times new roman&amp;quot;, serif; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;span id="docs-internal-guid-60eea5c2-7fff-f5fa-fbe2-92dbe836ca9f"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 4pt; margin-top: 0pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;What problem in the code below makes the test hard to follow?&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 4pt; margin-top: 0pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;&lt;span id="docs-internal-guid-f3b3abed-7fff-f649-592a-6f76a08e11a7"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;span id="docs-internal-guid-75caae8d-7fff-df7f-beb6-1d201e3367f7"&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none;"&gt;&lt;colgroup&gt;&lt;col width="733"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;def test_get_balance(self):&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;settings = BankSettings(&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;FDIC_INSURED&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;, &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;REGULATED&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;, &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;US_BASED&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;account = Account(settings, &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;ID&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;, &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;BALANCE&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;, &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;ADDRESS&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;, &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;NAME&lt;/span&gt;&lt;span style="background-color: transparent; color: #980000; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;, &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;EMAIL, PHONE&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;self.assertEqual(account.GetBalance(), &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;BALANCE&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 4pt; margin-top: 0pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;&lt;span id="docs-internal-guid-3d51ae6e-7fff-5297-ffcb-5a7cad19574d"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 5pt;"&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;The problem is that there is a lot of noise in the account creation code&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;,&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; which makes it hard to tell which details are relevant to the assert statement.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 4pt; margin-top: 5pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;But going from one extreme to the other can also make the test hard to follow:&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;span id="docs-internal-guid-00e4f065-7fff-8626-b886-682548701403"&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none;"&gt;&lt;colgroup&gt;&lt;col width="733"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 11.0654pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;def test_get_balance(self):&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;account = _create_account()&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;self.assertEqual(account.GetBalance(), &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;BALANCE&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 5pt;"&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;Now the problem is that critical details are hidden&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; in the &lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;_create_account()&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; helper function, so it’s not obvious where the &lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;BALANCE&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; field comes from. In order to understand the test, you need to switch context by diving into the helper function.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 4pt; margin-top: 5pt;"&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;A good test should include only details relevant to the test, while hiding noise:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 4pt; margin-top: 5pt;"&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;&lt;span id="docs-internal-guid-db2b8521-7fff-9809-ec5b-b85139f371c7" style="font-weight: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none; table-layout: fixed; width: 554.4pt;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;def test_get_balance():&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;account = _create_account(&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;BALANCE&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;self.assertEqual(account.GetBalance(), &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;BALANCE&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 4pt; margin-top: 10pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;By following this advice,&lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;it should be easy to see the flow of data throughout a test&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;. For example:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 4pt; margin-top: 10pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;&lt;span id="docs-internal-guid-73545355-7fff-45d0-5cfc-2f8668c54659"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none;"&gt;&lt;colgroup&gt;&lt;col width="370"&gt;&lt;/col&gt;&lt;col width="370"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 20.1987pt;"&gt;&lt;td style="background-color: white; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Times New Roman',serif; font-size: 13pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;Bad (flow of data is hidden):&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="background-color: white; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Times New Roman',serif; font-size: 13pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;Good (flow of data is clear):&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;def test_bank_account_overdraw_fails(self):&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;account = _create_account()&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;outcome = _overdraw(account)&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;self._assert_withdraw_failed(&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;outcome, account)&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;def _create_account():&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;settings = BankSettings(...)&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;return Account(settings, &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;BALANCE&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;, ...)&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;def _overdraw(account):&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;# Boilerplate code&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 9pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;...&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;return account.Withdraw(&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;BALANCE + 1&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;def _assert_withdraw_failed(&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self, outcome, account):&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;self.assertEqual(outcome, FAILED)&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;self.assertEqual(&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;account.GetBalance(), &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;BALANCE&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;def test_bank_account_overdraw_fails(self):&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;account = _create_account(&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;BALANCE&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;outcome = _withdraw(account, &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;BALANCE + 1&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;self.assertEqual(outcome, FAILED)&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;self.assertEqual(&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;account.GetBalance(), &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;BALANCE&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;)&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;def _create_account(balance):&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;settings = BankSettings(...)&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;return Account(settings, balance&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;,&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt; ...)&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;def _withdraw(account, amount):&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;# Boilerplate code&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 9pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;...&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;return account.Withdraw(amount)&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/15045980/posts/default/2502916728885468579" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/15045980/posts/default/2502916728885468579" rel="self" type="application/atom+xml"/><link href="http://testing.googleblog.com/2023/10/include-only-relevant-details-in-tests.html" rel="alternate" title="Include Only Relevant Details In Tests" type="text/html"/><author><name>Google Testing Bloggers</name><uri>http://www.blogger.com/profile/03153388556673050910</uri><email>noreply@blogger.com</email><gd:image height="7" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdMvmFPVLU3JodSkp-aAbNab12mpvIjMuLkNIgbRH6LHNds3HjRtN56Q7wiZxoHklUQmwE97HdRbjTd4rnyuXMVroVk0ChzQOba6fs1doitqFw64aFHGjaikWMor7wQA/s1600/gtb3.png" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-15045980.post-5602640138303313753</id><published>2023-10-24T05:46:00.000-07:00</published><updated>2024-05-17T10:49:40.364-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Code Health"/><category scheme="http://www.blogger.com/atom/ns#" term="Jeff Hoy"/><category scheme="http://www.blogger.com/atom/ns#" term="TotT"/><title type="text">Simplify Your Control Flows</title><content type="html">&lt;style&gt;
@media only screen and (max-width: 600px) {
  .body {
    overflow-x: auto;
  }
}
&lt;/style&gt;

&lt;div class="body"&gt;
&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17.3333px; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;i&gt;This is another post in our &lt;a href="https://testing.googleblog.com/2017/04/code-health-googles-internal-code.html"&gt;Code Health&lt;/a&gt; series. A version of this post originally appeared in Google bathrooms worldwide as a Google &lt;a href="https://testing.googleblog.com/2007/01/introducing-testing-on-toilet.html"&gt;Testing on the Toilet&lt;/a&gt; episode. &lt;/i&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;You can download a &lt;a href="https://docs.google.com/document/d/1wi50sHboQQPhsgq9VosWwn91RrNDhOLi9C-YivZiO_c/edit"&gt;printer-friendly version&lt;/a&gt; to display in your office.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;By Jeff Hoy&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;span id="docs-internal-guid-c1f707f0-7fff-060e-7c40-808b329bfa39"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;When adding loops and conditionals, even simple code can become difficult to understand.&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;Consider this change:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;&lt;span id="docs-internal-guid-eac1e3b3-7fff-2512-5e30-72fbe0a6d397" style="font-weight: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 27.75pt;"&gt;&lt;table style="border-collapse: collapse; border: none;"&gt;&lt;colgroup&gt;&lt;col width="328"&gt;&lt;/col&gt;&lt;col width="334"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: white; border-bottom: solid #ffffff 0.75pt; border-color: rgb(0, 0, 0) rgb(0, 0, 0) rgb(255, 255, 255); border-left: solid #000000 0.75pt; border-right: solid #000000 0.75pt; border-style: solid; border-top: solid #000000 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 7pt 7pt 0pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;if (commode.HasPreferredCustomer()) {&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="background-color: white; border-bottom: solid #ffffff 0.75pt; border-color: rgb(0, 0, 0) rgb(0, 0, 0) rgb(255, 255, 255); border-left: solid #000000 0.75pt; border-right: solid #000000 0.75pt; border-style: solid; border-top: solid #000000 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 7pt 7pt 0pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;if (commode.HasPreferredCustomer()) {&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: white; border-left: 0.75pt solid rgb(0, 0, 0); border-right: 0.75pt solid rgb(0, 0, 0); border-top: 0.75pt solid rgb(255, 255, 255); overflow-wrap: break-word; overflow: hidden; padding: 0pt 7pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp; commode.WarmSeat();&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="background-color: white; border-bottom: solid #ffffff 0.75pt; border-color: rgb(255, 255, 255) rgb(0, 0, 0); border-left: solid #000000 0.75pt; border-right: solid #000000 0.75pt; border-style: solid; border-top: solid #ffffff 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 0pt 7pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp; commode.WarmSeat();&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #f3f3f3; border-left: 0.75pt solid rgb(0, 0, 0); border-right: 0.75pt solid rgb(0, 0, 0); overflow-wrap: break-word; overflow: hidden; padding: 0pt 7pt; vertical-align: top;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="background-color: #95f195; border-bottom: solid #95f195 0.75pt; border-color: rgb(255, 255, 255) rgb(0, 0, 0) rgb(149, 241, 149); border-left: solid #000000 0.75pt; border-right: solid #000000 0.75pt; border-style: solid; border-top: solid #ffffff 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 0pt 7pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;} else if (commode.CustomerOnPhone()) {&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #f3f3f3; border-left: 0.75pt solid rgb(0, 0, 0); border-right: 0.75pt solid rgb(0, 0, 0); overflow-wrap: break-word; overflow: hidden; padding: 0pt 7pt; vertical-align: top;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="background-color: #95f195; border-bottom: solid #ffffff 0.75pt; border-color: rgb(149, 241, 149) rgb(0, 0, 0) rgb(255, 255, 255); border-left: solid #000000 0.75pt; border-right: solid #000000 0.75pt; border-style: solid; border-top: solid #95f195 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 0pt 7pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp; commode.ChillSeat();&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 9.75pt;"&gt;&lt;td style="background-color: white; border-bottom: 0.75pt solid rgb(0, 0, 0); border-left: 0.75pt solid rgb(0, 0, 0); border-right: 0.75pt solid rgb(0, 0, 0); overflow-wrap: break-word; overflow: hidden; padding: 0pt 7pt 7pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="background-color: white; border-bottom: solid #000000 0.75pt; border-color: rgb(255, 255, 255) rgb(0, 0, 0) rgb(0, 0, 0); border-left: solid #000000 0.75pt; border-right: solid #000000 0.75pt; border-style: solid; border-top: solid #ffffff 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 0pt 7pt 7pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;
While the above change may seem simple, even adding a single &lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;else&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; statement can make the code harder to follow since &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;the complexity of code grows quickly with its size&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;. Below we see the code surrounding the above snippet; the control flow on the right illustrates how much a reader needs to retain:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;&lt;span id="docs-internal-guid-1c80c8df-7fff-b5e3-ea16-b2e19da4cce8"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0.75pt;"&gt;&lt;table style="border-collapse: collapse; border: none;"&gt;&lt;colgroup&gt;&lt;col width="380"&gt;&lt;/col&gt;&lt;col width="339"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 7.2pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;while (commode.StillOccupied()) {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;if (commode.HasPreferredCustomer()) {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;commode.WarmSeat();&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: #95f195; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;} &lt;/span&gt;&lt;span style="background-color: #95f195; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;else if (commode.CustomerOnPhone()) {&lt;/span&gt;&lt;span face="Consolas,sans-serif" style="background-color: #95f195; color: black; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;  &lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: #95f195; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;commode.ChillSeat(); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span face="Consolas,sans-serif" style="background-color: #95f195; color: black; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;  &lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;if (commode.ContainsKale()) {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;commode.PrintHealthCertificate();&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="background-color: white; border-bottom: solid #ffffff 1pt; border-color: rgb(255, 255, 255) rgb(255, 255, 255) rgb(255, 255, 255) rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #ffffff 1pt; border-style: solid; border-top: solid #ffffff 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 7.2pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Times New Roman',serif; font-size: 13pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;span style="border: none; display: inline-block; height: 134px; overflow: hidden; width: 170px;"&gt;&lt;img height="134" src="https://lh7-us.googleusercontent.com/pH4drAWtciV0pwKh2TM6Dg3rD0CeXykX2N1mHQJT02NMb__OmC8luVQiHo2PP48U-99MtQqlVlDuA4BRWgHqLr-x1PuVKhflK-PtuZz8QW0Icgp24-c0nCUXz6LgXZJ-TdObSmIHgSWvitn1c_rkivc" style="margin-left: 0px; margin-top: 0px;" width="170" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Times New Roman',serif; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;Code Control Flow with 5 structures and 9 edges:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Times New Roman',serif; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;challenging for a reader to retain in memory.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div align="left" dir="ltr" style="margin-left: 0.75pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" dir="ltr" style="margin-left: 0.75pt;"&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;In order to fully understand the code, &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;the reader needs to keep the entire control flow in their head&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;.&amp;nbsp; However, the retention capacity of working memory is limited (&lt;/span&gt;&lt;a href="https://en.wikipedia.org/wiki/Working_memory#Capacity" style="font-size: 17.3333px; text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;source&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;)&amp;nbsp; Code path complexity will also challenge the reader, and can be measured using &lt;/span&gt;&lt;a href="https://en.wikipedia.org/wiki/Cyclomatic_complexity" style="font-size: 17.3333px; text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;"&gt;cyclomatic complexity&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="color: #990000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;
To reduce cognitive overhead of complex code, &lt;/span&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;push implementation logic down into functions and methods&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;. For example, if the &lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;if/else&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; structure in the above code is moved into an &lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;AdjustSeatTemp()&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt; method, the reviewer can review the two blocks independently, each having a much simpler control graph:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span id="docs-internal-guid-afe35382-7fff-e31c-9f8f-9b9adf2a5952"&gt;&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0.75pt;"&gt;&lt;table style="border-collapse: collapse; border: none;"&gt;&lt;colgroup&gt;&lt;col width="324"&gt;&lt;/col&gt;&lt;col width="203"&gt;&lt;/col&gt;&lt;col width="192"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 77pt;"&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 7.2pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;while (commode.StillOccupied()) {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;commode.AdjustSeatTemp();&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;if (commode.ContainsKale()) {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;commode.PrintHealthCertificate();&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: solid #ffffff 1pt; border-color: rgb(255, 255, 255) rgb(255, 255, 255) rgb(255, 255, 255) rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #ffffff 1pt; border-style: solid; border-top: solid #ffffff 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 7.2pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;span style="border: none; display: inline-block; height: 71px; overflow: hidden; width: 156px;"&gt;&lt;img height="71" src="https://lh7-us.googleusercontent.com/zVM_EP3hjr4ETeIbV-wigEQas0pdY9_XAa0wojjtK6oQHNtBkkhiBOTym_mqWl-WKviIti0IQuKV2QRh884WtVrE27KZmX4vpiGPHp2NbUQuHoW9alYrk5QIuyFhRoIosYFxrjd97HEMOcfJ-rLuUIM" style="margin-left: 0px; margin-top: 0px;" width="156" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Times New Roman',serif; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;3 control structures and 5 edges: easier to remember&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: solid #ffffff 1pt; border-color: rgb(255, 255, 255); border-left: solid #ffffff 1pt; border-right: solid #ffffff 1pt; border-style: solid; border-top: solid #ffffff 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 7.2pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Times New Roman',serif; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;span style="border: none; display: inline-block; height: 65px; overflow: hidden; width: 75px;"&gt;&lt;img height="65" src="https://lh7-us.googleusercontent.com/BwS3I9uDSeSN8PnKlzjkQLNztOfqXfZJ5m9Jrq2KH2BIZqoKr-QOW3Aa1ER6Al6mBkdK564tS01SvGYjy4l3cAMYGokyLcxskqV2z3YR0gIYWxnLhK79S5OgKtFsKpX85fKy_4SnUlA_kgUV-KgMnQg" style="margin-left: 0px; margin-top: 0px;" width="75" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Times New Roman',serif; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;Commode::AdjustSeatTemp()&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Times New Roman',serif; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;with 2 structures and 4 edges&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div align="left" dir="ltr" style="margin-left: 0.75pt;"&gt;&lt;span style="font-size: 13pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" dir="ltr" style="margin-left: 0.75pt;"&gt;&lt;span style="font-size: 13pt;"&gt;Avoiding complexity makes code easier to follow. In addition, code reviewers are more likely to identify logic errors, and maintainers are less likely to introduce complex code.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/15045980/posts/default/5602640138303313753" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/15045980/posts/default/5602640138303313753" rel="self" type="application/atom+xml"/><link href="http://testing.googleblog.com/2023/10/simplify-your-control-flows.html" rel="alternate" title="Simplify Your Control Flows" type="text/html"/><author><name>Google Testing Bloggers</name><uri>http://www.blogger.com/profile/03153388556673050910</uri><email>noreply@blogger.com</email><gd:image height="7" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdMvmFPVLU3JodSkp-aAbNab12mpvIjMuLkNIgbRH6LHNds3HjRtN56Q7wiZxoHklUQmwE97HdRbjTd4rnyuXMVroVk0ChzQOba6fs1doitqFw64aFHGjaikWMor7wQA/s1600/gtb3.png" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://lh7-us.googleusercontent.com/pH4drAWtciV0pwKh2TM6Dg3rD0CeXykX2N1mHQJT02NMb__OmC8luVQiHo2PP48U-99MtQqlVlDuA4BRWgHqLr-x1PuVKhflK-PtuZz8QW0Icgp24-c0nCUXz6LgXZJ-TdObSmIHgSWvitn1c_rkivc=s72-c" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-15045980.post-6925460638819343502</id><published>2023-10-17T05:50:00.003-07:00</published><updated>2024-05-17T10:49:43.682-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Code Health"/><category scheme="http://www.blogger.com/atom/ns#" term="Max Kanat-Alexander"/><category scheme="http://www.blogger.com/atom/ns#" term="TotT"/><title type="text">Improve Readability With Positive Booleans</title><content type="html">&lt;style&gt;
@media only screen and (max-width: 600px) {
  .body {
    overflow-x: auto;
  }
}
&lt;/style&gt;

&lt;div class="body"&gt;
&lt;div&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17.3333px; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;i&gt;This is another post in our &lt;a href="https://testing.googleblog.com/2017/04/code-health-googles-internal-code.html"&gt;Code Health&lt;/a&gt; series. A version of this post originally appeared in Google bathrooms worldwide as a Google &lt;a href="https://testing.googleblog.com/2007/01/introducing-testing-on-toilet.html"&gt;Testing on the Toilet&lt;/a&gt; episode. &lt;/i&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;You can download a &lt;a href="https://docs.google.com/document/d/1eKfofxfQYq86Icx0FxneQ47kwss5OQX5GhGo1yGAVOE/edit"&gt;printer-friendly version&lt;/a&gt; to display in your office.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;By &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Times New Roman, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;Max Kanat-Alexander&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Times New Roman, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span id="docs-internal-guid-79963df3-7fff-a824-398c-886754b4ff2c"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Reading healthy code should be as easy as reading a book in your native language. You shouldn’t have to stop and puzzle over what a line of code is doing. One small trick that can assist with this is to &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;make boolean checks about something &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;positive&lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt; rather than about something &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;negative.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Here’s an extreme example:&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none; table-layout: fixed; width: 554.4pt;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;if not nodisable_kryponite_shield&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;devise_clever_escape_plan()&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;else:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;engage_in_epic_battle()&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 10pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;What does that code do? Sure, you &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;can &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;figure it out, but &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;healthy code is not a puzzle, it’s a &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;simple communication.&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; Let’s look at two principles we can use to simplify this code.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 10pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;1. &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Name your flags and variables in such a way that they represent the &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;positive &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;check you wish to make&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; (the presence of something, something being enabled, something being true) rather than the &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;negative&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; check you wish to make (the absence of something, something being disabled, something being false).&lt;/span&gt;&lt;/p&gt;&lt;ol style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="1" dir="ltr" style="color: white; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 6pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: decimal; margin-left: -18pt; vertical-align: baseline; white-space: pre;"&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none; table-layout: fixed; width: 554.4pt;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #fff2cc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;if not&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;enable_kryponite_shield&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;devise_clever_escape_plan()&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;else:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;engage_in_epic_battle()&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 10pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;That is already easier to read and understand than the first example.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 10pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;2. &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;If your conditional looks like “&lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;if not &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;…&lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt; else &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;…&lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;” then reverse it to put the positive case first.&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: none; table-layout: fixed; width: 554.4pt;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #d9ead3; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 2.88pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;if enable_kryponite_shield&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;engage_in_epic_battle()&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;else:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp;devise_clever_escape_plan()&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Now the intention of the code is immediately obvious.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;There are many other contexts in which this gives improvements to readability. For example, the command &lt;/span&gt;&lt;span style="color: #38761d; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;foo --disable_feature=False&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; is harder to read and think about than &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #38761d; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;foo --enable_feature=True&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;, particularly when you change the default to enable the feature.&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;There are some exceptions (for example, in Python, &lt;/span&gt;&lt;span style="color: #38761d; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;if foo is not None&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; could be considered a “positive check” even though it has a “not” in it), but in general &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;checking the presence or absence of a positive is simpler for readers to understand than checking the presence or absence of a negative.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/15045980/posts/default/6925460638819343502" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/15045980/posts/default/6925460638819343502" rel="self" type="application/atom+xml"/><link href="http://testing.googleblog.com/2023/10/improve-readability-with-positive.html" rel="alternate" title="Improve Readability With Positive Booleans" type="text/html"/><author><name>Google Testing Bloggers</name><uri>http://www.blogger.com/profile/03153388556673050910</uri><email>noreply@blogger.com</email><gd:image height="7" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdMvmFPVLU3JodSkp-aAbNab12mpvIjMuLkNIgbRH6LHNds3HjRtN56Q7wiZxoHklUQmwE97HdRbjTd4rnyuXMVroVk0ChzQOba6fs1doitqFw64aFHGjaikWMor7wQA/s1600/gtb3.png" width="32"/></author></entry><entry><id>tag:blogger.com,1999:blog-15045980.post-7116397615681024713</id><published>2023-10-11T05:21:00.002-07:00</published><updated>2024-05-17T10:49:47.701-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="David Mandelberg"/><category scheme="http://www.blogger.com/atom/ns#" term="TotT"/><title type="text">Shell Scripts: Stay Small &amp; Simple</title><content type="html">&lt;style&gt;
@media only screen and (max-width: 600px) {
  .body {
    overflow-x: auto;
  }
}
&lt;/style&gt;

&lt;div class="body"&gt;
&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 17.3333px; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;i&gt;A version of this post originally appeared in Google bathrooms worldwide as a Google &lt;a href="https://testing.googleblog.com/2007/01/introducing-testing-on-toilet.html"&gt;Testing on the Toilet&lt;/a&gt; episode. &lt;/i&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;You can download a &lt;a href="https://docs.google.com/document/d/1CL9sXdVJG5aAySS5CintGg1yTiZZowJ98swsoTRcRuA/edit?pli=1"&gt;printer-friendly version&lt;/a&gt; to display in your office.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span style="font-family: Times New Roman, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Times New Roman, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;By David Mandelberg&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Times New Roman, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span id="docs-internal-guid-97010587-7fff-3900-52cf-f42d900a5f9d"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Shell scripts (including Bash scripts) can be convenient for automating simple command line procedures, and they are often better than keeping complicated commands in a single developer's history. However, &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;shell scripts can be hard to understand and maintain, and are typically not as well-supported as other programming languages&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;. Shell scripts have less support for unit testing, and there is likely a lower chance that somebody reading one will be experienced with the language.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Python, Go, or other general-purpose languages are often better choices than shell. Shell is convenient for some simple use cases, and the &lt;/span&gt;&lt;a href="https://google.github.io/styleguide/shellguide.html" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;Google shell style guide&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; can help with writing better shell scripts. But it is difficult, even for experienced shell scripters, to mitigate the risks of its many surprising behaviors. So whenever possible, &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;use shell scripts only for small, simple use cases, or avoid shell entirely.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Here are some examples of mistakes that are far too easy to make when writing a shell script (see &lt;/span&gt;&lt;a href="https://mywiki.wooledge.org/BashPitfalls" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;Bash Pitfalls&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; for many more):&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 10pt; margin-top: 0pt;"&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;span id="docs-internal-guid-72aa563b-7fff-3843-92d8-0714277d7f92"&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Forgetting to quote something can have surprising results&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;, due to shell's complicated evaluation rules. E.g., even if a wildcard is properly quoted, it can still be unexpectedly expanded elsewhere:&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 18.75pt;"&gt;&lt;table style="border-collapse: collapse; border: none; white-space: nowrap;"&gt;&lt;colgroup&gt;&lt;col width="714"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;$ msg='Is using bash a &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;pro?&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; Or a con?'&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;$ echo $msg&amp;nbsp; &lt;/span&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;# Note that there's a subdirectory called 'proc' in the current directory.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Is using bash a &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;proc&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; Or a con?&amp;nbsp; &lt;/span&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;# ? was unexpectedly treated as a wildcard.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;span id="docs-internal-guid-9fddfe8e-7fff-b0df-1d33-8acf0ed4bfd5"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;Many things that would be function arguments in other languages are command line arguments in shell. &lt;/span&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Command line arguments are world-readable, so they can leak secrets&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div align="left" dir="ltr" style="margin-left: 17.25pt;"&gt;&lt;table style="border-collapse: collapse; border: none; white-space: nowrap;"&gt;&lt;colgroup&gt;&lt;col width="716"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 33.75pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;$ curl -H "Authorization: Bearer &lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;${SECRET}&lt;/span&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;" "$URL" &amp;amp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;$ ps aux&amp;nbsp; &lt;/span&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;# The current list of processes shows the secret.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;span id="docs-internal-guid-271e19ec-7fff-13c3-759a-d475bdf74abb"&gt;&lt;span style="color: #980000; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;By default, the shell ignores all errors from commands&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;, which can cause severe bugs if code assumes that earlier commands succeeded. The command &lt;/span&gt;&lt;span style="color: #00931e; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;set -e&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; can appear to force termination at the first error, but &lt;/span&gt;&lt;a href="https://mywiki.wooledge.org/BashPitfalls#errexit" style="text-decoration-line: none;"&gt;&lt;span style="color: #1155cc; font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"&gt;its behavior is inconsistent&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;. For example, &lt;/span&gt;&lt;span style="color: #00931e; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;set -e&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; does not affect some commands in pipelines (like &lt;/span&gt;&lt;span style="color: #00931e; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;false&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; in &lt;/span&gt;&lt;span style="color: #00931e; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;false | cat&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;), nor will it affect some command substitutions (such as the &lt;/span&gt;&lt;span style="color: #00931e; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;false&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt; in &lt;/span&gt;&lt;span style="color: #00931e; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;export FOO="$(false)"&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;). Even worse, its behavior inside a function depends on how that function is called.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;&lt;span id="docs-internal-guid-e382aed6-7fff-3e7e-9697-3e44576cee58"&gt;&lt;span style="color: #980000; font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"&gt;Many things run in subshells&lt;/span&gt;&lt;span style="font-size: 13pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;, which can (often unexpectedly) hide changes to variables from the main shell. It can also make manual error handling harder, compounding the issue above:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div align="left" dir="ltr" style="margin-left: 17.25pt;"&gt;&lt;table style="border-collapse: collapse; border: none; white-space: nowrap;"&gt;&lt;colgroup&gt;&lt;col width="716"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="background-color: #f4cccc; border-bottom: solid #b7b7b7 1pt; border-color: rgb(183, 183, 183); border-left: solid #b7b7b7 1pt; border-right: solid #b7b7b7 1pt; border-style: solid; border-top: solid #b7b7b7 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;$ run_or_exit() { "$@" || exit $?; }&amp;nbsp; &lt;/span&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;# Executes the arguments then exits on failure.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;$ foo="$(run_or_exit false)"&amp;nbsp; &lt;/span&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"&gt;# &lt;/span&gt;&lt;span style="background-color: transparent; color: #1155cc; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"&gt;Exits the $() subshell, but the script continues.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/span&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;, serif;"&gt;&lt;span style="font-size: 17.3333px; white-space-collapse: preserve;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;</content><link href="http://www.blogger.com/feeds/15045980/posts/default/7116397615681024713" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/15045980/posts/default/7116397615681024713" rel="self" type="application/atom+xml"/><link href="http://testing.googleblog.com/2023/10/shell-scripts-stay-small-simple.html" rel="alternate" title="Shell Scripts: Stay Small &amp; Simple" type="text/html"/><author><name>Google Testing Bloggers</name><uri>http://www.blogger.com/profile/03153388556673050910</uri><email>noreply@blogger.com</email><gd:image height="7" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdMvmFPVLU3JodSkp-aAbNab12mpvIjMuLkNIgbRH6LHNds3HjRtN56Q7wiZxoHklUQmwE97HdRbjTd4rnyuXMVroVk0ChzQOba6fs1doitqFw64aFHGjaikWMor7wQA/s1600/gtb3.png" width="32"/></author></entry></feed>