<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kenneth K. Amadi</title>
    <description>The latest articles on DEV Community by Kenneth K. Amadi (@kennethkamadi).</description>
    <link>https://dev.to/kennethkamadi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4061049%2F17c1c9c7-228f-40dd-a5f8-b24268bf1f8f.jpg</url>
      <title>DEV Community: Kenneth K. Amadi</title>
      <link>https://dev.to/kennethkamadi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kennethkamadi"/>
    <language>en</language>
    <item>
      <title>Your Website Images Are Part of Search Now. Are You Treating Them That Way?</title>
      <dc:creator>Kenneth K. Amadi</dc:creator>
      <pubDate>Mon, 28 Sep 2026 23:00:00 +0000</pubDate>
      <link>https://dev.to/kennethkamadi/your-website-images-are-part-of-search-now-are-you-treating-them-that-way-55ek</link>
      <guid>https://dev.to/kennethkamadi/your-website-images-are-part-of-search-now-are-you-treating-them-that-way-55ek</guid>
      <description>&lt;p&gt;When most people think about SEO, they think about words.&lt;/p&gt;

&lt;p&gt;Page titles.&lt;/p&gt;

&lt;p&gt;Headings.&lt;/p&gt;

&lt;p&gt;Keywords.&lt;/p&gt;

&lt;p&gt;Blog posts.&lt;/p&gt;

&lt;p&gt;Links.&lt;/p&gt;

&lt;p&gt;The image usually comes later.&lt;/p&gt;

&lt;p&gt;Someone finds a nice photo, uploads it to the website, gives it a filename like &lt;code&gt;IMG_4827.jpg&lt;/code&gt;, adds it to the page and moves on.&lt;/p&gt;

&lt;p&gt;That approach is starting to look increasingly incomplete.&lt;/p&gt;

&lt;p&gt;Images have always been part of Google Search, but the way people search is changing.&lt;/p&gt;

&lt;p&gt;People can search using Google Lens, upload an image, use Circle to Search, or search an image directly from Chrome. Google has now added a &lt;strong&gt;multimodal search&lt;/strong&gt; filter to Search Console so site owners can see when their content is being surfaced through these image-based searches. &lt;a href="https://developers.google.com/search/blog/2026/09/web-multimodal-in-sc" rel="noopener noreferrer"&gt;Google explains the new reporting here&lt;/a&gt;. The rollout began globally on September 24, 2026.&lt;/p&gt;

&lt;p&gt;That doesn't mean every website suddenly needs an image SEO strategy.&lt;/p&gt;

&lt;p&gt;It does mean something simpler:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The images on your website are content too.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So let's look at what you can actually do with them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with the image itself
&lt;/h2&gt;

&lt;p&gt;Before touching filenames, alt text or metadata, ask a more basic question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is this a useful image?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your website is for an architecture company, photographs of completed buildings are useful.&lt;/p&gt;

&lt;p&gt;If you're selling a product, photographs of the actual product are useful.&lt;/p&gt;

&lt;p&gt;If you're publishing a tutorial, screenshots and diagrams can be useful.&lt;/p&gt;

&lt;p&gt;If you're writing about a real project your company completed, showing the project is useful.&lt;/p&gt;

&lt;p&gt;Compare that with a generic image of someone typing on a laptop that appears on every technology website on the internet.&lt;/p&gt;

&lt;p&gt;It might make the page look nicer.&lt;/p&gt;

&lt;p&gt;But it tells the visitor very little.&lt;/p&gt;

&lt;p&gt;This matters because Google's &lt;a href="https://developers.google.com/search/docs/appearance/google-images" rel="noopener noreferrer"&gt;image SEO guidance&lt;/a&gt; isn't simply about making images technically available. Google recommends using images that are relevant to the page and placing them near relevant text.&lt;/p&gt;

&lt;p&gt;A good image should add information.&lt;/p&gt;

&lt;p&gt;Not just fill an empty space.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give the image a sensible filename
&lt;/h2&gt;

&lt;p&gt;This:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IMG_4827.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;doesn't tell anyone much.&lt;/p&gt;

&lt;p&gt;Something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mobile-app-dashboard.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is more useful.&lt;/p&gt;

&lt;p&gt;Or, for a real project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;phunplan-mobile-booking-screen.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The filename isn't a magic ranking factor that will suddenly move a page to number one.&lt;/p&gt;

&lt;p&gt;That's not the point.&lt;/p&gt;

&lt;p&gt;You're simply giving the file a meaningful name before uploading it.&lt;/p&gt;

&lt;p&gt;And don't turn it into this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;best-mobile-app-development-company-mobile-app-developer-app-development.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's not optimisation.&lt;/p&gt;

&lt;p&gt;It's noise.&lt;/p&gt;

&lt;p&gt;Use a filename that naturally describes what the image is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then write the alt text properly
&lt;/h2&gt;

&lt;p&gt;This is where people often go too far.&lt;/p&gt;

&lt;p&gt;If you have an image of a mobile booking screen, an appropriate alternative text might be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;alt="PhunPlan mobile booking screen"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it's a photograph of a building:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;alt="Exterior of the Pathvera Group office building"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it's a decorative shape that contributes nothing to the meaning of the page, it may not need descriptive alt text at all.&lt;/p&gt;

&lt;p&gt;The purpose isn't to insert keywords into every image.&lt;/p&gt;

