<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel><title>Stack Traces</title>
<description>Thoughts and lessons from software development — covering code, architecture, backend systems, DevOps, debugging, and the realities of building software.</description>
<generator>Miniblog.Core</generator>
<link>https://www.georgewanjohi.com/</link>
<item>
  <title>How Your Phone and Laptop Can Hear Your Voice but Ignore the Music Playing Beside You</title>
  <link>https://www.georgewanjohi.com/blog/how-your-phone-and-laptop-can-hear-your-voice-but-/</link>
  <description>&lt;h1 data-pm-slice="1 3 []"&gt;&amp;nbsp;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Understanding noise cancellation, voice isolation, and the clever technology that makes modern calls sound clearer.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Have you ever been on a phone call while music is playing in the background, only for the person on the other end to tell you they cannot hear it?&lt;/p&gt;
&lt;p&gt;I recently noticed something interesting while talking to my girlfriend on my Samsung Galaxy A26. When noise cancellation was enabled, she could barely hear the music playing from another device in the room. When I switched it off, the music became audible to her.&lt;/p&gt;
&lt;p&gt;I noticed something similar when making calls on my Windows laptop. I could play music through the laptop's speakers while talking, yet the person on the other end could not hear the music.&lt;/p&gt;
&lt;p&gt;At first, this might seem strange. After all, the microphone is in the same room as the music. If the microphone can hear the sound, why doesn't the other person hear it?&lt;/p&gt;
&lt;p&gt;The answer lies in how modern devices process audio.&lt;/p&gt;
&lt;h2&gt;1. Your microphone doesn't simply transmit everything it hears&lt;/h2&gt;
&lt;p&gt;A basic microphone captures sound waves. It doesn't inherently know whether a sound comes from your voice, a television, music, a passing car, or someone talking nearby.&lt;/p&gt;
&lt;p&gt;If you connect a simple microphone to a recording device without any additional processing, it will generally capture a mixture of all these sounds.&lt;/p&gt;
&lt;p&gt;Modern phones and computers do something more sophisticated.&lt;/p&gt;
&lt;p&gt;Before sending your voice to the other person, they can process the microphone's input to reduce unwanted sounds and make speech easier to understand.&lt;/p&gt;
&lt;p&gt;Depending on the device and calling application, this processing can include:&lt;/p&gt;
&lt;ul data-spread="false"&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Noise suppression:&lt;/strong&gt; Reduces unwanted background sounds such as fans, traffic, and air conditioning.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Voice isolation:&lt;/strong&gt; Attempts to preserve your voice while suppressing other sounds, potentially including music and other people speaking.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Acoustic echo cancellation:&lt;/strong&gt; Removes audio that the microphone picks up from the device's own speakers, particularly sound from the other person on the call.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These techniques are related, but they are not identical. Microsoft documents both conventional and machine-learning-based approaches to audio processing for communication applications. &lt;a href="https://learn.microsoft.com/en-us/windows-hardware/drivers/audio/audio-signal-processing-modes"&gt;Source: Microsoft Learn&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;2. What happened on my Samsung Galaxy A26?&lt;/h2&gt;
&lt;p&gt;When I was speaking to my girlfriend, I had music playing from another device.&lt;/p&gt;
&lt;p&gt;With the noise cancellation feature enabled, she could not hear the music. When I turned the feature off, she could hear it.&lt;/p&gt;
&lt;p&gt;One likely explanation is that the phone's microphone processing was suppressing sounds that were not recognised as my voice.&lt;/p&gt;
&lt;p&gt;Imagine that the microphone picks up this mixture:&lt;/p&gt;
&lt;ul data-spread="false"&gt;
&lt;li&gt;
&lt;p&gt;My voice: "How was your day?"&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Background music: a song playing from a laptop.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Environmental noise: fans, traffic, or other sounds.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The phone processes that mixture before transmitting the audio.&lt;/p&gt;
&lt;p&gt;With voice-focused processing enabled, it tries to preserve the speech while reducing the other sounds. The music may therefore be heavily reduced or removed from what the other person receives.&lt;/p&gt;
&lt;p&gt;With less aggressive processing, more of the original sound mixture may pass through.&lt;/p&gt;
&lt;p&gt;The exact behaviour depends on the phone's microphone mode, the calling application, and the available audio-processing features. I cannot confirm that every Galaxy A26 noise-cancellation setting works in precisely the same way, but the result I observed is consistent with voice-focused audio processing.&lt;/p&gt;
&lt;h2&gt;3. Why does the same thing happen on a Windows laptop?&lt;/h2&gt;
&lt;p&gt;This is where the story becomes even more interesting.&lt;/p&gt;
&lt;p&gt;When I make a call on my Windows laptop, I can play music through the laptop's speakers without the other person hearing much of it.&lt;/p&gt;
&lt;p&gt;There is a particularly relevant technology called &lt;strong&gt;acoustic echo cancellation&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Consider what happens during a video call:&lt;/p&gt;
&lt;ol start="1" data-spread="false"&gt;
&lt;li&gt;
&lt;p&gt;The other person speaks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Their voice comes through your laptop speakers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Your laptop microphone picks up some of that sound.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Without processing, the other person might hear their own voice echoed back to them.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Echo cancellation helps prevent this by comparing the microphone input with a reference of the sound being played through the speakers. It estimates the component that came from playback and attempts to remove it from the microphone signal. &lt;a href="https://learn.microsoft.com/en-us/azure/ai-services/speech-service/audio-processing-model-based-echo-cancellation"&gt;Source: Microsoft Learn&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;However, there is an important distinction: &lt;strong&gt;echo cancellation is primarily designed to remove speaker playback that would otherwise return to the caller, not to remove all music in the room.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If the laptop is suppressing music that you started playing yourself, other processing may also be involved, such as noise suppression, voice isolation, or audio processing built into the calling application or microphone driver.&lt;/p&gt;
&lt;p&gt;For example, Microsoft Teams offers voice isolation that uses AI to distinguish the user's voice from other speakers and sounds. Other communication applications may use different methods. &lt;a href="https://support.microsoft.com/en-us/teams/meetings/voice-isolation-in-microsoft-teams-calls-and-meetings"&gt;Source: Microsoft Support&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The key point is that the laptop is not necessarily sending everything the microphone captures. The audio can be filtered before it reaches the other person.&lt;/p&gt;
&lt;h2&gt;4. Is artificial intelligence involved?&lt;/h2&gt;
&lt;p&gt;Sometimes, yes.&lt;/p&gt;
&lt;p&gt;Traditional audio processing can use mathematical techniques to identify and reduce predictable noise. Newer approaches can use machine-learning models to distinguish speech from other sounds.&lt;/p&gt;
&lt;p&gt;A machine-learning model can learn patterns associated with human speech and patterns associated with competing sounds. During a call, it can use those patterns to estimate which parts of the audio should be preserved.&lt;/p&gt;
&lt;p&gt;This does not mean every phone or laptop uses a generative AI model, nor does it mean that every noise-cancellation feature understands language.&lt;/p&gt;
&lt;p&gt;Some systems use conventional digital signal processing. Others use machine learning, and some combine both.&lt;/p&gt;
&lt;p&gt;The result can feel almost magical: you speak normally, music plays nearby, and the person on the other end hears a much cleaner version of your voice.&lt;/p&gt;
&lt;h2&gt;5. Why doesn't noise cancellation remove every background sound?&lt;/h2&gt;
&lt;p&gt;Because sound is complicated.&lt;/p&gt;
&lt;p&gt;Music and speech can overlap in frequency, timing, and loudness. A song with vocals may contain sounds that resemble human speech. A loud television may be harder to suppress than a quiet fan.&lt;/p&gt;
&lt;p&gt;The system must make a trade-off between removing unwanted sounds and preserving the speaker's voice.&lt;/p&gt;
&lt;p&gt;If the filtering is too aggressive, it can make your voice sound unnatural, cut off words, or suppress quiet speech. If it is too weak, background sounds remain audible.&lt;/p&gt;
&lt;p&gt;This is why a good call-quality system tries to balance clarity with natural-sounding speech rather than simply muting everything except the loudest sound.&lt;/p&gt;
&lt;h2&gt;6. How can you test this yourself?&lt;/h2&gt;
&lt;p&gt;You can conduct a simple experiment with your phone or laptop.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What you need:&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-spread="false"&gt;
&lt;li&gt;
&lt;p&gt;A phone or laptop with a microphone.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A second device playing music.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Someone willing to listen on the other end of a call.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The experiment:&lt;/strong&gt;&lt;/p&gt;
&lt;ol start="1" data-spread="false"&gt;
&lt;li&gt;
&lt;p&gt;Start a call and speak normally.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Play music at a moderate volume from the second device.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ask the other person whether they can hear the music.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Turn the available noise suppression or voice-isolation feature off, if the app allows it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Repeat the test with the music playing at the same volume.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Compare how much of the music reaches the other person.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For your Samsung phone, try comparing the available microphone modes during an active call. For Windows, check the calling application's audio settings and the microphone's audio-processing options.&lt;/p&gt;
&lt;p&gt;Keep the microphone position, speaker volume, and distance as consistent as possible. That way, you can better identify the effect of changing the processing setting.&lt;/p&gt;
&lt;h2&gt;7. Does this mean I can play music during every meeting without anyone noticing?&lt;/h2&gt;
&lt;p&gt;Not necessarily!&lt;/p&gt;
&lt;p&gt;The behaviour varies depending on the device, the calling application, the microphone, and the audio-processing settings. Some music may get through, particularly if it is loud or contains vocals.&lt;/p&gt;
&lt;p&gt;Also, suppressing music from the microphone is different from sharing your computer's system audio. If you deliberately share system audio in a meeting, the music can be transmitted directly to participants regardless of what the microphone is doing.&lt;/p&gt;
&lt;p&gt;So, if you want to share a song during a presentation, use the application's audio-sharing feature rather than relying on your microphone to capture the music.&lt;/p&gt;
&lt;p&gt;And if you want the other person to hear music playing in your room during an ordinary call, you may need to reduce or disable voice-focused filtering where that option is available.&lt;/p&gt;
&lt;h2&gt;Final thoughts&lt;/h2&gt;
&lt;p&gt;What I found fascinating about these two experiences is that the phone and laptop are not merely recording sound. They are processing it to make communication more effective.&lt;/p&gt;
&lt;p&gt;My Samsung Galaxy A26 can suppress background music during a call, while my Windows laptop can keep speaker playback from becoming part of the transmitted conversation.&lt;/p&gt;
&lt;p&gt;Although the underlying techniques differ, the broader idea is the same: &lt;strong&gt;the sound you hear in a room is not necessarily the sound another person receives over a call.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Modern communication devices can filter, suppress, and reshape microphone audio before transmitting it.&lt;/p&gt;
&lt;p&gt;The next time someone tells you that they cannot hear the music playing right beside you, remember that your microphone may be hearing much more than your caller ever will.&lt;/p&gt;
&lt;div&gt;&lt;hr /&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Further reading:&lt;/em&gt;&lt;/p&gt;
&lt;ul data-spread="false"&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/windows-hardware/drivers/audio/audio-signal-processing-modes"&gt;Microsoft Learn: Audio signal processing modes in Windows&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/azure/ai-services/speech-service/audio-processing-model-based-echo-cancellation"&gt;Microsoft Learn: Model-based acoustic echo cancellation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://support.microsoft.com/en-us/teams/meetings/voice-isolation-in-microsoft-teams-calls-and-meetings"&gt;Microsoft Support: Voice isolation in Microsoft Teams&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>George Wanjohi</author>
  <guid isPermaLink="false">https://www.georgewanjohi.com/blog/how-your-phone-and-laptop-can-hear-your-voice-but-/</guid>
  <pubDate>Mon, 26 Oct 2026 06:27:21 GMT</pubDate>
</item>
<item>
  <title>Why Feedback Matters More Than Confidence</title>
  <link>https://www.georgewanjohi.com/blog/why-feedback-matters-more-than-confidence/</link>
  <description>&lt;div class="n6owBd awi2gc" style="font-family: 'Google Sans', Arial, sans-serif, 'Noto Color Emoji'; font-size: 16px; margin: 0px 0px 16px; border-bottom: 0px #e6e8f0;" data-sfc-cp="" data-sfc-root="c" data-hveid="CAIIAAgACAcQAA" data-complete="true"&gt;&lt;span style="margin: 0px; border-bottom: 0px #e6e8f0;" data-subtree="aimfl,mfl"&gt;Confidence alone does not guarantee success; &lt;/span&gt;&lt;mark class="b6AQX" style="margin: 0px; border-bottom: 0px #eef0ff;" data-wiz-attrbind="class=NQb7ee_q/cFwyDc" data-sfc-root="c" data-ved="2ahUKEwjok6Ghtc2XAxV01wIHHe26JgEQuJAPegoIAggACAAIBxAB" data-complete="true"&gt;actual results and progress depend on calibrating actions against real-world feedback and data&lt;!--TgQPHd|||[[[null,null,null,null,null,null,null,null,null,null,null,null,[247864,null,0]]]]--&gt;&lt;/mark&gt;. [&lt;a href="https://www.library.hbs.edu/working-knowledge/lessons-in-decision-making-confident-people-aren-t-always-correct"&gt;1&lt;/a&gt;]&lt;!--TgQPHd|||[]--&gt;&lt;/div&gt;
