<?xml version="1.0" encoding="UTF-8"?>
<!--Generated by Site-Server v@build.version@ (http://www.squarespace.com) on Sun, 05 Apr 2026 23:17:13 GMT
--><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://www.rssboard.org/media-rss" version="2.0"><channel><title>Blogold - Roy Osherove</title><link>https://osherove.com/blog/</link><lastBuildDate>Thu, 23 Mar 2023 21:34:44 +0000</lastBuildDate><language>en-US</language><generator>Site-Server v@build.version@ (http://www.squarespace.com)</generator><description><![CDATA[]]></description><item><title>Video: Test Driven Smart Contracts with Solidity and Forge with Roy Osherove</title><dc:creator>Roy Osherove</dc:creator><pubDate>Thu, 23 Mar 2023 21:36:29 +0000</pubDate><link>https://osherove.com/blog/2023/3/23/video-test-driven-smart-contracts-with-solidity-and-forge-with-roy-osherove</link><guid isPermaLink="false">5c741968bfba3e13975e33a6:5c742adcc533ad4a9c5a801d:641cc5f441fa137d13a7c1cf</guid><description><![CDATA[<p class="">I did a talk about Test Driven Solidity Smart contracts at the <a href="https://israelweb3.com">Israel web3 developers underground</a> last week. Here’s how it went. Hope you enjoy it!</p>]]></description></item><item><title>Some opinions about effective software development after 20+ years</title><dc:creator>Roy Osherove</dc:creator><pubDate>Sun, 24 Jan 2021 09:24:55 +0000</pubDate><link>https://osherove.com/blog/2021/1/24/some-opinions-about-effective-software-development-after-20-years</link><guid isPermaLink="false">5c741968bfba3e13975e33a6:5c742adcc533ad4a9c5a801d:600d3b83cf90a952734e5ce9</guid><description><![CDATA[<p class="">This <a href="https://news.ycombinator.com/item?id=25887373">post on hackernews </a>made me write this:</p><ul data-rte-list="default"><li><p class="">Being able to communicate ideas &gt; Being a great technical developer - </p></li><li><p class="">For every great developer that's an asshole, you can find a great developer that won't be an asshole. Don't keep assholes. Google the "<a href="https://en.wikipedia.org/wiki/The_No_Asshole_Rule">no asshole rule</a>". - </p></li><li><p class="">Making the team feel safe to discuss stuff they don't know freely and ask questions that might seem stupid in other teams makes for a great team that's not afraid to challenge assumptions and break through with new skills. - </p></li><li><p class="">TDD is a skill just like refactoring. Learn when it makes sense. </p></li><li><p class="">80% of architects in enterprise don't have the skills needed from them. including the things stated above.  </p></li><li><p class="">Learning the <a href="https://en.wikipedia.org/wiki/Theory_of_constraints">Theory of Constraints</a> and applying it to find bottlenecks in the process, pipelines and structures of your teams/projects is one of the most useful things you can apply to become more productive. - </p></li><li><p class="">Learning <a href="https://www.youtube.com/watch?v=goihWvyqRow">what to measure and what not to measure</a>, lagging vs leading indicators can help you communicate to management about what changes truly need to happen to make your team work more effectively. - </p></li><li><p class="">Whiteboards (and remotely, <a href="https://miro.com">miro</a> boards) are very effective and can be used for easily 50% of meetings. But aren't.<br></p></li></ul>]]></description></item><item><title>SOLVED: Getting Skype for Business to Work on Mac with Virtual Camera</title><dc:creator>Roy Osherove</dc:creator><pubDate>Wed, 09 Dec 2020 09:47:30 +0000</pubDate><link>https://osherove.com/blog/2020/12/9/solved-getting-skype-for-business-to-work-on-mac-with-virtual-camera</link><guid isPermaLink="false">5c741968bfba3e13975e33a6:5c742adcc533ad4a9c5a801d:5fd09a8f3bcf75077a862597</guid><description><![CDATA[<p class="">Skype for business…  it used to be “acceptable”. These days it’s the notepad of the conferencing world. Skype has recently broken compatibility with Virtual cameras with the new versions of MAC OS, so here’s the trick (based on <a href="https://answers.microsoft.com/en-us/msoffice/forum/all/skype-for-business-no-longer-recognizes-virtual/67553f89-db9c-4935-aa9c-c09a775ddf15" target="_blank">this forum reply</a>):</p><h2>;TLDR:</h2><pre><code>sudo codesign --remove-signature /Applications/Skype\ for\ Business.app/</code></pre><h2>The Long Version:</h2><p class="">On Mac OS X
1. Close Skype App
2. Open Terminal
(if you don't have XCode Installed, do items 3 and 4)</p><p class="">3. run </p><pre><code>Xcode-select --install </code></pre><p class="">4. install and update Xcode </p><p class=""><strong>Most important part:  </strong></p><p class="">5. run </p><pre><code>sudo codesign --remove-signature /Applications/Skype\ for\ Business.app/</code></pre><h2>When Done:</h2><ul data-rte-list="default"><li><p class="">  ou will lose your Skype settings. </p></li><li><p class="">when Skype is started the first time you need to enter your admin password and hit "always permit". </p></li><li><p class="">After that you are able to access your virtual cameras again.  </p></li></ul><p data-rte-preserve-empty="true" class=""></p><p data-rte-preserve-empty="true" class=""></p><p data-rte-preserve-empty="true" class=""></p>]]></description></item><item><title>Solved - Pihole FTL DB is huge taking too much disk space</title><dc:creator>Roy Osherove</dc:creator><pubDate>Wed, 18 Nov 2020 16:05:28 +0000</pubDate><link>https://osherove.com/blog/2020/11/18/solved-pihole-ftl-db-is-huge-taking-too-much-disk-space</link><guid isPermaLink="false">5c741968bfba3e13975e33a6:5c742adcc533ad4a9c5a801d:5fb545b83ebc0f67d621b0b8</guid><description><![CDATA[<p class="">If, like me, you’ve also run out of room on your pi-hole running on a raspberry pi, here’s how you can clean up the database (note: all of the logged data will disappear forever!)</p>
























  
    <pre class="source-code">cd /etc/pihole
sudo service pihole-FTL stop
sudo mv pihole-FTL.db pihole-FTL.db.old
sudo service pihole-FTL start</pre>]]></description></item><item><title>SOLVED - High CPU and Lagging when Screen Sharing in Zoom 2020 Multiple Screens</title><dc:creator>Roy Osherove</dc:creator><pubDate>Tue, 18 Aug 2020 13:04:35 +0000</pubDate><link>https://osherove.com/blog/2020/8/18/solved-high-cpu-and-lagging-when-screen-sharing-in-zoom-2020-multiple-screens</link><guid isPermaLink="false">5c741968bfba3e13975e33a6:5c742adcc533ad4a9c5a801d:5f3bd0f3c4957d773cf19ef0</guid><description><![CDATA[<p class="">(on a mac)</p><p class="">I’m sharing here what I’ve learned the hard way. This has now helped me when teaching <a href="https://osherove.com/trainingoptions">half day remote classes</a> about TDD:</p><ol data-rte-list="default"><li><p class="">Go into zoom settings</p></li><li><p class="">Under “Screen Share” -&gt; Advanced -&gt; Screen Capture Mode</p></li><li><p class="">Set Screen Capture Mode to “Previous Operating Systems”</p></li></ol>


































































  

    
  
    

      

      
        <figure class="
              sqs-block-image-figure
              intrinsic
            "
        >
          
        
        

        
          
            
          
            
                
                
                
                
                
                
                
                <img data-stretch="false" data-image="https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1604585960699-73YJO4S3Z22FUD6F5SMP/Zoom+settings+on+mac+High+CPU+Usage" data-image-dimensions="681x432" data-image-focal-point="0.5,0.5" alt="" data-load="false" elementtiming="system-image-block" src="https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1604585960699-73YJO4S3Z22FUD6F5SMP/Zoom+settings+on+mac+High+CPU+Usage?format=1000w" width="681" height="432" sizes="(max-width: 640px) 100vw, (max-width: 767px) 100vw, 100vw" onload="this.classList.add(&quot;loaded&quot;)" srcset="https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1604585960699-73YJO4S3Z22FUD6F5SMP/Zoom+settings+on+mac+High+CPU+Usage?format=100w 100w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1604585960699-73YJO4S3Z22FUD6F5SMP/Zoom+settings+on+mac+High+CPU+Usage?format=300w 300w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1604585960699-73YJO4S3Z22FUD6F5SMP/Zoom+settings+on+mac+High+CPU+Usage?format=500w 500w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1604585960699-73YJO4S3Z22FUD6F5SMP/Zoom+settings+on+mac+High+CPU+Usage?format=750w 750w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1604585960699-73YJO4S3Z22FUD6F5SMP/Zoom+settings+on+mac+High+CPU+Usage?format=1000w 1000w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1604585960699-73YJO4S3Z22FUD6F5SMP/Zoom+settings+on+mac+High+CPU+Usage?format=1500w 1500w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1604585960699-73YJO4S3Z22FUD6F5SMP/Zoom+settings+on+mac+High+CPU+Usage?format=2500w 2500w" loading="lazy" decoding="async" data-loader="sqs">

            
          
        
          
        

        
      
        </figure>
      

    
  


  





  <p class="">Also: You might also want to set “Limit your screen share to 8 frames per second” but it has worked well for me without it. even when live-coding, both sharing a screen and an individual app. </p>]]></description></item><item><title>COVID19: All current online unit testing and TDD training content is free until further notice</title><dc:creator>Roy Osherove</dc:creator><pubDate>Thu, 19 Mar 2020 16:33:24 +0000</pubDate><link>https://osherove.com/blog/2020/3/19/covid19-free-unit-testing-training</link><guid isPermaLink="false">5c741968bfba3e13975e33a6:5c742adcc533ad4a9c5a801d:5e736fd7058364209f9b23b6</guid><description><![CDATA[<iframe allowfullscreen src="https://embed.restream.io/player/index.html?token=df9f03a833eb31258c522ef33c9ba92c" width="460" frameborder="0" height="280"></iframe>


  




  <p class="">OK. We’re all stuck at home (or will be soon).  COVID19 is wreaking havoc on our economy and our way of living. It’s pretty intense, but it’s also a time, for those of us who can do it, to grow and learn new skills, get out of our comfort zone and use our time indoors to try to be at least somewhat productive.</p><p class="">Here’s my part in helping people stay indoors: until further notice, all my existing online courses are free for everyone who’s interested. <a href="https://go.osherove.com/covid19">Simply go to the COVID19 ALL-IN bundle and sign up</a>. </p><p class="">You’ll get streaming and download access to all the content. </p><p class="">Some of the content there:</p><ul data-rte-list="default"><li><p class="">TDD in Java, C# and Ruby based on <a href="https://artofunittesting.com">Art of Unit Testing</a></p></li><li><p class="">Legacy Code Refactoring for Unit Testing (C#)</p></li><li><p class="">Pairing Videos on TDD (C#)</p></li><li><p class="">More..!</p></li></ul><p class="">I’ll disable this probably in a month or two, we’ll see. But take your time. Once you get the bundle, the content will be yours FOREVER. even after I have disabled purchasing it for free. so don’t worry about going slow. </p><p class=""><em>Also, consider signing up for </em><a href="https://twitch.tv/royosherove" target="_blank"><em>my daily corona dev stream</em></a><em> where I work on the upcoming next version of my book, art of unit testing 3rd edition, live:</em></p><p class="">Have fun, stay safe, stay indoors, and spread knowledge, not the virus. </p>]]></description></item><item><title>Unit Testing Entry and Exit Points</title><dc:creator>Roy Osherove</dc:creator><pubDate>Thu, 12 Mar 2020 14:19:12 +0000</pubDate><link>https://osherove.com/blog/2020/3/12/unit-testing-entry-points-and-exit-points</link><guid isPermaLink="false">5c741968bfba3e13975e33a6:5c742adcc533ad4a9c5a801d:5e6a44e6b7468178c1f34fd5</guid><description><![CDATA[<p class="">Let’s talk about the word “unit” in unit testing. &nbsp;To me, a <em>unit</em> stands for “unit of work” or a “use case” inside the system. A unit of work has a beginning and an end. I call these <em>entry points</em> and <em>exit points</em>. A simple example of a unit of work, as we’ll soon see, is a function that calculates something and returns a value. But that function could also use other functions , other modules and other components in the calculation process, which means the unit of work (from entry point to exit point), now spans more than just a function.</p><p class="">Yes that also means you can apply the term ‘unit of work’ to higher level abstractions, as well as use these terms when discussing integration, API and end-to-end tests. We’re focusing on the unit testing side.</p><h1><strong>Definition : Unit of Work</strong></h1><p class="">A <em>unit of work</em> is the sum of actions that take place between the invocation of an <em>entry point</em> up until a noticeable end result through one or more <em>exit points</em>. The <em>entry point</em> is the thing we trigger. Given a publicly visible function, for example:</p><p class="">The function’s body is all or part of the unit of work.</p><p class="">The function’s declaration and signature are the entry point into the body.</p><p class="">The resulting outputs or behaviors of the function are its exit points. &nbsp;</p><h2><strong><em>Entry Points &amp; Exit Points</em></strong></h2><p class="">A unit of work always has an entry point and one or more exit points.</p><p class="">It might be useful to give a quick real-world example, or use case, of what you mean by a unit of work. It seems to me the term could span several different components, and it might be helpful to ground it in a real-world concept.</p>


































































  

    
  
    

      

      
        <figure class="
              sqs-block-image-figure
              intrinsic
            "
        >
          
        
        

        
          
            
          
            
                
                
                
                
                
                
                
                <img data-stretch="false" data-image="https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584024316660-E1Q33N66A7L0LT14FDXF/unit-of-work1.png" data-image-dimensions="237x245" data-image-focal-point="0.5,0.5" alt="" data-load="false" elementtiming="system-image-block" src="https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584024316660-E1Q33N66A7L0LT14FDXF/unit-of-work1.png?format=1000w" width="237" height="245" sizes="(max-width: 640px) 100vw, (max-width: 767px) 100vw, 100vw" onload="this.classList.add(&quot;loaded&quot;)" srcset="https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584024316660-E1Q33N66A7L0LT14FDXF/unit-of-work1.png?format=100w 100w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584024316660-E1Q33N66A7L0LT14FDXF/unit-of-work1.png?format=300w 300w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584024316660-E1Q33N66A7L0LT14FDXF/unit-of-work1.png?format=500w 500w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584024316660-E1Q33N66A7L0LT14FDXF/unit-of-work1.png?format=750w 750w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584024316660-E1Q33N66A7L0LT14FDXF/unit-of-work1.png?format=1000w 1000w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584024316660-E1Q33N66A7L0LT14FDXF/unit-of-work1.png?format=1500w 1500w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584024316660-E1Q33N66A7L0LT14FDXF/unit-of-work1.png?format=2500w 2500w" loading="lazy" decoding="async" data-loader="sqs">

            
          
        
          
        

        
      
        </figure>
      

    
  


  





  <p class="">A <em>unit of work</em> can be a single function, multiple functions, multiple functions or even multiple modules or components. But it always has an entry point which we can trigger from the outside (via tests or other production code), and it always ends up doing something useful. If it doesn’t do anything useful, we might as well remove it from our codebase.</p><p class="">&nbsp;</p><p class="">What’s useful? Something publicly noticeable happens in the code: A return value, state change or calling an external party. Those noticeable behaviors are what I call exit points. Listing 1.1 will show a simple version of a unit of work.</p>


































































  

    
  
    

      

      
        <figure class="
              sqs-block-image-figure
              intrinsic
            "
        >
          
        
        

        
          
            
          
            
                
                
                
                
                
                
                
                <img data-stretch="false" data-image="https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584024475550-0IYACPPM4IT7WVQUKPMS/unit-of-work2.png" data-image-dimensions="258x288" data-image-focal-point="0.5,0.5" alt="" data-load="false" elementtiming="system-image-block" src="https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584024475550-0IYACPPM4IT7WVQUKPMS/unit-of-work2.png?format=1000w" width="258" height="288" sizes="(max-width: 640px) 100vw, (max-width: 767px) 100vw, 100vw" onload="this.classList.add(&quot;loaded&quot;)" srcset="https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584024475550-0IYACPPM4IT7WVQUKPMS/unit-of-work2.png?format=100w 100w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584024475550-0IYACPPM4IT7WVQUKPMS/unit-of-work2.png?format=300w 300w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584024475550-0IYACPPM4IT7WVQUKPMS/unit-of-work2.png?format=500w 500w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584024475550-0IYACPPM4IT7WVQUKPMS/unit-of-work2.png?format=750w 750w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584024475550-0IYACPPM4IT7WVQUKPMS/unit-of-work2.png?format=1000w 1000w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584024475550-0IYACPPM4IT7WVQUKPMS/unit-of-work2.png?format=1500w 1500w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584024475550-0IYACPPM4IT7WVQUKPMS/unit-of-work2.png?format=2500w 2500w" loading="lazy" decoding="async" data-loader="sqs">

            
          
        
          
        

        
      
        </figure>
      

    
  


  





  <p class=""><br><br></p><h2><strong>Why “exit point”?</strong></h2><p class="">Why “exit point” and not something like “behavior”?. My thinking is that behaviors can also be purely internal. We’re looking for externally visible behaviors from the caller. That distinction might be difficult to differentiate during “live action” coding. Also, “exit point” has the nice connotation to it that suggests we are leaving the context of a unit of work and going back to the test context. Behaviors might be a bit more fluid than that. That said, I’m not sure. Perhaps this will change in the 4th edition of <a href="https://artofunittesting.com">my art of unit testing book…</a></p><p class="">Here’s a quick code example of a simple unit of work.</p>
























  
    <pre class="source-code"><span class="cm-keyword">const</span> <span class="cm-def">sum</span> <span class="cm-operator">=</span> (<span class="cm-def">numbers</span>) <span class="cm-operator">=&gt;</span> {
    <span class="cm-keyword">const</span> [<span class="cm-def">a</span>, <span class="cm-def">b</span>] <span class="cm-operator">=</span> <span class="cm-variable-2">numbers</span>.<span class="cm-property">split</span>(<span class="cm-string">','</span>);&nbsp; 
    <span class="cm-keyword">const</span> <span class="cm-def">result</span> <span class="cm-operator">=</span> <span class="cm-variable">Number</span>.<span class="cm-property">parseInt</span>(<span class="cm-variable-2">a</span>, <span class="cm-number">10</span>) <span class="cm-operator">+</span>&nbsp;<span class="cm-variable">Number</span>.<span class="cm-property">parseInt</span>(<span class="cm-variable-2">b</span>, <span class="cm-number">10</span>);&nbsp; 
    <span class="cm-keyword">return</span> <span class="cm-variable-2">result</span>;
};</pre>
  




  <p class="">This unit of work is completely encompassed in a single function. The function is both the entry point, and because its end result returns a value, it also acts as the exit point. We get the end result in the same place we trigger the unit of work, so we can describe it such that the entry point is also the exit point.<br>If we drew this function as a unit of work, it would look something like this:<br></p>


































































  

    
  
    

      

      
        <figure class="
              sqs-block-image-figure
              intrinsic
            "
        >
          
        
        

        
          
            
          
            
                
                
                
                
                
                
                
                <img data-stretch="false" data-image="https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584024830807-RA1NJMACE7AJOQTVGNJ8/unit-of-work1.1.png" data-image-dimensions="192x217" data-image-focal-point="0.5,0.5" alt="" data-load="false" elementtiming="system-image-block" src="https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584024830807-RA1NJMACE7AJOQTVGNJ8/unit-of-work1.1.png?format=1000w" width="192" height="217" sizes="(max-width: 640px) 100vw, (max-width: 767px) 100vw, 100vw" onload="this.classList.add(&quot;loaded&quot;)" srcset="https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584024830807-RA1NJMACE7AJOQTVGNJ8/unit-of-work1.1.png?format=100w 100w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584024830807-RA1NJMACE7AJOQTVGNJ8/unit-of-work1.1.png?format=300w 300w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584024830807-RA1NJMACE7AJOQTVGNJ8/unit-of-work1.1.png?format=500w 500w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584024830807-RA1NJMACE7AJOQTVGNJ8/unit-of-work1.1.png?format=750w 750w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584024830807-RA1NJMACE7AJOQTVGNJ8/unit-of-work1.1.png?format=1000w 1000w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584024830807-RA1NJMACE7AJOQTVGNJ8/unit-of-work1.1.png?format=1500w 1500w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584024830807-RA1NJMACE7AJOQTVGNJ8/unit-of-work1.1.png?format=2500w 2500w" loading="lazy" decoding="async" data-loader="sqs">

            
          
        
          
        

        
      
        </figure>
      

    
  


  





  <p class="">I used “sum(numbers)” as the entry point and not “numbers” because the entry point is the function signature. The parameters are the context or input given through the entry point.&nbsp;</p><p class="">Here’s a variation of this idea:</p><p class=""><strong>A Unit of work has entry points and exit points:</strong></p>
























  
    <pre class="source-code"><span class="cm-keyword">let</span> <span class="cm-def">total</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>;
