<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Phil Busch's Blog RSS Feed]]></title><description><![CDATA[Thoughts written by Phil Busch - Software Craftsman]]></description><link>https://philbusch.com</link><generator>GatsbyJS</generator><lastBuildDate>Mon, 24 Aug 2026 02:10:48 GMT</lastBuildDate><item><title><![CDATA[Solve Business Problems with Tracer Bullets]]></title><description><![CDATA[I've recently found myself discussing a technique at work called the Tracer Bullet Technique. This technique is something I first learned in…]]></description><link>https://philbusch.com/blog/2022/05/solve-business-problems</link><guid isPermaLink="false">https://philbusch.com/blog/2022/05/solve-business-problems</guid><pubDate>Sun, 22 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I&amp;#x27;ve recently found myself discussing a technique at work called the Tracer Bullet Technique. This technique is something I first learned in a book called &lt;em&gt;&lt;a href=&quot;https://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X&quot;&gt;The Pragmatic Programmer&lt;/a&gt;&lt;/em&gt; by Andrew Hunt and David Thomas. &lt;/p&gt;&lt;p&gt;The tracer bullet technique enables learning about a system by making small, interconnected, iterative changes to that system. &lt;em&gt;The Pragmatic Programmer&lt;/em&gt; describes it best as &amp;quot;code that glows in the dark.&amp;quot; Code written using the tracer bullet technique reveals the all the locations you need to change to solve a problem.&lt;/p&gt;&lt;h3&gt;How to use the Tracer Bullet Technique&lt;/h3&gt;&lt;p&gt;Let&amp;#x27;s say you onboard to a new team, and the first user story you pick up is to build a dashboard that allows a user to view and edit their account information on a website. &lt;/p&gt;&lt;p&gt;How do you discover how to implement this change? Ideally, you have great documentation and a team member to pair with, but potentially you don&amp;#x27;t. In that case, you&amp;#x27;ve got to start writing code somewhere. &lt;/p&gt;&lt;h4&gt;Find the place to start&lt;/h4&gt;&lt;p&gt;There is no magic formula for finding the first place to affect change. If you have prior experience with the technology you&amp;#x27;re using, or you believe you understand the solution design by reading the code, you can lean on that to identify a place for change. &lt;/p&gt;&lt;p&gt;If you&amp;#x27;re unsure where to start, take an educated guess of what code files you will be editing. Set some breakpoints, and execute your application. Breakpoints that you hit are places you can begin coding safely. If you can&amp;#x27;t run the application, get that working first. &lt;/p&gt;&lt;h4&gt;Make a small change&lt;/h4&gt;&lt;p&gt;The next step is to change some code. Potentially the previous step led you to discover an API controller in use on one of the pages in the application. Change the response body to include a hardcoded property set to a dummy string (&amp;quot;test&amp;quot;), and verify you see that property when you execute the code.&lt;/p&gt;&lt;p&gt;By making this small change, you&amp;#x27;re building your knowledge of the software&amp;#x27;s architecture. Your mental model now looks like this:&lt;/p&gt;&lt;div class=&quot;container-md&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;img style=&quot;max-width:290px;margin-bottom:1.45rem&quot; src=&quot;data:image/png;base64,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&quot; alt=&quot;Diagram showing an initial mental model of the system after the first tracer bullet change&quot; class=&quot;&quot;/&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;At this point, you might want to flush out and finish that API response body. &lt;strong&gt;Don&amp;#x27;t.&lt;/strong&gt; Instead, it is time to identify a tangential change to make.&lt;/p&gt;&lt;h4&gt;Make a Tangential Change&lt;/h4&gt;&lt;p&gt;Now you&amp;#x27;ll want to make a change to a piece of code that interacts with your first change. &lt;/p&gt;&lt;p&gt;In our API/UI example, the second change you might make is to learn how to utilize the hardcoded test property from the API response and display it in the markup on the page. This change would confirm that you know how to get API response data onto the UI.&lt;/p&gt;&lt;p&gt;As you make this change, take a look around and discover other potential areas of impact. Once you have the word &amp;quot;test&amp;quot; showing up in the markup, you&amp;#x27;ll may see that the markup is unstyled. Look around for some style sheets, SASS, or LESS files. Your mental model might look like this now:&lt;/p&gt;&lt;div class=&quot;container-md&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;img style=&quot;max-width:392px;margin-bottom:1.45rem&quot; src=&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYgAAAA8CAYAAAB8by3xAAAAAXNSR0IArs4c6QAADBpJREFUeF7tnX9sldUZxx8CSWtZIgiW4mib8Yexk7rIJhhMVDT8qC4zMY2LkWVhWoJVmmrq6h+E1aYLVgs2XSKIOEIUNMaQuEWj8AdKwmaom4sls/jHFiijITK6MujaP0iX5w3ncu7ped9z7r3nve97z/3ev7Dvuc97zuc87/M9z3POe501PT09TfiAAAiAAAiAgEJgFgQCPgECIAACIKAjAIGAX4AACIAACGgJQCDgGCAAAiAAAhAI+AAIgAAIgIA9AWQQ9qzQEgRAAATKigAEoqymG4MFARAAAXsCkQIxePiivaUUtKyuraT6hqoU9MS/LpSaL/g3AxgRCMRD4K61N4UajhSIE59cpImJeDrl2urY6CQtf2AeBMI12Gv23usboZqlc2OyDrMgAAJJEKiqIlqxvhCB+B9R473hBpIYlO6ex947B4GIcTJYIH7SVE3zaypivAtMgwAIFIvA0LGLVHUDBKJYvL2+DwTC6+nF4MqQAASiDCc9riFDIOIiC7sgkAwBCEQy3L28KwTCy2nFoMqYAASijCff9dAhEK6Jwh4IJEsAApEsf6/uDoHwajoxGBAgCAScwBkBCIQzlDAEAqkgAIFIxTT40QkIhB/ziFGAgCAAgYAvOCMAgXCGEoZAIBUEIBCOp2FycpLGx8cdWy3c3Jw5c2jBggWFG4qwAIGIFS+Mg0DRCUAgHCOHQOBNascuBXMgkBgBCIRj9BAICIRjl4I5EEiMAATCMXoIBATCsUvBHAgkRiBRgfj00z/QLbcsocbG5VkAhob+Sh0dm7L+dttty6i7u59uvHFe8PczZ/5JW7e20QsvvDTj+2E0i/FjfSwQIyMj1NXVRY2NjbRx48as7hw5coQOHjxI3d3dNDw8TP39/ZGTv3nzZtq9e3dkm/b2dlq5cmVwz1OnTmW17e3tpWXLllHa9iDGx/9D27a10x13/JiefHJLVp/ZLz7++FBmvtX/zvdpmZqapNde6wm+/txzW6miojJfUzl97623fkfvv78/8x3Vl3Mydq1xFL987Nl+xzRvBw68ST09A/TNN0O0c2d3pNm+vj3Bs8vP+4kTx2f4gfp3l2M22RLXh4dPzhjD6tXrA//hD/vT0aOfZNqIa+xbIkadPz+auf7889to3bqfabmwn3z33fkZvqnaEdyEEV28FG2Ez6t97OjoCmKC6ZOYQIgJWLx4yQwgYsAyCPGQib/5IBC1tbWZ+ZmamqKBgQFauHDhDFGRJ3Hfvn104cIFamtro4qK67+aeunSpRmidPLkSers7KTm5mZqaWlJ1Sa1KdD4IhAsbiJo1tX9IAgax48fpccf/5Xp2Yy8Lh78m29eNCOwRn2xULE1zZs8VtEPU1/D+qQGTFNQzwWoyZbpOt+L+/f113/JLGQ4bp07dzYQAN33333393TPPauJ/UD9iPZPPdWWteBV7yFYPvzwo0E7EQefeKIluC9ff+edN6m5+RfBYjqqjza8EhMIhvnRR4fo8uX/0qZN7VnQdAKhAodAmAWCHYAFZWhoiLZv3051dXU2PpF3m1xOMZkCjQ8CYQqMeYMu4ItpFAh18cfDE/7B/xaVA5ugbYvGZMv2+kMPParNCDiGvfrqb4JsSicIaj9182IzV1FtxBjC+mjDKhGBkFWQU8slS+qzIOsEQi0PcNpW6iWmuDMIdgBR0tqxYwc1NDTY+ETebYopELqgYuq4rsSkpudyiUDnh+rKcXx8LPBDUUaQy0e2JS21hCBsVFZWBiWMuXO/R1euXA5KGYsWLaYXX/wtvfHGTuLyx2OP/TLIIISN++5bm1XOkksaHEzUso9arjAxNAl7rhmEXAIRY+E+CPY8XhFkTUHb1Hf5uslWodfDfEfXR8HgzjtXZOKgbXBXM9RcxmjDKxGBYGfes6c/2D84c+YftHfvQNb+AjKI7H2LfEtMPmcQLgSC94t27eqjp5/uCNJxNSjoMgA5c7311h8GfvzIIz8PVolRAiQHOnk+ha+rgfzs2dO0YUNLpsat1q7DMmoWCLGnI4uG+JvNqjQqcLgWCGGPhfnLL/8cxASeC+7nt9/+PRBGEThNQdsm4Ik2Jlum62xHCK5uTylM+HR95Hnq6+si3hcQ2YatwMh7Jbr9jag+2vBKRCD44eYPO62u9ha2B/H554czq4lSKDGpG8ZiQqqrq4NN6rgzCLEHwZvYTU1N2IOw2KQ2bZCbAqyutCBnCLJQmEpQURmIbcnVNB6bIKFbleo2b7mdTgijximC47PPdtKhQweJa+ssvJw58b+5wqDGCt3BhnzHEWYrbJM6aoNYJxTyAQU5Q5L7y3P01VcnsvZibQWC7agb0apQyFlyrgckii4QOkFQN6PK5RRTHAKBU0zhoUIXcHWBQH6I5FT//vvXBoFLLgXoTomEZQvC1tjYv4OFDn+4PCU2GNWeRwVWW4FQBcskcKZA6zqDkPvzxRfHiDOnNWt+mqkw8N9E8OSML+zkm6nf6nVThmC6rtoTi4D58xdkVUNEO7GSV0UibHM6F4GQ+yIESZdNyH3s7d1FlZU3GLEVXSB0dVB15WEDJ58M4uiBEXr7jy/Rv8b+ZgSTb4NVq1bRli1brI65xiEQuqO1PJbTp09Ta2trvsOy+t7GNXtp3YYGq/8ntSnQxLlJLU7+2JZgxArvwQebghMi6qapfBLPtDkpnzppaGiM3EcrB4GQF4e8j8Mlu9tv/xFNTFwJKgzMU5Sg2QnTKhDcN1PcUk8Uie+oJXb+u3o6yeoBlLIJbq87yi36uH//h1RT832j2aIKRFhQUDdkTKBlgLm8BwGBSI9ARAU/NaMsdNUrngL1nqpdcX109GzWKjCszqsTA+67XAoNW7nyyZK77743MuC5EAg1KBXK0iTsuWxSq+OTszHdcfa6uqWpFgjTolXHnudHPaQjl41UXzRG9GvHb3XvU8hx85VXdqdPIKICv+zIvHHNL8pFnbAwTYYOZNpelCtmBpG2F+V4fkQ2KafDYZu2ckbB37XZpFZ9RP1vXfmFSxy6AK8L/Dp7n312mAYHj2de4FRfBlXthDHg8/SipKV71yGsxCSXq3Qsw55BXTale4ZcCoTupI4aROU2JkGVA6C8WZ/rOLi9TYlJfq9BXVywjQ8+eDs4aCC/NKceIlA3p+W+hpWtZFFR36tR5zysj6ksMb388lYKU0TZcRkSBEK/VsjlRTnZQhoFQk7L5b6qC4OwlRe/nWw6pqmWNNXarLyJyNfCgnLYC26yfVFfFhlQa2sHvf56X9abtrpNQnXPjds888yvqb5+abDnkYtA8CmYwcE/ZXDqatHymMWxXnFsPKyGLgy6FAjdIk/lLGcZ/PIXl5ii3m7OdRxhtri81dPTGXov3XXdEWnZr9W50G1Oq0+9bo+L/YOFhzfYeUESdnRZt78m99EmGylqicmmQ3G2KVYGgZ/7vv6Gd5zzCdvXCeSTUav8WKj45dVi/gxJHHPoyzjiYJOrTQhErsQM7fFjffixPscuZWWuUIFQf8LB6qYpbOTLONKCFgLheCYgEBAIxy5lZa4QgfAlqPoyDqsJL1IjCIRj0BAICIRjl4I5EEiMAATCMfqrV68Si0TaPrNnzyb+bZ84P7n8FlOc/YBtEAABNwQgEG44ZqxAIJBBOHYpmAOBxAhAIByjh0BAIBy7FMyBQGIEIBCO0UMgIBCOXQrmQCAxAhAIx+ghEBAIxy4FcyCQGAEIRGLo/bsxNqn9m1OMqLwJQCDKe/6djh4C4RQnjIFA4gQgEIlPgT8dgED4M5cYCQgwAQgE/MAZAQiEM5QwBAKpIACBSMU0+NEJCIQf84hRgIAgAIGALzgjAIFwhhKGQCAVBCAQqZgGPzoBgfBjHjEKEEAGAR9wTgAC4RwpDIJAogSQQSSK36+bQyD8mk+MBgTcCMREaYAcG52k5Q/Mo/qGqtLocIn1kgWiZuncEus1ugsCIBBFoKqKaMX6m0KbzJqenp4Ouzp4+GJJ0a2urYRAxDRjpeYLMWGAWRDwjsBda/MUCO9IYEAgAAIgAALWBCIzCGsraAgCIAACIOAdAQiEd1OKAYEACICAGwIQCDccYQUEQAAEvCMAgfBuSjEgEAABEHBDAALhhiOsgAAIgIB3BCAQ3k0pBgQCIAACbgj8H4mLOx/JgKnYAAAAAElFTkSuQmCC&quot; alt=&quot;Diagram showing the expanded mental model after a tangential change from API to UI&quot; class=&quot;&quot;/&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;You may be thinking it is time to style that markup. Fight that urge. It&amp;#x27;s time to make a change in a different spot.&lt;/p&gt;&lt;h4&gt;Make a Tangential Change in a different piece of the code near your first change&lt;/h4&gt;&lt;p&gt;You now want to repeat the same process in a different direction in the stack. Our previous changes went &amp;quot;up&amp;quot; to the UI. Now, you&amp;#x27;ll want to go &amp;quot;down&amp;quot; towards the data. Perhaps the next change moves your hardcoded test property to be populated by a piece of code in a data access layer you discover, and mapped to an API response body.&lt;/p&gt;&lt;p&gt;Now this might be the solution you see:&lt;/p&gt;&lt;div class=&quot;container-md&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;img style=&quot;margin-bottom:1.45rem&quot; src=&quot;data:image/png;base64,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&quot; alt=&quot;Diagram showing the mental model extended down into the data access layer&quot; class=&quot;&quot;/&gt;&lt;/div&gt;&lt;/div&gt;&lt;h4&gt;Get to the Edges&lt;/h4&gt;&lt;p&gt;At this point the architecture has become clear. Make small changes to round out your data to come from your data store, and style your dummy text. This can get you to a full understanding of the architecture:&lt;/p&gt;&lt;div class=&quot;container-md&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;img style=&quot;margin-bottom:1.45rem&quot; src=&quot;data:image/png;base64,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&quot; alt=&quot;Diagram showing the complete system architecture discovered using the tracer bullet technique&quot; class=&quot;&quot;/&gt;&lt;/div&gt;&lt;/div&gt;&lt;h4&gt;Build the smallest feature possible&lt;/h4&gt;&lt;p&gt;Now that you can affect change everywhere that matters, you can make a pivot to delivering value. Pick the smallest requirement you can identify from your user story and implement it. That may be as simple as displaying the user&amp;#x27;s first and last name on the profile screen you are building. &lt;/p&gt;&lt;p&gt;As you now understand the architecture, implementing this will fall into place. &lt;/p&gt;&lt;h4&gt;Get feedback&lt;/h4&gt;&lt;p&gt;Once you have the feature working, you need to find out if the other requirements on your user story are still valuable at this time. Show a decision-maker what you have created. Ask them questions like these:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;What do you think of this change?&lt;/li&gt;&lt;li&gt;Can we go live with just this functionality as-is?&lt;/li&gt;&lt;li&gt;Do we still want the other requirements on this user story as originally planned?&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Iterate&lt;/h4&gt;&lt;p&gt;You&amp;#x27;ll likely be asked to tweak what you&amp;#x27;ve created or add more functionality. Now that you have knowledge of how to change the whole solution, that won&amp;#x27;t be a problem. It should be easy for you to start making tweaks, get feedback, and eventually go live. &lt;/p&gt;</content:encoded></item><item><title><![CDATA[Mermaid.js Diagrams in Azure DevOps Wikis]]></title><description><![CDATA[As I've been reading books this year, I've found that I've wanted to start capturing notes and thoughts about the reading I'm doing…]]></description><link>https://philbusch.com/blog/2022/04/mermaid-js-flow-charts-azure-devops-wiki</link><guid isPermaLink="false">https://philbusch.com/blog/2022/04/mermaid-js-flow-charts-azure-devops-wiki</guid><pubDate>Sat, 30 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;As I&amp;#x27;ve been reading books this year, I&amp;#x27;ve found that I&amp;#x27;ve wanted to start capturing notes and thoughts about the reading I&amp;#x27;m doing somewhere. I&amp;#x27;ve begun to use Azure DevOps&amp;#x27; Wiki functionality to write down the takeaways from my reading. &lt;/p&gt;&lt;p&gt;Azure DevOps has been a good tool for this purpose. There is a lot that I like about it. It is free, and I feel it has the right UX for a technical user such as myself. Wiki pages are defined as Markdown, which I&amp;#x27;m very comfortable using. Additionally, each wiki is a git repository, which makes it very easy to track changes as time passes.  &lt;/p&gt;&lt;div class=&quot;container-md&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;img style=&quot;max-width:1000px;margin-bottom:1.45rem&quot; src=&quot;static/AzureDevOpsEditingWiki-0ed5c261ee00d99ad192c112f0ec04e5.png&quot; alt=&quot;Editing a Markdown wiki page in Azure DevOps&quot; class=&quot;rounded&quot;/&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;One feature I&amp;#x27;ve recently discovered is flow charts powered by &lt;a href=&quot;https://mermaid-js.github.io/mermaid/#/&quot;&gt;Mermaid&lt;/a&gt;. Mermaid is a markdown-style syntax to create diagrams and visualizations. A Mermaid diagram can be inserted on a wiki page simply by pressing this button in the ribbon:&lt;/p&gt;&lt;div class=&quot;container-md&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;img style=&quot;max-width:300px;margin-bottom:1.45rem&quot; src=&quot;data:image/png;base64,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&quot; alt=&quot;Azure DevOps wiki ribbon button used to insert a Mermaid diagram&quot; class=&quot;rounded&quot;/&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;This inserts the following syntax onto the wiki page:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;::: mermaid
 graph LR;
 A[Wiki supports Mermaid] --&amp;gt; B[Visit https://mermaidjs.github.io/ for Mermaid syntax];
:::
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That syntax creates the following diagram:&lt;/p&gt;&lt;div class=&quot;container-md&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;img style=&quot;max-width:700px;margin-bottom:1.45rem&quot; src=&quot;data:image/png;base64,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&quot; alt=&quot;Rendered starter Mermaid flow chart in an Azure DevOps wiki&quot; class=&quot;rounded&quot;/&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;I find that forming a visualization is a way for me to cement my learning on a topic. I often best understand multi-step processes graphically. For example, here&amp;#x27;s the diagram I&amp;#x27;ve created to help me capture my understanding of a thought process around waste elimination in a production process I read about in &lt;a href=&quot;https://www.amazon.com/Toyota-Production-System-Beyond-Large-Scale/dp/0915299143&quot;&gt;Taiichi Ohno&amp;#x27;s &lt;em&gt;Toyota Production System&lt;/em&gt;&lt;/a&gt;:&lt;/p&gt;&lt;div class=&quot;container-md&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;img style=&quot;max-width:1000px;margin-bottom:1.45rem&quot; src=&quot;static/AzureDevOpsWasteEliminationDiagram-e23f396e514e62ce28187823d314d671.png&quot; alt=&quot;Mermaid flow chart diagramming a waste-elimination thought process from Toyota Production System&quot; class=&quot;rounded&quot;/&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;::: mermaid
graph LR;
 A[Look at the efficiency of each operator] 
 B[Look at the efficiency of each line] 
 C[Look at the efficiency of operators as a group] 
 D[Look at the efficiency of the entire plant/all lines]
A --&amp;gt; B
A --&amp;gt; D
B --&amp;gt; C
C --&amp;gt; D
D --&amp;gt; A;
:::
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I have found that Azure DevOps doesn&amp;#x27;t seem to support all of the available syntax from the Mermaid.js documentation. However, what it does support is very useful. I&amp;#x27;m going to be looking for more opportunities to explore Mermaid in the near future. &lt;/p&gt;&lt;p&gt;If you want to play around with the technology yourself, feel free to use the Mermaid Live Editor by clicking on the diagram below:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://mermaid-js.github.io/mermaid-live-editor/edit#pako:eNpdUMlugzAQ_ZWpL22l5Ac4VAohiSp1iRpukMMID9gK2JEZGkXAv9eJQYrqk9-8ZZZeFFaSiETl8KwgTXID_q2yH0IJe6Xr5xbi2lZHWC7fIH7Z13gFdLYzEi6aFXySa1BL-NC_BBup2brXEBLfLes-VdqcwJYgdVmSI8PAvlS1wNbX0LduxmBZ3yzDt6EBkiy29gRflqk9PrLpxQ6wyVauUJqp4M4RJCHln1A58kHbLNYVvEvC9mnid9mB0fHc3M8yM8l95l0Am0ewDQBALEQTdvZn629kLlhRQ7mI_FdSiV3NucjN6KXdWSJTuIuISqxbWgjs2B6uphARu45m0bTEpBr_ADfAghI&quot;&gt;&lt;img src=&quot;https://mermaid.ink/img/pako:eNpdUMlugzAQ_ZWpL22l5Ac4VAohiSp1iRpukMMID9gK2JEZGkXAv9eJQYrqk9-8ZZZeFFaSiETl8KwgTXID_q2yH0IJe6Xr5xbi2lZHWC7fIH7Z13gFdLYzEi6aFXySa1BL-NC_BBup2brXEBLfLes-VdqcwJYgdVmSI8PAvlS1wNbX0LduxmBZ3yzDt6EBkiy29gRflqk9PrLpxQ6wyVauUJqp4M4RJCHln1A58kHbLNYVvEvC9mnid9mB0fHc3M8yM8l95l0Am0ewDQBALEQTdvZn629kLlhRQ7mI_FdSiV3NucjN6KXdWSJTuIuISqxbWgjs2B6uphARu45m0bTEpBr_ADfAghI&quot;/&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Keeping my focus with Gitlab Workflow for Visual Studio Code]]></title><description><![CDATA[Last week, I wrote a  post about Gitlab CI/CD  and how I'm using it to deploy Azure Functions for a personal project. While writing that…]]></description><link>https://philbusch.com/blog/2022/02/gitlab-plugin-vs-code</link><guid isPermaLink="false">https://philbusch.com/blog/2022/02/gitlab-plugin-vs-code</guid><pubDate>Sun, 20 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Last week, I wrote a &lt;a href=&quot;/blog/2022/02/gitlab-ci-dot-net-6-azure-function&quot;&gt;post about Gitlab CI/CD&lt;/a&gt; and how I&amp;#x27;m using it to deploy Azure Functions for a personal project. While writing that article, I discovered a fantastic extension for Visual Studio Code that I think is worth sharing. That extension is called the &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=GitLab.gitlab-workflow&quot;&gt;Gitlab Workflow for Visual Studio Code&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Visual Studio Code is often my IDE of choice on personal projects. Many of my personal projects use very lightweight technologies, such as Gatsby and Azure Functions, that are easy to develop without a full IDE. I don&amp;#x27;t want to spend a lot of money on something that I&amp;#x27;m using to learn, so VS Code fits the bill. One of the benefits of using Visual Studio Code is that it has a rich extension ecosystem. This makes it easy to tailor my local development experience to the technologies I&amp;#x27;m using. &lt;/p&gt;&lt;h3&gt;Installation and Setup&lt;/h3&gt;&lt;p&gt;Installing the extension was very easy. I found the extension using the Extensions Marketplace in VS Code:&lt;/p&gt;&lt;div class=&quot;container-md&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;img style=&quot;max-width:700px;margin-bottom:1.45rem&quot; src=&quot;static/gitlab-workflow-install-c189e06ab18a486b533b8178ed0b31db.png&quot; alt=&quot;Installing the Gitlab Workflow extension from the VS Code Extensions Marketplace&quot; class=&quot;rounded&quot;/&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;I then created a Personal Access Token in Gitlab, which &lt;a href=&quot;https://gitlab.com/-/profile/personal_access_tokens&quot;&gt;I could do on this page&lt;/a&gt;. I had to configure the extension to use the newly created PAT. That was easy - there is a command built included with extension to do that. I could find it in the Command Palette:&lt;/p&gt;&lt;div class=&quot;container-md&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;img style=&quot;max-width:700px;margin-bottom:1.45rem&quot; src=&quot;static/gitlab-workflow-set-pat-7015de1b16b6ca01ef128e1becaa764e.png&quot; alt=&quot;VS Code Command Palette showing the Gitlab Workflow command to set a Personal Access Token&quot; class=&quot;rounded&quot;/&gt;&lt;/div&gt;&lt;/div&gt;&lt;h3&gt;Using the Extension&lt;/h3&gt;&lt;p&gt;I can use the extension on any Gitlab repository open in Visual Studio Code. The extension is smart enough to know when its features are available. I&amp;#x27;ve explored two of the features so far.&lt;/p&gt;&lt;h4&gt;Pipeline Status&lt;/h4&gt;&lt;p&gt;My favorite feature of the extension is its integration with Gitlab CI/CD Pipelines. My projects initiate a CI pipeline on every commit to the main branch. Prior to using this extension, I would manually go to Gitlab in a web browser to check the status and make sure my pipeline was passing. With the Gitlab Workflow extension, I can now see a pipeline&amp;#x27;s execution progress and status in the VS Code Status bar. I value this feature as it allows me to keep writing code and not break focus. It is also great when I am working with one screen.&lt;/p&gt;&lt;div class=&quot;container-md&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;img style=&quot;max-width:500px;margin-bottom:1.45rem&quot; src=&quot;data:image/png;base64,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&quot; alt=&quot;VS Code status bar showing Gitlab CI/CD pipeline execution status&quot; class=&quot;rounded&quot;/&gt;&lt;/div&gt;&lt;/div&gt;&lt;h4&gt;Validating &lt;code&gt;.gitlab-ci.yml&lt;/code&gt;&lt;/h4&gt;&lt;p&gt;Something that is always tricky with YAML-based DevOps pipelines is ensuring the syntax in the YAML file is correct. From incorrect usage of tabs, to the wrong syntax, there is some learning curve to this powerful paradigm. I have spent many hours of my life checking in YAML files for Gitlab and other DevOps tools only to find out that I did not write that file correctly when the pipeline executes. This feedback loop is slow and cumbersome.&lt;/p&gt;&lt;p&gt;The Gitlab Workflow Extension has a useful feature that allows &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; to be validated without pushing changes to the remote repository. Using it is simple. With &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; open in my active editor, there is a command available in the Command Palette:&lt;/p&gt;&lt;div class=&quot;container-md&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;img style=&quot;max-width:500px;margin-bottom:1.45rem&quot; src=&quot;data:image/png;base64,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&quot; alt=&quot;VS Code Command Palette showing the command to validate a .gitlab-ci.yml file&quot; class=&quot;rounded&quot;/&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;This command parses the file, and will provide toast messages of any problems found:&lt;/p&gt;&lt;div class=&quot;container-md&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;img style=&quot;max-width:500px;margin-bottom:1.45rem&quot; src=&quot;data:image/png;base64,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&quot; alt=&quot;Toast notification showing the result of validating a .gitlab-ci.yml file&quot; class=&quot;rounded&quot;/&gt;&lt;/div&gt;&lt;/div&gt;&lt;h3&gt;Just scratching the surface&lt;/h3&gt;&lt;p&gt;I&amp;#x27;m just beginning to scratch the surface on the Gitlab Workflow Extension. As I learn more, I&amp;#x27;ll share my findings. I hope that this post introduced you to something new!&lt;/p&gt;&lt;p&gt;If you&amp;#x27;re interested in learning more, you can find the docs for the extension &lt;a href=&quot;https://docs.gitlab.com/ee/user/project/repository/vscode.html&quot;&gt;here&lt;/a&gt;. You can also find the extension&amp;#x27;s source code &lt;a href=&quot;https://gitlab.com/gitlab-org/gitlab-vscode-extension#extension-settings&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Building and Deploying a .NET 6 Azure Function with Gitlab CI/CD]]></title><description><![CDATA[I use Gitlab for my source code for most of my personal projects. There is a lot that I like about Gitlab. There are unlimited repositories…]]></description><link>https://philbusch.com/blog/2022/02/gitlab-ci-dot-net-6-azure-function</link><guid isPermaLink="false">https://philbusch.com/blog/2022/02/gitlab-ci-dot-net-6-azure-function</guid><pubDate>Sun, 13 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I use Gitlab for my source code for most of my personal projects. There is a lot that I like about Gitlab. There are unlimited repositories, and I can choose to make any of them private if I&amp;#x27;d like. One of the features that I like most about Gitlab is &lt;a href=&quot;https://docs.gitlab.com/ee/ci/&quot;&gt;Gitlab CI/CD&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;Gitlab CI/CD is a DevOps tool that allows me to create pipelines that automatically build and deploy the code in the git repository. Pipelines are defined as YAML files with the name &lt;code&gt;.gitlab-ci.yml&lt;/code&gt;, and saved in the root of the repository. There is a defined syntax to build these pipelines, and they get versioned in the same way that the rest of the codebase in the git repository does.&lt;/p&gt;&lt;p&gt;I&amp;#x27;m working on a .NET 6 Azure Function for a side project right now. My git repository for this is hosted in Gitlab, and I&amp;#x27;m looking for easy ways to deploy the code out to Azure. Visual Studio Code has an Azure plugin that allows for deployment to Azure. While this works, I must remember to deploy every time I commit a change to the master branch of my git repository, and I want to eliminate mistakes. I&amp;#x27;ve created a Gitlab CI/CD pipeline that allows me to build, test, and deploy on every commit.  &lt;/p&gt;&lt;h3&gt;Just show me the code!&lt;/h3&gt;&lt;p&gt;Here&amp;#x27;s the code for my &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; file for my project:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;image: mcr.microsoft.com/dotnet/sdk:6.0

stages:
    - build
    - test
    - deploy

build:
    stage: build
    script:
        - &amp;quot;dotnet build&amp;quot;
    artifacts:
      paths:
        - bin/

test:
    stage: test
    script: 
        - &amp;quot;dotnet test&amp;quot;

deploy:
  stage: deploy
  script:
    - curl -sL https://aka.ms/InstallAzureCLIDeb | bash
    - apt-get install curl &amp;amp;&amp;amp; curl -sL https://deb.nodesource.com/setup_12.x | bash -
    - apt-get install nodejs
    - npm install -g azure-functions-core-tools@4 --unsafe-perm true
    - az login --service-principal -u $APPLICATION_ID -p $APPLICATION_SECRET --tenant $TENANT_ID
    - func azure functionapp publish $FUNCTION_APP --csharp
  only:
    - master
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You may be asking yourself: What does this all mean? Let&amp;#x27;s break it down, section by section.&lt;/p&gt;&lt;h3&gt;The &lt;code&gt;image&lt;/code&gt; property&lt;/h3&gt;&lt;p&gt;Gitlab CI/CD pipelines execute in a Docker container. This helps enable repeatability of the pipeline execution. &lt;code&gt;image: mcr.microsoft.com/dotnet/sdk:6.0&lt;/code&gt; defines that this pipeline will run in the official &lt;a href=&quot;https://hub.docker.com/_/microsoft-dotnet-sdk/&quot;&gt;.NET 6 Docker Image&lt;/a&gt;. This image is needed as my project is a .NET 6 project.&lt;/p&gt;&lt;h3&gt;The &lt;code&gt;stages&lt;/code&gt; property&lt;/h3&gt;&lt;p&gt;Gitlab CI/CD has a feature called stages. Stages contain groups of jobs that execute. My pipeline defines three stages that will run in sequence - &lt;code&gt;build&lt;/code&gt;, &lt;code&gt;test&lt;/code&gt;, and &lt;code&gt;deploy&lt;/code&gt;.&lt;/p&gt;&lt;h3&gt;&lt;code&gt;build&lt;/code&gt; and &lt;code&gt;test&lt;/code&gt; stages&lt;/h3&gt;&lt;p&gt;These stages use the &lt;a href=&quot;https://docs.microsoft.com/en-us/dotnet/core/tools/&quot;&gt;.NET CLI&lt;/a&gt; to build and test the code for my Azure Function. I can use the .NET CLI in this pipeline because it is included with the official .NET 6 Docker Image. The features of the .NET CLI could be a completely different series of blog posts. It&amp;#x27;s an essential tool for modern .NET development, with many powerful features. &lt;/p&gt;&lt;p&gt;Other than the .NET CLI commands, the &lt;code&gt;artifacts&lt;/code&gt; portion of the &lt;code&gt;build&lt;/code&gt; stage is key to allowing us to deploy the Azure Function. The &lt;code&gt;artifacts&lt;/code&gt; section states that the bin folder, which is where the built code resides, will be consumable in future stages of the Gitlab CI/CD pipeline.&lt;/p&gt;&lt;h3&gt;The &lt;code&gt;deploy&lt;/code&gt; stage&lt;/h3&gt;&lt;p&gt;This is where the real fun begins! The official .NET 6 Docker Container defined in the &lt;code&gt;image&lt;/code&gt; property is executing using Gitlab CI/CD&amp;#x27;s shared runners on Linux. Due to this, all of the commands in this stage are compatible with a Linux-based host. All of the magic in this stage is defined under &lt;code&gt;script&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;This script does the following:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Uses &lt;a href=&quot;https://everything.curl.dev/project/does&quot;&gt;curl&lt;/a&gt; to download a Microsoft script &lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/install-azure-cli-linux?pivots=apt#option-1-install-with-one-command&quot;&gt;to install the Azure CLI&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Install Node.js, which is a prerequisite for the next step&lt;/li&gt;&lt;li&gt;Instal &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local?tabs=v4%2Clinux%2Ccsharp%2Cportal%2Cbash&quot;&gt;Azure Functions Core Tools&lt;/a&gt; using the Node Package manager. I&amp;#x27;m using v4 of the Azure Functions Core Tools as my function uses the version 4.x runtime.&lt;/li&gt;&lt;li&gt;Login to Azure using the Azure CLI (&lt;code&gt;az&lt;/code&gt;) with a &lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/create-an-azure-service-principal-azure-cli?toc=%2Fazure%2Fazure-resource-manager%2Ftoc.json&amp;amp;view=azure-cli-latest&quot;&gt;Service Principal&lt;/a&gt;. I created a Service Principal independent of my DevOps pipeline, and I&amp;#x27;m using Gitlab CI/CD variables to pass in sensitive values.&lt;/li&gt;&lt;li&gt;Use the Azure Function Core Tools that was installed in the previous step to publish my function to Azure.&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;Wrapping up&lt;/h3&gt;&lt;p&gt;This solution has allowed me to make the development of my Azure Functions faster and less error prone. There&amp;#x27;s a lot of cool technology to dig into further here. I hope this post gives you some inspiration on what you&amp;#x27;re working on.&lt;/p&gt;&lt;p&gt;P.S.: Credit goes to &lt;a href=&quot;https://dev.to/alandecastros/gitlab-ci-script-to-deploy-a-azure-function-3gc4&quot;&gt;this post on dev.to&lt;/a&gt; and &lt;a href=&quot;https://stackoverflow.com/questions/68090180/gitlab-code-to-deploy-azure-function-how-to-control-version-numbers&quot;&gt;this post on Stack Overflow&lt;/a&gt; for providing me with information to learn how to set up my pipeline. &lt;/p&gt;</content:encoded></item><item><title><![CDATA[Things I Learned by Reading 21 Books in 2021]]></title><description><![CDATA[For a good portion of my career, I've enjoyed investing in my learning by reading books. What started as a membership in a developer book…]]></description><link>https://philbusch.com/blog/2022/01/21-books-in-2021</link><guid isPermaLink="false">https://philbusch.com/blog/2022/01/21-books-in-2021</guid><pubDate>Sat, 22 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;div class=&quot;container-md&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;img style=&quot;max-width:400px;margin-bottom:1.45rem&quot; src=&quot;static/2021books-3a545b4f1738046c08d257f296da90a3.jpg&quot; alt=&quot;A stack of the books Phil Busch read in 2021&quot; class=&quot;rounded&quot;/&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;For a good portion of my career, I&amp;#x27;ve enjoyed investing in my learning by reading books. What started as a membership in a developer book club at a previous job eventually turned into a yearly habit of reading two or three books about developing software.&lt;/p&gt;&lt;p&gt;Like most people on this planet, 2020 provided me with a lot of free time at home. Most years prior to the pandemic, I&amp;#x27;d find myself traveling somewhere new. With travel not being much of an option in 2020, I started &amp;quot;traveling&amp;quot; mentally through books. I discovered the work of author &lt;a href=&quot;https://www.peterhessler.net/&quot;&gt;Peter Hessler&lt;/a&gt;, who has written about his experiences living and traveling in Egypt and China, and I found that I could not put his books down. &lt;/p&gt;&lt;p&gt;In late 2020, I became hooked on the idea that I could use books to travel everywhere, even if the pandemic was preventing me from traveling almost anywhere. I started using an app called &lt;a href=&quot;https://www.goodreads.com/&quot;&gt;Goodreads&lt;/a&gt; to discover new books, and to keep track of books that I was reading. &lt;/p&gt;&lt;p&gt;As 2021 began, I found that my reading habits only grew. At the beginning of the year, I set a goal in Goodreads to read seven books in 2021. By the time the year was over, I had read &lt;em&gt;21&lt;/em&gt; books! I&amp;#x27;ve learned a few things about myself as I read throughout the year.&lt;/p&gt;&lt;h3&gt;I&amp;#x27;m not reading just about software development anymore&lt;/h3&gt;&lt;p&gt;When I started reading more, I wasn&amp;#x27;t thinking just about my career. I used to think about reading as something that I had to do in order to pick up new technical skills. I quickly learned in my first handful of books read in 2021 that reading could serve so many more purposes.&lt;/p&gt;&lt;p&gt;I loved being exposed to the stories that some of these authors had to tell. Learning about Billy Baker&amp;#x27;s journey of making friends in his adult life in &lt;em&gt;We Need to Hang Out: A Memoir of Making Friends&lt;/em&gt; brought a lot of relatable laughs in a time of staying at home. Kal Penn&amp;#x27;s autobiography, &lt;em&gt;You Can&amp;#x27;t Be Serious&lt;/em&gt;, exposed me to the challenges he faced trying to break into Hollywood and avoid stereotypes. &lt;em&gt;Braver Than You Think&lt;/em&gt; brought me on a journey of an eye-opening trip around the world with Maggie Downs.&lt;/p&gt;&lt;p&gt;I was also exposed to meaty content with lots of detailed information to consume. &lt;em&gt;Working Effectively with Legacy Code&lt;/em&gt; by Michael Feathers is a book I should have read ten years ago. I was able to expand my technical skill set and reinforce many of my existing software development skills with that read. Reading &lt;em&gt;Capital&lt;/em&gt; by Thomas Piketty taught me that I have the ability to make it through a 650+ page academic economics book. &lt;/p&gt;&lt;h3&gt;Reading books unrelated to my career made it easier to expand my career&lt;/h3&gt;&lt;p&gt;While I was expanding the type of books that I was reading, I found myself expanding the topics of professional books that I read about as well. The professional books I read in 2021 were mostly not about delivering software, but rather they were about topics that were tangentially related to the industry and startups. Expanding my mind to read about so many people and places for enjoyment also allowed me to read about many different professional topics for enjoyment, too.&lt;/p&gt;&lt;p&gt;Last year, I started to take a broader interest in some of the business aspects of marketing and growing software companies. There has been a feedback loop between learning and application of my newly acquired knowledge in my professional life with this pivot. &lt;/p&gt;&lt;p&gt;Last year, &lt;em&gt;Zero to One&lt;/em&gt; by Peter Thiel crashed Startup Thinking into my brain, and the ideas will not be leaving anytime soon. I can no longer look at my career without thinking about opportunities to be the last mover into a given market, different styles of pessimistic and optimistic thinking, and the key question in the book: &amp;quot;What important truth do very few people agree with you on?&amp;quot;.&lt;/p&gt;&lt;p&gt;&lt;em&gt;80/20 Sales and Marketing&lt;/em&gt; by Perry Marshall got me thinking a lot about who my customers are in the work that I do, and how to effectively reach them using the Pareto principle. &lt;em&gt;Drive&lt;/em&gt; by Daniel Pink, &lt;a href=&quot;https://philbusch.com/blog/2021/09/drive-book-review&quot;&gt;a book I wrote about on this blog&lt;/a&gt;, really got me noodling on what motivates me in my career. &lt;/p&gt;&lt;p&gt;From a professional perspective, the books I read in 2021 opened the door to a whole world that I wasn&amp;#x27;t living in until very recently. The topics I discovered last year by reading are helping me grow new skills professionally at a rapid pace.&lt;/p&gt;&lt;h3&gt;I&amp;#x27;m a sucker for gamification&lt;/h3&gt;&lt;p&gt;The final thing I learned last year is that I am an absolute sucker for gamification tactics. Gamification, a recent trend in software to add video game style mechanics into non game software, is very present in Goodreads. Goodreads has features to track books read towards a yearly goal, as well as a progress bar that shows you percent completion of each book you&amp;#x27;re reading:&lt;/p&gt;&lt;div class=&quot;container-md&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;img style=&quot;max-width:400px;margin-bottom:1.45rem&quot; src=&quot;static/goodreads-screenshot-da4d39fc596f4399378cb3594dd86acb.png&quot; alt=&quot;Goodreads app screenshot showing a yearly reading goal progress bar&quot; class=&quot;rounded&quot;/&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;These techniques worked with me. I found myself enjoying seeing the number of books read increase, and the percent done metrics go up. I also found that having both the Goodreads app, as well as the &lt;a href=&quot;https://countycat.mcfls.org/screens/mobile.html&quot;&gt;Milwaukee Public Library app&lt;/a&gt; on my phone created a feedback loop that allowed me to go straight from book discovery in Goodreads to putting the book on hold at my local library. This allowed me to read more as I never learned about a book and then forgot to get it from the library and read it.&lt;/p&gt;&lt;h3&gt;2022&lt;/h3&gt;&lt;p&gt;In 2022, I plan to build on this habit that I formed last year. I&amp;#x27;ve got more books I want to read this year than I could have ever imagined. I hope to build off what I learned in 2021 to learn much more this year. My reading goal for 2022 is &lt;em&gt;22&lt;/em&gt; books.&lt;/p&gt;&lt;p&gt;Here&amp;#x27;s the full list of books I read in 2021:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;Country Driving&lt;/em&gt; by Peter Hessler&lt;/li&gt;&lt;li&gt;&lt;em&gt;Eric&lt;/em&gt; by Shaun Tan&lt;/li&gt;&lt;li&gt;&lt;em&gt;Tightrope: Americans Reaching for Hope&lt;/em&gt; by Nicholas Kristof and Sheryl WuDunn&lt;/li&gt;&lt;li&gt;&lt;em&gt;Here in Berlin&lt;/em&gt; by Crisitina Garcia&lt;/li&gt;&lt;li&gt;&lt;em&gt;Zero to One&lt;/em&gt; by Peter Thiel&lt;/li&gt;&lt;li&gt;&lt;em&gt;The Story of a Goat&lt;/em&gt; by Perumal Murugan&lt;/li&gt;&lt;li&gt;&lt;em&gt;Fake Accounts&lt;/em&gt; by Lauren Oyler&lt;/li&gt;&lt;li&gt;&lt;em&gt;We Need to Hang Out: A Memoir of Making Friends&lt;/em&gt; by Billy Baker&lt;/li&gt;&lt;li&gt;&lt;em&gt;The Lost Continent&lt;/em&gt; by Bill Bryson&lt;/li&gt;&lt;li&gt;&lt;em&gt;On the House&lt;/em&gt; by John Boehner&lt;/li&gt;&lt;li&gt;&lt;em&gt;Giannis: The Improbable Rise of an NBA MVP&lt;/em&gt; by Mirin Fader&lt;/li&gt;&lt;li&gt;&lt;em&gt;Drive&lt;/em&gt; by Daniel Pink&lt;/li&gt;&lt;li&gt;&lt;em&gt;Working Effectively with Legacy Code&lt;/em&gt; by Michael Feathers&lt;/li&gt;&lt;li&gt;&lt;em&gt;The Kite Runner&lt;/em&gt; by Khaled Hosseini&lt;/li&gt;&lt;li&gt;&lt;em&gt;Behold the Dreamers&lt;/em&gt; by Imbolo Mbue&lt;/li&gt;&lt;li&gt;&lt;em&gt;Capital in the Twenty-First Century&lt;/em&gt; by Thomas Piketty&lt;/li&gt;&lt;li&gt;&lt;em&gt;80/20 Sales and Marketing&lt;/em&gt; by Perry Marshall&lt;/li&gt;&lt;li&gt;&lt;em&gt;Behind the Beautiful Forevers: Life, Death, and Hope in a Mumbai Undercity&lt;/em&gt; by Katherine Boo&lt;/li&gt;&lt;li&gt;&lt;em&gt;Braver Than You Think&lt;/em&gt; by Maggie Downs&lt;/li&gt;&lt;li&gt;&lt;em&gt;You Can&amp;#x27;t Be Serious&lt;/em&gt; by Kal Penn&lt;/li&gt;&lt;li&gt;&lt;em&gt;State of Terror&lt;/em&gt; by Hillary Rodham Clinton and Louise Penny &lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Don't Skip the Hard Parts]]></title><description><![CDATA[How do you grow in your career? You have likley asked yourself this question. You probably want to get to the next rank or job title. You…]]></description><link>https://philbusch.com/blog/2021/10/dont-skip-the-hard-parts</link><guid isPermaLink="false">https://philbusch.com/blog/2021/10/dont-skip-the-hard-parts</guid><pubDate>Sat, 16 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;How do you grow in your career? You have likley asked yourself this question. You probably want to get to the next rank or job title. You may want to obtain a higher salary. Usually obtaining this requires learning some new skills and taking on more responsibilities. I&amp;#x27;ve asked this question myself a few times in my career.&lt;/p&gt;&lt;p&gt;You have options with regards to how you go about growing. You can ask your employer for a job description for the next rank up. You can shop around on the job market to see if maybe another company is interested in paying a little more for the skills you already have. These are valid options, and they might get you some of what you&amp;#x27;re looking for. But, how do you ensure that you &lt;em&gt;actually grow&lt;/em&gt;?&lt;/p&gt;&lt;p&gt;You grow by confronting the hard parts of the job - head on.&lt;/p&gt;&lt;p&gt;Often when we&amp;#x27;re looking around on the job market, we&amp;#x27;re looking for something a little cushier. We want to avoid that crappy waterfall process/annoying technology/problem du jour that is bugging us at the current gig. Maybe find a place with free lunches or standing desks. It&amp;#x27;s good to look for those things in a job. But in order to truly grow, we need to have hard problems to solve when we get there.&lt;/p&gt;&lt;p&gt;If we get to a place that already has perfect tech, no problems delivering, great communication between stakeholders, and amazing sales, there probably won&amp;#x27;t be much to stretch you when you get there. There won&amp;#x27;t be any hard parts to the job. Clock in, write some code, clock out. Where is that going to get you in the next five years when you&amp;#x27;re looking for something new again? What kind of story will you have to tell? &lt;em&gt;Everyone&lt;/em&gt; who is a software developer for more than a week is going to deliver some code. How will you stand out?&lt;/p&gt;&lt;p&gt;Sometimes the hard parts come to you, and sometimes you have to go find them. Before I knew I needed to find the hard parts, they seemed to come to me. When I was a junior engineer, the hard parts were a daily part of the job. Getting the code to work? Hard part. Understanding the task at hand? Hard part. Deploying to production by &lt;em&gt;myself?!?&lt;/em&gt; Really hard part.&lt;/p&gt;&lt;p&gt;Over time, many of the things that were hard have become easier. With practice, I&amp;#x27;ve been able to build the muscles of delivering working software. I&amp;#x27;ve found that as I&amp;#x27;ve gotten better delivering software, I&amp;#x27;ve had to look around for new hard problems. At first, switching to a new tech stack was a hard problem to tackle. Then I switched technologies a few times and that stopped being so difficult. Code problems are code problems, dependencies are important to manage, how to deploy is something to understand early. All of those problems started to look the same, no matter what the language or stack.&lt;/p&gt;&lt;p&gt;You may have reached this point yourself. If you&amp;#x27;re at this stage, you have to be extra  intentional about growing yourself. Many developers are shielded from the bigger problems to solve within a company. You may be viewed as someone who just codes what is needed for the business. In my experience, to grow beyond that point, you have to find the unsolved problems in your company that you can fix. &lt;/p&gt;&lt;p&gt;You can go about this many different ways. It may involve looking outside your current team, department, or even employer. You need to start talking to others and listening to their problems. Book lunches or catch a coffee with people you wouldn&amp;#x27;t normally overlap with. Catch a beer with a sales guy. Talk to the Product Manager you see once a quarter. There is not a formula for finding these problems - you just have to take initiative to look around for them. Once you find these problems, you may be doing them alongside your day job. An hour here, a Saturday morning there. Over time, if you deliver value, you&amp;#x27;ll find a way to make them part of your day to day.&lt;/p&gt;&lt;p&gt;If you&amp;#x27;re not finding these problems in your current employer, it is probably time to look around. But don&amp;#x27;t just look for that cushy office or pretty tech - look for the interesting problems. For senior engineers, they are often the key to real personal growth.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Book Report - Drive by Daniel Pink]]></title><description><![CDATA[I recently finished reading  Drive  by Daniel Pink. This has been on my list of books to read for a long time.  Drive  has come up a couple…]]></description><link>https://philbusch.com/blog/2021/09/drive-book-review</link><guid isPermaLink="false">https://philbusch.com/blog/2021/09/drive-book-review</guid><pubDate>Sun, 26 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I recently finished reading &lt;em&gt;Drive&lt;/em&gt; by Daniel Pink. This has been on my list of books to read for a long time. &lt;em&gt;Drive&lt;/em&gt; has come up a couple of times over the last few years of my career in conversations with coworkers. After having a hallway conversation recently at work about the book, I decided to pick it up and give it a read.&lt;/p&gt;&lt;p&gt;The book is split into two different parts. The first part of the book is called &amp;quot;A New Operating System.&amp;quot; Pink writes about three different types of motivation in part one. He calles them Motivation 1.0, Motiviation 2.0, and Motiviation 3.0. Motiviation 1.0 is about our human biological needs for survival. Motiviation 2.0 is how we can be motivated by external rewards and punishments. Motiviation 3.0 is a recently discovered style of motivation, called intrinsic motivation. Intrinsic motiviation is where we can be motivated by the work we are doing and the enjoyment of it.&lt;/p&gt;&lt;p&gt;Part two of the book is called &amp;quot;The Three Elements.&amp;quot; In this part of the book, Pink describes three elements that are needed in order to be intrinsticly motivated by the work that we do. Those elements are autonomy, mastery, and purpose. As he introduces the reader to these three elements, he explains why they are needed in order to enable a Motivation 3.0 mindset. As I was reading, I felt that the first part of the book felt like Pink was describing the theory behind intrinsic motivation, and the second part felt like he was describing the application of it. &lt;/p&gt;&lt;p&gt;I feel that there was a lot of very relevant topics in this book, and that many professionals could benefit from reading it. Many professionals find ourselves working in environments that have a &amp;quot;carrot and stick&amp;quot; reward scheme. Finish the task before the deadline, receive a pat on the back. Finish it late, and be told you need to be faster. While that kind of motiviational scheme can work for some routine work, the work of many professionals is increasingly more dynamic and requires different, self driven motiviational approaches. Pink is advocating for more adoption of those approaches in &lt;em&gt;Drive.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Drive&lt;/em&gt; makes a great psychological pair to the concept of owning your career that is often found in the Software Craftsmanship space. I think it is a great read for someone in a technical profession that is looking to better understand what makes them want to get to work in the morning. I recommend reading this book.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[A Recap of Summerfest Tech 2021]]></title><description><![CDATA[Yesterday I had the chance to checkout  Summerfest Tech , a local event held here in Milwaukee focused on the tech ecosystem in our region…]]></description><link>https://philbusch.com/blog/2021/09/summerfest-tech-2021-recap</link><guid isPermaLink="false">https://philbusch.com/blog/2021/09/summerfest-tech-2021-recap</guid><pubDate>Thu, 09 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Yesterday I had the chance to checkout &lt;a href=&quot;https://www.summerfest.com/tech/&quot;&gt;Summerfest Tech&lt;/a&gt;, a local event held here in Milwaukee focused on the tech ecosystem in our region. I&amp;#x27;ve heard this was a good event in previous years, and I was excited to attend this year&amp;#x27;s sessions.&lt;/p&gt;&lt;p&gt;Summerfest Tech took a hybrid format approach to their event this year. All of the sessions in the morning were available on an online platform, and the afternoon&amp;#x27;s sessions were held on the Johnson Controls World Sound Stage at the Summerfest grounds.&lt;/p&gt;&lt;p&gt;This marked my first time attending an online conference. I have missed in person conferences and meetups during the pandemic. While the online format didn&amp;#x27;t completely reproduce the same level of interactivity as an in person setting, it did a good job of enabling connections between attendees. There was a virtual event hall, sponsor booths, and a chat feature that I was able to use to meet and talk to some of the other attendees. &lt;/p&gt;&lt;div class=&quot;container-md&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;img style=&quot;max-width:700px;margin-bottom:1.45rem&quot; src=&quot;static/summerfest-tech-virtual-lobby-b772d498cb0835cc5d528c30e2bb4507.png&quot; alt=&quot;Screenshot of the Summerfest Tech 2021 virtual event lobby&quot; class=&quot;rounded&quot;/&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;The three sessions I attended in the virtual format covered a broad range of topics, including characteristics of a great tech town, how to increase diversity in our tech workforce, and strategies to help start up companies. Many of the speakers touched on the quantity of great talent we have today in Milwaukee, and that the market for tech jobs is only going to grow. One takeaway I have is a fact that Kathy Henrich of the Milwaukee Tech Hub shared: there are going to be 31,000 tech jobs open in our city by 2024. There will be no shortage of opportunity here.&lt;/p&gt;&lt;p&gt;In the afternoon, I made my way over to the grounds to meet others in person and take in the afternoon programming. The afternoon had more of a startup focus. A lot of the afternoon was centered around a startup pitch competition. Six startups gave a pitch to a panel of judges, who then asked them questions about their business plans and the potential growth opportunities in front of them. &lt;/p&gt;&lt;div class=&quot;container-md&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;img style=&quot;max-width:700px;margin-bottom:1.45rem&quot; src=&quot;static/summerfest-tech-stage-7e0063776cdf0ee03f26fd5b3829a783.jpg&quot; alt=&quot;The Johnson Controls World Sound Stage at Summerfest Tech 2021&quot; class=&quot;rounded&quot;/&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;My favorite pitch came from the startup &lt;a href=&quot;https://app.debtle.com/&quot;&gt;Debtle&lt;/a&gt;. Debtle seeks to solve the problem that paying off debt in collections is high friction for all parties involved. They have developed a software solution that allows those collecting debt to work with those who owe debt to negotiate an agreement and pay through their platform. While they were my favorite of the group, I also enjoyed hearing about &lt;a href=&quot;https://investii.com/&quot;&gt;Investii&lt;/a&gt; as well. Investii has developed a software product that helps individuals save money and budget effectively.&lt;/p&gt;&lt;p&gt;I rounded out the day by talking to some of the individuals at the event, learning about their organizations and the problems they are solving. I also happened to run into a former co-worker, and it was great to catch up with him as well. It was nice to get out and talk with like minded individuals in our tech community. I hope there are more in person events opportunities to do that soon.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[A First Look at Hot Reload in Visual Studio 2022]]></title><description><![CDATA[One of the recent episodes of .NET Rocks  was very interesting. Carl Franklin and Richard Campbell interviewed Dimitry Layalin from…]]></description><link>https://philbusch.com/blog/2021/08/a-first-look-at-hot-reload-in-visual-studio-2022</link><guid isPermaLink="false">https://philbusch.com/blog/2021/08/a-first-look-at-hot-reload-in-visual-studio-2022</guid><pubDate>Tue, 31 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.dotnetrocks.com/?show=1752&quot;&gt;One of the recent episodes of .NET Rocks&lt;/a&gt; was very interesting. Carl Franklin and Richard Campbell interviewed Dimitry Layalin from Microsoft. He is a Program Manager working on multiple products, including Hot Reload, a new feature in .NET that allows for code to be changed at runtime while it is being debugged.&lt;/p&gt;&lt;p&gt;It was very interesting to hear him talk about the journey they have gone on at Microsoft about how they developed the feature, leveraging existing features of Visual Studio&amp;#x27;s Edit and Continue functionality, and how C++ development in Visual Studio lent itself well to the functionality. This episode has made me eager to check hot reload out for myself, so this week I downloaded Visual Studio 2022 Preview 3 to give it a try.&lt;/p&gt;&lt;h3&gt;The Happy Path&lt;/h3&gt;&lt;p&gt;After I finished installing Visual Studio, I decided to spin up a new .NET 6 Console Application using the built in template. .NET 6 is also in preview, and I figured this was a good chance to try it out as well. Using the new, simplified console app template, I created an application that accepts user input infinitely. I started up the debugger by pressing the familiar play button in the ribbon, and set a breakpoint. &lt;/p&gt;&lt;p&gt;Applying changes to the running code was a breeze. I changed a line of code in the application, and I went ahead and pressed a new button in the ribbon that allows for changes to be applied to the running application:&lt;/p&gt;&lt;div class=&quot;container-md&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;img style=&quot;max-width:400px;margin-bottom:1.45rem&quot; src=&quot;data:image/png;base64,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&quot; alt=&quot;Visual Studio 2022 ribbon showing the Apply Code Changes button used for Hot Reload&quot; class=&quot;rounded&quot;/&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Within a second, I saw the following message appear on the bottom of my screen:&lt;/p&gt;&lt;div class=&quot;container-md&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;img style=&quot;max-width:400px;margin-bottom:1.45rem&quot; src=&quot;data:image/png;base64,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&quot; alt=&quot;Visual Studio 2022 notification confirming Hot Reload changes were applied successfully&quot; class=&quot;rounded&quot;/&gt;&lt;/div&gt;&lt;/div&gt;&lt;h3&gt;Finding the Limits&lt;/h3&gt;&lt;p&gt;As I have sometimes found myself working in a legacy solutions, it is important to me to test out the limits of a new technology. I wanted to see how hot reload responded when it was used in a remote debugging scenario. I find that the remote debugger is a very valuable tool when the solution has many build errors that are due to knotty external dependencies, or when the running application is not entirely recreated from the code base in the Visual Studio solution. I was interested to see how the folks at Microsoft handled the hot reload functionality when interacting with a remote application.&lt;/p&gt;&lt;p&gt;I knew that this test was almost certainly going to end in some form of failure. Being able to change a remotely executing application from an IDE would be impossible magic. The running application is not guaranteed to be in a place where it can be modified, and even if it was, changing it would be a deployment of the newly compiled code to the server, which would not be desired in a development scenario. &lt;/p&gt;&lt;p&gt;I built my new application in debug mode, and started the executable locally by finding it in the bin folder and double clicking on it. I clicked on Attach to Process under the Debug menu in Visual Studio as usual to attach to the running process. Debugging worked as it normally does. &lt;/p&gt;&lt;p&gt;I made a code change, and went ahead and pressed the Apply Code Changes button on the ribbon. As expected, Visual Studio couldn&amp;#x27;t apply the changes. I was presented with the following dialog:&lt;/p&gt;&lt;div class=&quot;container-md&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;img style=&quot;max-width:500px;margin-bottom:1.45rem&quot; src=&quot;data:image/png;base64,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&quot; alt=&quot;Visual Studio 2022 dialog explaining Hot Reload could not apply changes to a remotely debugged process&quot; class=&quot;rounded&quot;/&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;I decided to press edit, which put the following error in the Error List:&lt;/p&gt;&lt;div class=&quot;container-md&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;img style=&quot;margin-bottom:1.45rem&quot; src=&quot;static/hot-reload-error-list-bc627efc49e140173192ed886c333dd7.png&quot; alt=&quot;Visual Studio 2022 Error List showing the error produced after editing during remote debugging&quot; class=&quot;fluid&quot;/&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;At this point, I&amp;#x27;d need to rebuild my application to be able to remote debug any newly coded changes.&lt;/p&gt;&lt;h3&gt;Final thoughts&lt;/h3&gt;&lt;p&gt;I think Hot Reload is a very valuable feature. For a correctly architected application that can be run locally, it is a game changer. Being able to nearly eliminate the feedback loop between writing a line of code and knowing whether or not it worked will allow for dramatic productivity gains for those stopping and restarting applications between changes today. &lt;/p&gt;&lt;p&gt;&lt;em&gt;P.S.: If you&amp;#x27;re interested in the console app, you can find it on my GitHub page: &lt;a href=&quot;https://github.com/philbo87/HotReloadTestApp&quot;&gt;https://github.com/philbo87/HotReloadTestApp&lt;/a&gt;&lt;/em&gt; &lt;/p&gt;</content:encoded></item><item><title><![CDATA[Look at the Lightbulb]]></title><description><![CDATA[I've been reading  Working Effectively with Legacy Code by Michael Feathers  recently. I'm currently about half way through the book, and…]]></description><link>https://philbusch.com/blog/2021/08/look-at-the-lightbulb</link><guid isPermaLink="false">https://philbusch.com/blog/2021/08/look-at-the-lightbulb</guid><pubDate>Sat, 21 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I&amp;#x27;ve been reading &lt;a href=&quot;https://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052&quot;&gt;Working Effectively with Legacy Code by Michael Feathers&lt;/a&gt; recently. I&amp;#x27;m currently about half way through the book, and there has been a lot of good information so far. &lt;/p&gt;&lt;p&gt;The chapters I&amp;#x27;ve read so far have largely been about changing legacy software via refactoring. There have been many times in my career that I&amp;#x27;ve had to find ways to maintain and extend legacy code. I find that working with legacy code is a lot like taking care of a garden - the key is to do a little bit of work each day to nurture it and make it a little bit better. Overtime, this &amp;quot;tending to the garden&amp;quot; results in software that is easier to maintain and test.&lt;/p&gt;&lt;p&gt;Chapter five of the book focuses on tools that can be used to help enable changing of a code base. It introduces concepts like unit tests, mocking objects, and automated refactoring tools. While I find lots of value in creating unit tests and following techniques that help make code easier to test, I personally find a little bit of refactoring can have a great ROI when attempting to understand a newly acquired code base. &lt;/p&gt;&lt;p&gt;Many IDEs contain lots of automated refactoring tools. I strongly recommend taking a look at them. Both Visual Studio and Visual Studio Code will hide suggestions behind a lightbulb that shows up to the left of the line of code that is currently being edited. You can see the suggestions by clicking on the lightbulb, or via a keyboard shortcut (Alt + Enter on my machine). There are many suggestions behind that lightbulb worth following.&lt;/p&gt;&lt;p&gt;Two of my most used automated refactoring tools are Extract Method and Extract Interface. Extract Method in Visual Studio allows for a few lines of code to be extracted into its own private method in the class that is currently under edit. This helps me ensure that my methods follow the Single Responsibility Principle, and that the code is easier to read. Extract Interface allows for an interface to be created from a class that does not currently have one, and that often is the first step to breaking a dependency and putting a piece of code under test.&lt;/p&gt;&lt;p&gt;There&amp;#x27;s a lot on this topic that I will continue to share here on my blog. In the meanwhile, I&amp;#x27;ll leave you with a talk that I saw once by Sandro Mancuso that I think demonstrates the value of using automated refactoring tools. In this video, he refactors an old piece of Java code and puts it under test. He fully embraces the tools his IDE offers the entire way.&lt;/p&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/_NnElPO5BU0&quot; title=&quot;YouTube video player&quot; frameBorder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;</content:encoded></item><item><title><![CDATA[The Proof is in Production]]></title><description><![CDATA[How do you know that the work you do has created value?  You have a customer for the software you deliver. Ideally, someone is attempting to…]]></description><link>https://philbusch.com/blog/2021/08/proof-is-in-production</link><guid isPermaLink="false">https://philbusch.com/blog/2021/08/proof-is-in-production</guid><pubDate>Wed, 18 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;How do you know that the work you do has created value? &lt;/p&gt;&lt;p&gt;You have a customer for the software you deliver. Ideally, someone is attempting to use the solution you work on.&lt;/p&gt;&lt;p&gt;You may have product owners, product managers, project managers, business analysts, sales teams, and more between you and the customer using your product. Or, maybe you are consulting and you work directly with your client. &lt;/p&gt;&lt;p&gt;No matter what the working arrangements look like between you and the end users you serve, there is a good chance that all folks involved want to be sure that a great solution is being delivered. There is almost certainly great care between all parties involved to make sure things are just right, that they are done correctly, and that the customer is being served well.&lt;/p&gt;&lt;p&gt;This amount of care can naturally create disagreements and tension. Chances are, if you&amp;#x27;ve been delivering software for more than a few months, you&amp;#x27;ve started to hear questions like these:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;What is the right thing to build?&lt;/li&gt;&lt;li&gt;How should page look?&lt;/li&gt;&lt;li&gt;When is it going to be done?&lt;/li&gt;&lt;li&gt;Do we need to architect this solution differently?&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;There is a simple solution to these disagreements: &lt;strong&gt;Deploy to Production. Deploy early. Deploy often. Deploy as much as possible.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Deploying code to production solves nearly all disagreements. By surfacing the solution to users, customers can get value immediately. The sooner users click the buttons on your web app, the sooner you and your peers at your company can find out if people can use the solution to solve their problems. Or, the sooner you find out that choosing hot pink was not a great color choice for that button! 😀 &lt;/p&gt;&lt;p&gt;Of course, none of this matters if you don&amp;#x27;t apply the learnings gained from the deploy to production to a future effort. You have to be intentional about using the knowledge gained. You may learn that the customers love the solution and that you don&amp;#x27;t need to add more to it - and that is great! Or, you may learn that it is time to go back to the drawing board and start over. That&amp;#x27;s OK too. Likely, it will be somewhere in between. No matter what you learn, the key is to make the decision actively about what to work on next based on that feedback, and not passively based on a long list of old backlog items. &lt;/p&gt;&lt;p&gt;If you don&amp;#x27;t deploy to production often, ask yourself why that is. Is it something you can change with a conversation with your team? Is it something that was decided outside your team? Can you talk to that person? &lt;/p&gt;&lt;p&gt;There may be lots of reasons that you don&amp;#x27;t deploy frequently - fear of change, infrastructure limitations, cross-company communication issues are just a few that I have experienced. Don&amp;#x27;t let that stop you - keep looking for the opportunity to try frequent, iterative production deployments. Products with lower stakes, or off hours deployments may be good places to start in your organization. &lt;/p&gt;&lt;p&gt;Do not let one roadblock keep you from finding a path to an iterative approach. Ultimately, deploying frequently on one application is better than infrequent deployments. And if you can deploy frequently on one application, eventually the learning gained from that will be contagious in your organization and solve the disagreements on going to production often.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[That Conference to This Moment]]></title><description><![CDATA[In 2015, I found my career in a transitional moment. I had just taken a job in the .NET space for the first time after spending a few years…]]></description><link>https://philbusch.com/blog/2021/08/that-conference-to-this-moment</link><guid isPermaLink="false">https://philbusch.com/blog/2021/08/that-conference-to-this-moment</guid><pubDate>Sat, 07 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In 2015, I found my career in a transitional moment. I had just taken a job in the .NET space for the first time after spending a few years working in Enterprise Java Beans. I was being exposed to modern tech and practices at a pace I had not encountered before. By time early 2016 rolled around, I found myself leading a development team for the first time. In a twelve month time span, I went from valued individual contributor working on legacy applications to leading a team working on solutions for the modern web.&lt;/p&gt;&lt;p&gt;In the middle of 2015, these changes in my career crystallized for me with a trip to &lt;a href=&quot;https://that.us/events/wi/2021&quot;&gt;That Conference&lt;/a&gt;, in Wisconsin Dells. When I look back at that time in my career, my trip to That Conference was probably the moment that I had realized things were changing. My trip to That Conference that year was the first time I had been exposed to ideas outside of what my employer had to offer. &lt;/p&gt;&lt;p&gt;These ideas shaped my approach to work in a big way. I started to become more invested in the work that I was doing, I began to develop opinions about what the right way to approach a problem. I began to care about finding ways to get the team that I was working with to gel together, instead of worrying about me just getting my work done.&lt;/p&gt;&lt;p&gt;That feels like a lifetime ago now. I&amp;#x27;ve continued leading teams. I have switched to a different employer along the way, and focused more on organizational growth. The tech I&amp;#x27;m using is different than it was then. The problems are different as well. I&amp;#x27;ve gotten the opportunity to work with a lot of great people over the years, and they have continued to shape my approach.&lt;/p&gt;&lt;p&gt;I&amp;#x27;ve found myself in a retrospective moment as of late. I had the opportunity to go back to That Conference this year with some of my colleagues from Layer One. This trip has made me think about how much I&amp;#x27;ve changed as a leader. I find myself in a moment again where I feel that much is currently crystallizing for me in what I do for a living, and the things that I think are important.&lt;/p&gt;&lt;p&gt;I&amp;#x27;ve been sharing a lot of the things that I think are important in delivering software lately on LinkedIn. It has been a great experience. I feel I have a lot of value I can bring to my network with the ideas I have to share, and I&amp;#x27;ve had some good conversations on the platform. However, I can only share so much in one post - a few sentences, or maybe a couple of paragraphs.&lt;/p&gt;&lt;p&gt;My recent trip to That Conference has made me realize that it is time to start writing in a longer format. The ideas I want to share - both technical and team related - are too many to fit into a series of posts. For the longer ideas, I&amp;#x27;ll start sharing them here on my website. &lt;/p&gt;&lt;p&gt;This is going to be an experiment for me. I&amp;#x27;m taking an iterative approach as I develop my website. Expect change along the way as I learn more about the problems I want to solve by writing. I&amp;#x27;ll be inspecting and adapting as I go. If you are reading my posts and have thoughts about what is working, and what isn&amp;#x27;t, reach out! I&amp;#x27;m interested in hearing from others about what content is most valuable.&lt;/p&gt;</content:encoded></item></channel></rss>