&lt;div class="yhAwj" style="font-family: 'Google Sans', Arial, sans-serif, 'Noto Color Emoji'; font-size: 16px; margin: 0px; border-bottom: 0px #e6e8f0;" data-sfc-cp="" data-sfc-root="c" data-complete="true" data-sfc-inited="2"&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/div&gt;
&lt;div class="ZLzG0d ncoeY E8xBUb" style="font-family: 'Google Sans', Arial, sans-serif, 'Noto Color Emoji'; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; border-bottom: 0px #e8eaf2;" role="heading" aria-level="3" data-animation-nesting="" data-sfc-cp="" data-wiz-attrbind="aria-level=NQb7ee_y/fLk2Md" data-sfc-root="c" data-complete="true"&gt;Why Feedback Matters More Than Confidence&lt;!--TgQPHd|||[[2,[null,null,null,null,null,null,null,null,null,null,null,null,[351768,null,0]],[],null,1]]--&gt;&lt;/div&gt;
&lt;div class="" style="margin: 0px; border-bottom: 0px #e6e8f0;" data-bfc="" data-sfc-cp="" data-sfc-root="c" data-ved="2ahUKEwjok6Ghtc2XAxV01wIHHe26JgEQi4wTegoIAggACAAIEhAB" data-hveid="CAIIAAgACBIQAQ" data-complete="true"&gt;
&lt;ul&gt;
&lt;li class="Z1qcYe" style="margin: 0px; border-bottom: 0px #e6e8f0;" data-sfc-cp="" data-sfc-root="c" data-hveid="CAIIAAgACBIQAg" data-complete="true"&gt;&lt;span class="iNqyIf" style="margin: 0px; border-bottom: 0px #e6e8f0;" data-sfc-cp="" data-sfc-root="c" data-complete="true"&gt;&lt;span class="rQesXe MPyX" style="font-weight: bold; margin: 0px; border-bottom: 0px #e6e8f0;" data-sfc-cp="" data-sfc-root="c" data-complete="true"&gt;Confidence vs. Competence:&lt;!--TgQPHd|||[]--&gt;&lt;/span&gt; Studies on decision-making show that high self-assurance or confidence does not reliably match actual skill or correctness. Overconfidence often leads to inflexibility and blind spots.&lt;!--TgQPHd|||[]--&gt;&lt;/span&gt; [&lt;a href="https://www.forbes.com/sites/erikaandersen/2012/12/14/when-self-confidence-is-a-bad-thing/"&gt;1&lt;/a&gt;, &lt;a href="https://www.library.hbs.edu/working-knowledge/lessons-in-decision-making-confident-people-aren-t-always-correct"&gt;2&lt;/a&gt;]&lt;!--TgQPHd|||[]--&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!--TgQPHd|||[]--&gt;&lt;/div&gt;
&lt;div class="" style="margin: 0px; border-bottom: 0px #e6e8f0;" data-bfc="" data-sfc-cp="" data-sfc-root="c" data-ved="2ahUKEwjok6Ghtc2XAxV01wIHHe26JgEQi4wTegoIAggACAAIEhAH" data-hveid="CAIIAAgACBIQBw" data-complete="true"&gt;
&lt;ul&gt;
&lt;li class="Z1qcYe" style="margin: 0px; border-bottom: 0px #e6e8f0;" data-sfc-cp="" data-sfc-root="c" data-hveid="CAIIAAgACBIQCA" data-complete="true"&gt;&lt;span class="iNqyIf" style="margin: 0px; border-bottom: 0px #e6e8f0;" data-sfc-cp="" data-sfc-root="c" data-complete="true"&gt;&lt;span class="rQesXe MPyX" style="font-weight: bold; margin: 0px; border-bottom: 0px #e6e8f0;" data-sfc-cp="" data-sfc-root="c" data-complete="true"&gt;Feedback as Data:&lt;!--TgQPHd|||[]--&gt;&lt;/span&gt; Treating feedback as neutral information&amp;mdash;rather than an attack on self-worth&amp;mdash;allows you to see what is working and what needs to change.&lt;!--TgQPHd|||[]--&gt;&lt;/span&gt; [&lt;a href="https://www.youtube.com/watch?v=nmgFodAWJRk&amp;amp;t=143"&gt;1&lt;/a&gt;, &lt;a href="https://www.psychologytoday.com/us/blog/intimacy-a-path-toward-spirituality/202604/why-confidence-doesnt-always-reflect-true-self"&gt;2&lt;/a&gt;]&lt;!--TgQPHd|||[]--&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!--TgQPHd|||[]--&gt;&lt;/div&gt;
&lt;div class="" style="margin: 0px; border-bottom: 0px #e6e8f0;" data-bfc="" data-sfc-cp="" data-sfc-root="c" data-ved="2ahUKEwjok6Ghtc2XAxV01wIHHe26JgEQi4wTegoIAggACAAIEhAO" data-hveid="CAIIAAgACBIQDg" data-complete="true"&gt;
&lt;ul&gt;
&lt;li class="Z1qcYe" style="margin: 0px; border-bottom: 0px #e6e8f0;" data-sfc-cp="" data-sfc-root="c" data-hveid="CAIIAAgACBIQDw" data-complete="true"&gt;&lt;span class="iNqyIf" style="margin: 0px; border-bottom: 0px #e6e8f0;" data-sfc-cp="" data-sfc-root="c" data-complete="true"&gt;&lt;span class="rQesXe MPyX" style="font-weight: bold; margin: 0px; border-bottom: 0px #e6e8f0;" data-sfc-cp="" data-sfc-root="c" data-complete="true"&gt;Confidence is a Byproduct:&lt;!--TgQPHd|||[]--&gt;&lt;/span&gt; Real confidence is not a prerequisite or a magic ingredient you "fake"; it is a side effect that develops &lt;em class="zhvwWe" style="margin: 0px; border-bottom: 0px #e6e8f0;" data-sfc-cp="" data-sfc-root="c" data-complete="true"&gt;after&lt;!--TgQPHd|||[]--&gt;&lt;/em&gt; taking action, measuring outcomes, and learning from mistakes.&lt;!--TgQPHd|||[]--&gt;&lt;/span&gt; [&lt;a href="https://www.linkedin.com/pulse/why-fake-till-you-make-other-confidence-tips-might-stewart-msc-fiol-ywoee"&gt;1&lt;/a&gt;, &lt;a href="https://www.youtube.com/watch?v=P2P0OGmB_pM"&gt;2&lt;/a&gt;, &lt;a href="https://www.facebook.com/dzigbordikdosoo/posts/confidence-isnt-something-you-find-its-something-you-builda-lot-of-people-wait-t/1609435730583882/"&gt;3&lt;/a&gt;, &lt;a href="https://www.facebook.com/Markmansonnet/posts/confidence-as-a-side-effect-of-doing-hard-things-is-a-very-different-proposition/1652555376237482/"&gt;4&lt;/a&gt;]&lt;!--TgQPHd|||[]--&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!--TgQPHd|||[]--&gt;&lt;/div&gt;
&lt;ul class="XSq4R KI3fJ" style="font-family: 'Google Sans', Arial, sans-serif, 'Noto Color Emoji'; font-size: 16px; margin: 12px 0px 16px; border-bottom: 0px #e6e8f0;" data-sfc-cp="" data-sfc-root="c" data-hveid="CAIIAAgACBIQAA" data-complete="true"&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/ul&gt;
&lt;div class="yhAwj" style="font-family: 'Google Sans', Arial, sans-serif, 'Noto Color Emoji'; font-size: 16px; margin: 0px; border-bottom: 0px #e6e8f0;" data-sfc-cp="" data-sfc-root="c" data-complete="true" data-sfc-inited="2"&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/div&gt;
&lt;div class="" style="font-family: 'Google Sans', Arial, sans-serif, 'Noto Color Emoji'; font-size: 16px; margin: 0px; border-bottom: 0px #e6e8f0;" data-bfc="" data-sfc-cp="" data-sfc-root="c" data-ved="2ahUKEwjok6Ghtc2XAxV01wIHHe26JgEQi4wTegoIAggACAAIFRAA" data-hveid="CAIIAAgACBUQAA" data-complete="true"&gt;
&lt;div class="ZLzG0d ncoeY E8xBUb" style="font-size: 20px; font-weight: 600; margin: 24px 0px 12px; border-bottom: 0px #e8eaf2;" role="heading" aria-level="3" data-animation-nesting="" data-sfc-cp="" data-wiz-attrbind="aria-level=NQb7ee_22/fLk2Md" data-sfc-root="c" data-complete="true"&gt;How to Use Feedback Effectively&lt;!--TgQPHd|||[[2,[null,null,null,null,null,null,null,null,null,null,null,null,[351768,null,0]],[],null,1]]--&gt;&lt;/div&gt;
&lt;!--TgQPHd|||[]--&gt;&lt;/div&gt;
&lt;div class="" style="margin: 0px; border-bottom: 0px #e6e8f0;" data-bfc="" data-sfc-cp="" data-sfc-root="c" data-ved="2ahUKEwjok6Ghtc2XAxV01wIHHe26JgEQi4wTegoIAggACAAIFhAB" data-hveid="CAIIAAgACBYQAQ" data-complete="true"&gt;
&lt;ul&gt;
&lt;li class="Z1qcYe" style="margin: 0px; border-bottom: 0px #e6e8f0;" data-sfc-cp="" data-sfc-root="c" data-hveid="CAIIAAgACBYQAg" data-complete="true"&gt;&lt;span class="iNqyIf" style="margin: 0px; border-bottom: 0px #e6e8f0;" data-sfc-cp="" data-sfc-root="c" data-complete="true"&gt;&lt;span class="rQesXe MPyX" style="font-weight: bold; margin: 0px; border-bottom: 0px #e6e8f0;" data-sfc-cp="" data-sfc-root="c" data-complete="true"&gt;Unhook from Emotion:&lt;!--TgQPHd|||[]--&gt;&lt;/span&gt; Separate the message from your ego. Ask what the data or the user/client/colleague's response tells you about the actual output.&lt;!--TgQPHd|||[]--&gt;&lt;/span&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!--TgQPHd|||[]--&gt;&lt;/div&gt;
&lt;div class="" style="margin: 0px; border-bottom: 0px #e6e8f0;" data-bfc="" data-sfc-cp="" data-sfc-root="c" data-ved="2ahUKEwjok6Ghtc2XAxV01wIHHe26JgEQi4wTegoIAggACAAIFhAD" data-hveid="CAIIAAgACBYQAw" data-complete="true"&gt;
&lt;ul&gt;
&lt;li class="Z1qcYe" style="margin: 0px; border-bottom: 0px #e6e8f0;" data-sfc-cp="" data-sfc-root="c" data-hveid="CAIIAAgACBYQBA" data-complete="true"&gt;&lt;span class="iNqyIf" style="margin: 0px; border-bottom: 0px #e6e8f0;" data-sfc-cp="" data-sfc-root="c" data-complete="true"&gt;&lt;span class="rQesXe MPyX" style="font-weight: bold; margin: 0px; border-bottom: 0px #e6e8f0;" data-sfc-cp="" data-sfc-root="c" data-complete="true"&gt;Track Surprises:&lt;!--TgQPHd|||[]--&gt;&lt;/span&gt; Notice when confident decisions succeed or fail unexpectedly, and adjust your assumptions accordingly.&lt;!--TgQPHd|||[]--&gt;&lt;/span&gt;&lt;!--TgQPHd|||[]--&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!--TgQPHd|||[]--&gt;&lt;/div&gt;
&lt;div class="" style="margin: 0px; border-bottom: 0px #e6e8f0;" data-bfc="" data-sfc-cp="" data-sfc-root="c" data-ved="2ahUKEwjok6Ghtc2XAxV01wIHHe26JgEQi4wTegoIAggACAAIFhAF" data-hveid="CAIIAAgACBYQBQ" data-complete="true"&gt;
&lt;ul&gt;
&lt;li class="Z1qcYe" style="margin: 0px; border-bottom: 0px #e6e8f0;" data-sfc-cp="" data-sfc-root="c" data-hveid="CAIIAAgACBYQBg" data-complete="true"&gt;&lt;span class="iNqyIf" style="margin: 0px; border-bottom: 0px #e6e8f0;" data-sfc-cp="" data-sfc-root="c" data-complete="true"&gt;&lt;span class="rQesXe MPyX" style="font-weight: bold; margin: 0px; border-bottom: 0px #e6e8f0;" data-sfc-cp="" data-sfc-root="c" data-complete="true"&gt;Iterate in Small Steps:&lt;!--TgQPHd|||[]--&gt;&lt;/span&gt; Test your work early, collect real-world responses, and adjust your approach one step at a time.&lt;!--TgQPHd|||[]--&gt;&lt;/span&gt; [&lt;a href="https://thementalgame.me/blog/the-confidence-feedback-loop-how-goal-achievement-reinforces-self-worth-and-self-esteem"&gt;1&lt;/a&gt;, &lt;a href="https://www.facebook.com/dzigbordikdosoo/posts/confidence-isnt-something-you-find-its-something-you-builda-lot-of-people-wait-t/1609435730583882/"&gt;2&lt;/a&gt;, &lt;a href="https://www.youtube.com/watch?v=nmgFodAWJRk&amp;amp;t=143"&gt;3&lt;/a&gt;, &lt;a href="https://www.psychologytoday.com/us/blog/intimacy-a-path-toward-spirituality/202604/why-confidence-doesnt-always-reflect-true-self"&gt;4&lt;/a&gt;, &lt;a href="https://www.library.hbs.edu/working-knowledge/lessons-in-decision-making-confident-people-aren-t-always-correct"&gt;5&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description>
  <author>George Wanjohi</author>
  <guid isPermaLink="false">https://www.georgewanjohi.com/blog/why-feedback-matters-more-than-confidence/</guid>
  <pubDate>Thu, 22 Oct 2026 10:30:38 GMT</pubDate>
</item>
<item>
  <title>A Beginner’s Guide to Git and AI for Electrical Engineers: Protect Your Drawings, Work Smarter, and Design Better</title>
  <link>https://www.georgewanjohi.com/blog/revit-autocad/</link>
  <description>&lt;p&gt;&lt;strong&gt;&amp;nbsp;Author:&lt;/strong&gt; George Wanjohi&lt;br /&gt;&lt;strong&gt;Audience:&lt;/strong&gt; Electrical and Electronics Engineers who use Autodesk Revit and AutoCAD&lt;br /&gt;&lt;strong&gt;Reading time:&lt;/strong&gt; 8&amp;ndash;10 minutes&lt;/p&gt;
&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;As an electrical and electronics engineer, you spend a lot of time creating drawings, placing electrical components, routing cables, preparing schedules, and making sure your designs are correct.&lt;/p&gt;
&lt;p&gt;You probably already know how important it is to save your work regularly. But what happens when a client requests changes, a drawing becomes corrupted, or you accidentally remove something that was working perfectly in the previous version?&lt;/p&gt;
&lt;p&gt;What if you could ask an AI assistant to help you create a drawing, automate repetitive tasks, or identify potential mistakes before submitting your work?&lt;/p&gt;
&lt;p&gt;There are two technologies worth exploring: &lt;strong&gt;Git and Artificial Intelligence (AI).&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Git helps you manage changes to your project files. AI can help you automate design tasks, learn new techniques, and review your work.&lt;/p&gt;
&lt;p&gt;You don't need to be a software developer to benefit from either technology.&lt;/p&gt;
&lt;p&gt;Let's explore how they work and how you can start using them.&lt;/p&gt;
&lt;div&gt;&lt;hr /&gt;&lt;/div&gt;
&lt;h1&gt;Part 1: Understanding Git without learning to code&lt;/h1&gt;
&lt;h2&gt;1. What is Git?&lt;/h2&gt;
&lt;p&gt;Imagine you are designing the electrical installation for a commercial building.&lt;/p&gt;
&lt;p&gt;You finish the initial design and send it to your client. The client requests changes to the lighting layout, and later asks you to restore the original arrangement in one section.&lt;/p&gt;
&lt;p&gt;Without a proper version history, you might end up with folders like these:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Office_Design.dwg&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Office_Design_Final.dwg&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Office_Design_Final_Updated.dwg&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Office_Design_Final_Updated2.dwg&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Office_Design_Really_Final.dwg&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We've all seen variations of this problem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Git is a version-control system.&lt;/strong&gt; It records snapshots of your files at different points in time, allowing you to review changes and return to an earlier version when necessary.&lt;/p&gt;
&lt;p&gt;Think of it as a carefully maintained history book for your engineering projects.&lt;/p&gt;
&lt;p&gt;For example, your project history might look like this:&lt;/p&gt;
&lt;table style="border-style: solid;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style="width: 68px;"&gt;Version&lt;/th&gt;
&lt;th style="width: 257px;"&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 68px;"&gt;Version 1&lt;/td&gt;
&lt;td style="width: 257px;"&gt;Initial electrical layout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 68px;"&gt;Version 2&lt;/td&gt;
&lt;td style="width: 257px;"&gt;Added lighting fixtures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 68px;"&gt;Version 3&lt;/td&gt;
&lt;td style="width: 257px;"&gt;Revised socket-outlet positions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 68px;"&gt;Version 4&lt;/td&gt;
&lt;td style="width: 257px;"&gt;Updated distribution board schedule&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 68px;"&gt;Version 5&lt;/td&gt;
&lt;td style="width: 257px;"&gt;Corrected cable routing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Each version can have a description explaining what changed and why.&lt;/p&gt;
&lt;p&gt;If a later change causes a problem, you can refer to an earlier version rather than relying on memory or searching through dozens of backup files.&lt;/p&gt;
&lt;p&gt;Git is widely used in software development, but the underlying idea of tracking changes can be useful in other fields too.&lt;/p&gt;
&lt;h2&gt;2. Does Git upload your drawings to the internet?&lt;/h2&gt;
&lt;p&gt;No. Git does not require cloud storage.&lt;/p&gt;
&lt;p&gt;Git can maintain a complete repository on your own computer. In this setup, your project history remains on your local drive unless you deliberately copy or transmit it elsewhere.&lt;/p&gt;
&lt;p&gt;For this guide, we will use &lt;strong&gt;local-only Git&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;We will not use GitHub, GitLab, or any other online repository.&lt;/p&gt;
&lt;p&gt;This matters when your drawings contain copyrighted designs, client information, proprietary layouts, or commercially sensitive engineering work.&lt;/p&gt;
&lt;p&gt;One important distinction: Git being local does not automatically guarantee that your files never leave your computer. Cloud-synchronised folders, AI applications, backup software, and other connected services may transmit data independently. We will address AI privacy later.&lt;/p&gt;
&lt;h2&gt;3. What do you need to install?&lt;/h2&gt;
&lt;p&gt;You only need two things to get started.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Git&lt;/strong&gt; is the software that records your project history.&lt;/p&gt;
&lt;p&gt;Download it from the official website:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://git-scm.com/downloads"&gt;https://git-scm.com/downloads&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GitHub Desktop&lt;/strong&gt; is an optional application that gives you a visual interface for working with Git. You can see changes and create saved versions without memorising commands.&lt;/p&gt;
&lt;p&gt;Download it from:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://desktop.github.com/"&gt;https://desktop.github.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can use GitHub Desktop without publishing your project to GitHub. When creating a repository, choose the option to create it on your local computer, and do not publish it.&lt;/p&gt;
&lt;p&gt;For a beginner, I recommend using the visual interface first.&lt;/p&gt;
&lt;h2&gt;4. Create your first local repository&lt;/h2&gt;
&lt;p&gt;Let's imagine you have an AutoCAD project called &lt;code&gt;Commercial_Building_Electrical.dwg&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;First, create a folder on your computer:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;D:\Engineering\Commercial_Building_Electrical&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Copy your project files into this folder. Keep the original project somewhere safe until you have verified your new setup.&lt;/p&gt;
&lt;p&gt;Open GitHub Desktop and select:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;File &amp;rarr; New repository&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Enter the following information:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Name:&lt;/strong&gt; Commercial Building Electrical&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Local path:&lt;/strong&gt; &lt;code&gt;D:\Engineering&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Repository location:&lt;/strong&gt; The application will create a project folder under the selected path.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Choose the option to create the repository locally. Do not publish it.&lt;/p&gt;
&lt;p&gt;Your project is now being managed by Git.&lt;/p&gt;
&lt;p&gt;In Git terminology, this folder is called a &lt;em&gt;repository&lt;/em&gt;. It contains your working files and a hidden &lt;code&gt;.git&lt;/code&gt; directory that stores the version history.&lt;/p&gt;
&lt;p&gt;You can continue opening and editing your drawings in AutoCAD or Revit as usual.&lt;/p&gt;
&lt;p&gt;Git works alongside your existing engineering software. It does not replace it.&lt;/p&gt;
&lt;h2&gt;5. Save a version whenever you reach an important milestone&lt;/h2&gt;
&lt;p&gt;In Git, saving a version is called making a &lt;strong&gt;commit&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Imagine that you have just completed the first lighting layout.&lt;/p&gt;
&lt;p&gt;Open GitHub Desktop. It will display the files that Git can see have changed.&lt;/p&gt;
&lt;p&gt;Enter a summary such as:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Completed initial lighting layout&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Then click &lt;strong&gt;Commit to main&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;You have now created your first recorded version.&lt;/p&gt;
&lt;p&gt;Later, after updating the distribution board schedule, create another commit:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Updated distribution board schedule&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;After correcting the cable routing:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Revised cable routing on Level 2&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You can repeat this process throughout the project.&lt;/p&gt;
&lt;p&gt;A commit is not the same as pressing Save in AutoCAD or Revit. Save your drawing in the engineering application first, then create a Git commit when you want to record a milestone.&lt;/p&gt;
&lt;h3&gt;A practical workflow&lt;/h3&gt;
&lt;ol start="1"&gt;
&lt;li&gt;
&lt;p&gt;Open your drawing in Revit or AutoCAD.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make your changes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Save your drawing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open GitHub Desktop.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Review the changed files.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Write a short description of the changes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Commit the changes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You now have a history of your project.&lt;/p&gt;
&lt;h2&gt;6. What happens when you make a mistake?&lt;/h2&gt;
&lt;p&gt;Suppose you spend two hours changing the lighting layout, only to discover that the changes introduced a problem.&lt;/p&gt;
&lt;p&gt;With Git, you can review the previous versions and recover an earlier copy of the affected file.&lt;/p&gt;
&lt;p&gt;For binary engineering files such as DWG and RVT, Git generally cannot show you the individual drawing elements that changed in the way it can show changes in a text document. It can, however, preserve earlier file versions.&lt;/p&gt;
&lt;p&gt;For example, you could maintain this history:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Initial electrical layout&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Added emergency lighting&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Revised emergency lighting&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Corrected emergency lighting&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the latest version is faulty, you can retrieve the earlier file and open it in your engineering software.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Restoring an older version can overwrite newer work. Recover it into a separate folder or filename first, then inspect it before replacing anything.&lt;/p&gt;
&lt;h2&gt;7. An important limitation: Revit and AutoCAD files are not ordinary documents&lt;/h2&gt;
&lt;p&gt;This is where we need to be careful.&lt;/p&gt;
&lt;p&gt;A Word document, a text file, and an AutoCAD drawing are different types of files.&lt;/p&gt;
&lt;p&gt;Git is particularly good at tracking text files. AutoCAD DWG files and Revit RVT files are largely binary files, which means Git generally stores a new version of the file rather than showing you a meaningful, element-by-element drawing comparison.&lt;/p&gt;
&lt;p&gt;Large engineering files can also consume considerable disk space when many versions are saved.&lt;/p&gt;
&lt;p&gt;There are additional considerations for Revit projects involving linked models, families, worksharing, and central models.&lt;/p&gt;
&lt;p&gt;For these reasons, I recommend the following approach:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Use Git to track project milestones and preserve selected versions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Keep all related project files together, including relevant families, links, and supporting documents.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Avoid committing temporary files, caches, lock files, and unnecessary generated files.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Keep a separate backup of important projects.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Do not use Git as a replacement for Revit's native worksharing or backup mechanisms.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For workshared Revit projects, follow Revit's central-model and synchronisation workflow. Do not treat a live central model as an ordinary file that can be freely replaced with an older Git version.&lt;/p&gt;
&lt;p&gt;For AutoCAD, the built-in DWG Compare command can also help identify drawing differences between revisions.&lt;/p&gt;
&lt;p&gt;Git is most useful here as an additional version-management tool, not as a replacement for the engineering software's native project-management features.&lt;/p&gt;
&lt;div&gt;&lt;hr /&gt;&lt;/div&gt;
&lt;h1&gt;Part 2: Using AI to improve your engineering workflow&lt;/h1&gt;
&lt;p&gt;Git helps you protect your work. AI offers a different opportunity: reducing the time you spend on repetitive tasks and helping you inspect your designs.&lt;/p&gt;
&lt;p&gt;But we need to distinguish between two types of AI tools.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;General-purpose AI assistants&lt;/strong&gt; answer questions, analyse information you provide, and help develop automation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CAD-integrated AI tools&lt;/strong&gt; can work with supported information inside engineering software and, depending on the available features, perform actions on the actual model or drawing.&lt;/p&gt;
&lt;p&gt;The second category is particularly interesting for electrical engineers.&lt;/p&gt;
&lt;h2&gt;8. Start with AI as your engineering assistant&lt;/h2&gt;
&lt;p&gt;You can begin with a general-purpose AI assistant to help you understand engineering workflows and solve problems.&lt;/p&gt;
&lt;p&gt;For example, you could ask:&lt;/p&gt;
&lt;p&gt;"Explain how to create an electrical distribution board schedule in Revit. Assume I am a beginner. Give me step-by-step instructions and explain the purpose of each step."&lt;/p&gt;
&lt;p&gt;Or:&lt;/p&gt;
&lt;p&gt;"I have an AutoCAD electrical drawing with several layers. Explain how to organise lighting, power, emergency lighting, and cable-routing information into separate layers without changing the geometry of the drawing."&lt;/p&gt;
&lt;p&gt;You can also use AI to help you understand error messages, learn commands, develop checking procedures, and plan repetitive work.&lt;/p&gt;
&lt;p&gt;The key is to give the AI enough context.&lt;/p&gt;
&lt;p&gt;Instead of asking, "How do I improve my drawing?", try:&lt;/p&gt;
&lt;p&gt;"I'm working on the electrical layout for a two-storey commercial building. I want to improve the organisation of lighting circuits, socket outlets, distribution boards, and emergency lighting. Suggest a practical drawing-review checklist. Do not assume that you know my project specifications."&lt;/p&gt;
&lt;p&gt;Specific questions usually produce more useful answers.&lt;/p&gt;
&lt;h2&gt;9. Can AI actually create Revit and AutoCAD drawings?&lt;/h2&gt;
&lt;p&gt;Yes, in some workflows, but the capabilities vary significantly.&lt;/p&gt;
&lt;p&gt;There is a difference between asking AI to draw an illustrative image and asking it to create an editable, technically meaningful DWG or RVT model.&lt;/p&gt;
&lt;p&gt;A generated picture of an electrical distribution board is not the same as a Revit model containing correctly configured electrical equipment, connectors, circuits, parameters, and schedules.&lt;/p&gt;
&lt;p&gt;Here are three practical levels of AI-assisted design.&lt;/p&gt;
&lt;h3&gt;Level 1: AI guides you through the drawing process&lt;/h3&gt;
&lt;p&gt;This is the easiest starting point.&lt;/p&gt;
&lt;p&gt;You describe what you want, and AI explains the steps to achieve it in Revit or AutoCAD.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;p&gt;"Guide me through creating a lighting layout for a small office. Explain how to place lighting fixtures, connect them to the appropriate circuits, and prepare a schedule. Ask me for any project requirements you need rather than inventing them."&lt;/p&gt;
&lt;p&gt;You still perform the operations, but you have an assistant available to guide you.&lt;/p&gt;
&lt;h3&gt;Level 2: AI helps automate actual drawing operations&lt;/h3&gt;
&lt;p&gt;This is where things become more interesting.&lt;/p&gt;
&lt;p&gt;AI can help create or modify automation scripts that interact with CAD software. These scripts can potentially place symbols, create layers, label circuits, generate schedules, or perform repetitive checks.&lt;/p&gt;
&lt;p&gt;In AutoCAD, this could involve AutoLISP or other supported automation mechanisms.&lt;/p&gt;
&lt;p&gt;In Revit, automation could use the Revit API or visual programming tools such as Dynamo.&lt;/p&gt;
&lt;p&gt;You do not have to learn programming before benefiting from these approaches. AI can help develop the automation, while you explain the engineering rules and verify the results.&lt;/p&gt;
&lt;p&gt;For example, you might request:&lt;/p&gt;
&lt;p&gt;"Help me design an automation workflow for AutoCAD that checks whether electrical symbols are on the correct layers. First, explain the approach in plain English. Then propose a solution that reports possible errors without modifying my original drawing."&lt;/p&gt;
&lt;p&gt;The safest first automation tools are those that report problems rather than immediately changing the drawing.&lt;/p&gt;
&lt;h3&gt;Level 3: AI works directly with your CAD model&lt;/h3&gt;
&lt;p&gt;This is the longer-term goal.&lt;/p&gt;
&lt;p&gt;Autodesk is introducing AI capabilities into its design applications. Autodesk Assistant, for example, offers product guidance and, where supported, model-aware queries and task automation.&lt;/p&gt;
&lt;p&gt;In AutoCAD, supported capabilities include AI-assisted workflows such as Smart Blocks and drawing-related assistance. In Revit, Autodesk Assistant capabilities are evolving, with supported workflows depending on the release and availability.&lt;/p&gt;
&lt;p&gt;These features are worth investigating because they can bring AI closer to the actual design environment rather than requiring you to describe every detail manually.&lt;/p&gt;
&lt;p&gt;Read the official documentation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Revit AI features: &lt;a href="https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/What-AI-features-are-available-in-Revit.html"&gt;https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/What-AI-features-are-available-in-Revit.html&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AutoCAD AI features: &lt;a href="https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/What-are-the-AI-driven-features-in-AutoCAD.html"&gt;https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/What-are-the-AI-driven-features-in-AutoCAD.html&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Autodesk Assistant: &lt;a href="https://www.autodesk.com/solutions/autodesk-ai/autodesk-assistant"&gt;https://www.autodesk.com/solutions/autodesk-ai/autodesk-assistant&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Check the features available in your specific software version and licence. Some capabilities are previews, may require an Autodesk account, and may process information through Autodesk's services.&lt;/p&gt;
&lt;p&gt;AI integration is promising, but it should not be assumed that every feature can independently generate a complete electrical installation design from a single prompt.&lt;/p&gt;
&lt;h2&gt;10. Can AI find and correct mistakes in electrical drawings?&lt;/h2&gt;
&lt;p&gt;Potentially, yes. However, identifying a suspicious condition and proving that it is an engineering error are two different things.&lt;/p&gt;
&lt;p&gt;AI-assisted checks can be useful for finding inconsistencies, missing information, and deviations from explicitly defined rules.&lt;/p&gt;
&lt;p&gt;Consider these examples:&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;Potential issue&lt;/th&gt;
&lt;th&gt;What an AI-assisted workflow could do&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Missing circuit labels&lt;/td&gt;
&lt;td&gt;Identify unlabelled circuit elements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inconsistent equipment naming&lt;/td&gt;
&lt;td&gt;Flag naming differences&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Duplicate annotations&lt;/td&gt;
&lt;td&gt;Identify possible duplicate labels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Missing drawing information&lt;/td&gt;
&lt;td&gt;Compare the drawing against a defined checklist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incorrect layer usage&lt;/td&gt;
&lt;td&gt;Identify objects on unexpected layers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inconsistent schedules&lt;/td&gt;
&lt;td&gt;Compare model data with schedule requirements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Changes between revisions&lt;/td&gt;
&lt;td&gt;Highlight additions, deletions, and modifications&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Potential electrical design issues&lt;/td&gt;
&lt;td&gt;Flag conditions that need engineering verification&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Some of these checks are better handled by conventional CAD rules, Revit schedules, model validation, or deterministic calculations than by AI alone.&lt;/p&gt;
&lt;p&gt;For example, if a project requires a specific circuit naming convention, a rule-based check can verify it consistently. AI can help create the checking workflow and explain the findings.&lt;/p&gt;
&lt;p&gt;For an electrical design review, AI could also help you investigate questions such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Are the circuit descriptions consistent with the project requirements?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Are the equipment ratings consistent with the approved design information?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Are the relevant drawing notes and schedules complete?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Are there apparent inconsistencies between the drawings and the specification?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Which items require further review by the responsible engineer?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The important limitation is that AI cannot reliably determine every electrical design error from a drawing image alone. It may miss information, misunderstand symbols, or make incorrect assumptions about design intent.&lt;/p&gt;
&lt;p&gt;A technically correct review may require access to the actual model data, project specifications, calculations, applicable standards, and manufacturer information.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Never accept an AI-generated correction to a safety-critical electrical design without appropriate verification.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The engineer remains responsible for the design and its compliance.&lt;/p&gt;
&lt;div&gt;&lt;hr /&gt;&lt;/div&gt;
&lt;h1&gt;Part 3: Protecting copyrighted engineering work while using AI&lt;/h1&gt;
&lt;h2&gt;11. Local Git and local AI are two separate things&lt;/h2&gt;
&lt;p&gt;Keeping your Git repository on your computer does not automatically make your AI workflow private.&lt;/p&gt;
&lt;p&gt;Git can store files locally. An AI application may still send prompts, images, drawings, or extracted model data to a remote service.&lt;/p&gt;
&lt;p&gt;If client confidentiality and copyright are important, you should decide which AI workflow is acceptable before sharing any project information.&lt;/p&gt;
&lt;p&gt;There are two broad options.&lt;/p&gt;
&lt;h3&gt;Option A: Use a cloud-based AI assistant&lt;/h3&gt;
&lt;p&gt;Cloud AI services can be useful for learning Revit, understanding AutoCAD commands, writing automation scripts, and discussing general engineering workflows.&lt;/p&gt;
&lt;p&gt;However, you should not upload confidential drawings or client files unless you have confirmed that the service and its terms are appropriate for that information.&lt;/p&gt;
&lt;p&gt;You can still ask general questions without sharing actual project files.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;p&gt;"I'm working in Revit on an electrical layout for a commercial building. Explain how to check circuit assignments and prepare a distribution board schedule. Do not use or require any client drawings."&lt;/p&gt;
&lt;p&gt;This lets you learn without disclosing the project itself.&lt;/p&gt;
&lt;h3&gt;Option B: Run AI locally on your own computer&lt;/h3&gt;
&lt;p&gt;A local AI model runs on your computer instead of relying on a remote AI service for its model inference.&lt;/p&gt;
&lt;p&gt;Tools such as Ollama and LM Studio can run supported language models locally. These can help explain tasks, develop scripts, and support workflows that you build around your CAD applications.&lt;/p&gt;
&lt;p&gt;Web search, online integrations, software updates, and other connected features may still communicate externally, so local model inference alone does not guarantee that an entire application is offline.&lt;/p&gt;
&lt;p&gt;A local model also needs sufficient hardware resources, and its performance will depend on the model and the complexity of the task.&lt;/p&gt;
&lt;p&gt;Most importantly, &lt;strong&gt;running a chatbot locally does not automatically give it the ability to edit Revit or AutoCAD drawings&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;To make that possible, you would need a compatible integration or automation workflow that lets the model interact with the engineering software. You would then need to test that integration carefully.&lt;/p&gt;
&lt;p&gt;This is a worthwhile longer-term direction if you want to combine privacy with AI-assisted drawing creation and checking.&lt;/p&gt;
&lt;div&gt;&lt;hr /&gt;&lt;/div&gt;
&lt;h1&gt;Part 4: A practical plan for getting started&lt;/h1&gt;
&lt;p&gt;You do not need to learn everything at once.&lt;/p&gt;
&lt;p&gt;I would start with small, low-risk experiments and gradually build towards more advanced automation.&lt;/p&gt;
&lt;h2&gt;Week 1: Learn local version control&lt;/h2&gt;
&lt;p&gt;Install Git and GitHub Desktop.&lt;/p&gt;
&lt;p&gt;Choose a small, non-confidential practice project. Create a local repository and record a few meaningful milestones.&lt;/p&gt;
&lt;p&gt;Practise finding previous versions and recovering an older file into a separate folder.&lt;/p&gt;
&lt;p&gt;The objective is simple: become comfortable maintaining a history of your work without uploading it.&lt;/p&gt;
&lt;h2&gt;Week 2: Use AI to learn your existing tools&lt;/h2&gt;
&lt;p&gt;Use AI to answer questions about Revit and AutoCAD.&lt;/p&gt;
&lt;p&gt;Ask for beginner-friendly instructions, drawing-review checklists, and explanations of unfamiliar features.&lt;/p&gt;
&lt;p&gt;Where possible, test the instructions on a copy of a practice drawing.&lt;/p&gt;
&lt;p&gt;The objective is to make AI a useful learning assistant without giving it control over your live project.&lt;/p&gt;
&lt;h2&gt;Week 3: Experiment with drawing checks&lt;/h2&gt;
&lt;p&gt;Choose one repetitive task, such as checking naming conventions, identifying missing annotations, or reviewing drawing layers.&lt;/p&gt;
&lt;p&gt;First, define the rule clearly.&lt;/p&gt;
&lt;p&gt;Then investigate whether a built-in Revit or AutoCAD feature can perform the check. If not, ask AI to help design an automation workflow.&lt;/p&gt;
&lt;p&gt;Start with a report that identifies potential problems. Do not begin with a tool that automatically modifies the original drawing.&lt;/p&gt;
&lt;h2&gt;Week 4: Explore AI-assisted drawing creation&lt;/h2&gt;
&lt;p&gt;Investigate the AI capabilities available in your current Autodesk software.&lt;/p&gt;
&lt;p&gt;If a suitable workflow exists, test it on a simple practice project. Otherwise, explore a small automation using Revit's API, Dynamo, or AutoCAD automation tools.&lt;/p&gt;
&lt;p&gt;Compare the result with a manually prepared drawing.&lt;/p&gt;
&lt;p&gt;Evaluate whether the automation saves time, produces editable engineering objects, preserves project standards, and introduces any errors.&lt;/p&gt;
&lt;p&gt;At the end of the month, you should have a basic local version history, a useful AI-assisted workflow, and a better understanding of which tasks can safely be automated.&lt;/p&gt;
&lt;div&gt;&lt;hr /&gt;&lt;/div&gt;
&lt;h1&gt;Final thoughts&lt;/h1&gt;
&lt;p&gt;Git and AI solve different problems, but together they offer a useful way to modernise an engineering workflow.&lt;/p&gt;
&lt;p&gt;Git gives you a history of your project files. AI can help you learn faster, automate repetitive operations, and investigate potential drawing errors.&lt;/p&gt;
&lt;p&gt;The most exciting possibility is not simply asking AI to explain how to draw something. It is building a workflow in which AI helps create or inspect actual engineering models, while version control and backups give you a safer way to manage the results.&lt;/p&gt;
&lt;p&gt;Start small. Protect the original files. Verify the engineering. Expand the automation only when you understand what it changes.&lt;/p&gt;
&lt;p&gt;You do not have to become a software developer to benefit from these tools. Your engineering knowledge is the foundation; Git and AI are additional tools that can help you apply it more efficiently.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The goal is not to replace the engineer. It is to give the engineer better tools.&lt;/em&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr /&gt;&lt;/div&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://git-scm.com/book/en/v2/Git-Basics-Getting-a-Git-Repository"&gt;Git: Getting a repository&lt;/a&gt; &amp;mdash; the official Git book.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository"&gt;Git: Recording changes&lt;/a&gt; &amp;mdash; understand commits and project history.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://help.autodesk.com/cloudhelp/2025/ENU/AutoCAD-Core/files/GUID-744D8A49-D582-4C06-80B1-6B0313E92CA2.htm"&gt;Autodesk: DWG Compare&lt;/a&gt; &amp;mdash; compare AutoCAD drawing revisions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://help.autodesk.com/cloudhelp/2024/ENU/Revit-Collaborate/files/GUID-3896288A-0729-4C41-A67D-4FA970DF3E43.htm"&gt;Autodesk: Revit worksharing&lt;/a&gt; &amp;mdash; understand Revit's native collaborative workflow.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>George Wanjohi</author>
  <guid isPermaLink="false">https://www.georgewanjohi.com/blog/revit-autocad/</guid>
  <pubDate>Mon, 19 Oct 2026 06:01:49 GMT</pubDate>
</item>
<item>
  <title>Understanding AsTracking vs AsNoTracking in EF Core</title>
  <link>https://www.georgewanjohi.com/blog/understanding-astracking-vs-asnotracking-in-ef-cor/</link>
  <description>&lt;h1 id="understanding-astracking-vs-asnotracking-in-ef-core" class="code-line" dir="auto" style="margin-top: 0px; margin-bottom: 16px; line-height: 1.25; padding-bottom: 0.3em; border-bottom: 1px solid rgba(0, 0, 0, 0.18); border-top-color: rgba(0, 0, 0, 0.18); border-right-color: rgba(0, 0, 0, 0.18); border-left-color: rgba(0, 0, 0, 0.18); font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, Ubuntu, 'Droid Sans', sans-serif;" data-line="0"&gt;Understanding &lt;code style="font-family: Consolas, 'Courier New', monospace; color: #a31515; background-color: rgba(0, 0, 0, 0.1); padding: 1px 3px; border-radius: 4px; font-size: 1em; line-height: 1.357em;"&gt;AsTracking&lt;/code&gt; vs &lt;code style="font-family: Consolas, 'Courier New', monospace; color: #a31515; background-color: rgba(0, 0, 0, 0.1); padding: 1px 3px; border-radius: 4px; font-size: 1em; line-height: 1.357em;"&gt;AsNoTracking&lt;/code&gt; in EF Core&lt;/h1&gt;
&lt;h2 id="why-tracking-behavior-matters" class="code-line" dir="auto" style="margin-top: 24px; margin-bottom: 16px; line-height: 1.25; padding-bottom: 0.3em; border-bottom: 1px solid rgba(0, 0, 0, 0.18); border-top-color: rgba(0, 0, 0, 0.18); border-right-color: rgba(0, 0, 0, 0.18); border-left-color: rgba(0, 0, 0, 0.18); font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, Ubuntu, 'Droid Sans', sans-serif;" data-line="2"&gt;Why Tracking Behavior Matters&lt;/h2&gt;
&lt;p class="code-line" dir="auto" style="margin-top: 0px; margin-bottom: 16px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, Ubuntu, 'Droid Sans', sans-serif; font-size: 14px; font-weight: 400;" data-line="4"&gt;Every time Entity Framework Core materializes entities from a query, it decides whether to &lt;strong&gt;track&lt;/strong&gt; those entities in the &lt;code style="font-family: Consolas, 'Courier New', monospace; color: #a31515; background-color: rgba(0, 0, 0, 0.1); padding: 1px 3px; border-radius: 4px; font-size: 1em; line-height: 1.357em;"&gt;DbContext&lt;/code&gt;'s change tracker. Tracking is what lets EF Core detect changes and generate &lt;code style="font-family: Consolas, 'Courier New', monospace; color: #a31515; background-color: rgba(0, 0, 0, 0.1); padding: 1px 3px; border-radius: 4px; font-size: 1em; line-height: 1.357em;"&gt;UPDATE&lt;/code&gt;/&lt;code style="font-family: Consolas, 'Courier New', monospace; color: #a31515; background-color: rgba(0, 0, 0, 0.1); padding: 1px 3px; border-radius: 4px; font-size: 1em; line-height: 1.357em;"&gt;DELETE&lt;/code&gt; statements when you call &lt;code style="font-family: Consolas, 'Courier New', monospace; color: #a31515; background-color: rgba(0, 0, 0, 0.1); padding: 1px 3px; border-radius: 4px; font-size: 1em; line-height: 1.357em;"&gt;SaveChangesAsync()&lt;/code&gt;. That capability isn't free &amp;mdash; it costs memory (snapshotting original values, maintaining an identity map) and CPU cycles. In many read-only code paths, that cost buys you nothing.&lt;/p&gt;
&lt;h2 id="the-default-behavior" class="code-line" dir="auto" style="margin-top: 24px; margin-bottom: 16px; line-height: 1.25; padding-bottom: 0.3em; border-bottom: 1px solid rgba(0, 0, 0, 0.18); border-top-color: rgba(0, 0, 0, 0.18); border-right-color: rgba(0, 0, 0, 0.18); border-left-color: rgba(0, 0, 0, 0.18); font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, Ubuntu, 'Droid Sans', sans-serif;" data-line="6"&gt;The Default Behavior&lt;/h2&gt;
&lt;p class="code-line" dir="auto" style="margin-top: 0px; margin-bottom: 16px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, Ubuntu, 'Droid Sans', sans-serif; font-size: 14px; font-weight: 400;" data-line="8"&gt;By default, any LINQ query against a &lt;code style="font-family: Consolas, 'Courier New', monospace; color: #a31515; background-color: rgba(0, 0, 0, 0.1); padding: 1px 3px; border-radius: 4px; font-size: 1em; line-height: 1.357em;"&gt;DbSet&amp;lt;T&amp;gt;&lt;/code&gt; is tracked:&lt;/p&gt;
&lt;p class="code-line" dir="auto" style="margin-top: 0px; margin-bottom: 16px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, Ubuntu, 'Droid Sans', sans-serif; font-size: 14px; font-weight: 400;" data-line="8"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="code-line" dir="auto" style="margin-top: 0px; margin-bottom: 16px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, Ubuntu, 'Droid Sans', sans-serif; font-size: 14px; font-weight: 400;" data-line="8"&gt;&lt;code class="code-line language-csharp" dir="auto" style="font-family: Consolas, 'Courier New', monospace; background: none; padding: 0px; border-radius: 4px; font-size: 1em; line-height: 1.357em; display: inline-block;" data-line="10"&gt;&lt;/code&gt;&lt;span style="font-family: Consolas, 'Courier New', monospace; white-space: pre; color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="font-family: Consolas, 'Courier New', monospace; white-space: pre; color: #0000ff;"&gt;async&lt;/span&gt; &lt;span style="font-family: Consolas, 'Courier New', monospace; white-space: pre; color: #267f99;"&gt;Task&lt;/span&gt;&lt;span style="font-family: Consolas, 'Courier New', monospace; white-space: pre;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: Consolas, 'Courier New', monospace; white-space: pre; color: #267f99;"&gt;List&lt;/span&gt;&lt;span style="font-family: Consolas, 'Courier New', monospace; white-space: pre;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: Consolas, 'Courier New', monospace; white-space: pre; color: #267f99;"&gt;Order&lt;/span&gt;&lt;span style="font-family: Consolas, 'Courier New', monospace; white-space: pre;"&gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span style="font-family: Consolas, 'Courier New', monospace; white-space: pre; color: #795e26;"&gt;GetPendingOrdersAsync&lt;/span&gt;&lt;span style="font-family: Consolas, 'Courier New', monospace; white-space: pre;"&gt;(&lt;/span&gt;&lt;span style="font-family: Consolas, 'Courier New', monospace; white-space: pre; color: #0000ff;"&gt;string&lt;/span&gt; &lt;span style="font-family: Consolas, 'Courier New', monospace; white-space: pre; color: #001080;"&gt;customerId&lt;/span&gt;&lt;span style="font-family: Consolas, 'Courier New', monospace; white-space: pre;"&gt;)&lt;/span&gt;&lt;span style="font-family: Consolas, 'Courier New', monospace; white-space: pre;"&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;div style="font-family: Consolas, 'Courier New', monospace; line-height: 19px; white-space: pre;"&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #af00db;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;await&lt;/span&gt; &lt;span style="color: #001080;"&gt;_context&lt;/span&gt;.&lt;span style="color: #001080;"&gt;Orders&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;span style="color: #795e26;"&gt;Where&lt;/span&gt;(&lt;span style="color: #001080;"&gt;o&lt;/span&gt; =&amp;gt; &lt;span style="color: #001080;"&gt;o&lt;/span&gt;.&lt;span style="color: #001080;"&gt;Status&lt;/span&gt; == &lt;span style="color: #001080;"&gt;OrderStatus&lt;/span&gt;.&lt;span style="color: #001080;"&gt;Pending&lt;/span&gt; &amp;amp;&amp;amp; &lt;span style="color: #001080;"&gt;o&lt;/span&gt;.&lt;span style="color: #001080;"&gt;CustomerId&lt;/span&gt; == &lt;span style="color: #001080;"&gt;customerId&lt;/span&gt;)&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;span style="color: #795e26;"&gt;ToListAsync&lt;/span&gt;();&lt;/div&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;/div&gt;
&lt;p class="code-line" dir="auto" style="margin-top: 0px; margin-bottom: 16px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, Ubuntu, 'Droid Sans', sans-serif; font-size: 14px; font-weight: 400;" data-line="8"&gt;&lt;code class="code-line language-csharp" dir="auto" style="font-family: Consolas, 'Courier New', monospace; background: none; padding: 0px; border-radius: 4px; font-size: 1em; line-height: 1.357em; display: inline-block;" data-line="10"&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p class="code-line" dir="auto" style="margin-top: 0px; margin-bottom: 16px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, Ubuntu, 'Droid Sans', sans-serif; font-size: 14px; font-weight: 400;" data-line="19"&gt;This is &lt;em&gt;implicitly tracked&lt;/em&gt;. EF Core snapshots every &lt;code style="font-family: Consolas, 'Courier New', monospace; color: #a31515; background-color: rgba(0, 0, 0, 0.1); padding: 1px 3px; border-radius: 4px; font-size: 1em; line-height: 1.357em;"&gt;Order&lt;/code&gt; entity returned, in case one needs updating later via &lt;code style="font-family: Consolas, 'Courier New', monospace; color: #a31515; background-color: rgba(0, 0, 0, 0.1); padding: 1px 3px; border-radius: 4px; font-size: 1em; line-height: 1.357em;"&gt;SaveChangesAsync()&lt;/code&gt;. If this method is part of a "fetch, mutate, save" workflow, tracking is doing useful work.&lt;/p&gt;
&lt;h2 id="when-asnotracking-is-the-better-choice" class="code-line" dir="auto" style="margin-top: 24px; margin-bottom: 16px; line-height: 1.25; padding-bottom: 0.3em; border-bottom: 1px solid rgba(0, 0, 0, 0.18); border-top-color: rgba(0, 0, 0, 0.18); border-right-color: rgba(0, 0, 0, 0.18); border-left-color: rgba(0, 0, 0, 0.18); font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, Ubuntu, 'Droid Sans', sans-serif;" data-line="21"&gt;When &lt;code style="font-family: Consolas, 'Courier New', monospace; color: #a31515; background-color: rgba(0, 0, 0, 0.1); padding: 1px 3px; border-radius: 4px; font-size: 1em; line-height: 1.357em;"&gt;AsNoTracking()&lt;/code&gt; Is the Better Choice&lt;/h2&gt;
&lt;p class="code-line" dir="auto" style="margin-top: 0px; margin-bottom: 16px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, Ubuntu, 'Droid Sans', sans-serif; font-size: 14px; font-weight: 400;" data-line="23"&gt;Not every query needs tracking. Read-only lookups &amp;mdash; checking a permission, rendering a list, or validating a condition &amp;mdash; don't need change tracking at all:&lt;/p&gt;
&lt;p class="code-line" dir="auto" style="margin-top: 0px; margin-bottom: 16px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, Ubuntu, 'Droid Sans', sans-serif; font-size: 14px; font-weight: 400;" data-line="23"&gt;&lt;code class="code-line language-csharp" dir="auto" style="font-family: Consolas, 'Courier New', monospace; background: none; padding: 0px; border-radius: 4px; font-size: 1em; line-height: 1.357em; display: inline-block;" data-line="25"&gt;&lt;/code&gt;&lt;span style="color: #008000; font-family: Consolas, 'Courier New', monospace; white-space: pre;"&gt;// Read-only check &amp;mdash; no need to track&lt;/span&gt;&lt;/p&gt;
&lt;div style="font-family: Consolas, 'Courier New', monospace; line-height: 19px; white-space: pre;"&gt;
&lt;div&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; &lt;span style="color: #001080;"&gt;isAuthorized&lt;/span&gt; = &lt;span style="color: #0000ff;"&gt;await&lt;/span&gt; &lt;span style="color: #001080;"&gt;_context&lt;/span&gt;.&lt;span style="color: #001080;"&gt;Permissions&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; .&lt;span style="color: #795e26;"&gt;AsNoTracking&lt;/span&gt;()&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; .&lt;span style="color: #795e26;"&gt;AnyAsync&lt;/span&gt;(&lt;span style="color: #001080;"&gt;p&lt;/span&gt; =&amp;gt; &lt;span style="color: #001080;"&gt;p&lt;/span&gt;.&lt;span style="color: #001080;"&gt;UserId&lt;/span&gt; == &lt;span style="color: #001080;"&gt;userId&lt;/span&gt; &amp;amp;&amp;amp; &lt;span style="color: #001080;"&gt;p&lt;/span&gt;.&lt;span style="color: #001080;"&gt;Resource&lt;/span&gt; == &lt;span style="color: #001080;"&gt;resource&lt;/span&gt;);&lt;/div&gt;
&lt;/div&gt;
&lt;p class="code-line" dir="auto" style="margin-top: 0px; margin-bottom: 16px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, Ubuntu, 'Droid Sans', sans-serif; font-size: 14px; font-weight: 400;" data-line="23"&gt;&lt;code class="code-line language-csharp" dir="auto" style="font-family: Consolas, 'Courier New', monospace; background: none; padding: 0px; border-radius: 4px; font-size: 1em; line-height: 1.357em; display: inline-block;" data-line="25"&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p class="code-line" dir="auto" style="margin-top: 0px; margin-bottom: 16px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, Ubuntu, 'Droid Sans', sans-serif; font-size: 14px; font-weight: 400;" data-line="32"&gt;&lt;code style="font-family: Consolas, 'Courier New', monospace; color: #a31515; background-color: rgba(0, 0, 0, 0.1); padding: 1px 3px; border-radius: 4px; font-size: 1em; line-height: 1.357em;"&gt;AsNoTracking()&lt;/code&gt; skips snapshotting entirely, which:&lt;/p&gt;
&lt;ul class="code-line" dir="auto" style="margin-top: 0px; margin-bottom: 0.7em; font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, Ubuntu, 'Droid Sans', sans-serif; font-size: 14px; font-weight: 400;" data-line="34"&gt;
&lt;li class="code-line" dir="auto" data-line="34"&gt;Reduces memory usage (no identity map entries, no original-value snapshots).&lt;/li&gt;
&lt;li class="code-line" dir="auto" data-line="35"&gt;Speeds up query materialization, especially for larger result sets.&lt;/li&gt;
&lt;li class="code-line" dir="auto" data-line="36"&gt;Avoids "phantom updates" &amp;mdash; a subtle bug where an entity is loaded, mutated somewhere down the call stack, and unexpectedly persisted on the next &lt;code style="font-family: Consolas, 'Courier New', monospace; color: #a31515; background-color: rgba(0, 0, 0, 0.1); padding: 1px 3px; border-radius: 4px; font-size: 1em; line-height: 1.357em;"&gt;SaveChangesAsync()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="when-to-use-astracking-explicitly" class="code-line" dir="auto" style="margin-top: 24px; margin-bottom: 16px; line-height: 1.25; padding-bottom: 0.3em; border-bottom: 1px solid rgba(0, 0, 0, 0.18); border-top-color: rgba(0, 0, 0, 0.18); border-right-color: rgba(0, 0, 0, 0.18); border-left-color: rgba(0, 0, 0, 0.18); font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, Ubuntu, 'Droid Sans', sans-serif;" data-line="38"&gt;When to Use &lt;code style="font-family: Consolas, 'Courier New', monospace; color: #a31515; background-color: rgba(0, 0, 0, 0.1); padding: 1px 3px; border-radius: 4px; font-size: 1em; line-height: 1.357em;"&gt;AsTracking()&lt;/code&gt; Explicitly&lt;/h2&gt;
&lt;p class="code-line" dir="auto" style="margin-top: 0px; margin-bottom: 16px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, Ubuntu, 'Droid Sans', sans-serif; font-size: 14px; font-weight: 400;" data-line="40"&gt;If your &lt;code style="font-family: Consolas, 'Courier New', monospace; color: #a31515; background-color: rgba(0, 0, 0, 0.1); padding: 1px 3px; border-radius: 4px; font-size: 1em; line-height: 1.357em;"&gt;DbContext&lt;/code&gt; is configured with a default of &lt;code style="font-family: Consolas, 'Courier New', monospace; color: #a31515; background-color: rgba(0, 0, 0, 0.1); padding: 1px 3px; border-radius: 4px; font-size: 1em; line-height: 1.357em;"&gt;QueryTrackingBehavior.NoTracking&lt;/code&gt; (e.g., via &lt;code style="font-family: Consolas, 'Courier New', monospace; color: #a31515; background-color: rgba(0, 0, 0, 0.1); padding: 1px 3px; border-radius: 4px; font-size: 1em; line-height: 1.357em;"&gt;UseQueryTrackingBehavior&lt;/code&gt;), you can flip individual queries back to tracked mode with &lt;code style="font-family: Consolas, 'Courier New', monospace; color: #a31515; background-color: rgba(0, 0, 0, 0.1); padding: 1px 3px; border-radius: 4px; font-size: 1em; line-height: 1.357em;"&gt;.AsTracking()&lt;/code&gt;:&lt;/p&gt;
&lt;p class="code-line" dir="auto" style="margin-top: 0px; margin-bottom: 16px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, Ubuntu, 'Droid Sans', sans-serif; font-size: 14px; font-weight: 400;" data-line="40"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="code-line" dir="auto" style="margin-top: 0px; margin-bottom: 16px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, Ubuntu, 'Droid Sans', sans-serif; font-size: 14px; font-weight: 400;" data-line="40"&gt;&lt;code class="code-line language-csharp" dir="auto" style="font-family: Consolas, 'Courier New', monospace; background: none; padding: 0px; border-radius: 4px; font-size: 1em; line-height: 1.357em; display: inline-block;" data-line="42"&gt;&lt;/code&gt;&lt;span style="font-family: Consolas, 'Courier New', monospace; white-space: pre; color: #0000ff;"&gt;var&lt;/span&gt; &lt;span style="font-family: Consolas, 'Courier New', monospace; white-space: pre; color: #001080;"&gt;order&lt;/span&gt;&lt;span style="font-family: Consolas, 'Courier New', monospace; white-space: pre;"&gt; = &lt;/span&gt;&lt;span style="font-family: Consolas, 'Courier New', monospace; white-space: pre; color: #0000ff;"&gt;await&lt;/span&gt; &lt;span style="font-family: Consolas, 'Courier New', monospace; white-space: pre; color: #001080;"&gt;_context&lt;/span&gt;&lt;span style="font-family: Consolas, 'Courier New', monospace; white-space: pre;"&gt;.&lt;/span&gt;&lt;span style="font-family: Consolas, 'Courier New', monospace; white-space: pre; color: #001080;"&gt;Orders&lt;/span&gt;&lt;/p&gt;
&lt;div style="font-family: Consolas, 'Courier New', monospace; line-height: 19px; white-space: pre;"&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; .&lt;span style="color: #795e26;"&gt;AsTracking&lt;/span&gt;()&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; .&lt;span style="color: #795e26;"&gt;FirstOrDefaultAsync&lt;/span&gt;(&lt;span style="color: #001080;"&gt;o&lt;/span&gt; =&amp;gt; &lt;span style="color: #001080;"&gt;o&lt;/span&gt;.&lt;span style="color: #001080;"&gt;Id&lt;/span&gt; == &lt;span style="color: #001080;"&gt;orderId&lt;/span&gt;);&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style="color: #001080;"&gt;order&lt;/span&gt;.&lt;span style="color: #001080;"&gt;Status&lt;/span&gt; = &lt;span style="color: #001080;"&gt;OrderStatus&lt;/span&gt;.&lt;span style="color: #001080;"&gt;Shipped&lt;/span&gt;;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #0000ff;"&gt;await&lt;/span&gt; &lt;span style="color: #001080;"&gt;_context&lt;/span&gt;.&lt;span style="color: #795e26;"&gt;SaveChangesAsync&lt;/span&gt;();&lt;/div&gt;
&lt;/div&gt;
&lt;p class="code-line" dir="auto" style="margin-top: 0px; margin-bottom: 16px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, Ubuntu, 'Droid Sans', sans-serif; font-size: 14px; font-weight: 400;" data-line="40"&gt;&lt;code class="code-line language-csharp" dir="auto" style="font-family: Consolas, 'Courier New', monospace; background: none; padding: 0px; border-radius: 4px; font-size: 1em; line-height: 1.357em; display: inline-block;" data-line="42"&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p class="code-line" dir="auto" style="margin-top: 0px; margin-bottom: 16px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, Ubuntu, 'Droid Sans', sans-serif; font-size: 14px; font-weight: 400;" data-line="51"&gt;Without &lt;code style="font-family: Consolas, 'Courier New', monospace; color: #a31515; background-color: rgba(0, 0, 0, 0.1); padding: 1px 3px; border-radius: 4px; font-size: 1em; line-height: 1.357em;"&gt;AsTracking()&lt;/code&gt; here, the change to &lt;code style="font-family: Consolas, 'Courier New', monospace; color: #a31515; background-color: rgba(0, 0, 0, 0.1); padding: 1px 3px; border-radius: 4px; font-size: 1em; line-height: 1.357em;"&gt;Status&lt;/code&gt; would silently be lost &amp;mdash; EF Core wouldn't know the entity changed because it never took a baseline snapshot.&lt;/p&gt;
&lt;h2 id="a-practical-rule-of-thumb" class="code-line" dir="auto" style="margin-top: 24px; margin-bottom: 16px; line-height: 1.25; padding-bottom: 0.3em; border-bottom: 1px solid rgba(0, 0, 0, 0.18); border-top-color: rgba(0, 0, 0, 0.18); border-right-color: rgba(0, 0, 0, 0.18); border-left-color: rgba(0, 0, 0, 0.18); font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, Ubuntu, 'Droid Sans', sans-serif;" data-line="53"&gt;A Practical Rule of Thumb&lt;/h2&gt;
&lt;p class="code-line" dir="auto" style="margin-top: 0px; margin-bottom: 16px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, Ubuntu, 'Droid Sans', sans-serif; font-size: 14px; font-weight: 400;" data-line="55"&gt;For services that mix read-heavy queries with write-heavy updates:&lt;/p&gt;
&lt;ol class="code-line" dir="auto" style="margin-top: 0px; margin-bottom: 0.7em; font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, Ubuntu, 'Droid Sans', sans-serif; font-size: 14px; font-weight: 400;" data-line="57"&gt;
&lt;li class="code-line" dir="auto" data-line="57"&gt;&lt;strong&gt;Default the context to &lt;code style="font-family: Consolas, 'Courier New', monospace; color: #a31515; background-color: rgba(0, 0, 0, 0.1); padding: 1px 3px; border-radius: 4px; font-size: 1em; line-height: 1.357em;"&gt;NoTracking&lt;/code&gt;&lt;/strong&gt; at the &lt;code style="font-family: Consolas, 'Courier New', monospace; color: #a31515; background-color: rgba(0, 0, 0, 0.1); padding: 1px 3px; border-radius: 4px; font-size: 1em; line-height: 1.357em;"&gt;DbContextOptionsBuilder&lt;/code&gt; level for maximum read performance.&lt;/li&gt;
&lt;li class="code-line" dir="auto" data-line="58"&gt;Explicitly call &lt;strong&gt;&lt;code style="font-family: Consolas, 'Courier New', monospace; color: #a31515; background-color: rgba(0, 0, 0, 0.1); padding: 1px 3px; border-radius: 4px; font-size: 1em; line-height: 1.357em;"&gt;.AsTracking()&lt;/code&gt;&lt;/strong&gt; on any query whose results will be mutated and saved later in the same unit of work.&lt;/li&gt;
&lt;li class="code-line" dir="auto" data-line="59"&gt;Keep "fetch &amp;rarr; mutate &amp;rarr; save" workflows tracked.&lt;/li&gt;
&lt;li class="code-line" dir="auto" data-line="60"&gt;Keep authorization/validation queries as &lt;code style="font-family: Consolas, 'Courier New', monospace; color: #a31515; background-color: rgba(0, 0, 0, 0.1); padding: 1px 3px; border-radius: 4px; font-size: 1em; line-height: 1.357em;"&gt;AsNoTracking()&lt;/code&gt;, since they only inform a decision and are never saved.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="takeaway" class="code-line" dir="auto" style="margin-top: 24px; margin-bottom: 16px; line-height: 1.25; padding-bottom: 0.3em; border-bottom: 1px solid rgba(0, 0, 0, 0.18); border-top-color: rgba(0, 0, 0, 0.18); border-right-color: rgba(0, 0, 0, 0.18); border-left-color: rgba(0, 0, 0, 0.18); font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, Ubuntu, 'Droid Sans', sans-serif;" data-line="62"&gt;Takeaway&lt;/h2&gt;
&lt;p class="code-line" dir="auto" style="margin-top: 0px; margin-bottom: 16px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, Ubuntu, 'Droid Sans', sans-serif; font-size: 14px; font-weight: 400;" data-line="64"&gt;Tracking isn't free, and it isn't always necessary. Auditing your EF Core queries &amp;mdash; separating "I need to save this later" from "I just need to read this" &amp;mdash; is a low-risk, high-value optimization, especially in systems where a shared &lt;code style="font-family: Consolas, 'Courier New', monospace; color: #a31515; background-color: rgba(0, 0, 0, 0.1); padding: 1px 3px; border-radius: 4px; font-size: 1em; line-height: 1.357em;"&gt;DbContext&lt;/code&gt; handles both read-heavy validation logic and write-heavy processing logic.&lt;/p&gt;</description>
  <author>George Wanjohi</author>
  <category>entityframework</category>
  <guid isPermaLink="false">https://www.georgewanjohi.com/blog/understanding-astracking-vs-asnotracking-in-ef-cor/</guid>
  <pubDate>Wed, 16 Sep 2026 10:21:13 GMT</pubDate>
</item>
<item>
  <title>Building a Reading Culture.</title>
  <link>https://www.georgewanjohi.com/blog/readingculture/</link>
  <description>&lt;p&gt;&lt;img src="https://media.licdn.com/dms/image/v2/D4D12AQEXtSoHpAtW6A/article-cover_image-shrink_720_1280/article-cover_image-shrink_720_1280/0/1656093581116?e=1790812800&amp;amp;v=beta&amp;amp;t=hv3RA1lCa-SFJWB__Qpk4jef-Ks26QPB5TniWZ1VMvY" alt="Photo by Ben White on Unsplash- see link at the end" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p id="ember55" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;This being the internet, the above post is no longer available. Did I not read the terms and conditions?&lt;/p&gt;
&lt;p id="ember56" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;The research&lt;em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px;"&gt; findings &lt;/em&gt;- as of when first I penned down this draft - showed, that women are more likely to read a product/gadget manual. Lucky for men, we coexist with women at work, at home, and in many other social settings.&lt;/p&gt;
&lt;p id="ember57" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;In the technology space, your efficiency is pegged on knowing your problem very well in order to match your solutions with the best tools available. Luckily, there is no deficiency of manuals out there for anything you might be looking for. Your solution is always a question away. If this is not the case, it is always an opportunity to &lt;em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px;"&gt;write.&lt;/em&gt;&lt;/p&gt;
&lt;div class="reader-embed-block__iframe-embed" style="box-sizing: inherit; margin: 0px -24px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all; color: rgba(0, 0, 0, 0.9);"&gt;&lt;iframe style="box-sizing: inherit; margin: 0px; padding: 0px; border-width: 0px; border-style: none; border-color: rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px; display: block; width: 632px;" title="Why Men Don't Ask for Directions" src="https://www.linkedin.com/embeds/publishingEmbed.html?articleId=7461035006459981697&amp;amp;li_theme=light" width="632" height="149"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p id="ember58" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;The post above looks at a parallel problem - getting directions. I will look at one thought -&lt;/p&gt;
&lt;p id="ember59" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;&lt;em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px;"&gt;"Most people prefer to learn by doing, not being told what to do."&lt;/em&gt;&lt;/p&gt;
&lt;p id="ember60" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;My grandmother told stories of traveling long distances during her youth - without maps, cars, or marked roads. This scares the hell out of modern-day we. Luckily, during those times, without technology, people really had to depend on, and trust their brains and ask for directions of course.&lt;/p&gt;
&lt;p id="ember61" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;With the increase in the number of &lt;em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px;"&gt;things&lt;/em&gt;&lt;span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px; font-weight: 600;"&gt;,&lt;/span&gt; and their &lt;em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px;"&gt;interactions&lt;/em&gt; growing ever more complex, there is a need to read &lt;em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px;"&gt;manuals&lt;/em&gt; more than ever. Modern professions are riding on the availability of information and the ease with which such information can be easily transferred.&lt;/p&gt;
&lt;p id="ember62" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;As a budding software architect - I am more aware of the fact that there is a need to read more and write about my approaches. The worry of being wrong should not be a stopper. I am more appreciative of the fact that being wrong is a step in the right direction. It takes time to know the right questions to ask. In the meantime, there is a need to keep on asking.&lt;/p&gt;
&lt;p id="ember63" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;To quote Confucius, &amp;ldquo;True wisdom is knowing what you don't know.&amp;rdquo;&lt;/p&gt;
&lt;p id="ember64" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;When working on Software, reading manuals could be present as&lt;/p&gt;
&lt;p id="ember65" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px 0px 0px 32px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; color: rgba(0, 0, 0, 0.9); line-height: 1.5;"&gt;
&lt;li style="box-sizing: inherit; margin: 0px 0px 8px; padding: 0px 0px 0px 8px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);"&gt;Understanding a problem domain.&lt;/li&gt;
&lt;li style="box-sizing: inherit; margin: 0px 0px 8px; padding: 0px 0px 0px 8px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);"&gt;Understanding your toolset.&lt;/li&gt;
&lt;li style="box-sizing: inherit; margin: 0px 0px 8px; padding: 0px 0px 0px 8px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);"&gt;Appreciating work politics.&lt;/li&gt;
&lt;li style="box-sizing: inherit; margin: 0px 0px 8px; padding: 0px 0px 0px 8px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);"&gt;Getting feedback from software users, among others.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id="ember66" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;References:&lt;/p&gt;
&lt;p id="ember67" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;&lt;a class="KKhlwxghBFBrYSFmhqstHWReEjIKucTNiY " style="box-sizing: inherit; margin: 0px; padding: 0px; vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); text-decoration: #0a66c2; font-weight: 600; border: 0px #0a66c2; color: #0a66c2; touch-action: manipulation; overflow-wrap: break-word;" tabindex="0" href="https://unsplash.com/photos/1MHU3zpTvro?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditShareLink" target="_self" data-test-app-aware-link=""&gt;Photo by Ben White on Unsplash&lt;/a&gt;&lt;/p&gt;
&lt;p id="ember68" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;Happy Coding!&lt;/p&gt;</description>
  <author>George Wanjohi</author>
  <category>reading culture</category>
  <guid isPermaLink="false">https://www.georgewanjohi.com/blog/readingculture/</guid>
  <pubDate>Sun, 13 Sep 2026 07:07:08 GMT</pubDate>
</item>
<item>
  <title>Why the Soviet Computer Failed</title>
  <link>https://www.georgewanjohi.com/blog/sovietcomputer/</link>
  <description>&lt;p&gt;&lt;img src="https://media.licdn.com/dms/image/v2/D4D12AQG4bQrRA6en9A/article-cover_image-shrink_720_1280/article-cover_image-shrink_720_1280/0/1658590344574?e=1790812800&amp;amp;v=beta&amp;amp;t=KL6MHLEgG0tfYKnIWe5IbwvIEOwtdGcfrti1DKtGJTE" alt="an old computer gathering dust - Cover photo by Md Riduwan Molla on Unsplash" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p id="ember54" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;"In 1986, the Soviet Union had slightly more than 10,000 computers. The Americans had 1.3 million.&lt;/p&gt;
&lt;p id="ember55" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;At the time of Stalin's death, the Soviet Union was the world's third most proficient computing power. But by the 1960s, the US-Soviet computing gap was already years long. Twenty years later, the gap was undeniable and basically permanent. Why did this happen? The Soviet state believed in science and industrial modernization. Support for research &amp;amp; development and the hard sciences were plentiful. They had the country&amp;rsquo;s finest minds. Goodness gracious, they launched Sputnik! They landed on Venus! How did it come to this?"&lt;/p&gt;
&lt;p id="ember56" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;.... check the link below to see the full story on YouTube&lt;/p&gt;
&lt;p id="ember57" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;&lt;span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px; font-weight: 600;"&gt;Notice!&lt;/span&gt;&lt;/p&gt;
&lt;p id="ember58" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;This content has been provided with kind by Asianometry on &lt;a class="KKhlwxghBFBrYSFmhqstHWReEjIKucTNiY " style="box-sizing: inherit; margin: 0px; padding: 0px; vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); text-decoration: #0a66c2; font-weight: 600; border: 0px #0a66c2; color: #0a66c2; touch-action: manipulation; overflow-wrap: break-word;" tabindex="0" href="https://www.youtube.com/c/Asianometry" target="_self" data-test-app-aware-link=""&gt;youtube&lt;/a&gt;. Watch the full video &lt;a class="KKhlwxghBFBrYSFmhqstHWReEjIKucTNiY " style="box-sizing: inherit; margin: 0px; padding: 0px; vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); text-decoration: #0a66c2; font-weight: 600; border: 0px #0a66c2; color: #0a66c2; touch-action: manipulation; overflow-wrap: break-word;" tabindex="0" href="https://www.youtube.com/watch?v=dnHdqPBrtH8D" target="_self" data-test-app-aware-link=""&gt;Why Soviet Computers Failed&lt;/a&gt;. Next time you want to extract subtitles or closed captions from YouTube videos, consider using &lt;a class="KKhlwxghBFBrYSFmhqstHWReEjIKucTNiY " style="box-sizing: inherit; margin: 0px; padding: 0px; vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); text-decoration: #0a66c2; font-weight: 600; border: 0px #0a66c2; color: #0a66c2; touch-action: manipulation; overflow-wrap: break-word;" tabindex="0" href="https://youtube-dl.org/" target="_self" data-test-app-aware-link=""&gt;youtube-dl&lt;/a&gt;&lt;em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px;"&gt;. &lt;/em&gt;&lt;/p&gt;
&lt;p id="ember59" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;&lt;em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px;"&gt;"&lt;/em&gt;&lt;span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px; font-weight: 600;"&gt;youtube-dl&lt;/span&gt; is a command-line program to download videos from YouTube.com and a few more sites. It requires the Python interpreter, version 2.6, 2.7, or 3.2+, and it is not platform-specific. It should work on your Unix box, on Windows, or on macOS. It is released to the public domain, which means you can modify it, redistribute it or use it however you like.&lt;em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px;"&gt;"&lt;/em&gt;&lt;/p&gt;
&lt;pre class="reader-text-block__code-block" style="box-sizing: inherit; margin: 0px -24px 32px; padding: 32px; border: 0px #ffffff; font-size: 16px; vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box #293138; font-family: 'SF Mono', Consolas, 'Roboto Mono', 'Noto Mono', 'Droid Mono', 'Fira Mono', 'Ubuntu Mono', 'Oxygen Mono', 'Lucida Console', Menlo, Monaco, monospace; border-radius: 8px; color: #ffffff; line-height: 1.5; white-space: pre-wrap; overflow-x: auto;"&gt;&lt;code style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px #ffffff; vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: #ffffff none 0px; font-family: 'SF Mono', Consolas, 'Roboto Mono', 'Noto Mono', 'Droid Mono', 'Fira Mono', 'Ubuntu Mono', 'Oxygen Mono', 'Lucida Console', Menlo, Monaco, monospace; line-height: 1.5;"&gt;$ youtube-dl --write-sub&amp;nbsp; --skip-download &amp;lt;youtube-address-goes-here&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p id="ember60" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;What we get is a&lt;em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px;"&gt; *.VTT file&lt;/em&gt;. See some additional processing done below.&lt;/p&gt;
&lt;div class="reader-image-block reader-image-block--full-width" style="box-sizing: inherit; margin: 0px -24px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; color: rgba(0, 0, 0, 0.9);"&gt;
&lt;figure class="reader-image-block__figure" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); display: flex; flex-direction: column; position: relative;"&gt;
&lt;div class="ivm-image-view-model    reader-image-block__img-container" style="box-sizing: inherit; margin: 0px 0px 16px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);"&gt;
&lt;div class="ivm-view-attr__img-wrapper
        
        " style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);"&gt;&lt;img id="ember61" class="ivm-view-attr__img--centered  reader-image-block__img evi-image lazy-image ember-view" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 50% center / cover repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px; object-position: center center; object-fit: cover; display: block; height: auto; max-width: 100%; width: 632px;" src="https://media.licdn.com/dms/image/v2/D4D12AQG2SGim2aQpGA/article-inline_image-shrink_1000_1488/article-inline_image-shrink_1000_1488/0/1657648811848?e=1790812800&amp;amp;v=beta&amp;amp;t=bXbIY2yYfXpZSit8EVJ3l_dV9Ssmqzbad22ylx-fZ4w" alt="No alt text provided for this image" /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p id="ember62" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;Happy Coding&lt;/p&gt;