<span class="cm-keyword">const</span> <span class="cm-def">totalSoFar</span> <span class="cm-operator">=</span> () <span class="cm-operator">=&gt;</span> {
&nbsp; <span class="cm-keyword">return</span> <span class="cm-variable">total</span>;
};

<span class="cm-keyword">const</span> <span class="cm-def">sum</span> <span class="cm-operator">=</span> (<span class="cm-def">numbers</span>) <span class="cm-operator">=&gt;</span> {
&nbsp; <span class="cm-keyword">const</span> [<span class="cm-def">a</span>, <span class="cm-def">b</span>] <span class="cm-operator">=</span> <span class="cm-variable-2">numbers</span>.<span class="cm-property">split</span>(<span class="cm-string">','</span>);
&nbsp; <span class="cm-keyword">const</span> <span class="cm-def">result</span> <span class="cm-operator">=</span> <span class="cm-variable">Number</span>.<span class="cm-property">parseInt</span>(<span class="cm-variable-2">a</span>, <span class="cm-number">10</span>) <span class="cm-operator">+</span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="cm-variable">Number</span>.<span class="cm-property">parseInt</span>(<span class="cm-variable-2">b</span>, <span class="cm-number">10</span>);
&nbsp; <span class="cm-variable">total</span> <span class="cm-operator">+=</span> <span class="cm-variable-2">result</span>;
&nbsp; <span class="cm-keyword">return</span> <span class="cm-variable-2">result</span>;
};

