<?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: Eric</title>
    <description>The latest articles on DEV Community by Eric (@eromanowski).</description>
    <link>https://dev.to/eromanowski</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%2F204251%2F2f62d2f7-3d91-4871-9470-3ea2ef815f05.png</url>
      <title>DEV Community: Eric</title>
      <link>https://dev.to/eromanowski</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eromanowski"/>
    <language>en</language>
    <item>
      <title>What is technical debt and why does it cost $85 billion a year? How can CI/CD help reduce it?</title>
      <dc:creator>Eric</dc:creator>
      <pubDate>Fri, 08 Nov 2019 08:30:16 +0000</pubDate>
      <link>https://dev.to/eromanowski/what-is-technical-debt-and-why-does-it-cost-85-billion-a-year-how-can-ci-cd-help-reduce-it-8kl</link>
      <guid>https://dev.to/eromanowski/what-is-technical-debt-and-why-does-it-cost-85-billion-a-year-how-can-ci-cd-help-reduce-it-8kl</guid>
      <description>&lt;h1&gt;
  
  
  TLDR
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Technical debt (also known as design debt or code debt) is a concept in software development that reflects the implied cost of additional rework caused by choosing an easy (limited) solution now instead of using a better approach that would take longer.&lt;/em&gt; &lt;a href="https://en.wikipedia.org/wiki/Technical_debt"&gt;https://en.wikipedia.org/wiki/Technical_debt&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Technical debt is difficult to deal with. It is costly and can hide in all facets of an organization. Having a plan to identify, log, prioritize, detect and account for tech debt is crucial to the smooth operation of the company and employee morale.&lt;/p&gt;

&lt;p&gt;Take your time, do it right. You may be able to go back and refactor some of the code, but you will never be able to refactor the underlying patterns. Once it gets gets to pattern changes, rewrite often occurs. Businesses don't like the word rewrite. While rewrite has a negative connotation, it often means that lessons have been learned and we have found better ways to implement business requirements that will not only benefit the business, but developer productivity and morale as well.&lt;/p&gt;

&lt;h1&gt;
  
  
  What does Technical Debt mean to me?
&lt;/h1&gt;

&lt;p&gt;Tech debt is the sum of all inefficiencies caused by past, present, and future decisions across the entire company. It affects both the technical and business side of the organization. It is always in a state of creation and/or destruction. Once it shows up, there will always be an effort needed to remove it.&lt;/p&gt;

&lt;h1&gt;
  
  
  How much does it cost?
&lt;/h1&gt;

&lt;p&gt;It costs $85,000,000,000 a year. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.pullrequest.com/blog/cost-of-bad-code/"&gt;https://www.pullrequest.com/blog/cost-of-bad-code/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cnbc.com/2018/09/06/companies-worry-more-about-access-to-software-developers-than-capital.html"&gt;https://www.cnbc.com/2018/09/06/companies-worry-more-about-access-to-software-developers-than-capital.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Ideas on reducing tech debt
&lt;/h1&gt;

&lt;p&gt;A plan needs to be implemented to eradicate it in your system. If an implementation/system is so poor that users lose trust, it may be worth considering an exit strategy on that software and looking into alternative solutions.&lt;/p&gt;

&lt;p&gt;The decision to prioritize tech debt in the system should be based on the impact it is having on the organization.&lt;/p&gt;

&lt;h1&gt;
  
  
  What questions can you ask to uncover tech debt?
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Business processes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Do business users trust their system(s)?&lt;/li&gt;
&lt;li&gt;Are there any manual steps necessary to complete a business process?&lt;/li&gt;
&lt;li&gt;Do you know the specifics of data leaving or entering your applications?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Infrastructure
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;How quickly can environments bet stood up and torn down?&lt;/li&gt;
&lt;li&gt;How easy is it to manage your infrastructure? &lt;/li&gt;
&lt;li&gt;How is your logging?&lt;/li&gt;
&lt;li&gt;How is your monitoring?&lt;/li&gt;
&lt;li&gt;Do you have a disaster recovery plan? If so, how long would it take to get back to an operational state in the occurrence of a disaster?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Build/Release pipelines
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;How long does it take to get code from development to production?&lt;/li&gt;
&lt;li&gt;Are there any manual steps in the deployment process?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Do software architects have enough control over their business unit's systems to enforce standards and best practices across them?&lt;/li&gt;
&lt;li&gt;Are best practices and standards being followed across the orgization?&lt;/li&gt;
&lt;li&gt;Do you have 100% unit test coverage?&lt;/li&gt;
&lt;li&gt;Do you have integration test coverage on critical parts of the system?&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  How do you estimate technical debt?
&lt;/h1&gt;