&lt;p id="ember63" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;Cover photo by &lt;a class="KKhlwxghBFBrYSFmhqstHWReEjIKucTNiY " style="box-sizing: inherit; margin: 0px; padding: 0px; vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); text-decoration: #0a66c2; font-weight: 600; border: 0px #0a66c2; color: #0a66c2; touch-action: manipulation; overflow-wrap: break-word;" tabindex="0" href="https://unsplash.com/@riduwanmolla?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_self" data-test-app-aware-link=""&gt;Md Riduwan Molla&lt;/a&gt; on &lt;a class="KKhlwxghBFBrYSFmhqstHWReEjIKucTNiY " style="box-sizing: inherit; margin: 0px; padding: 0px; vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); text-decoration: #0a66c2; font-weight: 600; border: 0px #0a66c2; color: #0a66c2; touch-action: manipulation; overflow-wrap: break-word;" tabindex="0" href="https://unsplash.com/s/photos/old-computer?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_self" data-test-app-aware-link=""&gt;Unsplash&lt;/a&gt;&lt;/p&gt;</description>
  <author>George Wanjohi</author>
  <guid isPermaLink="false">https://www.georgewanjohi.com/blog/sovietcomputer/</guid>
  <pubDate>Sun, 13 Sep 2026 07:05:11 GMT</pubDate>
