<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-5387140</atom:id><lastBuildDate>Mon, 06 Oct 2025 15:44:03 +0000</lastBuildDate><category>Software Development</category><category>Testing</category><category>Life</category><category>work</category><category>.NET</category><category>Azure</category><category>Azure App Configuration</category><category>BizTalk</category><category>Functional Programming</category><category>Gaming</category><title>Slow is Smooth and Smooth is Fast</title><description>Zach Bonham is software professional experienced in delivering distributed systems within the Microsoft ecosystem. Continuous learner. 🌱 Shipping is a Feature. 🚀</description><link>http://zachbonham.blogspot.com/</link><managingEditor>noreply@blogger.com (Unknown)</managingEditor><generator>Blogger</generator><openSearch:totalResults>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5387140.post-6731290285670738413</guid><pubDate>Sat, 08 Feb 2025 13:49:00 +0000</pubDate><atom:updated>2025-02-08T07:49:26.056-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Software Development</category><category domain="http://www.blogger.com/atom/ns#">Testing</category><title>Code Coverage as a Quality Gate</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdTjAXWcM0IJiuKwTqN5LUAf1cJAPTmyv10xGPEsxJV9ciun_XzJRzLV8qEXQWA963YDZ3x4nlNnOYK_Sy7rHH4CoiSCKIa5DBY-C4bElVfp3gvoh7XHap6I20Nd4AN8z1cLhliOfK9u_tyPo2dOG1V1JaWJBOx2hjbtgnOf9aRIw3y_zpDSt8tw/s6720/vadim-kaipov-Zvj8cbiu1is-unsplash.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;4480&quot; data-original-width=&quot;6720&quot; height=&quot;426&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdTjAXWcM0IJiuKwTqN5LUAf1cJAPTmyv10xGPEsxJV9ciun_XzJRzLV8qEXQWA963YDZ3x4nlNnOYK_Sy7rHH4CoiSCKIa5DBY-C4bElVfp3gvoh7XHap6I20Nd4AN8z1cLhliOfK9u_tyPo2dOG1V1JaWJBOx2hjbtgnOf9aRIw3y_zpDSt8tw/w640-h426/vadim-kaipov-Zvj8cbiu1is-unsplash.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p style=&quot;text-align: center;&quot;&gt;Photo by &lt;a href=&quot;https://unsplash.com/@vadimkaipov?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash&quot;&gt;vadim kaipov&lt;/a&gt; on &lt;a href=&quot;https://unsplash.com/photos/macbook-pro-on-white-table-Zvj8cbiu1is?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash&quot;&gt;Unsplash&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;In software development, code coverage is one of those terms that really seems important. As software developers, we certainly make it important from time to time. What code coverage means to you, how you achieve it, and the value placed upon that number likely says more about you than the number itself.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The conversation around code coverage should always be based on the outcome needed (i.e. higher quality code) and not the number itself. Code coverage should be a signal of the system and never a hard line.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;What is code coverage?&lt;/h2&gt;&lt;div&gt;&lt;span style=&quot;background-color: white; color: #202122; font-family: sans-serif; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;blockquote style=&quot;border: none; margin: 0 0 0 40px; padding: 0px;&quot;&gt;&lt;div&gt;&lt;blockquote&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: white; color: #202122; font-family: sans-serif; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style=&quot;background-color: white; color: #202122; font-family: sans-serif; font-size: 16px;&quot;&gt;&quot;is a percentage measure of the degree to which the&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Source_code&quot; style=&quot;background: none rgb(255, 255, 255); border-radius: 2px; font-family: sans-serif; font-size: 16px; overflow-wrap: break-word; text-decoration-line: none;&quot; title=&quot;Source code&quot;&gt;source code&lt;/a&gt;&lt;span style=&quot;background-color: white; color: #202122; font-family: sans-serif; font-size: 16px;&quot;&gt;&amp;nbsp;of a&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Computer_program&quot; style=&quot;background: none rgb(255, 255, 255); border-radius: 2px; font-family: sans-serif; font-size: 16px; overflow-wrap: break-word; text-decoration-line: none;&quot; title=&quot;Computer program&quot;&gt;program&lt;/a&gt;&lt;span style=&quot;background-color: white; color: #202122; font-family: sans-serif; font-size: 16px;&quot;&gt;&amp;nbsp;is executed when a particular&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Test_suite&quot; style=&quot;background: none rgb(255, 255, 255); border-radius: 2px; font-family: sans-serif; font-size: 16px; overflow-wrap: break-word; text-decoration-line: none;&quot; title=&quot;Test suite&quot;&gt;test suite&lt;/a&gt;&lt;span style=&quot;background-color: white; color: #202122; font-family: sans-serif; font-size: 16px;&quot;&gt;&amp;nbsp;is run.&quot;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style=&quot;background-color: white; color: #202122; font-family: sans-serif; font-size: 16px;&quot;&gt;&amp;nbsp;- &lt;a href=&quot;https://en.wikipedia.org/wiki/Code_coverage&quot; target=&quot;_blank&quot;&gt;Wikipedia&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;Meaning, the code was &lt;i&gt;executed&lt;/i&gt;, not that it was &lt;b&gt;correct&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Teams with emphasis on code coverage value itself &lt;i&gt;may&lt;/i&gt; ship high quality code but how they arrive at that number is not generally sustainable and will be based more on ceremony than striving for the outcome of quality code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Teams treat code coverage as a signal, and not the value, will likely have a higher and more sustainable approach to code quality based on the practices they employ.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The difference is the team culture.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Examples&lt;/h2&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;A team that has a declared a code quality gate (e.g. 80%) generally follows this downward spiral&lt;/h4&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;It&#39;s a new project, and they want to do it &quot;right&quot;&lt;/li&gt;&lt;li&gt;PR branches will have tests, however, branches that pass code coverage may still bring the main branch down just enough to fail the build for quality, even when the new code has near 100% coverage&lt;/li&gt;&lt;ul&gt;&lt;li&gt;The side effect of this is that it introduces chaos, and suspicion, as the new changes worked fine in isolation but fail as part of the whole, requiring additional effort, often orthogonal to the task at hand, in order to bring the code quality number for the main branch as a whole back up&amp;nbsp;&lt;b&gt;just enough&lt;/b&gt; to pass&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Delivery pressure dips code quality below the threshold of 80%, so a new, lower threshold is set&lt;/li&gt;&lt;li&gt;Work is paused to focus on getting code coverage number back above the threshold - often not even valuable work&lt;/li&gt;&lt;li&gt;Rinse and repeat&lt;/li&gt;&lt;/ul&gt;This is not a healthy team cycle and is not sustainable as the code base complexity grows as it leads to an &quot;exception based&quot; or &quot;yeah, but&quot; style of delivery.&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;A team that understands quality is more than a number will generally&lt;/h4&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Write test for the important things&amp;nbsp;&lt;/li&gt;&lt;li&gt;Treats tests as production code&lt;/li&gt;&lt;li&gt;PR branches will have tests&amp;nbsp;&lt;/li&gt;&lt;li&gt;Observes signals in the system, including code coverage percentage. Other signals might be&lt;/li&gt;&lt;ul&gt;&lt;li&gt;bug backlog&lt;/li&gt;&lt;li&gt;number of incidents&amp;nbsp;&lt;/li&gt;&lt;li&gt;quality of the tests, i.e. ease of change&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Observes the system as a whole to see where improvements needed, pausing work to improve overall throughput, and quality of the system&lt;/li&gt;&lt;li&gt;Rinse and repeat&lt;/li&gt;&lt;/ul&gt;This is a sustainable team environment that takes a more end-to-end view of quality and not just a number. The difference is the team culture and how they understand the &lt;b&gt;&lt;i&gt;why &lt;/i&gt;&lt;/b&gt;of it all.&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description><link>http://zachbonham.blogspot.com/2025/02/code-coverage-as-quality-gate.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdTjAXWcM0IJiuKwTqN5LUAf1cJAPTmyv10xGPEsxJV9ciun_XzJRzLV8qEXQWA963YDZ3x4nlNnOYK_Sy7rHH4CoiSCKIa5DBY-C4bElVfp3gvoh7XHap6I20Nd4AN8z1cLhliOfK9u_tyPo2dOG1V1JaWJBOx2hjbtgnOf9aRIw3y_zpDSt8tw/s72-w640-h426-c/vadim-kaipov-Zvj8cbiu1is-unsplash.jpg" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5387140.post-3025569543128321351</guid><pubDate>Thu, 06 Feb 2025 22:22:00 +0000</pubDate><atom:updated>2025-02-06T16:22:01.470-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Azure</category><category domain="http://www.blogger.com/atom/ns#">Azure App Configuration</category><title>Configuration Management with Azure App Configuration</title><description>&lt;p&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://unsplash.com/@ffstop?utm_source=medium&amp;amp;utm_medium=referral&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;513&quot; data-original-width=&quot;800&quot; height=&quot;410&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio2TOcpeehYQPggRAXLoPImCnlMqwC6mfa5JA-u6fLbnUp_NdWRp-q0w4hGwsXOZOm8pWzVc8ALeLwQ3rNuB9u0qrT57AzginxWdol_hP83DTPrZgflU5GClF9bH7VYigQN_Qs3T00QjPqrlmEQmBDCsp87-JTBELox8F8biUH6NowddeFUl_Zrw/w640-h410/0_2zI-RlUP9e9Xel46.jpg&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;ad7a&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;For a variety of reasons, you might find yourself changing configuration (settings, connection strings, credentials, etc.) and then having to touch all the applications that consume that configuration. Once that happens, we can start looking at lifting out and centralizing that configuration somewhere else. Microsoft refers to this as the External Configuration Store pattern.&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;ad7a&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;Move configuration information out of the application deployment package to a centralized location. This can provide opportunities for easier management and control of configuration data, and for sharing configuration data across applications and application instances. — &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/architecture/patterns/external-configuration-store&quot;&gt;Microsoft Architecture Center: External Configuration Store&lt;/a&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Using Azure App Configuration as the system of record for configuration can help manage, version and audit that configuration. Other software/services exist (i.e. &lt;a class=&quot;markup--anchor markup--p-anchor&quot; data-href=&quot;https://www.hashicorp.com/products/vault&quot; href=&quot;https://www.hashicorp.com/products/vault&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Vault&lt;/a&gt;, &lt;a class=&quot;markup--anchor markup--p-anchor&quot; data-href=&quot;https://www.hashicorp.com/products/consul&quot; href=&quot;https://www.hashicorp.com/products/consul&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Consul&lt;/a&gt;) but as most of the services we are building today leverage Azure PaaS Azure App Configuration is a good fit.&amp;nbsp;&lt;/p&gt;&lt;p&gt;There are three patterns we’ve used when building applications and managing their configuration.&lt;/p&gt;&lt;ul class=&quot;postList&quot;&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;9940&quot;&gt;Manually configure per environment&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;7f95&quot;&gt;Configuration on Deploy&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;6c0f&quot;&gt;Configuration on Startup&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;h3 class=&quot;graf graf--h3&quot; name=&quot;d412&quot;&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3 class=&quot;graf graf--h3&quot; name=&quot;d412&quot;&gt;Manually Configure per Environment&lt;/h3&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;a3fc&quot;&gt;We are including this here for completeness but the only acceptable use for manually applying application configuration is prototyping or a &lt;b&gt;VERY &lt;/b&gt;small footprint. There is very little traceability here when changes are made, why they were made, and they are less likely to be reproducible.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;a3fc&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3 class=&quot;graf graf--h3&quot; name=&quot;0238&quot;&gt;Configuration on&amp;nbsp;Startup&lt;/h3&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;66d1&quot;&gt;Using the configuration on startup pattern, the service only has context of an identity, configuration key sets (labels, tags, name filters, etc.) and the configuration endpoint. The service authenticates to the configuration endpoint on startup, retrieves its configuration, and applies before continuing with its boot process.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;66d1&quot;&gt;&lt;b&gt;Pros&lt;/b&gt;&lt;/p&gt;&lt;ul class=&quot;postList&quot;&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;63fe&quot;&gt;Applying of configuration is “IN YO FACE”&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;42b2&quot;&gt;Changing configuration doesn’t require restart/redeploy&lt;/li&gt;&lt;/ul&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;4f35&quot;&gt;&lt;b&gt;Cons&lt;/b&gt;&lt;/p&gt;&lt;ul class=&quot;postList&quot;&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;6fc4&quot;&gt;Applying of configuration is “IN YO FACE”&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;7509&quot;&gt;Authenticating with DefaultAzureCredential is often &lt;em class=&quot;markup--em markup--li-em&quot;&gt;very&lt;/em&gt; slow, which is lag for developer feedback loop&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;h3 class=&quot;graf graf--h3&quot; name=&quot;fab2&quot;&gt;Configuration on&amp;nbsp;Deploy&lt;/h3&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;f697&quot;&gt;Using the “Config on Deploy” pattern, the configuration for the service is applied when the service is deployed. The service then loads configuration by conventional means (local.appsettings.json, appSettings.json, environment variables, etc.).&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;f697&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;8e17&quot;&gt;&lt;strong class=&quot;markup--strong markup--p-strong&quot;&gt;Pros&lt;/strong&gt;&lt;/p&gt;&lt;ul class=&quot;postList&quot;&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;cd39&quot;&gt;Configuration is more of Operational concern and less of Development Concern&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;6099&quot;&gt;Leverages traditional IConfiguration, IOption, and related programming models&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;ab94&quot;&gt;Better traceability for how to resolve configuration&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;1646&quot;&gt;Managed Identity is not required for configuration (but still worthwhile!)&lt;/li&gt;&lt;/ul&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;29cd&quot;&gt;&lt;strong class=&quot;markup--strong markup--p-strong&quot;&gt;Cons&lt;/strong&gt;&lt;/p&gt;&lt;ul class=&quot;postList&quot;&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;9ded&quot;&gt;Applying of configuration is a pipeline activity&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;c575&quot;&gt;Changing configuration requires re-deploy&lt;/li&gt;&lt;/ul&gt;&lt;h3 class=&quot;graf graf--h3&quot; name=&quot;692c&quot;&gt;&lt;br /&gt;&lt;/h3&gt;&lt;/div&gt;&lt;div&gt;&lt;h3 class=&quot;graf graf--h3&quot; name=&quot;692c&quot;&gt;How to Publish Configuration?&lt;/h3&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;592c&quot;&gt;Most configuration is published either from the system, or application, pipelines themselves. For example, a system level resource like an Azure Blob storage location will be created (using Azure Bicep via pipeline) and its key will be published, along with a naming convention for retrieval, to Azure Application Configuration. An application level resource, like an Azure Function, can also publish (again using Bicep via a pipeline) to Azure App Configuration.&lt;/p&gt;&lt;h3 class=&quot;graf graf--h3&quot; name=&quot;ed6d&quot;&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3 class=&quot;graf graf--h3&quot; name=&quot;ed6d&quot;&gt;How to Consume Configuration?&lt;/h3&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;3b61&quot;&gt;Consumers of configuration, such as pipelines or services, will read Azure Application Configuration, using the agreed naming conventions, and then apply that configuration using either the Configure on Startup or Configure on Deploy patterns.&lt;/p&gt;&lt;h3 class=&quot;graf graf--h3&quot; name=&quot;725e&quot;&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3 class=&quot;graf graf--h3&quot; name=&quot;725e&quot;&gt;What about Local Development?&lt;/h3&gt;&lt;p class=&quot;graf graf--p graf--empty&quot; name=&quot;34dd&quot;&gt;AZ CLI PUSH/PULL config&lt;/p&gt;&lt;h3 class=&quot;graf graf--h3&quot; name=&quot;68d2&quot;&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3 class=&quot;graf graf--h3&quot; name=&quot;68d2&quot;&gt;Possible Additional Improvements&lt;/h3&gt;&lt;ul class=&quot;postList&quot;&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;593e&quot;&gt;Strongly typed configuration via Option. Today, we use &lt;code class=&quot;markup--code markup--li-code&quot;&gt;_configuration[&quot;config_key&quot;]&lt;/code&gt; frequently. This is likely fine for small, less complex components. However, we have some that might benefit from strongly typing the configuration. Aides in understanding, traceability and refactoring.&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;5a35&quot;&gt;Validate configuration as early as possible, not on first access. ie. When the service starts, we could validate that we have all the configuration required for the service to run instead of waiting for methods to be called.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/azure/architecture/patterns/external-configuration-store&quot;&gt;&lt;/a&gt;</description><link>http://zachbonham.blogspot.com/2025/02/configuration-management-with-azure-app.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio2TOcpeehYQPggRAXLoPImCnlMqwC6mfa5JA-u6fLbnUp_NdWRp-q0w4hGwsXOZOm8pWzVc8ALeLwQ3rNuB9u0qrT57AzginxWdol_hP83DTPrZgflU5GClF9bH7VYigQN_Qs3T00QjPqrlmEQmBDCsp87-JTBELox8F8biUH6NowddeFUl_Zrw/s72-w640-h410-c/0_2zI-RlUP9e9Xel46.jpg" height="72" width="72"/><georss:featurename>Allen, TX, USA</georss:featurename><georss:point>33.1031744 -96.670550300000016</georss:point><georss:box>4.7929405638211549 -131.8268003 61.413408236178846 -61.514300300000016</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5387140.post-1449424252421098044</guid><pubDate>Thu, 06 Feb 2025 21:43:00 +0000</pubDate><atom:updated>2025-02-06T16:22:21.919-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Functional Programming</category><title>Falling into Functional</title><description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://bookshop.org/p/books/domain-modeling-made-functional-tackle-software-complexity-with-domain-driven-design-and-f-scott-wlaschin/6388541?ean=9781680502541&amp;amp;next=t&amp;amp;next=t&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;460&quot; data-original-width=&quot;384&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeyBLAmFgMZQYSjZ7gOn8AYdpDARFI55ZfEYAjQYdNvTbPJcT7-G1hZsSH50SeIj1pmI9J6aW7XYZHqz47Rnus0FqgCTDwWm8oVfKpXKi13yCjaE2KnFUaz7pq0giSMJRHax_4w9gftyueRd3LHL_fXZ5anS55lTN8DGrg5KWzCPgGWgmM2xUZGQ/w534-h640/9781680502541.webp&quot; width=&quot;534&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Picked up a copy of &lt;a href=&quot;https://bookshop.org/p/books/domain-modeling-made-functional-tackle-software-complexity-with-domain-driven-design-and-f-scott-wlaschin/6388541?ean=9781680502541&amp;amp;next=t&amp;amp;next=t&quot; target=&quot;_blank&quot;&gt;Domain Modeling made Functional - Scott Wlaschin&lt;/a&gt; over the Christmas break for a couple of reasons:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;An interest in domain driven design&lt;/li&gt;&lt;li&gt;An interest in modeling business domains using F#&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;The first ~60 pages of this book should be required reading for any team, including stakeholders, as a primer for vision of a &quot;how to&quot; when it comes to modeling the business. Think it will really help get some alignment quickly with a few short.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The expressiveness of F# is impressive - especially when it comes to eliminating &#39;primitive types&#39; and building that vocabulary.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I love the idea of domain driven design. I know what it looks like when its healthy and know what it looks like when it&#39;s more of a cargo cult. This book cut through most of the cheese with a &quot;just do it&quot; approach that avoids a lot of the pitfalls that tend to derail.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Recommended.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</description><link>http://zachbonham.blogspot.com/2025/02/falling-into-functional.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeyBLAmFgMZQYSjZ7gOn8AYdpDARFI55ZfEYAjQYdNvTbPJcT7-G1hZsSH50SeIj1pmI9J6aW7XYZHqz47Rnus0FqgCTDwWm8oVfKpXKi13yCjaE2KnFUaz7pq0giSMJRHax_4w9gftyueRd3LHL_fXZ5anS55lTN8DGrg5KWzCPgGWgmM2xUZGQ/s72-w534-h640-c/9781680502541.webp" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5387140.post-3173628831789344992</guid><pubDate>Tue, 03 Apr 2012 02:29:00 +0000</pubDate><atom:updated>2025-02-06T15:31:00.172-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Software Development</category><title>Software Delivery Bottlenecks - Deployment</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBIBdD1yU2OLNDKWtRxjLWOmcync-jqoQv3w7idEqUHvLerGljiE326dw7iKaidGiWg1x1UEyBQC7ehq9dc350TW0JAmXGv9X0-aCUdwr1KkwenCPECYJqXTMoL9sLAMkjEUZBPV8Z62Vy2Pzn60XcC88wnCPnGPS6dCTOmfFEY5TAhlBFbRLxeg/s4288/pexels-pixabay-210182.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2635&quot; data-original-width=&quot;4288&quot; height=&quot;197&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBIBdD1yU2OLNDKWtRxjLWOmcync-jqoQv3w7idEqUHvLerGljiE326dw7iKaidGiWg1x1UEyBQC7ehq9dc350TW0JAmXGv9X0-aCUdwr1KkwenCPECYJqXTMoL9sLAMkjEUZBPV8Z62Vy2Pzn60XcC88wnCPnGPS6dCTOmfFEY5TAhlBFbRLxeg/s320/pexels-pixabay-210182.jpg&quot; width=&quot;320&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;
Seems that the business waits on software developers, who have waited on system administrators, who have waited on infrastructure engineers to produce the ecosystem required for today&#39;s software applications, while waiting on the business to produce the contracts, by which the business can legally operate.&lt;br /&gt;
&lt;br /&gt;
Looking at the most simplistic example of the macro tasks involved in a software project we have: &lt;br /&gt;
&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;develop software&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;runtime environment(s)&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;deploy software&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;
If we assume an admissibly arbitrary cost of 1, for our tasks, and fundamentally all tasks being equal, then we can create a simple formula to help describe the bottleneck in our software delivery process. &lt;br /&gt;
&lt;br /&gt;
We do have to account for things we do many times or iterations. For instance, we will deploy software through more than 1 environment. While the software hasn&#39;t changed, but we still have the overhead of the deployment &lt;i&gt;cost&lt;/i&gt;.&lt;br /&gt;
&lt;/span&gt;&lt;h3&gt;