<span class="cm-variable">module</span>.<span class="cm-property">exports</span> <span class="cm-operator">=</span> {
&nbsp; <span class="cm-property">sum</span>,
&nbsp; <span class="cm-property">totalSoFar</span>
};</pre>
  




  <p class=""><strong>﻿</strong>This new version of sum has <em>two</em> exit points. It does two things:</p><p class="">1.&nbsp;&nbsp;&nbsp;&nbsp; It returns a value</p><p class="">2.&nbsp;&nbsp;&nbsp;&nbsp; it has new functionality: it has a running total of all the sums. It sets the state of the module in a way that is noticeable (via totalSoFar() ) from the caller of the entry point.<br></p>


































































  

    
  
    

      

      
        <figure class="
              sqs-block-image-figure
              intrinsic
            "
        >
          
        
        

        
          
            
          
            
                
                
                
                
                
                
                
                <img data-stretch="false" data-image="https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584025001187-4QAS88TFG2R4W2BUFN1R/unit-of-work1.2.png" data-image-dimensions="222x268" data-image-focal-point="0.5,0.5" alt="" data-load="false" elementtiming="system-image-block" src="https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584025001187-4QAS88TFG2R4W2BUFN1R/unit-of-work1.2.png?format=1000w" width="222" height="268" sizes="(max-width: 640px) 100vw, (max-width: 767px) 100vw, 100vw" onload="this.classList.add(&quot;loaded&quot;)" srcset="https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584025001187-4QAS88TFG2R4W2BUFN1R/unit-of-work1.2.png?format=100w 100w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584025001187-4QAS88TFG2R4W2BUFN1R/unit-of-work1.2.png?format=300w 300w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584025001187-4QAS88TFG2R4W2BUFN1R/unit-of-work1.2.png?format=500w 500w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584025001187-4QAS88TFG2R4W2BUFN1R/unit-of-work1.2.png?format=750w 750w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584025001187-4QAS88TFG2R4W2BUFN1R/unit-of-work1.2.png?format=1000w 1000w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584025001187-4QAS88TFG2R4W2BUFN1R/unit-of-work1.2.png?format=1500w 1500w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584025001187-4QAS88TFG2R4W2BUFN1R/unit-of-work1.2.png?format=2500w 2500w" loading="lazy" decoding="async" data-loader="sqs">

            
          
        
          
        

        
      
        </figure>
      

    
  


  





  <p class="">You can think of these two exit points as two different <em>paths</em>, or <em>requirements</em> from the same unit of work, because they indeed <em>are </em>two different <em>useful </em>things the code is expected to do.</p><p class="">It also means I’d be very likely to write two different unit tests here: one for each exit point. Very soon we’ll do exactly that.</p><p class="">What about totalSoFar()? Is this also an entry point? Yes, it could be. IN a separate test. I could write a test that proves that calling totalSoFar() without triggering prior to that call returns 0. Which would make it its own little unit of work. And would be perfectly fine. Often one unit of work (sum()) can be made of smaller units. This is where we can start to see how the scope of our tests can change and mutate, but we can still define it with entry points and exit points.</p><p class="">Entry points are always where the test triggers the unit of work. You can have multiple entry points into a unit of work, each used by a different set of tests.</p><h2><strong>A side note on design</strong></h2><p class="">In terms of design, you can also think of it like this. There are two main types of actions: “Query” actions, and “Command” functions. Query actions don’t change stuff, they just return values. Command actions change stuff but don’t return values.</p><p class="">We often combine the two but there are many cases where separating them might be a better design choice. This post isn’t primarily about design, but I urge you to read more about the concept of command-query separation over at Martin Fowler’s website: <a href="https://martinfowler.com/bliki/CommandQuerySeparation.html">https://martinfowler.com/bliki/CommandQuerySeparation.html</a> &nbsp;</p><p class=""><strong>Exit points often signify requirements and new tests, and vice versa</strong></p><p class="">Exit points are end results of a unit of work. &nbsp;For Unit Tests, I usually write at least one separate test, with its own readable name, for each exit point. I could then add more tests with variations on inputs, all using the same entry point, to gain more confidence.</p><p class="">Integration tests, on the other hand, will usually include multiple end results since it could be impossible to separate code paths at those levels. That’s also one of the reasons integration tests are harder to debug, get up and running, and maintain: they do much more than unit tests, as we’ll soon see.</p><h2><strong>Back to the code:</strong></h2><p class="">Here’s a third version of this function :</p>
























  
    <pre class="source-code"><span class="cm-keyword">const</span> <span class="cm-def">winston</span> <span class="cm-operator">=</span> <span class="cm-variable">require</span>(<span class="cm-string">'winston'</span>);
<span class="cm-keyword">let</span> <span class="cm-def">total</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>;

<span class="cm-keyword">const</span> <span class="cm-def">totalSoFar</span> <span class="cm-operator">=</span> () <span class="cm-operator">=&gt;</span> {
&nbsp; <span class="cm-keyword">return</span> <span class="cm-variable">total</span>;
};

&nbsp;
<span class="cm-keyword">const</span> <span class="cm-def">makeLogger</span> <span class="cm-operator">=</span> () <span class="cm-operator">=&gt;</span> {
&nbsp; <span class="cm-keyword">return</span> <span class="cm-variable">winston</span>
&nbsp;&nbsp;&nbsp; .<span class="cm-property">createLogger</span>({
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="cm-property">level</span>: <span class="cm-string">'info'</span>,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="cm-property">transports</span>: <span class="cm-keyword">new</span> <span class="cm-variable">winston</span>.<span class="cm-property">transports</span>.<span class="cm-property">Console</span>()
&nbsp;&nbsp;&nbsp; });
};