</item>
<item>
  <title>Memory Management at Runtime</title>
  <link>https://www.georgewanjohi.com/blog/memorymanagement/</link>
  <description>&lt;p&gt;&lt;img src="https://media.licdn.com/dms/image/v2/C4D12AQFV9esfGyo37Q/article-cover_image-shrink_720_1280/article-cover_image-shrink_720_1280/0/1645816098262?e=1790812800&amp;amp;v=beta&amp;amp;t=Gt_lBntuAO-mwtkbuZUjyawKk0HWeCX0DAWXZ8PSgEo" alt="photo by https://tinyurl.com/mvsvrvws" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p id="ember53" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;In computing, memory is a device or system that is used to store information for immediate use in a computer or related computer hardware and digital electronic devices. The term memory is often synonymous with the term primary storage or main memory. An archaic synonym for memory is store. &lt;a class="KKhlwxghBFBrYSFmhqstHWReEjIKucTNiY " style="box-sizing: inherit; margin: 0px; padding: 0px; vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); text-decoration: #0a66c2; font-weight: 600; border: 0px #0a66c2; color: #0a66c2; touch-action: manipulation; overflow-wrap: break-word;" tabindex="0" href="https://en.wikipedia.org/wiki/Computer_memory" target="_self" data-test-app-aware-link=""&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="ember54" class="ember-view reader-text-block__heading-3" style="box-sizing: inherit; margin: 0px 0px 16px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 20px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; outline: rgba(0, 0, 0, 0.9) none 0px; color: rgba(0, 0, 0, 0.9); line-height: 1.25; font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif;"&gt;Classes of Memory&lt;/h3&gt;