&lt;p&gt;The purpose is to provide an appropriate text alternative when the image conveys information.&lt;/p&gt;

&lt;p&gt;That distinction is important.&lt;/p&gt;

&lt;p&gt;Don't write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;alt="best mobile app development company in Nigeria mobile app developers"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;unless, somehow, that is genuinely what the image represents.&lt;/p&gt;

&lt;p&gt;It isn't.&lt;/p&gt;

&lt;p&gt;It's keyword stuffing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The surrounding page matters
&lt;/h2&gt;

&lt;p&gt;An image doesn't exist in isolation.&lt;/p&gt;

&lt;p&gt;Imagine you publish an article about building mobile applications.&lt;/p&gt;

&lt;p&gt;You include an image showing a mobile app interface.&lt;/p&gt;

&lt;p&gt;The image appears directly underneath a section discussing the app's booking flow.&lt;/p&gt;

&lt;p&gt;That's useful context.&lt;/p&gt;

&lt;p&gt;Now take exactly the same image and place it inside an unrelated article about accounting.&lt;/p&gt;

&lt;p&gt;The image hasn't changed.&lt;/p&gt;

&lt;p&gt;The context has.&lt;/p&gt;

&lt;p&gt;Google's image documentation recommends placing images near relevant text and using descriptive titles, captions and alt text where appropriate.&lt;/p&gt;

&lt;p&gt;So don't think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I need to optimise this image."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What does this image contribute to this page?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That usually leads to better decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't upload the original camera file
&lt;/h2&gt;

&lt;p&gt;There is another problem that has nothing to do with search keywords.&lt;/p&gt;

&lt;p&gt;File size.&lt;/p&gt;

&lt;p&gt;A designer sends you a beautiful photograph.&lt;/p&gt;

&lt;p&gt;It is 5.8 MB.&lt;/p&gt;

&lt;p&gt;You upload it directly to the website.&lt;/p&gt;

&lt;p&gt;The image looks fantastic.&lt;/p&gt;

&lt;p&gt;The page now has to download several megabytes before the visitor gets what they need.&lt;/p&gt;

&lt;p&gt;That is unnecessary.&lt;/p&gt;

&lt;p&gt;Resize the image to the dimensions actually needed.&lt;/p&gt;

&lt;p&gt;Compress it.&lt;/p&gt;

&lt;p&gt;Use an appropriate modern format where your browser and workflow support it.&lt;/p&gt;

&lt;p&gt;And don't serve a 4000-pixel image to a component that displays it at 600 pixels.&lt;/p&gt;

&lt;p&gt;This isn't about chasing a perfect Lighthouse score.&lt;/p&gt;

&lt;p&gt;Google's current &lt;a href="https://developers.google.com/search/docs/appearance/page-experience" rel="noopener noreferrer"&gt;page experience guidance&lt;/a&gt; explicitly says that Core Web Vitals matter, but also warns against treating a perfect score as the goal in itself. The purpose is a good experience for users.&lt;/p&gt;

&lt;p&gt;If an image can be 200 KB instead of 2 MB without a meaningful visual difference, that's simply better engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't forget responsive images
&lt;/h2&gt;

&lt;p&gt;There is another optimisation that is easy to overlook.&lt;/p&gt;

&lt;p&gt;The same image doesn't need to be downloaded at the same resolution on every device.&lt;/p&gt;

&lt;p&gt;A desktop monitor might display a large hero image.&lt;/p&gt;

&lt;p&gt;A phone may need something much smaller.&lt;/p&gt;

&lt;p&gt;Modern HTML gives us tools such as &lt;code&gt;srcset&lt;/code&gt; and &lt;code&gt;sizes&lt;/code&gt; to provide appropriate image resources for different display conditions.&lt;/p&gt;

&lt;p&gt;Your framework or image pipeline may already handle this for you.&lt;/p&gt;

&lt;p&gt;If it does, use it.&lt;/p&gt;

&lt;p&gt;If it doesn't, it's worth understanding what is actually being delivered to the browser.&lt;/p&gt;

&lt;p&gt;The question isn't:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Does the image look sharp?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It's also:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How much image did the browser have to download to make it look sharp?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Use the right image, not just the biggest one
&lt;/h2&gt;

&lt;p&gt;There is a tendency to think that higher resolution automatically means better.&lt;/p&gt;

&lt;p&gt;It doesn't.&lt;/p&gt;

&lt;p&gt;If the image is going to be displayed as a 400-pixel thumbnail, serving a 3000-pixel source isn't automatically an improvement.&lt;/p&gt;

&lt;p&gt;Likewise, don't compress an image so aggressively that important details disappear.&lt;/p&gt;

&lt;p&gt;There is a balance between:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;quality&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;cost of delivery&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The right image pipeline should handle that balance automatically where possible.&lt;/p&gt;

&lt;p&gt;This is one reason a good CMS matters.&lt;/p&gt;

&lt;p&gt;An administrator shouldn't have to understand image codecs, responsive breakpoints and compression settings every time they upload a photograph.&lt;/p&gt;

&lt;p&gt;The system should do more of the work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Think about the image people would actually search for
&lt;/h2&gt;

&lt;p&gt;This is where things get more interesting.&lt;/p&gt;

&lt;p&gt;Suppose you're a furniture company.&lt;/p&gt;

&lt;p&gt;You have a photograph of a particular chair.&lt;/p&gt;