&lt;p&gt;For estimating developer time, if you are following agile-ish pratices, during retrospective meetings, ask, if the system(s) met all expectations and were running optimally, how much time could have been saved? Log those estimates over time and extrapolate how much that is costing the organization.&lt;/p&gt;

&lt;h1&gt;
  
  
  What is CI/CD?
&lt;/h1&gt;

&lt;p&gt;CI/CD is an interpreted and generic term that ultimately means how fast can you detect bad code, stabilize it, and safely/reliably deploy it to production.&lt;/p&gt;

&lt;p&gt;Areas of Interest:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pull Requests

&lt;ul&gt;
&lt;li&gt;Code review is crucial to delivering high quality software.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;100% unit test coverage

&lt;ul&gt;
&lt;li&gt;With the world of libraries and packages, standards may not be enforced. Popular libraries will typically have unit test coverage, but it is always a good idea to do a technical audit on any new and/or existing libraries you are referencing to make sure it meets standards. It also would be a good idea to run a coverage tool on the libraries crucial to your business. (DotCover, WallabyJS are tools I have used)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Integration test coverage

&lt;ul&gt;
&lt;li&gt;Coverage on critical parts of the system should be a requirement. Between the unit test coverage and critical path integration test coverage, developers can merge code to master with a high level of confidence.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Pipelines are built to generate builds, run tests, and release builds. The complexity of these pipelines will vary significantly by the type of resource. The time it takes to build these pipelines must be accounted for in estimates.&lt;/li&gt;
&lt;li&gt;Feature toggles are implemented to deploy chunks of a system in an iterative fashion. Feature toggles are tracked and can be contextual to the user. &lt;/li&gt;
&lt;li&gt;Strict data contracts must be enforced on critical parts of the system.&lt;/li&gt;
&lt;li&gt;GitFlow 

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://datasift.github.io/gitflow/IntroducingGitFlow.html"&gt;https://datasift.github.io/gitflow/IntroducingGitFlow.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pullrequest.com/blog/3-ways-code-review-makes-your-dev-team-better/"&gt;https://www.pullrequest.com/blog/3-ways-code-review-makes-your-dev-team-better/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Monitoring

&lt;ul&gt;
&lt;li&gt;This is critical to detecting issues across the entire system. Azure has a tool called Smart Detection that will detect a number of anomalies and send out email notifications. For example, Azure will track dependency failures over time and alert when failure rates go above an abnormal threshold. &lt;/li&gt;
&lt;/ul&gt;


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

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Software is hard. This was a lot of topics to cover. I'm sure I missed things, so feel free to suggest any additions to this. &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Future of web dev?</title>
      <dc:creator>Eric</dc:creator>
      <pubDate>Fri, 08 Nov 2019 07:54:14 +0000</pubDate>
      <link>https://dev.to/eromanowski/future-of-web-dev-38f6</link>
      <guid>https://dev.to/eromanowski/future-of-web-dev-38f6</guid>
      <description>&lt;p&gt;Will Blazor take over?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dotnet.microsoft.com/apps/aspnet/web-apps/blazor"&gt;https://dotnet.microsoft.com/apps/aspnet/web-apps/blazor&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
    </item>
    <item>
      <title>Lessons learned moving to Azure</title>
      <dc:creator>Eric</dc:creator>
      <pubDate>Fri, 30 Aug 2019 08:56:35 +0000</pubDate>
      <link>https://dev.to/eromanowski/lessons-learned-moving-to-the-azure-cloud-1fcj</link>
      <guid>https://dev.to/eromanowski/lessons-learned-moving-to-the-azure-cloud-1fcj</guid>
      <description>&lt;h1&gt;
  
  
  TLDR