&lt;p id="ember55" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;Generally, there are 3 classes of Memory&lt;/p&gt;
&lt;p id="ember56" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;&lt;em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px;"&gt; a. Static memory.&lt;/em&gt;&lt;/p&gt;
&lt;p id="ember57" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;Allocated for the entire lifetime of the program.&lt;/p&gt;
&lt;p id="ember58" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;&lt;em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px;"&gt;b. Automatic memory. &lt;/em&gt;&lt;/p&gt;
&lt;p id="ember59" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;Allocated and freed automatically when functions or methods are executed.&lt;/p&gt;
&lt;p id="ember60" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;&lt;em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px;"&gt;c. Dynamic memory. &lt;/em&gt;&lt;/p&gt;
&lt;p id="ember61" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;Explicitly allocated by the program and freed explicitly&amp;mdash;or by an automatic program called the GARBAGE COLLECTOR.&lt;/p&gt;
&lt;h3 id="ember62" class="ember-view reader-text-block__heading-3" style="box-sizing: inherit; margin: 0px 0px 16px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 20px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; outline: rgba(0, 0, 0, 0.9) none 0px; color: rgba(0, 0, 0, 0.9); line-height: 1.25; font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif;"&gt;Rules&lt;/h3&gt;
&lt;p id="ember63" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px 0px 0px 32px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; color: rgba(0, 0, 0, 0.9); line-height: 1.5;"&gt;
&lt;li style="box-sizing: inherit; margin: 0px 0px 8px; padding: 0px 0px 0px 8px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);"&gt;&lt;span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px; font-weight: 600;"&gt;Top Level &lt;/span&gt;variables and static fields belong to Static Memory.&lt;/li&gt;
&lt;li style="box-sizing: inherit; margin: 0px 0px 8px; padding: 0px 0px 0px 8px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);"&gt;Function&lt;span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px; font-weight: 600;"&gt;Args&lt;/span&gt; and &lt;span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px; font-weight: 600;"&gt;local&lt;/span&gt; Variables belong to automatic memory.&lt;/li&gt;
&lt;li style="box-sizing: inherit; margin: 0px 0px 8px; padding: 0px 0px 0px 8px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);"&gt;Memory is explicitly allocated using the &lt;em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px;"&gt;&lt;span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px; font-weight: 600;"&gt;NEW &lt;/span&gt;&lt;/em&gt;&lt;em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px;"&gt;operator,&lt;/em&gt; belonging to dynamic memory.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="reader-text-block__code-block" style="box-sizing: inherit; margin: 0px -24px 32px; padding: 32px; border: 0px #ffffff; font-size: 16px; vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box #293138; font-family: 'SF Mono', Consolas, 'Roboto Mono', 'Noto Mono', 'Droid Mono', 'Fira Mono', 'Ubuntu Mono', 'Oxygen Mono', 'Lucida Console', Menlo, Monaco, monospace; border-radius: 8px; color: #ffffff; line-height: 1.5; white-space: pre-wrap; overflow-x: auto;"&gt;&lt;code style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px #ffffff; vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: #ffffff none 0px; font-family: 'SF Mono', Consolas, 'Roboto Mono', 'Noto Mono', 'Droid Mono', 'Fira Mono', 'Ubuntu Mono', 'Oxygen Mono', 'Lucida Console', Menlo, Monaco, monospace; line-height: 1.5;"&gt;The most important element of a programming language runtime


                                                    is memory &lt;/code&gt;&lt;/pre&gt;