&lt;p&gt;Someone might not search for the name of your company.&lt;/p&gt;

&lt;p&gt;They might search visually for:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"modern brown leather office chair"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or they might photograph a similar chair in a showroom and use Lens to find visually similar products.&lt;/p&gt;

&lt;p&gt;Your website doesn't control whether Google chooses to show your image.&lt;/p&gt;

&lt;p&gt;But you can make the image easier to understand.&lt;/p&gt;

&lt;p&gt;Use an appropriate product page.&lt;/p&gt;

&lt;p&gt;Give the image a meaningful filename.&lt;/p&gt;

&lt;p&gt;Use appropriate alt text.&lt;/p&gt;

&lt;p&gt;Provide useful surrounding content.&lt;/p&gt;

&lt;p&gt;Make the product details clear.&lt;/p&gt;

&lt;p&gt;If the page is an actual product page, use the relevant structured data correctly.&lt;/p&gt;

&lt;p&gt;Google supports &lt;a href="https://developers.google.com/search/docs/appearance/structured-data/product-snippet" rel="noopener noreferrer"&gt;Product structured data&lt;/a&gt; for product search features, and its &lt;a href="https://developers.google.com/search/docs/appearance/structured-data/merchant-listing" rel="noopener noreferrer"&gt;merchant listing documentation&lt;/a&gt; covers additional requirements for eligible product pages.&lt;/p&gt;

&lt;p&gt;The important part is that the image isn't doing the work alone.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;page, product information, structured data and image all describe the same thing&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your social preview image matters too
&lt;/h2&gt;

&lt;p&gt;There's another image that many websites get wrong.&lt;/p&gt;

&lt;p&gt;The image that appears when someone shares your page.&lt;/p&gt;

&lt;p&gt;Someone posts your article on social media or sends the link in a chat.&lt;/p&gt;

&lt;p&gt;What image appears?&lt;/p&gt;

&lt;p&gt;Does the website have a deliberately selected &lt;code&gt;og:image&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;Or does the platform grab something random from the page?&lt;/p&gt;

&lt;p&gt;Google's current &lt;a href="https://developers.google.com/search/docs/appearance/google-images" rel="noopener noreferrer"&gt;image SEO documentation&lt;/a&gt; also notes that it can use both structured data and the &lt;code&gt;og:image&lt;/code&gt; meta tag as sources when determining image thumbnails for Google Search and Discover.&lt;/p&gt;

&lt;p&gt;That doesn't mean you should create a dozen competing image signals.&lt;/p&gt;

&lt;p&gt;It means your site's preferred image should be intentional.&lt;/p&gt;

&lt;p&gt;For an article, that might be a designed article cover.&lt;/p&gt;

&lt;p&gt;For a product, it might be the primary product photograph.&lt;/p&gt;

&lt;p&gt;For a company page, it could be a suitable brand image.&lt;/p&gt;

&lt;p&gt;Decide what represents the page.&lt;/p&gt;

&lt;p&gt;Don't leave it to chance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Structured data can help, but don't add it everywhere
&lt;/h2&gt;

&lt;p&gt;Structured data is another place where SEO advice often becomes excessive.&lt;/p&gt;

&lt;p&gt;You don't need to put every schema type imaginable on every page.&lt;/p&gt;

&lt;p&gt;Use the type that actually describes the content.&lt;/p&gt;

&lt;p&gt;Google supports structured data for a range of content types and search features. For example, &lt;a href="https://developers.google.com/search/docs/appearance/structured-data/article" rel="noopener noreferrer"&gt;Article structured data&lt;/a&gt;, &lt;a href="https://developers.google.com/search/docs/appearance/structured-data/product-snippet" rel="noopener noreferrer"&gt;Product structured data&lt;/a&gt; and &lt;a href="https://developers.google.com/search/docs/appearance/structured-data/local-business" rel="noopener noreferrer"&gt;LocalBusiness structured data&lt;/a&gt; can help Google understand the content they describe.&lt;/p&gt;

&lt;p&gt;For example, if you have a product page, Product structured data may be appropriate.&lt;/p&gt;

&lt;p&gt;If you have an article, Article structured data may be appropriate.&lt;/p&gt;

&lt;p&gt;If you're describing a local business, LocalBusiness structured data may be appropriate.&lt;/p&gt;

&lt;p&gt;The important word is &lt;strong&gt;appropriate&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And structured data doesn't guarantee a special appearance in Google. It can make a page eligible for certain search features when the content and implementation meet Google's requirements. &lt;a href="https://developers.google.com/search/docs/appearance/structured-data" rel="noopener noreferrer"&gt;Google's structured data documentation&lt;/a&gt; explains the supported features and requirements.&lt;/p&gt;

&lt;p&gt;Don't add markup simply because an SEO checklist says you should.&lt;/p&gt;

&lt;p&gt;Add it because it accurately describes the page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your best images may already be sitting on your website
&lt;/h2&gt;

&lt;p&gt;Before creating new content, check what you already have.&lt;/p&gt;

&lt;p&gt;Open Search Console.&lt;/p&gt;

&lt;p&gt;Look at your Search performance reports.&lt;/p&gt;