<span class="cm-keyword">const</span> <span class="cm-def">logger</span> <span class="cm-operator">=</span> <span class="cm-variable">makeLogger</span>();
<span class="cm-keyword">const</span> <span class="cm-def">sum</span> <span class="cm-operator">=</span> (<span class="cm-def">numbers</span>) <span class="cm-operator">=&gt;</span> {
&nbsp; <span class="cm-keyword">const</span> [<span class="cm-def">a</span>, <span class="cm-def">b</span>] <span class="cm-operator">=</span> <span class="cm-variable-2">numbers</span>.<span class="cm-property">split</span>(<span class="cm-string">','</span>);
&nbsp;&nbsp;<span class="cm-variable">logger</span>.<span class="cm-property">info</span>(
&nbsp;&nbsp;&nbsp; <span class="cm-string">'this is a very important log output'</span>,
&nbsp;&nbsp;&nbsp; { <span class="cm-property">firstNumWas</span>: <span class="cm-variable-2">a</span>, <span class="cm-property">secondNumWas</span>: <span class="cm-variable-2">b</span> });
&nbsp; <span class="cm-keyword">const</span> <span class="cm-def">result</span> <span class="cm-operator">=</span> <span class="cm-variable">Number</span>.<span class="cm-property">parseInt</span>(<span class="cm-variable-2">a</span>, <span class="cm-number">10</span>) <span class="cm-operator">+</span> <span class="cm-variable">Number</span>.<span class="cm-property">parseInt</span>(<span class="cm-variable-2">b</span>, <span class="cm-number">10</span>);
&nbsp; <span class="cm-variable">total</span> <span class="cm-operator">+=</span> <span class="cm-variable-2">result</span>;
&nbsp; <span class="cm-keyword">return</span> <span class="cm-variable-2">result</span>;
};