&lt;p id="ember64" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id="ember65" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;&lt;em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px;"&gt;Building Software that People &lt;/em&gt;&amp;hearts;️&lt;/p&gt;</description>
  <author>George Wanjohi</author>
  <category>programming</category>
  <guid isPermaLink="false">https://www.georgewanjohi.com/blog/memorymanagement/</guid>
  <pubDate>Sun, 13 Sep 2026 07:03:26 GMT</pubDate>
</item>
<item>
  <title>Execution Stacks and when they Overflow</title>
  <link>https://www.georgewanjohi.com/blog/executionstacks/</link>
  <description>&lt;p id="ember54" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;In computer science, a thread of execution is &lt;em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px;"&gt;the smallest sequence of programmed instructions that can be managed independently by a&lt;/em&gt;&lt;span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px; font-weight: 600;"&gt; scheduler&lt;/span&gt;, which is typically a part of the operating system. Normally, when you start your program, the compiler already breaks your program into independent threads which are passed to the runtime independently.&lt;/p&gt;
&lt;p id="ember55" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;Each &lt;em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px;"&gt;execution thread&lt;/em&gt; has a &lt;span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px; font-weight: 600;"&gt;stack&lt;/span&gt; where &lt;em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px;"&gt;local variables&lt;/em&gt; and &lt;em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px;"&gt;arguments&lt;/em&gt; are allocated when a &lt;em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px;"&gt;function&lt;/em&gt; or a &lt;em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px;"&gt;method&lt;/em&gt; is invoked. A stack is used because it naturally follows the execution flow of method and function calls. The topmost record contains the data about the currently executing function; below that is the record of the caller of the function, which sits on top of another record of its caller, and so on.&lt;/p&gt;
&lt;div class="reader-image-block reader-image-block--full-width" style="box-sizing: inherit; margin: 0px -24px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; color: rgba(0, 0, 0, 0.9);"&gt;
&lt;figure class="reader-image-block__figure" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); display: flex; flex-direction: column; position: relative;"&gt;
&lt;div class="ivm-image-view-model    reader-image-block__img-container" style="box-sizing: inherit; margin: 0px 0px 16px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);"&gt;
&lt;div class="ivm-view-attr__img-wrapper
        
        " style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);"&gt;&lt;img id="ember56" class="ivm-view-attr__img--centered  reader-image-block__img evi-image lazy-image ember-view" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 50% center / cover repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px; object-position: center center; object-fit: cover; display: block; height: auto; max-width: 100%; width: 632px;" src="https://media.licdn.com/dms/image/v2/D4D12AQE7aehD_xB5SA/article-inline_image-shrink_1500_2232/article-inline_image-shrink_1500_2232/0/1657811350171?e=1790812800&amp;amp;v=beta&amp;amp;t=6r0bhBvY1wkTneeYm3xBSsqZcZQWTMY0oacudmCKsEE" alt="No alt text provided for this image" /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p id="ember57" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id="ember58" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;In the example above, we have a function that calculates the factorial of a number &lt;em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px;"&gt;&lt;span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px; font-weight: 600;"&gt;n&lt;/span&gt;&lt;/em&gt;. Since this function is recursive, it does not compute the final result until the end condition&lt;em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px;"&gt;&lt;span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px; font-weight: 600;"&gt; n &amp;lt;= 1 &lt;/span&gt;&lt;/em&gt;is met. All preliminary result sets are held in memory and are contained in a stack that is bound to the currently executing thread.&lt;/p&gt;