&lt;p&gt;Google has now introduced a &lt;strong&gt;multimodal search type filter&lt;/strong&gt; that can show performance from searches involving Lens, Circle to Search, image uploads and other visual search interactions. The rollout began globally on September 24, 2026, and Google says the data appears when a site is receiving traffic from these queries. &lt;a href="https://developers.google.com/search/blog/2026/09/web-multimodal-in-sc" rel="noopener noreferrer"&gt;See Google's announcement&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If your site receives this type of traffic, you now have a much better way to understand it.&lt;/p&gt;

&lt;p&gt;You might discover that an image you considered secondary is helping people find the site.&lt;/p&gt;

&lt;p&gt;Or that your visual content is appearing in searches you weren't specifically targeting.&lt;/p&gt;

&lt;p&gt;That's valuable information.&lt;/p&gt;

&lt;p&gt;Don't guess what your audience is doing when Search Console can increasingly show you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give important images a real place in your content
&lt;/h2&gt;

&lt;p&gt;There is a difference between:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"We added an image because the page looked empty."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This image helps explain what this section is about."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The second approach produces better websites.&lt;/p&gt;

&lt;p&gt;If you're explaining how a CMS works, show the CMS.&lt;/p&gt;

&lt;p&gt;If you're describing a project, show the project.&lt;/p&gt;

&lt;p&gt;If you're selling a product, show the product clearly.&lt;/p&gt;

&lt;p&gt;If you're explaining a technical process, use a diagram or screenshot where it actually helps.&lt;/p&gt;

&lt;p&gt;And if the image doesn't contribute anything, you don't have to force one into the page.&lt;/p&gt;

&lt;p&gt;More images don't automatically mean better SEO.&lt;/p&gt;

&lt;p&gt;Better images can mean better content.&lt;/p&gt;

&lt;h2&gt;
  
  
  Be careful with AI-generated images
&lt;/h2&gt;

&lt;p&gt;AI-generated images make it very easy to fill a website.&lt;/p&gt;

&lt;p&gt;Need a hero image?&lt;/p&gt;

&lt;p&gt;Generate one.&lt;/p&gt;

&lt;p&gt;Need six blog illustrations?&lt;/p&gt;

&lt;p&gt;Generate six.&lt;/p&gt;

&lt;p&gt;Need a photograph for a service page?&lt;/p&gt;

&lt;p&gt;Generate one.&lt;/p&gt;

&lt;p&gt;Technically, that's convenient.&lt;/p&gt;

&lt;p&gt;But ask what the image is actually doing.&lt;/p&gt;

&lt;p&gt;If a software company publishes an article about a real engineering problem and uses a completely generic AI illustration of a glowing laptop, the image adds almost nothing.&lt;/p&gt;

&lt;p&gt;A screenshot of the actual system might be more useful.&lt;/p&gt;

&lt;p&gt;A diagram might be more useful.&lt;/p&gt;

&lt;p&gt;A photograph of the team working on the project might be more useful.&lt;/p&gt;

&lt;p&gt;A real example usually tells the reader something.&lt;/p&gt;

&lt;p&gt;Use generated imagery where it serves a purpose.&lt;/p&gt;

&lt;p&gt;Don't use it simply because an empty space on the page needs filling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run a simple image audit
&lt;/h2&gt;

&lt;p&gt;You can audit a website's images without turning the process into a major SEO project.&lt;/p&gt;

&lt;p&gt;Pick your ten most important pages.&lt;/p&gt;

&lt;p&gt;For each page, check:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Is the image actually useful?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If not, remove it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Does the filename make sense?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Rename it before uploading where practical.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Does meaningful imagery have appropriate alt text?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Describe the image rather than stuffing keywords into it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Is the file unnecessarily large?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Resize and compress it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Is the browser receiving an appropriately sized image?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Check responsive image handling.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Is the image close to the content it supports?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Context matters.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Is the page's preferred social/share image set?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Check &lt;code&gt;og:image&lt;/code&gt; where relevant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;If the page represents a product or another structured content type, is the appropriate structured data implemented correctly?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don't add markup just for the sake of it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Can Google access the image?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Make sure your image URLs aren't accidentally blocked.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;What does Search Console tell you?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Look at actual search performance instead of guessing.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's enough to uncover a surprising number of problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  The web is becoming more visual
&lt;/h2&gt;

&lt;p&gt;Search isn't only a box where someone types ten words anymore.&lt;/p&gt;

&lt;p&gt;People take pictures.&lt;/p&gt;

&lt;p&gt;They upload screenshots.&lt;/p&gt;

&lt;p&gt;They point their phones at things.&lt;/p&gt;

&lt;p&gt;They search from images.&lt;/p&gt;

&lt;p&gt;They interact with visual results.&lt;/p&gt;

&lt;p&gt;And Google's latest Search Console update is a good indication of where the web is heading: site owners are now being given more visibility into how their content performs in these multimodal experiences.&lt;/p&gt;

&lt;p&gt;That doesn't mean traditional SEO has disappeared.&lt;/p&gt;

&lt;p&gt;It hasn't.&lt;/p&gt;

&lt;p&gt;Text still matters.&lt;/p&gt;

&lt;p&gt;Good pages still matter.&lt;/p&gt;

&lt;p&gt;Good technical foundations still matter.&lt;/p&gt;

&lt;p&gt;But a modern website should treat its visual content as part of the information it publishes, not merely as decoration around the information.&lt;/p&gt;

&lt;p&gt;The next time you're about to upload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IMG_4827.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to a page, stop for a second.&lt;/p&gt;

