<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Taylor R Price</title>
    <description>The latest articles on DEV Community by Taylor R Price (@trpricesoftware).</description>
    <link>https://dev.to/trpricesoftware</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F273261%2F22dc04bd-bf1c-4a5f-bc69-f200c36667ce.jpg</url>
      <title>DEV Community: Taylor R Price</title>
      <link>https://dev.to/trpricesoftware</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/trpricesoftware"/>
    <language>en</language>
    <item>
      <title>Git Stash - A Quick Primer</title>
      <dc:creator>Taylor R Price</dc:creator>
      <pubDate>Thu, 20 Apr 2023 17:08:31 +0000</pubDate>
      <link>https://dev.to/trpricesoftware/git-stash-a-quick-primer-2mbb</link>
      <guid>https://dev.to/trpricesoftware/git-stash-a-quick-primer-2mbb</guid>
      <description>&lt;p&gt;&lt;em&gt;This was originally posted on my &lt;a href="https://blog.taylorbuiltsolutions.com/"&gt;blog&lt;/a&gt; and is being &lt;a href="https://blog.taylorbuiltsolutions.com/git-stash-quick-primer/"&gt;re-posted&lt;/a&gt; here for reach. Please share it and let me know if you liked it or have any questions!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Interruptions are fairly common when working on a large project. Heck they’re even common for me when I’m working by myself. For me these interruptions often come in the form of: Please switch to working on this other thing. What happens when this comes at a point that I'm not ready to commit? git stash to the rescue! Just as the name indicates git stash allows changes to be stashed away for later use. Once the changes have been saved the source tree is returned to the state of the latest commit. At this point I can work on the other set of necessary changes. When I'm ready to come back to the changes I stashed I can simply pull them out of the stash using git stash pop and continue my work.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR - What are the commands I need to know for git stash?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;git stash&lt;/code&gt; - This will store your current changes and clean your working directory. This is the same as git stash push&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git stash -m &amp;lt;message&amp;gt;&lt;/code&gt; - Same as above but attach the message to the stash instead of the commit ID&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git stash list&lt;/code&gt; - Show the list of stashes for this repository&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git stash apply &amp;lt;stash id&amp;gt;&lt;/code&gt; - Apply the changes from the stash and leave the stash in the list  of stashes.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git stash pop &amp;lt;stash id&amp;gt;&lt;/code&gt; - Same as apply but remove the stash from the list&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git stash drop &amp;lt;stash id&amp;gt;&lt;/code&gt; - Delete the stash from the list&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While there are more options available for &lt;code&gt;git stash&lt;/code&gt; this list contains the majority of what is needed for normal usage. The &lt;a href="//git-scm.com/docs/git-stash"&gt;documentation&lt;/a&gt; shows the full list of options for git stash.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's see some examples
&lt;/h2&gt;

&lt;p&gt;I've created a simple repository with a single file to show some examples of how to use git stash. Here I've got a change to the file ready to be staged or stashed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KwuHNPNO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4xxc3xyafhy3znew7b3b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KwuHNPNO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4xxc3xyafhy3znew7b3b.png" alt="Git status showing a single change made." width="514" height="156"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next screen shot shows using &lt;code&gt;git stash&lt;/code&gt; without any arguments. You'll see that the default comment will be a portion of the commit id and the commit message.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tclk_BgG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oa2133hw20hviorjxebk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tclk_BgG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oa2133hw20hviorjxebk.png" alt="git stash command" width="551" height="67"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the output of &lt;code&gt;git stash list&lt;/code&gt; showing a single stash with its stash id and the default comment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xeTHBZko--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vpr7pbla7bwurmraccll.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xeTHBZko--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vpr7pbla7bwurmraccll.png" alt="git stash list output showing a single stash." width="800" height="108"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If only the previous commit message is present it doesn't reflect the actual changes that were made and stashed. It would be better to have a message that reflects the changes made and the reason for stashing them. Here we can see an example of stashing a change with a message.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ftcPOSUO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x6qhtpqiwt81tsrs64cw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ftcPOSUO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x6qhtpqiwt81tsrs64cw.png" alt="Git status showing a change and stashing the change with a message." width="533" height="214"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we can see there is a second commit and that it has been pushed on to the top of the list. Notice that our initial commit that was originally stash@{0} is now stash@{1}. The change we just stashed has taken its place in position 0.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ano5TcoI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p2nj4kmaxv0aqwym3plq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ano5TcoI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p2nj4kmaxv0aqwym3plq.png" alt="Stash list showing two stashes." width="789" height="102"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you were to run &lt;code&gt;git stash pop&lt;/code&gt; you would get the changes that we just committed. What if, however you'd like to start working on a set of changes that aren't at the top of the list? That's as simple as calling &lt;code&gt;git stash pop &amp;lt;id&amp;gt;&lt;/code&gt;. In this case I've provided 1 as the ID. You can see at the bottom of the git output that it says it has dropped the ref to stash@{1}.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nLxe3klP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h2anan3ogphyi86ifrk4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nLxe3klP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h2anan3ogphyi86ifrk4.png" alt="Git stash pop with a stash id" width="514" height="156"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Running &lt;code&gt;git stash list&lt;/code&gt; we can see that there is only one change remaining in the list. The initial change that we stashed has been removed from the list since we popped the first change.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NwVyDdQK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8b4le456w8zxg142lxm5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NwVyDdQK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8b4le456w8zxg142lxm5.png" alt="Git stash list showing only our second change" width="800" height="77"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here we use the push option along with a message. The listing shows both changes are stored again.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vYhWEvYC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gx0z1r13534l76oq03j6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vYhWEvYC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gx0z1r13534l76oq03j6.png" alt="Running git stash with the push option and a message" width="459" height="88"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lrCUPDp7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b9oos6tcnbrfghk72g0u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lrCUPDp7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b9oos6tcnbrfghk72g0u.png" alt="The listing of stashes shows that both stashes are still saved." width="751" height="84"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we'll use the apply option to show that we can apply a stash without deleting it from the list of stashes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dXuRSZkN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vs6bobbspzygotj5nqnp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dXuRSZkN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vs6bobbspzygotj5nqnp.png" alt="Using git stash apply to apply a specific commit without deleting it." width="515" height="159"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--C7Ol0znk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bo8kefn3q79o9c0k4zsk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--C7Ol0znk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bo8kefn3q79o9c0k4zsk.png" alt="The listing of stashes shows that both stashes are still saved." width="776" height="95"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To wrap things up let's show what happens when we want to delete a specific stash.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hYiYWmUy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wrtuetxou320xd2r356x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hYiYWmUy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wrtuetxou320xd2r356x.png" alt="Using git stash drop to delete a stash" width="483" height="64"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--maZkE_wm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yqm0as8eyibyp93dzh7g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--maZkE_wm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yqm0as8eyibyp93dzh7g.png" alt="Git stash list showing only one remaining stash" width="794" height="75"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;git stash&lt;/code&gt; is a handy way to save a set of changes you're working on. There are, of course, other ways to handle saving your changes (i.e. branching). My usual use case for git stash is when I need to merge a set of changes from another branch and am not ready to commit what I'm currently working on.&lt;/p&gt;

&lt;p&gt;Let me know if this post was helpful and/or if you have questions on this topic. For more reading on git check out my post on &lt;a href="https://blog.taylorbuiltsolutions.com/git-merge-to-squash-or-fast-forward/"&gt;git merge strategies&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How To Connect A Nintendo Switch To A Private Minecraft Server</title>
      <dc:creator>Taylor R Price</dc:creator>
      <pubDate>Thu, 23 Mar 2023 03:57:27 +0000</pubDate>
      <link>https://dev.to/trpricesoftware/how-to-connect-a-nintendo-switch-to-a-private-minecraft-server-hdm</link>
      <guid>https://dev.to/trpricesoftware/how-to-connect-a-nintendo-switch-to-a-private-minecraft-server-hdm</guid>
      <description>&lt;p&gt;&lt;em&gt;This was originally posted on my &lt;a href="https://blog.taylorbuiltsolutions.com/"&gt;blog&lt;/a&gt; and is being &lt;a href="https://blog.taylorbuiltsolutions.com/nintendo-switch-private-minecraft-server/"&gt;re-posted&lt;/a&gt; here for reach. Please share it and let me know if you liked it or have any questions!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Mojang, when releasing Minecraft Bedrock Edition for consoles such as the Nintendo Switch, wisely decided to allow only certain public servers to be available to connect to. This is great for protecting children when they're playing online. This is not great, however, when someone wants to play on a server with friends that isn’t one of these allowlisted servers (see more reasons why &lt;a href="https://blog.taylorbuiltsolutions.com/why-minecraft-hosting/"&gt;here&lt;/a&gt;). So how do we get the Switch to allow us to play on another server?&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR - Steps To Connect To A Private Server
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Go to the Switch Home Screen by clicking on the home button&lt;/li&gt;
&lt;li&gt;Click on Settings&lt;/li&gt;
&lt;li&gt;Choose Internet&lt;/li&gt;
&lt;li&gt;Choose Internet Settings&lt;/li&gt;
&lt;li&gt;Select your WiFi network from the list&lt;/li&gt;
&lt;li&gt;Select “Change Settings”&lt;/li&gt;
&lt;li&gt;From the list of network settings touch DNS settings and choose “Manual”&lt;/li&gt;
&lt;li&gt;Set the primary DNS server to 104.238.130.180. This server will trap Minecraft server connections and allow you to connect to private servers.&lt;/li&gt;
&lt;li&gt;Set the secondary DNS server to 8.8.8.8. This is one of Google’s DNS servers and will allow normal internet usage.&lt;/li&gt;
&lt;li&gt;Save the settings and connect to the network&lt;/li&gt;
&lt;li&gt;Open Minecraft, click Play, and click on Servers&lt;/li&gt;
&lt;li&gt;Select any of the servers and join the server&lt;/li&gt;
&lt;li&gt;You’ll be presented with a dialog to enter and join your private server’s address.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Is Actually Happening?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  But, First, What Is DNS?
&lt;/h3&gt;

&lt;p&gt;DNS is short for "Domain Name System". The best analogy for the DNS is that it is the yellow pages for website names; it contains a list of webpage names (like google.com) and their addresses. Here is a primer on DNS from CloudFlare if you're interested to learn more.&lt;/p&gt;

&lt;h3&gt;
  
  
  So What Are We Actually Doing Here?
&lt;/h3&gt;

&lt;p&gt;The address we had you enter as the primary DNS server (104.238.130.180) is the address of a server running a Minecraft world. This world has been specifically designed to allow you to keep track of other Minecraft servers and hand you off to that server when you ask to connect to it. This is a way of sidestepping what Mojang and Nintendo had in mind when they limited Minecraft to only connect to certain servers on the Switch.&lt;/p&gt;

&lt;p&gt;Side Note: This also works for Minecraft on the Microsoft Xbox. The same limiting of servers happens there for the same reasons.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Given that we're sidestepping what the designers of the Switch and XBox consoles had in mind for Minecraft please use this knowledge at your own risk.&lt;/p&gt;

&lt;p&gt;That being said this process does allow you to play with your friends on a world that stays on all the time. This is one of the reasons &lt;a href="http://blog.taylorbuiltsolutions.com/why-minecraft-hosting/"&gt;why you would want a private Minecraft server&lt;/a&gt;. If you're interested in starting up such a server, please reach out to us &lt;a href="https://www.taylorbuiltsolutions.com/minecraft_hosting/"&gt;here&lt;/a&gt; and we'll get you going with one of your own today! You can also fill out this contact form to get in touch with us and we'll get back to you with pricing. Since you're reading this you're likely to be running Minecraft on the Nintendo Switch and should pick "Bedrock Server" below.&lt;/p&gt;