&lt;/h3&gt;
&lt;h3&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;

 Example &lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;assumed cost of 1 arbitrary unit&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;multiplier N, where N is equal to the number of iterations, which will be 5.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;multiplier E, where E is equal to the number of environments, which will be 4 (Development, QA, Staging, and Production)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;h3&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;

The Cost of Doing Business&lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;develop software&lt;b&gt; (1 * N) = (1 * 5) = 5&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;provision hardware &lt;b&gt;(1 * E) = (1 * 4) = 4&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;deploy software &lt;b&gt;((1 * E) * N) = ((1 * 4) * 5) = (4 * 5) = 20&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;Of course, this is a very simplistic view, contrived to drive the point home that deploying software can have a very high overall cost of a software delivery. Deployment is an area of the overall software delivery process that can bring an almost immediate value in economy of scale as the number of servers, and number of environments, increases. &lt;br /&gt;&lt;br /&gt;Automate those things that have a high rate of repeatability. Don&#39;t be surprised, removing one bottleneck will typically force another bottleneck into the light and we address those one at a time.&lt;/span&gt;&lt;br /&gt;
&lt;/span&gt;&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;People, Process, and Automation.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Lather, Rinse, Repeat.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;</description><link>http://zachbonham.blogspot.com/2012/04/software-delivery-bottlenecks.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBIBdD1yU2OLNDKWtRxjLWOmcync-jqoQv3w7idEqUHvLerGljiE326dw7iKaidGiWg1x1UEyBQC7ehq9dc350TW0JAmXGv9X0-aCUdwr1KkwenCPECYJqXTMoL9sLAMkjEUZBPV8Z62Vy2Pzn60XcC88wnCPnGPS6dCTOmfFEY5TAhlBFbRLxeg/s72-c/pexels-pixabay-210182.jpg" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5387140.post-5023241479050346600</guid><pubDate>Sat, 08 Sep 2007 02:38:00 +0000</pubDate><atom:updated>2007-09-07T21:39:58.878-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Life</category><title>Guys Weekend - The Potato Gun</title><description>&lt;p&gt;Every once and a while my Dad, my&amp;nbsp;Brother and I get together just to goof off outside the scope of normal family visits.&amp;nbsp; A chance to just relax, swap stories, brainstorm how to change the world,&amp;nbsp;and act well, like &lt;strong&gt;kids&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;My Brother owns a house overlooking Lake Travis in Jonestown, TX &lt;em&gt;[northwest of Austin]&lt;/em&gt;, he&#39;s got the nice boat, a great entertainment center, you know...all the toys.&amp;nbsp; What he&#39;s lacking is a good guest bed and some food on the shelves &lt;em&gt;[bachelor]&lt;/em&gt;, but that can all be remedied.&amp;nbsp; Dad usually arrives on his motorcycle &lt;em&gt;[from Conroe]&lt;/em&gt;&amp;nbsp;at the crack of dawn and I&#39;ll roll in around noon &lt;em&gt;[from Dallas]&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Prior to arriving, my Dad forwarded the following video of a &#39;potato cannon&#39;&amp;nbsp;to us.&amp;nbsp; It was to become our inspiration for the trip.&amp;nbsp; I&#39;ve linked to it below in case your interested.&lt;/p&gt; &lt;center&gt; &lt;p&gt;&lt;embed src=&quot;http://www.youtube.com/v/CpAJOPzKK-M&quot; width=&quot;425&quot; height=&quot;350&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot;&gt;&lt;/embed&gt;&lt;/p&gt;&lt;/center&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Once we saw the video &lt;em&gt;[you can stop after a couple minutes, you&#39;ll get the point]&lt;/em&gt; the inner child in us was raring to go!&amp;nbsp; We bought all the necessary components from the local True Value hardware store and the requisite 10lbs of potato&#39;s and a can of &#39;Aquanet&#39;.&amp;nbsp; Less than an hour &lt;em&gt;[and a few beers]&lt;/em&gt; later, we had built the toy d&#39; jour and it was awesome.&amp;nbsp; You can see some of the pictures below and hopefully Dad will rip the video he took off his camera and get it to us so that we can see it.&lt;/p&gt; &lt;p&gt;This contraption literally shot a potato &lt;strong&gt;a hundred yards&lt;/strong&gt; down the side of Jason&#39;s property!&amp;nbsp; &lt;/p&gt; &lt;p&gt;Now, we realized that we were doing something dangerous &lt;em&gt;[and quite possibly illegal]&lt;/em&gt; so we rationalized who would go first.&amp;nbsp;&amp;nbsp; We couldn&#39;t let Jason go first, he as the only one of us with any medical training &lt;em&gt;[over 10 years as a paramedic]&lt;/em&gt;, if anything went wrong we&#39;d need him.&amp;nbsp; They wouldn&#39;t let me go first because I&#39;ve got a wife and two kids.&amp;nbsp; That left Dad.&amp;nbsp; Dad was barely able to contain himself just waiting for us to quit fooling around and give him the damn thing..&lt;/p&gt; &lt;p&gt;Of course, after all that deliberating &lt;em&gt;[inebriating]&lt;/em&gt;, Jason goes and sticks his face right up to the combustion chamber&amp;nbsp;just as I am testing the&amp;nbsp;&#39;spark&#39;&amp;nbsp;for what we thought would be a misfire.&amp;nbsp; Well, the picture can be found in the group below!&amp;nbsp; The irony is that we&#39;ve grown up with guns our entire lives and gun safety has always been a priority.&amp;nbsp;&amp;nbsp; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;center&gt; &lt;table style=&quot;width: 194px&quot; unselectable=&quot;on&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style=&quot;background: url(http://picasaweb.google.com/f/img/transparent_album_background.gif) no-repeat left 50%; height: 194px&quot; align=&quot;middle&quot;&gt;&lt;a href=&quot;http://picasaweb.google.com/zachbonham/GuysWeekend2007ThePotatoCannon&quot;&gt;&lt;img style=&quot;margin: 1px 0px 0px 4px&quot; height=&quot;160&quot; src=&quot;http://lh3.google.com/zachbonham/RuHp1FASyPE/AAAAAAAAAUQ/QyQQY33fFEQ/s160-c/GuysWeekend2007ThePotatoCannon.jpg&quot; width=&quot;160&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;font-size: 11px; font-family: arial,sans-serif; text-align: center&quot;&gt;&lt;a style=&quot;font-weight: bold; color: #4d4d4d; text-decoration: none&quot; href=&quot;http://picasaweb.google.com/zachbonham/GuysWeekend2007ThePotatoCannon&quot;&gt;Guys Weekend 2007 - The Potato Cannon&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/center&gt; &lt;p&gt;We enjoyed ourselves so much that we are going to each make one, with a little different design and definitely with a personal touch.&amp;nbsp; Jason has already got his &lt;a href=&quot;http://www.bungie.net/&quot; target=&quot;_blank&quot;&gt;Halo&lt;/a&gt; design worked out.&amp;nbsp; &lt;/p&gt; &lt;p&gt;We also spent a lot of time rocking the hilltop on &lt;a href=&quot;http://www.amazon.com/Activision-Guitar-Hero-2-Bundle/dp/B000MRNUB2/ref=pd_bbs_sr_2/105-1354781-5281239?ie=UTF8&amp;amp;s=videogames&amp;amp;qid=1189218259&amp;amp;sr=1-2&quot; target=&quot;_blank&quot;&gt;Guitar Hero 2&lt;/a&gt;!&amp;nbsp; I&#39;ve got to get this, it is still the best game I&#39;ve played in a long time. I still can&#39;t believe they&#39;ve yet to release the wireless controller for the XBox 360!&amp;nbsp; What kind of sick joke is that? Anyway, that&#39;s what I&#39;m holding out for.&amp;nbsp; Anyway, Dad won the cards with an all in late in the evening.&lt;/p&gt; &lt;p&gt;I had to cap off the weekend with a hangover and a burning desire to get back to my family &lt;em&gt;[two sick kids]&lt;/em&gt; so called in on Sunday.&amp;nbsp; Dad, Jason &lt;em&gt;[and crew] &lt;/em&gt;still took &lt;a href=&quot;http://picasaweb.google.com/zachbonham/GuysWeekend2006TheGoodLife/photo#5013431979701088530&quot; target=&quot;_blank&quot;&gt;Luscious&lt;/a&gt; out on the lake on Monday.&amp;nbsp; I&#39;ve yet to hear how that went.&lt;/p&gt; &lt;p&gt;Till next time..&lt;/p&gt;</description><link>http://zachbonham.blogspot.com/2007/09/guys-weekend-potato-gun.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5387140.post-7177860994583304532</guid><pubDate>Thu, 06 Sep 2007 02:46:00 +0000</pubDate><atom:updated>2007-09-05T21:46:49.725-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">BizTalk</category><category domain="http://www.blogger.com/atom/ns#">Software Development</category><title>Sea of Technology</title><description>&lt;p&gt;I&#39;m overdue for a rambling post, so here you go... &lt;p&gt;Just saw this article: &lt;a href=&quot;http://www.infoq.com&quot; target=&quot;_blank&quot;&gt;InfoQ&lt;/a&gt; - &lt;a href=&quot;http://www.infoq.com/articles/idc-study&quot; target=&quot;_blank&quot;&gt;Interview: Dino Chiesa on Microsoft&#39;s SOA Strategy&lt;/a&gt; (from &lt;a href=&quot;http://blogs.msdn.com/biztalk_server_team_blog/default.aspx&quot; target=&quot;_blank&quot;&gt;BizTalk Server Team&lt;/a&gt; blog). &lt;p&gt;Of particular interest is the Microsoft &lt;a href=&quot;http://www.codeplex.com/esb&quot; target=&quot;_blank&quot;&gt;ESB Guidance&lt;/a&gt; and the eBook ‘&lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyID=cb2a8e49-bb3b-49b6-b296-a2dfbbe042d8&amp;amp;displaylang=en&quot; target=&quot;_blank&quot;&gt;SOA in the Real World&lt;/a&gt;’.&amp;nbsp;&amp;nbsp; By the very nature of BizTalk, much of the work we do falls into the ‘service oriented’ design category.&amp;nbsp;  &lt;p&gt;However, BizTalk does not an SOA (or ESB) make.&amp;nbsp; BizTalk can certainly be a core platform for delivering service oriented solutions and it certainly can be a key component for building a service bus.&amp;nbsp;  &lt;p&gt;This isn&#39;t a dive into how to develop service oriented solutions with BizTalk, or how to build an ESB with BizTalk.&amp;nbsp; Its mainly about what skills you need to develop in order to swim in a sea of technology. &lt;p&gt;One thing that continues to be evident that it is not really possible to be just a &#39;BizTalk&#39; developer without having a good grasp on at least the Microsoft technology stack.&amp;nbsp;  &lt;p&gt;The breadth of the technologies I&#39;ve had to keep up with just seems to overwhelm compared to back when I was either just the &#39;UI Guy&#39; (C++, Win32, MFC, a good understanding of the message pump and subclassing windows controls) or a &#39;Server Guy&#39; (C++, Win32, STL and UI technologies be damned). &lt;p&gt;This is the short list: &lt;ul&gt; &lt;li&gt;&lt;strong&gt;.NET Framework&lt;/strong&gt; - BizTalk is built on .NET and without a good understanding of .NET you won&#39;t be able to fully leverage the extensibility of BizTalk.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Sql Server&lt;/strong&gt; - who doesn&#39;t&amp;nbsp; need to store data?&amp;nbsp; Who hasn&#39;t done this badly?&amp;nbsp; A badly implemented data tier (including data access logic) can quickly become one of the most insidious of bottlenecks.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Xml &lt;/strong&gt;- this is a technology stack unto itself.&amp;nbsp;&amp;nbsp; A working knowledge of Xml, Xml Schema, XPath and Xslt is pretty much required.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;SOAP, WS-*&lt;/strong&gt; - Pay attention to WS-BasicProfile and WS-Security.&amp;nbsp; The rest are worth a look if your situation calls for it.&amp;nbsp; Be wary about your interoperability story if you have heterogeneous clients consuming your services.&lt;/li&gt; &lt;li&gt;.&lt;strong&gt;NET Web Services&lt;/strong&gt; (a.k.a. ASMX) - if you have any services in production, they are likely of the ASMX flavor.&amp;nbsp; The initial service workhorse.&amp;nbsp; Getting at least a passing familiarity of &lt;a href=&quot;http://en.wikipedia.org/wiki/TCP/IP_model&quot; target=&quot;_blank&quot;&gt;tcp/ip&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/HTTP&quot; target=&quot;_blank&quot;&gt;http&lt;/a&gt; protocols really helps to understand what&#39;s going on at the &#39;wire&#39;.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Windows Communication Foundation&lt;/strong&gt; (WCF)&amp;nbsp;- the WCF adapter is baked into the BizTalk 2006 R2 release.&amp;nbsp; If your writing services today, WCF is the &#39;foundation&#39; your likely starting with.&amp;nbsp; Understanding the WCF programming model is key.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Windows Workflow&lt;/strong&gt; - likely successor to the BizTalk orchestration engine.&amp;nbsp; Actually, &lt;a href=&quot;http://www.winterdom.com/weblog/default.aspx&quot; target=&quot;_blank&quot;&gt;Tomas Restrepo&lt;/a&gt; has a good post that will make you go hmmmm... check out &#39;&lt;a href=&quot;http://www.winterdom.com/weblog/2007/09/03/TheFutureOfBizTalkWCFWF.aspx&quot; target=&quot;_blank&quot;&gt;The Future of BizTalk/WCF/WF&lt;/a&gt;&#39;.&amp;nbsp; I&#39;ve not realized the full potential for WF yet...but I know I want some of the IDE features with BizTalk!&amp;nbsp; This is an area to keep an eye on for growth.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Debugging&lt;/strong&gt; - learning what to do when &lt;strong&gt;it&lt;/strong&gt; hits the fan, and &lt;strong&gt;it&lt;/strong&gt; will hit the fan.&amp;nbsp; Its a just a matter of time and &lt;strong&gt;it&lt;/strong&gt; won&#39;t always be nice enough to occur in a development environment.&amp;nbsp; Oh, no siree, &lt;strong&gt;it&lt;/strong&gt; will wait to occur until your businesses critical time of the year/month/week/day, and &lt;strong&gt;it&lt;/strong&gt; &lt;em&gt;will&lt;/em&gt; &lt;strong&gt;hurt&lt;/strong&gt; and you will have to fix it.&amp;nbsp; &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;And lets not forget the plethora of bits that sit above these on the stack: &lt;a href=&quot;http://www.codeplex.com/entlib&quot; target=&quot;_blank&quot;&gt;Enterprise Library&lt;/a&gt;, the aforementioned Microsoft ESB Guidance, Testing, Source Control (e.g. &lt;a href=&quot;http://msdn2.microsoft.com/en-us/teamsystem/aa718934.aspx&quot; target=&quot;_blank&quot;&gt;TFS&lt;/a&gt; or &lt;a href=&quot;http://subversion.tigris.org/&quot; target=&quot;_blank&quot;&gt;Subversion&lt;/a&gt;), Security, the list goes on.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Oh yeah...that&#39;s why they pay us.&amp;nbsp; Ok, then.&amp;nbsp; Well, where do you start?&amp;nbsp; Check out the following resources:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href=&quot;http://msdn2.microsoft.com/en-us/architecture/aa948857.aspx&quot; target=&quot;_blank&quot;&gt;MSDN Architecture Center - Service Oriented Architecture&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&quot;http://www.amazon.com/CLR-via-Second-Pro-Developer/dp/0735621632/ref=pd_sim_b_1_img/105-1354781-5281239&quot; target=&quot;_blank&quot;&gt;Jeffrey Richter - CLR Via C#&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&quot;http://www.amazon.com/Applied-Microsoft-NET-Framework-Programming/dp/0735614229&quot; target=&quot;_blank&quot;&gt;Jeffrey Richter - Applied Microsoft .NET Framework Programming&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&quot;http://www.amazon.com/Microsoft-Windows-Communication-Foundation-Developer/dp/0735623368/ref=pd_bbs_sr_1/105-1354781-5281239?ie=UTF8&amp;amp;s=books&amp;amp;qid=1188998806&amp;amp;sr=1-1&quot; target=&quot;_blank&quot;&gt;John Sharp - Windows Communication Foundation, Step by Step&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&quot;http://www.w3.org/&quot; target=&quot;_blank&quot;&gt;W3C - World Wide Web Consortium&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&quot;http://www.amazon.com/Debugging-Microsoft-NET-2-0-Applications/dp/0735622027&quot; target=&quot;_blank&quot;&gt;John Robbins - Debugging Microsoft .NET 2.0 Applications&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&quot;http://www.microsoft.com/whdc/devtools/debugging/default.mspx&quot; target=&quot;_blank&quot;&gt;Debugging Tools for Windows&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;It starts with code.&amp;nbsp; code.&amp;nbsp; code.&amp;nbsp; Build it.&amp;nbsp; Analyze it.&amp;nbsp; Learn from it.&amp;nbsp;&amp;nbsp;Rinse and Repeat.&amp;nbsp;&lt;/p&gt; &lt;p&gt;Well, I&#39;ve rambled enough for one night.&lt;/p&gt;</description><link>http://zachbonham.blogspot.com/2007/09/sea-of-technology.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5387140.post-6970597521247462398</guid><pubDate>Sat, 25 Aug 2007 18:01:00 +0000</pubDate><atom:updated>2007-08-26T07:43:09.070-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Testing</category><title>Test Process Template</title><description>&lt;p&gt;&lt;/p&gt; &lt;p&gt;No matter what type of testing you might be doing, it helps to have as part of your process a list of scripted steps to follow.&amp;nbsp; Once identified, the list of steps will help make sure that you have consistency between test runs, and if automated, helps to get you back into a position to test again as soon as possible.&lt;/p&gt; &lt;p&gt;The following template is one that I&#39;ve used for several years with success.&amp;nbsp; What really helps get the extra mileage out of it is if you automate all, or most, of it using whatever scripting technologies work for you.&amp;nbsp; My current personal favorite is &lt;a href=&quot;http://nant.sourceforge.net/&quot; target=&quot;_blank&quot;&gt;NANT&lt;/a&gt; as the execution engine and then a suite of VBScript, or even .BAT files, that actually execute each specific step.&lt;/p&gt; &lt;p&gt;NANT&#39;s &lt;em&gt;foreach&lt;/em&gt; construct makes it very easy to loop over a server list, getting consistent results across the board.&amp;nbsp; &lt;/p&gt; &lt;h3&gt;PRE-Test&lt;/h3&gt; &lt;ol&gt; &lt;li&gt;Initialize Repository  &lt;ol&gt; &lt;li&gt;Create folder(s) that will be repository for information from this test run.&amp;nbsp; This will probably be something like a test label plus a run number.&amp;nbsp; If your doing a lot of different types of testing, then it will make sense to have more meaningful labels.&amp;nbsp; Otherwise, &#39;TESTRUN1&#39;, will likely work just fine.&amp;nbsp; The important take away is that you need a friendly way to refer back to all the data that you will be collecting.&lt;/li&gt;&lt;/ol&gt; &lt;li&gt;Capture Configuration  &lt;ol&gt; &lt;li&gt;Copy all configuration files to the repository.&amp;nbsp; The purpose of capturing the configuration is that you may need to correlate test results back to a specific configuration that was in effect during a particular test run.&amp;nbsp;Examples of configuration files are: machine.config, web.config, app.config, .INI files.&amp;nbsp; Consider exporting any registry settings to .REG files.&amp;nbsp; If your using non .NET applications and services, then look for those files as well.&amp;nbsp; Apache and WebSphere are two very file centric server applications.  &lt;li&gt;Clear, or delete, any log files.&amp;nbsp; Make sure that any event notification received should be from this particular test run.&lt;/li&gt;&lt;/ol&gt; &lt;li&gt;Start Services  &lt;ol&gt; &lt;li&gt;Identify the order that the services need to be started.&amp;nbsp; Start services in preparation of the test run.&amp;nbsp;&amp;nbsp; These services are anything that your application needs to function: IIS, BizTalk, ERP or WMS services. &lt;/li&gt;&lt;/ol&gt; &lt;li&gt;Start Monitoring  &lt;ol&gt; &lt;li&gt;Make sure that your monitoring scripts fire up as well and that you are collecting data from the run.&amp;nbsp;&amp;nbsp;Unless your specifically measuring startup activity, you may wish to discard, or ignore, the &#39;warm&amp;nbsp; up&#39; period of your application.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt; &lt;h3&gt;Test&lt;/h3&gt; &lt;ol&gt; &lt;li&gt;Begin any test scripts that will be driving the load for your applications.&amp;nbsp; This could be automated testing such as &lt;a href=&quot;http://www.borland.com/us/products/silk/silkperformer/index.html&quot; target=&quot;_blank&quot;&gt;SilkPerformer&lt;/a&gt;, &lt;a href=&quot;http://www.mercury.com/us/products/performance-center/loadrunner/&quot; target=&quot;_blank&quot;&gt;LoadRunner&lt;/a&gt;, &lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyID=C2EE632B-41C2-42B4-B865-34077F483C9E&amp;amp;displaylang=en&quot; target=&quot;_blank&quot;&gt;LoadGen&lt;/a&gt;, or even Windows Task Scheduler.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt; &lt;h3&gt;POST-Test&lt;/h3&gt; &lt;ol&gt; &lt;li&gt;Stop Services  &lt;ol&gt; &lt;li&gt;Most likely, if there is an order that the services needed to be started in, then you will want to reverse that order for shutdown.&amp;nbsp; Many times you will need to stop services in order to execute the data collection.&lt;/li&gt;&lt;/ol&gt; &lt;li&gt;Data Collection  &lt;ol&gt; &lt;li&gt;Copy all log files to the test repository (e.g. application and server&#39;s such as IIS)  &lt;li&gt;Copy all Windows event logs to the repository  &lt;li&gt;Copy all performance (Perfmon) logs to the repository&lt;/li&gt;&lt;/ol&gt; &lt;li&gt;Clean up  &lt;ol&gt; &lt;li&gt;You probably have lots of &#39;data bits&#39; floating around the test environment.&amp;nbsp; Examples of this might be files in folder locations, MSMQ messages, rows in databases queues, etc.  &lt;li&gt;Reset your data tier to a known good state.&amp;nbsp; If your data lends itself to&amp;nbsp;just flipping a status bit to get back to a known good state, then execute the SQL to do this.&amp;nbsp; If not, then you will want to restore to your applications&amp;nbsp;&#39;golden&#39; backup.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;</description><link>http://zachbonham.blogspot.com/2007/08/test-process-template.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5387140.post-4219076572821115977</guid><pubDate>Thu, 26 Jul 2007 02:07:00 +0000</pubDate><atom:updated>2007-07-25T21:09:48.156-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Gaming</category><category domain="http://www.blogger.com/atom/ns#">Life</category><category domain="http://www.blogger.com/atom/ns#">Software Development</category><title>Last Hope</title><description>&lt;p&gt;Found a link to a cheeseball submission to &lt;a href=&quot;http://www.gamedev.net&quot; target=&quot;_blank&quot;&gt;gamedev.net&lt;/a&gt; from way, &lt;strong&gt;way&lt;/strong&gt;, &lt;strong&gt;&lt;em&gt;way&lt;/em&gt;&lt;/strong&gt; back in the day.&amp;nbsp; A screen shot is below.&amp;nbsp; You can download the game&amp;nbsp;&lt;a href=&quot;http://www.gamedev.net/community/contest/entries/lasthope.zip&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt; &lt;center&gt;&lt;a href=&quot;http://picasaweb.google.com/zachbonham/Blog/photo#5091309531994314658&quot;&gt;&lt;img src=&quot;http://lh3.google.com/zachbonham/Rqf3C2AU16I/AAAAAAAAAPY/iMdohQYoFqg/s400/lasthope.jpg&quot;&gt;&lt;/a&gt;&lt;/center&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;I can&#39;t tell you how absolutely &lt;strong&gt;amazed&lt;/strong&gt; I was that it ran on my PC today!&amp;nbsp; &lt;/p&gt; &lt;p&gt;Consider when it was written (2000), what the OS was (Windows 98)&amp;nbsp;and what your technology stack looked like (Visual Studio 6, C++ and DirectX 7).&amp;nbsp; Just think about that for a minute.&amp;nbsp; No...not the fact that its some amazingly crafted piece of code (its not, but thanks anyway) that has withstood the test of time.&lt;/p&gt; &lt;p&gt;Think about the &lt;strong&gt;commitment&lt;/strong&gt; Microsoft has put into the various levels of the application stack to make sure that future versions are &lt;em&gt;backwards compatible&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;That&#39;s really quite something.&amp;nbsp; &lt;/p&gt; &lt;p&gt;It got me thinking...will the solutions I&#39;m delivering today, be able to run, much less deliver &lt;strong&gt;value&lt;/strong&gt; 3, 5, or 10 years from now?&amp;nbsp;&amp;nbsp; Its 2007.&amp;nbsp; Do you know where &lt;strong&gt;&lt;em&gt;your&lt;/em&gt;&lt;/strong&gt; code is?&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;By the way, my current rig at home is running Windows Vista Home Premium with whatever version of DirectX ships with it.&amp;nbsp; I don&#39;t make any claims it will work on your system, nor will I be&amp;nbsp;held liable for making work (think I have the source though).&lt;/p&gt; &lt;p&gt;Another thing...my home development rig back then was a P400 with 128MB RAM.&amp;nbsp; Woot!&lt;/p&gt;</description><link>http://zachbonham.blogspot.com/2007/07/last-hope.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5387140.post-9069330200052615267</guid><pubDate>Thu, 19 Apr 2007 04:38:00 +0000</pubDate><atom:updated>2007-04-24T22:41:42.728-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Testing</category><category domain="http://www.blogger.com/atom/ns#">work</category><title>Mary Kay ART Strategy</title><description>&lt;p style=&quot;border-style: none none solid; border-color: -moz-use-text-color -moz-use-text-color rgb(255, 255, 0); border-width: medium medium 1pt; padding: 0in 0in 0.06in; margin-bottom: 0.21in; line-height: 100%; text-align: justify;&quot;&gt;&lt;span style=&quot;color: rgb(23, 54, 93);&quot;&gt;&lt;span style=&quot;font-family:Cambria,serif;&quot;&gt;&lt;span style=&quot;font-size:6;&quot;&gt;Project Dragon Application Readiness Testing&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;margin-bottom: 0in; line-height: 100%; text-align: justify;&quot;&gt;Supply Chain  Systems &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;margin-bottom: 0in; line-height: 100%; text-align: justify;&quot;&gt;©Mary Kay, Inc.,  2007 &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;h3 style=&quot;text-align: justify;&quot; class=&quot;western&quot;&gt;Strategy&lt;/h3&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p class=&quot;western&quot; style=&quot;margin-bottom: 0.14in; text-align: justify;&quot;&gt;The Mary Kay strategy for  application readiness testing (ART) is to create an environment which will be  similar to the production environment for purposes of executing tests. In  addition to the necessary hardware and software components expected of a  production environment, the ART environment also has available tools that are  essential to the testing process, such as load generation and issue resolution.  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p class=&quot;western&quot; style=&quot;margin-bottom: 0.14in; text-align: justify;&quot;&gt;Prior to implementing any new  systems, or critical components, in a production environment it is expected that  they will first be observed in the ART environment. The observations of the  systems under test allow for the development of profiles for each application  that will be used for planning future environments. These profiles consist of  resource requirements for the systems under test such as network (bandwidth and  utilization), storage and servers. &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p class=&quot;western&quot; style=&quot;margin-bottom: 0.14in; text-align: justify;&quot;&gt;Having the environment available  allows Mary Kay to test performance, stability and configuration of the  different infrastructure, applications, and systems that make up the Mary Kay  Supply Chain. Beyond having the hardware and software resources available is  only part of the equation. To complement the environment, Mary Kay has  identified personnel resources that are subject matter experts in areas such as  application, hardware, network and platform architectures, all of whom are can  be made available to help facilitate testing and just as importantly, analyzing  the results. &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;br /&gt;&lt;h3 style=&quot;text-align: justify;&quot; class=&quot;western&quot;&gt;Test Areas&lt;br /&gt;&lt;/h3&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p class=&quot;western&quot; style=&quot;margin-bottom: 0.14in; text-align: justify;&quot;&gt;There are key focal areas that  have been defined for volume testing prior to the Project Dragon go-live. &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;h2 style=&quot;text-align: justify;&quot; class=&quot;western&quot;&gt;J.D. Edwards and DSI &lt;/h2&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p class=&quot;western&quot; style=&quot;margin-bottom: 0.14in; text-align: justify;&quot;&gt;First and foremost is the Mary  Kay enterprise resource planning system, J.D. Edwards and its new warehousing  functionality that will be leveraged in all international supply chain  deployments. This area was chosen for the following reasons: &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;ol style=&quot;text-align: justify;&quot;&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;Mary Kay is deploying a completely new version  of JDE internationally, on an updated solution stack. &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;The JDE Advance Warehouse modules are new  functionality to both this version of JDE and to the Mary Kay supply chain. &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;Mary Kay has made custom modifications to both  JDE and DSI applications which need to be validated under load. &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;The RF traffic generated by DSI from the China  remote facility to the Shanghai data center needs to be tested to be within  defined user requirements for response time. &lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;h3 style=&quot;text-align: justify;&quot; class=&quot;western&quot;&gt;Business Process &lt;/h3&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;margin-bottom: 0.14in; text-align: justify;&quot;&gt;Mary Kay will be developing both telnet and web  based scripts to drive load against core functional areas as defined by the Mary  Kay business team.&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;ul style=&quot;text-align: justify;&quot;&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;Distribution &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;Procurement &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;Shop Floor Control &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;Sales Order &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;h3 style=&quot;text-align: justify;&quot; class=&quot;western&quot;&gt;Application Integration &lt;/h3&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p class=&quot;western&quot; style=&quot;margin-bottom: 0.14in; text-align: justify;&quot;&gt;Both BizTalk and DSI are planning  to use the same inbound services &lt;sup&gt;&lt;a class=&quot;sdfootnoteanc&quot; href=&quot;http://www2.blogger.com/post-create.g?blogID=5387140#sdfootnote1sym&quot; name=&quot;sdfootnote1anc&quot;&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt;&lt;/sup&gt; for JDE.  Identifying the capacity of the planned hardware resources is required to  identify if and when scale out of the JDE inbound architecture will be needed.  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;h3 style=&quot;text-align: justify;&quot; class=&quot;western&quot;&gt;Enterprise Application Integration&lt;/h3&gt;&lt;h2 style=&quot;text-align: justify;&quot; class=&quot;western&quot;&gt; &lt;/h2&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p class=&quot;western&quot; style=&quot;margin-bottom: 0.14in; text-align: justify;&quot;&gt;Application and partner  integration are critical to the success of the Mary Kay supply chain. These  areas have undergone both architectural and platform upgrades, as well as new  development, for the Dragon implementation. &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;h3 style=&quot;text-align: justify;&quot; class=&quot;western&quot;&gt;BizTalk Server 2006 &lt;/h3&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;margin-bottom: 0in; line-height: 100%; text-align: justify;&quot;&gt;A key area for test around the  Mary Kay BizTalk implementation is the throughput performance of the direct  bound architecture and validating the capacity of the planned hardware  resources. In addition, Mary Kay has introduced new transport protocol that has  yet to be tested under load. &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;h3 style=&quot;text-align: justify;&quot; class=&quot;western&quot;&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3 style=&quot;text-align: justify;&quot; class=&quot;western&quot;&gt;3PL Web Services &lt;/h3&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p class=&quot;western&quot; style=&quot;margin-bottom: 0.14in; text-align: justify;&quot;&gt;Mary Kay has implemented a  service oriented messaging gateway for integrating with third party logistic  vendors. This architecture needs to be tested to validate that it will meet  production capacities. &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;h3 style=&quot;text-align: justify;&quot; class=&quot;western&quot;&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3 style=&quot;text-align: justify;&quot; class=&quot;western&quot;&gt;Supply Chain Services &lt;/h3&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;margin-bottom: 0in; line-height: 100%; text-align: justify;&quot;&gt;Mary Kay has implemented  several key services that provide support for internal processes which need to  be tested under production loads.&lt;/p&gt;&lt;h3 style=&quot;text-align: justify;&quot; class=&quot;western&quot;&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3 style=&quot;text-align: justify;&quot; class=&quot;western&quot;&gt;Workload Models&lt;br /&gt;&lt;/h3&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p class=&quot;western&quot; style=&quot;margin-bottom: 0.14in; text-align: justify;&quot;&gt;A workload model represents the  execution of automated scripts which drive a determined amount of load against  one, or more systems based upon certain characteristics. Mary Kay has organized  the suite of tests into several individual workloads. Each workload has the  ability to be executed independently, or concurrently, with other workloads.  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p class=&quot;western&quot; style=&quot;margin-bottom: 0.14in; text-align: justify;&quot;&gt;Executing all workloads  ultimately makes up the “Day in the Life Of” workload which best models the  daily processes and volumes of the Mary Kay supply chain. &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;ul style=&quot;text-align: justify;&quot;&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;Distribution &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;Procurement &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;Shop Floor Control &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;Sales Order &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;Region to Region Integration &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;3PL Integration &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: justify;&quot; class=&quot;western&quot;&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3 style=&quot;text-align: justify;&quot; class=&quot;western&quot;&gt;Applications&lt;/h3&gt;&lt;h1 style=&quot;text-align: justify;&quot; class=&quot;western&quot;&gt; &lt;/h1&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;h2 style=&quot;text-align: justify;&quot; class=&quot;western&quot;&gt;J. D. Edwards &lt;/h2&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;ul style=&quot;text-align: justify;&quot;&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;J.D. Edwards 8.11 SP1 &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;8.96_D1 Tools &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;IBM Java Runtime &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;IBM Web Sphere 6.0.2.13 &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;Apache 2.0.47 &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;Microsoft Windows Server 2003 Standard SP1 x86  &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;Microsoft Sql Server 2005 Enterprise Edition  x64 SP1 &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;Microsoft Sql Server 2005 JDBC driver  &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;h2 style=&quot;text-align: justify;&quot; class=&quot;western&quot;&gt;Data Systems International (DSI) &lt;/h2&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;ul style=&quot;text-align: justify;&quot;&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;DSI dcLink 5.0 &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;Microsoft Windows Server 2003 Standard SP1 x86  &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;Microsoft Sql Server 2005 Enterprise Edition  x64 SP1 &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;h2 style=&quot;text-align: justify;&quot; class=&quot;western&quot;&gt;BizTalk Server &lt;/h2&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;ul style=&quot;text-align: justify;&quot;&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;Microsoft BizTalk Server 2006 &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;Microsoft Windows Server 2003 Standard SP1 x86  &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;Microsoft Sql Server 2005 Enterprise Edition  x64 SP1 &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;Microsoft Enterprise Library 2.0 &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;Microsoft .NET 2.0 &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;h2 style=&quot;text-align: justify;&quot; class=&quot;western&quot;&gt;3PL Services Tier &lt;/h2&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;ul style=&quot;text-align: justify;&quot;&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;Microsoft Windows Server 2003 Standard SP1 x86  &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;Microsoft Sql Server 2005 Enterprise Edition  x64 SP1 &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;Microsoft Enterprise Library 2.0 &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p style=&quot;margin-bottom: 0.14in;&quot;&gt;Microsoft .NET 2.0 &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p class=&quot;western&quot; style=&quot;margin-bottom: 0.14in; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: justify;&quot; class=&quot;western&quot;&gt;Tools&lt;/h3&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;h2 style=&quot;text-align: justify;&quot; class=&quot;western&quot;&gt;Borland Silk Performer 2006 &lt;/h2&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p class=&quot;western&quot; style=&quot;margin-bottom: 0.14in; text-align: justify;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&lt;u&gt;&lt;a href=&quot;http://www.borland.com/&quot;&gt;www.borland.com&lt;/a&gt;&lt;/u&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p class=&quot;western&quot; style=&quot;margin-bottom: 0.14in; text-align: justify;&quot;&gt;Silk Performer is the tool that  allows for creation of scripts that can be executed to emulate a number of users  interacting with one, or more systems. Mary Kay has a license for up to 2500  concurrent virtual users (VU) and an unlimited number of development clients.  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;h2 style=&quot;text-align: justify;&quot; class=&quot;western&quot;&gt;Shunra VE 5.0 &lt;/h2&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p class=&quot;western&quot; style=&quot;margin-bottom: 0.14in; text-align: justify;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&lt;u&gt;&lt;a href=&quot;http://www.shunra.com/&quot;&gt;www.shunra.com&lt;/a&gt;&lt;/u&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p class=&quot;western&quot; style=&quot;margin-bottom: 0.14in; text-align: justify;&quot;&gt;Shunra is a network appliance  that allows Mary Kay to simulate real world network conditions right in the lab,  by introducing constraints such as available bandwidth, latency, packet loss and  jitter. Using a device such as Shunra, Mary Kay will be able to accurately model  production networks in China, such as the network between the remote facilities  and the data center or the region to region networks such as Dallas to China,  and the impact these networks will have on performance. &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;h2 style=&quot;text-align: justify;&quot; class=&quot;western&quot;&gt;Identify AppSight for Microsoft Windows/.NET &lt;/h2&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p class=&quot;western&quot; style=&quot;margin-bottom: 0.14in; text-align: justify;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&lt;u&gt;&lt;a href=&quot;http://www.identify.com/&quot;&gt;www.identify.com&lt;/a&gt;&lt;/u&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p class=&quot;western&quot; style=&quot;margin-bottom: 0.14in; text-align: justify;&quot;&gt;The AppSight application provides  Mary Kay with the ability to quickly identify performance bottlenecks and  assists with issue resolution.&lt;/p&gt;&lt;p class=&quot;western&quot; style=&quot;margin-bottom: 0.14in; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;/div&gt;&lt;p class=&quot;sdfootnote-western&quot;&gt;&lt;a class=&quot;sdfootnotesym&quot; href=&quot;http://www2.blogger.com/post-create.g?blogID=5387140#sdfootnote1anc&quot; name=&quot;sdfootnote1sym&quot;&gt;1&lt;/a&gt; All inbound transactions to JDE use the Xml Call  object architecture &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt; &lt;p style=&quot;margin-top: 0.46in; margin-bottom: 0in; line-height: 100%;&quot; lang=&quot;&quot;&gt;&lt;span class=&quot;sd-abs-pos&quot; style=&quot;width: 604px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;</description><link>http://zachbonham.blogspot.com/2007/04/mary-kay-art-strategy.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5387140.post-622284286593809465</guid><pubDate>Thu, 19 Apr 2007 03:04:00 +0000</pubDate><atom:updated>2007-04-24T22:41:56.128-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Testing</category><category domain="http://www.blogger.com/atom/ns#">work</category><title>ART Testing</title><description>Wow...its hard to believe that I&#39;ve been sequestered away in a small room with our Application Readiness Team (ART) for almost 8 weeks now!&lt;br /&gt;&lt;br /&gt;I am currently responsible for the go-live readiness of our J.D. Edwards global implementation of standardized business processes (&quot;Project Starburst&quot;).  In a nutshell, our business and technology teams have defined core business processes that will be executed in 4 regional data centers.  We&#39;ve significantly customized J.D. Edwards, DSI (RF scanning) and Integration.  I need to know how these processes will execute to understand areas that will need to be tuned (code) or whether or not scale up/out is required and be able to present the results to my management team.&lt;br /&gt;&lt;br /&gt;I hear you &#39;agilists&#39; out there cringing...why wait until the middle of the implementation to discover the answer to these questions?  That, my friends, is another story...&lt;br /&gt;&lt;br /&gt;For now, this is just a follow up to a previous post: &lt;a href=&quot;http://zachbonham.spaces.live.com/blog/cns%21796D9CBF83641CEF%21389.entry&quot;&gt;Mary Kay Labs&lt;/a&gt; and don&#39;t forget to check out &lt;a href=&quot;http://zachbonham.blogspot.com/2007/04/mary-kay-art-strategy.html&quot;&gt;Mary Kay ART Strategy&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Somehow I continue to get sucked into engagements like this...at Mary Kay, this is my 4th such engagement for Supply Chain.    Hmm....again, another story...&lt;br /&gt;&lt;br /&gt;To catch you up...&lt;br /&gt;&lt;br /&gt;We have built a complete testing environment at Mary Kay to support activities such as this; the result of the hard work of several people (thanks, girls and guys!).  This includes enough hardware to deploy our applications to production-size hardware.  I won&#39;t bore you with the hardware specifications, but I can if you like! :)  Just drop me a line...&lt;br /&gt;&lt;br /&gt;We have a total of 37 scripts to date emulating a total of ~50 users (virtual) across 5 functional&lt;br /&gt;areas for everything but integration.  Thats a special beast unto itself...fortunately, we&#39;ve had a lot of experience in this area!&lt;br /&gt;&lt;br /&gt;Each script has had a specific data set staged for its execution.  We have created enough data to support these &#39;day in the life of&#39; activities.  Each script was used to stage data for downstream activities, so the data was created using the application, not any &#39;tricks&#39; (although we have a few of those).&lt;br /&gt;&lt;br /&gt;Each script is written to stand alone and also to be scaled up as necessary.  For example, I can have a single virtual user processing 100 &#39;iterations&#39; of Inbound Receive Case, or two users processing 50 &#39;iterations&#39;, or 100 simultaneous users processing 1 iteration of Inbound Receive Case, all without changing the script or the data set. &lt;br /&gt;&lt;br /&gt;This attention to detail when creating scripts is not required if you are have very fixed requirements.  However, if you want to be able to scale up as necessary.  e.g. lets scale up the number of users across each functional area until we find a breaking point (application or infrastructure) then it pays off in script re-usability.&lt;br /&gt;&lt;br /&gt;Also, we have a number of administrative and configuration based scripts that aren&#39;t actually used during the load test.  For example, we are running with a copy of our staging environments data.  Our staging environment was configured by humans and not all of our finished good products have the same consistent configurations (e.g. unit of measure conversions, standard case sizes, expiration dates, etc..).   When testing, your always better off with known data than unknown.  So, we have a script that will go out and configure a particular part type (component, finished good) a particular way for consistency (again, using the application NOT direct manipulation).  This is an asset from this engagement that can be handed back to the business team to assist with their daily tasks.&lt;br /&gt;&lt;br /&gt;Oh, there is lots more where this came from but my brain has sufficiently cycled down for the night....see ya!</description><link>http://zachbonham.blogspot.com/2007/04/art-testing.html</link><author>noreply@blogger.com (Unknown)</author></item></channel></rss>