&lt;p&gt;Ask what the image is saying.&lt;/p&gt;

&lt;p&gt;Ask whether it helps the visitor.&lt;/p&gt;

&lt;p&gt;Give it the right context.&lt;/p&gt;

&lt;p&gt;Deliver it efficiently.&lt;/p&gt;

&lt;p&gt;And make sure your website gives search engines enough information to understand what it is.&lt;/p&gt;

&lt;p&gt;That's image SEO in a much more useful form.&lt;/p&gt;

&lt;p&gt;Not a collection of tricks.&lt;/p&gt;

&lt;p&gt;Just better web development.&lt;/p&gt;




&lt;h2&gt;
  
  
  About the author
&lt;/h2&gt;

&lt;p&gt;I'm a software engineer focused on building production software and exploring the architectural problems that emerge as applications grow beyond their original assumptions.&lt;/p&gt;

&lt;p&gt;I share more of my engineering work and projects at &lt;a href="https://kenresoft.com/blog/" rel="noopener noreferrer"&gt;Kenresoft&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>imageseo</category>
      <category>multimodalsearch</category>
      <category>technicalseo</category>
      <category>googlelens</category>
    </item>
    <item>
      <title>When a Bug Isn't Really a Bug: How Architectural Constraints Hide Behind Technical Problems</title>
      <dc:creator>Kenneth K. Amadi</dc:creator>
      <pubDate>Sat, 12 Sep 2026 11:24:36 +0000</pubDate>
      <link>https://dev.to/kennethkamadi/when-a-bug-isnt-really-a-bug-how-architectural-constraints-hide-behind-technical-problems-1j</link>
      <guid>https://dev.to/kennethkamadi/when-a-bug-isnt-really-a-bug-how-architectural-constraints-hide-behind-technical-problems-1j</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Sometimes the hardest bugs aren't caused by broken code. They're caused by an architecture that no longer matches the problem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There is a particular kind of bug that can consume far more engineering time than it should.&lt;/p&gt;

&lt;p&gt;You fix it.&lt;/p&gt;

&lt;p&gt;It comes back.&lt;/p&gt;

&lt;p&gt;You fix it again.&lt;/p&gt;

&lt;p&gt;Then something else breaks in a completely different part of the feature, and you start wondering whether the two problems are actually related.&lt;/p&gt;

&lt;p&gt;I've learned to pay attention when that happens.&lt;/p&gt;

&lt;p&gt;Sometimes a bug is just a bug. There is a mistake in the code, you find it, fix it, add a test, and move on.&lt;/p&gt;

&lt;p&gt;But sometimes the bug is exposing a problem underneath the code.&lt;/p&gt;

&lt;p&gt;The implementation may be doing exactly what it was designed to do. The problem is that the design no longer fits what the application has become.&lt;/p&gt;

&lt;p&gt;That's when a bug stops being just a bug.&lt;/p&gt;

&lt;p&gt;It becomes an architectural constraint.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Trap of Fixing Symptoms
&lt;/h2&gt;

&lt;p&gt;Take a text editor as an example.&lt;/p&gt;

&lt;p&gt;Suppose the cursor occasionally jumps to the wrong position after an edit.&lt;/p&gt;

&lt;p&gt;You investigate and find that the selection is being recalculated incorrectly. You fix it.&lt;/p&gt;

&lt;p&gt;A few days later, applying formatting moves the cursor.&lt;/p&gt;

&lt;p&gt;You fix that too.&lt;/p&gt;

&lt;p&gt;Then lists start behaving strangely.&lt;/p&gt;

&lt;p&gt;Another fix.&lt;/p&gt;

&lt;p&gt;Then importing a document containing lists causes the editor to become unstable.&lt;/p&gt;

&lt;p&gt;Another fix.&lt;/p&gt;

&lt;p&gt;At some point, it is tempting to conclude that the editor simply has too many bugs.&lt;/p&gt;

&lt;p&gt;But that may not be what is happening.&lt;/p&gt;

&lt;p&gt;The individual failures can be symptoms of the same underlying assumption.&lt;/p&gt;

&lt;p&gt;For example, imagine an editor whose document is fundamentally represented as one large string, with global character offsets used to represent selections and formatting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Document
─────────────────────────────────────────────
"First paragraph\nSecond paragraph\nThird..."
─────────────────────────────────────────────
  0              15             30
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a simple editor, this is a perfectly reasonable design.&lt;/p&gt;

&lt;p&gt;Text is text.&lt;/p&gt;

&lt;p&gt;A selection is a pair of offsets.&lt;/p&gt;

&lt;p&gt;An attribute applies to a range.&lt;/p&gt;

&lt;p&gt;Insert some characters and shift the offsets after them.&lt;/p&gt;

&lt;p&gt;Delete some characters and shift them back.&lt;/p&gt;

&lt;p&gt;There is nothing inherently wrong with this approach.&lt;/p&gt;

&lt;p&gt;The trouble starts when the document becomes more than a string.&lt;/p&gt;

&lt;p&gt;Now it has paragraphs.&lt;/p&gt;

&lt;p&gt;Headings have levels.&lt;/p&gt;

&lt;p&gt;Lists have items and relationships.&lt;/p&gt;

&lt;p&gt;Some formatting belongs to individual characters.&lt;/p&gt;