</description>
      <category>minecraft</category>
      <category>nintendo</category>
    </item>
    <item>
      <title>Git Merge: To Squash Or Fast-Forward?</title>
      <dc:creator>Taylor R Price</dc:creator>
      <pubDate>Thu, 23 Mar 2023 00:56:24 +0000</pubDate>
      <link>https://dev.to/trpricesoftware/git-merge-to-squash-or-fast-forward-3791</link>
      <guid>https://dev.to/trpricesoftware/git-merge-to-squash-or-fast-forward-3791</guid>
      <description>&lt;p&gt;&lt;em&gt;This was originally posted on my &lt;a href="https://blog.taylorbuiltsolutions.com/" rel="noopener noreferrer"&gt;blog&lt;/a&gt; and is being &lt;a href="https://blog.taylorbuiltsolutions.com/git-merge-to-squash-or-fast-forward/" rel="noopener noreferrer"&gt;re-posted here&lt;/a&gt; for reach. Please share it and let me know if you liked it or have any questions!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There comes a point when developing a new software feature or fixing a bug where everything has been coded, tested, and reviewed. If git is being used with feature/bug fix branches the next step is the daunting challenge of merging the newly written code with the branch we diverged from. There are several common strategies for handling a merge in git. The ones of interest in this post are fast forward, three way, and squash. What you end up having to ask yourself is:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7z3e2hws0l3olq96izp1.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7z3e2hws0l3olq96izp1.gif" alt="How Do I Want To Do This?"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The merging strategy that you'll choose actually comes down to this question: Do you want to retain commit history or make it easy to rollback this merge? In any software organization the answer to this question will depend on where you are in your branch structure and what it is that you're merging. To understand what the differences in these strategies are we should first start with describing what needs to happen when we merge.  From there we can discuss how these strategies work. With that understanding we'll then handle answering this question.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Does Git Need To Do When Merging Branches?
&lt;/h2&gt;

&lt;p&gt;Let us imagine a developer creates a new branch (feature/test) from another branch (develop) to work on. They make a a change that they commit to their branch to implement their bug fix or feature. When they're done they need to merge back into the branch they diverged from. If other changes were made to the original branch in the mean time the result may look something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwahvm5j71xdw7zc39oii.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwahvm5j71xdw7zc39oii.png" alt="This series of commits shows two commits on the develop branch and one on the feature/test branch of a git repository"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If we’re seeking to merge the changes from the feature branch into the develop branch git will need to make sure that each commit from both branches is present on the develop branch after the merge. Git has several merge strategies it can use to make sure that all of the commits end up present, fast forward, three way, and squash included.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Does Git Handle Diverged Branches? A Merge Commit / Three Way Merge
&lt;/h2&gt;

&lt;p&gt;If there are changes on the develop branch after the feature/test branch diverged it is necessary to create a separate merge commit when merging. It does this to mark that a merge had to happen (whether or not there were any merge conflicts). If there are any conflicts between the code that was added on the two branches, such as changes to the same lines in the same file, git will save a version of the file with some added text to mark the change. The developer will need to resolve the changes and then commit the changes as a merge commit. If there wasn't a conflict git will simply create a merge commit. This ends up looking like the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg7i1btzsxp4ip2d6rft4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg7i1btzsxp4ip2d6rft4.png" alt="When merging from one branch to another where there have been changes on both branches, git has to create a merge commit to mark that the merge happened."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is A Git Fast Forward Merge?
&lt;/h2&gt;

&lt;p&gt;Now that we know what is supposed to happen during a merge when the branches have diverged, let’s talk about the fast forward merge strategy. The strategy name is pretty descriptive in this case. The fast forward strategy attempts to apply each commit from the feature branch onto the develop branch. When there are no commits on the develop branch after the branches diverged it can do this by simply updating the head pointer of the develop branch to the latest commit that's on the new branch and call it a day. The benefit of a fast forward merge is that it maintains the commit history on the branch without adding any extra commits. It looks something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpbg9qkl01s7x5wvh4bkq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpbg9qkl01s7x5wvh4bkq.png" alt="This shows a git repository where the feature/test2 branch is ahead of the develop branch but there are no commits on the develop branch after the branches diverged."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft1m5pf08mbxa7vmqbngi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft1m5pf08mbxa7vmqbngi.png" alt="Here we see that a fast-forward merge happened to develop where the pointer to the develop's head commit was simply updated to where feature/test2 was pointing."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is A Squash Merge?
&lt;/h2&gt;

&lt;p&gt;A squash commit is also aptly named once you know what it does. It takes all of the commits that have happened on a branch and squashes them down into a single commit. Let's say we start with a bunch of commits on the feature/test2 branch as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv26b5mqlowkfhav0pbqw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv26b5mqlowkfhav0pbqw.png" alt="Here we see multiple commits on the feature/test2 branch. The history of these commits aren't necessary to keep."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The squash merge is technically two actions: squash and merge. From the command line these would both be handled in the single command git merge --squash feature/test2. GitKraken, however, highlights that these are separate actions. Here you can see that I've squashed all of the commits from above into a single commit on feature/test2.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgfxikmgbmkpy1lwfcdj9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgfxikmgbmkpy1lwfcdj9.png" alt="Here we see a single squashed commit of the commits whose history we didn't need to keep."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Because there weren't any other commits on develop since the two branches diverged git can fast forward develop to the current commit on feature/test2.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqscealxk14ybx1b80rqc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqscealxk14ybx1b80rqc.png" alt="Because there have been no commits on develop, we can see here that Git Kraken gives the fast forward option."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdnzjrx80kd9l6akofmaq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdnzjrx80kd9l6akofmaq.png" alt="Here we see the head of the develop and the head of the feature/test2 branches both pointing to the same commit."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  When Would We Want To Use These Different Merge Strategies?
&lt;/h2&gt;

&lt;p&gt;Now that we've seen these merging strategies in action we can talk about when and why you'd want to use each. As usual, it depends. Each of the strategies is useful in different situations. The short version is that a fast forward or three way merge is useful on a branch where you want to keep the history of commits and squash where you don’t. Further discussion from here presumes that there is a develop branch that is current with what the developers are working on and some hierarchy of branches above develop representing the current state of environments that are released to (QA, UAT, Production, etc).&lt;/p&gt;

&lt;p&gt;The likely candidate for a squash merge is when a developer is merging code they've been working on in a feature or bugfix branch diverged from the develop branch back into develop. The feature/bugfix branch is likely to have lots of commits on it that represent the daily work of the developer. This commit history isn't necessarily important at a higher level view of the project and, as such, it doesn't matter for the higher level branches either. To the contrary, the feature itself as a whole is what is important. Given that a squash merge will condense the entire feature down to a single commit not only removes the commit history that might be considered noise but allows for easy roll back of the feature by reverting a single commit.&lt;/p&gt;

&lt;p&gt;If features are squash merged into the develop branch we'll end up with a series of commits that represent the addition of entire features or bug fixes. This is commit history that matters to the high level view of the project. This makes using fast forward merges when merging from develop up to QA/UAT/Prod branches make lots of sense. If we can fast forward without introducing merge commits on these branches even better.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion - Squash Feature Commits and Fast Forward After That
&lt;/h2&gt;

&lt;p&gt;There is a time and a place for every kind of commit. The only additional piece of advice that I would add to this is: Merge develop into your feature branch before you squash merge. By doing this your squash merge into develop can be fast forwarded and avoid having an additional merge commit. Once on develop you can move your features up through your environment easily.&lt;/p&gt;

&lt;p&gt;For another interesting read check out my &lt;a href="https://blog.taylorbuiltsolutions.com/software-dev-process/" rel="noopener noreferrer"&gt;post&lt;/a&gt; on how I approach writing software. If you're interested in more git topics read my &lt;a href="https://blog.taylorbuiltsolutions.com/git-stash-quick-primer/" rel="noopener noreferrer"&gt;primer on git stash&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>git</category>
    </item>
    <item>
      <title>How Do I Get CMake To Find Boost When Using Conan?</title>
      <dc:creator>Taylor R Price</dc:creator>
      <pubDate>Mon, 20 Jul 2020 05:08:57 +0000</pubDate>
      <link>https://dev.to/trpricesoftware/how-do-i-get-cmake-to-find-boost-when-using-conan-4olh</link>
      <guid>https://dev.to/trpricesoftware/how-do-i-get-cmake-to-find-boost-when-using-conan-4olh</guid>
      <description>&lt;p&gt;&lt;em&gt;This was originally &lt;a href="https://blog.taylorbuiltsolutions.com/how-do-i-get-cmake-to-find-boost-when-using-conan/" rel="noopener noreferrer"&gt;posted&lt;/a&gt; on my &lt;a href="https://blog.taylorbuiltsolutions.com" rel="noopener noreferrer"&gt;blog&lt;/a&gt; and is being re-posted here for reach. Please share it and let me know if you liked it or have any questions!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Recently I was watching &lt;a href="https://www.youtube.com/channel/UCxHAlbZQNFU2LgEtiqd2Maw" rel="noopener noreferrer"&gt;Jason Turner’s&lt;/a&gt; &lt;a href="https://www.youtube.com/watch?v=kwFcRvxy0D0&amp;amp;list=PLs3KjaCtOwSZ-74ryhrQQkqr8kZW50_mZ" rel="noopener noreferrer"&gt;series&lt;/a&gt; on creating an RPG game with C++20. In this he mentions the use of a &lt;a href="https://github.com/lefticus/cpp_starter_project" rel="noopener noreferrer"&gt;C++ starter project&lt;/a&gt; that uses CMake and Conan to setup good practices from the start of the project (&lt;a href="https://www.youtube.com/watch?v=YbgH7yat-Jo" rel="noopener noreferrer"&gt;here’s the video&lt;/a&gt; walking through the creation of the project). I recently &lt;a href="https://github.com/trprice/EveSDEImporter" rel="noopener noreferrer"&gt;started a project&lt;/a&gt; using CMake to create the build files on different OS’s and &lt;a href="https://blog.taylorbuiltsolutions.com/cmake-and-c11-on-macos/" rel="noopener noreferrer"&gt;had some trouble with it&lt;/a&gt;. Given that I thought I’d update my CMake setup for the project to the starter project that Jason used. While doing that, however, I ran into trouble getting CMake to find the version of Boost that Conan installed. Here’s what I did to resolve that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR —&lt;/strong&gt; &lt;a href="https://docs.conan.io/en/latest/using_packages/conanfile_txt.html" rel="noopener noreferrer"&gt;Read the manual&lt;/a&gt;, of course. Also use &lt;a href="https://github.com/bincrafters/conan-cmake_findboost_modular" rel="noopener noreferrer"&gt;cmake_findboost_modular&lt;/a&gt; to pull just sub-modules of Boost.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is &lt;strong&gt;&lt;a href="https://conan.io/" rel="noopener noreferrer"&gt;Conan&lt;/a&gt;&lt;/strong&gt;?
&lt;/h2&gt;

&lt;p&gt;And why am I giving a summary of what it is when this is a post about a solution to a specific problem? Because defining what Conan is and what it does will help clarify the problem. It did for me. I’d just jumped into using Jason’s starting project as a template without fully understanding the tools in use and I had to learn about them to find the solution.&lt;/p&gt;

&lt;p&gt;So Conan: The … Package Manager?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi1.wp.com%2Fblog.taylorbuiltsolutions.com%2Fwp-content%2Fuploads%2F2020%2F07%2FConan.png%3Fw%3D3840%26ssl%3D1" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi1.wp.com%2Fblog.taylorbuiltsolutions.com%2Fwp-content%2Fuploads%2F2020%2F07%2FConan.png%3Fw%3D3840%26ssl%3D1" alt="Conan the Barbarian or Conan the Package Manager?"&gt;&lt;/a&gt;Conan is a package manager that allows for the installation and management of C and C++ dependencies. It is a stand-alone app that can be run by itself. It also happens to have great integration with CMake. This integration with CMake is what the starter project makes use of and, thus, what I am making use of.&lt;/p&gt;
&lt;h2&gt;
  
  
  Goal: Get a &lt;a href="https://www.boost.org/doc/libs/1_73_0/doc/html/program_options.html" rel="noopener noreferrer"&gt;Specific&lt;/a&gt; &lt;a href="https://www.boost.org/doc/libs/1_73_0/" rel="noopener noreferrer"&gt;Library&lt;/a&gt; Within &lt;a href="https://www.boost.org/" rel="noopener noreferrer"&gt;Boost&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;When I created the &lt;a href="https://github.com/trprice/EveSDEImporter" rel="noopener noreferrer"&gt;EveSDEImporter&lt;/a&gt; project and determined that I wanted to handle command line arguments I decided to use Boost’s Program Options library. There are many ways &amp;amp; libraries for handling command line parameters but, given that I hadn’t played with Boost at all and it is a large and popular set of C++ functionality, I thought I’d go with program options to get some experience with Boost. That being said, it took me more time than I would’ve liked to download the Boost source, build it, and figure out how to get the program options library linked into the EveSDEImporter executable with CMake. Given that Conan is a package manager it was my hope to use it to get Boost and make it easy to include in the project.&lt;/p&gt;