<span class="cm-variable">module</span>.<span class="cm-property">exports</span> <span class="cm-operator">=</span> {
&nbsp; <span class="cm-property">totalSoFar</span>,
&nbsp; <span class="cm-property">sum</span>
};</pre>
  




  <p class="">&nbsp;<strong>﻿</strong>You can see there’s a new <em>exit point/requirement/end result</em> in the function. It logs something to an external entity. It could be a file, or the console, or a database. We don’t know, and we don’t care.</p><p class="">This is the third type of an exit point: <em>calling a third party</em>. I also like to call it “calling a <em>dependency</em>”.</p><h2><strong>A Dependency (3rd party)</strong></h2><p class="">A dependency is something we don’t have full control over during a unit test. Or something that, to try to control in a test, would make our lives miserable to get up and running, maintain, keep the test consistent, or running fast. Some examples would include: loggers that write to files, things that talk to the network, code controlled by other teams that we cannot change, components that due to the way they function take a very long time (calculations, threads, database access) and more. &nbsp;The rule of thumb is: “If I can fully and easily control what its doing, and it runs in memory, and its fast, it’s not a dependency”. There are always exceptions to the rule, but this should get you through 80% of the cases at least.</p><p class=""><br>Here's how I’d draw it with all three exit points, and two entry points together:<br></p>


































































  

    
  
    

      

      
        <figure class="
              sqs-block-image-figure
              intrinsic
            "
        >
          
        
        

        
          
            
          
            
                
                
                
                
                
                
                
                <img data-stretch="false" data-image="https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584025340155-CLTB8476HDR0GSUTPCXX/unit-of-work3.png" data-image-dimensions="270x279" data-image-focal-point="0.5,0.5" alt="" data-load="false" elementtiming="system-image-block" src="https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584025340155-CLTB8476HDR0GSUTPCXX/unit-of-work3.png?format=1000w" width="270" height="279" sizes="(max-width: 640px) 100vw, (max-width: 767px) 100vw, 100vw" onload="this.classList.add(&quot;loaded&quot;)" srcset="https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584025340155-CLTB8476HDR0GSUTPCXX/unit-of-work3.png?format=100w 100w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584025340155-CLTB8476HDR0GSUTPCXX/unit-of-work3.png?format=300w 300w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584025340155-CLTB8476HDR0GSUTPCXX/unit-of-work3.png?format=500w 500w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584025340155-CLTB8476HDR0GSUTPCXX/unit-of-work3.png?format=750w 750w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584025340155-CLTB8476HDR0GSUTPCXX/unit-of-work3.png?format=1000w 1000w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584025340155-CLTB8476HDR0GSUTPCXX/unit-of-work3.png?format=1500w 1500w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1584025340155-CLTB8476HDR0GSUTPCXX/unit-of-work3.png?format=2500w 2500w" loading="lazy" decoding="async" data-loader="sqs">

            
          
        
          
        

        
      
        </figure>
      

    
  


  





  <p class="">At this point we’re still just a function-sized unit of work. The entry point is the function call, but now we have three possible paths, or exit points, that do something useful that the caller can verify publicly.</p><h1>Test Per Exit Point</h1><p class="">Here’s where it gets interesting: It’s a good idea to have at least one <em>separate test per exit point</em>. (it might have more than a single assert, but only on the things related to exit point, that would be changing together. This will make the tests more readable, simpler and easier to debug or change without affecting other outcomes.</p><h2><strong><em>Exit Point Types</em></strong></h2><p class="">We’ve seen that we have three different types of end results:</p><h3>Value Based</h3><p class="">§&nbsp; The invoked function returns a useful value (not undefined). If this was in a more static language such as Java or C# we’d say it is a public, non void function.</p><h3>State Based</h3><p class="">§&nbsp; There’s a <em>noticeable</em> change to the state or behavior of the system before and after invocation that can be determined without interrogating private state. (In our case the wasCalled() function returns a different value after the state change.)</p><h3>3rd Party</h3><p class="">§&nbsp; There’s a callout to a third-party system over which the test has no control. That third-party system doesn’t return any value, or that value is ignored. (Example: calling a third-party logging system that was not written by you and you don’t control its source code.)</p><p class=""><strong>XUnit Test Patterns’ Definition of Entry &amp; Exit Points</strong></p><p class="">The book <a href="http://xunitpatterns.com/"><em>XUnit Test Patterns</em> </a>discusses the notion of <em>direct inputs and outputs, </em>&nbsp;and <em>indirect inputs and outputs</em>. <em>Direct inputs </em>&nbsp;are what I like to call entry points. That book called it “using the front door” of a component. Indirect outputs in that book can be thought of as the other two types of exit points I mentioned (state change and calling a third party). &nbsp;Both versions of these ideas have evolved in parallel, but the idea of “unit of work” only appears in this book. Unit of work , coupled with “entry” and “exit” points makes much more sense to me that using “direct and indirect inputs and outputs”. Consider this a stylistic choice on how to teach the concept of test scope. You can find more about xunit test patterns at xunitpatterns.com &nbsp;</p><p class="">Let’s see how the idea of entry and exit points affects the definition of a unit test.</p><h2><strong>UPDATED DEFINITION of a unit test: </strong></h2><p class="">A <em>unit test</em> is a piece of code that invokes a unit of work and <strong>checks one specific exit point </strong>as an end result of that unit of work. If the assumptions on the end result turn out to be wrong, the unit test has failed. A unit test’s <strong>scope can span as little as a function or as much as multiple modules or components depending on how many functions and modules are used between the entry point and the exit point.</strong>&nbsp;</p><h2><strong><em>1.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Different Exit Points, Different Techniques</em></strong></h2><p class="">Why am I spending so much time just talking about types of exit points? Because not only is it a great idea to separate the tests per exit point, but also each type of exit point might require a different technique to test successfully.</p><p class="">·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return-value based exit points (direct outputs per “xunit patterns”) of all the exit point types, should be the easiest to test. You trigger an entry point, you get something back, you check the value you get back.</p><p class="">·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; State based tests (indirect outputs) require a little more gymnastics usually. You call something, then you do <em>another call to</em> check <em>something else</em> (or call the previous thing again) to see if everything went according to plan.</p><p class="">In a third-party situation (indirect outputs) we have the most hoops to jump through. We haven’t discussed the idea yet, that’s where we’re forced to use things like <em>mock objects</em> in our tests so we can replace the external system with one we can control and interrogate in our tests. I’ll cover this idea deeply later in the book.</p><p class=""><strong>Which exit points make the most problems?</strong></p><p class="">As a rule of thumb, I try to keep most of my tests either return value based or state based tests. I try to avoid mock-object based tests if I can, and usually I can. As a result I usually have no more than perhaps 5% of my tests using mock objects for verification. Those types of tests complicate things and make maintainability more difficult. Sometimes there’s no escape though, and we’ll discuss them in future posts.&nbsp;</p>]]></description></item><item><title>Re-Thinking the Role of Mock Objects, Design &amp; Test Maintainability (stream of thought)</title><dc:creator>Roy Osherove</dc:creator><pubDate>Mon, 02 Mar 2020 16:38:48 +0000</pubDate><link>https://osherove.com/blog/2020/3/2/re-thinking-the-role-of-mock-objects-design-amp-test-maintainability-stream-of-thought</link><guid isPermaLink="false">5c741968bfba3e13975e33a6:5c742adcc533ad4a9c5a801d:5e5d2ea8e6f9d85598a2c23d</guid><description><![CDATA[<p class=""><strong>Disclaimer</strong>: this post assumes you understand mock objects deeply and have been using them for a long time and are familiar with the london-school of TDD.  </p><p class=""><strong>Disclaimer</strong>: written as a stream of though. So might be a bit incoherent. </p><p class="">It’s no secret that in my previous books on unit testing I’ve advocated for an approach to mock objects that is very different from that prescribed in the the “London School of TDD”. Namely, I usually prefer to use mock objects as little as possible, and to verify them only when the expected end result of a unit of work is calling a 3rd party dependency. </p><p class="">The reasons I usually state for this are:</p><ul data-rte-list="default"><li><p class="">since mock objects are testing internal interactions, they solidify our internal design so that it is harder to change later on. Internal interactions always result in either state changes, value results or calling a boundary in the system, so let’s use mock objects only on the boundaries. We can still create local wrapper interfaces for those boundaries, but they still represent a boundary dependency.</p></li><li><p class="">mock objects make tests longer and harder to read write and maintain</p></li><li><p class="">It’s easy to test something that has no value in real life by mistake (that my class calls a method on another class… ok. now what?)</p></li></ul><p data-rte-preserve-empty="true" class=""></p><p class="">This is almost the exact opposite from the recommendations in “Growing Object Oriented Software Guided by Tests” book and from the now famous paper (well, in our little nische anyway) “<a href="http://jmock.org/oopsla2004.pdf">Mock Roles not Objects</a>” (PDF).</p><blockquote><p class="">“…We believe the opposite, that Mock Objects are most useful when used to drive the design of the code under test. This implies that they are most useful within the system where the interfaces can be changed. Mocks and stubs can still be useful for testing interactions with third-party code, especially for avoiding test dependencies, but for us this is a secondary aspect to the technique.”</p></blockquote><p class="">As I’m working <a href="https://go.osherove.com/aout3">on the third edition</a> of art of unit testing these days, I’m revisiting and challenging my thinking. I did read the GOOS book many years ago and I’ve just re-read it with fresher eyes, but also with more experience of my own, and a few thoughts popped into my head. I’m not sure where they lead yet so I’ll just throw them here before I forget:</p><ol data-rte-list="default"><li><p class="">I always say that TDD requires three skills: good tests, test first and design. And I never focus on design. Mock objects (london school) are all about design of objects and dependencies. It could be that when we want to focus more on our design skill we would want to start using more of the london-school style mock objects? That thought scares me a bit because of the maintainability implications, but…</p></li><li><p class="">maintainability: If we’re using mocks in our tests to drive the design of roles in our objects, we could take several precautions to prevent test maintainability (maybe)</p><ol data-rte-list="default"><li><p class="">We can use the mock objects in a non strict manner and not verify on them (thish will just force us to think about the internal design). Things like the old NMock and JMock2 were made for that. Any framework with record-replay ability might fit that, but they are getting long in the tooth. AAA frameworks like fake it easy would not help us here because we only define the interactions as part of an assert. </p></li><li><p class="">We could write the test, assert on the interactions, and then delete the interaction asserts and leave only the mocks, but treated as stubs.  This relaxes our maintainability later on assuming we have non strict mocks</p></li><li><p class="">This could be a sign that our design sucks, so we’d need smaller, shorter interfaces in the system or more roles, or add a middle role for multiple dependencies. </p></li></ol></li><li><p class="">We could separate the task fo learning design from the other two skills (test-frist, good tests) by choosing when to use london-style mock objects, and use them only in particular cases</p></li><li><p class="">Boundaries: It’s true that people can mistakenly just fake external interfaces and use them as mocks in the test. I always advocate for creating an internal wrapper interface instead, that w can control. It could be that the way I explained this before could easily be understood as “fake 3rd parties directly”. And that would be unfortunate. I’ll fix that for my 3rd edition. Fake only things that are under your control, or that are not changing. A 3rd party logger can still change (if you change loggers!) </p></li></ol><p data-rte-preserve-empty="true" class=""></p><p class="">So what am I trying to say here?</p><ul data-rte-list="default"><li><p class="">There might be room for london style mocks in my book after all, but it might have taken me 10+ years to realize it, and I’m still not convinced fully. It could be one of the keys to learn about design, but at what cost?</p></li><li><p class="">My biggest fear is that the cost (tests that keep breaking) far outweighs the value we get from the design, and we’ve all seen long horrible tests with long complicated (also internal) dependency chains. The design skill and the skill of stopping and CHANGING the design when the tests go “OUCH” are not a given in many situations, especially enterprise. </p></li><li><p class="">Given the last point, is it worth it to let the london school test driven design idea go with the understanding that the world is mostly not ready for it yet, and will mostly just abuse it?</p></li><li><p class="">Or is it fair to throw it out there so that what I fear will be a select few will end up using it “correctly” but the rest of the world  types blindly on the keyboard to produce a franken-test? </p></li></ul><p class="">Here’s what the paper has to say about this:</p><blockquote><p class="">“When testing with Mock Objects it is important to find the right balance between an accurate specification of a unit's required behaviour and<strong> a flexible test that allows easy evolution of the code base</strong>. One of the risks with TDD is that tests become “brittle”, that is they fail when a programmer makes unrelated changes to the application code. <strong>They have been over-specified</strong> to check features that are an artefact of the implementation, not an expression of some requirement in the object. A test suite that contains a lot of brittle tests will slow down development and inhibit refactoring. </p><p class="">The solution is to re-examine the code and see if either the specification should be weakened, or the object structure is wrong and should be changed. Following Einstein, a specification should be as precise as possible, but not more precise.”</p></blockquote>


























  <p class="">Easier said than done?  this paper was written 16 years ago. I’d love to say “people are ready” but I’m not sure yet.</p><p class="">Mainly, I’m not sure whether Nat Pryce and Steve Freeman have new information to share about these ideas since then and if there are any new lessons learned. I’ll ping them and see if they can respond to this blog post. </p><p data-rte-preserve-empty="true" class=""></p>]]></description></item><item><title>Seeking Speakers about Branching Strategies, Feature Toggles, Pairing &amp; Other XP/CD Practices</title><dc:creator>Roy Osherove</dc:creator><pubDate>Sun, 19 Jan 2020 11:09:40 +0000</pubDate><link>https://osherove.com/blog/2020/1/19/seeking-speakers-about-branching-strategies-feature-toggles-pairing-amp-other-xpcd-practices</link><guid isPermaLink="false">5c741968bfba3e13975e33a6:5c742adcc533ad4a9c5a801d:5e24384adcc09322ead84c95</guid><description><![CDATA[<p class="">The new<a href="http://cxdxpisrael.com"> CD/XP israel meetup </a>that I’m running is seeking speakers for our meetups in the next few months about any of the following subjects:</p><ul data-rte-list="default"><li><p class="">Branching Strategies</p></li><li><p class="">Continuous Delivery Metrics</p></li><li><p class="">Engineering Practices &amp; Automation</p></li><li><p class="">Testing &amp; TDD *</p></li><li><p class="">Security Testing &amp; Pipeline Automation *</p></li><li><p class="">Developer Testing *</p></li><li><p class="">Infrastructure as Code *</p></li><li><p class="">Cross Team Collaboration *</p></li><li><p class="">Feature Teams *</p></li><li><p class="">QA/Dev/Sec Automation *</p></li><li><p class="">DevOps, DevSecOps, DevTestOps and others *</p></li><li><p class="">Feature Toggles &amp; Rollouts *</p></li><li><p class="">Pair Programming &amp; Other XP Practices *</p></li><li><p class="">Anything else you think might be interesting</p></li></ul><p class="">If you live in Israel are in the neighborhood at some point, please consider sharing your knowledge with the CD/XP agile community.</p><p class="">URL to Submit: <a href="http://submit.cdxpisrael.com/" target="_blank">http://submit.cdxpisrael.com</a></p>]]></description></item><item><title>An updated diagram of the TDD process from the upcoming 3rd Edition of Art of Unit Testing</title><dc:creator>Roy Osherove</dc:creator><pubDate>Tue, 12 Nov 2019 07:39:22 +0000</pubDate><link>https://osherove.com/blog/2019/11/12/an-updated-diagram-of-the-tdd-process-from-the-upcoming-3rd-edition-of-art-of-unit-testing</link><guid isPermaLink="false">5c741968bfba3e13975e33a6:5c742adcc533ad4a9c5a801d:5dca611cd875dd2590907c1d</guid><description><![CDATA[<p class="">As part of the work on Art of Unit Testing in JS, here’s a diagram I’ve created to explain Test Driven Development. Any feedback is welcome:</p><p data-rte-preserve-empty="true" class=""></p>


































































  

    
  
    

      

      
        <figure class="
              sqs-block-image-figure
              intrinsic
            "
        >
          
        
        

        
          
            
          
            
                
                
                
                
                
                
                
                <img data-stretch="false" data-image="https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1573544335545-AC5KIX73Y6CO3KI2UEFH/tdd-process.png" data-image-dimensions="892x700" data-image-focal-point="0.5,0.5" alt="" data-load="false" elementtiming="system-image-block" src="https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1573544335545-AC5KIX73Y6CO3KI2UEFH/tdd-process.png?format=1000w" width="892" height="700" sizes="(max-width: 640px) 100vw, (max-width: 767px) 100vw, 100vw" onload="this.classList.add(&quot;loaded&quot;)" srcset="https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1573544335545-AC5KIX73Y6CO3KI2UEFH/tdd-process.png?format=100w 100w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1573544335545-AC5KIX73Y6CO3KI2UEFH/tdd-process.png?format=300w 300w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1573544335545-AC5KIX73Y6CO3KI2UEFH/tdd-process.png?format=500w 500w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1573544335545-AC5KIX73Y6CO3KI2UEFH/tdd-process.png?format=750w 750w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1573544335545-AC5KIX73Y6CO3KI2UEFH/tdd-process.png?format=1000w 1000w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1573544335545-AC5KIX73Y6CO3KI2UEFH/tdd-process.png?format=1500w 1500w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1573544335545-AC5KIX73Y6CO3KI2UEFH/tdd-process.png?format=2500w 2500w" loading="lazy" decoding="async" data-loader="sqs">

            
          
        
          
        

        
      
        </figure>]]></description></item><item><title>Can you write for 5 minutes?</title><dc:creator>Roy Osherove</dc:creator><pubDate>Thu, 22 Aug 2019 14:23:48 +0000</pubDate><link>https://osherove.com/blog/2019/8/22/can-you-write-for-5-minutes</link><guid isPermaLink="false">5c741968bfba3e13975e33a6:5c742adcc533ad4a9c5a801d:5d5ea4f290dcaf000128721a</guid><description><![CDATA[<p class="">Here’s <a href="https://maebert.github.io/themostdangerouswritingapp/#/write?limit=5&amp;type=minutes">a nice little web app that forces you to write continuously</a> for a specified amount of time, and if you stop, all text is deleted. It’s a fun exercise, especially if you want to practice writing “flow”. </p><p class="">Here’s what 5 minutes on it got me (I’ll leave the typos in…):</p><p data-rte-preserve-empty="true" class=""></p><p class="">“every time something happens, I tell myself.</p><p class="">Stop. Think. Act. Do. Repeat.</p><p class="">Is that all it takes for something to happen?</p><p class="">Our mind is a fragile thing. It thinks for itself,</p><p class="">but it can also forget itself. It can litellrally forget that it itself, exists. That's crazy, says the mind to itself.</p><p class="">A mind thinking in third person has a funny way of looking at the word.</p><p class="">Here you are, writing a piece of text on a website.</p><p class="">Why? What's the point?</p><p class="">WHat would be lost if you had simply stopped writing?</p><p class="">What does it take for something to stop? to start?</p><p class="">What does it take to look at something, anything, straight in the eyes, and say "that's on me. I'm doing this".</p><p class="">Yes, it was always possibel for us to conjur images of ourslves, the way we'd like the world to see us.</p><p class="">But is it not the word just a bunch of minds looking back at themselves and asking how other minds see THEM instead?</p><p class="">And in that kind of word, that kind of "hell is other people" world, what does it take to be kind? what does kindness even mean?</p><p class="">Is kindness itself self explanatory? Is there a method to this madness of being untruistic? is there some form in which humans and their minds can coexit, side by side? does a body without a mind "exist" ? not being self aware, much like schorodinger's cat: it's possible that that cat was itself not aware it was in a box.</p><p class="">If a box is, but a box is not aware, is it? Is IT really aware of anything inside of it? How the human complexity of the mind fails to capture this sort of unimaginitive dribble down into a human sized piece of dribble..”</p>]]></description></item><item><title>Art of Unit Testing, 3rd Edition, With Examples in JavaScript: Tech Reviewers Wanted</title><dc:creator>Roy Osherove</dc:creator><pubDate>Fri, 26 Jul 2019 15:08:45 +0000</pubDate><link>https://osherove.com/blog/2019/7/26/art-of-unit-testing-3rd-edition-with-examples-in-javascript-tech-reviewers-wanted</link><guid isPermaLink="false">5c741968bfba3e13975e33a6:5c742adcc533ad4a9c5a801d:5d3b1783d84fbf00019204ad</guid><description><![CDATA[<h1>TLDR: </h1><p class="">I need JS Savvy tech reviewers for the 3rd edition of the book. <a href="http://review.artofunittesting.com" target="_blank">Apply here,</a> get a free book with your name mentioned in it if your feedback is awesome.</p><h1>The Rest</h1><p class="">Dear Diary. It has been<a href="https://www.manning.com/books/the-art-of-unit-testing-second-edition" target="_blank"> six years since the last edition of Art of Unit Testing</a>. Many things have changed since then, and many have interestingly remained the same. </p><p class="">I’m writing to you today to let you know that I’ve set up with manning to release a 3rd Edition of Art of Unit Testing in the next year. There are quite a few changes to this edition, and the biggest one is that the examples will be in JavaScript.  (It would seem the most useful to the most people and a lot of my work these days is centered around that and Java so I think it makes sense).</p><p class=""><strong>( I haven’t decided if they should be in plain JS or in Typescript yet. Would love to know what you think in the comments </strong><a href="https://twitter.com/RoyOsherove" target="_blank"><strong>or on twitter</strong></a><strong>.)</strong></p><p class="">So, I need <span>good people</span> to keep me sane as I transform this book into a JS centric one. People to read each chapter and let me know if things don’t make sense, or of my examples suck, or if there are better ways to achieve the same result. </p><h2>Would you like to be a tech reviewer for this new book?</h2><p class="">You’ll get a free copy of the book and a mention inside the book with your name. Also we’ll become great friends and BBQ together every Saturday (If you’re in the tel aviv area).</p><p class=""><a href="http://review.artofunittesting.com" target="_blank">Fill out this form and I’ll get back to ASAP.</a></p><h2>Schedule:</h2><p class="">Nothing is written yet. I should have a chapter or two ready in the next month or two. Maybe earlier. I plan to release each chapter separately to the tech reviewers (typos and all) and get some technical feedback on the code samples and ideas. If that sounds like something you might be interested in geeking out on - it’d be a win-win.</p><h2>Here is the current plan for the revised Table of Contents</h2><h3>Stack used</h3><ul data-rte-list="default"><li><p class="">WebStorm</p></li><li><p class="">Git</p></li><li><p class="">Jest</p></li><li><p class="">Node</p></li><li><p class="">Typescript?</p></li></ul><h1>TOC (many things will change..)</h1><h2>Pre</h2><ul data-rte-list="default"><li><p class="">What's new in the 3rd edition</p></li><li><p class="">JS</p></li></ul><h2>Part 1 - Getting Started</h2><ul data-rte-list="default"><li><p class="">The Basics of Unit Testing</p><ul data-rte-list="default"><li><p class=""><strong>(new) What's in a function?</strong></p><ul data-rte-list="default"><li><p class="">Return value</p></li><li><p class="">Noticeable State Change</p></li><li><p class="">Calling a Third Party</p></li></ul></li><li><p class=""><strong>(new) Entry Points &amp; Exit Points</strong></p></li><li><p class="">Units &amp; Unit Of Work</p></li><li><p class="">Properties of a Good Unit Test</p></li></ul></li><li><p class="">A first Unit Test</p></li></ul><h2>Part 2 - Core Techniques</h2><ul data-rte-list="default"><li><p class="">Using Stubs to Break Dependencies</p><ul data-rte-list="default"><li><p class=""><strong>(new) Faking Callbacks</strong></p></li></ul></li><li><p class="">Interaction Testing using Manual Spies, Mocks</p></li><li><p class="">Isolation (Mocking) Frameworks</p></li><li><p class="">Digging Deeper into Isolation Frameworks</p></li></ul><h2>Part 3 - The Test Code</h2><ul data-rte-list="default"><li><p class="">Test Hierarchies &amp; Organization</p></li><li><p class="">The Pillars of Good Unit Tests</p><ul data-rte-list="default"><li><p class=""><strong>(new) Multiple naming conventions</strong></p></li><li><p class=""><strong>(new) Three important pieces of information in a name</strong></p></li></ul></li></ul><h2>Part 4 - Design &amp; Process</h2><ul data-rte-list="default"><li><p class=""><strong>(new) Unit Tests and a Pipeline Driven Culture</strong></p></li><li><p class=""><strong>(new) Playing well with others</strong></p><ul data-rte-list="default"><li><p class="">Other types of Tests</p></li><li><p class="">Using Test Recipes to Prevent Duplication</p></li></ul></li><li><p class=""><strong>(new) Lies, Damned Lies, and Unit Testing Metrics</strong></p></li><li><p class="">Integrating Unit Testing into the organization</p></li><li><p class="">Working with Legacy Code</p></li><li><p class=""><strong>(new) Refactoring DOs and DONTs</strong></p></li><li><p class="">(changed) Design &amp; Testability</p></li></ul><h2>Appendix - JS Testing Tools &amp; Frameworks</h2><p class="">So, if you want to be a tech reviewer on the book: I’m looking for people with good Node.JS/Javascript experience that would be willing to challenge me on technical details and ideas. Go here and submit yourself. <a href="http://review.artofunittesting.com" target="_blank">https://airtable.com/shrtohxHT8RSsfBLc</a> </p><p data-rte-preserve-empty="true" class=""></p><p data-rte-preserve-empty="true" class=""></p>]]></description></item><item><title>Announcing Continuous Delivery Israel Meetup - First Meeting (June 24)</title><dc:creator>Roy Osherove</dc:creator><pubDate>Sun, 02 Jun 2019 08:20:07 +0000</pubDate><link>https://osherove.com/blog/2019/6/2/announcing-continuous-delivery-israel-meetup-first-meeting-june-24</link><guid isPermaLink="false">5c741968bfba3e13975e33a6:5c742adcc533ad4a9c5a801d:5cf38606eba2fb00015207ef</guid><description><![CDATA[<p class="">I’m pleased to announce that we will have the first ever meeting <strong>Continuous Delivery Israel</strong> meetup , in the AWS Floor28 offices in Tel Aviv, June 24th, 2019, at 6PM.</p><p class=""><a href="http://cdisrael.com" target="_blank">The Group’s page is located at CDIsrael.com </a></p>


































































  

    
  
    

      

      
        <figure class="
              sqs-block-image-figure
              intrinsic
            "
        >
          
        
        

        
          
            
          
            
                
                
                
                
                
                
                
                <img data-stretch="false" data-image="https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1559463534160-3NTT1VEY56YN2581TLX7/CDIsrael.jpg" data-image-dimensions="2489x1660" data-image-focal-point="0.5,0.5" alt="" data-load="false" elementtiming="system-image-block" src="https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1559463534160-3NTT1VEY56YN2581TLX7/CDIsrael.jpg?format=1000w" width="2489" height="1660" sizes="(max-width: 640px) 100vw, (max-width: 767px) 100vw, 100vw" onload="this.classList.add(&quot;loaded&quot;)" srcset="https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1559463534160-3NTT1VEY56YN2581TLX7/CDIsrael.jpg?format=100w 100w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1559463534160-3NTT1VEY56YN2581TLX7/CDIsrael.jpg?format=300w 300w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1559463534160-3NTT1VEY56YN2581TLX7/CDIsrael.jpg?format=500w 500w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1559463534160-3NTT1VEY56YN2581TLX7/CDIsrael.jpg?format=750w 750w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1559463534160-3NTT1VEY56YN2581TLX7/CDIsrael.jpg?format=1000w 1000w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1559463534160-3NTT1VEY56YN2581TLX7/CDIsrael.jpg?format=1500w 1500w, https://images.squarespace-cdn.com/content/v1/5c741968bfba3e13975e33a6/1559463534160-3NTT1VEY56YN2581TLX7/CDIsrael.jpg?format=2500w 2500w" loading="lazy" decoding="async" data-loader="sqs">

            
          
        
          
        

        
      
        </figure>
      

    
  


  





  <p class=""><br></p><p class="">If you would like to be a <strong>speaker or sponsor</strong>, <a href="http://contact.osherove.com" target="_blank">contact me.</a></p><p class=""><strong>AGENDA</strong>:<br>-------------<br>18:00-18:30 Networking &amp; Pizza<br>18:30 - 18:40 Goals for CD Israel + Logistics<br>18:40 - 19:20 Ant Weiss: Optimizing the Delivery Pipeline for Flow<br>19:20 - 19:30 Break<br>19:30 - 20:15 TBD - We are looking for one more speaker!</p><p class=""><strong>ABOUT</strong>:</p><p class="">Continuous Delivery is much more than simply Dev + Ops. It is also tech leads, compliance, security, project managers, scrum masters, architects, and everything in between - let's learn from each other!<br><br>We deal with TECHNIQUES, PRACTICES, PROCESSES (and sometimes tools) that enable true continuous delivery - in large and small companies.<br><br>We also discuss influencing such change in large and growing organizations.<br><br>Bottlenecks &amp; Pipelines: We feel feel pipelines are the core engines that can drive a software company, That Dev, Ops, Test, Sec, compliance should all be working together around common automated pipelines, and the processes, and metrics that push for and against adoption.<br><br>Challenges and insights: We will learn from each other about challenges and techniques that enable true continuous delivery.<br><br>Great for Ops, Dev, Security, compliance and agile leadership folks (PM, scrum masters, etc)</p>]]></description></item><item><title>About Being Lonely as a Consultant</title><dc:creator>Roy Osherove</dc:creator><pubDate>Tue, 16 Apr 2019 09:18:08 +0000</pubDate><link>https://osherove.com/blog/2019/4/16/about-being-lonely-as-a-consultant</link><guid isPermaLink="false">5c741968bfba3e13975e33a6:5c742adcc533ad4a9c5a801d:5cb5989e146f810001bdbcd6</guid><description><![CDATA[<p>Loneliness, as far as I’ve felt it in the past 20+ years where I’ve done perhaps 50% of them as a consultant, is very common. If you become a consultant, you should expect and anticipate it as a given for at least part of your day. Even if your main job is pairing with people, you’ll still have days where loneliness can be felt during the day. </p><p>There are several factors at play:</p><ul data-rte-list="default"><li><p>People don’t know you for the first few weeks or even months, to invite you into their circles</p></li><li><p>There are meetings, shared history, shared chat groups and apps that you might not be part of so you’ll feel like everyone knows something you don’t (and they do)</p></li><li><p>There are just times when you’re not working with anyone and you’re working alone.</p></li></ul><p data-rte-preserve-empty="true"></p><p>Be prepared for situations where stuff just happens:</p><ul data-rte-list="default"><li><p>People going out to lunch without you</p></li><li><p>People having meetings without you (that you might contribute to)</p></li><li><p>Chasing people to meet that are never available.</p></li><li><p>People canceling meetings with you leaving you with nothing to do.</p></li></ul><p>It’s part of that work life and sometimes it just sucks to feel like people are not including you. They might not do it on purpose, they might view you as an “outsider”. They might disagree with your ideas and avoid working with you.</p><p>Be prepared for the mental burden of accepting all this, moving on and continuing to push through.</p><p>I think that’s the hardest part of the job.</p><p data-rte-preserve-empty="true"></p><h1>Things that help:</h1><ul data-rte-list="default"><li><p>Let people know you’re free.</p></li><li><p>If I feel bad, I look at <a href="https://www.5whys.com/articles/when-i-want-to-give-up.html">this post I wrote a long time ago “When I want to five up”</a></p></li><li><p>Find the people who do seek your opinion and work with them. Realize that usually your job is not to “convince” but to “support” someone who is actively trying to become better. Try to work with those people. </p></li><li><p>If your job is to “Convince” then realize that 90% of the time you will be working people who disagree with you. Develop a mental “elephant skin” and realize you will finish every day exhausted  - but also learning a lot about how to teach and explain the same concept in multiple different ways and levels. THIS WILL MAKE YOU BETTER AT TEACHING.</p></li><li><p>Look at past successes and remember how it felt before they succeeded and realize this is the same pattern repeated.</p></li><li><p>Find more customers/teams to work with so you can “breath” other mindsets and gain energy to go back to the place where you feel lonely.</p></li><li><p><strong>You are not alone </strong>in feeling this. I feel like this. SOme weeks it’s 50% of the time. Some weeks is 5% of the time.  But I believe all consultants feel it and have to deal with it.</p></li><li><p>Some consultants work in teams so they eat together etc. </p></li><li><p>Realize that usually if people avoid you it has something to do with what they feel about what THEY should be doing, not what YOU should be doing.  </p></li><li><p>This (plus your knowledge and expertise) is one of the reasons you get paid more (you do ask for more money than you’d make as a hired person, right?). Not everyone can handle this. It always easier to be “part of a group”. </p></li><li><p>Sometimes at some point teams will let you into their inner circles  - that’s a great feeling -  and it will help make you a better consultant as you’ll be on the inner scoop of things before they happen, at which point you can do something about it.</p></li><li><p>Have a life outside of work: spend time with family and friends and bitch to them about your day at work. Spend time with your kids. Have a hobby (<a href="https://oshro.com">I do music</a>) . Don’t let work be the only thing that makes you happy.</p></li></ul><p>That’s my 2 cents. You probably have other , completely different views on the matter. I’m happy to learn! Put it in the comments.</p>]]></description></item><item><title>Looking to do training or consulting in London around week of May 13th 2019</title><dc:creator>Roy Osherove</dc:creator><pubDate>Thu, 14 Mar 2019 09:16:38 +0000</pubDate><link>https://osherove.com/blog/2019/3/14/looking-to-do-training-or-consulting-in-london-around-week-of-may-13th-2019</link><guid isPermaLink="false">5c741968bfba3e13975e33a6:5c742adcc533ad4a9c5a801d:5c8a1b1eb208fc63550f9240</guid><description><![CDATA[<p>If you're based in <strong>LONDON</strong> - I'm looking to do a 1-2 day workshop for interested customers about either <a href="https://enterprisedevops.org" target="_blank">DevOps Patterns</a>, <a href="https://5whys.com" target="_blank">Elastic Leadership </a>or <a href="http://ArtOfUnitTesting.com">TDD</a> during the week of May 15th.  </p><p><a href="https://osherove.com/trainingoptions">Here’s the list of possible training or consulting topics.</a></p><p>Feel free <a href="https://osherove.com/contact">to contact me any time </a>so we can arrange something with your company.</p>]]></description></item><item><title>Removing bloatware from a new windows machine</title><dc:creator>Roy Osherove</dc:creator><pubDate>Fri, 29 Sep 2017 13:00:02 +0000</pubDate><link>https://osherove.com/blog/2017/9/29/removing-bloatware-from-a-new-windows-machine.html</link><guid isPermaLink="false">5c741968bfba3e13975e33a6:5c742adcc533ad4a9c5a801d:5c742adcc533ad4a9c5a8c82</guid><description><![CDATA[<p>Reminder to self: here&#8217;s what you do through powershell:</p>