&lt;p&gt;Other formatting belongs to an entire paragraph or block.&lt;/p&gt;

&lt;p&gt;Once that happens, you're asking a flat representation to describe a structured document.&lt;/p&gt;

&lt;p&gt;You can keep adding fixes.&lt;/p&gt;

&lt;p&gt;But you're no longer just fixing bugs.&lt;/p&gt;

&lt;p&gt;You're working around the limitations of the representation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Most Dangerous Bugs Are Sometimes Predictable
&lt;/h2&gt;

&lt;p&gt;One thing I've become more careful about is assuming that unexpected behavior means the code is behaving unexpectedly.&lt;/p&gt;

&lt;p&gt;Sometimes the behavior is actually predictable.&lt;/p&gt;

&lt;p&gt;It is just the predictable consequence of an assumption that no longer holds.&lt;/p&gt;

&lt;p&gt;Consider a simple cache.&lt;/p&gt;

&lt;p&gt;Early in an application's life, you might have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API
 ↓
Repository
 ↓
Cache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The repository fetches data, puts it in the cache, and returns it when needed.&lt;/p&gt;

&lt;p&gt;Simple.&lt;/p&gt;

&lt;p&gt;Then the application grows.&lt;/p&gt;

&lt;p&gt;Now you need background refreshes, stale data handling, retries, offline behavior, concurrent requests, cache invalidation, and partial updates.&lt;/p&gt;

&lt;p&gt;The original cache wasn't necessarily badly designed.&lt;/p&gt;

&lt;p&gt;It was designed for a smaller problem.&lt;/p&gt;

&lt;p&gt;The problem changed.&lt;/p&gt;

&lt;p&gt;The architecture didn't.&lt;/p&gt;

&lt;p&gt;This happens everywhere in software.&lt;/p&gt;

&lt;p&gt;A state class that worked nicely for three screens can become difficult to reason about when twenty screens depend on it.&lt;/p&gt;

&lt;p&gt;A navigation approach that worked for a small application can become awkward once deep links, authentication, nested navigation, and state restoration enter the picture.&lt;/p&gt;

&lt;p&gt;A simple data model can become painful once the application needs relationships, partial updates, synchronization, and more complex queries.&lt;/p&gt;

&lt;p&gt;A text buffer that works beautifully for plain text can become difficult to extend when the editor needs to understand document structure.&lt;/p&gt;

&lt;p&gt;The original decision wasn't necessarily wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The context changed.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why We Keep Fixing the Wrong Thing
&lt;/h2&gt;

&lt;p&gt;There is a practical reason this happens.&lt;/p&gt;

&lt;p&gt;A bug report usually gives you something concrete:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The cursor jumps after formatting."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can reproduce it.&lt;/p&gt;

&lt;p&gt;You can put a breakpoint somewhere.&lt;/p&gt;

&lt;p&gt;You can change a function.&lt;/p&gt;

&lt;p&gt;You can run the test again.&lt;/p&gt;

&lt;p&gt;Architecture is less satisfying.&lt;/p&gt;

&lt;p&gt;Architecture asks questions like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Why does formatting need to manipulate the same coordinate system used by text insertion?&lt;/p&gt;

&lt;p&gt;Why does this component need to know about that component?&lt;/p&gt;

&lt;p&gt;Why is this state represented this way?&lt;/p&gt;

&lt;p&gt;Why does a paragraph-level concept live inside a character-range system?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those questions don't immediately produce a patch.&lt;/p&gt;

&lt;p&gt;They produce investigation.&lt;/p&gt;

&lt;p&gt;And when there is a ticket waiting to be closed, the patch is usually more attractive.&lt;/p&gt;

&lt;p&gt;That's one of the ways technical debt accumulates.&lt;/p&gt;

&lt;p&gt;Not because engineers don't care about architecture.&lt;/p&gt;

&lt;p&gt;Because local fixes give you an immediate result, while architectural problems require you to step back and reconsider the problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Useful Question: "What Must Be True for This Bug to Exist?"
&lt;/h2&gt;

&lt;p&gt;One question I've found useful when debugging stubborn problems is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What must be true about the architecture for this bug to be possible?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Take the cursor example.&lt;/p&gt;

&lt;p&gt;Instead of asking only:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Why is the cursor jumping?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Why is the cursor position so dependent on these transformations in the first place?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That changes the investigation.&lt;/p&gt;

&lt;p&gt;You stop looking only at the incorrect value and start looking at the system producing it.&lt;/p&gt;

&lt;p&gt;Here's another example.&lt;/p&gt;

&lt;p&gt;Suppose deleting a list item occasionally causes formatting from the following item to move into the previous one.&lt;/p&gt;

&lt;p&gt;The obvious place to look is the deletion algorithm.&lt;/p&gt;

&lt;p&gt;But another useful question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Why does deleting one item require us to repair formatting ranges somewhere else?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That might reveal something deeper.&lt;/p&gt;

&lt;p&gt;Maybe the document model doesn't actually understand paragraphs.&lt;/p&gt;

&lt;p&gt;Maybe lists are being represented indirectly through character attributes.&lt;/p&gt;

&lt;p&gt;Maybe a global range-based representation is being asked to represent relationships it wasn't designed to represent.&lt;/p&gt;

&lt;p&gt;Now the problem isn't necessarily the deletion function.&lt;/p&gt;