&lt;h2&gt;
  
  
  How do you tell Conan to download Boost?
&lt;/h2&gt;

&lt;p&gt;The Conan.cmake file that is part of the C++ starter project creates a macro that does the Conan setup. My Conan.cmake is almost identical to the starter projects’ with the exception that I replaced &lt;a href="http://docopt.org" rel="noopener noreferrer"&gt;docopt&lt;/a&gt; with Boost. Note that this isn’t a judgement on docopt. I’d just been using Boost so I decided to continue with it.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cmake"&gt;&lt;code&gt;

&lt;span class="nb"&gt;macro&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;run_conan&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="c1"&gt;# Download automatically, you can also just copy the conan.cmake file&lt;/span&gt;
  &lt;span class="nb"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;NOT EXISTS &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CMAKE_BINARY_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/conan.cmake"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;STATUS &lt;span class="s2"&gt;"Downloading conan.cmake from https://github.com/conan-io/cmake-conan"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;DOWNLOAD &lt;span class="s2"&gt;"https://github.com/conan-io/cmake-conan/raw/v0.15/conan.cmake"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CMAKE_BINARY_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/conan.cmake"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;endif&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nb"&gt;include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CMAKE_BINARY_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/conan.cmake&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nf"&gt;conan_add_remote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    NAME
    bincrafters
    URL
    https://api.bintray.com/conan/bincrafters/public-conan&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nf"&gt;conan_cmake_run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    REQUIRES
    &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CONAN_EXTRA_REQUIRES&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    catch2/2.11.0
    cmake_findboost_modular/1.69.0@bincrafters/stable &lt;span class="c1"&gt;# MINE&lt;/span&gt;
    boost/1.73.0                                      &lt;span class="c1"&gt;# MINE&lt;/span&gt;
    fmt/6.2.0
    spdlog/1.5.0
    OPTIONS
    &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CONAN_EXTRA_OPTIONS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    BASIC_SETUP
    CMAKE_TARGETS &lt;span class="c1"&gt;# individual targets to link to&lt;/span&gt;
    BUILD
    missing&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;endmacro&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;One of the issues I had with CMake on Windows was that CMake’s find_package() was finding an older version of Boost that I had around. As I was looking around for how to tell find_package() to get the correct version I stumbled across &lt;a href="https://github.com/bincrafters/conan-cmake_findboost_modular" rel="noopener noreferrer"&gt;cmake_findboost_modular&lt;/a&gt;. You’ll see this in my Conan.cmake and it immediately resolved the issue with finding the correct version of Boost. I’ll note that I didn’t have this problem on OS X but I have confirmed that adding cmake_findboost_modular did not cause problems there.&lt;/p&gt;
&lt;h2&gt;
  
  
  How do I tell CMake to use Boost::program_options? Like normal-ish
&lt;/h2&gt;

&lt;p&gt;There are several things that need to happen to get CMake to tell the build system it creates to link Boost::program_options to the executable being built. The first way thing that we need to do when we are using Conan to manage packages is to tell CMake to load the info that Conan creates that contains all of the paths to where Conan downloaded packages (among other things). In the CMakeLists.txt for the executable that needs a Boost package this can be done with the following:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cmake"&gt;&lt;code&gt;

&lt;span class="c1"&gt;# Include Conan info&lt;/span&gt;
&lt;span class="nb"&gt;include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CMAKE_BINARY_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/conanbuildinfo.cmake&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;conan_basic_setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Once we have all the information from Conan we can use it to tell CMake where to find Boost and to go actually find it:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cmake"&gt;&lt;code&gt;

&lt;span class="c1"&gt;# Dependencies -- Boost&lt;/span&gt;
&lt;span class="nf"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;Boost_INSTALL_DIR &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CONAN_BOOST_ROOT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;find_package&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;Boost 1.73.0 COMPONENTS program_options REQUIRED&lt;span class="p"&gt;)&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;After this has been included we can do the normal step of including &lt;a href="https://www.boost.org/doc/libs/1_73_0/doc/html/program_options.html" rel="noopener noreferrer"&gt;Boost::program_options&lt;/a&gt; as one of the &lt;a href="https://cmake.org/cmake/help/v3.18/command/target_link_libraries.html?highlight=target_link_libraries" rel="noopener noreferrer"&gt;target_link_libraries&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cmake"&gt;&lt;code&gt;

&lt;span class="c1"&gt;# Main executable&lt;/span&gt;
&lt;span class="nb"&gt;add_executable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;intro main.cpp&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;target_link_libraries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  intro
  PRIVATE project_options
          project_warnings
          SDEParser
          Boost::program_options
          CONAN_PKG::fmt
          CONAN_PKG::spdlog&lt;span class="p"&gt;)&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Once this has been entered into the CMakeLists.txt for the project that needs a Boost library CMake can be run to build the build system.&lt;/p&gt;
&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;CMake is a complex system that has a TON of options to help you build your build system in a way that will work across operating systems and build tools. It wasn’t until I sat down and actually read the manual for Conan that I realized that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Conan did actually make the pathing to its packages available.&lt;/li&gt;
&lt;li&gt;How to get that pathing into CMakeLists.txt&lt;/li&gt;
&lt;li&gt;That, past specifying where the packages are, including a package in target_link_libraries is just like doing it without Conan&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I hope that this helps you if you’re struggling with how to get Conan to find Boost and use packages. And, as always, I need to remind myself of this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi2.wp.com%2Fblog.taylorbuiltsolutions.com%2Fwp-content%2Fuploads%2F2020%2F07%2FRTFM.jpg%3Fw%3D3840%26ssl%3D1" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi2.wp.com%2Fblog.taylorbuiltsolutions.com%2Fwp-content%2Fuploads%2F2020%2F07%2FRTFM.jpg%3Fw%3D3840%26ssl%3D1" alt="Read The Freaking Manual"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Throwing C++ Polymorphic Exceptions</title>
      <dc:creator>Taylor R Price</dc:creator>
      <pubDate>Thu, 09 Jul 2020 17:11:46 +0000</pubDate>
      <link>https://dev.to/trpricesoftware/throwing-c-polymorphic-exceptions-ke8</link>
      <guid>https://dev.to/trpricesoftware/throwing-c-polymorphic-exceptions-ke8</guid>
      <description>&lt;p&gt;&lt;em&gt;This was originally &lt;a href="https://blog.taylorbuiltsolutions.com/throwing-c-polymorphic-exceptions/"&gt;posted&lt;/a&gt; on my &lt;a href="https://blog.taylorbuiltsolutions.com"&gt;blog&lt;/a&gt;. I'm posting here to extend its reach. I would love to hear your feedback either here or on my &lt;a href="https://blog.taylorbuiltsolutions.com"&gt;blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Recently a co-worker asked me a question that I didn’t have a ready answer to:  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To facilitate throwing detailed exceptions, I’ve derived several exceptions from std::exception. In order to centralize logging of errors, I created a function that takes a std::exception which I re-throw after logging. Why is the throw statement throwing a std::exception instead of my sub-type? I know the suggested workaround for this is to implement and use&lt;/strong&gt; &lt;code&gt;raise()&lt;/code&gt;&lt;strong&gt;, but that seems like a workaround for why we can’t throw in a polymorphic manner.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Polymorphic Exception Example
&lt;/h3&gt;

&lt;p&gt;The desire that drove this question is to have a central facility to log exceptions. Once logged the exception is re-thrown to the next place able to catch the exception appropriately. The code that my co-worker showed me looks something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include 
#include 
&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyException&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;exception&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;public:&lt;/span&gt;
        &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;what&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"MyException what()"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ExceptionLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  C++ Standards Body on Throwing Polymorphically
&lt;/h3&gt;

&lt;p&gt;After my co-worker asked me this I began searching for an answer and, lo and behold, IsoCPP, the website for the C++ standards body, had and answer to how to work around this in their &lt;a href="https://isocpp.org/wiki/faq/exceptions#throwing-polymorphically"&gt;FAQs&lt;/a&gt;. The recommended way to do this is to implement your own exception base class and implement a virtual function which throws the current object (typically named &lt;code&gt;raise()&lt;/code&gt;). Here is the example given on the IsoCPP site:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyExceptionBase&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;public:&lt;/span&gt;
      &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;raise&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;


&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;MyExceptionBase&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;raise&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyExceptionDerived&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;MyExceptionBase&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;public:&lt;/span&gt;
      &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;raise&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;MyExceptionDerived&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;raise&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MyExceptionBase&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
    &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;raise&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;g&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;MyExceptionDerived&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MyExceptionDerived&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// ...code to handle MyExceptionDerived...&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(...)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...code to handle other exceptions...&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;As my co-worker stated to me, using &lt;code&gt;raise()&lt;/code&gt; feels like a jarring departure from the normal mechanics of throwing an exception. Because &lt;code&gt;raise()&lt;/code&gt; only needs to &lt;code&gt;throw *this&lt;/code&gt; , it’s even more frustrating because it feels like we’re just moving the same call we would’ve used into a different context than where we wanted to use it. The example, however, works to solve the problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why &lt;strong&gt;doesn’t&lt;/strong&gt; C++ throw polymorphically?
&lt;/h3&gt;

&lt;p&gt;The short explanation given on IsoCPP’s FAQ is that "the statement &lt;code&gt;throw e;&lt;/code&gt; throws an object with the same type as the &lt;em&gt;static&lt;/em&gt; type of the expression e". This means that a copy of the object is thrown instead of the original object and, when it is copied, the current type is used. In the example I gave above the type is std::exception. This means that the rest of the exception that is part of the sub-class gets &lt;em&gt;sliced&lt;/em&gt; away to use the terminology from IsoCPP.&lt;/p&gt;

&lt;p&gt;This, however, didn't fully answer the question for me. It answers &lt;strong&gt;what happens&lt;/strong&gt; not &lt;strong&gt;why it happens&lt;/strong&gt;. It is hard for me to believe that this is an oversight given the lengthy history and use of C++. That left me thinking that the reason for this issue is one of two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It is sticking around for historical reasons and so that it doesn't break lots of existing code.&lt;/li&gt;
&lt;li&gt;There is some performance reason for not having throw act polymorphically.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Finding the answer
&lt;/h3&gt;

&lt;p&gt;I have been writing code in C for many years I have been doing so in the bubble of a single company and its way of doing things. This left me with a deficient knowledge of C++ which I'm currently working to correct. However, because I've been working to correct that gap in my knowledge, I know a few people to go ask!&lt;/p&gt;

&lt;p&gt;In order to find out what the answer I went to the C++ Twitter community. Specifically, I reached out to &lt;a href="https://twitter.com/lefticus"&gt;Jason Turner&lt;/a&gt;, a host of &lt;a href="https://cppcast.com"&gt;CppCast&lt;/a&gt;, and &lt;a href="https://twitter.com/shafikyaghmour"&gt;Shafik Yagmour&lt;/a&gt; whose prolific tweet history on C++ speaks for itself. The twitter thread can be seen &lt;a href="https://twitter.com/TRPriceSoftware/status/1166388575731998722"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Polymorphism is Expensive
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://twitter.com/shafikyaghmour/status/1166427818290401280"&gt;answer&lt;/a&gt; suggested by Shafik is that, simply put, polymorphism is expensive. There is a long history in the design on the C++ language of not paying for what you don't use. This is done in an effort to make the language efficient. Bjarne Stroustrup details this by page four of a 2012 keynote speech entitled &lt;a href="http://www.stroustrup.com/ETAPS-corrected-draft.pdf"&gt;"Foundations of C++"&lt;/a&gt;. This keynote is a good read in and of itself beyond just helping to answer this question.&lt;/p&gt;