&lt;/h1&gt;

&lt;p&gt;Going to the cloud has been an interesting experience. Spend some time up front to organize your resources by resource group and subscription. Deploying your resources to your production environment can be tricky. Spend some time looking at the Azure Resource Manager REST API. Be careful with the Powershell Az Module. We got burned by it.&lt;/p&gt;

&lt;h1&gt;
  
  
  What are we leveraging in Azure?
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;API Management&lt;/li&gt;
&lt;li&gt;Logic Apps&lt;/li&gt;
&lt;li&gt;Data Factory w/ SSIS Runtime&lt;/li&gt;
&lt;li&gt;Application Insights&lt;/li&gt;
&lt;li&gt;Integration Accounts&lt;/li&gt;
&lt;li&gt;Functions&lt;/li&gt;
&lt;li&gt;App Services&lt;/li&gt;
&lt;li&gt;Sql Database&lt;/li&gt;
&lt;li&gt;Storage Accounts&lt;/li&gt;
&lt;li&gt;Service Bus&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  How are we organizing our cloud resources
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;By subscription

&lt;ul&gt;
&lt;li&gt;Be mindful of the subscription service limit, quotas, and constraints.&lt;/li&gt;
&lt;li&gt;We separated our development and production environments by subscription which allowed us to limit access to production resources as well as have a clear division for our billing. &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;By Resource group

&lt;ul&gt;
&lt;li&gt;Pay close attention to the location you put your resource groups in. This will be the default location for any resources you create in that resource group. Resources cannot talk across location. API connections you created in one location will not be reusable in another. You cannot share API connections across resource groups.&lt;/li&gt;
&lt;/ul&gt;


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

&lt;h1&gt;
  
  
  What to watch out for
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Make sure you put some thought into organizing your resource groups

&lt;ul&gt;
&lt;li&gt;Microsoft has a good guide on naming conventions for you azure resources&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/architecture/best-practices/naming-conventions"&gt;https://docs.microsoft.com/en-us/azure/architecture/best-practices/naming-conventions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;We started off with one resource group to rule them all and found out when we went to go export the resource group, there is a hard limit of 200 resources.&lt;/li&gt;
&lt;li&gt;Even after splitting resources into their own groups, we still ran into timeouts trying to export resource groups with only ~60 resources.&lt;/li&gt;
&lt;li&gt;Think about parameterizing your resources early, but be careful, you lose visibility to those values in Logic Apps designer for example. Even when you go into the code view of your Logic Apps, those values could be misleading. You have to export the template of your Logic App to see the actual values being passed in. &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Some resources will require more work than others to get into a deployable state. API Management, for example, is a bear to deal with. We're still working on a solution to deal with this. If you're wiring up your endponts to logic apps, you may end up losing connections to your Logic Apps when we deployed to production. &lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Deploying resources to your production environment
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;We ended up building a CLI that leverages the Azure Resource Manager Az Powershell module which allows us to pull and push resources. We had to make the jump to powershell 6 as well.

&lt;ul&gt;
&lt;li&gt;We extract the parameters out of the resource and put them in our environment specific parameter JSON file. &lt;/li&gt;
&lt;li&gt;We setup a git repository to house all of our ARM templates. We discovered the order of properties drastically varied in our ARM templates from export to export, so you may need to run your ARM templates through something that orders your properties. This will makes diffs significantly more readable when you PR to master.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Be careful with the PowerShell Az Module, we ran into issues where our property values did not serialize past a certain depth. While you can configure the depth, pay close attention to your ARM templates before you push to your higher environments.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Serverless thoughts
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;You can only take the cloud tools so far. If it starts to become difficult enforce patterns or track dependencies, you may need to drop down to code. If this becomes the case for you, take a step back and evaluate your options right away.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>serverless</category>
      <category>azure</category>
    </item>
    <item>
      <title>Why are we moving away from the Transform connector (Liquid Templates) in Azure Logic Apps?</title>
      <dc:creator>Eric</dc:creator>
      <pubDate>Thu, 29 Aug 2019 04:08:21 +0000</pubDate>
      <link>https://dev.to/eromanowski/why-are-moving-away-from-the-transform-connector-liquid-templates-in-azure-logic-apps-hk5</link>
      <guid>https://dev.to/eromanowski/why-are-moving-away-from-the-transform-connector-liquid-templates-in-azure-logic-apps-hk5</guid>
      <description>&lt;h1&gt;
  
  
  TLDR