&lt;p&gt;The problem may be the model underneath it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture Is About What the System Understands
&lt;/h2&gt;

&lt;p&gt;This is probably the most important distinction I've learned.&lt;/p&gt;

&lt;p&gt;Architecture isn't just folders.&lt;/p&gt;

&lt;p&gt;It isn't whether a project has:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data/
domain/
presentation/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It isn't whether you use BLoC, Riverpod, Provider, Clean Architecture, MVVM, or another pattern.&lt;/p&gt;

&lt;p&gt;Those choices can be useful.&lt;/p&gt;

&lt;p&gt;But architecture is ultimately about what concepts the system understands and how those concepts are represented.&lt;/p&gt;

&lt;p&gt;A document editor that understands only:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;characters
offsets
ranges
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;has a very different model from one that understands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;document
paragraph
list
list item
inline formatting
selection
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second system isn't automatically better because it has more classes.&lt;/p&gt;

&lt;p&gt;It is better only if those concepts actually exist in the problem you're solving.&lt;/p&gt;

&lt;p&gt;The goal isn't to create more abstractions.&lt;/p&gt;

&lt;p&gt;The goal is to make the important concepts explicit.&lt;/p&gt;

&lt;h2&gt;
  
  
  But This Doesn't Mean "Rewrite Everything"
&lt;/h2&gt;

&lt;p&gt;This is where architecture discussions can become dangerous.&lt;/p&gt;

&lt;p&gt;Once you discover that a model has become a constraint, it is tempting to throw everything away.&lt;/p&gt;

&lt;p&gt;I've had that instinct myself.&lt;/p&gt;

&lt;p&gt;You find the underlying problem and suddenly the existing architecture looks terrible.&lt;/p&gt;

&lt;p&gt;But a rewrite isn't automatically the right answer.&lt;/p&gt;

&lt;p&gt;Existing code contains knowledge.&lt;/p&gt;

&lt;p&gt;It contains behavior that users already depend on.&lt;/p&gt;

&lt;p&gt;It contains edge cases that may not be obvious from reading the code.&lt;/p&gt;

&lt;p&gt;And sometimes the majority of the architecture is still perfectly fine.&lt;/p&gt;

&lt;p&gt;The better question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What is the smallest architectural change that allows the system to represent the problem correctly?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That might mean introducing a proper paragraph index.&lt;/p&gt;

&lt;p&gt;It might mean separating character-level attributes from paragraph-level attributes.&lt;/p&gt;

&lt;p&gt;It might mean introducing a block abstraction without replacing the entire text engine.&lt;/p&gt;

&lt;p&gt;It might mean introducing a new representation alongside the old one and migrating gradually.&lt;/p&gt;

&lt;p&gt;Architecture doesn't have to be a choice between:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;keep everything
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rewrite everything
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is usually another option:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;change the boundary where the existing model stops being appropriate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is often a much more manageable engineering problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture Should Follow the Problem
&lt;/h2&gt;

&lt;p&gt;One mistake we can make as developers is treating architecture as permanent.&lt;/p&gt;

&lt;p&gt;We design something and unconsciously expect it to remain valid forever.&lt;/p&gt;

&lt;p&gt;But applications change.&lt;/p&gt;

&lt;p&gt;Requirements change.&lt;/p&gt;

&lt;p&gt;Users find workflows we didn't anticipate.&lt;/p&gt;

&lt;p&gt;Features interact in ways we didn't plan for.&lt;/p&gt;

&lt;p&gt;Data grows.&lt;/p&gt;

&lt;p&gt;Performance requirements change.&lt;/p&gt;

&lt;p&gt;A model that was appropriate at version 1.0 may not be appropriate at version 3.0.&lt;/p&gt;

&lt;p&gt;That doesn't mean version 1.0 was badly engineered.&lt;/p&gt;

&lt;p&gt;It means the software has taught us something about the problem that we didn't know when we designed it.&lt;/p&gt;

&lt;p&gt;I think that's a healthier way to look at architecture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architecture is a hypothesis about the problem.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As we learn more about the problem, we should be willing to revise that hypothesis.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Approach Persistent Bugs Now
&lt;/h2&gt;

&lt;p&gt;When I encounter a bug that keeps returning in different forms, I try not to immediately add another patch.&lt;/p&gt;

&lt;p&gt;I look for patterns first.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Is the same subsystem repeatedly involved?
&lt;/h3&gt;

&lt;p&gt;If several apparently unrelated bugs keep passing through the same component, that's worth investigating.&lt;/p&gt;

&lt;p&gt;It doesn't prove that the architecture is wrong.&lt;/p&gt;

&lt;p&gt;But it is a signal.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Are we constantly repairing state after operations?
&lt;/h3&gt;

&lt;p&gt;If every operation looks something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;perform operation
→ repair state
→ recalculate offsets
→ restore selection
→ synchronize another structure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I start asking why.&lt;/p&gt;

&lt;p&gt;Sometimes that complexity is necessary.&lt;/p&gt;

&lt;p&gt;Sometimes it is evidence that two structures that should understand each other don't.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Does a simple operation require knowledge of too many things?
&lt;/h3&gt;

&lt;p&gt;A useful question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Why does this operation need to know all of this?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If changing one paragraph requires knowledge of formatting, selection, rendering, history, list state, and unrelated document ranges, the problem may be larger than the function being changed.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Are fixes creating more fixes?
&lt;/h3&gt;