<p>get-appxpackage&nbsp;<em>messaging</em>&nbsp;| remove-appxpackage</p>
<p>get-appxpackage&nbsp;<em>sway</em>&nbsp;| remove-appxpackage</p>
<p>get-appxpackage&nbsp;<em>commsphone</em>&nbsp;| remove-appxpackage</p>
<p>get-appxpackage&nbsp;<em>windowsphone</em>&nbsp;remove-appxpackage</p>
<p>get-appxpackage&nbsp;<em>phone</em>&nbsp;| remove-appxpackage</p>
<p>get-appxpackage&nbsp;<em>communicationsapps</em>&nbsp;| remove-appxpackage</p>
<p>get-appxpackage&nbsp;<em>people</em>&nbsp;| remove-appxpackage</p>
<p>get-appxpackage&nbsp;<em>zunemusic</em>&nbsp;| remove-appxpackage</p>
<p>get-appxpackage&nbsp;<em>zunevideo</em>&nbsp;| remove-appxpackage</p>
<p>get-appxpackage&nbsp;<em>zune</em>&nbsp;| remove-appxpackage</p>
<p>get-appxpackage&nbsp;<em>bingfinance</em>&nbsp;| remove-appxpackage</p>
<p>get-appxpackage&nbsp;<em>bingnews</em>&nbsp;| remove-appxpackage</p>
<p>get-appxpackage&nbsp;<em>bingsports</em>&nbsp;| remove-appxpackage</p>
<p>get-appxpackage&nbsp;<em>bingweather</em>&nbsp;| remove-appxpackage</p>
<p>get-appxpackage&nbsp;<em>bing</em>&nbsp;| remove-appxpackage</p>
<p>get-appxpackage&nbsp;<em>onenote</em>&nbsp;| remove-appxpackage</p>
<p>get-appxpackage&nbsp;<em>maps</em>&nbsp;| remove-appxpackage</p>
<p>get-appxpackage&nbsp;<em>solitaire</em>&nbsp;| remove-appxpackage</p>
<p>get-appxpackage&nbsp;<em>officehub</em>&nbsp;| remove-appxpackage</p>
<p>get-appxpackage&nbsp;<em>skypeapp</em>&nbsp;| remove-appxpackage</p>
<p>get-appxpackage&nbsp;<em>getstarted</em>&nbsp;| remove-appxpackage</p>
<p>get-appxpackage&nbsp;<em>3dbuilder</em>&nbsp;| remove-appxpackage</p>
<p>Get-AppxPackage&nbsp;<em>drawboardpdf</em>&nbsp;| Remove-AppxPackage</p>
<p>Get-AppxPackage&nbsp;<em>freshpaint</em>&nbsp;| Remove-AppxPackage</p>
<p>Get-AppxPackage&nbsp;<em>nytcrossword</em>&nbsp;| Remove-AppxPackage</p>
<p>Get-AppxPackage&nbsp;<em>microsoft.xboxapp</em>&nbsp;| Remove-AppxPackage</p>
<p>Get-AppxPackage&nbsp;<em>SurfaceHub</em>&nbsp;| Remove-AppxPackage</p>
<p>Get-AppxPackage&nbsp;<em>flipboard</em>&nbsp;| Remove-AppxPackage</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>(from <a href="https://www.reddit.com/r/pcmasterrace/comments/736tfh/skype_is_officially_bloatware_uninstalled_it/">source</a>)</p>
<p>&nbsp;</p>]]></description></item><item><title>New Vim Course Online - Vim Hates You</title><dc:creator>Roy Osherove</dc:creator><pubDate>Thu, 20 Apr 2017 06:08:44 +0000</pubDate><link>https://osherove.com/blog/2017/4/20/new-vim-course-online-vim-hates-you.html</link><guid isPermaLink="false">5c741968bfba3e13975e33a6:5c742adcc533ad4a9c5a801d:5c742adcc533ad4a9c5a8c81</guid><description><![CDATA[<p>I&#8217;ve added a new course to http://courses.osherove.com - This time it&#8217;s all about Vim, which I&#8217;ve been using for a few good years now.&nbsp;</p>
<p>&nbsp;</p>
<p><iframe allowfullscreen src="https://www.youtube.com/embed/oOKfu5OPlFs" width="360" frameborder="0" height="315"></iframe></p>
<p><a href="http://vimhatesyou.com">You can check out my online Vim course at http://VimHatesYou.com&nbsp;</a></p>
<p>Or you can <a href="http://courses.osherove.com/p/vim-hates-you">go directly to the course page at http://courses.osherove.com/p/vim-hates-you</a></p>]]></description></item><item><title>Enterprise DevOps</title><dc:creator>Roy Osherove</dc:creator><pubDate>Sat, 29 Oct 2016 17:01:07 +0000</pubDate><link>https://osherove.com/blog/2016/10/29/enterprise-devops.html</link><guid isPermaLink="false">5c741968bfba3e13975e33a6:5c742adcc533ad4a9c5a801d:5c742adcc533ad4a9c5a8c80</guid><description><![CDATA[<p>As part of my work in the past few years I&#8217;ve been more and more deeply involved in large scale DevOps implemementations in very large companies. I&#8217;m now writing about my experiences in here:</p>
<p>
<ul>
<li>Main website: <a href="http://enterprisedevops.org">enterprisedevops.org</a></li>
</ul>
Some of the latest posts include:<br />
<ul>
<li><a href="http://enterprisedevops.org/article/what-is-enterprise-devops">What is Enterprise DevOps?</a></li>
</ul>
And about DevOps metrics:<br />
<ul>
<li><a href="http://enterprisedevops.org/article/devops-metric-definition-mean-time-to-change-mttc-vs-change-lead-time">Mean time to change</a></li>
<li><a href="http://enterprisedevops.org/article/devops-metric-mean-time-to-recovery-mttr-definition-and-reasoning">Mean time to recovery</a></li>
<li><a href="http://enterprisedevops.org/article/devops-metric-frequency-of-releases-definition">Frequency of Release</a></li>
<li><a href="http://enterprisedevops.org/article/devops-metric-amount-of-defects-and-issues-definition">Defect Rate</a></li>
</ul>
</p>]]></description></item><item><title>Code as Music - Test Environments</title><dc:creator>Roy Osherove</dc:creator><pubDate>Wed, 17 Aug 2016 23:11:38 +0000</pubDate><link>https://osherove.com/blog/2016/8/18/code-as-music-test-environments.html</link><guid isPermaLink="false">5c741968bfba3e13975e33a6:5c742adcc533ad4a9c5a801d:5c742adcc533ad4a9c5a8c7f</guid><description><![CDATA[<p>Music Production also has some corollaries with coding in terms of testing.</p><p>When producing music, it is important that the music sounds good on multiple types of speakers: in your car, in your iphone headphones, on a boom box by the pool, &nbsp;in a club speaker system etc.</p><p>In that regard priducing the music locally on yoru own speakers is much like “works on my machine”.</p><p>Producers will usually take the music and test it out manually in various systems, or have multiple sets of monitors, but still test the music in their car, on friend’s systems and more.</p><p>There are also “emulators” for sound. There are some software solutions that emulate how your music will sound through different speakers, in different locations , in different file formats (mp3 has less data than a .wav file, wav file, for example.</p><p>Nothing beats real work integration testing though. Much like code.</p>]]></description></item><item><title>Music Production vs. Code Production</title><dc:creator>Roy Osherove</dc:creator><pubDate>Mon, 21 Dec 2015 17:40:34 +0000</pubDate><link>https://osherove.com/blog/2015/12/21/music-production-vs-code-production.html</link><guid isPermaLink="false">5c741968bfba3e13975e33a6:5c742adcc533ad4a9c5a801d:5c742adcc533ad4a9c5a8c7e</guid><description><![CDATA[<p>My off hours hobby is music production.</p><p>Here are similarities I see between coding and music production so far:</p><p>&nbsp;</p><ol data-rte-list="default"><li><p>Code <strong>compiles</strong> into binary - midi is rendered into wav files</p></li><li><p>When producing music you need to take <strong>many breaks </strong>to get your ears “out of the mix” and get your head clear again. The same goes for coding when facing tough creative problems or complicated code.</p></li><li><p>Software culture is moving in the direction of<strong> automation and factories,</strong> with architectures that support changing things on the fly. Music production has two opposing factions: a. Newer pop songs are made almost in an industrial fashion (try many tracks in a day, find one that works , then lyrics and vocals are found for it from many contenders; and b. singer-songwriter which is all about manually crafting a song which can take a lot of time. (compare that to a hand crafted optimized piece of code that needs to run at a very low level like a DSP unit or real time calculations)</p></li><li><p><strong>Pair-Programming</strong> - &gt; most new music these days is not done alone: there are lyric writing teams, melodic writing teams, production teams.</p></li><li><p>in Music, new <strong>digital tooling</strong> is taking the place of older generation analog tooling. Instead of filling rooms with huge hardware, people use digital work stations with software plugins that emulates almost every piece of hardware out there. Software coding is fully digital, but used to be very hardware oriented . Software testing is still very manual but automation is starting to take its place.</p></li><li><p><strong>Long term support</strong>: Software can keep changing after you’ve released it (new features added etc. Music is usually delivered in multiple different versions: radio mix, PG safe mix, club mix etc.. and music also gets remixed, new covers by other bands are made, remakes by the original band in shows, digitally remastered albums… not exactly the same, but in music all the “stems” (the parts that make the individual atoms of the song) are always saved and can be used to recreate different variations of the song.</p></li><li><p>Code has classes and functions, Music production (digital) also has building blocks: Sound designers use waveforms and combine them, munge them up and process them to create new types of sounds that are then reused by other musicians. If a waveform is the input of code, an LFO envelope is a type of function that operates on that code. Those are just two types of the :atoms” of synthesized music)</p></li><li><p>When mixing, it is encouraged to take many breaks (20 minutes mixing, 15 minutes break) so that your ears don’t get too used to the mix. Programming is also a very tough activity that is helped by taking many small breaks.</p></li><li><p>TDD: In music you might have a “reference” mix - a song you like or a sound you want to sound like that tells you how close you are to getting the same results (loudness, frequencies, etc). TDD is the same way somewhat in that you set yourself a target and see if you measure up to it or not. Music is not automated for this though, and is not a any kind of regression test.</p></li><li><p>Music pros do as much integration testing as possible they make their friends, DJS, their mom and their cat hear the mix all the time because they know they are not objective about how it translates in the real world.</p></li><li><p>There’s more but my head is drawn a blank..</p></li></ol><p>&nbsp;</p>]]></description></item></channel></rss>