&lt;p id="ember59" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;e.g. the factorial of 5&lt;/p&gt;
&lt;div class="reader-image-block reader-image-block--full-width" style="box-sizing: inherit; margin: 0px -24px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; color: rgba(0, 0, 0, 0.9);"&gt;
&lt;figure class="reader-image-block__figure" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); display: flex; flex-direction: column; position: relative;"&gt;
&lt;div class="ivm-image-view-model    reader-image-block__img-container" style="box-sizing: inherit; margin: 0px 0px 16px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);"&gt;
&lt;div class="ivm-view-attr__img-wrapper
        
        " style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);"&gt;&lt;img id="ember60" class="ivm-view-attr__img--centered  reader-image-block__img evi-image lazy-image ember-view" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 50% center / cover repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px; object-position: center center; object-fit: cover; display: block; height: auto; max-width: 100%; width: 632px;" src="https://media.licdn.com/dms/image/v2/D4D12AQEzNSfovYviQw/article-inline_image-shrink_1500_2232/article-inline_image-shrink_1500_2232/0/1657811565794?e=1790812800&amp;amp;v=beta&amp;amp;t=DLf2tcLPq1DSyJMKCw9aay5A6uW420LbYauzWvkTm1g" alt="No alt text provided for this image" /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p id="ember61" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;In memory, our stack contains 5 variables, this is all good. A design-based question arises, how much information can this stack hold? We need to know this threshold to avoid the next error, &lt;span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px; font-weight: 600;"&gt;the Stack Overflow&lt;/span&gt; exception.&lt;/p&gt;