&lt;h3&gt;
  
  
  My Opinion
&lt;/h3&gt;

&lt;p&gt;I understand the reasoning that polymorphism is expensive and, thus, there are cases where it is beneficial to disallow it. Not only is it expensive it seems to me that code that would be necessary to figure out which subclass to copy could be complicated unless the &lt;a href="https://pabloariasal.github.io/2017/06/10/understanding-virtual-tables/"&gt;vtable&lt;/a&gt; tells us which specific class we have in the current context. So, not only would the code to figure this out be more expensive, it would be simpler and easier to read if we didn't do it.&lt;/p&gt;

&lt;p&gt;That being said, the only case that I can think of where we’re holding a base class object and want to do a deep copy (that is get an object of the derived class from the base class pointer or reference) is in this kind of case where we want to re-throw an exception. My understanding of using a base class to represent a derived class is most useful where we want to do a common operation on all possible derived types. On the other hand I've found somebody asking about this topic outside the scope of exceptions on &lt;a href="https://stackoverflow.com/questions/5027456/copying-derived-entities-using-only-base-class-pointers-without-exhaustive-tes"&gt;Stack Overflow&lt;/a&gt;. This shows that there is a use for it that I'm unfamiliar. I’m sure that this lack of imagination for a use for this comes from my experience in C where object orientation isn’t available. I'm looking forward to all of you in the C++ community teaching me where this is used.&lt;/p&gt;

&lt;p&gt;Lastly, there is an argument to be made that throw should be allowed to throw polymorphically because we’re already in exceptional circumstances. In the normal flow of operation performance is key and polymorphic copying should be something that the programmer has to implement (as shown by &lt;code&gt;raise()&lt;/code&gt; or &lt;code&gt;clone()&lt;/code&gt; in the SO question) only where they really need it. But, if we’ve thrown an exception already, the likelihood is that the program is already in a state where performance is less important than easily preserving information about what happened.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;This has been an interesting journey of learning about C++, it's features, and the reasons behind the design of one of the features. While I still think that having to implement your own &lt;code&gt;raise()&lt;/code&gt; or &lt;code&gt;clone()&lt;/code&gt; routine causes mental dissonance in context of throwing exceptions it's not that bad of a solution. I look forward to learning more about this topic. I would love to have you all teach me about this topic and/or show me where to read about it!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>CMake and C++11 on MacOS -- Set your variables before creating your target</title>
      <dc:creator>Taylor R Price</dc:creator>
      <pubDate>Thu, 02 Jul 2020 23:29:29 +0000</pubDate>
      <link>https://dev.to/trpricesoftware/cmake-and-c-11-on-macos-set-your-variables-before-creating-your-target-30c5</link>
      <guid>https://dev.to/trpricesoftware/cmake-and-c-11-on-macos-set-your-variables-before-creating-your-target-30c5</guid>
      <description>&lt;p&gt;*&lt;strong&gt;&lt;em&gt;Note:&lt;/em&gt;&lt;/strong&gt;* &lt;em&gt;This was originally &lt;a href="https://blog.taylorbuiltsolutions.com/cmake-and-c11-on-macos/"&gt;posted&lt;/a&gt; on my &lt;a href="https://blog.taylorbuiltsolutions.com/"&gt;blog&lt;/a&gt;. I'm posting it here for reach. Please let me know what you think!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I’ve been toying with using the Microsoft CPPRestSDK library to practice with REST services and see how easily they’re done in C++. Given that I’d like the project to run on more than one OS, I thought it’d be a good idea to use CMake to build it in several places. This, of course, has required me to refresh my knowledge of CMake. And, of course, I’ve run into a problem with CMake: Getting it to generate a Makefile or XCode project on MacOS that builds and links against C++11.&lt;/p&gt;

&lt;p&gt;One big note that I’ll make here is that this post is a description of a problem that I’m having. I will post links to this post in various places where I think I might find answers other than Google, StackOverflow, and the CMake docs where I’ve already looked. If I get a good answer from somebody I will update this post to reflect the changes made.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem Solved!
&lt;/h2&gt;

&lt;p&gt;It turns out that I had a misunderstanding of how CMake expected targets to be declared. It expects all properties related to a target before you declare that target with &lt;code&gt;add_executable&lt;/code&gt; or &lt;code&gt;add_library&lt;/code&gt;. I have updated the CMakeLists.txt to have the properties set before the &lt;code&gt;add_executable&lt;/code&gt; call and, lo and behold, it works appropriately. I would like to thank the folks in the &lt;a href="http://cpplang.slack.com/"&gt;CPPLang Slack community&lt;/a&gt; for helping me identify that this was the problem. Please see the conclusion for more thoughts on this.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does the CMakeLists.txt look like?
&lt;/h2&gt;

&lt;p&gt;This, of course, is likely the first question that comes to mind for anybody who knows CMake well. You can find the &lt;a href="https://github.com/trprice/EveDataRetriever"&gt;project here&lt;/a&gt; and the &lt;a href="https://github.com/trprice/EveDataRetriever/blob/master/CMakeLists.txt"&gt;CMakeLists.txt here&lt;/a&gt;. Given that my project is relatively simple (so far) I’m attracted to the idea that Craig Scott &lt;a href="https://crascit.com/2015/03/28/enabling-cxx11-in-cmake/"&gt;posted&lt;/a&gt;. That is to use the following settings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;As you can see in my CMakeLists.txt I’ve got these set. You’ll also notice that they’re only set for MSVC. Everybody else gets the following to set &lt;code&gt;-std=c++11&lt;/code&gt; directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
add_definitions(-std=c++11)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Why don’t I use CMAKE_CXX_STANDARD for MacOS?
&lt;/h2&gt;

&lt;p&gt;This is setup this way because, at present, using the CMake variables did not set the command line options correctly for clang on MacOS. If I use CMAKE_CXX_STANDARD to generate Makefiles on MacOS here are the beginning of the compile time errors. These come from the CPPRestSDK headers and are only errors if you’re not compiling with C++11 or above:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ 50%] Building CXX object CMakeFiles/EveDataRetriever.dir/EveDataRetriever.cpp.o
In file included from /Users/taylor/development/EveDataRetriever/EveDataRetriever.cpp:4:
In file included from /Users/taylor/development/EveDataRetriever/EveDataRetriever.h:6:
In file included from /usr/local/include/cpprest/http_client.h:47:
In file included from /usr/local/include/cpprest/asyncrt_utils.h:17:
In file included from /usr/local/include/pplx/pplxtasks.h:61:
In file included from /usr/local/include/pplx/pplx.h:47:
In file included from /usr/local/include/pplx/pplxlinux.h:27:
In file included from /usr/local/include/boost/thread/condition_variable.hpp:16:
In file included from /usr/local/include/boost/thread/pthread/condition_variable.hpp:9:
In file included from /usr/local/include/boost/thread/detail/platform_time.hpp:19:
In file included from /usr/local/include/boost/chrono/duration.hpp:42:
In file included from /usr/local/include/boost/type_traits/common_type.hpp:22:
In file included from /usr/local/include/boost/type_traits/detail/common_type_impl.hpp:12:
/usr/local/include/boost/type_traits/detail/common_arithmetic_type.hpp:209:75: error: expected expression
    BOOST_STATIC_CONSTANT(int, selector = sizeof(select(cond() ? T() : U())));
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can see the same error displayed in Xcode if I generate an Xcode project and build with it:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WLC-5sXw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i0.wp.com/blog.taylorbuiltsolutions.com/wp-content/uploads/2019/10/EveDataRetriever_XCode_Error.png%3Ffit%3D1024%252C595%26ssl%3D1" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WLC-5sXw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i0.wp.com/blog.taylorbuiltsolutions.com/wp-content/uploads/2019/10/EveDataRetriever_XCode_Error.png%3Ffit%3D1024%252C595%26ssl%3D1" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why doesn’t CMAKE_CXX_STANDARD work for me on MacOS?
&lt;/h2&gt;

&lt;p&gt;That is a very good question! I’ve done some googling for how to set the C++ standard to C++11. Most of the pages I’ve found have recommended using the CMake variables to set the standard and, if that doesn’t work, to just set the appropriate flags for the command line. You can see in the CMakeLists.txt that this is what I’ve ended up doing.&lt;/p&gt;

&lt;p&gt;These flags are, of course, not portable. This defeats some of the purpose of using CMake. I know there will always have to be some settings that are OS specific but if there’s a way to use CMake to set something for all platforms in a generic manner I’d prefer to do that.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I have re-written this section now that I’ve solved this problem. The &lt;a href="https://cmake.org/cmake/help/git-stage/manual/cmake-language.7.html#cmake-language-variables"&gt;Cmake documentation surrounding variables&lt;/a&gt; describes that they are dynamically scoped. If add_executable reads the variables at the time it is executed and it is what generates all of the command line flags for the compiler then it makes sense that the variables must be set beforehand.&lt;/p&gt;

&lt;p&gt;So, in short, my misunderstanding is where in the CMake process the compile time properties are set. The way it is implemented means that these properties only have to be generated once. This is more efficient than having to regenerate them whenever a variable is changed. I did not find anywhere in the CMake documentation that explicitly warns users to have variables set before creating the target. But, to be fair, I haven’t read ALL the documentation. I hope this helps you in your endeavors with CMake.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>VBA How-To: If/Else and Checking For Empty Strings</title>
      <dc:creator>Taylor R Price</dc:creator>
      <pubDate>Wed, 01 Jul 2020 21:28:45 +0000</pubDate>
      <link>https://dev.to/trpricesoftware/vba-how-to-if-else-and-checking-for-empty-strings-1oh8</link>
      <guid>https://dev.to/trpricesoftware/vba-how-to-if-else-and-checking-for-empty-strings-1oh8</guid>
      <description>&lt;p&gt;*&lt;strong&gt;&lt;em&gt;Note:&lt;/em&gt;&lt;/strong&gt;* &lt;em&gt;This post was originally &lt;a href="https://blog.taylorbuiltsolutions.com/vba-how-to-if-else-and-checking-for-empty-strings/"&gt;posted&lt;/a&gt; on my &lt;a href="https://blog.taylorbuiltsolutions.com/"&gt;blog&lt;/a&gt;. I hope posting it here will help reach those whom it will help.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Recently I have been using VBA for a project in Excel and, though I know what I want to express in VBA, I don’t always know the syntax since it isn’t my main programming language. I had to look up the syntax for the if / else conditional clause and how to check whether a string variable is empty. Given that I’m an &lt;a href="https://blog.taylorbuiltsolutions.com/another-new-adventure/"&gt;experienced software engineer&lt;/a&gt; and still had to look them up I thought sharing them with you here would be helpful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Don’t just copy and paste before reading the article. Copying and pasting without understanding is unwise. You do so at your own danger.&lt;/p&gt;

&lt;h2&gt;
  
  
  If – Then – Else Conditional Statements In VBA
&lt;/h2&gt;

&lt;p&gt;The if – else conditional statement is a staple of any programming language. In each language they have the same meaning. That is if some condition is true then take some action. Otherwise do something else or skip the action. Each language, however, has a slightly different way of saying this; that is each language has a different syntax.&lt;/p&gt;