&lt;p&gt;This is probably the strongest warning sign.&lt;/p&gt;

&lt;p&gt;If fixing A creates a problem with B, and fixing B creates a problem with C, you may not have three independent bugs.&lt;/p&gt;

&lt;p&gt;You may have one architectural tension showing up in three places.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Can the current representation express the concept naturally?
&lt;/h3&gt;

&lt;p&gt;This is the question I find myself asking most often.&lt;/p&gt;

&lt;p&gt;If the answer is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Not really, but we can work around it."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I pay attention.&lt;/p&gt;

&lt;p&gt;A workaround isn't automatically bad. Good software is full of pragmatic compromises.&lt;/p&gt;

&lt;p&gt;But when workarounds keep accumulating around the same missing concept, the debt is becoming visible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sometimes the Bug Is Telling You Something
&lt;/h2&gt;

&lt;p&gt;This is the perspective I wish I'd adopted earlier.&lt;/p&gt;

&lt;p&gt;A difficult bug isn't always an enemy.&lt;/p&gt;

&lt;p&gt;Sometimes it is feedback.&lt;/p&gt;

&lt;p&gt;It is telling you that the system's mental model of the problem may no longer be accurate.&lt;/p&gt;

&lt;p&gt;That doesn't mean you should immediately redesign the system.&lt;/p&gt;

&lt;p&gt;It means you should listen before you patch.&lt;/p&gt;

&lt;p&gt;There is a big difference between:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How do I stop this bug?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Why does this system make this class of bug possible?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The first question helps you close a ticket.&lt;/p&gt;

&lt;p&gt;The second can help you improve the software.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Goal Isn't Perfect Architecture
&lt;/h2&gt;

&lt;p&gt;I'm not convinced that perfect architecture exists.&lt;/p&gt;

&lt;p&gt;Every architecture makes trade-offs.&lt;/p&gt;

&lt;p&gt;Every abstraction has costs.&lt;/p&gt;

&lt;p&gt;Every representation makes some operations easier and others harder.&lt;/p&gt;

&lt;p&gt;The goal isn't to design a system that never needs to change.&lt;/p&gt;

&lt;p&gt;The goal is to recognize when the assumptions behind the system have stopped matching reality.&lt;/p&gt;

&lt;p&gt;When that happens, the right response isn't always a rewrite.&lt;/p&gt;

&lt;p&gt;It might be a small refactor.&lt;/p&gt;

&lt;p&gt;It might be a new abstraction.&lt;/p&gt;

&lt;p&gt;It might be a new boundary.&lt;/p&gt;

&lt;p&gt;It might be replacing one component.&lt;/p&gt;

&lt;p&gt;Or, sometimes, it might actually be time for a larger architectural change.&lt;/p&gt;

&lt;p&gt;The important part is knowing &lt;strong&gt;why&lt;/strong&gt; you're making the change.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Real Example From My Own Work
&lt;/h2&gt;

&lt;p&gt;These aren't just theoretical questions for me.&lt;/p&gt;

&lt;p&gt;I've been working through many of these architectural questions while building a lightweight rich-text editor for Flutter.&lt;/p&gt;

&lt;p&gt;As the editor has grown beyond basic text editing, problems around document structure, paragraphs, formatting, lists, and selections have made one thing increasingly clear: some problems are easier to solve when the underlying model actually understands the concepts the editor is working with.&lt;/p&gt;

&lt;p&gt;The editor is already public on GitHub, and the current version is stable and working. It hasn't been published as a package yet, but I'm continuing to work toward a proper release.&lt;/p&gt;

&lt;p&gt;I'm also using the editor as the foundation for a note-taking application. That gives the architecture another important test: it isn't enough for the editor to work in isolation; it needs to hold up when used as part of a real application with its own requirements.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/kenresoft/lightweight_rich_editor" rel="noopener noreferrer"&gt;View the rich-text editor on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A Bug Report Can Be an Architectural Report
&lt;/h2&gt;

&lt;p&gt;These days, when I see a bug that keeps resurfacing, I try to treat it as more than a defect.&lt;/p&gt;

&lt;p&gt;I ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What assumption is this bug exposing?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sometimes the answer is nothing interesting.&lt;/p&gt;

&lt;p&gt;It's just a bug.&lt;/p&gt;

&lt;p&gt;Fix it and move on.&lt;/p&gt;

&lt;p&gt;But sometimes the answer reveals something much more valuable:&lt;/p&gt;

&lt;p&gt;The system is trying to represent a concept it doesn't really understand.&lt;/p&gt;

&lt;p&gt;And when that happens, no amount of clever patching will make the underlying problem disappear permanently.&lt;/p&gt;

&lt;p&gt;You can keep repairing the symptoms.&lt;/p&gt;

&lt;p&gt;Or you can change the part of the architecture that makes those symptoms inevitable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That's the point where debugging becomes engineering.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  About the author
&lt;/h2&gt;

&lt;p&gt;I'm a mobile engineer focused on building production software and exploring the architectural problems that emerge as applications grow beyond their original assumptions.&lt;/p&gt;

&lt;p&gt;I share more of my engineering work and projects here at &lt;a href="https://kenresoft.com" rel="noopener noreferrer"&gt;Kenresoft&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>architecture</category>
      <category>debugging</category>
      <category>engineeringpractices</category>
    </item>
  </channel>
</rss>