&lt;/h1&gt;

&lt;p&gt;We are working on a project that requires us to regularly transform data from one shape to another for our integrations. We decided liquid templates in the Transform connector in Logic Apps/integration accounts seemed like a reasonable solution. We quickly found out the developer experience is terrible.&lt;/p&gt;

&lt;p&gt;Be careful, Liquid template syntax in Azure Logic Apps Transform connector varies between the tooling in VS Code. While your transform may work in VS Code, you will often find it doesn't work as expected in Azure. &lt;/p&gt;

&lt;h1&gt;
  
  
  What did we run into?
&lt;/h1&gt;

&lt;p&gt;The extensions available in VS Code are built on a ruby flavor of liquid templates while the Transform connector is using DotLiquid version 2.0.254 (as of March 11, 2019). There are differences in syntax and capabilities.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/dotliquid/dotliquid/wiki/DotLiquid-for-Designers"&gt;https://github.com/dotliquid/dotliquid/wiki/DotLiquid-for-Designers&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You'll find that there are more features available in the ruby flavor that don't exist in DotLiquid&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Where did I get that 2.0.254 version? Straight from a response from the Microsoft support team. The problem is that is does not correlate to any release on DotLiquid's Github repo.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/dotliquid/dotliquid/releases"&gt;https://github.com/dotliquid/dotliquid/releases&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Update: I reached out to the top contributor of DotLiquid and he informed me they havent used github releases in quite a while. That version correlates to the nuget version.&lt;/li&gt;
&lt;/ul&gt;


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

&lt;h1&gt;
  
  
  What did our development/deployment process look like?
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Download VSCode and install Shopify Liquid Preview
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nhgMe-Ck--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/l2j9lnib3hukwdsq9ygn.png" alt="Alt Text"&gt;
&lt;/li&gt;
&lt;li&gt;Create a repo&lt;/li&gt;
&lt;li&gt;Branch&lt;/li&gt;
&lt;li&gt;Create a transform.liquid and transform.liquid.json and start writing transforms! A great developer experience so far.&lt;/li&gt;
&lt;li&gt;CTL+SHIFT+P to preview your transform against your sample data in your .liquid.json&lt;/li&gt;
&lt;li&gt;Commit the template and and create a PR&lt;/li&gt;
&lt;li&gt;Once your PR makes it to master, upload to development azure environment, run your logic app and start feeling the pain&lt;/li&gt;
&lt;li&gt;If you run into problems, dig into DotLiquid source code and find the feature doesn't exist or the syntax is different

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/dotliquid/dotliquid"&gt;https://github.com/dotliquid/dotliquid&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Create another "azure" version of your template and try to keep the two in sync&lt;/li&gt;
&lt;li&gt;Cry on the inside&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Questions for you
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Is anyone else feeling the pain of the transform connector in Logic Apps? If so, what kind of tools have you discovered to improve developer productivity?&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Proposal for Microsoft
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Create a DotLiquid Preview extension that aligns to the version of DotLiquid used in the transform connector&lt;/li&gt;
&lt;li&gt;Deploy a new Map type to integration accounts (i.e. Liquid-Ruby) and change the configuration property &lt;code&gt;Liquid.UseRubyDateFormat = true;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Open source the Transform connector so we can make modifications and extend the capabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Side Notes
&lt;/h2&gt;

&lt;p&gt;This is my first blog post ever. I'm interested to hear your feedback on how I can improve. Any and all feedback is welcome.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>liquidtemplates</category>
      <category>dotliquid</category>
      <category>logicapps</category>
    </item>
  </channel>
</rss>