&lt;p&gt;In the case of VBA this is handled as follows (and as described in this &lt;a href="https://docs.microsoft.com/en-us/office/vba/language/concepts/getting-started/using-ifthenelse-statements"&gt;guide&lt;/a&gt; on Microsoft’s docs website. The documentation is &lt;a href="https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/if-then-else-statement"&gt;here&lt;/a&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;If [condition] Then
    ' code
ElseIf [condition] Then
    ' code
Else
    ' code
End If
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Checking String Variables For Emptiness
&lt;/h2&gt;

&lt;p&gt;There are two common checks needed when dealing with data coming from a source outside the control of code you’re writing. These are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did I get data or is it empty?&lt;/li&gt;
&lt;li&gt;Does the data conform to what I expect and can deal with?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the case of the code I was writing I’ve got a class with member variables some of which are optional. When I am going to use them to pass the data on I need to know if there is data present to decide what to do with them. The last piece of pertinent information is that I am treating all the variables as strings because I will be sending the data over an API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can We Use The IsEmpty() function?
&lt;/h3&gt;

&lt;p&gt;My initial search for how to check whether a string is empty led me to the &lt;a href="https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/isempty-function"&gt;IsEmpty()&lt;/a&gt; function. This seems like a really good fit for what I was looking for. As described in the documentation:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Returns a &lt;strong&gt;Boolean&lt;/strong&gt; value indicating whether a &lt;a href="https://docs.microsoft.com/en-us/office/vba/language/glossary/vbe-glossary#variable"&gt;variable&lt;/a&gt; has been initialized.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Given that I want to check whether a member variable of my class has been initialized to a value this looks like exactly what I want. As I was about to write this, however, I thought it would be a good idea to test this just to make sure that I am giving you correct information. As such, I wrote this small bit of code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sub CheckVarForEmpty()
    Dim stringVar As String
    If IsEmpty(stringVar) = True Then
        MsgBox "Variable Is Empty!"
    End If
End Sub
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;After writing this I ran this fully expecting to have a message box pop up saying that the variable is empty. However it did NOT pop up.&lt;/p&gt;

&lt;h3&gt;
  
  
  VBA Debugger To The Rescue!
&lt;/h3&gt;

&lt;p&gt;However, when I debugged the code to make sure that the message box was really being skipped, I noticed that the variable showed that it had the value “”. Now, to me, this looks like an empty string but I decided to write another conditional testing the value of the string against “”:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sub CheckVarForEmpty()
    Dim stringVar As String
    If stringVar = "" Then
        MsgBox "Varable Is = to Empty String"
    End If
End Sub
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Sure enough the message box is shown. Hooray! This means that checking a string against “” successfully determines if a string variable is empty.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Didn’t IsEmpty() Work?
&lt;/h3&gt;

&lt;p&gt;However, because I was curious I why IsEmpty() did not return true in my first attempt, I went back to the documentation and read it again. It specifically says that IsEmpty() only returns True if a variable is not initialized or explicitly set to Empty. If you notice in my first example I declare stringVar as a string because I am used to programming in &lt;a href="https://en.wikipedia.org/wiki/Strong_and_weak_typing"&gt;strongly typed languages&lt;/a&gt; and it makes sense to me to mark how a variable is to be used. Given that the documentation for IsEmpty() shows examples where the variables were NOT declared with types. This made me wonder if, by declaring a variable with a type, it initializes it to a value (“” in the case of strings). This would make IsEmpty() return False. As such I wrote another test to see if this train of thought is valid:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sub CheckVarForEmpty()
    Dim myVar
    If IsEmpty(myVar) = True Then
        MsgBox "MyVar is Empty!"
    End If
End Sub
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Sure enough the message box in this test popped up as the documentation indicated it would. This, for me, confirms that declaring a variable in VBA as a particular type will initialize it in a manner appropriate for that type.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion — I always have more to learn
&lt;/h2&gt;

&lt;p&gt;This exercise shows that, despite my years of experience, there are always more things to learn. I hope that this helps you in your adventures in VBA. For me, the next things I will teach myself regarding VBA is more about how classes are constructed and destructed. I hope to bring you more knowledge as I gain it for myself.&lt;/p&gt;

</description>
      <category>vba</category>
      <category>excel</category>
      <category>howto</category>
      <category>basics</category>
    </item>
    <item>
      <title>Should Remote Workers Use Cameras in Online Meetings?</title>
      <dc:creator>Taylor R Price</dc:creator>
      <pubDate>Wed, 01 Jul 2020 19:52:21 +0000</pubDate>
      <link>https://dev.to/trpricesoftware/should-remote-workers-use-cameras-in-online-meetings-310e</link>
      <guid>https://dev.to/trpricesoftware/should-remote-workers-use-cameras-in-online-meetings-310e</guid>
      <description>&lt;p&gt;Recently I wrote a &lt;a href="https://blog.taylorbuiltsolutions.com/three-important-points-of-communication/"&gt;post&lt;/a&gt; about how important it is to make “context rich” communication a priority. This is especially important for &lt;a href="https://blog.taylorbuiltsolutions.com/how-to-make-remote-work-possible/"&gt;remote&lt;/a&gt; &lt;a href="https://blog.taylorbuiltsolutions.com/yet-more-reasons-to-build-a-remote-team/"&gt;teams&lt;/a&gt; because gaining context in a discussion is doubly difficult if you’re not together in the same room. Related to this, there’s a thread on &lt;a href="https://twitter.com/StephandSec/status/1202981391551680513"&gt;Twitter&lt;/a&gt; about whether remote employees should have their cameras on during meetings. Given how much context seeing someone’s face gives, I’d like to discuss the pros and cons of turning on video cameras in your remote meeting software during your meetings. My opinion is that, as always, IT DEPENDS!&lt;/p&gt;

&lt;h2&gt;
  
  
  Cameras Give Context
&lt;/h2&gt;

&lt;p&gt;A big part of a conversation between people is &lt;a href="https://hbr.org/2012/09/your-body-language-speaks-for"&gt;unspoken&lt;/a&gt;. Emotion is conveyed strongly on the face of the person you’re speaking with. Having a video camera on while you’re hashing something out gives a way for your team to see your emotion and read your intent. It also lets you see how the listeners in your conversation are receiving what you’re saying. This takes the conversation a long way toward being productive because you can tailor what you’re saying to help clarify a point or defuse tension.&lt;/p&gt;

&lt;p&gt;When you’re speaking with a group of people in person it is pretty easy to see the entire body language of all those in the room. This lets you see how people are reacting to what you say and when somebody who might be introverted wants to speak. To use a technical analogy, you have much more bandwidth coming from somebody you can see in person than you get from a small rectangle on a screen.&lt;/p&gt;

&lt;p&gt;However when you’re on a conference call it can be hard to tell who wants to speak even when you can see their faces. The fewer people that are on the call the easier it becomes to really pay attention to the faces of those talking. As such I think that cameras really only works for online meetings with few attendees where the goal is to really hash something out. Otherwise the cameras lose their ability to give meaningful context.&lt;/p&gt;

&lt;h2&gt;
  
  
  People Focus In Different Ways
&lt;/h2&gt;

&lt;p&gt;While it is true that seeing the face of the person you’re communicating with can provide a context rich medium of communication, not everybody communicates well face to face. Some listen better when they can fidget with something or when they can play on their phone. This can make it look like they’re not paying attention.&lt;/p&gt;

&lt;p&gt;As such you really need to know the personality of the person you’re talking to if you expect to have a valuable conversation with them. If you aren’t expecting them to speak with you during the meeting or you’re discussing things that don’t involve them directly it may behoove you to not care if they’re paying close attention. If you are intending to have an important discussion with them be aware that they make not look you (or the camera) in the eye. Be patient with your co-workers and communicate with them in the way that works best for them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cameras On Only For Small Online Meetings
&lt;/h2&gt;

&lt;p&gt;Having context rich communication really only helps where everybody will be participating (yes, back to this again!). As mentioned earlier, there is more bandwidth for participants of a meeting if everybody is in the same room. However, if everyone is remote there is less bandwidth available and, as such, the number of people that can engage in context rich communication will be limited. My guess is no more than four people will be able to communicate effectively in a context rich manner over a video based conference call though I don’t have the research to back this up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Maybe Don’t Have Big Meetings?
&lt;/h2&gt;

&lt;p&gt;The bigger a meeting is the more it will trend, by nature, toward information dissemination and away from conversation. There is no point to having all ten, twenty, or one hundred cameras on if the majority of those people will not be saying anything. If you’re disseminating information you don’t need context from those you’re talking to. In reality, though, that kind of &lt;a href="https://www.amazon.com/Survived-Another-Meeting-Should-Ribbon/dp/B01EIRXEVM"&gt;meeting should probably have been an email&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I think video cameras are incredibly useful for conversations between a few people meeting to talk deeply about a topic. I’ll generalize that to saying that &lt;strong&gt;meetings&lt;/strong&gt; are a good use of employees time if you need to dive deeply on a topic. This applies whether you’re talking in person or remotely. Meetings setup simply to disseminate information really should be consigned to email to respect the time and talents of your knowledge workers. As such have less meetings and setup the ones you do have to provide the highest level of context rich communication whether that be video cameras or meeting rooms.&lt;/p&gt;

</description>
      <category>remotework</category>
      <category>meetings</category>
      <category>communication</category>
    </item>
    <item>
      <title>Are Your Timeline Expectations Sensible for your Software Project?</title>
      <dc:creator>Taylor R Price</dc:creator>
      <pubDate>Thu, 18 Jun 2020 15:04:44 +0000</pubDate>
      <link>https://dev.to/trpricesoftware/sensible-expectations-aan</link>
      <guid>https://dev.to/trpricesoftware/sensible-expectations-aan</guid>
      <description>&lt;p&gt;This was originally &lt;a href="https://blog.taylorbuiltsolutions.com/sensible-expectations/"&gt;posted&lt;/a&gt; on my &lt;a href="https://blog.taylorbuiltsolutions.com/"&gt;blog&lt;/a&gt;. If you like it, please share to extend its reach.&lt;/p&gt;




&lt;p&gt;There is a lot of stress going on in the world as I write this post. Presently we are under quarantine due to &lt;a href="https://www.cdc.gov/coronavirus/2019-ncov/index.html"&gt;COVID-19&lt;/a&gt; and lots of folks are &lt;a href="https://blog.taylorbuiltsolutions.com/how-to-make-remote-work-possible/"&gt;working remotely&lt;/a&gt;. There are also &lt;a href="https://www.cnn.com/us/live-news/george-floyd-protests-06-01-20/index.html"&gt;protests happening across the US&lt;/a&gt; in response to the &lt;a href="https://www.npr.org/2020/06/01/867219130/george-floyd-independent-autopsy-homicide-by-asphyxia"&gt;homicide of George Floyd&lt;/a&gt; at the hands of a police officer. Everybody is feeling the turmoil. &lt;strong&gt;In this stressful time it is important to maintain sensible expectations.&lt;/strong&gt; This is true in every aspect of life. In this post, however, I want to focus on the creation, delivery, and maintenance of software systems and the timeline expectations generated as part of project management.&lt;/p&gt;




&lt;p&gt;This is not a new issue. I even &lt;a href="https://blog.taylorbuiltsolutions.com/software-development-always-takes-longer-than-you-think/"&gt;posted&lt;/a&gt; about it in January before COVID-19 and the protests started. However, as companies are cutting staff and the amount of work to be done increases for those remaining, it becomes easy to let the stress dictate deadlines. Taking a step back from a situation almost always shows the decisions made under stress to be marginal at best. As such, I want to take a step back and talk about a few things that help to create sensible expectations of a team that creates good software:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What does it take to deliver software changes?&lt;/li&gt;
&lt;li&gt;Reasons to rush&lt;/li&gt;
&lt;li&gt;How to rush&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What does it take to deliver software?
&lt;/h2&gt;

&lt;p&gt;Because my mind works well with lists I’m going to start this section with a list of items it takes to deliver good software in a reasonable amount of time without putting undue stress on anybody. I’ll expand on these after listing them out. They are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Good requirements&lt;/li&gt;
&lt;li&gt;Understanding of existing code&lt;/li&gt;
&lt;li&gt;Reasonable testing infrastructure&lt;/li&gt;
&lt;li&gt;An understanding of how quickly it is necessary to act

&lt;ul&gt;
&lt;li&gt;This one gets it’s own section below&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Good Requirements
&lt;/h3&gt;

&lt;p&gt;My definition of “good” requirements: &lt;strong&gt;Good requirements are detailed enough for a developer familiar with the business to be able to start work with minimal questions.&lt;/strong&gt; This means that the requirements need to be more than “this field on the form needs to look like this” or “what I entered on the screen wasn’t saved.” There need to be examples of data that reproduce the problem or highlight the issue to be added. A discussion of why changes are requested reduce questions and help spread the knowledge of the business logic. Such requirements will allow developers and testers to understand the scope of an issue. This understanding will lead to better time to completion estimates which, in turn, will allow for better planning. Better planning and project management, of course, creates sensible expectations (if &lt;a href="https://blog.taylorbuiltsolutions.com/three-important-points-of-communication/"&gt;communicated appropriately&lt;/a&gt; of course).&lt;/p&gt;

&lt;p&gt;Please note that no single paragraph, no matter how well written, will cover the extent of what good requirements look like. For the sake of this discussion I believe that my description above will do. There are, however, &lt;a href="https://www.amazon.com/Software-Requirements-Developer-Best-Practices/dp/0735679665/ref=sr_1_3?dchild=1&amp;amp;keywords=software+requirements+microsoft+press&amp;amp;qid=1591401914&amp;amp;s=books&amp;amp;sr=1-3"&gt;books&lt;/a&gt; written on the subject that cover this topic in greater detail. &lt;strong&gt;Note:&lt;/strong&gt; I haven’t read that book specifically but, as a general rule, the books that come out of &lt;a href="https://www.microsoftpressstore.com/"&gt;Microsoft Press&lt;/a&gt; are pretty good. If there is a better book on the topic please let me know.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding of existing code
&lt;/h3&gt;

&lt;p&gt;The developers that will be making a change need to understand the code they will be changing. If they haven’t interacted with the code already they will need to spend time reading and playing with it before they can make a change. This &lt;em&gt;will&lt;/em&gt; extend the amount of time that it will take the developer to complete their task. It is a requisite for a developer to be able to make the change effectively. That is not to say that developers should be allowed to work only on what they are already familiar with. The plan to approach a project just needs to include extra time for a developer to learn in order for the expectations laid upon them to remain sensible.&lt;/p&gt;

&lt;p&gt;There are ways to mitigate the penalty of a developer having to learn a new area of code. Since this isn’t the main point of the post, I will keep this short: All of the ways to mitigate the learning process boil down to implementing patterns: good design patterns, common calling conventions, and frameworks that implement APIs in ways developers will recognize.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reasonable testing infrastructure
&lt;/h3&gt;

&lt;p&gt;This is yet another gigantic topic that I am going to breeze over for the sake of making the point that this infrastructure needs to be reasonable to deliver software in a reasonable timeline. The items that, at a &lt;em&gt;minimum&lt;/em&gt;, need to be setup are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A clear and simple release management process (that is, how a change flows from a developer through testing and on to production)&lt;/li&gt;
&lt;li&gt;Quality assurance (QA) and user acceptance testing (UAT) teams that knows how to test quickly in both a manual and automated manner&lt;/li&gt;
&lt;li&gt;An attitude among all the teams (Dev, QA, and UAT) that allows all of them to work together instead of being territorial about solving problems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’ve spent most of my career as a developer and, as such, I have not spent time gathering books and other resources for testing. Please let me know if you have resources to put here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Acceptable reasons to rush
&lt;/h2&gt;

&lt;p&gt;There are a few reasons that I can think of that are legitimate reasons to cut corners. These include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Production environment is broken&lt;/li&gt;
&lt;li&gt;Governmental regulations change deadline looming&lt;/li&gt;
&lt;li&gt;Achieving first to market status&lt;/li&gt;
&lt;/ul&gt;


&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---M1BoCrC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i1.wp.com/blog.taylorbuiltsolutions.com/wp-content/uploads/2020/06/ActNow.jpg%3Fw%3D3840%26ssl%3D1" alt="There are very few reasons to rush a software project. A production environment is one of these few reasons"&gt;Only rush when it’s necessaryWith the exception of the production environment being broken I would argue that even these important reasons shouldn’t cause a crunch. The requirements planning phase of a project should plan for a minimally viable product (MVP) and a fully featured product. As a due date approaches requirements should be cut from the product as necessary to finish what can be finished with quality. These are all things that I have witnesses a great project manager handle.
&lt;h2&gt;
  
  
  How to rush when you need to
&lt;/h2&gt;

&lt;p&gt;Here we can get to my definition of “rush”. Rushing, to me, includes cutting corners from the development process. This means skipping writing automated tests (either from dev or QA), reducing the manual testing process to the happy path, and, as a last resort, having employees work overtime.&lt;/p&gt;

&lt;p&gt;After finishing a project it is critical to do a retrospective on the rush that covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why the rush was needed&lt;/li&gt;
&lt;li&gt;What was done to solve the problem&lt;/li&gt;
&lt;li&gt;What parts of the normal process were skipped&lt;/li&gt;
&lt;li&gt;What can be done to retroactively address the process parts that were skipped.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Completing this retrospective and giving time to solve technical debt accrued during a rush is, from my experience, the item that is most often skipped by companies. The reason for this is often that most projects are treated as emergencies that cannot be put off to handle tasks that aren’t part of the projects. This way of thinking snowballs into a code base that is a gigantic plate of &lt;a href="https://en.wikipedia.org/wiki/Spaghetti_code"&gt;spaghetti&lt;/a&gt; and a team that is paralyzed with fear at dealing with certain projects. Taking time to figure out what happened is important!&lt;/p&gt;

&lt;h3&gt;
  
  
  Don’t use these reasons all the time
&lt;/h3&gt;

&lt;p&gt;Rushing should be like salt; used sparingly. While it feels great to get something solved and out the door quickly that feeling is addictive. If a team rushes all the time it will find itself cutting corners on the ways to deliver good software. The more the corners are cut the harder it will be to get them instituted again. It’s a vicious cycle.&lt;/p&gt;

&lt;h2&gt;
  
  
  Personal Responsibility
&lt;/h2&gt;

&lt;p&gt;Recently a connection read and reviewed &lt;a href="https://blog.taylorbuiltsolutions.com/mentoring-a-software-engineering-team/"&gt;Mentoring a Software Engineering Team&lt;/a&gt; and gave me a great piece of feedback: &lt;strong&gt;I’d failed to comment on the responsibility each team member has to complete their tasks.&lt;/strong&gt; This article on sensible timelines is a good place to address this issue.&lt;/p&gt;

&lt;p&gt;Just as it is my job as a tech lead / senior engineer on my team to clear a path for the other engineers to get their work done it is their job to reciprocate this effort and get their work done. This includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Completing tasks in a timely manner&lt;/li&gt;
&lt;li&gt;Communicating clearly when there is an issue including

&lt;ul&gt;
&lt;li&gt;Unclear requirements&lt;/li&gt;
&lt;li&gt;Timelines that are too aggressive&lt;/li&gt;
&lt;li&gt;Environmental blockers&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Please note that taking personal responsibility does not mean working excessive hours. As discussed in this post sensible expectations for when work can be delivered are critical. Part of developing sensible expectations means planning for all team members to recreate and rest. Team members reporting lots of hours for tasks on a regular basis should be a red flag to spend time re-evaluating timeline expectations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Coming to the end of this post I feel like I have written a large advertisement for &lt;a href="https://basecamp.com/books/rework"&gt;Rework&lt;/a&gt; from the folks at &lt;a href="https://basecamp.com/"&gt;Basecamp&lt;/a&gt;. Please go read it. Rework talks about creating a business as a whole that will avoid many of the reasons to rush and, as such, it may disagree with what I’ve said here.&lt;/p&gt;

&lt;p&gt;That being said I’ve only ever worked at companies that often worked in a panic without sensible expectations of how quickly software can be delivered. I have often had to tell the folks I work with to go home, rest, and come back to reevaluate their expectations of how long tasks should take to get done. I will repeat the same thing here to you:&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Go get out of the office, recreate, and rest. Only then will you be able to see clearly what *actually&lt;/em&gt; needs to be done and how to best go about it.&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>projectmanagement</category>
      <category>softwaredelivery</category>
    </item>
    <item>
      <title>How To Make Remote Work Possible</title>
      <dc:creator>Taylor R Price</dc:creator>
      <pubDate>Thu, 21 Nov 2019 17:50:13 +0000</pubDate>
      <link>https://dev.to/trpricesoftware/how-to-make-remote-work-possible-31n5</link>
      <guid>https://dev.to/trpricesoftware/how-to-make-remote-work-possible-31n5</guid>
      <description>&lt;p&gt;This was originally &lt;a href="https://blog.taylorbuiltsolutions.com/how-to-make-remote-work-possible/"&gt;posted&lt;/a&gt; on my &lt;a href="https://blog.taylorbuiltsolutions.com/"&gt;blog&lt;/a&gt;. If you like it, please share to extend its reach.&lt;/p&gt;

&lt;p&gt;I have worked both in the office and full time remote for the same company over the nine years that I've worked there. Given my time doing both, I'd like to share some of the insights that I found. My hope is to provide companies and teams a suggestions to make them more productive and effective with both co-located and remote employees. In short, I'd like to help you make remote work possible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Side Note:&lt;/strong&gt; If you're considering starting a remote team, please read &lt;a href="https://basecamp.com/books/remote"&gt;Remote: Office Not Required&lt;/a&gt; by &lt;a href="https://twitter.com/jasonfried"&gt;Jason Fried&lt;/a&gt; and &lt;a href="https://twitter.com/dhh"&gt;DHH&lt;/a&gt;. What I'm going to say here is said more eloquently there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get The Right Tools
&lt;/h2&gt;

&lt;p&gt;There need to be simple, clear, and obvious ways of communicating. If an employee needs specific type of information or to communicate in a specific way they should not have to guess where to go or how to do this. This means having a single tool for each kind of communication. That includes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A text chat tool&lt;/li&gt;
&lt;li&gt;A video/voice chat tool&lt;/li&gt;
&lt;li&gt;A long form text tool&lt;/li&gt;
&lt;li&gt;Bug tracking software&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There are a couple caveats I’d like to include. The text chat tool needs to handle both two person chat and group/team chat. If the video/voice chat tool is rolled into the text chat app (like &lt;a href="https://products.office.com/en-us/microsoft-teams/group-chat-software"&gt;Microsoft Teams&lt;/a&gt; or &lt;a href="https://basecamp.com"&gt;Basecamp&lt;/a&gt;) so much the better. The long form text tool should be THE place for things like documentation, plans, etc. Lastly, the bug tracking software should be able to integrate with (or at least take links to) the long form text app so that stories can be tied to documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Prioritize&lt;/strong&gt; &lt;strong&gt;Asynchronous&lt;/strong&gt; &lt;strong&gt;Communication&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Humans, by nature, are social creatures. Some of us are introverts but, at the end of the day, we all need to socialize with our friends to some degree. Because we are at work many hours of our lives it is only natural to make friends and be social at work. Remote work certainly makes this difficult and I am aware of that. Please read what I have to say here with the understanding that I do enjoy social interaction and am not looking to discourage it. What I have to say here is for the purpose of making our work time more productive.&lt;/p&gt;

&lt;h3&gt;
  
  
  People need time for thought work
&lt;/h3&gt;

&lt;p&gt;When I go to dig into a bug report or feature I need time to do several things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Build context on the subject in my mind&lt;/li&gt;
&lt;li&gt;Understand the change being requested&lt;/li&gt;
&lt;li&gt;Plan how to make the change&lt;/li&gt;
&lt;li&gt;Implement the change&lt;/li&gt;
&lt;li&gt;Test the change&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If I've been working in a particular area of code recently or on a project that the change is related to these steps may happen quickly. In this case I've already got much of the context of the problem and the code in my brain.&lt;/p&gt;

&lt;p&gt;If, however, the arena of the problem is new to me this process can take a long time. Usually, I need to spend a lot of this time by myself building a mental model of the problem, our current solution, and what we want to do. Of course there will be a point in this process where I have enough context to ask good questions of others involved but, until then, that cannot happen. This is where remote work really shines.&lt;/p&gt;

&lt;h3&gt;
  
  
  People need &lt;strong&gt;lack&lt;/strong&gt; of &lt;strong&gt;distraction&lt;/strong&gt; for thought work
&lt;/h3&gt;

&lt;p&gt;In order for me to truly focus on building the aforementioned context I need not only time but a lack of distraction. I need to be able to put aside my worries about all of the other tasks I am responsible for so that I can focus on *this* one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Don’t distract the workers
&lt;/h3&gt;

&lt;p&gt;This all leads to the main point of this section. I am VERY capable of distracting myself without any external help. I would go so far as to consider myself an expert at distracting myself. In order to really focus on the task in front of me I need to temporarily put aside all the things that distract me. This includes things I typically want to read, watch, or play on my phone or computer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This includes your messages in all their forms.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Please don’t take this personally. It’s about me not you. What it does mean, however, is that I need to ignore you for a while so that I can get this task done. Believe me, I appreciate you and I WILL come back to what you’ve said and answer you. It will just be after I’ve accomplished enough on this topic that I feel comfortable taking a break.&lt;/p&gt;

&lt;h2&gt;
  
  
  Put ALL Of Your Meetings On The Calendar
&lt;/h2&gt;

&lt;p&gt;During the period that I worked remotely full time the company had few remote employees. None of them were full time remote workers other than I. As a result many of my co-workers fell back on "out of sight, out of mind" and treated those in the office as the only ones working. They did not do this on purpose but it, nevertheless, is what happened.&lt;/p&gt;

&lt;p&gt;When something needed to be communicated quickly impromptu meetings were often called by walking around and gathering everybody who needed to participate. This led to situations where I would report something only to be asked why I'd worked on it. It was clear from the meeting a few days ago that we weren't going to do that. Except that it was an impromptu meeting that hadn't included anybody who was remote at the time. At this point everybody would apologize and we would figure out how to move forward.&lt;/p&gt;

&lt;p&gt;This has led me to the opinion that all meetings should be scheduled on the calendars of those who should be included. Even if it is a short meeting that you want to have quickly, it should be sent as an invite with enough time for those who are remote to find it and be able to hop on the call. This will make sure that everybody who needs to be there can truly be there. I will re-iterate that I don't think any of my co-workers did this intentionally. The issue simply presented itself as a result of everybody working in the office.&lt;/p&gt;

&lt;h2&gt;
  
  
  Be a Remote First Team
&lt;/h2&gt;

&lt;p&gt;All of these suggestions are ways to help smooth communication with team members who are remote. The hardest shift for a company to make, however, is the mindset of the existing employees. The mindset needs to be that a team is a remote team regardless of whether parts of the team are co-located. That is, the team is a remote first team.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does a Remote First Team look like?
&lt;/h3&gt;

&lt;p&gt;This depends on the members of your team and how well each person handles working remotely. As pointed out by Rebecca Corliss in her article &lt;a href="https://medium.com/startup-grind/why-remote-first-is-actually-a-dangerous-mindset-674e9074e94d"&gt;Why “Remote-First” is Actually a Dangerous Mindset&lt;/a&gt;, some folks thrive from working in person. As I've mentioned in &lt;a href="http://blog.taylorbuiltsolutions.com/three-important-points-of-communication/"&gt;Three Important Points of Communication&lt;/a&gt;, talking over voice or in person is often the most efficient way to communicate.&lt;/p&gt;

&lt;p&gt;If your team has members who are co-located and work better face to face, I suggest that meetings be run in a hybrid manner. This means having TVs, phone systems, and cameras in conference rooms. When meetings are run, those who are co-located head to the conference room and dial into the meeting. These employees, however, need to make sure that they remember to give space for remote employees to speak. Interrupting several people talking face to face from over the phone is difficult. If your team can handle being fully remote for a meeting, this makes taking turns speaking much easier because everybody has speak up over the phone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Given the correct tools and mindset working remotely with a team can be a wonderful experience. The main thought I want to leave you with is this -- if you can learn to be patient and communicate asynchronously you will get a large percentage of the way toward being and effective remote team. If it's truly urgent pick up the phone and talk to your co-workers. And don't forget to socialize with your co-workers because working with friends can be great fun.&lt;/p&gt;

</description>
      <category>remote</category>
      <category>career</category>
      <category>hiring</category>
    </item>
    <item>
      <title>Addressing Arguments Against Unit Testing</title>
      <dc:creator>Taylor R Price</dc:creator>
      <pubDate>Tue, 19 Nov 2019 02:24:47 +0000</pubDate>
      <link>https://dev.to/trpricesoftware/addressing-arguments-against-unit-testing-17eo</link>
      <guid>https://dev.to/trpricesoftware/addressing-arguments-against-unit-testing-17eo</guid>
      <description>&lt;p&gt;This was originally &lt;a href="https://blog.taylorbuiltsolutions.com/addressing-arguments-against-unit-testing/"&gt;posted&lt;/a&gt; on my &lt;a href="https://blog.taylorbuiltsolutions.com"&gt;blog&lt;/a&gt;. Thanks for taking the time to read it here!&lt;/p&gt;

&lt;p&gt;I re-read my &lt;a href="https://blog.taylorbuiltsolutions.com/convincing-team-to-start-unit-testing"&gt;post&lt;/a&gt; about convincing a team to start unit testing and realized that, when addressing developers, I really only talked about resisting the urge to go crazy when refactoring. I didn’t, however, &lt;em&gt;actually&lt;/em&gt; address convincing them to start testing beyond the general arguments for unit testing. One place that I recommend everybody start is &lt;a href="https://testautomationu.applitools.com/setting-a-foundation-for-successful-test-automation/"&gt;this course&lt;/a&gt; created by &lt;a href="https://twitter.com/techgirl1908"&gt;Angie Jones&lt;/a&gt; at &lt;a href="https://testautomationu.applitools.com/"&gt;TestAutomationU&lt;/a&gt;. It’s got lots of great content related directly to this conversation, it’s well done, and it’s free with the exception of your time (of course). I recommend it highly enough that you should go NOW and, at a minimum, start the course. (And no they’re not paying me to say this) Now that you’re back, let’s get on to what I originally planned to talk about. That is the arguments that the developers that I work with have against testing even though they told me that the general benefits of testing I presented make sense.&lt;/p&gt;

&lt;h2&gt;
  
  
  Arguments Against Testing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;My project is late&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;As I’ve worked with my team to start testing, I’ve heard several variations of this argument which are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I’m already over my estimated time to finish, I haven’t started writing tests, and we didn’t estimate time to write tests into my work&lt;/li&gt;
&lt;li&gt;We’ve been working on this for a while and our clients have started asking about time to completion (or I’m worried they will start asking soon)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both of these statements end in the developer asking how they could possibly start testing now on this specific project. The fear surrounding trying to test when it hasn’t been planned for is totally valid. And yet my response to this is usually: &lt;strong&gt;&lt;em&gt;“when are you going to have a project that isn’t under a crazy deadline?”&lt;/em&gt;&lt;/strong&gt; If the answer is that you’ll never have time you should start planning time for testing on your next project. Or, better yet, the next part of your current project that you’ll be responsible for. Testing will make things busier and, possibly, more stressful in the short term but will reduce those things greatly over the long term as the code base becomes tested and reliable. In my experience these questions come up in environments that have lots of work to do and where work is expected to be done without delay in the quickest manner possible. This is precisely the case where testing will help the most over time and is the least likely to be supported by schedule, users, clients, management, or any combination of the above.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;My project is high priority&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This is really a variant of “my project is late” with the exception that the project is late before you’ve started working on it. Usually because it has high visibility to somebody in the company that can throw their weight around. Ok, that’s not always the case but, as in the case of a late project and until your team has developed good testing habits, you may want to punt until the next project to test (even though this project would benefit from testing). So far my answers have been “punt until the next project.” I really do want you to start testing BUT I want you to do it in a way that stands a chance of succeeding on project after project until it becomes habit.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The code I’m working on is too complex&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Now we’re past the “I don’t have time” arguments into something that can be turned into actual tests. If your code base has been around for any significant amount of time, this is the issue you’re going to present me with as soon as you actually try to start testing. By “significant amount of time” what I mean is any code that has been developed without tests (per, as always, &lt;a href="https://michaelfeathers.silvrback.com/"&gt;Michael Feathers&lt;/a&gt; in &lt;a href="https://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052"&gt;Working Effectively with Legacy Code&lt;/a&gt;). I will freely admit that your code is very complex. If it has been around for any length of time (and has survived its way to production), I have no doubt as to both it’s usefulness and complexity. That being said, that is not a reason for you to skip testing. It will simply mean that it will take you a lot of effort to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Figure out what to test&lt;/li&gt;
&lt;li&gt;Figure out how to test what you’ve decided to test&lt;/li&gt;
&lt;li&gt;Refactor the code so that it is testable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This will be HARD and will cause arguments about what, when, how, priority, and schedule. Hard, however, is not a reason not to test and the arguments are ok. They mean that you’re actively talking about how to make your code and team habits better; that is a GOOD thing. I promise you that the refactoring you’ll have to do will make your code better. I promise that the tests you write will become trip wires that safe guard further changes. And I promise that your code will become more understandable as you break it up and document it with your tests. I will just take time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://fft.dco.mybluehost.me/wp-content/uploads/2019/03/Give_Yourself_Time.jpg"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kMejBNpb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://fft.dco.mybluehost.me/wp-content/uploads/2019/03/Give_Yourself_Time.jpg" alt="Make sure to allow yourself the time to test. Don't be hard on yourself if it takes time to grow!"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;There is too much refactoring required&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I spoke about this in my last post a fair bit so I won’t beat it to death here. Lots of refactoring means that it will take more time to get your code completely covered with tests. I understand that refactoring takes time away from fixing bugs and adding new features that are critical. I also understand that refactoring may lead to changes that are separate from the specific feature or but that you’re changing and that will cause more testing for your QA / UAT staff. Yes, this additional work is a pain RIGHT NOW but, in the long run, you’ll be rewarded for spending the time with reduced time for and more confidence in changes in the future.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;TESTING IS HARD BUT NECESSARY. The benefits of testing apply to an existing code base but are difficult to get to. It takes persistence and the development of habits. But you’ll get there over time. I would love to hear what has worked for you or what issues have come up in your testing journey in the comments, on &lt;a href="https://twitter.com/TRPriceSoftware"&gt;Twitter&lt;/a&gt;, or via email (&lt;a href="mailto:taylor@taylorbuiltsolutions.com"&gt;taylor@taylorbuiltsolutions.com&lt;/a&gt;).&lt;/p&gt;

</description>
      <category>testing</category>
      <category>unittesting</category>
    </item>
    <item>
      <title>Yet More Reasons to Build a Remote Team</title>
      <dc:creator>Taylor R Price</dc:creator>
      <pubDate>Mon, 18 Nov 2019 07:20:42 +0000</pubDate>
      <link>https://dev.to/trpricesoftware/yet-more-reasons-to-build-a-remote-team-2e05</link>
      <guid>https://dev.to/trpricesoftware/yet-more-reasons-to-build-a-remote-team-2e05</guid>
      <description>&lt;p&gt;This was originally &lt;a href="https://blog.taylorbuiltsolutions.com/yet-more-reasons-to-build-a-remote-team/"&gt;posted&lt;/a&gt; on my &lt;a href="https://blog.taylorbuiltsolutions.com"&gt;blog&lt;/a&gt;. I hope that it will gain more reach by posting here.&lt;/p&gt;

&lt;p&gt;Recently I've been &lt;a href="https://basecamp.com/books/remote"&gt;reading&lt;/a&gt; a lot about remote work and have &lt;a href="https://blog.taylorbuiltsolutions.com/how-to-make-remote-work-possible/"&gt;written about it&lt;/a&gt;. I've also written recently about the value of &lt;a href="https://blog.taylorbuiltsolutions.com/three-important-points-of-communication/"&gt;context rich communication&lt;/a&gt; such as talking on the phone or in person. There were some points regarding the value of building a remote team that I missed in my last post and want to communicate here. These include finding talent in places you might not expect, finding talent that doesn't look like you expect, and providing a way for your creative workers to focus in a comfortable manner.&lt;/p&gt;

&lt;p&gt;I listen regularly to the &lt;a href="https://rework.fm/"&gt;Rework Podcast&lt;/a&gt; (by &lt;a href="https://basecamp.com/"&gt;Basecamp&lt;/a&gt;) and they recently produced the episode named &lt;a href="https://rework.fm/cult-of-overwork/"&gt;Cult of Overwork&lt;/a&gt;. As I was listening I realized that a LOT of the dialog sounded very familiar. After looking at the episode page I realized that I'd read the &lt;a href="https://medium.com/cantileverco/the-cult-of-overwork-and-how-to-avoid-it-7f6523753d6d"&gt;Cult of Overwork&lt;/a&gt; article on Medium written by &lt;a href="https://twitter.com/tyfuji"&gt;Ty Fujimura&lt;/a&gt;, who they were interviewing, soon after it was written last year. There's a lot in there that I agree with and, as such, there will be a lot of information written here that is very similar to what was written there. Hopefully we'll bring wider reach to the topic of remote working by having more people cover the topic. By stating the arguments in my own way I hope that it makes sense to you if it didn’t make sense when others have explained it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Find talent in areas other than your metropolis
&lt;/h2&gt;

&lt;p&gt;There are hot spots / tech hubs throughout the country. Though this isn’t a complete list but Silicon Valley, Silicon Beach (Santa Monica / Los Angeles), New York, and Austin all come to mind immediately for me. These are meccas for those who want to be in tech and want to have an interesting and well paying job. And, as such, the big companies have all opened large offices in these areas. As the cycle of people gathering and companies starting/gathering has continued the housing prices and commute times have increased commensurately. This is a negative impact on the life of everyone who lives in these areas.&lt;/p&gt;

&lt;h3&gt;
  
  
  What about the talent that cannot move to a tech hub?
&lt;/h3&gt;

&lt;p&gt;There are an incredible wealth of talented folks who live outside of the tech hubs. Many of them do not have the option of moving to a tech hub for a variety of reasons. The most important and urgent reason to me is &lt;em&gt;cost&lt;/em&gt;. There are folks who have taken it upon themselves to learn how to become a developer, devops engineer, security analyst, or . What happens when they cannot find a job near where they live, a remote job, or can not afford to live in a tech hub? Others would love to be able to train themselves but do not have physical coding bootcamps nearby, the knowledge of where to find training online, or the equipment to take advantage of them even if such equipment is "cheap". (&lt;em&gt;Note that this is an assumption given that I haven’t posted a study to prove it. I’d like to think that it’s a good assumption because we should always be seeking ways to lift up those who aren’t as fortunate as we are. I’ll post this on that basis and continue to look for studies that prove it&lt;/em&gt;)&lt;/p&gt;

&lt;h3&gt;
  
  
  What can we do about this particular issue?
&lt;/h3&gt;

&lt;p&gt;Regarding the problem of employing the currently talented folks the obvious answer is to start hiring remotely. If you give people the chance to work remotely and set aside your biases of what an employee should look like you'll be able to start finding folks to fill your needs. Yes, post your positions on the normal job boards, but also take a proactive approach and reach out to communities on social media where such folks gather.&lt;/p&gt;

&lt;p&gt;If you are a member of a community of tech folks who live outside of a major tech hub or are otherwise under-represented in tech please comment and let hiring managers know where to find you. Please message me with contact information on any available platform (&lt;a href="//mailto:taylor@taylorbuiltsolutions.com"&gt;email&lt;/a&gt;, &lt;a href="https://twitter.com/TRPriceSoftware"&gt;Twitter&lt;/a&gt;, &lt;a href="https://www.facebook.com/trprice.consulting/"&gt;Facebook&lt;/a&gt;, or &lt;a href="https://www.linkedin.com/in/taylor-price-0273048/"&gt;LinkedIn&lt;/a&gt;) and I’ll update this post with your information. I’ll also create another post about this issue with your info to extend the reach of the information.&lt;/p&gt;

&lt;h4&gt;
  
  
  UPDATE -- Options suggested from the community
&lt;/h4&gt;

&lt;p&gt;After posting this article &lt;a href="https://twitter.com/TRPriceSoftware/status/1192864957517316096?s=20"&gt;on Twitter&lt;/a&gt;, I received lots of great suggestions that I wouldn't have thought of given my background. The first set of advice that I'd like to offer comes from &lt;a href="https://twitter.com/TaelurAlexis"&gt;Tae'lur Alexis&lt;/a&gt; and &lt;a href="https://twitter.com/TaelurAlexis/status/1192887218622349312?s=20"&gt;gives a list of online code academies&lt;/a&gt; that are free or low cost. This suggestion provides a way for those without a ton of resources to teach themselves. Tae'lur herself raised herself to a career this way and these schools can provide an option for you to do that as well.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.udemy.com"&gt;udemy.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://freecodecamp.org"&gt;freecodecamp.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://udacity.com"&gt;udacity.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.edx.org"&gt;edx.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.khanacademy.org"&gt;khanacademy.org&lt;/a&gt; (this one added by me)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The second set of options comes from &lt;a href="https://twitter.com/techgirl1908"&gt;Angie Jones&lt;/a&gt; and surrounds how hiring managers can reach out to communities that are currently underrepresented in tech. These suggestions provide opportunities for companies to find talent in places that they might not normally look.&lt;/p&gt;

&lt;p&gt;Her &lt;a href="https://twitter.com/techgirl1908/status/1193384598257819650"&gt;first suggestion&lt;/a&gt; is to connect with the career centers or engineering departments at &lt;a href="https://en.wikipedia.org/wiki/Historically_black_colleges_and_universities"&gt;HBCUs&lt;/a&gt; and ask them for a list of their best students. If a company gives these students interesting projects to work on it is a win-win for both the company and the students. The students get practical hands on experience and the company gets potential future employees.&lt;/p&gt;

&lt;p&gt;Angie's &lt;a href="https://twitter.com/techgirl1908/status/1193385746066862080?s=20"&gt;second suggestion&lt;/a&gt; is for companies to send representatives to the various Black tech conferences that occur every year (including &lt;a href="http://convention.nsbe.org"&gt;NSBE&lt;/a&gt;, &lt;a href="https://afrotech.com/"&gt;AfroTech&lt;/a&gt;, and &lt;a href="https://www.bdpa.org"&gt;BDPA&lt;/a&gt;). As with many conferences, lots of top talent goes to conferences every year to learn and network. This suggestion would also work for other underrepresented communities that hold conferences every year.&lt;/p&gt;

&lt;p&gt;Lastly, Angie &lt;a href="https://twitter.com/techgirl1908/status/1193386819330535424?s=20"&gt;suggests&lt;/a&gt; connecting with communities on social media who are focused on curating content for people of an underrepresented group in tech. Angie's suggestions include &lt;a href="https://twitter.com/BTPipeline"&gt;Black Tech Pipeline&lt;/a&gt;, &lt;a href="https://www.techstackd.com"&gt;Tech Stack'd&lt;/a&gt;, and &lt;a href="https://twitter.com/WomenInLinux"&gt;Women in Linux&lt;/a&gt;. &lt;a href="https://twitter.com/emjay_hill"&gt;William Hill&lt;/a&gt; also &lt;a href="https://twitter.com/emjay_hill/status/1193383009728118785?s=20"&gt;suggested this&lt;/a&gt; and suggested &lt;a href="https://twitter.com/devcolororg"&gt;/dev/color&lt;/a&gt;, &lt;a href="https://twitter.com/lesbiantech"&gt;Lesbians Who Tech &amp;amp; Allies&lt;/a&gt;, &lt;a href="https://twitter.com/NextPlayEvents"&gt;Next Play Events&lt;/a&gt;, and &lt;a href="https://twitter.com/talkdatcode"&gt;DatCode&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thank you to all of those who have given suggestions on where to look to help bring people into tech who don't look like the current norm. I will continue to take suggestions and will likely create another post with more suggestions.&lt;/p&gt;

&lt;h4&gt;
  
  
  Options other than hiring remotely
&lt;/h4&gt;

&lt;p&gt;Other than being willing to hire remotely and/or hire somebody who doesn't look like you, how can you help this problem? That is a good question that I honestly don't have a single, complete, or "correct" answer to. If anybody who reads this has resources to help teach people, give people the opportunity to get interviews, or otherwise lift others up, PLEASE reach out. I'll be happy to update this post with resources. That being said here are some things that come to mind immediately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setup an internship program&lt;/li&gt;
&lt;li&gt;Support STEAM programs in schools&lt;/li&gt;
&lt;li&gt;Start or support coding boot camps&lt;/li&gt;
&lt;li&gt;Start or support scholarship programs at universities or boot camps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’ll put the same disclaimer here as above. These are just ideas that came to me as I wrote this. Please take some time to do some research into the effectiveness of these in general and, if the data is available, the effectiveness in your community. I will continue to read on this subject as well. Please leave me a message somewhere and let me know if you've worked on these things and let's get the information out on how to be effective.&lt;/p&gt;

&lt;h2&gt;
  
  
  Parents have skills that translate well to the workplace
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://medium.com/cantileverco/the-cult-of-overwork-and-how-to-avoid-it-7f6523753d6d"&gt;Ty's article&lt;/a&gt; had a paragraph about parents that resonated really well with me given that I’m a parent. The summarized version is that parents are very busy taking care of their children. They have lots of things to do and have to learn to prioritize effectively. By nature this forces parents to learn how to be as productive as possible in the short amounts of time they have available. These skills are directly transferable to the workplace. Ty says this well enough in his article that I would like to quote him here:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Parents bring unique and invaluable perspective to a team. When you take care of children, you have no choice but to grow more patient and more resilient. In giving so much to a child, you sublimate your ego. You learn how to teach, to motivate, and to energize another human being. You learn how to prioritize, and get the most out of short bursts of productive time. You learn how to push yourself harder than ever before. &lt;strong&gt;Who doesn’t want a teammate with those skills?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  You can only focus for a certain length of time
&lt;/h2&gt;

&lt;p&gt;There have been studies done on the capability of humans to focus creatively. Many of the studies show that there is a fairly hard limit at four hours of work per day that requires deep thought and creativity. In addition to Ty’s article, an article by &lt;a href="http://www.askpang.com"&gt;Alex Soojung-Kim Pang&lt;/a&gt; in &lt;a href="https://theweek.com/articles/696644/why-should-work-4-hours-day-according-science"&gt;The Week&lt;/a&gt; talks about this and makes reference to the &lt;a href="https://graphics8.nytimes.com/images/blogs/freakonomics/pdf/DeliberatePractice(PsychologicalReview).pdf"&gt;study&lt;/a&gt; by K. Anders Ericsson, Ralf Th. Krampe, and Clemens Tesch-Romer regarding the practice habits of violin students. The study talks about the necessity of practicing not only &lt;em&gt;deliberately&lt;/em&gt; but not so much in a given day that you burn out.&lt;/p&gt;

&lt;p&gt;My anecdotal assessment from my experience as a software engineer backs up this idea. In a given day, there are only a few hours in which I can really get into the flow of programming and be productive. Once those hours are spent I find that I begin distracting myself. While I can get more work done it tends to be routine work that doesn’t require a ton of creativity. There is, of course, lots of other work to be done in the course of running a business. Requirements gathering, planning, status updates, and team communication (among other things, of course). These are often the tasks I fall back on when I’m not actively being creative.&lt;/p&gt;

&lt;p&gt;How does this relate to remote work, you ask? Getting into this state of focus is much easier without the distractions that come in an office with all of the people and noise that are there. There are, of course, plenty of distractions at home but, if an employee can be comfortable and turn off all forms of communication for a while focusing becomes much easier and more likely.&lt;/p&gt;

&lt;p&gt;How we communicate with each other as a team also factors into this. If an team member is visibly sitting at their desk nearby it is easy to think that they are interruptible to help us solve our problem. The more energy it takes to communicate with somebody in a context rich fashion the more likely it is that we’ll be ok communicating asynchronously. If somebody is working remotely, it becomes much easier to communicate via message and only call when it really is critical to get information communicated quickly. This is yet another way that we can help our teammates get into their zone of focus.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;There are many reasons to work remotely or setup a remote team if your goal is to produce creative work (software, writing, art). I understand that many people value the connection, ability to communicate, and ability to make decisions quickly that comes with being together in person. That being said please consider how much of the in person communication actually has to happen in person. If you can make use of other ways to communicate richly (phone / video chat) and practice asynchronous communication you'll open a world of possible co-workers, customers, and productivity.&lt;/p&gt;

</description>
      <category>career</category>
      <category>hiring</category>
      <category>remotework</category>
    </item>
  </channel>
</rss>