&lt;p id="ember62" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;Trying to calculate the factorial of &lt;em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px;"&gt;&lt;span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px; font-weight: 600;"&gt;n = 50000000 &lt;/span&gt;&lt;/em&gt;results in a Stack Overflow Exception - easily.&lt;/p&gt;</description>
  <author>George Wanjohi</author>
  <category>programming</category>
  <guid isPermaLink="false">https://www.georgewanjohi.com/blog/executionstacks/</guid>
  <pubDate>Sun, 13 Sep 2026 07:01:47 GMT</pubDate>
</item>
<item>
  <title>Accounting: The great divide.</title>
  <link>https://www.georgewanjohi.com/blog/accounting/</link>
  <description>&lt;p id="ember53" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;&lt;img src="https://media.licdn.com/dms/image/v2/D4D12AQFfWgaD-UoMYw/article-cover_image-shrink_720_1280/article-cover_image-shrink_720_1280/0/1669391288943?e=1790812800&amp;amp;v=beta&amp;amp;t=CrbOaZf0W28cKYJZwN64cTTdxgq9HUQ1-MgKw8uiiHc" alt="Photo by Kelly Sikkema on Unsplash - See link below" /&gt;&lt;br /&gt;&lt;br /&gt;Among other routines, managers are inherently accountable for most of their departmental/business finances. Provided with a budget, and timelines, we need a trail of accounts that shed light on business products, projects, and operational undertakings therein.&lt;/p&gt;
&lt;p id="ember54" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;Where there are proper and accurate records of transactions, it is easier to drive business processes to profitability.&lt;/p&gt;
&lt;p id="ember55" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;Devoid of an accurate record of accounts, Risky undertakings are highly frowned upon. More so, quantifying success is nearly impossible. Where success is not measurable, conflicts will always arise. You will find reward schemes bogged with injustices. Political affiliations are rewarded, and dissent&amp;mdash;coupled with financial implications, is highly discouraged.&lt;/p&gt;
&lt;p id="ember56" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;It is records of accounts that inform budget planning, expenditure tracking, etc. Additionally, at a glance, you get a detailed view of records of liabilities, expenses, incomes, the value of assets, etcetera.&lt;/p&gt;
&lt;p id="ember57" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;There is plenty of software out there that can aid in keeping and extracting helpful information from journals. My personal favorites are -:&lt;/p&gt;
&lt;p id="ember58" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;&lt;a class="KKhlwxghBFBrYSFmhqstHWReEjIKucTNiY " style="box-sizing: inherit; margin: 0px; padding: 0px; vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); text-decoration: #0a66c2; font-weight: 600; border: 0px #0a66c2; color: #0a66c2; touch-action: manipulation; overflow-wrap: break-word;" tabindex="0" href="https://www.gnucash.org/" target="_self" data-test-app-aware-link=""&gt;GnuCash&lt;/a&gt; is personal and small-business financial accounting software, freely licensed under the &lt;a class="KKhlwxghBFBrYSFmhqstHWReEjIKucTNiY " style="box-sizing: inherit; margin: 0px; padding: 0px; vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); text-decoration: #0a66c2; font-weight: 600; border: 0px #0a66c2; color: #0a66c2; touch-action: manipulation; overflow-wrap: break-word;" tabindex="0" href="https://www.gnu.org/" target="_self" data-test-app-aware-link=""&gt;GNU&lt;/a&gt; GPL and available for GNU/Linux, BSD, Solaris, Mac OS X, and Microsoft Windows.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
  <author>George Wanjohi</author>
  <category>accounting</category>
  <guid isPermaLink="false">https://www.georgewanjohi.com/blog/accounting/</guid>
  <pubDate>Sun, 13 Sep 2026 06:58:59 GMT</pubDate>
</item>
<item>
  <title>Strings Revisited</title>
  <link>https://www.georgewanjohi.com/blog/strings/</link>
  <description>&lt;p&gt;&lt;em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px;"&gt;&lt;img src="https://media.licdn.com/dms/image/v2/D4D12AQEmUuw2vWayew/article-cover_image-shrink_720_1280/article-cover_image-shrink_720_1280/0/1669388634269?e=1790812800&amp;amp;v=beta&amp;amp;t=YtFqMq4_FOt8cJT0gisVApiZr87iVmv5cAaUHcFzV3w" alt="Photo by Alina Grubnyak on Unsplash - see link at the end" /&gt;&lt;br /&gt;&lt;br /&gt;&amp;ldquo;Ten, nine, Ignition Sequence Start, six, five, four, three, two, one, zero. We have a light off! Lift off&amp;hellip;&amp;rdquo;&lt;/em&gt;,&lt;/p&gt;
&lt;p id="ember54" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;Strings (of Text) are everywhere. Used widely in writing. To tell stories, share ideas, and much more. In programming, a text string, also known as a string or simply as text, is &lt;span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px; font-weight: 600;"&gt;a group of characters that are used as data. &lt;/span&gt;&lt;/p&gt;
&lt;p id="ember55" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;History Scholars generally agree that the earliest form of writing appeared &lt;span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px; font-weight: 600;"&gt;almost 5,500 years ago&lt;/span&gt;in Mesopotamia (present-day Iraq). Strings have been with us for the better part of our recent history&amp;mdash;think of it as it pertains to the build-up in the ubiquity of computer hardware and software today.&lt;/p&gt;
&lt;p id="ember56" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;Textual Data is used in many places. Consider &lt;span class="tvm-operation__underline" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px; text-decoration: underline;"&gt;secure communication over the web&lt;/span&gt;using SSL Certificates.&lt;/p&gt;
&lt;p id="ember57" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;&lt;span class="tvm-operation__underline" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px; text-decoration: underline;"&gt;For a browser on the web, the process looks like this:&lt;/span&gt;&lt;/p&gt;
&lt;p id="ember58" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px 0px 0px 32px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; color: rgba(0, 0, 0, 0.9); line-height: 1.5;"&gt;
&lt;li style="box-sizing: inherit; margin: 0px 0px 8px; padding: 0px 0px 0px 8px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);"&gt;A browser attempts to connect to a website (i.e., a web server) secured with SSL.&lt;/li&gt;
&lt;li style="box-sizing: inherit; margin: 0px 0px 8px; padding: 0px 0px 0px 8px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);"&gt;The browser requests that the web server identifies itself.&lt;/li&gt;
&lt;li style="box-sizing: inherit; margin: 0px 0px 8px; padding: 0px 0px 0px 8px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);"&gt;The web server sends the browser or server a copy of its SSL certificate in the response.&lt;/li&gt;
&lt;li style="box-sizing: inherit; margin: 0px 0px 8px; padding: 0px 0px 0px 8px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);"&gt;The browser checks to see whether it trusts the SSL certificate. If it does, it signals this to the web server.&lt;/li&gt;
&lt;li style="box-sizing: inherit; margin: 0px 0px 8px; padding: 0px 0px 0px 8px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);"&gt;The web server then returns a digitally signed acknowledgment to start an SSL-encrypted session.&lt;/li&gt;
&lt;li style="box-sizing: inherit; margin: 0px 0px 8px; padding: 0px 0px 0px 8px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);"&gt;Encrypted data is shared between the browser and the web server.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id="ember59" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;Broadly, an SSL certificate would contain information like,&lt;/p&gt;
&lt;pre class="reader-text-block__code-block" style="box-sizing: inherit; margin: 0px -24px 32px; padding: 32px; border: 0px #ffffff; font-size: 16px; vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box #293138; font-family: 'SF Mono', Consolas, 'Roboto Mono', 'Noto Mono', 'Droid Mono', 'Fira Mono', 'Ubuntu Mono', 'Oxygen Mono', 'Lucida Console', Menlo, Monaco, monospace; border-radius: 8px; color: #ffffff; line-height: 1.5; white-space: pre-wrap; overflow-x: auto;"&gt;&lt;code style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px #ffffff; vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: #ffffff none 0px; font-family: 'SF Mono', Consolas, 'Roboto Mono', 'Noto Mono', 'Droid Mono', 'Fira Mono', 'Ubuntu Mono', 'Oxygen Mono', 'Lucida Console', Menlo, Monaco, monospace; line-height: 1.5;"&gt;issuer_name
  country= kenya
  Organization = acme
Validity
  Not Before = Fri, 25 Nov 2022 00:00:00 GMT
  ...
    ...&lt;/code&gt;&lt;/pre&gt;
&lt;p id="ember60" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;Strings are useful in interfaces where machines take input from humans or where machines need to communicate information to end users. Strings can present as emails, visual queues to information held in computers, navigation elements that project the meaning of underlying data. This data might be other forms of data such as numbers or even sounds, and other visual artifacts such as images and videos.&lt;/p&gt;
&lt;p id="ember61" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;In systems design, it is imperative that communication projected to the user of a program or other programs be concise and adhere to a set of pre-agreed-upon requirements. It is also important that the language of the problem domain be used to communicate meaning clearly.&lt;/p&gt;
&lt;p id="ember62" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;&amp;ldquo;Strings are very useful when communicating information from the program to the &lt;span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px; font-weight: 600;"&gt;user&lt;/span&gt;of the program. They are less useful when storing information for the computer to use&amp;rdquo;.&lt;/p&gt;
&lt;p id="ember63" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;Since all textual data is a sequence of characters, there's a need to define what makes texts different. Lightly put, there is a difference between an email address and a person's name&amp;mdash;both texts with distinct requirements.&lt;/p&gt;
&lt;p id="ember64" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;Remember when information is transmitted through various media, often, given factors such as entropy: meaning, and context might be lost. Imagine getting a bad reading in court.&lt;/p&gt;
&lt;p id="ember65" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;&lt;span class="tvm-operation__underline" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); outline: rgba(0, 0, 0, 0.9) none 0px; text-decoration: underline;"&gt;Some links:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id="ember66" class="ember-view reader-text-block__paragraph" style="box-sizing: inherit; margin: 0px 0px 32px; padding: 0px; border: 0px rgba(0, 0, 0, 0.9); font-size: 16px; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; line-height: 1.5; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial, sans-serif; pointer-events: all;"&gt;&lt;a class="KKhlwxghBFBrYSFmhqstHWReEjIKucTNiY " style="box-sizing: inherit; margin: 0px; padding: 0px; vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); text-decoration: #0a66c2; font-weight: 600; border: 0px #0a66c2; color: #0a66c2; touch-action: manipulation; overflow-wrap: break-word;" tabindex="0" href="https://en.wikipedia.org/wiki/String_(computer_science)" target="_self" data-test-app-aware-link=""&gt;Wikipedia&lt;/a&gt; P&lt;a class="KKhlwxghBFBrYSFmhqstHWReEjIKucTNiY " style="box-sizing: inherit; margin: 0px; padding: 0px; vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); text-decoration: #0a66c2; font-weight: 600; border: 0px #0a66c2; color: #0a66c2; touch-action: manipulation; overflow-wrap: break-word;" tabindex="0" href="https://www.w3schools.com/python/python_strings.asp" target="_self" data-test-app-aware-link=""&gt;ython&lt;/a&gt; &lt;a class="KKhlwxghBFBrYSFmhqstHWReEjIKucTNiY " style="box-sizing: inherit; margin: 0px; padding: 0px; vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); text-decoration: #0a66c2; font-weight: 600; border: 0px #0a66c2; color: #0a66c2; touch-action: manipulation; overflow-wrap: break-word;" tabindex="0" href="https://docs.microsoft.com/en-us/sql/t-sql/functions/string-functions-transact-sql?view=sql-server-ver16" target="_self" data-test-app-aware-link=""&gt;ms-sql&lt;/a&gt; &lt;a class="KKhlwxghBFBrYSFmhqstHWReEjIKucTNiY " style="box-sizing: inherit; margin: 0px; padding: 0px; vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); text-decoration: #0a66c2; font-weight: 600; border: 0px #0a66c2; color: #0a66c2; touch-action: manipulation; overflow-wrap: break-word;" tabindex="0" href="http://%20https//www.cs.utah.edu/~germain/PPS/Topics/strings.html" target="_self" data-test-app-aware-link=""&gt;matlab&lt;/a&gt; &lt;a class="KKhlwxghBFBrYSFmhqstHWReEjIKucTNiY " style="box-sizing: inherit; margin: 0px; padding: 0px; vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); text-decoration: #0a66c2; font-weight: 600; border: 0px #0a66c2; color: #0a66c2; touch-action: manipulation; overflow-wrap: break-word;" tabindex="0" href="https://docs.oracle.com/javase/7/docs/api/java/lang/String.html" target="_self" data-test-app-aware-link=""&gt;java&lt;/a&gt; &lt;a class="KKhlwxghBFBrYSFmhqstHWReEjIKucTNiY " style="box-sizing: inherit; margin: 0px; padding: 0px; vertical-align: baseline; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); text-decoration: #0a66c2; font-weight: 600; border: 0px #0a66c2; color: #0a66c2; touch-action: manipulation; overflow-wrap: break-word;" tabindex="0" href="https://www.w3schools.com/jsref/jsref_obj_string.asp" target="_self" data-test-app-aware-link=""&gt;javascript&lt;/a&gt;&lt;/p&gt;</description>
  <author>George Wanjohi</author>
  <category>programming</category>
  <guid isPermaLink="false">https://www.georgewanjohi.com/blog/strings/</guid>
  <pubDate>Sun, 13 Sep 2026 06:48:47 GMT</pubDate>
</item></channel>
</rss>