<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel><title>Roy Osherove's blog</title><link>https://osherove.com/blog</link><description>Roy Osherove: author of The Art of Unit Testing and Elastic Leadership. Consulting and training on unit testing, TDD, team leadership, Co-Ops and continuous delivery, plus 20 years of blog posts.</description><language>en</language>
<item><title>Video: Test Driven Smart Contracts with Solidity and Forge with Roy Osherove</title><link>https://osherove.com/blog/2023/3/23/video-test-driven-smart-contracts-with-solidity-and-forge-with-roy-osherove</link><guid>https://osherove.com/blog/2023/3/23/video-test-driven-smart-contracts-with-solidity-and-forge-with-roy-osherove</guid><pubDate>Thu, 23 Mar 2023 21:36:29 GMT</pubDate><description>&lt;p&gt;I did a talk about Test Driven Solidity Smart contracts at the &lt;a href="https://israelweb3.com"&gt;Israel web3 developers underground&lt;/a&gt; last week. Here’s how it went. Hope you enjoy it!&lt;/p&gt;
&lt;figure class="video" data-embed="https://www.youtube-nocookie.com/embed/HuBHPfCJJlc?autoplay=1"&gt;&lt;a class="video-link" href="https://www.youtube.com/watch?v=HuBHPfCJJlc"&gt;&lt;img alt="" decoding="async" loading="lazy" src="/img/video/yt-HuBHPfCJJlc.jpg"/&gt;&lt;span class="video-play"&gt;Play video&lt;/span&gt;&lt;span class="video-title"&gt;Test Driven Solidity Smart Contracts with Foundry &amp;amp; Forge - Roy Osherove&lt;/span&gt;&lt;/a&gt;&lt;/figure&gt;</description></item>
<item><title>Some opinions about effective software development after 20+ years</title><link>https://osherove.com/blog/2021/1/24/some-opinions-about-effective-software-development-after-20-years</link><guid>https://osherove.com/blog/2021/1/24/some-opinions-about-effective-software-development-after-20-years</guid><pubDate>Sun, 24 Jan 2021 09:24:55 GMT</pubDate><description>&lt;p&gt;This &lt;a href="https://news.ycombinator.com/item?id=25887373"&gt;post on hackernews &lt;/a&gt;made me write this:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Being able to communicate ideas &amp;gt; Being a great technical developer - &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;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 "&lt;a href="https://en.wikipedia.org/wiki/The_No_Asshole_Rule"&gt;no asshole rule&lt;/a&gt;". - &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;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. - &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;TDD is a skill just like refactoring. Learn when it makes sense. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;80% of architects in enterprise don't have the skills needed from them. including the things stated above.  &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Learning the &lt;a href="https://en.wikipedia.org/wiki/Theory_of_constraints"&gt;Theory of Constraints&lt;/a&gt; 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. - &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Learning &lt;a href="https://www.youtube.com/watch?v=goihWvyqRow"&gt;what to measure and what not to measure&lt;/a&gt;, lagging vs leading indicators can help you communicate to management about what changes truly need to happen to make your team work more effectively. - &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Whiteboards (and remotely, &lt;a href="https://miro.com"&gt;miro&lt;/a&gt; boards) are very effective and can be used for easily 50% of meetings. But aren't.&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;</description></item>
<item><title>SOLVED: Getting Skype for Business to Work on Mac with Virtual Camera</title><link>https://osherove.com/blog/2020/12/9/solved-getting-skype-for-business-to-work-on-mac-with-virtual-camera</link><guid>https://osherove.com/blog/2020/12/9/solved-getting-skype-for-business-to-work-on-mac-with-virtual-camera</guid><pubDate>Wed, 09 Dec 2020 09:47:30 GMT</pubDate><description>&lt;p&gt;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 &lt;a href="https://answers.microsoft.com/en-us/msoffice/forum/all/skype-for-business-no-longer-recognizes-virtual/67553f89-db9c-4935-aa9c-c09a775ddf15"&gt;this forum reply&lt;/a&gt;):&lt;/p&gt;&lt;h2&gt;;TLDR:&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;sudo codesign --remove-signature /Applications/Skype\ for\ Business.app/&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;The Long Version:&lt;/h2&gt;&lt;p&gt;On Mac OS X
1. Close Skype App
2. Open Terminal
(if you don't have XCode Installed, do items 3 and 4)&lt;/p&gt;&lt;p&gt;3. run &lt;/p&gt;&lt;pre&gt;&lt;code&gt;Xcode-select --install &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;4. install and update Xcode &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Most important part:  &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;5. run &lt;/p&gt;&lt;pre&gt;&lt;code&gt;sudo codesign --remove-signature /Applications/Skype\ for\ Business.app/&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;When Done:&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;  ou will lose your Skype settings. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;when Skype is started the first time you need to enter your admin password and hit "always permit". &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;After that you are able to access your virtual cameras again.  &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;</description></item>
<item><title>Solved - Pihole FTL DB is huge taking too much disk space</title><link>https://osherove.com/blog/2020/11/18/solved-pihole-ftl-db-is-huge-taking-too-much-disk-space</link><guid>https://osherove.com/blog/2020/11/18/solved-pihole-ftl-db-is-huge-taking-too-much-disk-space</guid><pubDate>Wed, 18 Nov 2020 16:05:28 GMT</pubDate><description>&lt;p&gt;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!)&lt;/p&gt;
&lt;pre&gt;cd /etc/pihole
sudo service pihole-FTL stop
sudo mv pihole-FTL.db pihole-FTL.db.old
sudo service pihole-FTL start&lt;/pre&gt;</description></item>
<item><title>SOLVED - High CPU and Lagging when Screen Sharing in Zoom 2020 Multiple Screens</title><link>https://osherove.com/blog/2020/8/18/solved-high-cpu-and-lagging-when-screen-sharing-in-zoom-2020-multiple-screens</link><guid>https://osherove.com/blog/2020/8/18/solved-high-cpu-and-lagging-when-screen-sharing-in-zoom-2020-multiple-screens</guid><pubDate>Tue, 18 Aug 2020 13:04:35 GMT</pubDate><description>&lt;p&gt;(on a mac)&lt;/p&gt;&lt;p&gt;I’m sharing here what I’ve learned the hard way. This has now helped me when teaching &lt;a href="/trainingoptions"&gt;half day remote classes&lt;/a&gt; about TDD:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Go into zoom settings&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Under “Screen Share” -&amp;gt; Advanced -&amp;gt; Screen Capture Mode&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Set Screen Capture Mode to “Previous Operating Systems”&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;figure&gt;&lt;img alt="Zoom settings on mac High CPU Usage" decoding="async" height="432" loading="lazy" src="/img/sq/YJO4S3Z2-Zoom-settings-on-mac-High-CPU-Usage.webp" width="681"/&gt;&lt;/figure&gt;
&lt;p&gt;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. &lt;/p&gt;</description></item>
<item><title>COVID19: All current online unit testing and TDD training content is free until further notice</title><link>https://osherove.com/blog/2020/3/19/covid19-free-unit-testing-training</link><guid>https://osherove.com/blog/2020/3/19/covid19-free-unit-testing-training</guid><pubDate>Thu, 19 Mar 2020 16:33:24 GMT</pubDate><description>&lt;iframe allowfullscreen="" class="embed" frameborder="0" height="280" loading="lazy" src="https://embed.restream.io/player/index.html?token=df9f03a833eb31258c522ef33c9ba92c" width="460"&gt;&lt;/iframe&gt;
&lt;p&gt;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.&lt;/p&gt;&lt;p&gt;Here’s my part in helping people stay indoors: until further notice, all my existing online courses are free for everyone who’s interested. &lt;a href="https://go.osherove.com/covid19"&gt;Simply go to the COVID19 ALL-IN bundle and sign up&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;You’ll get streaming and download access to all the content. &lt;/p&gt;&lt;p&gt;Some of the content there:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;TDD in Java, C# and Ruby based on &lt;a href="https://artofunittesting.com"&gt;Art of Unit Testing&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Legacy Code Refactoring for Unit Testing (C#)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Pairing Videos on TDD (C#)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;More..!&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;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. &lt;/p&gt;&lt;p&gt;&lt;em&gt;Also, consider signing up for &lt;/em&gt;&lt;a href="https://twitch.tv/royosherove"&gt;&lt;em&gt;my daily corona dev stream&lt;/em&gt;&lt;/a&gt;&lt;em&gt; where I work on the upcoming next version of my book, art of unit testing 3rd edition, live:&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Have fun, stay safe, stay indoors, and spread knowledge, not the virus. &lt;/p&gt;</description></item>
<item><title>Unit Testing Entry and Exit Points</title><link>https://osherove.com/blog/2020/3/12/unit-testing-entry-points-and-exit-points</link><guid>https://osherove.com/blog/2020/3/12/unit-testing-entry-points-and-exit-points</guid><pubDate>Thu, 12 Mar 2020 14:19:12 GMT</pubDate><description>&lt;p&gt;Let’s talk about the word “unit” in unit testing.  To me, a &lt;em&gt;unit&lt;/em&gt; 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 &lt;em&gt;entry points&lt;/em&gt; and &lt;em&gt;exit points&lt;/em&gt;. 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.&lt;/p&gt;&lt;p&gt;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.&lt;/p&gt;&lt;h1&gt;&lt;strong&gt;Definition : Unit of Work&lt;/strong&gt;&lt;/h1&gt;&lt;p&gt;A &lt;em&gt;unit of work&lt;/em&gt; is the sum of actions that take place between the invocation of an &lt;em&gt;entry point&lt;/em&gt; up until a noticeable end result through one or more &lt;em&gt;exit points&lt;/em&gt;. The &lt;em&gt;entry point&lt;/em&gt; is the thing we trigger. Given a publicly visible function, for example:&lt;/p&gt;&lt;p&gt;The function’s body is all or part of the unit of work.&lt;/p&gt;&lt;p&gt;The function’s declaration and signature are the entry point into the body.&lt;/p&gt;&lt;p&gt;The resulting outputs or behaviors of the function are its exit points.  &lt;/p&gt;&lt;h2&gt;&lt;strong&gt;&lt;em&gt;Entry Points &amp;amp; Exit Points&lt;/em&gt;&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;A unit of work always has an entry point and one or more exit points.&lt;/p&gt;&lt;p&gt;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.&lt;/p&gt;
&lt;figure&gt;&lt;img alt="unit-of-work1.png" decoding="async" height="245" loading="lazy" src="/img/sq/Q33N66A7-unit-of-work1.png" width="237"/&gt;&lt;/figure&gt;
&lt;p&gt;A &lt;em&gt;unit of work&lt;/em&gt; 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.&lt;/p&gt;&lt;p&gt;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.&lt;/p&gt;
&lt;figure&gt;&lt;img alt="unit-of-work2.png" decoding="async" height="288" loading="lazy" src="/img/sq/YACPPM4I-unit-of-work2.png" width="258"/&gt;&lt;/figure&gt;
&lt;h2&gt;&lt;strong&gt;Why “exit point”?&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;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 &lt;a href="https://artofunittesting.com"&gt;my art of unit testing book…&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Here’s a quick code example of a simple unit of work.&lt;/p&gt;
&lt;pre&gt;&lt;span&gt;const&lt;/span&gt; &lt;span&gt;sum&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; (&lt;span&gt;numbers&lt;/span&gt;) &lt;span&gt;=&amp;gt;&lt;/span&gt; {
    &lt;span&gt;const&lt;/span&gt; [&lt;span&gt;a&lt;/span&gt;, &lt;span&gt;b&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;numbers&lt;/span&gt;.&lt;span&gt;split&lt;/span&gt;(&lt;span&gt;','&lt;/span&gt;);  
    &lt;span&gt;const&lt;/span&gt; &lt;span&gt;result&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;Number&lt;/span&gt;.&lt;span&gt;parseInt&lt;/span&gt;(&lt;span&gt;a&lt;/span&gt;, &lt;span&gt;10&lt;/span&gt;) &lt;span&gt;+&lt;/span&gt; &lt;span&gt;Number&lt;/span&gt;.&lt;span&gt;parseInt&lt;/span&gt;(&lt;span&gt;b&lt;/span&gt;, &lt;span&gt;10&lt;/span&gt;);  
    &lt;span&gt;return&lt;/span&gt; &lt;span&gt;result&lt;/span&gt;;
};&lt;/pre&gt;
&lt;p&gt;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.&lt;br/&gt;If we drew this function as a unit of work, it would look something like this:&lt;br/&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img alt="unit-of-work1.1.png" decoding="async" height="217" loading="lazy" src="/img/sq/1NJMACE7-unit-of-work1.1.png" width="192"/&gt;&lt;/figure&gt;
&lt;p&gt;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. &lt;/p&gt;&lt;p&gt;Here’s a variation of this idea:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;A Unit of work has entry points and exit points:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;span&gt;let&lt;/span&gt; &lt;span&gt;total&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;;
&lt;span&gt;const&lt;/span&gt; &lt;span&gt;totalSoFar&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; () &lt;span&gt;=&amp;gt;&lt;/span&gt; {
  &lt;span&gt;return&lt;/span&gt; &lt;span&gt;total&lt;/span&gt;;
};

&lt;span&gt;const&lt;/span&gt; &lt;span&gt;sum&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; (&lt;span&gt;numbers&lt;/span&gt;) &lt;span&gt;=&amp;gt;&lt;/span&gt; {
  &lt;span&gt;const&lt;/span&gt; [&lt;span&gt;a&lt;/span&gt;, &lt;span&gt;b&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;numbers&lt;/span&gt;.&lt;span&gt;split&lt;/span&gt;(&lt;span&gt;','&lt;/span&gt;);
  &lt;span&gt;const&lt;/span&gt; &lt;span&gt;result&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;Number&lt;/span&gt;.&lt;span&gt;parseInt&lt;/span&gt;(&lt;span&gt;a&lt;/span&gt;, &lt;span&gt;10&lt;/span&gt;) &lt;span&gt;+&lt;/span&gt;
            &lt;span&gt;Number&lt;/span&gt;.&lt;span&gt;parseInt&lt;/span&gt;(&lt;span&gt;b&lt;/span&gt;, &lt;span&gt;10&lt;/span&gt;);
  &lt;span&gt;total&lt;/span&gt; &lt;span&gt;+=&lt;/span&gt; &lt;span&gt;result&lt;/span&gt;;
  &lt;span&gt;return&lt;/span&gt; &lt;span&gt;result&lt;/span&gt;;
};

&lt;span&gt;module&lt;/span&gt;.&lt;span&gt;exports&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; {
  &lt;span&gt;sum&lt;/span&gt;,
  &lt;span&gt;totalSoFar&lt;/span&gt;
};&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;﻿&lt;/strong&gt;This new version of sum has &lt;em&gt;two&lt;/em&gt; exit points. It does two things:&lt;/p&gt;&lt;p&gt;1.     It returns a value&lt;/p&gt;&lt;p&gt;2.     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.&lt;br/&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img alt="unit-of-work1.2.png" decoding="async" height="268" loading="lazy" src="/img/sq/AS88TFG2-unit-of-work1.2.png" width="222"/&gt;&lt;/figure&gt;
&lt;p&gt;You can think of these two exit points as two different &lt;em&gt;paths&lt;/em&gt;, or &lt;em&gt;requirements&lt;/em&gt; from the same unit of work, because they indeed &lt;em&gt;are &lt;/em&gt;two different &lt;em&gt;useful &lt;/em&gt;things the code is expected to do.&lt;/p&gt;&lt;p&gt;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.&lt;/p&gt;&lt;p&gt;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.&lt;/p&gt;&lt;p&gt;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.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;A side note on design&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;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.&lt;/p&gt;&lt;p&gt;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: &lt;a href="https://martinfowler.com/bliki/CommandQuerySeparation.html"&gt;https://martinfowler.com/bliki/CommandQuerySeparation.html&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Exit points often signify requirements and new tests, and vice versa&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Exit points are end results of a unit of work.  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.&lt;/p&gt;&lt;p&gt;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.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;Back to the code:&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Here’s a third version of this function :&lt;/p&gt;
&lt;pre&gt;&lt;span&gt;const&lt;/span&gt; &lt;span&gt;winston&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;require&lt;/span&gt;(&lt;span&gt;'winston'&lt;/span&gt;);
&lt;span&gt;let&lt;/span&gt; &lt;span&gt;total&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;;

&lt;span&gt;const&lt;/span&gt; &lt;span&gt;totalSoFar&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; () &lt;span&gt;=&amp;gt;&lt;/span&gt; {
  &lt;span&gt;return&lt;/span&gt; &lt;span&gt;total&lt;/span&gt;;
};

 
&lt;span&gt;const&lt;/span&gt; &lt;span&gt;makeLogger&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; () &lt;span&gt;=&amp;gt;&lt;/span&gt; {
  &lt;span&gt;return&lt;/span&gt; &lt;span&gt;winston&lt;/span&gt;
    .&lt;span&gt;createLogger&lt;/span&gt;({
      &lt;span&gt;level&lt;/span&gt;: &lt;span&gt;'info'&lt;/span&gt;,
      &lt;span&gt;transports&lt;/span&gt;: &lt;span&gt;new&lt;/span&gt; &lt;span&gt;winston&lt;/span&gt;.&lt;span&gt;transports&lt;/span&gt;.&lt;span&gt;Console&lt;/span&gt;()
    });
};

&lt;span&gt;const&lt;/span&gt; &lt;span&gt;logger&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;makeLogger&lt;/span&gt;();
&lt;span&gt;const&lt;/span&gt; &lt;span&gt;sum&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; (&lt;span&gt;numbers&lt;/span&gt;) &lt;span&gt;=&amp;gt;&lt;/span&gt; {
  &lt;span&gt;const&lt;/span&gt; [&lt;span&gt;a&lt;/span&gt;, &lt;span&gt;b&lt;/span&gt;] &lt;span&gt;=&lt;/span&gt; &lt;span&gt;numbers&lt;/span&gt;.&lt;span&gt;split&lt;/span&gt;(&lt;span&gt;','&lt;/span&gt;);
  &lt;span&gt;logger&lt;/span&gt;.&lt;span&gt;info&lt;/span&gt;(
    &lt;span&gt;'this is a very important log output'&lt;/span&gt;,
    { &lt;span&gt;firstNumWas&lt;/span&gt;: &lt;span&gt;a&lt;/span&gt;, &lt;span&gt;secondNumWas&lt;/span&gt;: &lt;span&gt;b&lt;/span&gt; });
  &lt;span&gt;const&lt;/span&gt; &lt;span&gt;result&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;Number&lt;/span&gt;.&lt;span&gt;parseInt&lt;/span&gt;(&lt;span&gt;a&lt;/span&gt;, &lt;span&gt;10&lt;/span&gt;) &lt;span&gt;+&lt;/span&gt; &lt;span&gt;Number&lt;/span&gt;.&lt;span&gt;parseInt&lt;/span&gt;(&lt;span&gt;b&lt;/span&gt;, &lt;span&gt;10&lt;/span&gt;);
  &lt;span&gt;total&lt;/span&gt; &lt;span&gt;+=&lt;/span&gt; &lt;span&gt;result&lt;/span&gt;;
  &lt;span&gt;return&lt;/span&gt; &lt;span&gt;result&lt;/span&gt;;
};

&lt;span&gt;module&lt;/span&gt;.&lt;span&gt;exports&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; {
  &lt;span&gt;totalSoFar&lt;/span&gt;,
  &lt;span&gt;sum&lt;/span&gt;
};&lt;/pre&gt;
&lt;p&gt; &lt;strong&gt;﻿&lt;/strong&gt;You can see there’s a new &lt;em&gt;exit point/requirement/end result&lt;/em&gt; 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.&lt;/p&gt;&lt;p&gt;This is the third type of an exit point: &lt;em&gt;calling a third party&lt;/em&gt;. I also like to call it “calling a &lt;em&gt;dependency&lt;/em&gt;”.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;A Dependency (3rd party)&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;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.  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.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;Here's how I’d draw it with all three exit points, and two entry points together:&lt;br/&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img alt="unit-of-work3.png" decoding="async" height="279" loading="lazy" src="/img/sq/TB8476HD-unit-of-work3.png" width="270"/&gt;&lt;/figure&gt;
&lt;p&gt;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.&lt;/p&gt;&lt;h1&gt;Test Per Exit Point&lt;/h1&gt;&lt;p&gt;Here’s where it gets interesting: It’s a good idea to have at least one &lt;em&gt;separate test per exit point&lt;/em&gt;. (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.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;&lt;em&gt;Exit Point Types&lt;/em&gt;&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;We’ve seen that we have three different types of end results:&lt;/p&gt;&lt;h3&gt;Value Based&lt;/h3&gt;&lt;p&gt;§  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.&lt;/p&gt;&lt;h3&gt;State Based&lt;/h3&gt;&lt;p&gt;§  There’s a &lt;em&gt;noticeable&lt;/em&gt; 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.)&lt;/p&gt;&lt;h3&gt;3rd Party&lt;/h3&gt;&lt;p&gt;§  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.)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;XUnit Test Patterns’ Definition of Entry &amp;amp; Exit Points&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The book &lt;a href="http://xunitpatterns.com/"&gt;&lt;em&gt;XUnit Test Patterns&lt;/em&gt; &lt;/a&gt;discusses the notion of &lt;em&gt;direct inputs and outputs, &lt;/em&gt; and &lt;em&gt;indirect inputs and outputs&lt;/em&gt;. &lt;em&gt;Direct inputs &lt;/em&gt; 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).  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  &lt;/p&gt;&lt;p&gt;Let’s see how the idea of entry and exit points affects the definition of a unit test.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;UPDATED DEFINITION of a unit test: &lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;A &lt;em&gt;unit test&lt;/em&gt; is a piece of code that invokes a unit of work and &lt;strong&gt;checks one specific exit point &lt;/strong&gt;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 &lt;strong&gt;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.&lt;/strong&gt; &lt;/p&gt;&lt;h2&gt;&lt;strong&gt;&lt;em&gt;1.2          Different Exit Points, Different Techniques&lt;/em&gt;&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;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.&lt;/p&gt;&lt;p&gt;·       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.&lt;/p&gt;&lt;p&gt;·       State based tests (indirect outputs) require a little more gymnastics usually. You call something, then you do &lt;em&gt;another call to&lt;/em&gt; check &lt;em&gt;something else&lt;/em&gt; (or call the previous thing again) to see if everything went according to plan.&lt;/p&gt;&lt;p&gt;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 &lt;em&gt;mock objects&lt;/em&gt; 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.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Which exit points make the most problems?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;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. &lt;/p&gt;</description></item>
<item><title>Re-Thinking the Role of Mock Objects, Design &amp; Test Maintainability (stream of thought)</title><link>https://osherove.com/blog/2020/3/2/re-thinking-the-role-of-mock-objects-design-amp-test-maintainability-stream-of-thought</link><guid>https://osherove.com/blog/2020/3/2/re-thinking-the-role-of-mock-objects-design-amp-test-maintainability-stream-of-thought</guid><pubDate>Mon, 02 Mar 2020 16:38:48 GMT</pubDate><description>&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: 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.  &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: written as a stream of though. So might be a bit incoherent. &lt;/p&gt;&lt;p&gt;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. &lt;/p&gt;&lt;p&gt;The reasons I usually state for this are:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;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.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;mock objects make tests longer and harder to read write and maintain&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;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?)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;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) “&lt;a href="http://jmock.org/oopsla2004.pdf"&gt;Mock Roles not Objects&lt;/a&gt;” (PDF).&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“…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.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;As I’m working &lt;a href="https://go.osherove.com/aout3"&gt;on the third edition&lt;/a&gt; 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:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;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…&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;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)&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;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. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;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&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;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. &lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;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&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;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!) &lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;So what am I trying to say here?&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;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?&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;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. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;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?&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;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? &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Here’s what the paper has to say about this:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“When testing with Mock Objects it is important to find the right balance between an accurate specification of a unit's required behaviour and&lt;strong&gt; a flexible test that allows easy evolution of the code base&lt;/strong&gt;. 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. &lt;strong&gt;They have been over-specified&lt;/strong&gt; 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. &lt;/p&gt;&lt;p&gt;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.”&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;&lt;p&gt;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. &lt;/p&gt;</description></item>
<item><title>Seeking Speakers about Branching Strategies, Feature Toggles, Pairing &amp; Other XP/CD Practices</title><link>https://osherove.com/blog/2020/1/19/seeking-speakers-about-branching-strategies-feature-toggles-pairing-amp-other-xpcd-practices</link><guid>https://osherove.com/blog/2020/1/19/seeking-speakers-about-branching-strategies-feature-toggles-pairing-amp-other-xpcd-practices</guid><pubDate>Sun, 19 Jan 2020 11:09:40 GMT</pubDate><description>&lt;p&gt;The new&lt;a href="http://cxdxpisrael.com"&gt; CD/XP israel meetup &lt;/a&gt;that I’m running is seeking speakers for our meetups in the next few months about any of the following subjects:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Branching Strategies&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Continuous Delivery Metrics&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Engineering Practices &amp;amp; Automation&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Testing &amp;amp; TDD *&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Security Testing &amp;amp; Pipeline Automation *&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Developer Testing *&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Infrastructure as Code *&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Cross Team Collaboration *&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Feature Teams *&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;QA/Dev/Sec Automation *&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;DevOps, DevSecOps, DevTestOps and others *&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Feature Toggles &amp;amp; Rollouts *&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Pair Programming &amp;amp; Other XP Practices *&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Anything else you think might be interesting&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If you live in Israel are in the neighborhood at some point, please consider sharing your knowledge with the CD/XP agile community.&lt;/p&gt;&lt;p&gt;URL to Submit: &lt;a href="http://submit.cdxpisrael.com/"&gt;http://submit.cdxpisrael.com&lt;/a&gt;&lt;/p&gt;</description></item>
<item><title>An updated diagram of the TDD process from the upcoming 3rd Edition of Art of Unit Testing</title><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>https://osherove.com/blog/2019/11/12/an-updated-diagram-of-the-tdd-process-from-the-upcoming-3rd-edition-of-art-of-unit-testing</guid><pubDate>Tue, 12 Nov 2019 07:39:22 GMT</pubDate><description>&lt;p&gt;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:&lt;/p&gt;
&lt;figure&gt;&lt;img alt="tdd-process.png" decoding="async" height="700" loading="lazy" src="/img/sq/5KIX73Y6-tdd-process.png" width="892"/&gt;&lt;/figure&gt;</description></item>
<item><title>Can you write for 5 minutes?</title><link>https://osherove.com/blog/2019/8/22/can-you-write-for-5-minutes</link><guid>https://osherove.com/blog/2019/8/22/can-you-write-for-5-minutes</guid><pubDate>Thu, 22 Aug 2019 14:23:48 GMT</pubDate><description>&lt;p&gt;Here’s &lt;a href="https://maebert.github.io/themostdangerouswritingapp/#/write?limit=5&amp;amp;type=minutes"&gt;a nice little web app that forces you to write continuously&lt;/a&gt; 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”. &lt;/p&gt;&lt;p&gt;Here’s what 5 minutes on it got me (I’ll leave the typos in…):&lt;/p&gt;&lt;p&gt;“every time something happens, I tell myself.&lt;/p&gt;&lt;p&gt;Stop. Think. Act. Do. Repeat.&lt;/p&gt;&lt;p&gt;Is that all it takes for something to happen?&lt;/p&gt;&lt;p&gt;Our mind is a fragile thing. It thinks for itself,&lt;/p&gt;&lt;p&gt;but it can also forget itself. It can litellrally forget that it itself, exists. That's crazy, says the mind to itself.&lt;/p&gt;&lt;p&gt;A mind thinking in third person has a funny way of looking at the word.&lt;/p&gt;&lt;p&gt;Here you are, writing a piece of text on a website.&lt;/p&gt;&lt;p&gt;Why? What's the point?&lt;/p&gt;&lt;p&gt;WHat would be lost if you had simply stopped writing?&lt;/p&gt;&lt;p&gt;What does it take for something to stop? to start?&lt;/p&gt;&lt;p&gt;What does it take to look at something, anything, straight in the eyes, and say "that's on me. I'm doing this".&lt;/p&gt;&lt;p&gt;Yes, it was always possibel for us to conjur images of ourslves, the way we'd like the world to see us.&lt;/p&gt;&lt;p&gt;But is it not the word just a bunch of minds looking back at themselves and asking how other minds see THEM instead?&lt;/p&gt;&lt;p&gt;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?&lt;/p&gt;&lt;p&gt;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.&lt;/p&gt;&lt;p&gt;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..”&lt;/p&gt;</description></item>
<item><title>Art of Unit Testing, 3rd Edition, With Examples in JavaScript: Tech Reviewers Wanted</title><link>https://osherove.com/blog/2019/7/26/art-of-unit-testing-3rd-edition-with-examples-in-javascript-tech-reviewers-wanted</link><guid>https://osherove.com/blog/2019/7/26/art-of-unit-testing-3rd-edition-with-examples-in-javascript-tech-reviewers-wanted</guid><pubDate>Fri, 26 Jul 2019 15:08:45 GMT</pubDate><description>&lt;h1&gt;TLDR: &lt;/h1&gt;&lt;p&gt;I need JS Savvy tech reviewers for the 3rd edition of the book. &lt;a href="http://review.artofunittesting.com"&gt;Apply here,&lt;/a&gt; get a free book with your name mentioned in it if your feedback is awesome.&lt;/p&gt;&lt;h1&gt;The Rest&lt;/h1&gt;&lt;p&gt;Dear Diary. It has been&lt;a href="https://www.manning.com/books/the-art-of-unit-testing-second-edition"&gt; six years since the last edition of Art of Unit Testing&lt;/a&gt;. Many things have changed since then, and many have interestingly remained the same. &lt;/p&gt;&lt;p&gt;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).&lt;/p&gt;&lt;p&gt;&lt;strong&gt;( 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 &lt;/strong&gt;&lt;a href="https://twitter.com/RoyOsherove"&gt;&lt;strong&gt;or on twitter&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;So, I need &lt;span&gt;good people&lt;/span&gt; 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. &lt;/p&gt;&lt;h2&gt;Would you like to be a tech reviewer for this new book?&lt;/h2&gt;&lt;p&gt;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).&lt;/p&gt;&lt;p&gt;&lt;a href="http://review.artofunittesting.com"&gt;Fill out this form and I’ll get back to ASAP.&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;Schedule:&lt;/h2&gt;&lt;p&gt;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.&lt;/p&gt;&lt;h2&gt;Here is the current plan for the revised Table of Contents&lt;/h2&gt;&lt;h3&gt;Stack used&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;WebStorm&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Git&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Jest&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Node&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Typescript?&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h1&gt;TOC (many things will change..)&lt;/h1&gt;&lt;h2&gt;Pre&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;What's new in the 3rd edition&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;JS&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Part 1 - Getting Started&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;The Basics of Unit Testing&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;(new) What's in a function?&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Return value&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Noticeable State Change&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Calling a Third Party&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;(new) Entry Points &amp;amp; Exit Points&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Units &amp;amp; Unit Of Work&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Properties of a Good Unit Test&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;A first Unit Test&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Part 2 - Core Techniques&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Using Stubs to Break Dependencies&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;(new) Faking Callbacks&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Interaction Testing using Manual Spies, Mocks&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Isolation (Mocking) Frameworks&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Digging Deeper into Isolation Frameworks&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Part 3 - The Test Code&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Test Hierarchies &amp;amp; Organization&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The Pillars of Good Unit Tests&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;(new) Multiple naming conventions&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;(new) Three important pieces of information in a name&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Part 4 - Design &amp;amp; Process&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;(new) Unit Tests and a Pipeline Driven Culture&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;(new) Playing well with others&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Other types of Tests&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Using Test Recipes to Prevent Duplication&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;(new) Lies, Damned Lies, and Unit Testing Metrics&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Integrating Unit Testing into the organization&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Working with Legacy Code&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;(new) Refactoring DOs and DONTs&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;(changed) Design &amp;amp; Testability&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Appendix - JS Testing Tools &amp;amp; Frameworks&lt;/h2&gt;&lt;p&gt;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. &lt;a href="http://review.artofunittesting.com"&gt;https://airtable.com/shrtohxHT8RSsfBLc&lt;/a&gt; &lt;/p&gt;</description></item>
<item><title>Announcing Continuous Delivery Israel Meetup - First Meeting (June 24)</title><link>https://osherove.com/blog/2019/6/2/announcing-continuous-delivery-israel-meetup-first-meeting-june-24</link><guid>https://osherove.com/blog/2019/6/2/announcing-continuous-delivery-israel-meetup-first-meeting-june-24</guid><pubDate>Sun, 02 Jun 2019 08:20:07 GMT</pubDate><description>&lt;p&gt;I’m pleased to announce that we will have the first ever meeting &lt;strong&gt;Continuous Delivery Israel&lt;/strong&gt; meetup , in the AWS Floor28 offices in Tel Aviv, June 24th, 2019, at 6PM.&lt;/p&gt;&lt;p&gt;&lt;a href="http://cdisrael.com"&gt;The Group’s page is located at CDIsrael.com &lt;/a&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img alt="CDIsrael.jpg" decoding="async" height="1660" loading="lazy" src="/img/sq/TT1VEY56-CDIsrael.jpg" width="2489"/&gt;&lt;/figure&gt;
&lt;p&gt;If you would like to be a &lt;strong&gt;speaker or sponsor&lt;/strong&gt;, &lt;a href="/contact"&gt;contact me.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;AGENDA&lt;/strong&gt;:&lt;br/&gt;-------------&lt;br/&gt;18:00-18:30 Networking &amp;amp; Pizza&lt;br/&gt;18:30 - 18:40 Goals for CD Israel + Logistics&lt;br/&gt;18:40 - 19:20 Ant Weiss: Optimizing the Delivery Pipeline for Flow&lt;br/&gt;19:20 - 19:30 Break&lt;br/&gt;19:30 - 20:15 TBD - We are looking for one more speaker!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ABOUT&lt;/strong&gt;:&lt;/p&gt;&lt;p&gt;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!&lt;br/&gt;&lt;br/&gt;We deal with TECHNIQUES, PRACTICES, PROCESSES (and sometimes tools) that enable true continuous delivery - in large and small companies.&lt;br/&gt;&lt;br/&gt;We also discuss influencing such change in large and growing organizations.&lt;br/&gt;&lt;br/&gt;Bottlenecks &amp;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.&lt;br/&gt;&lt;br/&gt;Challenges and insights: We will learn from each other about challenges and techniques that enable true continuous delivery.&lt;br/&gt;&lt;br/&gt;Great for Ops, Dev, Security, compliance and agile leadership folks (PM, scrum masters, etc)&lt;/p&gt;</description></item>
<item><title>About Being Lonely as a Consultant</title><link>https://osherove.com/blog/2019/4/16/about-being-lonely-as-a-consultant</link><guid>https://osherove.com/blog/2019/4/16/about-being-lonely-as-a-consultant</guid><pubDate>Tue, 16 Apr 2019 09:18:08 GMT</pubDate><description>&lt;p&gt;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. &lt;/p&gt;&lt;p&gt;There are several factors at play:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;People don’t know you for the first few weeks or even months, to invite you into their circles&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;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)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;There are just times when you’re not working with anyone and you’re working alone.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Be prepared for situations where stuff just happens:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;People going out to lunch without you&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;People having meetings without you (that you might contribute to)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Chasing people to meet that are never available.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;People canceling meetings with you leaving you with nothing to do.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;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.&lt;/p&gt;&lt;p&gt;Be prepared for the mental burden of accepting all this, moving on and continuing to push through.&lt;/p&gt;&lt;p&gt;I think that’s the hardest part of the job.&lt;/p&gt;&lt;h1&gt;Things that help:&lt;/h1&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Let people know you’re free.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;If I feel bad, I look at &lt;a href="https://www.5whys.com/articles/when-i-want-to-give-up.html"&gt;this post I wrote a long time ago “When I want to five up”&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;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. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;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.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Look at past successes and remember how it felt before they succeeded and realize this is the same pattern repeated.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;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.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;You are not alone &lt;/strong&gt;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.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Some consultants work in teams so they eat together etc. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;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.  &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;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”. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;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.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;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 (&lt;a href="https://oshro.com"&gt;I do music&lt;/a&gt;) . Don’t let work be the only thing that makes you happy.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;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.&lt;/p&gt;</description></item>
<item><title>Looking to do training or consulting in London around week of May 13th 2019</title><link>https://osherove.com/blog/2019/3/14/looking-to-do-training-or-consulting-in-london-around-week-of-may-13th-2019</link><guid>https://osherove.com/blog/2019/3/14/looking-to-do-training-or-consulting-in-london-around-week-of-may-13th-2019</guid><pubDate>Thu, 14 Mar 2019 09:16:38 GMT</pubDate><description>&lt;p&gt;If you're based in &lt;strong&gt;LONDON&lt;/strong&gt; - I'm looking to do a 1-2 day workshop for interested customers about either &lt;a href="https://pipelinedriven.org/enterprise-devops"&gt;DevOps Patterns&lt;/a&gt;, &lt;a href="https://5whys.com"&gt;Elastic Leadership &lt;/a&gt;or &lt;a href="http://ArtOfUnitTesting.com"&gt;TDD&lt;/a&gt; during the week of May 15th.  &lt;/p&gt;&lt;p&gt;&lt;a href="/trainingoptions"&gt;Here’s the list of possible training or consulting topics.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Feel free &lt;a href="/contact"&gt;to contact me any time &lt;/a&gt;so we can arrange something with your company.&lt;/p&gt;</description></item>
<item><title>Removing bloatware from a new windows machine</title><link>https://osherove.com/blog/2017/9/29/removing-bloatware-from-a-new-windows-machine.html</link><guid>https://osherove.com/blog/2017/9/29/removing-bloatware-from-a-new-windows-machine.html</guid><pubDate>Fri, 29 Sep 2017 13:00:02 GMT</pubDate><description>&lt;div&gt;&lt;p&gt;Reminder to self: here’s what you do through powershell:&lt;/p&gt;
&lt;p&gt;get-appxpackage &lt;em&gt;messaging&lt;/em&gt; | remove-appxpackage&lt;/p&gt;
&lt;p&gt;get-appxpackage &lt;em&gt;sway&lt;/em&gt; | remove-appxpackage&lt;/p&gt;
&lt;p&gt;get-appxpackage &lt;em&gt;commsphone&lt;/em&gt; | remove-appxpackage&lt;/p&gt;
&lt;p&gt;get-appxpackage &lt;em&gt;windowsphone&lt;/em&gt; remove-appxpackage&lt;/p&gt;
&lt;p&gt;get-appxpackage &lt;em&gt;phone&lt;/em&gt; | remove-appxpackage&lt;/p&gt;
&lt;p&gt;get-appxpackage &lt;em&gt;communicationsapps&lt;/em&gt; | remove-appxpackage&lt;/p&gt;
&lt;p&gt;get-appxpackage &lt;em&gt;people&lt;/em&gt; | remove-appxpackage&lt;/p&gt;
&lt;p&gt;get-appxpackage &lt;em&gt;zunemusic&lt;/em&gt; | remove-appxpackage&lt;/p&gt;
&lt;p&gt;get-appxpackage &lt;em&gt;zunevideo&lt;/em&gt; | remove-appxpackage&lt;/p&gt;
&lt;p&gt;get-appxpackage &lt;em&gt;zune&lt;/em&gt; | remove-appxpackage&lt;/p&gt;
&lt;p&gt;get-appxpackage &lt;em&gt;bingfinance&lt;/em&gt; | remove-appxpackage&lt;/p&gt;
&lt;p&gt;get-appxpackage &lt;em&gt;bingnews&lt;/em&gt; | remove-appxpackage&lt;/p&gt;
&lt;p&gt;get-appxpackage &lt;em&gt;bingsports&lt;/em&gt; | remove-appxpackage&lt;/p&gt;
&lt;p&gt;get-appxpackage &lt;em&gt;bingweather&lt;/em&gt; | remove-appxpackage&lt;/p&gt;
&lt;p&gt;get-appxpackage &lt;em&gt;bing&lt;/em&gt; | remove-appxpackage&lt;/p&gt;
&lt;p&gt;get-appxpackage &lt;em&gt;onenote&lt;/em&gt; | remove-appxpackage&lt;/p&gt;
&lt;p&gt;get-appxpackage &lt;em&gt;maps&lt;/em&gt; | remove-appxpackage&lt;/p&gt;
&lt;p&gt;get-appxpackage &lt;em&gt;solitaire&lt;/em&gt; | remove-appxpackage&lt;/p&gt;
&lt;p&gt;get-appxpackage &lt;em&gt;officehub&lt;/em&gt; | remove-appxpackage&lt;/p&gt;
&lt;p&gt;get-appxpackage &lt;em&gt;skypeapp&lt;/em&gt; | remove-appxpackage&lt;/p&gt;
&lt;p&gt;get-appxpackage &lt;em&gt;getstarted&lt;/em&gt; | remove-appxpackage&lt;/p&gt;
&lt;p&gt;get-appxpackage &lt;em&gt;3dbuilder&lt;/em&gt; | remove-appxpackage&lt;/p&gt;
&lt;p&gt;Get-AppxPackage &lt;em&gt;drawboardpdf&lt;/em&gt; | Remove-AppxPackage&lt;/p&gt;
&lt;p&gt;Get-AppxPackage &lt;em&gt;freshpaint&lt;/em&gt; | Remove-AppxPackage&lt;/p&gt;
&lt;p&gt;Get-AppxPackage &lt;em&gt;nytcrossword&lt;/em&gt; | Remove-AppxPackage&lt;/p&gt;
&lt;p&gt;Get-AppxPackage &lt;em&gt;microsoft.xboxapp&lt;/em&gt; | Remove-AppxPackage&lt;/p&gt;
&lt;p&gt;Get-AppxPackage &lt;em&gt;SurfaceHub&lt;/em&gt; | Remove-AppxPackage&lt;/p&gt;
&lt;p&gt;Get-AppxPackage &lt;em&gt;flipboard&lt;/em&gt; | Remove-AppxPackage&lt;/p&gt;


&lt;p&gt;(from &lt;a href="https://www.reddit.com/r/pcmasterrace/comments/736tfh/skype_is_officially_bloatware_uninstalled_it/"&gt;source&lt;/a&gt;)&lt;/p&gt;
&lt;/div&gt;</description></item>
<item><title>New Vim Course Online - Vim Hates You</title><link>https://osherove.com/blog/2017/4/20/new-vim-course-online-vim-hates-you.html</link><guid>https://osherove.com/blog/2017/4/20/new-vim-course-online-vim-hates-you.html</guid><pubDate>Thu, 20 Apr 2017 06:08:44 GMT</pubDate><description>&lt;div&gt;&lt;p&gt;I’ve added a new course to http://courses.osherove.com - This time it’s all about Vim, which I’ve been using for a few good years now. &lt;/p&gt;

&lt;p&gt;&lt;figure class="video" data-embed="https://www.youtube-nocookie.com/embed/oOKfu5OPlFs?autoplay=1"&gt;&lt;a class="video-link" href="https://www.youtube.com/watch?v=oOKfu5OPlFs"&gt;&lt;img alt="" decoding="async" loading="lazy" src="/img/video/yt-oOKfu5OPlFs.jpg"/&gt;&lt;span class="video-play"&gt;Play video&lt;/span&gt;&lt;span class="video-title"&gt;Vim Hates You&lt;/span&gt;&lt;/a&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://vimhatesyou.com"&gt;You can check out my online Vim course at http://VimHatesYou.com &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Or you can go directly to the course page at http://courses.osherove.com/p/vim-hates-you&lt;/p&gt;&lt;/div&gt;</description></item>
<item><title>Enterprise DevOps</title><link>https://osherove.com/blog/2016/10/29/enterprise-devops.html</link><guid>https://osherove.com/blog/2016/10/29/enterprise-devops.html</guid><pubDate>Sat, 29 Oct 2016 17:01:07 GMT</pubDate><description>&lt;div&gt;&lt;p&gt;As part of my work in the past few years I’ve been more and more deeply involved in large scale DevOps implemementations in very large companies. I’m now writing about my experiences in here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Main website: &lt;a href="https://pipelinedriven.org/enterprise-devops"&gt;enterprisedevops.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
Some of the latest posts include:&lt;br/&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pipelinedriven.org/article/what-is-enterprise-devops"&gt;What is Enterprise DevOps?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
And about DevOps metrics:&lt;br/&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pipelinedriven.org/article/devops-metric-definition-mean-time-to-change-mttc-vs-change-lead-time"&gt;Mean time to change&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pipelinedriven.org/article/devops-metric-mean-time-to-recovery-mttr-definition-and-reasoning"&gt;Mean time to recovery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pipelinedriven.org/article/devops-metric-frequency-of-releases-definition"&gt;Frequency of Release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pipelinedriven.org/article/devops-metric-amount-of-defects-and-issues-definition"&gt;Defect Rate&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description></item>
<item><title>Code as Music - Test Environments</title><link>https://osherove.com/blog/2016/8/18/code-as-music-test-environments.html</link><guid>https://osherove.com/blog/2016/8/18/code-as-music-test-environments.html</guid><pubDate>Wed, 17 Aug 2016 23:11:38 GMT</pubDate><description>&lt;p&gt;Music Production also has some corollaries with coding in terms of testing.&lt;/p&gt;&lt;p&gt;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,  in a club speaker system etc.&lt;/p&gt;&lt;p&gt;In that regard priducing the music locally on yoru own speakers is much like “works on my machine”.&lt;/p&gt;&lt;p&gt;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.&lt;/p&gt;&lt;p&gt;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.&lt;/p&gt;&lt;p&gt;Nothing beats real work integration testing though. Much like code.&lt;/p&gt;</description></item>
<item><title>Music Production vs. Code Production</title><link>https://osherove.com/blog/2015/12/21/music-production-vs-code-production.html</link><guid>https://osherove.com/blog/2015/12/21/music-production-vs-code-production.html</guid><pubDate>Mon, 21 Dec 2015 17:40:34 GMT</pubDate><description>&lt;p&gt;My off hours hobby is music production.&lt;/p&gt;&lt;p&gt;Here are similarities I see between coding and music production so far:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Code &lt;strong&gt;compiles&lt;/strong&gt; into binary - midi is rendered into wav files&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;When producing music you need to take &lt;strong&gt;many breaks &lt;/strong&gt;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.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Software culture is moving in the direction of&lt;strong&gt; automation and factories,&lt;/strong&gt; 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)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pair-Programming&lt;/strong&gt; - &amp;gt; most new music these days is not done alone: there are lyric writing teams, melodic writing teams, production teams.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;in Music, new &lt;strong&gt;digital tooling&lt;/strong&gt; 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.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Long term support&lt;/strong&gt;: 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.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;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)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;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.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;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.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;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.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;There’s more but my head is drawn a blank..&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;</description></item>
<item><title>Two new Online Courses: Effective Total Command and FinalBuilder Training Videos</title><link>https://osherove.com/blog/2015/1/30/two-new-online-courses-effective-total-command-and-finalbuil.html</link><guid>https://osherove.com/blog/2015/1/30/two-new-online-courses-effective-total-command-and-finalbuil.html</guid><pubDate>Fri, 30 Jan 2015 06:50:30 GMT</pubDate><description>&lt;div&gt;&lt;p&gt;I’m happy to report two new video courses that I just finished recording and publishing two new courses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automating All the Things with FinalBuilder&lt;/li&gt;
&lt;li&gt;Commanding Total Commander&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both of these are tools that I rave about in almost any new windows based dev shop I go to. Most people have at least heard of Total Commander, but never bothered to find out why people like it, even though it looks ugly. But almost nobody heard about FinalBuilder, but those that did, always have this small glitter in their eye, because they know what I mean when I say you can automate pretty much 99% of your problems away with this stuff.&lt;/p&gt;
&lt;p&gt;Both of these together (coupled with &lt;a href="http://voidtools.com"&gt;everything search engine &lt;/a&gt;and &lt;a href="https://technet.microsoft.com/en-us/sysinternals/bb842062.aspx"&gt;systeinternals tools&lt;/a&gt;) are a godsend to anyone who hates repeating themselves. &lt;/p&gt;
&lt;p&gt;I hope you find these courses helpful. &lt;/p&gt;&lt;/div&gt;</description></item>
<item><title>What's new and Changed in the Art of Unit Testing 2nd Edition</title><link>https://osherove.com/blog/2014/10/25/whats-new-and-changed-in-the-art-of-unit-testing-2nd-edition.html</link><guid>https://osherove.com/blog/2014/10/25/whats-new-and-changed-in-the-art-of-unit-testing-2nd-edition.html</guid><pubDate>Sat, 25 Oct 2014 16:38:15 GMT</pubDate><category>Unit Testing</category><description>&lt;div&gt;&lt;div id="_mcePaste"&gt;I still get called out for some things I wrote in the first edition published in 2009. Some people might not be aware there is a 2nd edition out there, or are borrowing old copies. Lots has changed in my thinking about unit testing practices since then and was reflected when the 2nd edition was published in 2013.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;In &lt;a href="http://manning.com/osherove2"&gt;this second edition&lt;/a&gt;, I added:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Material about constrained versus unconstrained isolation frameworks : specifically those that can fake things like statics and priavte methods.&lt;/li&gt;
&lt;li&gt;A new chapter 6 on what makes for a good isolation framework and how frameworks like Typemock work under the covers. &lt;/li&gt;
&lt;li&gt;I no longer use RhinoMocks. Stay away from it. It is dead. At least for now. I use NSubstitute for examples of Isolation Framework Basics, and I also highly recommend FakeItEasy. I am still not crazy about MOQ, for reasons detailed in chapter 6.&lt;/li&gt;
&lt;li&gt;I added more techniques to the chapter about implementing unit testing at the organizational level, such as &lt;a href="http://www.slideshare.net/royosherove/organizational-influencehacks45min"&gt;understanding influence factors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;There are plenty of &lt;em&gt;design changes&lt;/em&gt; in the code I show in the book:&lt;/li&gt;
&lt;li&gt;Mostly I stopped using property setters and am mostly using constructor injection. &lt;/li&gt;
&lt;li&gt;Some discussion of SOLID principles is added, but just enough to make it whet your appetite on the subject.&lt;/li&gt;
&lt;li&gt;The build related sections of chapter 7 also contain new information. I learned a lot since the first book about build automation and patterns. &lt;a href="http://beautifulbuilds.com"&gt;It’s the topic of my next book&lt;/a&gt;. In this book I talk about build pipelines and where unit testing fits in the process.&lt;/li&gt;
&lt;li&gt;I recommend against setup methods, and give alternative ideas on getting the same functionality out of your tests. &lt;/li&gt;
&lt;li&gt;I also use newer versions of Nunit so some of the newer Nunit APIs changed in the book( Assert.thorws. vs Assert.Catch, TestCase attributes and more)&lt;/li&gt;
&lt;li&gt;In chapter 10, the tools relating to legacy code were updated.&lt;/li&gt;
&lt;li&gt;Having worked with Ruby for the past three years along side .NET, I gained more perspective about design and testability arguments, reflected in chapter 11, dedicated only to this topic.&lt;/li&gt;
&lt;li&gt;The tools and frameworks appendix was updated with new tools, and old tools were removed.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;Also, here is a talk I did about it:&lt;/p&gt;
&lt;p&gt;&lt;iframe allowfullscreen="" class="embed" frameborder="0" height="355" loading="lazy" scrolling="no" src="https://www.slideshare.net/slideshow/embed_code/16957770" width="425"&gt; &lt;/iframe&gt;&lt;/p&gt;
&lt;div&gt;&lt;strong&gt; &lt;a href="https://www.slideshare.net/royosherove/talk-2ndlookunittesting-copy" title="A Second Look at Unit Testing by Roy Osherove"&gt;A Second Look at Unit Testing by Roy Osherove&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href="https://www.slideshare.net/royosherove"&gt;Roy Osherove&lt;/a&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;/div&gt;</description></item>
<item><title>Why The Hell did you move to New Jersey, Roy?</title><link>https://osherove.com/blog/2014/10/7/why-the-hell-did-you-move-to-new-jersey-roy.html</link><guid>https://osherove.com/blog/2014/10/7/why-the-hell-did-you-move-to-new-jersey-roy.html</guid><pubDate>Tue, 07 Oct 2014 00:57:36 GMT</pubDate><description>&lt;div&gt;&lt;p&gt;After two years in amazing Norway, our&lt;a href="http://whythefuckdidyoumovetonorway.com"&gt; Scandinavian adventure &lt;/a&gt;has been transformed into what I can only call so far as “The New Jersey Experience”. I’m here on an &lt;a href="http://en.wikipedia.org/wiki/O_visa"&gt;O-1 visa&lt;/a&gt;. I’m also open to doing part time training courses in the area &lt;a href="/contact"&gt;so contact me&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The three little boys, my wife and me moved to Tenafly, home of many other Israelis, to stay 20 minutes away from New York City (baby), in a nice and quiet place with (supposedly) good education for the kids.&lt;/p&gt;
&lt;h3&gt;Things we missed in Norway that we can easily find here include, but are not limited to:&lt;span&gt; &lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Hummus&lt;/li&gt;
&lt;li&gt;Places open after 7pm&lt;/li&gt;
&lt;li&gt;Actual Tasty Cereal&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Things we miss from Norway now that we’re in the US:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Our wonderful Oslo International School. School here is very strict: just 22 minutes of break a day for a 5 and 7 year old are basically torture.&lt;/li&gt;
&lt;li&gt;Law and order&lt;/li&gt;
&lt;li&gt;Paying 50$ for a pizza&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Things I plan to pursue while I’m here&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Leading awesome technological teams, flow and architectures&lt;/li&gt;
&lt;li&gt;Training on the side&lt;/li&gt;
&lt;li&gt; Try my hand at some stand up comedy open mics&lt;/li&gt;
&lt;li&gt;Work on making some &lt;a href="https://soundcloud.com/royosherove/i-give-her-all-my-love-remix"&gt;electronic music&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Work on making more online courses (vim is coming!)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;So, why?&lt;/h3&gt;
&lt;p&gt;We couldn’t think of a place more different than Norway, where we will learn things we didn’t even know we didn’t know. &lt;a href="http://onehundredacorns.wordpress.com/2014/06/10/embrace-ravines-and-get-out-of-your-comfort-zone/"&gt;It’s all about ravines&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Let the games begin!&lt;/p&gt;
&lt;/div&gt;</description></item>
<item><title>New Online Course: Beautiful Builds and Continuous Delivery Patterns</title><link>https://osherove.com/blog/2014/7/11/new-online-course-beautiful-builds-and-continuous-delivery-p.html</link><guid>https://osherove.com/blog/2014/7/11/new-online-course-beautiful-builds-and-continuous-delivery-p.html</guid><pubDate>Fri, 11 Jul 2014 08:31:13 GMT</pubDate><description>&lt;div&gt;
&lt;p&gt;I somehow forgot to blog about this, but it’s never too late. My new&lt;a href="http://buildcourse.osherove.com"&gt; online course Beautiful Builds and Continuous Delivery patterns is now available&lt;/a&gt; and is $25 until the end of this month (July).&lt;/p&gt;
&lt;p&gt;Here’s the course description:&lt;/p&gt;
&lt;p&gt;Ah, &lt;em&gt;Continuous Delivery&lt;/em&gt;. Everybody and their sister are talking about it, but in real life, nothing is ever as simple as listening to a conference talk about it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Can you really deploy 20 times a day if you QA department is breathing down your neck that they are using the staging server between 9 and 5?&lt;/li&gt;
&lt;li&gt;Are the teams waiting for each other to finish their work , creating bottlenecks?&lt;/li&gt;
&lt;li&gt;Is security threatening to have you fired for even suggesting you deploy to production?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this course Roy Osherove, author of the books “&lt;a href="https://leanpub.com/build"&gt;Beautiful Builds&lt;/a&gt;” (still in progress, actually) and “&lt;a href="http://artofunittesting.com/"&gt;The Art of Unit Testing&lt;/a&gt;”, discusses common problems and solutions (patterns!) during build automation and continuous delivery.&lt;/p&gt;
&lt;p&gt;We start from the basics, defining the differences between automated builds and CI, separation of concerns in build management, and then move on to more advanced things such as making builds faster using artifacts, solving versioning issues with snapshots, cross-team dependencies, and much more.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All videos are both streamable AND downloadable to watch offline, no DRM.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;More info at &lt;a href="http://beautifulbuilds.com/"&gt;beautifulbuilds.com.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;</description></item>
<item><title>Should you write unit tests or integration tests?</title><link>https://osherove.com/blog/2014/7/11/should-you-write-unit-tests-or-integration-tests.html</link><guid>https://osherove.com/blog/2014/7/11/should-you-write-unit-tests-or-integration-tests.html</guid><pubDate>Fri, 11 Jul 2014 08:22:51 GMT</pubDate><category>Unit Testing</category><description>&lt;div&gt;&lt;p&gt;I got this question in the mail. I thought it was quite valid for many other people:&lt;/p&gt;
&lt;h3&gt;Question:&lt;/h3&gt;

&lt;div&gt;
&lt;div&gt;Trying to promote unit tests in a new work place: the “search” action from the UI goes through IOC container which calls a WCF service, where the search itself is done using entity framework auto generated code.&lt;/div&gt;
My colleague claims that due to the multiple dependencies, it doesn’t make sense to fake everything when running the unit test, and it makes more sense to do integration tests in this case.&lt;/div&gt;
&lt;p&gt;&lt;span&gt;Is my hunch correct? Should I put efforts into implementing unit tests in this complex scenario?&lt;/span&gt;&lt;/p&gt;

&lt;h3&gt;My Answer:&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;You can go either way.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;It really depends on time tradeoffs&lt;/div&gt;
&lt;div&gt;&lt;ol&gt;
&lt;li&gt;How long will it take to write the tests? For integration tests you will have to wait until the whole system is complete to get the tests even failing, unless you start from a webpage, and then they will fail for as long as the entire system of layers is not built.&lt;/li&gt;
&lt;li&gt;How long does it take to run and get feedback? integration tests take longer to run usually. and are more complicated to setup. But when they pass you get a good sense of confidence that all the parts work nicely with each other. with unit tests you will get faster feedback, but you will still need those integration tests for full system confidence. On the other hand with integration tests and no unit tests the developers will have to wait in long cycles before they know if they broke something.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;There is no one answer. I usually do a mix of both. For web systems I might even start with acceptance tests that fail, and then fill the system slowly with unit tests for parts of the features with more focused functionality. &lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;I guess you can change the question to : &lt;strong&gt;What type of tests should we write FIRST?&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;Only you know that. it changes for every project and system.&lt;/div&gt;
&lt;/div&gt;</description></item>
<item><title>Why I stopped selling courses on udemy</title><link>https://osherove.com/blog/2014/5/7/why-i-stopped-selling-courses-on-udemy.html</link><guid>https://osherove.com/blog/2014/5/7/why-i-stopped-selling-courses-on-udemy.html</guid><pubDate>Wed, 07 May 2014 20:36:55 GMT</pubDate><description>&lt;h3&gt;The Udemy Pyramid Scheme.&lt;/h3&gt;&lt;p&gt;I’ve run several successfull courses on &lt;a href="http://udemy.com"&gt;udemy&lt;/a&gt;  (update: I’ve moved my courses over here now) back when they had a royalty rate of 90% revenue share per course.   Then things started to change, to the point where teaching in udemy to me feels like trying to win in a pyramid scheme. &lt;/p&gt;&lt;p&gt;Here are the “new” revenue share model numbers:&lt;/p&gt;&lt;p&gt;&lt;a href="http://support.udemy.com/knowledgebase/articles/277758-instructor-revenue-share"&gt;http://support.udemy.com/knowledgebase/articles/277758-instructor-revenue-share&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Quoting:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt; 100% revenue share on students that instructors bring to Udemy&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt; 50% revenue share on students that Udemy brings to an instructor’s course&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;25% revenue share on students that are driven by Udemy paid ads&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;end quote.&lt;/p&gt;&lt;p&gt;Seems fair. Until you realize, the hard way, that any exiting udemy user that takes your courses that YOU didn’t bring in with your specific course codes and discounts, counts as a 50% revenue share.&lt;/p&gt;&lt;h3&gt;Points of consideration:&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;There is a finite number of people who might be interested in your course&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;There is a high chance that many of them have already signed up for udemy&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Of those who haven’t yet signed up to udemy, you have to bring in and make them use you special offer codes. Only then do you get 100% of that course’s revenue.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Once you did that, you basically screwed over other course instructors, because your student will now and forever be considered a 50% revenue share for all other teachers.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;That means that I benefit and make money at the large expense of other teachers on udemy, while making udemy much, MUCH more money in the long run.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The earlier I started with my courses on udemy, the more chances I have to get into udemy those users who have not signed up to udemy yet. The later i sign on to teach in udemy, the smaller my chances are ever making more than 50% revenue share, unless I bring my own crowd.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Consider this: for each student on udemy, udemy makes 50% commission on all their purchases, EXCEPT one instructor.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Eventually, there will be less and less chances for ALL instructors ot make ore than 50% revenue on courses, as the student population targeted has already signed up. any students that UDEMY brings to the table with ads, will actually only get you 25% revenue share.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;This whole idea pits the teachers one against the other, to see who gets &amp;amp;quot;fresh&amp;amp;quot; users first, thus taking them “away” from other teachers. That’s not healthy.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;So I opened &lt;a href="http://shop.osherove.com"&gt;my own shop &lt;/a&gt;on shopify and the later moved it to teachable and at least now I don’t feel like I’m screwing over anybody else. At shopify I paid more than 100$ a month for some of the plugins etc. At teachable the terms are closer to a 80-20 share. But I do have enough people on twitter and I’m well known enough in some corners that it pays me OK.  I don’t like doing it, but it feels better. If they went back to the old model I’d probably go back to them, honestly.&lt;/p&gt;&lt;h3&gt;When udemy sent me an email asking why I haven’t been selling any courses, here was my answer:&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;“Hi Roy,&lt;/p&gt;&lt;p&gt;I saw that you drove almost $4,000 to your Udemy courses between Nov-Dec 2013 with instructor coupon codes and haven’t driven any additional income since then. I just wanted to send you a note to find out what we can improve to help you continue building your business on Udemy.&lt;/p&gt;&lt;p&gt;Would you mind providing a little insight?&lt;/p&gt;&lt;p&gt;1) How did you drive your initial Udemy course sales?&lt;/p&gt;&lt;p&gt;2) Why did you stop promoting your Udemy courses?&lt;/p&gt;&lt;p&gt;3) What do you need to restart promoting your courses?&lt;/p&gt;&lt;p&gt;I appreciate any feedback you can provide! And if you’d like to schedule time to chat, I’m available. Just let me know. :)&lt;/p&gt;&lt;p&gt;Regards,….“&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;My answer:&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;“I stopped because your new royalty model (50% if existing user) is basically a pyramid scam. And it feels unfair. By bringing in new users I make sure I get more royalties, but I also screw the royalties for other authors. Also, there is a limited number of people who are interested in a specific subject, so only early risers will get their full royalty. It feels wrong. I was very happy with the previous model of a flat rate royalty, but this one has me looking for alternatives. “&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt; Needless to say, they didn’t reply yet. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;I would recommend that you stay away from teaching on udemy. it feels unethical.&lt;/strong&gt;&lt;/p&gt;</description></item>
<item><title>Photo and Video Backup Strategy: Why I am not likely to ever lose my family photos and videos from the last 10 years in the next 10 years.</title><link>https://osherove.com/blog/2014/1/28/photo-and-video-backup-strategy-why-i-am-not-likely-to-ever.html</link><guid>https://osherove.com/blog/2014/1/28/photo-and-video-backup-strategy-why-i-am-not-likely-to-ever.html</guid><pubDate>Tue, 28 Jan 2014 18:34:58 GMT</pubDate><description>&lt;div&gt;&lt;p&gt;Here is the way I backup my photos&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First I use dropbox for “immediate” backup of the last month&lt;/li&gt;
&lt;li&gt;Then I use PictureLife as a full backup and viewing service&lt;/li&gt;
&lt;li&gt;Then I use Amazon Glacier for “cold storage”&lt;/li&gt;
&lt;li&gt;For my stuff I sell I use Amazon S3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is my system.&lt;/p&gt;
&lt;h2&gt;Dropbox : First Line of Backup&lt;/h2&gt;
&lt;p&gt;My wife and I take most of our photos on our phones, so we have dropbox installed on our phone with automatic uploads. Every time we get to a wifi spot, the phone “calls home” to dropbox to upload the latest and gratest photos and family videos we have taken.&lt;/p&gt;
&lt;p&gt;I have my own dropbox account with 100 GB on it. My wife has a separate, free dropbox account.&lt;/p&gt;
&lt;p&gt;My wife has shared her “Camera Uploads” dropbox folder with me. She also has auto upload enabled.&lt;/p&gt;
&lt;p&gt;Dropbox also automatically supports multiple versions up to a point, for the same file, so even if we get our files encrypted by that awful virus, we can restore them by version. I hope.&lt;/p&gt;
&lt;h3&gt;Cost: $10 a month for the pro plan&lt;/h3&gt;
&lt;h2&gt;PictureLife: 2nd Line of Backup with Browsing&lt;/h2&gt;
&lt;p&gt;I pay for a standard picturelife plan, so I can always browse all our pics and videos on my phone, ipad and more. I chose picturelife because it supported videos. Lately other services have added that possibility as well.&lt;/p&gt;
&lt;p&gt;We have picturelife installed on all our family PCs and phones. On the PCs it is set to look for stuff in the camera uploads and the shared camera uploads folder from my wife. Yes, we upload the same pics multiple times, but picturelife seems to be mostly smart enough to tell if the same picture has been uploaded multiple times and keeps only a single copy. sometimes we get two *especially if we get any pictures from what’sApp. This is still not a solved problem..&lt;/p&gt;
&lt;p&gt;If we do take pictures with other camera, we just put the SD card in the laptop slot and let dropbox import everything into the camera uploads folder. From there everything gets synced to picturelife.&lt;/p&gt;
&lt;h3&gt;Cost: $15 a month for up to 300GB&lt;/h3&gt;

&lt;h2&gt;Glacier: Cold Storage&lt;/h2&gt;
&lt;p&gt;We have two “family computers: in the house. One of the main media center windows machine with 1TB hard drive on it, and it is connected to my dropbox account. That means it also gets all of mine and my my wife’s photos since she has a shared folder with me.&lt;/p&gt;
&lt;p&gt;Every one a month or two, I zip up al the files on that machine’s camera uploads and “camera uploads from my wife”’s folder and upload them to amazon glacier. the zip file is named with a date range for example jan24-feb25-2013.zip . Once the glacier upload is done (I use fastglacier for a speedy upload) I can safely delete the photos from dropbox, so that I do not pass the 100 GB limit (we have lots of videos).&lt;/p&gt;
&lt;p&gt;No virus will have access to those files.&lt;/p&gt;
&lt;p&gt;I also have a copy of all these files in two other glacier regions, just in case. the cost are extermly low. Much better than S3.&lt;/p&gt;
&lt;h3&gt;Cost: about $10 a month for around 300GB so far&lt;/h3&gt;
&lt;h2&gt;Amazon S3: Quick access for my work&lt;/h2&gt;
&lt;p&gt;I have all the video files for &lt;a href="http://skills.osherove.com/"&gt;all my courses&lt;/a&gt; backup to both S3 and Glacier. S3 is good because I host some of them for the blog and sometimes I need to get them to upload stuff to my shop. So I have two online backups for my large video files. S3 costs more, so I make sure to keep stuff there without the &lt;strong&gt;redundancy&lt;/strong&gt; options, which is much cheaper&lt;/p&gt;
&lt;h3&gt;I have LOTS of data on S3 so I get around $40 per month in costs..&lt;/h3&gt;

&lt;h2&gt;Final Words&lt;/h2&gt;
&lt;p&gt;I don’t rely on a single service to stay up. And I always have full access to everything from the last ten years.&lt;/p&gt;
&lt;h3&gt;Total cost for managing all my files ever:  $65-$75 a month.&lt;/h3&gt;
&lt;p&gt;Your costs might be $40 lower since you might not need S3 if you are not keeping professional grade work for quick retrieval.&lt;/p&gt;&lt;/div&gt;</description></item>
<item><title>Fifteen things I look for in an Isolation framework</title><link>https://osherove.com/blog/2013/11/23/fifteen-things-i-look-for-in-an-isolation-framework.html</link><guid>https://osherove.com/blog/2013/11/23/fifteen-things-i-look-for-in-an-isolation-framework.html</guid><pubDate>Sat, 23 Nov 2013 12:38:13 GMT</pubDate><description>&lt;div&gt;&lt;ol&gt;
&lt;li&gt;Is the framework strict or non strict by default? Hopefully non strict.&lt;/li&gt;
&lt;li&gt;Is everything called a mock? Hopefully not. a fake? mock/stub differentiation?&lt;/li&gt;
&lt;li&gt;Does it have recursive fakes? Hopefully.&lt;/li&gt;
&lt;li&gt;How good are the error messages?&lt;/li&gt;
&lt;li&gt;What is the test style? record replay?arrange-assert-act?  arrange-act-assert? hopefully the latter.&lt;/li&gt;
&lt;li&gt;How simple are the matchers for expected parameters to write? &lt;/li&gt;
&lt;li&gt;How easily can you create a mock logger that expects a string containing X at least once?&lt;/li&gt;
&lt;li&gt;How easily can you create a stub logger that simulates an exception, and a mock service that gets a message containing string if the logger throws. ([as specified here])&lt;/li&gt;
&lt;li&gt;Is the framework constrained or unconstrained? Important to know what it can and cannot do.&lt;/li&gt;
&lt;li&gt;Does stubbing a return value feel like setting an expectation? Hopefully not.&lt;/li&gt;
&lt;li&gt;When you verify - can you verify only a single specific call? hopefully. or do you have to verify all?&lt;/li&gt;
&lt;li&gt;Could you verify all if you wanted? hopefully not.&lt;/li&gt;
&lt;li&gt;Does the framework verify by default ? hopefully not.&lt;/li&gt;
&lt;li&gt;Does the framework encourage to verify all in the teardown? hopefully not.&lt;/li&gt;
&lt;li&gt;How easily can you verify you got an object with some properties or attributes?&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;</description></item>
<item><title>Looking for a new adventure and challenging work in 2014</title><link>https://osherove.com/blog/2013/10/20/looking-for-a-new-adventure-and-challenging-work-in-2014.html</link><guid>https://osherove.com/blog/2013/10/20/looking-for-a-new-adventure-and-challenging-work-in-2014.html</guid><pubDate>Sun, 20 Oct 2013 12:26:46 GMT</pubDate><description>&lt;div&gt;&lt;p&gt;&lt;span id="docs-internal-guid-67d14959-d5d4-872f-f97f-dcbfc2ed6937"&gt; &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;TLDR;&lt;/span&gt;&lt;/h2&gt;
&lt;p dir="ltr"&gt;If you think I would be useful to your company in the US or in Europe as an&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;Architect, Team Leader, Senior Developer, CTO, Trainer&lt;/strong&gt;&lt;strong&gt; or any other role&lt;/strong&gt; where I can make a real difference - maybe we can work together, starting around summer 2014. Due to visa issues we know this takes a while to get going, so we are starting the search early. &lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;a href="http://cv.osherove.com"&gt;&lt;span&gt;Here is my CV&lt;/span&gt;&lt;/a&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;I will be in the US (Omaha and New York) during November, and that would be a good time for me to drop by and interview with potential employers.&lt;/span&gt;&lt;span&gt;&lt;a href="/contact"&gt; Contact me.&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;More information:&lt;/span&gt;&lt;/h2&gt;

&lt;p dir="ltr"&gt;&lt;span&gt;In the summer of 2014 my family and me will have spent two years in Norway. It was always about the adventure, and now it’s time to move to a warmer place, and seek new adventure, while the kids are still young enough so that such a move will not be too much of a burden on them. &lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;I do love working at my current job at &lt;/span&gt;&lt;a href="http://www.itverket.no/"&gt;&lt;span&gt;ITVerket&lt;/span&gt;&lt;/a&gt;&lt;span&gt;, and the project is very rewarding and interesting, but my wife is going crazy not being able to find a job here (due to lack of Norwegian) and next year the international school costs here will just be too high for us.&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;So before the summer comes, I need a place to move to, with a job where I can make a difference.&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;I am looking for work opportunities in places &lt;/span&gt;&lt;span&gt;warmer&lt;/span&gt;&lt;span&gt; and &lt;/span&gt;&lt;span&gt;different&lt;/span&gt;&lt;span&gt; from Norway (not Israel. There’s always that option..).  The ideas is to move and live somewhere another two years, or maybe more if we can financially see it being worth it (financially, Norway was very challenging, to put it mildly).&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;If you think I would be useful to your company as an &lt;/span&gt;&lt;span&gt;Architect, Team Leader, Senior Developer, CTO&lt;/span&gt;&lt;span&gt; or any role where I can make a real difference - maybe we can work together.&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;&lt;a href="http://cv.osherove.com"&gt;Here is my CV&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;I will be in the US (Omaha and New York) during November, and that would be a good time for me to drop by and interview with potential employers.&lt;/span&gt;&lt;span&gt;&lt;a href="/contact"&gt; Contact me.&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;I do come with a package. I am married with three little boys. We currently live in Norway and that’s where we will be relocating from.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;Places we would love to move to:&lt;/span&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li dir="ltr"&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;US&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li dir="ltr"&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;Austin, TX&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li dir="ltr"&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;Miami&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li dir="ltr"&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;New York/NJ area&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li dir="ltr"&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;Other places with a thriving tech community and reasonably warm weather (My wife is tired of the norwegian winter we’re about to go through again).&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Austraila&lt;/li&gt;
&lt;li&gt;Canada&lt;/li&gt;
&lt;li dir="ltr"&gt;
&lt;p dir="ltr"&gt;&lt;span&gt; &lt;/span&gt;Vancouver (yeah, less warm, but we hear is a great place to live with a lively population)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li dir="ltr"&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;London&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li dir="ltr"&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;Again, not too warm, but I was there a couple of weeks ago and it looks like a great and lively place to work and live.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li dir="ltr"&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;France&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li dir="ltr"&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;Hawaii?&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Anywhere that feels like a Caribbean island&lt;/li&gt;
&lt;li&gt;Anywhere else that we should think of and did not!&lt;/li&gt;
&lt;/ul&gt;
&lt;p dir="ltr"&gt; &lt;/p&gt;
&lt;ul&gt;
&lt;/ul&gt;
&lt;p dir="ltr"&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;

&lt;p dir="ltr"&gt;&lt;span&gt;&lt;a href="/contact"&gt; Contact me.&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;/div&gt;
&lt;/div&gt;</description></item>
<item><title>$11,000</title><link>https://osherove.com/blog/2013/10/18/11000.html</link><guid>https://osherove.com/blog/2013/10/18/11000.html</guid><pubDate>Fri, 18 Oct 2013 13:34:52 GMT</pubDate><description>&lt;div&gt;&lt;p&gt;That is what I earned on my &lt;a href="https://leanpub.com/teamleader"&gt;book for software team leaders&lt;/a&gt; before it was even finished.&lt;/p&gt;
&lt;p&gt;This august I finished writing and publishing my first self-published book. Last month I got done adding a print and an audio edition of that book.&lt;/p&gt;
&lt;p&gt;So far, two months after finishing the book, I have netted almost $14,000 from the book in ebook, print and audio formats. It sold around 1,500 copies. That averages almost $10 per copy sold, and I sold more than half of them at a very large discount.&lt;/p&gt;
&lt;p&gt;It was an interesting experiment, and I would like others to know how I did it in a way that worked for me.&lt;/p&gt;
&lt;p&gt;I &lt;a href="http://artOfUnitTesting.com"&gt;previously wrote one other pretty successful&lt;/a&gt; (at least in the Microsoft niche) book about unit testing, through a “standard” publisher (Manning).&lt;/p&gt;
&lt;p&gt;In the next month, the second edition of my book with manning will appear, and I am looking at the numbers deciding whether the self publishing experiment was worth it. So far, it has.&lt;/p&gt;
&lt;p&gt;I can already say that I made more on my book before it came out, than I had made with a traditional publisher after 6 years. That is because with a traditional publisher you might end up getting 2-4$ per copy sold, once a quarter, while the way I sold it I got about 20$ for each copy, monthly.&lt;/p&gt;
&lt;h2&gt;A four year old blog&lt;/h2&gt;
&lt;p&gt;The work on the self published book started four years ago, with &lt;a href="http://5whys.com"&gt;a simple blog&lt;/a&gt; about the topics I cared about. Every time I had something to say to a team leader, I blogged it there. I knew I would then use the best ideas from my blog in an eventual book.&lt;/p&gt;
&lt;p&gt;This process keeps repeating for me. My &lt;a href="https://www.amazon.com/exec/obidos/ASIN/1933988274/iserializable-20"&gt;first book&lt;/a&gt; was based on a &lt;a href="/blog"&gt;blog started five years earlier&lt;/a&gt;. And I am planning another &lt;a href="http://speakernotes.org"&gt;book about a different topic&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;ISBN:&lt;/h3&gt;
&lt;p&gt;AN ISBN can be costly if you live in the US. But &lt;a href="http://whyTheFuckDidYouMoveToNorway.com"&gt;I live in Norway&lt;/a&gt;. So that`s free. You just ask nicely by email. I also made my publisher name “Team Agile Publishing” registered in Norway. Free too.&lt;/p&gt;
&lt;div&gt;&lt;/div&gt;

&lt;p&gt;&lt;span&gt;Ebook:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;So what does an author with a passion for agility and lean thinking do when they write a book? They look for a way to write a book the same way.&lt;/p&gt;
&lt;p&gt;I used &lt;a href="https://leanpub.com"&gt;Leanpub.com&lt;/a&gt; to write my book and actually start selling it before it was done.&lt;/p&gt;
&lt;p&gt;In fact, one nice feature you can do with that site is that you can declare you want to write a book, write out a description, and ask people to check it out. Visitors can mark on the page what they would have paid for such a book, and that can help you gauge whether you might make any money writing that book. It is pure lean market research, but you still have to get the people into that page, which is where my blog and twitter came in handy.&lt;/p&gt;
&lt;p&gt;When I started writing it, I published a couple of chapters and immediately declared it available for sale. Yes, there were typos, and grammar issues. But I believe in deploying less than perfect and see what sticks, because that gives me a motive to keep working at something and make it better.&lt;/p&gt;
&lt;p&gt;Because I could change the price whenever I wanted immediately, I started off selling the book for 3$, with the leanpub promise that purchasers always get the latest versions of the book as I update them on leanpub. That means early adopters will end up with the full book for 3$.&lt;/p&gt;
&lt;p&gt;The more chapters I added, the more I added to the price.&lt;/p&gt;
&lt;p&gt;Most the money from the book was made before it was even published. I was able to do this because I have amassed a bit of an audience through my long time blog and previous book. That means about 8,000 RSS blog readers and 10,000+ twitter followers that knew about my book while I was writing it.&lt;/p&gt;
&lt;p&gt;While writing it, I also continuously wrote a blog about the ideas in that book at &lt;a href="http://5whys.com"&gt;5whys.com&lt;/a&gt; . &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Profit from Leanpub so far:  13,890$&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/s/files/WindowsLiveWriter-eac5b6fcce09_D9F7.png"&gt;&lt;img alt="image" decoding="async" height="224" loading="lazy" src="/img/sq/03286897-WindowsLiveWriter-eac5b6fcce09_D9F7.png" title="image" width="244"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Editing&lt;/h2&gt;
&lt;p&gt;For copyediting, proofing and spelling I used a combination of people I know from the publishing industry, which I paid to with paypal, and asking the readers of my blog to be beta reviewers of the book in exchange for a free copy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cost of editing: about 250$ &lt;/strong&gt;if you do not count about 200 free copies given away.&lt;/p&gt;

&lt;h2&gt;Book Cover&lt;/h2&gt;
&lt;p&gt;To design the cover of the book I used &lt;a href="http://99designs.com"&gt;99designs.com&lt;/a&gt; and was quite happy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Design cost? about 350$&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;After designing several covers there, I would recommend opening contests for $500 or more so that you get the really top tier designers there interested. &lt;a href="https://leanpub.com/wtfnorway"&gt;Here is  a great cover I got for that price&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Amazon:&lt;/h2&gt;
&lt;p&gt;When my book was done I published it &lt;a href="https://www.amazon.com/gp/product/B00EP03O5Y?ie=UTF8&amp;amp;camp=213733&amp;amp;creative=393177&amp;amp;creativeASIN=B00EP03O5Y&amp;amp;linkCode=shr&amp;amp;tag=iserializable-20&amp;amp;sr=1-1-catcorr&amp;amp;qid=1381181101"&gt;on amazon kindle&lt;/a&gt; (LeanPub generates a file you can just upload) through the KDP program.&lt;/p&gt;

&lt;h2&gt;Audio Book:&lt;/h2&gt;
&lt;p&gt;I first tried to record the audio book on my own. I felt like I could do it because I do a lot of speaking, but it was just not cutting it. &lt;a href="http://voices.com"&gt;So I went on voices.com&lt;/a&gt; and found within a day the narrator I wanted (&lt;a href="http://nostalgicvoice.com/"&gt;Gorde Edland&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Gorde also formatted the mp3 files and I ended up making the itunes file  using &lt;a href="http://www.splasm.com/audiobookbuilder/"&gt;AudioBook Builder&lt;/a&gt; &lt;strong&gt;(cost: 5$)&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;I then published the audio book first on &lt;a href="http://gum.co/TeamLeader"&gt;gumroad.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Narration and production Cost? 1650$ &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Profit so far: 1679$&lt;/strong&gt;      since august 17th: &lt;strong&gt;cost repaid in two months&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/s/files/WindowsLiveWriter-eac5b6fcce09_D9F7-1.png"&gt;&lt;img alt="image" decoding="async" height="58" loading="lazy" src="/img/sq/03288387-WindowsLiveWriter-eac5b6fcce09_D9F7.png" title="image" width="549"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I then tried to find a way to put &lt;a href="http://www.audible.com/pd/Science-Technology/Notes-to-a-Software-Team-Leader-Audiobook/B00FASCIVG/ref=sr_1_1?qid=1382122673&amp;amp;sr=1-1"&gt;the book on Audible.com&lt;/a&gt;. That is NOT an easy task if you live outside the United states and do not have at least five audio books to sell.&lt;/p&gt;
&lt;p&gt;Turns out you can find, here and there, publishers that will do audible distribution for you, and only take a small cut of sales.&lt;/p&gt;
&lt;p&gt;I tried going through &lt;a href="http://vook.com/"&gt;vook.com&lt;/a&gt; and a couple of other places but ended up choosing &lt;a href="http://spokenwordinc.com/books/"&gt;Spoken Word&lt;/a&gt;. They were the quickest to return my email and I did not need all the marketing extra work that vook offered.&lt;/p&gt;
&lt;p&gt;I still do not have any numbers on how much audible sold. It takes at least three-four months to find out, and then another month to get money from that. That sucks. But any money I make on the audio book now is “free money”.&lt;/p&gt;

&lt;h2&gt;Print Book:&lt;/h2&gt;
&lt;p&gt;I chose &lt;a href="http://createspace.com"&gt;CreateSpace.com&lt;/a&gt; to print the book and have &lt;a href="https://www.amazon.com/gp/product/829993320X?ie=UTF8&amp;amp;camp=213733&amp;amp;creative=393177&amp;amp;creativeASIN=829993320X&amp;amp;linkCode=shr&amp;amp;tag=iserializable-20&amp;amp;qid=1381181101&amp;amp;sr=1-1-catcorr"&gt;a print edition available on amazon&lt;/a&gt;. so far the reports show 10 print copies being sold (I still have not emailed my mailing list of several thousands that the print book exists).&lt;/p&gt;
&lt;p&gt;To layout the book cover for createspace &lt;strong&gt;cost me about 50$ &lt;/strong&gt;through a contact I made in the book business&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;to try out and ship to me a couple of proofs of the final print cost me less than 25$&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Profit so far: About 130$&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/s/files/WindowsLiveWriter-eac5b6fcce09_D9F7-2.png"&gt;&lt;img alt="image" decoding="async" height="94" loading="lazy" src="/img/sq/03289067-WindowsLiveWriter-eac5b6fcce09_D9F7.png" title="image" width="244"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Marketing&lt;/h2&gt;
&lt;p&gt;I do very little marketing, and it is mostly on my blog and twitter, in the form of sidebar links from my various websites.&lt;/p&gt;
&lt;p&gt;I pay &lt;strong&gt;13$&lt;/strong&gt; a month to &lt;a href="http://hellobar.com"&gt;hellobar.com&lt;/a&gt; for the top bar of this website which I can easily change and applies to all my other websites as well.&lt;/p&gt;
&lt;p&gt;I am now experimenting with facebook ads for the book. it cost me less than 10$ to get about 35 clicks and about 3 sales of the book after two days of that starting out. Still playing with that.&lt;/p&gt;
&lt;p&gt;I use &lt;a href="http://madmimi.com"&gt;madmimi.com&lt;/a&gt; to maintain an email list of people interested, which I got for free because I used to work there.&lt;/p&gt;

&lt;h2&gt;Overall :&lt;/h2&gt;
&lt;p&gt;net profit of $13,815 within two months of book publishing in a niche area.&lt;/p&gt;
&lt;p&gt;&lt;a href="/s/files/WindowsLiveWriter-eac5b6fcce09_D9F7-3.png"&gt;&lt;img alt="image" decoding="async" height="153" loading="lazy" src="/img/sq/03291047-WindowsLiveWriter-eac5b6fcce09_D9F7.png" title="image" width="244"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</description></item>
</channel></rss>
