<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0">
  <channel>
    <title>SPS Technology</title>
    <link>https://tech.spscommerce.com/</link>
    <description></description>
    
    <language>en</language>
    
    <lastBuildDate>Fri, 17 Jul 2020 08:08:12 -0500</lastBuildDate>
    <item>
      <title>WiT - Giving Feedback with Lisa Even</title>
      <link>https://tech.spscommerce.com/2023/08/14/wit-giving-feedback.html</link>
      <pubDate>Wed, 16 Aug 2023 12:21:59 -0500</pubDate>
      
      <guid>http://spstech.micro.blog/2023/08/14/wit-giving-feedback.html</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25575/2023/wit-logo-2.0.png&#34; width=&#34;150&#34; height=&#34;150&#34; alt=&#34;&#34;&gt;&lt;/p&gt;

&lt;p&gt;Women in Tech organized an event on August 1, 2023 for folks to network and learn from the external speaker Lisa Even. Lisa had a dynamic and interactive presentation about how to give productive and useful feedback. These are some of my key take-aways from the session:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feedback Triggers:&lt;/strong&gt; These are triggers that could make someone respond negatively to feedback. When giving feedback, we must be aware of these and respond appropriately.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Truth: Does the person believe this person and their feedback?&lt;/li&gt;
&lt;li&gt;Relationship: How much does this person trust you? Do you have a good relationship?&lt;/li&gt;
&lt;li&gt;Identity: Does this feedback challenge someone’s identity or bring up an insecurity?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Types of Feedback:&lt;/strong&gt; It’s important to know the type of feedback someone is looking for or identify the type of feedback you want to give to someone to communicate it effectively.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Appreciation: Giving people kudos for their work. It’s important to be timely, authentic, specific, and give your full attention to this feedback. It should happen in an intentional manner, not while multitasking or while distractions are present.&lt;/li&gt;
&lt;li&gt;Coaching: Giving someone feedback on what they can do better.&lt;/li&gt;
&lt;li&gt;Evaluation: Telling someone how they are doing compared to others around them. This type of feedback can be tricky to deliver in a way that is helpful.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tips for Giving Feedback:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Listen first – people want to feel heard and on the same team as the person giving feedback.&lt;/li&gt;
&lt;li&gt;Lead conversations with small talk to peek into their wellbeing.&lt;/li&gt;
&lt;li&gt;Ask Questions:

&lt;ul&gt;
&lt;li&gt;How did you think this went?&lt;/li&gt;
&lt;li&gt;What felt hard or easy about this task?&lt;/li&gt;
&lt;li&gt;On a scale of 1-5, how much did you like this task?&lt;/li&gt;
&lt;li&gt;What do you think we should do?&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Overall, the key takeaway in giving feedback is to listen more than you talk. This was a great event held by Women in Tech and I’m hoping that they host more speakers in the future.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/in/sarah-sullivan-0b7366166&#34;&gt;Sarah Sullivan, Tech Trainer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Giving back to the AWS community</title>
      <link>https://tech.spscommerce.com/2023/01/23/giving-back-to.html</link>
      <pubDate>Mon, 23 Jan 2023 11:24:09 -0500</pubDate>
      
      <guid>http://spstech.micro.blog/2023/01/23/giving-back-to.html</guid>
      <description>&lt;p&gt;Open source has become the de facto way to build software not only in tech, but across diverse industries. As companies use open source code to build their own commercial products and services, they also see the strategic value of contributing back to those projects. Since at least 2017 SPS has seen the benefits of contributing back to the open source community in ways large and small. Recently with the acceptance of &lt;a href=&#34;https://github.com/aws/aws-sdk-net-extensions-cognito/pull/90&#34;&gt;Add ClientMetadata to SRP auth flow #90&lt;/a&gt; to the &lt;a href=&#34;https://github.com/aws/aws-sdk-net-extensions-cognito&#34;&gt;aws-sdk-net-extensions-cognito&lt;/a&gt; repository another step has been made to contribute back to the community and share additional features out to all consumers of this extension.&lt;/p&gt;

&lt;p&gt;The .NET extension for Cognito supports developers using the C# programming language who also use the &lt;a href=&#34;https://aws.amazon.com/cognito/&#34; title=&#34;https://aws.amazon.com/cognito/&#34;&gt;AWS Cognito&lt;/a&gt; service to easily make calls to the API. The repository puts it best:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://www.nuget.org/packages/Amazon.Extensions.CognitoAuthentication/&#34;&gt;Amazon.Extensions.CognitoAuthentication&lt;/a&gt;  simplifies the authentication process of  &lt;a href=&#34;https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools.html&#34;&gt;Amazon Cognito User Pools&lt;/a&gt;  for .NET developers.&lt;/p&gt;

&lt;p&gt;It allows you to use various authentication methods for Amazon Cognito User Pools with only a few short method calls, and makes the process intuitive.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One aspect of calling Cognito which wasn&amp;rsquo;t covered in the extension was the ability to provide Client Metadata to a custom token generation lambda function. Because the lambda token generation function needs to have a very short runtime it is inadvisable to reach out to a database in order to add custom scopes or other information. Additionally, some information may be sensitive or not stored in a database and can or should only be passed by an API call. For this and other reasons the Cognito API provides a Client Metadata object as part of the &lt;a href=&#34;https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html&#34;&gt;Initiate Auth&lt;/a&gt; request.&lt;/p&gt;

&lt;p&gt;For some software used at SPS, information which was available in the API needed to be passed to Initiate Auth and consumed in the &lt;a href=&#34;https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-token-generation.html&#34;&gt;pre-token generation lambda&lt;/a&gt; to be sent to the end user. A pull request was opened and accepted, so now as of &lt;a href=&#34;https://www.nuget.org/packages/Amazon.Extensions.CognitoAuthentication/2.2.4&#34;&gt;Amazon.Extensions.CognitoAuthentication 2.2.4&lt;/a&gt; it is possible to pass &amp;ldquo;ClientMetadata&amp;rdquo; along.&lt;/p&gt;

&lt;p&gt;We hope that this contribution will be of great assistance to the community of C# Cognito users and enable more users of the Cognito service to take advantage of customizing their Cognito tokens!&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/in/jonathan-demarks-02a64694/&#34;&gt;-Jonathan DeMarks, Principal Cloud Engineer&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SPS Partners with, and Sponsors, Society of Women Engineers - University of MN Chapter</title>
      <link>https://tech.spscommerce.com/2022/10/06/sps-partners-with.html</link>
      <pubDate>Tue, 18 Oct 2022 13:30:36 -0500</pubDate>
      
      <guid>http://spstech.micro.blog/2022/10/06/sps-partners-with.html</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25575/2022/4de6e554eb.png&#34; width=&#34;600&#34; height=&#34;354&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;SPS Commerce is excited to partner with and sponsor the &lt;a href=&#34;http://www.swe-mn.org/&#34;&gt;University of Minnesota Chapter of SWE (Society of Women Engineers)&lt;/a&gt; for the Fall 2022 – Spring 2023 school year!&lt;/p&gt;

&lt;p&gt;Throughout the year, there will be multiple opportunities for SPS to get involved and support &lt;a href=&#34;https://swe.org/about-swe/&#34;&gt;SWE’s mission&lt;/a&gt; to empower women to achieve full potential in careers as engineers and leaders, expand the image of the engineering and technology professions as a positive force in improving the quality of life, and demonstrate the value of diversity and inclusion. Stay tuned for updates on how we&amp;rsquo;re supporting women of all ages in STEM education by building strong connections with technical women leaders.&lt;/p&gt;

&lt;p&gt;Interested in learning more about SWE Minnesota? Take a look at &lt;a href=&#34;(http://www.swe-mn.org/)&#34;&gt;their website&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/in/lorrinmurphy/&#34;&gt;Lorrin Murphy&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://tech.spscommerce.com/2022/10/12/my-journey-to.html</link>
      <pubDate>Wed, 12 Oct 2022 13:57:06 -0500</pubDate>
      
      <guid>http://spstech.micro.blog/2022/10/12/my-journey-to.html</guid>
      <description>

&lt;h1 id=&#34;my-journey-to-becoming-an-sps-intern-tips-and-tricks&#34;&gt;&lt;strong&gt;My Journey to Becoming an SPS Intern (+Tips and Tricks)&lt;/strong&gt;&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;This post is the first part of a series in which we explore the journey to becoming an SPS Intern along with Melissa Wood, 2022 Summer Technology Learning Services Intern at SPS Commerce.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Post 1: Applying&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When I was applying for internships last fall, there was a lot about the process that I was unaware of. I thought it would be easy and that I would land a role quickly (boy, was I wrong). After around 70 applications, ten interviews, and a few job offers, I landed my internship at  &lt;a href=&#34;http://www.spscommerce.com/&#34;&gt;SPS Commerce&lt;/a&gt;. In this blog post series, I will be going over my experience. My hope is by breaking down the process, I can help you be successful in your search for the perfect internship.&lt;/p&gt;

&lt;p&gt;Before I begin, I want to give some context: Last fall I was a third-year student at the University of Minnesota-Twin Cities majoring in Human Resource Development. Most students believe that the summer of your junior year is  &lt;strong&gt;&lt;em&gt;THE TIME&lt;/em&gt;&lt;/strong&gt; to land your “perfect” internship to gain experience in the field you want to pursue post-grad. Obviously, this is not true, and it leads to students putting unnecessary pressure on themselves (more on that in a later blog post). I knew I wanted to work in the learning and development field. I also was particularly interested in pursuing internships at tech companies. With this knowledge, it was time to get started on the process of finding an internship.&lt;/p&gt;

&lt;p&gt;Prior to applying to internships, I spent time updating my resume. This included updating to show new roles, changing language to action verbs, and adding resume keywords. I also visited my university’s career office, which was super helpful. Their feedback was to tailor my resume to the job posting I was applying for. Although it was time-consuming, it allows recruiters to see that you have the necessary qualifications for the role. I also recommend (kindly) asking individuals in your field or peers if they would be willing to look at your resume, as it is only natural you will miss things after spending so much time editing and reviewing it.&lt;/p&gt;

&lt;p&gt;After updating your resume, it is time to send out applications. This is something that I initially struggled with. I would be super motivated for one week and send out five applications and then for the following two weeks send out none. Eventually, I started to time block an hour or two each week to make sure I was applying to roles every week. I focused on finding roles through job boards such as LinkedIn, Indeed, and Handshake, but depending on your field there may be specialized job boards that post internship opportunities.&lt;/p&gt;

&lt;p&gt;In the end, internship applications are somewhat of a numbers game. It is important to apply to many internships, even if you do not meet all the qualifications. For example, I did not have the experience with all the digital technology tools requested in the job posting, but I met the rest of the qualifications. Sometimes you just have to shoot your shot and apply anyways.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://miro.medium.com/max/640/1*FIUZgURUjyr4lDG2PLQElw.jpeg&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;When applying to roles, it is also important to track your applications. I set up a basic excel spreadsheet that included the company’s name, the role I applied for (and a screenshot of the job posting to reference if I was moved on to interviews,) the status of my application and interview dates. This helped me stay organized and allowed me to track where I was in the application process.&lt;/p&gt;

&lt;p&gt;Alright, so you have learned about updating your resume, sending out applications, and tracking applications. Now what? Instead of waiting for the magic to happen, it is a good idea to connect with individuals working at the organizations you are interested in. In the next post, I will be covering the importance of career fairs and networking when searching for an internship.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Series Author:&lt;/em&gt; &lt;a href=&#34;https://www.linkedin.com/in/melissa-wood-8a1024201/&#34;&gt;&lt;em&gt;Melissa Wood, Technology Learning Services Intern&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Celebrating Hacktoberfest as SPS</title>
      <link>https://tech.spscommerce.com/2022/10/10/celebrating-hacktoberfest-as.html</link>
      <pubDate>Mon, 10 Oct 2022 11:22:19 -0500</pubDate>
      
      <guid>http://spstech.micro.blog/2022/10/10/celebrating-hacktoberfest-as.html</guid>
      <description>&lt;p&gt;Autumn is my favorite season in Minnesota. Something about the cooler temps and crisp air, the leaves changing color and falling from the trees, giving the air a familiar smell, and a crunch underfoot when heading out for a brisk walk. One of my favorite things about October in particular is that it is the home to &lt;a href=&#34;https://hacktoberfest.com/&#34;&gt;Hacktoberfest&lt;/a&gt;, an event that encourages everyone to participate in open-source! Whether you&amp;rsquo;re a veteran programmer, or brand new to coding, Hacktoberfest offers a great opportunity to connect with open-source projects you know and use, explore new projects, add new features or enhancements, squash bugs, fix typos, clarify documentation, or draw that diagram that really helps a project community understand what the project&amp;rsquo;s goals are!&lt;/p&gt;

&lt;p&gt;Several members of Team SPS Tech are actively involved with Hacktoberfest. We&amp;rsquo;re sponsoring and hosting &lt;a href=&#34;https://www.meetup.com/golangmn/events/288977235/&#34;&gt;Hacktoberfest Hacking Session (in-person and virtual)&lt;/a&gt; with &lt;a href=&#34;https://www.meetup.com/golangmn/&#34;&gt;GoMN&lt;/a&gt;. We have a couple &lt;a href=&#34;https://github.com/search?q=org%3ASPSCommerce+hacktoberfest&#34;&gt;open-source projects&lt;/a&gt; we are welcoming the Hacktoberfest community to participate and collaborate on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://tech.spscommerce.com/2022/08/26/sps-commerce-rest.html&#34;&gt;REST API Standards &amp;amp; Design Style Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://tech.spscommerce.com/2021/04/15/introducing-nap-an.html&#34;&gt;nap&lt;/a&gt;, the tiniest &amp;ldquo;sleep&amp;rdquo; program that fits into a Kubernetes ConfigMap&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whatever your October holds, we hope you enjoy this season, take a moment to appreciate family, friends, and also open-source!&lt;/p&gt;

&lt;p&gt;&amp;ndash; &lt;a href=&#34;https://www.jesselang.com&#34;&gt;Jesse Lang | Principal Site Reliability Engineer | Technology Operations Engineering&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>DevEx-Powered API-led Product Growth</title>
      <link>https://tech.spscommerce.com/2022/10/06/devexpowered-apiled-product.html</link>
      <pubDate>Thu, 06 Oct 2022 09:49:51 -0500</pubDate>
      
      <guid>http://spstech.micro.blog/2022/10/06/devexpowered-apiled-product.html</guid>
      <description>&lt;p&gt;With the release of our &lt;a href=&#34;http://blog.travisgosselin.com/sps-rest-api-standards-open-source/&#34;&gt;REST API Standards&lt;/a&gt;, SPS Commerce is committed to continually evolving our Developer Experience through APIs and beyond. Join SPS Commerce and the folks at &lt;a href=&#34;http://tyk.io/&#34;&gt;Tyk.io&lt;/a&gt;, on the &lt;a href=&#34;https://tyk.io/all-about-apis-podcast/&#34;&gt;All About APIs Podcast by Tyk&lt;/a&gt; as we dive into Developer Experience and API-led product growth.&lt;/p&gt;

&lt;p&gt;Ways to listen:
- &lt;a href=&#34;https://podcasts.apple.com/us/podcast/episode-002-sps-commerces-travis-gosselin-talks-devex/id1639115500?i=1000581646082&#34;&gt;Apple Podcasts&lt;/a&gt;
- &lt;a href=&#34;https://open.spotify.com/episode/3Pz0YiC5xh3zSmPEwkPLgY&#34;&gt;Spotify&lt;/a&gt;
- &lt;a href=&#34;https://www.stitcher.com/show/all-about-apis/episode/episode-002-sps-commerces-travis-gosselin-talks-devex-powered-api-led-product-growth-207323498&#34;&gt;Stitcher&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25575/2022/bd873fd43c.png&#34; width=&#34;309&#34; height=&#34;302&#34; /&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Episode #002 - SPS Commerce&amp;rsquo;s Travis Gosselin talks DevEx-powered API-led product growth&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Welcome back to episode #2 of the All About APIs podcast. This week, we talk all things DevEx with SPS Commerce&amp;rsquo;s Principal Software Engineer, Travis Gosselin.
DevEx. What is it and what is its place in the realm of API-led product growth? Take a listen to learn more, and let us know what you think!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/in/travis-gosselin-a60a23a/&#34;&gt;-Travis Gosselin, Principal Engineer, Developer Experience&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Reference: &lt;a href=&#34;http://blog.travisgosselin.com/devex-powered-api-led-product-growth/&#34;&gt;&amp;hellip;.http://blog.travisgosselin.com/devex-powered-api-led-product-growth/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>September GoMN Meetup</title>
      <link>https://tech.spscommerce.com/2022/09/02/september-gomn-meetup.html</link>
      <pubDate>Fri, 02 Sep 2022 12:55:16 -0500</pubDate>
      
      <guid>http://spstech.micro.blog/2022/09/02/september-gomn-meetup.html</guid>
      <description>

&lt;p&gt;Real people and real pizza, what a combo! Join us in person or virtually for &amp;ldquo;Observing Golang: OpenTelemetry from Code to Prod&amp;rdquo;, presented by Roni Dover, CTO and Co-Founder at Digma.&lt;/p&gt;

&lt;h2 id=&#34;gomn-meetup-september-21-6pm-cdt-at-sps-tower&#34;&gt;GoMN Meetup, September 21, 6pm CDT at SPS Tower&lt;/h2&gt;

&lt;p&gt;We also provide a virtual option, via Zoom, for those uncomfortable attending in-person.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://www.meetup.com/golangmn/events/288231855/&#34;&gt;Meetup Registration Here!&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SPS Commerce joins TechNova Women&#43; in Tech Hackathon</title>
      <link>https://tech.spscommerce.com/2022/08/30/sps-commerce-joins.html</link>
      <pubDate>Tue, 30 Aug 2022 14:55:52 -0500</pubDate>
      
      <guid>http://spstech.micro.blog/2022/08/30/sps-commerce-joins.html</guid>
      <description>&lt;p&gt;SPS Application Engineer Charlotte Countryman shared her experience as a judge for the TechNova Hackathon! SPS Commerce was proud to team up to support the student organizers from the University of Waterloo with their second Women+ in Tech Hackathon. Read about the two projects that stood out the most to her &lt;a href=&#34;https://medium.com/@spstechblog/sps-teams-up-with-technova-for-a-second-year-1f8d0a3d98d2&#34;&gt;over here.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25575/2022/38bb47dec3.png&#34; width=&#34;600&#34; height=&#34;600&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SPS Commerce REST API Standards Now Open Source</title>
      <link>https://tech.spscommerce.com/2022/08/26/sps-commerce-rest.html</link>
      <pubDate>Fri, 26 Aug 2022 12:41:38 -0500</pubDate>
      
      <guid>http://spstech.micro.blog/2022/08/26/sps-commerce-rest.html</guid>
      <description>&lt;p&gt;The SPS Commerce Tech Team has been working tirelessly over the past few years in curating a single set of technology best practices that we call Guardrails. These Guardrails are the culmination of years of experience from our engineering teams in designing, building, implementing, deploying, and operating best-of-breed software on the world’s largest retail network. These Guardrails consist of high-level technology decisions such as Language and Framework selection or DevOps Practices and drive all the way into expectations around Secret Management and Environments. As you would imagine, it’s not easy to aggregate the knowledge and water-cooler discussions from hundreds of engineers across multiple continents. The most important aspect of that is achieving singular alignment and agreement of approaches that can be codified into SPS’ internal engineering platform we call Atlas, which is where SPS Commerce is building its next-generation API Platform. On top of both of these initiatives has been the foundational requirement to pursue and dive head-first into API-First culture and align SPS Product, Technology, Processes, and People with clear API Standards and Guidelines for approaching REST-style APIs. SPS Commerce’s first iteration of REST API Standards (also known as a design guide or style guide) is now available publicly and open source.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://medium.com/@spstechblog/sps-commerce-rest-api-standards-now-open-source-55f02dc13fac&#34;&gt;Read More&amp;hellip;&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Innovation is for Everyone!</title>
      <link>https://tech.spscommerce.com/2022/07/28/innovation-is-for.html</link>
      <pubDate>Mon, 01 Aug 2022 12:47:14 -0500</pubDate>
      
      <guid>http://spstech.micro.blog/2022/07/28/innovation-is-for.html</guid>
      <description>&lt;p&gt;Recently, I joined the first hackathon, aka innovation project, of my life. The hackathon was part of &lt;a href=&#34;https://medium.com/@spstechblog/techjam-2022-back-to-the-jam-60ebf1efe7a9&#34;&gt;our internal Tech Jam conference at SPS&lt;/a&gt;, where we work on solving challenges, exploring ideas, learning new things, building, and sharing our wins and findings with the entire tech team to close out the conference. I had always hesitated to be part of a hackathon event. I thought this was only for software engineers, programmers, coders, and developers. I do not have a technical background so  I was unsure what the expectation was and worried about whether or not I would fail or mess up. I was wrong! &lt;strong&gt;&lt;em&gt;Innovation is for everyone.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Thank you to my leaders who pushed me and challenged me to try new things. In the last 3 days of the hackathon, I learned a lot from working with my incredibly talented team members while completing our innovation project.&lt;/p&gt;

&lt;p&gt;Our hackathon project aimed to discover learning data to help analyze learning experience, learner frustration, and engagement in online training. We wanted to explore and research which capabilities and features are available in &lt;a href=&#34;https://clarity.microsoft.com/&#34;&gt;Microsoft Clarity&lt;/a&gt; and &lt;a href=&#34;https://analytics.google.com/analytics/web/&#34;&gt;Google Analytics&lt;/a&gt; to track users&amp;rsquo; experience with the &lt;a href=&#34;https://articulate.com/360/rise&#34;&gt;Rise 360&lt;/a&gt; authoring tool. Some of the preliminary questions we had in our mind were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can we get the data from Rise 360 to Microsoft Clarity or Google Analytics?&lt;/li&gt;
&lt;li&gt;Can we get data on which resources or topics learners look for most?&lt;/li&gt;
&lt;li&gt;Can we get data on how users interact with the course? Where do they spend most of their time? How much time do the users spend on a course? How many times do they click during the course?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With this data, we could track, analyze, and report the effectiveness of an online training course. We could measure and understand how our learners interact with the online course and dig in to understand learners&amp;rsquo; frustration. It gives us insights into what learners are doing and strategies we should apply to improve or minimize this behavior.&lt;/p&gt;

&lt;p&gt;My biggest takeaway from this experience is that failure is okay and that your project does not have to be perfect. In fact, you don&amp;rsquo;t have to be perfect. As &lt;a href=&#34;https://reshmasaujani.com/&#34;&gt;Reshma Saujani&lt;/a&gt; stated, &lt;em&gt;&amp;ldquo;&lt;a href=&#34;https:www.bravenotperfect.com/&#34;&gt;Brave, Not Perfect&lt;/a&gt; is about understanding how we got here so we can navigate our way out.&lt;/em&gt;&amp;rdquo; Being part of a diverse workforce of technical and non-technical teammates working together on our innovation project was amazing. We were unstoppable and did not give up. I noticed we all shared a natural curiosity and a thirst for a growth mindset (one of the core values at SPS). Our curiosity raised questions like: What if we try this? What if we do this? thus paving the path for our innovation project.&lt;/p&gt;

&lt;p&gt;I was super pumped even with our small successes, which gave me hope and allowed me to go deeper and explore more questions with my curiosity. Our team was open to suggestions when innovating and did not follow one strict way of exploring. I remember a light bulb moment for our team members when we discovered a feature that allowed us to get the valuable data we were hoping for. This discovery fueled us with excitement and joy. 😊&lt;/p&gt;

&lt;p&gt;Collaborating with team members energized me and expanded my comfort zone. This experience has made me more open and curious for suggestions, exploring, and trying things to see how they fit in. I now view hackathons as being not just for technical people but for everyone. Everyone is capable of being curious and we all have the spirit of a child inside of us which can lead us to be resilient and to learn and grow for better outcomes. I feel I had a huge success with my first innovation/hackathon project. An additional perk is that I not only got to work on a new product but am also able to expand my network, which was a huge win in itself. You never know what signing up for a hackathon or pursuing innovative work will lead to. So, what are you waiting for?&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/in/anujoshi-/&#34;&gt;Anu Joshi, Sr. Technical Trainer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reference:
Saujani, R. (2019). Brave, Not Perfect: Fear Less, Fail More, and Live Bolder. United States: Currency.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>TechJam 2022: Back to the Jam!</title>
      <link>https://tech.spscommerce.com/2022/07/21/techjam-back-to.html</link>
      <pubDate>Thu, 21 Jul 2022 13:44:28 -0500</pubDate>
      
      <guid>http://spstech.micro.blog/2022/07/21/techjam-back-to.html</guid>
      <description>

&lt;p&gt;Each year SPS Technologists participate in a volunteer-led internal tech conference, called TechJam. Read more about a few past TechJams from &lt;a href=&#34;https://tech.spscommerce.com/2020/07/27/tech-jam-external.html&#34;&gt;2020&lt;/a&gt; &amp;amp; &lt;a href=&#34;https://tech.spscommerce.com/2021/08/06/sps-techjam.html&#34;&gt;2021&lt;/a&gt;! 🎉 Our team of 27+ volunteers did everything to get TechJam up and running this year: from hosting Zoom prep sessions to crafting NFTs, from running a CFP process to source talks to creating our awesome logos. As the week wraps up, we wanted to share more about the process of TechJam.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25575/2022/1c22a03c3d.jpg&#34; width=&#34;600&#34; height=&#34;337&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;h2 id=&#34;techjam-goals&#34;&gt;TechJam Goals&lt;/h2&gt;

&lt;p&gt;This is our 7th year of hosting an internal conference, and we&amp;rsquo;ve gotten pretty good at articulating our &amp;lsquo;why&amp;rsquo; which drives how we make the magic happen. TechJam has three primary goals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;to embrace learning (&lt;em&gt;All great tech organizations are learning organizations!&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;to connect our teams with each other and to the SPS Tech Community&lt;/li&gt;
&lt;li&gt;to encourage innovative thinking, and approach solutions with a broad and expansive set of techniques and experiences.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;so-many-speakers&#34;&gt;So Many Speakers!&lt;/h2&gt;

&lt;p&gt;Speakers at TechJam are volunteers, members of our teams who want to share things they are exploring, have already mastered, or want to discuss with peers. Talks are organized across 3 concurrent tracks, presented virtually to our teams aroung the globe. 🌍 With over 885 minutes of content, it&amp;rsquo;s hard to pick some to highlight, but here is a small list of some talks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lessons we Learned from Running a Hybrid Infrastructure&lt;/li&gt;
&lt;li&gt;Using Gamification to Learn Programming Languages&lt;/li&gt;
&lt;li&gt;Building Custom Cars &amp;amp; Software Engineering are not as Different as you Think!&lt;/li&gt;
&lt;li&gt;Accelerating Developer Experience with API Design First&lt;/li&gt;
&lt;li&gt;Imposters Among Us&lt;/li&gt;
&lt;li&gt;Making Life Easier for Developers with AWS SSO&lt;/li&gt;
&lt;li&gt;Stretchhhhh Yourself&lt;/li&gt;
&lt;li&gt;How I Learned to Stop Worrying (about CRUD) and Love GraphQL&lt;/li&gt;
&lt;li&gt;The Endless Possibilities of NFTs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25575/2022/d12886d2f4.jpg&#34; width=&#34;600&#34; height=&#34;337&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;We also welcome external speakers to TechJam, voted on by our organizers and selected for the exciting topics they share. This year&amp;rsquo;s presenters spoke on the value of continuous delivery and responsible AI development.&lt;/p&gt;

&lt;h2 id=&#34;innovation-at-techjam&#34;&gt;Innovation at TechJam&lt;/h2&gt;

&lt;p&gt;We believe in fostering a spirit and culture of innovation at all times and we intentionally set aside time during our Tech Jam event for people to … you guessed it, innovate. 😉 There were 20 teams participating in our innovation event and showcasing the results of their work together as the capstone of our event. The three types of innovation groups this year were: Hackathon, Education &amp;amp; Book Club (defined by the participants and their innovation interests).
Innovation HighlightsEvent POAPs!&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25575/2022/19e94cfb18.jpg&#34; width=&#34;600&#34; height=&#34;337&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;h2 id=&#34;event-poaps&#34;&gt;Event POAPs!&lt;/h2&gt;

&lt;p&gt;As if an abundance of amazing content, innovation highlights, and general fun with our peers weren&amp;rsquo;t enough, we also provided an official &amp;lsquo;Back to the Jam&amp;rsquo; POAP to all attendees, speakers and event organizers. We see you, Web3.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25575/2022/fc66e02c61.jpg&#34; width=&#34;600&#34; height=&#34;337&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;See you next year, TechJam!&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>eBook: The API Roadmap</title>
      <link>https://tech.spscommerce.com/2022/06/01/ebook-the-api.html</link>
      <pubDate>Tue, 05 Jul 2022 14:32:47 -0500</pubDate>
      
      <guid>http://spstech.micro.blog/2022/06/01/ebook-the-api.html</guid>
      <description>&lt;p&gt;Stoplight recently made available a free ebook resource titled &lt;a href=&#34;https://stoplight.io/api-roadmap-ebook?utm_medium=tgoesslin&amp;amp;utm_source=social&amp;amp;utm_campaign=Conquer&amp;amp;utm_term=Greenlight&#34;&gt;The API Roadmap: Secrets to API Strategy Success from Industry Leaders&lt;/a&gt;. This is an amazing resource that pulls together the information and insights from the series of &lt;a href=&#34;https://stoplight.io/podcast&#34;&gt;API Intersection&lt;/a&gt; podcasts that have taken place over the last year and beyond. If you are building or starting an API-First initiative or program this is a &lt;strong&gt;MUST&lt;/strong&gt; read!&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25575/2022/bc1ae7efbd.png&#34; alt=&#34;API Roadmap Title&#34; /&gt;&lt;/p&gt;

&lt;p&gt;SPS Commerce had the opportunity to join the API Intersection podcast a few months back and share our journey so far into API-First culture. You can also find an excerpt of that journey in this publication.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25575/2022/ac680430ad.png&#34; alt=&#34;API Roadmap SPS Commerce&#34; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/in/travis-gosselin-a60a23a/&#34;&gt;-Travis Gosselin, Principal Engineer, Developer Experience&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Reference: &lt;a href=&#34;http://blog.travisgosselin.com/ebook-the-api-roadmap/&#34;&gt;http://blog.travisgosselin.com/ebook-the-api&amp;hellip;.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How we used Jaeger to improve the performance of an application</title>
      <link>https://tech.spscommerce.com/2022/06/10/how-we-used.html</link>
      <pubDate>Fri, 10 Jun 2022 10:26:17 -0500</pubDate>
      
      <guid>http://spstech.micro.blog/2022/06/10/how-we-used.html</guid>
      <description>&lt;p&gt;At SPS Commerce we are moving all our APIs into Kubernetes. There are many reasons for this change, but one of the more fun reasons is the ability to use a tool like &lt;a href=&#34;https://www.jaegertracing.io/&#34;&gt;Jaeger&lt;/a&gt;. Jaeger is a distributed tracing tool, useful for seeing how your APIs and services all work together to process one request.&lt;/p&gt;

&lt;p&gt;A lot of the initial setup of this infrastructure was performed by our wonderful SRE team. As an application team that maintains a &lt;a href=&#34;https://www.django-rest-framework.org/&#34;&gt;Django REST Framework&lt;/a&gt; application, there wasn&amp;rsquo;t a lot of additional work required to start seeing the advantages of tracing. We added and configured the OpenTelemetry &lt;a href=&#34;https://opentelemetry-python-contrib.readthedocs.io/en/latest/instrumentation/django/django.html&#34;&gt;Django&lt;/a&gt;, &lt;a href=&#34;https://opentelemetry-python-contrib.readthedocs.io/en/latest/instrumentation/requests/requests.html&#34;&gt;Requests&lt;/a&gt;, and &lt;a href=&#34;https://opentelemetry-python-contrib.readthedocs.io/en/latest/instrumentation/psycopg2/psycopg2.html&#34;&gt;Psychopg2&lt;/a&gt; instrumentors to generate &lt;a href=&#34;https://www.jaegertracing.io/docs/1.33/architecture/#span&#34;&gt;spans&lt;/a&gt; representing different operations within our application. These instrumentors capture interactions between our application and its dependencies, and they plug into the application with very little changes or configuration required. Then we configured a &lt;a href=&#34;https://opentelemetry.io/docs/instrumentation/python/exporters/#zipkin&#34;&gt;Zipkins&lt;/a&gt; exporter to send those spans to our platform&amp;rsquo;s shared collector.&lt;/p&gt;

&lt;p&gt;After opening the Jaeger UI and filtering down to only traces including our application, we started browsing through the traces, just exploring the tool. Very quickly a few endpoints began to stand out due to their high response times and high number of spans required to complete a single request. Here is an example trace of one of the problematic endpoints, drilled down into the database spans:&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25575/2022/d5ed89126d.png&#34; width=&#34;374&#34; height=&#34;819&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;This is a complicated endpoint, joining together data from multiple tables, but no endpoint should be making this many calls to the database to generate a single response. As most Django developers have likely found out: inefficient use of the Django ORM can have catastrophic effects. A brief investigation uncovered code that iterated through a queryset, and for each entry in the queryset it made an individual call to the database to retrieve a different object. Then to make matters worse, those objects were then passed to a serializer that included a nested serializer for one of their related objects! The result was for users who had associations with many of these objects, or with objects that were particularly complex or nested, a single call to this endpoint could generate more than one hundred calls to the database!&lt;/p&gt;

&lt;p&gt;By using the very helpful &lt;a href=&#34;https://pytest-django.readthedocs.io/en/latest/helpers.html#django-assert-num-queries&#34;&gt;django_assert_num_queries&lt;/a&gt; pytest fixture, we were able to write a test that measured the number of queries this endpoint made and could easily reproduce the issue. After some simple refactoring and a well-placed call to &lt;a href=&#34;https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.prefetch_related_objects&#34;&gt;prefetch_related_objects()&lt;/a&gt;, we were able to reduce that endpoint down to a manageable handful of queries. The drop in response times after we deployed the fix pretty clearly reflect the improvement:&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25575/2022/93dd6707e1.png&#34; width=&#34;600&#34; height=&#34;290&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;We have only just begun to scratch the surface of what we can do with Jaeger. But already, the introspection and visibility it provides have been incredibly helpful. As more and more of our APIs migrate onto our Kuberenetes platform, the benefits will only grow.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/in/matthew-kokotovich-bba02b13/&#34;&gt;Matt Kokotovich, Principal Engineer&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>New WiT Steering Committee</title>
      <link>https://tech.spscommerce.com/2022/05/23/new-wit-steering.html</link>
      <pubDate>Mon, 23 May 2022 16:01:00 -0500</pubDate>
      
      <guid>http://spstech.micro.blog/2022/05/23/new-wit-steering.html</guid>
      <description>&lt;p&gt;SPS WiT is proud to announce a new steering committee! Thank you to outgoing members, Annie Greenawalt and Megan Tischler for their leadership. It has been exciting to see your passion shine during your time in this role. Congratulations and welcome to the next generation of leaders! We can&amp;rsquo;t wait to see what you bring to the team.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25575/2022/f4029260cb.png&#34; width=&#34;600&#34; height=&#34;600&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SPS Hosts GoMN this Wednesday, May 18 at 6pm</title>
      <link>https://tech.spscommerce.com/2022/05/16/sps-hosts-gomn.html</link>
      <pubDate>Mon, 16 May 2022 08:26:14 -0500</pubDate>
      
      <guid>http://spstech.micro.blog/2022/05/16/sps-hosts-gomn.html</guid>
      <description>&lt;p&gt;This Wednesday, May 18, at 6:00 pm, the &lt;a href=&#34;https://www.meetup.com/golangmn&#34;&gt;GoMN Meetup&lt;/a&gt; is welcoming &lt;a href=&#34;https://www.linkedin.com/in/murphybytes/&#34;&gt;John Murphy&lt;/a&gt; who will present &lt;strong&gt;Debugging Go Programs in Kubernetes&lt;/strong&gt;. A brief summary of the topic can be found &lt;a href=&#34;https://www.meetup.com/golangmn/events/285834006/&#34;&gt;here&lt;/a&gt;, where you can also register to attend!&lt;/p&gt;

&lt;p&gt;The event is sponsored by &lt;a href=&#34;https://www.spscommerce.com/&#34;&gt;SPS Commerce&lt;/a&gt;, is BOTH in-person AND virtual, and everyone is welcome to &lt;a href=&#34;https://www.meetup.com/golangmn/events/284836111/&#34;&gt;join&lt;/a&gt; - this is a free event :).&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25575/2021/73c72684b8.jpg&#34; width=&#34;106&#34; height=&#34;67&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SPS Commerce &#43; No Fluff Just Stuff (NFJS)</title>
      <link>https://tech.spscommerce.com/2022/05/10/sps-commerce-no.html</link>
      <pubDate>Wed, 11 May 2022 09:01:04 -0500</pubDate>
      
      <guid>http://spstech.micro.blog/2022/05/10/sps-commerce-no.html</guid>
      <description>

&lt;p&gt;If you have ever gone browsing for some great conferences for software engineers, you likely have come across &lt;a href=&#34;https://nofluffjuststuff.com/&#34;&gt;No Fluff Just Stuff, aka NFJS&lt;/a&gt;. NFJS offers a network of conferences and webinar topics, both big and small concentrating on anything software developer and architecture focused. They offer content weekly in the form of both free webinars and full-day workshops across a variety of topics. Content is delivered by experienced architects and engineers with first-hand expertise in the topical area. Larger conferences also materialize multiple times a year with &lt;a href=&#34;https://archconf.com/&#34;&gt;ArchConf&lt;/a&gt; and &lt;a href=&#34;https://uberconf.com/&#34;&gt;UberConf&lt;/a&gt;, which offer a mostly vendor-free experience with in-depth 90-minute sessions.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25575/2022/1d7631e3fd.png&#34; /&gt;&lt;/p&gt;

&lt;p&gt;I was able to first attend ArchConf in 2019 and immediately fell in love with the longer sessions that allow you to dive deeper and get beyond some of the surface-level content. Each day is jam-packed full from early morning to well after dinner in the evening in a very accessible location where you are not walking 20 min to your next session.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25575/2022/00921d3d59.jpg&#34; width=&#34;500px&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Earlier this year I had the fantastic opportunity to join the schedule with some of the NFJS tour stops and represent SPS Commerce with some of our latest development and patterns and practices. The opportunity to share with the external community as well as learn from the audience and engage with engineers across the industry is incredibly valuable.&lt;/p&gt;

&lt;p&gt;The first stop was an &lt;a href=&#34;https://nofluffjuststuff.com/webinar&#34;&gt;NFJS Free Webinar&lt;/a&gt; that took place on May 6, 2022, remotely. The webinars are zoom-based and allow for great bi-directional discussion. Had some great questions early on and good engagement throughout the hour. Feel free to catch the recording if you are interested where we dive into the basics of Feature Flagging: &lt;a href=&#34;https://nofluffjuststuff.com/webinar/67/amp_up_deploy_velocity_w_feature_flags&#34;&gt;Amp Up Deploy Velocity with Feature Flags&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Coming up, you can also find me in person, representing SPS Commerce, with further topics at &lt;a href=&#34;https://uberconf.com/speakers/travis_gosselin1&#34;&gt;UberConf&lt;/a&gt; and &lt;a href=&#34;https://archconf.com/conference/clearwater/2022/12/speakers/travis_gosselin1&#34;&gt;ArchConf&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&#34;compelling-code-reuse-in-the-enterprise&#34;&gt;Compelling Code Reuse in the Enterprise&lt;/h3&gt;

&lt;p&gt;Sharing code and internal libraries across your distributed microservice ecosystem feels like a recipe for disaster! After all, you have always been told and likely witnessed how this type of coupling can add a lot of friction to a world that is built for high velocity. But I&amp;rsquo;m also willing to bet you have experienced the opposite side effects of dealing with dozens of services that have had the same chunks of code copied and pasted over and over again, and now you need to make a standardized, simple header change to all services across your platform; talk about tedious, frictional, error-prone work that you probably will not do! Using a variety of code-sharing processes and techniques like inner sourcing, module design, automated updates, and service templates, reusing code in your organization can be built as an asset rather than a liability.&lt;/p&gt;

&lt;p&gt;In this talk, we will explore the architectural myth in microservices that you should NEVER share any code and explore the dos and don&amp;rsquo;ts of the types of reuse that you want to achieve through appropriate coupling. We will examine effective reuse patterns, including what a Service Template architecture looks like, while also spending time on the lifecycle of shared code and practically rolling it out to your services. We will finish it off with some considerations and struggles you are likely to run into introducing code reuse patterns into the enterprise.&lt;/p&gt;

&lt;h3 id=&#34;accelerating-developer-experience-with-api-design-first&#34;&gt;Accelerating Developer Experience with API Design First&lt;/h3&gt;

&lt;p&gt;Modern HTTP APIs practically run the contemporary tech world. The number of APIs your organization is actively building and maintaining is evidence of that, and you need no convincing of the value of API Design First principles. However, introducing an API Design First process and methodologies can be fraught with too much manual effort, slow progress, inconsistencies, and further chaos as you&amp;rsquo;re organization scales. Much of this friction can be alleviated by developing a mature API Design First process within the organization that is supported by first-class tooling and the use of automation.&lt;/p&gt;

&lt;p&gt;In this talk, we will dive into the principle areas of API Design First across its lifecycle as we discuss how to accelerate value in design, development, governance, documentation, and change. Whether you already have established API Design First methodologies or are considering how to effectively adopt it, you should leave with a practical understanding of effective processes and governance. Experience how SPS Commerce thinks about API Design First with a strong preference towards governance through collaboration along with examples of key processes that simply must be automated to succeed in an API-First world.&lt;/p&gt;

&lt;h3 id=&#34;unleashing-deploy-velocity-with-feature-flags&#34;&gt;Unleashing Deploy Velocity with Feature Flags&lt;/h3&gt;

&lt;p&gt;A lot of development teams have built out fully automated CI/CD pipelines to deliver code to production fast! Then you quickly discover that the new bottleneck in delivering features is their existence in long-lived feature branches and no true CI is actually happening. This problem compounds as you start spinning up microservices and building features across your multi-repo architecture and coordinating some ultra-fancy release schedule so it all deploys together. Feature flags provide you the mechanism to reclaim control of the release of your features and get back to short-lived branches with true CI. However, what you&amp;rsquo;re not told about feature flags in those simple “if/else” getting started demos is that there is an upfront cost to your development time, additional complexities, and some pitfalls to be careful of as you begin expanding feature flag usage to the organization. If you know how to navigate these complexities you will start to unleash true velocity across your teams.&lt;/p&gt;

&lt;p&gt;In this talk, we&amp;rsquo;ll get started with some of the feature flagging basics before quickly moving into some practical feature flagging examples that demonstrate its usage beyond the basic scenarios as we talk about UI, API, operations, migrations, and experimentation. We will explore some of the hard questions around “architecting feature flags” for your organization.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/in/travis-gosselin-a60a23a/&#34;&gt;-Travis Gosselin, Principal Engineer, Developer Experience&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Reference: &lt;a href=&#34;http://blog.travisgosselin.com/sps-commerce-nfjs/&#34;&gt;http://blog.travisgosselin.com/sps-commerce-nfjs&amp;hellip;&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>AWS SDK Credential Provider Multi-Region Behaviors</title>
      <link>https://tech.spscommerce.com/2022/04/20/aws-sdk-credential.html</link>
      <pubDate>Wed, 27 Apr 2022 15:35:42 -0500</pubDate>
      
      <guid>http://spstech.micro.blog/2022/04/20/aws-sdk-credential.html</guid>
      <description>

&lt;p&gt;In the course of investigating an issue with a multi-region deployment in &lt;a href=&#34;https://aws.amazon.com/eks/&#34;&gt;AWS EKS&lt;/a&gt;, I ran into not just some obscure behavior from the application operating in the second region, but just straight-up bugs in the &lt;a href=&#34;https://github.com/aws/aws-sdk-net&#34;&gt;AWS SDK for .NET&lt;/a&gt; itself. Investigating further across other SDKs in different ecosystems and there are interesting behaviors for region configuration across them all; both good and bad.&lt;/p&gt;

&lt;h2 id=&#34;problem&#34;&gt;Problem&lt;/h2&gt;

&lt;p&gt;It started on the first deployment of a standard .NET Core containerized app to &lt;a href=&#34;https://www.spscommerce.com/&#34;&gt;SPS Commerce’s&lt;/a&gt; internal multi-region compute platform based on AWS EKS. I was simply adding some resiliency to my application that had been running in us-east-1 for a long time to now shift some of its traffic to the same app running in us-east-2. Typically this transition is pretty straightforward with the internal deployment mechanisms and infrastructure provided by SPS. This time it started failing with the following behaviors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The application would fail on start in the second region only (i.e. us-east-2).&lt;/li&gt;
&lt;li&gt;There was zero hardcoded configuration for AWS regions in the codebase and the app was driven by region using the &amp;ldquo;AWS_DEFAULT&amp;rdquo; environment variable specified during configuration in each respective region.&lt;/li&gt;
&lt;li&gt;Secrets from the &lt;a href=&#34;http://blog.travisgosselin.com/net-core-and-aws-secrets/&#34;&gt;AWS Secret Manager are loaded and merged with the startup configuration&lt;/a&gt; very early in the pipeline.&lt;/li&gt;
&lt;li&gt;Subsequent services are used in AWS depending on the API request coming in, including SQS and Dynamo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The initial symptom of failure during deployment to us-east-2 was the &lt;a href=&#34;https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/&#34;&gt;Kubernetes readiness probe&lt;/a&gt; failing to successfully ping the APIs endpoint at &amp;ldquo;/healthz&amp;rdquo;. This was because the container was not starting and the only log output was &amp;ldquo;STARTING-HOST&amp;rdquo;. No further logs were provided. The readiness check would eventually fail entirely and stop the container, and startup up another with the same result.&lt;/p&gt;

&lt;p&gt;Through more verbose logging enablement with &lt;a href=&#34;https://serilog.net/&#34;&gt;Serilog in ASP.NET Core&lt;/a&gt;, it was obvious that loading secrets from AWS Secret Manager early on in the startup pipeline were stuck in an endless loop attempting to access AWS STS service to grab credentials to make the AWS Secret Manager call (provided via &lt;a href=&#34;https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html&#34;&gt;OIDC with WebIdentity in EKS&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Take a look at the more verbose logging output:&lt;/p&gt;

&lt;pre&gt;
AmazonSecretsManagerClient 28|2022-04-18T13:38:26.824Z|INFO|AmazonClientException making request GetSecretValueRequest to [secretsmanager.us-east-2.amazonaws.com/.](https://secretsmanager.us-east-2.amazonaws.com/.) Attempting retry 1 of 4.
DefaultConfigurationProvider 29|2022-04-18T13:38:27.226Z|INFO|Resolved DefaultConfigurationMode for RegionEndpoint [us-east-1] to [Legacy].
AmazonSecurityTokenServiceClient 30|2022-04-18T13:38:37.232Z|ERROR|An exception of type IOException was handled in ErrorHandler. --&gt; System.IO.IOException: Unable to read data from the transport connection: Connection reset by peer.
 ---&gt; System.Net.Sockets.SocketException (104): Connection reset by peer
   --- End of inner exception stack trace ---
   at Amazon.Runtime.HttpWebRequestMessage.GetResponseAsync(CancellationToken cancellationToken)
   at Amazon.Runtime.Internal.HttpHandler`1.InvokeAsync[T](IExecutionContext executionContext)
   at Amazon.Runtime.Internal.Unmarshaller.InvokeAsync[T](IExecutionContext executionContext)
   at Amazon.Runtime.Internal.ErrorHandler.InvokeAsync[T](IExecutionContext executionContext)
AmazonSecurityTokenServiceClient 31|2022-04-18T13:38:37.233Z|INFO|IOException making request AssumeRoleWithWebIdentityRequest to [sts.us-east-1.amazonaws.com/.]([sts.us-east-1.amazonaws.com](https://sts.us-east-1.amazonaws.com)/.) Attempting retry 1 of 4.
&lt;/pre&gt;

&lt;p&gt;Notice that:
- It wants to use us-east-2 for requesting the secret.
- It then seems to switch back to us-east-1.
- Attempts to call AWS STS in us-east-1 instead of the us-east-2 region: &lt;a href=&#34;https://sts.us-east-1.amazonaws.com&#34;&gt;sts.us-east-1.amazonaws.com&lt;/a&gt;
- No further error logging results, since the retry is hidden information unless you configure it to expose it for debugging.
- This loop continues endlessly until the container orchestrator eventually gives up.&lt;/p&gt;

&lt;p&gt;Of course, I scour the code looking for possible references or indirect references to hardcoded regions. I did not find it. Shelling into the container in the cluster, I discover I can use AWS-CLI just fine and it works and respects the AWS_REGION environment vars. This tells me the platform and infrastructure are configured fine.&lt;/p&gt;

&lt;p&gt;Consultation with our platform team leads me into examining: &lt;a href=&#34;https://docs.aws.amazon.com/sdkref/latest/guide/feature-sts-regionalized-endpoints.html&#34;&gt;AWS_STS_REGIONAL_ENDPOINTS environment variable&lt;/a&gt;. This seems directly related to what I&amp;rsquo;m experiencing. This environment variable defines what region and behavior the AWS STS initial authorization request will use and how that might be different from the AWS_REGION environment configuration. It basically boils down to &amp;ldquo;legacy&amp;rdquo; (which uses a global endpoint), and &amp;ldquo;regional&amp;rdquo; which should just use AWS_REGION environment variable essentially. I had thought for some reason my app was attempting to use the global endpoint, which depending on the region might redirect to use AWS STS in us-east-1 by default. I confirmed it was set to regional and working properly inside the deployed application.&lt;/p&gt;

&lt;h2 id=&#34;diving-into-the-aws-sdk-for-net&#34;&gt;Diving into the AWS SDK for .NET&lt;/h2&gt;

&lt;p&gt;The investigation lead me into reviewing the &lt;a href=&#34;https://github.com/aws/aws-sdk-net&#34;&gt;AWS SDK for .NET&lt;/a&gt; to identify how the region materialized in the cases above.&lt;/p&gt;

&lt;p&gt;I updated my demo app to be a single AWS STS call with no dependency injection and a straight-up hardcoded region for simplicity and clarity.&lt;/p&gt;

&lt;pre&gt;
using (var sts = new AmazonSecurityTokenServiceClient(RegionEndpoint.USEast2))
{
    var result = await sts.GetCallerIdentityAsync(new Amazon.SecurityToken.Model.GetCallerIdentityRequest());
    var userId = result.UserId;
}
&lt;/pre&gt;

&lt;p&gt;It appears that the Constructor for service instantiation in the &lt;a href=&#34;https://github.com/aws/aws-sdk-net/blob/475822dec5e87954b7a47ac65995714ae1f1b115/sdk/src/Services/SecurityToken/Generated/_bcl35/AmazonSecurityTokenServiceClient.cs#L88&#34;&gt;AWS SDK properly passes the region along&lt;/a&gt; to the config. However, digging deeper, that region passed in is used for the actual request, but to grab the initial identity credentials (requested anonymously) it creates an &lt;a href=&#34;https://github.com/aws/aws-sdk-net/blob/475822dec5e87954b7a47ac65995714ae1f1b115/sdk/src/Core/Amazon.Runtime/Credentials/AssumeRoleWithWebIdentityCredentials.cs#L217-L218&#34;&gt;AWS STS client in which it re-discovers the region&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;
var configuredRegion = AWSConfigs.AWSRegion;
var region = string.IsNullOrEmpty(configuredRegion) ? _defaultSTSClientRegion : RegionEndpoint.GetBySystemName(configuredRegion);
&lt;/pre&gt;

&lt;p&gt;In this case, the &lt;a href=&#34;https://github.com/aws/aws-sdk-net/blob/475822dec5e87954b7a47ac65995714ae1f1b115/sdk/src/Core/Amazon.Runtime/Credentials/AssumeRoleWithWebIdentityCredentials.cs#L37&#34;&gt;default STS Client Region&lt;/a&gt; is hardcoded as us-east-1:&lt;/p&gt;

&lt;pre&gt;
private static readonly RegionEndpoint _defaultSTSClientRegion = RegionEndpoint.USEast1;
&lt;/pre&gt;

&lt;p&gt;Based on this behavior we can identify this is likely the reason that we are getting redirected to us-east-1 for our role assumption. But why didn&amp;rsquo;t the value from AWSConfigs.AWSRegion use the region value that we configured? Largely because AWSConfigs does not use any provided region fallback chain or lookup based on the AWS_REGION environment variable. It simply checks existing local configuration files for it. Additionally, this implies that the environment variable AWS_STS_REGIONAL_ENDPOINTS really only &lt;a href=&#34;https://github.com/aws/aws-sdk-net/blob/475822dec5e87954b7a47ac65995714ae1f1b115/sdk/src/Services/SecurityToken/Custom/AmazonSecurityTokenServiceConfig.Extension.cs#L126&#34;&gt;works in the SDK for subsequent calls after credentials are retrieved anonymously&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This behavior exists int credential sources for AssumeRoleWithWebIdentityCredentials, AssumeRoleAWSCredentials and CognitoAWSCredentials.&lt;/p&gt;

&lt;p&gt;In good fashion, my investigation led me finally to an existing &lt;a href=&#34;https://github.com/aws/aws-sdk-net/issues/1856&#34;&gt;GitHub Issue (AWS_STS_REGIONAL_ENDPOINTS as environment variables)&lt;/a&gt; for this exact problem:  (wish I was able to find this sooner). Unfortunately, this issue has been active for almost a year by this point without a formal fix.&lt;/p&gt;

&lt;h2 id=&#34;aws-sdk-for-net-workaround&#34;&gt;AWS SDK for .NET Workaround&lt;/h2&gt;

&lt;p&gt;Based on the investigation above we know that we can easily work around this problem by setting the AWSConfigs.AWSRegion value before the AWS SDK initializes, in this case before secret manager requests go out on startup in our startup middleware.&lt;/p&gt;

&lt;pre&gt;
// bootstrapping configuration
var builder = WebApplication.CreateBuilder(args);

// MUST manually set region to force us-east-2 in deployed app
// otherwise falls back to us-east-1 STS in all regions in SDK
AWSConfigs.AWSRegion = Environment.GetEnvironmentVariable(&#34;AWS_REGION&#34;);
&lt;/pre&gt;

&lt;p&gt;This will ensure that the value used by the initial role assumption AWS STS calls use the same value as provided in AWS_REGION environment variable. This means that AWS STS calls will be mimicking the &amp;ldquo;regional&amp;rdquo; setting of the value AWS_STS_REGIONAL_ENDPOINTS, which is the recommended non-legacy approach anyhow, and exactly what we need here.&lt;/p&gt;

&lt;p&gt;It would definitely be great to contribute some enhancements to the AWS SDK for this. Time allowing that would be great, but contributions with the code in a local runnable state and proper testing I expect is not trivial, especially across all affected credential providers. Maybe you have some time?&lt;/p&gt;

&lt;h2 id=&#34;behaviors-in-other-aws-sdks&#34;&gt;Behaviors in Other AWS SDKs&lt;/h2&gt;

&lt;p&gt;Given the polyglot ecosystem we have across our applications at SPS Commerce I was interested to see how this behavior looked in other AWS SDKs we might have teams using.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://github.com/aws/aws-sdk-java-v2&#34;&gt;&lt;strong&gt;AWS SDK for Java V2&lt;/strong&gt;&lt;/a&gt;: functionality is definitely different but closer to what you expect where the credentials are retrieved using the &lt;a href=&#34;https://github.com/aws/aws-sdk-java-v2/blob/master/services/sts/src/main/java/software/amazon/awssdk/services/sts/internal/StsWebIdentityCredentialsProviderFactory.java#L109&#34;&gt;DefaultAwsRegionProviderChain&lt;/a&gt; which does in fact include pulling the region from AWS_REGION environment variable; essentially what our shim/workaround for .NET does above, but just natively through the existing region provider chain. This is how I would expect the .NET AWS SDK to be updated. This effectively makes the Java SDK act as if it was set for &amp;ldquo;regional&amp;rdquo; STS endpoints. Although interesting, the Java SDK makes no usage or reference to the AWS_STS_REGIONAL_ENDPOINTS environment variable for legacy support, it does &lt;a href=&#34;https://github.com/aws/aws-sdk-java-v2/blob/master/services/sts/src/main/java/software/amazon/awssdk/services/sts/internal/StsWebIdentityCredentialsProviderFactory.java#L118&#34;&gt;fallback to the global STS endpoint when no region is provided&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://github.com/boto/botocore&#34;&gt;&lt;strong&gt;AWS SDK for Python (Botocore)&lt;/strong&gt;&lt;/a&gt; - functionality appeared to work as you would expect by &lt;a href=&#34;https://github.com/boto/botocore/blob/develop/botocore/credentials.py#L903&#34;&gt;passing along the configured region for the service client your instantiating&lt;/a&gt;, including &lt;a href=&#34;https://github.com/boto/botocore/blob/develop/botocore/configprovider.py#L107&#34;&gt;support for AWS_STS_REGIONAL_ENDPOINTS environment variable&lt;/a&gt;. However, interesting to note is that the &lt;a href=&#34;https://github.com/boto/botocore/blob/develop/botocore/session.py#L913&#34;&gt;region used is always cached as the supplied first region&lt;/a&gt;, and cannot be changed with subsequent client requests when retrieving credentials. The provided note indicates that IAM/STS is really global, so credentials retrieved by one region-specific endpoint are valid in another region. Worth noting that might seem odd in your application logs to continually see STS credentials garnered from one region for applications that may be accessing multiple regions with different clients. I&amp;rsquo;m not settled on if this poses potential resiliency issues if the &amp;ldquo;first cache&amp;rdquo; regional endpoint for STS becomes unavailable and you are expecting your application to be able to efficiently switch over to a different region. What do you think?&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/in/travis-gosselin-a60a23a/&#34;&gt;-Travis Gosselin, Principal Engineer, Developer Experience&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Reference: &lt;a href=&#34;http://blog.travisgosselin.com/aws-sdk-credential-provider-multi-region-behaviors/&#34;&gt;http://blog.travisgosselin.com/aws-sdk-credential&amp;hellip;&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SPS Hosts GoMN this Wednesday, April 20 at 6pm</title>
      <link>https://tech.spscommerce.com/2022/04/18/sps-hosts-gomn.html</link>
      <pubDate>Mon, 18 Apr 2022 12:19:18 -0500</pubDate>
      
      <guid>http://spstech.micro.blog/2022/04/18/sps-hosts-gomn.html</guid>
      <description>&lt;p&gt;This Wednesday, April 20, at 6:00 pm, the &lt;a href=&#34;https://www.meetup.com/golangmn&#34;&gt;GoMN Meetup&lt;/a&gt; is welcoming &lt;a href=&#34;https://www.linkedin.com/in/raj-auradkar-2268243/&#34;&gt;Raj Auradkar&lt;/a&gt; who will present &lt;strong&gt;Dependency Injection and Mock-Based Testing&lt;/strong&gt;. A brief summary of the topic can be found &lt;a href=&#34;https://www.meetup.com/golangmn/events/284836111/&#34;&gt;here&lt;/a&gt;, where you can also register to attend!&lt;/p&gt;

&lt;p&gt;The event is sponsored by &lt;a href=&#34;https://www.spscommerce.com/&#34;&gt;SPS Commerce&lt;/a&gt;, is BOTH in-person AND virtual, and everyone is welcome to &lt;a href=&#34;https://www.meetup.com/golangmn/events/284836111/&#34;&gt;join&lt;/a&gt; - this is a free event :).&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25575/2021/73c72684b8.jpg&#34; width=&#34;106&#34; height=&#34;67&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SPS Commerce at the MN Tech Job &amp; Opportunity Fair on 03/24/2022</title>
      <link>https://tech.spscommerce.com/2022/03/22/212748.html</link>
      <pubDate>Wed, 23 Mar 2022 12:34:00 -0500</pubDate>
      
      <guid>http://spstech.micro.blog/2022/03/22/212748.html</guid>
      <description>&lt;p&gt;&lt;center&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/25575/2022/da873ed630.jpg&#34; alt=&#34;SPS Commerce is hiring&#34; width=&#34;800&#34; height=&#34;450&#34;/&gt;
&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;SPS Commerce will participate in the MNtech Job and Opportunities Fair at &lt;a href=&#34;https://machineshopmpls.com/&#34;&gt;The Machine Shop&lt;/a&gt; on Thursday, March 24th, 2022, at 530pm. Please, stop by our booth; we will be happy to make new friends and answer all your questions regarding our thriving technology business!&lt;/p&gt;

&lt;p&gt;The event is free, with free food and drink! &lt;a href=&#34;https://www.eventbrite.com/e/mn-tech-job-opportunities-fair-tickets-276974406907&#34;&gt;Click here to register!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hope to see you there 😊&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Developer Experience &amp; API Style Guides at SPS Commerce</title>
      <link>https://tech.spscommerce.com/2022/03/04/developer-experience-api.html</link>
      <pubDate>Fri, 04 Mar 2022 14:27:58 -0500</pubDate>
      
      <guid>http://spstech.micro.blog/2022/03/04/developer-experience-api.html</guid>
      <description>&lt;p&gt;SPS Commerce is moving fast in adopting an API-First culture and mindset, as we re-envision our API Platform from the ground up. Some amazing work from our internal tech community and engineering teams over the last year. Dive in and check out our journey so far in the latest API Intersection podcast as we chat about API Style Guides and Developer Experience.&lt;/p&gt;

&lt;p&gt;Shout out to the &lt;a href=&#34;https://stoplight.io/podcast/&#34;&gt;API Intersection Podcast&lt;/a&gt; team over at Stoplight who are producing fantastic content on a regular basis, that we have used to help guide our direction at SPS. It was a great opportunity to be able to share and discuss our learnings so far with the community. Looking forward to continuing to share the SPS Commerce + API-First journey and learning from the great technology community around us (find us at &lt;a href=&#34;https://uberconf.com/session?id=48878&#34;&gt;UberConf 2022&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Stoplight Blog Post &amp;amp; Summary: &lt;a href=&#34;https://blog.stoplight.io/collaboration-for-successful-scaling?utm_medium=tgosselin&amp;amp;utm_source=social&amp;amp;utm_campaign=Conquer&amp;amp;utm_term=Greeenlight&#34;&gt;Collaboration for Successful Scaling: Developer Experience &amp;amp; Style Guides from the Ground Up with SPS Commerce&lt;/a&gt;&lt;/p&gt;

&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/7hEvZS18TXs&#34; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/in/travis-gosselin-a60a23a/&#34;&gt;-Travis Gosselin, Principal Engineer, Developer Experience&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Reference: &lt;a href=&#34;http://blog.travisgosselin.com/developer-experience-api-style-guides-at-sps/&#34;&gt;http://blog.travisgosselin.com/developer-experience-api-style-guides&amp;hellip;&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SPS Commerce &#43; Azure Pipelines: A CI/CD Journey</title>
      <link>https://tech.spscommerce.com/2022/01/17/sps-commerce-azure.html</link>
      <pubDate>Fri, 28 Jan 2022 13:44:06 -0500</pubDate>
      
      <guid>http://spstech.micro.blog/2022/01/17/sps-commerce-azure.html</guid>
      <description>

&lt;p&gt;SPS Commerce is a “booming” technology and SaaS-based organization to work for. Like any enterprise that has consistently done double-digit growth for the last 20-years (I say that like there are a lot… but not as many as you might think), the technology and development-based initiatives on the rise make for an interesting eco-system of tooling that a developer navigates on any given day. That tooling can also be wildly different across different teams and departments. CI/CD tooling is no exception and is an incredibly large piece of day-to-day usage for many engineers. That experience alone can change the tone of your day, and also affect large aspects of where you spend development time and potentially &lt;a href=&#34;https://www.missioncloud.com/blog/the-problem-of-undifferentiated-heavy-lifting&#34;&gt;undifferentiated engineering&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For many years at SPS, CI/CD tooling and the method of deployment were often compared to a “choose your own adventure” style of architecture. Plenty of good tooling and patterns were made available across many different generations and iterations of development at SPS. However, no single tool could get you from code to production. Some newer generations of components could get you to production with less tooling and fewer boundaries to cross with varying degrees of setup. Once a team had established “their” pipeline architecture of choice, it was then stamped out for all the services under that team’s responsibility. The diversity of tooling obviously meant it was difficult, if not impossible, to roll out some features and workflow orchestration updates across all pipelines or even a few pipelines. Teams needed to support at least some of their own infrastructure for customized build instances, and in some cases deploy infrastructure as well.&lt;/p&gt;

&lt;p&gt;With the introduction of Azure DevOps, and more specifically Azure Pipelines, our workflow orchestration and standardized build and deploy capability is now available across the organization, across departments, and across cloud providers. Azure Pipelines has enabled SPS to centralize and architect reusable workflow templates that are generic enough for each team to use, while at the same time providing the capability to modify all pipelines workflows and incorporate security best practices in real-time updates. Centralized infrastructure for orchestration and rollout also leaves teams with management of zero infrastructure themselves. Centralized documentation and example patterns enable teams to get up and running quickly with usually a single way to do something. Team contributions to new features and capabilities within the platform mean that everyone can make use of new functionality almost right away.&lt;/p&gt;

&lt;p&gt;As a Principal Engineer focused on Developer Experience, I recognize this type of improvement for our internal engineering teams has an extremely important and powerful step in our continued journey with CI/CD maturity. However, this important step didn’t happen overnight. In fact, it started almost 6 years ago…&lt;/p&gt;

&lt;h2 id=&#34;origin-of-azure-devops-at-sps&#34;&gt;Origin of Azure DevOps at SPS&lt;/h2&gt;

&lt;p&gt;Azure DevOps is an obvious suite of tools you might choose for those development teams and organizations focused largely on the Microsoft stack. You are likely deploying to Azure and making use of Azure DevOps cloud-hosted agents for Windows builds. As a team using Team Foundation Server (TFS), using Azure DevOps was an incredible upgrade with lots of potentials. This is exactly why I introduced it to our small development team in late 2015, and we began spiking and using its then “new” “Release UI” functionality in private preview. This was the first availability of &lt;a href=&#34;https://news.microsoft.com/2013/06/03/microsoft-reaches-agreement-to-acquire-inrelease-business-of-incycle-software/&#34;&gt;Microsoft’s “InRelease” product purchase&lt;/a&gt;, now integrated into their platform. Not long after, that small development team was &lt;a href=&#34;https://www.spscommerce.com/blog/sps-commerce-acquires-toolbox-solutions/&#34;&gt;acquired by SPS Commerce&lt;/a&gt;. The beginning of 2016 put me and a bunch of others into an exciting, fresh, and well-funded development ecosystem that held best practices and security with very high regard. It also came with an ecosystem of other tooling that was now made available to us and our products.&lt;/p&gt;

&lt;p&gt;Fresh off the heels of the excitement and feature capability of Azure DevOps, not long before the acquisition, we were excited to see what SPS Commerce had for CI/CD that we could make use of. At that time there were some good patterns in development that had good potential. The reality at the time was that each team was largely responsible for their own build and CI capability. Deployment had some centralization through a valuable abstraction called “BDP Core”, but centralized orchestration of that was limited in its capability compared to some of the features becoming available in GA of Azure DevOps. Additionally, no support or readily available patterns at SPS were available for non-Linux-based development either, to which cross-platform capability was a definite need.&lt;/p&gt;

&lt;p&gt;As a result, the decision was made for that one team to move ahead using Azure Pipelines Builds + Release functionality to orchestrate builds and deploys to both on-premise and AWS.&lt;/p&gt;

&lt;h2 id=&#34;the-early-days&#34;&gt;The Early Days&lt;/h2&gt;

&lt;p&gt;As with the early days of most development, it was very exciting and fast-paced with our development of new pipelines and capabilities within Azure DevOps. A large part of that was due to the rapid development of the Azure DevOps platform at the time, with regular releases and features pretty much coming every two weeks as part of their internal sprint cycle at Microsoft. Externally, the Marketplace was growing fast as well. The combination of community-driven extensions and our own custom-built tasks enabled high velocity to quickly and easily deploy to many types of release targets.&lt;/p&gt;

&lt;p&gt;Within the first year and a half, we found Azure DevOps growing to support not just a single team, but multiple teams within the Analytics department at SPS, with a wide variety of deployment patterns, including AWS deploys with &lt;a href=&#34;https://aws.amazon.com/cloudformation/&#34;&gt;Cloud Formation&lt;/a&gt; / &lt;a href=&#34;https://aws.amazon.com/elasticbeanstalk/&#34;&gt;Elastic Beanstalk&lt;/a&gt; / &lt;a href=&#34;https://aws.amazon.com/codedeploy/&#34;&gt;CodeDeploy&lt;/a&gt;, on-premise SQL Server deploys with &lt;a href=&#34;https://docs.microsoft.com/en-us/sql/ssdt/download-sql-server-data-tools-ssdt?view=sql-server-ver15&#34;&gt;SSDT&lt;/a&gt; and &lt;a href=&#34;https://docs.microsoft.com/en-us/sql/integration-services/packages/deploy-integration-services-ssis-projects-and-packages?view=sql-server-ver15&#34;&gt;SSIS&lt;/a&gt; and Microsoft IIS &lt;a href=&#34;https://www.iis.net/downloads/microsoft/web-deploy&#34;&gt;WebDeploy&lt;/a&gt;. The advantage in this ecosystem was that most teams needing these patterns did not have to go back to a centralized group or individual but were empowered through the flexibility of Azure DevOps to use the centralized build and deploy agents with their own or community tasks. The built-in orchestration and workflow capabilities were already incredibly powerful and enabled you to design your workflow within a few clicks. This meant the capability and features of the Azure DevOps in-house patterns continually were up to par, if not ahead of some of the capabilities of the other CI/CD tooling within the SPS ecosystem, and that didn&amp;rsquo;t go unnoticed. Small development efforts additionally began integrating Azure DevOps with functionality like events and auditing directly into SPS&amp;rsquo;s centralized &amp;ldquo;BDP Event Stream&amp;rdquo; in &lt;a href=&#34;https://aws.amazon.com/kinesis/&#34;&gt;AWS Kinesis&lt;/a&gt; to begin reporting the activity and traffic of Azure DevOps alongside the rest of the organization. This included information in the BDP Event Stream such as build time, duration, unit tests coverage as a first for aggregatable information about our build processes internally.&lt;/p&gt;

&lt;p&gt;However, not all forms of development or all patterns being stamped out in Azure DevOps were necessarily part of an ideal future-proof architecture. As SPS Commerce was rolling out its highly advantageous containerized platform for runtime on top of AWS ECS, it was unclear how Azure Pipelines could effectively integrate with that. Security, best practices, and consistency were all top of mind on how CI/CD tooling would integrate with and deploy to the centralized container clusters for web apps and APIs. The &amp;ldquo;BDP Core&amp;rdquo; abstraction was expanded to support REST API interaction. With a well-designed custom task for BDP Core integration, Azure Pipelines was able to take the best of both worlds. It was able to use all the orchestration features of Azure Pipelines and reduce its responsibility on &amp;ldquo;how&amp;rdquo; it would push secure deployments to the cluster by using BDP Core API directly. A single tool producing builds and releases, with all deployments visible across each environment was still only achievable with Azure DevOps as a single suite. BDP Core API would then handle the conventions of how it would compose and push containers to the container runtime, and it could handle this centrally across all CI/CD tooling at SPS Commerce. This was a powerful win for CI/CD capability at the time; some great stories and learnings here for a future post from SPS Commerce.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25575/2022/55bb3eb584.png&#34; /&gt;&lt;/p&gt;

&lt;h2 id=&#34;expanding-success&#34;&gt;Expanding Success&lt;/h2&gt;

&lt;p&gt;Our usage of Azure Pipelines began growing to more teams within SPS. With that, the Azure Pipelines patterns and infrastructure began a core shift as it changed from Windows-based to Linux-based deploy agents for simplicity and cost reasons. Linux build agents quickly became necessary and the primary use of compute for builds on Azure Pipelines supporting Linux-based container development. Many primarily focused Microsoft engineering teams began migrating and using .NET Core on Linux as well to make use of the new container runtime on AWS ECS. This led to the adoption by the internal SPS SRE team of Azure DevOps as an official build and deploy pattern and tool at SPS Commerce.&lt;/p&gt;

&lt;p&gt;Through internal conferences and tech meetups, individuals and teams began sharing their experiences, patterns, and success with Azure DevOps + BDP Core as a build and deployment pattern. Team onboarding became more difficult to manage, requiring standardized IAM policy and ticket integration into the process. Security and IAM teams gladly supported it and helped advise on general best practices as we worked to onboard 200+ users across dozens of root projects. The concept that teams could view deployments to all environments from a single view and use centralized infrastructure for it all became very powerful. Teams were enabled to quickly migrate from other tooling, including Jenkins and Drone if they were already using the BDP Core abstraction within their codebases.&lt;/p&gt;

&lt;h2 id=&#34;renaming-vsts-to-azure-devops&#34;&gt;Renaming VSTS to Azure DevOps&lt;/h2&gt;

&lt;p&gt;You may or may not be aware, but &amp;ldquo;Azure DevOps&amp;rdquo; was not always its name. In fact, going back in history Azure DevOps first materialized as a TFS (Team Foundation Server) in the Cloud. I had the unfortunate pleasure of building many on-premise TFS instances ranging from 2005, 2008, 2010, and 2012. I remember signing up and using my preview install of TFS in the cloud in 2011, and it was a very exciting day! Eventually, that evolved into &lt;a href=&#34;https://www.10thmagnitude.com/azure-devops-whats-in-a-rename/&#34;&gt;Visual Studio Team Services (or VSTS)&lt;/a&gt;. Visual Studio Team Services was definitely a mouthful and problematic during our rollout of it to the SPS Commerce team. Mainly because &amp;ldquo;Visual Studio&amp;rdquo; leaks a Microsoft connotation to it that sounded expensive and probably something specific to &amp;ldquo;Windows&amp;rdquo; at the time. Through demos and onboarding of different teams, we were able to shake those concerns quickly.&lt;/p&gt;

&lt;p&gt;At some point in the timeline around now, we also begin hearing about &lt;a href=&#34;https://en.wikipedia.org/wiki/Satya_Nadella&#34;&gt;Satya Nadella&amp;rsquo;s&lt;/a&gt; internal initiative to move all Microsoft engineering teams to a single engineering platform, that is the entire Azure DevOps tooling suite to standardize their practices under &lt;a href=&#34;https://azure.microsoft.com/en-us/solutions/devops/devops-at-microsoft/one-engineering-system/&#34;&gt;&amp;ldquo;1ES&amp;rdquo; (One Engineering System)&lt;/a&gt;. No doubt an exciting prospect to realize that journey and take its advantages, perhaps something we could achieve someday at SPS Commerce (hint hint).&lt;/p&gt;

&lt;p&gt;It was after this, that the rename to &amp;ldquo;Azure DevOps&amp;rdquo; put an entirely new challenge in our path for marketing the use of it clearly across our teams at SPS Commerce. At the time we primarily deployed 95% of our infrastructure to AWS Cloud, with a very small footprint in Microsoft Azure Cloud. This left MANY internally thinking that &amp;ldquo;Azure DevOps&amp;rdquo; was a tool primarily intended for deployment into the Azure Cloud, and teams thought if they didn&amp;rsquo;t deploy in Azure, what use did they have for Azure DevOps. That seems like a fair assumption to make based on the name. The reality is of course far different, and Azure DevOps is a very capable platform and product suite that integrates with all clouds, and offers the robust ability to integrate feature sets with many other tools including integrations with JIRA, GitHub, Jenkins, etc. If you desire you can put code in GitHub, build with Jenkins and deploy with Azure Pipelines to AWS without too much effort. Azure DevOps&amp;rsquo;s capability to be flexible in its integrations no doubt has served it well. Nevertheless, the name was a more significant challenge to deal with than I had expected. Eventually, critical mass was hit in understanding its position and that is less of a problem now (naming is always hard, no matter the industry)!&lt;/p&gt;

&lt;h2 id=&#34;sps-official-ci-cd-platform&#34;&gt;SPS&amp;rsquo; Official CI/CD Platform&lt;/h2&gt;

&lt;p&gt;Through many other pivotal events, the usage of Azure Pipeline is now not only the officially recommended pipeline technology of choice at SPS, but it is also the only non-deprecated and supported pattern of choice for all build and deploy functionality across multiple platforms and deploy targets. Through the development of a new container runtime backed by &lt;a href=&#34;https://aws.amazon.com/eks/&#34;&gt;AWS EKS&lt;/a&gt;, new platform initiatives, pivotal team adoption, and adaptability of usage within the SRE team, it became clear that Azure Pipelines was a good choice for teams to move forward with, and in general, required less maintenance than other self-hosted solutions before it. Make no mistake the SaaS capability is powerful in reducing the load on a team. The hybrid model to be able to use both self-hosted agents (in which containers are provided from Microsoft) alongside cloud-hosted compute provides a good deal of flexibility and capability.&lt;/p&gt;

&lt;p&gt;Of course, the cost was a huge consideration in this decision as well. Before Azure Pipelines, Drone was quickly becoming popular given some of its containerized build capability and how that enabled the centralization of builds on shared infrastructure which was decoupled from the dependencies of the codebase. While very advantageous without a release component in earlier versions, this left Drone still as a single piece of the entire CI/CD capability. With Drone&amp;rsquo;s acquisition by &lt;a href=&#34;https://techcrunch.com/2020/08/05/harness-makes-first-acquisition-snagging-open-source-ci-company-drone-io/&#34;&gt;Harness and updated licensing model&lt;/a&gt;, it quickly became a realization that further investment in Drone from a cost perspective was not viable. In comparison to Azure Pipelines footprint cost, we continue to pay almost nothing for its direct usage. Through existing Microsoft partnership programs that offer credits and parallel pipelines (one for every enterprise user), self-hosted compute agents, and &amp;ldquo;&lt;a href=&#34;https://docs.microsoft.com/en-us/azure/devops/organizations/security/get-started-stakeholder?view=azure-devops&amp;amp;tabs=agile-process&#34;&gt;Stakeholder&lt;/a&gt;&amp;rdquo; (FREE) licenses that provide full &amp;ldquo;Azure Pipelines&amp;rdquo; access, the cost for us to build and deploy across our organization is next to zero. Of course, I left out the fact that our self-hosted agent and compute used for build and deploy is deployed into AWS as EC2 and Containerized agent pools, which have associated costs going towards AWS for that. But nevertheless, this provides incredible capability for an incredibly low cost.&lt;/p&gt;

&lt;h2 id=&#34;multi-stage-declarative-yaml-deployments&#34;&gt;Multi-Stage Declarative YAML Deployments&lt;/h2&gt;

&lt;p&gt;YAML-based configuration trends are the de facto standard these days. Some days you may just feel like a &amp;ldquo;&lt;a href=&#34;https://thenewstack.io/from-yaml-engineer-to-yaml-herder/&#34;&gt;YAML engineer&lt;/a&gt;&amp;rdquo;. There is a core reason for this trend. Storing your configuration as code and not clicking around a UI makes your code self-documenting, repeatable, versioned, and a lot less tedious (click/click). In the early days of Azure DevOps, the Build and Release were separate features that both required design and creation through the UI. This was a nice feature for introducing the system. But very quickly, you&amp;rsquo;ll see it prevents reusability to some degree and can make it difficult to just &amp;ldquo;see your entire workflow&amp;rdquo; through Build and Release (though Azure Pipelines tried to do a decent job visualizing that). Nevertheless, moving to declarative YAML-based pipelines was inevitable with the industry trends. Moving the Build functionality was straightforward. But moving release functionality to YAML was a little more difficult. Props to Microsoft to redesigning the entire release workflow to function in a multi-stage declarative YAML Format, but feature parity was and is still not available for the original &amp;ldquo;Release&amp;rdquo; feature.&lt;/p&gt;

&lt;p&gt;&amp;ldquo;Builds&amp;rdquo; was renamed to &amp;ldquo;Pipelines&amp;rdquo; and its composition could now be used to orchestrate your entire deployment workflow, from one single YAML file in your repository. The benefits and outcomes of that are desirable for most teams and workflows. It took us some time to transition to that with the same flexibility and capability (at least MVP capability) that was available in Azure Pipeline Releases. While we lost some capability and flexibility, resulting templating patterns and capability better position us for org-level changes, updates, and governance, which is highly desirable for any maturing organization. Most pipelines now function with a single YAML file that builds and deploys all the way through to production using pre-built, reusable, and governed templates and components.&lt;/p&gt;

&lt;p&gt;Take a look at a basic build and production deployment:&lt;/p&gt;

&lt;pre&gt;
name: $(version).$(build)
trigger: none
pr: none

resources:
  repositories:
    - repository: templates
      type: github
      name: custom-templates
      endpoint: templates

extends:
  template: base.v1.yml@templates
  parameters:
    bdpFile: .bdp
    stages:
    - stage: COMPILE
      jobs:
      - job: BUILD
        pool: BUILD
        steps:
        - checkout: self
          clean: true
        
        ... BUILD Container, unit tests, etc
          
        - publish: $(Build.ArtifactStagingDirectory)
          displayName: publish deploy artifacts
    
    # deploy to test 
    - template: core/deploy.v1.yml@templates
      parameters:
        environment: test  

    # deploy to prod 
    - template: core/deploy.v1.yml@templates
      parameters:
        environment: prod
&lt;/pre&gt;

&lt;p&gt;Additional templates and custom tasks support the building of containers and language-specific build patterns that can be added in through composition. Metadata and standardization about a service are well known programmatically in the SPS ecosystem that enabling deploying to a new environment is three lines of code to pull in the deploy template and indicate your environment.&lt;/p&gt;

&lt;p&gt;This default pattern supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easily deploy to any number of environments (i.e., dev and prod, or dev, test, and prod, etc.)&lt;/li&gt;
&lt;li&gt;Identify environments that require manual approval&lt;/li&gt;
&lt;li&gt;Automated change management approval workflow integration with JIRA through Azure Pipelines Environment checks&lt;/li&gt;
&lt;li&gt;Integrated governance and validation of service metadata against a central registry&lt;/li&gt;
&lt;li&gt;Contextual platform variables based on the deployment environment&lt;/li&gt;
&lt;li&gt;Integrated semantic versioning model(s)&lt;/li&gt;
&lt;li&gt;Integrated pull request context and variables&lt;/li&gt;
&lt;li&gt;Enforced security checks for Git branches to be protected, certain names, required templates before deploying to production&lt;/li&gt;
&lt;li&gt;Filtered custom task list to remove or identify any improper or insecure usage&lt;/li&gt;
&lt;li&gt;Update organizational templates to affect all pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25575/2022/d15e69bf7c.png&#34; width=&#34;800px&#34; /&gt;&lt;/p&gt;

&lt;h2 id=&#34;github-actions-comes-along&#34;&gt;GitHub Actions Comes Along&amp;hellip;&lt;/h2&gt;

&lt;p&gt;Azure Pipelines standardization, capability, and governance components are all working well to remove friction and roadblocks for teams every day who are engineering new services or updates. It was only implied above, but we do not use Azure Repos, but rather GitHub as an organization for version control. Azure Pipelines is then a consumer of our GitHub source. This made for some interesting discussion with regards to the launch of GitHub Actions. GHA of course is a natural evolution of the full suite of capability that GitHub could provide, now a &lt;a href=&#34;https://news.microsoft.com/announcement/microsoft-acquires-github/&#34;&gt;subsidiary within Microsoft&lt;/a&gt;. GHA has the power to automate events across the suite of tools that GitHub offers, with one aspect of that being CI/CD for your applications and services. Having the CI/CD capability so close and in a single integrated tool like GitHub is no doubt a strong advantage and strength. As an enterprise GitHub organization, the question must be asked then if a shift and migration towards Azure Pipelines is still the right course of action? To help with that discussion we took the debate to Microsoft and GitHub to inquire on their thoughts further.&lt;/p&gt;

&lt;p&gt;Out of the gate, there is some interesting cooperation between Azure Pipelines and GHA. Noticeably is that they look similar from a syntax perspective and in some cases function very similarly too. In fact, as I understand it, early on at least, core agent infrastructure was shared between products. The GHA team and the Azure Pipelines team is in fact a single team focused on delivering functionality to both platforms. I had the opportunity to discuss the roadmap and key features with one of the core architects and program managers for GHA, who also previously was a core contributor to Azure Pipelines Multi-Stage YAML re-envisioning. As you can imagine, he provided some great perspectives. Hands-down, core development was then focused on GHA and less on Azure Pipelines, and the effect on the &lt;a href=&#34;https://docs.microsoft.com/en-us/azure/devops/release-notes/features-timeline&#34;&gt;feature timeline&lt;/a&gt; was clear. But what was also clear was the fact that GHA had a LOT of catch-up to do to participate at the enterprise level. Sure, it was new, interesting, and integrated, but it was missing LOT of features we use in Azure Pipelines. At the time it was missing the concepts of &amp;ldquo;environments&amp;rdquo; or approvals and is still missing features around reusable templates. With time though, I&amp;rsquo;m confident features will eventually get to parity or better in some cases. GitHub Actions feature for &lt;a href=&#34;https://github.blog/changelog/2021-10-27-github-actions-secure-cloud-deployments-with-openid-connect/&#34;&gt;secure deployments with OpenID Connect&lt;/a&gt; is a great example of a powerful new feature only in GHA.&lt;/p&gt;

&lt;p&gt;With the information in hand, it was going to be several years before GHA would meet enough feature parity with Azure Pipelines to make it viable for the position and feature capability we had already achieved, not including some core customized features we already had built out or would be coming soon in our own roadmap. Stopping an organization to wait a few years for the potential of a better ecosystem simply did not make sense especially with the value we were already realizing. There is a lot of potential in GHA and look forward to interesting ways we can make use of it, but for the time being and what we know of our roadmap, using &lt;a href=&#34;https://www.youtube.com/watch?v=bzimLnQhkWw&amp;amp;ab_channel=TorontoEnterpriseDevOpsUsergroup&#34;&gt;GitHub Repos combined with Azure Pipelines really does give us the best of both ecosystems&lt;/a&gt;. We take the best-in-class version control and combine it with a powerful mature, enterprise-ready CI/CD platform. This still enables us to take advantage of features like &lt;a href=&#34;https://docs.github.com/en/get-started/learning-about-github/about-github-advanced-security&#34;&gt;GitHub Advanced Security&lt;/a&gt; even outside of the GHA ecosystem. Additionally, our entire enterprise world does not live in GitHub. In fact, we still use and incorporate other systems for Package Management (Azure Artifacts, AWS ECR, JFrog) and Issue Tracking (JIRA) making the advantage of working in a single tool not an immediate realization if we were to switch to GHA as a quick win. Azure Pipelines, as a component of Azure DevOps, continues to grow (with updated feature timelines recently published for 2022) and provides us with better enterprise support with the current state of the tools.&lt;/p&gt;

&lt;h2 id=&#34;now-next&#34;&gt;Now &amp;amp; Next&lt;/h2&gt;

&lt;p&gt;Azure Pipelines at SPS now supports over 50 teams with 400+ engineers, with hundreds of builds and deploys to production daily, across multiple clouds and cloud regions, on 4 different continents. All pivotal infrastructure and services running the SPS Platform and Network are built and deployed through Azure Pipelines. Customized event and auditing are created through custom webhooks and pushed to centralized kinesis stream, pipelines are tracked through association to custom internal service registrations, and change management automation automatically enables production deploys based on the workflow of approvals when required. Pipeline configurations are entirely set up and configured through a single YAML file that enables teams to quickly onboard new pipelines to production fast. As of very recently, platform API documentation is automatically curated and pushed to the centralized SPS API Reference. All this capability and this article add up to an incredible transformation or CI/CD journey at SPS Commerce that is only just beginning.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25575/2022/7e78d2136c.png&#34; width=&#34;600px&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Moving forward in the cycles ahead, we have a desire to continue to build upon this base and enable enhanced Azure Pipeline agent capabilities and multi-region resiliency, better cost tracking for teams, enhanced API Design First integrated patterns, SSO and automated policy provisioning, and enhancing the flexibility of deployment solutions by reducing proprietary technology where possible.&lt;/p&gt;

&lt;h2 id=&#34;what-did-we-learn&#34;&gt;What Did We Learn?&lt;/h2&gt;

&lt;p&gt;Sure, we have learned a ton about how to customize and work with advanced orchestration workflows in Azure Pipelines and build out CI/CD patterns. But more specifically, what are some of the core principles or takeaways architecturally you might consider as part of this journey?&lt;/p&gt;

&lt;h3 id=&#34;technology-awareness&#34;&gt;Technology Awareness&lt;/h3&gt;

&lt;p&gt;Having awareness of other technologies within the domain you work in is essential. While at the same time having a system for effective evaluation is important. Without the journey described above, it is highly unlikely that SPS Commerce would have ever considered Azure Pipelines as a tool to solve their CI/CD problems. This identifies how crucial it is to keep up to date with other technologies and patterns in the domain you are solving for. The time may come for another large shift in the technologies you are working with. That may be AWS ECS to AWS EKS or from Drone to Azure Pipelines. The time will come for a shift from Azure Pipelines to GitHub Actions. Keeping that pilot light lit and that evaluation open for emerging technologies while refraining from organizational disruptions until the timing is right is the skill of a good Architect or leader within your organization. Do not pivot to the new and shiny technology without incredible value on the other side. Pivoting requires not just feature parity, but that and then some to make it worth it.&lt;/p&gt;

&lt;h3 id=&#34;evolvable-infrastructure-technology&#34;&gt;Evolvable Infrastructure &amp;amp; Technology&lt;/h3&gt;

&lt;p&gt;Azure Pipelines is a great example of a technology that supported our journey at different levels of maturity throughout. Whether through the initial community support, or ease of onboarding through clickable Release UI orchestration creation, or using an organizational reusable template, Azure Pipelines provided us with immense value to take advantage of where we as an organization was at, enabling continued support of legacy implementations and reasonable migration paths to new more valuable patterns. This flexibility and support show the signs of a mature product and tool, which is a huge asset to the enterprise. Even today, while 80% of our pipelines use newer patterns, supporting bespoke older patterns and oddball deployment needs allows us to meet the demands of the other 20% of deployment requirements still within the same ecosystem of tooling.&lt;/p&gt;

&lt;h3 id=&#34;evolutionary-architectures&#34;&gt;Evolutionary Architectures&lt;/h3&gt;

&lt;p&gt;We definitely have some pipeline patterns that did burn us over time. Thinking ahead about how to future-proof your architecture and where some of those demons lie in your infrastructure can have a drastic cascading effect, especially on pipelines and infrastructure in general, as it can be harder to evolve. Looking for areas to apply &lt;a href=&#34;https://www.thoughtworks.com/books/building-evolutionary-architectures&#34;&gt;evolutionary architectural thinking&lt;/a&gt; is an incredible help for long-term vision and planning that can really insulate you. The introduction of a single &amp;ldquo;dependency&amp;rdquo; that is incorrectly positioned on your build/deploy agents can have long-term effects on your ability to change the platform and move quickly. More concretely &lt;a href=&#34;https://docs.microsoft.com/en-us/azure/devops/pipelines/process/service-containers?view=azure-devops&amp;amp;tabs=yaml&#34;&gt;containerization&lt;/a&gt; and &lt;a href=&#34;https://docs.microsoft.com/en-us/azure/devops/pipelines/process/templates?view=azure-devops&#34;&gt;templating&lt;/a&gt; are two critical areas that removed some architectural handcuffs for us.&lt;/p&gt;

&lt;h3 id=&#34;names-can-be-deceiving&#34;&gt;Names Can Be Deceiving&lt;/h3&gt;

&lt;p&gt;If you learned anything from Microsoft&amp;rsquo;s choice of naming for VSTS or Azure DevOps, consider the impact the name may have on future marketing or rollout of your product both internally and externally. It can cause a world of pain with no technological bearing.&lt;/p&gt;

&lt;h3 id=&#34;developer-experience-matters&#34;&gt;Developer Experience Matters&lt;/h3&gt;

&lt;p&gt;With my focus on Developer Experience as of late, it is clear to me more than ever, through this example and many others like it, that the experience of a developer through their day-to-day operations can drastically change the productivity of an organization. Obvious productivity wins and quality of life enhancements can highly motivate even the largest of enterprise change management initiatives at the grassroots level.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/in/travis-gosselin-a60a23a/&#34;&gt;-Travis Gosselin, Principal Engineer, Developer Experience&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Reference: &lt;a href=&#34;http://blog.travisgosselin.com/sps-commerce-azure-pipelines-a-ci-cd-journey/&#34;&gt;http://blog.travisgosselin.com/sps-commerce-azure-pipelines&amp;hellip;&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>2022 Technology Internship Positions Now Open! </title>
      <link>https://tech.spscommerce.com/2021/12/08/technology-internship-positions.html</link>
      <pubDate>Wed, 08 Dec 2021 13:50:32 -0500</pubDate>
      
      <guid>http://spstech.micro.blog/2021/12/08/technology-internship-positions.html</guid>
      <description>&lt;p&gt;Our interns are the coolest bunch around, and we are looking forward to meeting the next round of incredible minds for our 2022 program.  (Seriously, read about our team from last year and you will see! &lt;a href=&#34;https://tech.spscommerce.com/2021/08/20/goodbye-summer-interns.html&#34;&gt;&lt;em&gt;Goodbye Summer Interns&lt;/em&gt;&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;TeamSPS is hiring 11 interns for our summer 2022 internship program. You will work as part of our larger technology team of over 300 people around the globe. SPS internships are paid. You will be an active contributing member of the team. You will use the same technologies our engineers use and work side-by-side with them on our production systems running at a massive scale in the cloud. We also believe in growing our interns both professionally and personally. You can expect many learning sessions about how to build your professional network, create an attractive resume, and job searching in today&amp;rsquo;s market, in addition to improving your technical knowledge. Our intern program is designed for you to continue your learning and gain usable experience. As a result, no one will ask you to get coffee, make copies, or run errands. Instead, you will be expected to ask questions and help us create production-quality code.&lt;/p&gt;

&lt;p&gt;There are available positions in Software Engineering, on our Corporate Security, and Technology Learning Services Teams.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://lnkd.in/grSZGwqU&#34;&gt;Check out this link to learn more about SPS Internships!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25575/2021/57ca6d92da.jpg&#34; width=&#34;600&#34; height=&#34;600&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Plan, Plan &amp; Prepare for the Unexpected: Cyber Week 2021</title>
      <link>https://tech.spscommerce.com/2021/11/24/plan-plan-prepare.html</link>
      <pubDate>Fri, 26 Nov 2021 13:16:57 -0500</pubDate>
      
      <guid>http://spstech.micro.blog/2021/11/24/plan-plan-prepare.html</guid>
      <description>&lt;p&gt;My husband, Joe, wanted to buy a tractor for over five years to use at our cabin to grade the mile-long road we maintain and to do other important and cool stuff that he assures me can only be done with a tractor. For over five years, he has researched, planned, and hunted for that perfect used tractor with low hours of use, at a price he liked. My only requirement was it had to be a John Deere…just because. So, he planned, and planned, and planned. For over five years.&lt;/p&gt;

&lt;p&gt;Finally, this month, he found the perfect used John Deere 2032R compact tractor and scheduled to pick it up from the seller. He was so excited and grinning like a little kid. But, on the night before he was to pick it up, he hit a major snag. He couldn’t swap out his truck’s trailer hitch because it was rusted in, and hours of pounding on it didn’t move it. Even with years of planning, unexpected incidents can happen and throw you off. Luckily, we were able to pivot and have the tractor delivered to my parents’ house, which was just 10 minutes away from the seller, but still over 2 hours from the cabin. Joe had to bring the truck to a welder to get the hitch removed. We held a very quick retrospective on this incident and decided that the hitch will be removed after every use from now on. 😀 No incident report will be needed for this, and the tractor has since made its way to the cabin.&lt;/p&gt;

&lt;p&gt;Here’s where I’m going to tell you that all of my husband’s tractor planning and last-minute trailer hitch incident is a bit like preparing for and managing Cyber Week. Just go with me on this one.&lt;/p&gt;

&lt;p&gt;SPS spends months, and even years, preparing for Cyber Week and the Peak Season that surrounds that one week of the year. As the world’s retail network, we are keenly aware of the importance of this time of year for the retail industry, our customers, and SPS. We put extra focus and care into planning for scale and resiliency and preparing for the unexpected – all to ensure our part in the supply chain just works.&lt;/p&gt;

&lt;p&gt;As soon as we finished Cyber Week 2020, we held a retrospective and began planning for this year’s Cyber Week 2021 and beyond. We tracked critical system metrics,  collaborated with Sales and Customer Success teams, estimated peak volumes during our busiest hours and days, and performance tested to beyond our highest estimates.  We do some serious planning and preparation.&lt;/p&gt;

&lt;p&gt;But we also prepare our processes and our people to handle the unexpected. Yes, just like that trailer hitch being rusted in, things can go wrong during Cyber Week. That’s why we have a robust Incident Management process, complete with defined roles, responsibilities, and communication and escalation methods. We augment that strong process by training our staff and providing coaching for people in new roles, such as Incident Manager and Customer Captain.&lt;/p&gt;

&lt;p&gt;When Cyber Week arrives, we add an increased level of focus for our teams by implementing a process called Hypercare, which means hyper-focus on system performance and hyper visibility to metrics. Hypercare decreases the time to identify and respond to potential system issues while improving the efficiency of our communication channels.&lt;/p&gt;

&lt;p&gt;Through all of this, we have fun being part of #TeamSPS. We have a virtual Hypercare Lounge where people around the globe hang out to watch our production systems, discuss application metrics, and decompress by sharing fun virtual backgrounds.  We live our company values even at times of stress. We realize that Results  Matter and that we Succeed Together. We can also be Obsessed With  Customers and value Employees Come First at the same time.&lt;/p&gt;

&lt;p&gt;We are ready for our customers! I might not be grinning like a little kid just yet (that’ll be after Cyber Week), but I’m excited. Happy holiday shopping!&lt;/p&gt;

&lt;p&gt;&amp;ndash; &lt;a href=&#34;https://www.linkedin.com/in/amyjpatton/&#34;&gt;Amy Patton, VP Technology&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SPS talks about Feature Flagging in a customer panel for LaunchDarkly</title>
      <link>https://tech.spscommerce.com/2021/11/19/sps-talks-about.html</link>
      <pubDate>Tue, 23 Nov 2021 14:29:00 -0500</pubDate>
      
      <guid>http://spstech.micro.blog/2021/11/19/sps-talks-about.html</guid>
      <description>&lt;p&gt;Recently, I was invited to join a panel of customers for an event called &amp;ldquo;Launch and Learn.&amp;rdquo; It was a dual-purpose event that included marketing for LaunchDarkly and also questions from their engineers about how customers use their products. SPS is a long-time LaunchDarkly customer and jumped at the opportunity to help them out in this way.&lt;/p&gt;

&lt;p&gt;If you want to hear more about how SPS uses LaunchDarkly to flag our new features and continually release code, here&amp;rsquo;s the video of that event:&lt;/p&gt;

&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/Uppawz4cxy8&#34; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;
</description>
    </item>
    
    <item>
      <title>Peace of Mind &amp; Two SPS Engineers Were the Big Winners at Hack The Gap: </title>
      <link>https://tech.spscommerce.com/2021/11/01/peace-of-mind.html</link>
      <pubDate>Wed, 03 Nov 2021 14:56:15 -0500</pubDate>
      
      <guid>http://spstech.micro.blog/2021/11/01/peace-of-mind.html</guid>
      <description>&lt;p&gt;Two of our Software Engineers from our Minneapolis office, &lt;a href=&#34;https://www.linkedin.com/in/anaknickerbocker/&#34;&gt;Ana Knickerbocker&lt;/a&gt; &lt;a href=&#34;https://twitter.com/akknickerbocker&#34;&gt;(find her on Twitter too!)&lt;/a&gt; &amp;amp; &lt;a href=&#34;https://www.linkedin.com/in/jenna-truong-26442320/&#34;&gt;Jenna Truong&lt;/a&gt; took part in a hackathon in October through Hack the Gap. We asked them to share a little about the hackathon and what they did. They were on a team of 4 individuals and their project ended up winning, aligning nicely with the SPS Value of &lt;em&gt;Win Today, Win Tomorrow.&lt;/em&gt; 🎉🏆&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;About Hack the Gap:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&amp;ldquo;At Hack the Gap our focus is increasing equity in technology by highlighting diverse voices and perspectives. This includes women, non-binary, black, indigenous, and people of color. We do this through hackathons, programming, and investing in technology built by and for women, non-binary and BIPoC peoples.&amp;rdquo; (&lt;a href=&#34;https://www.hackthegap.com/&#34;&gt;https://www.hackthegap.com/&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25575/2021/967052a090.png&#34; alt=&#34;enter image description here&#34; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;About Hack the Gap Hackathon:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hack the Gap hosts hackathons for women and non-binary individuals. These are usually different from a typical hackathon as they might occur in the middle of the week or over a longer period of time to better accommodate the schedules of mothers, women, and non-binary individuals that they cater to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our Project:&lt;/strong&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/25575/2021/b3c20670ae.png&#34; alt=&#34;enter image description here&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Our project was built to address a gap in available task messaging apps. In our demo we highlighted several key points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are you highly skilled in the art of forgetfulness? I know I am! We&amp;rsquo;re here to offer you some Peace of Mind.&lt;/li&gt;
&lt;li&gt;Peace of Mind is a task management app that won&amp;rsquo;t let you forget. You can get an indefinite number of alerts via text messages, emails, and phone calls so you can&amp;rsquo;t ignore the task at hand.&lt;/li&gt;
&lt;li&gt;The next iteration will offer more relentless notifications. For example, &amp;ldquo;text me every 1 minute until the task is completed&amp;rdquo; or &amp;ldquo;text me every 5 minutes for the first hour minutes, then call me every minute until the task is completed.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We chose this project because time management has gotten tricky since the start of the pandemic. People are experiencing difficulty perceiving the passage of time, and often feeling &amp;ldquo;brain fog.&amp;rdquo; Many tasks are too important to be delayed or forgotten, like taking medications, caring for others, or caring for yourself. We believe this application will help some stop worrying about forgetting, and bring some peace of mind.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25575/2021/67f5c4ae85.png&#34; alt=&#34;enter image description here&#34; /&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/25575/2021/18c720ff9a.png&#34; alt=&#34;enter image description here&#34; /&gt;&lt;/p&gt;

&lt;p&gt;The project was initially generated using Nx. We used a Node/Express/TypeScript backend with a React/TypeScript frontend. On the frontend we incorporated components from Bootstrap, Twillio &amp;amp; Ant Design. One of our teammates was a designer who also created some beautiful logos! The scheduling of alerts was accomplished by calculating the next alert DateTime, saving that DateTime to the database, and running a query against the database every minute using a cron job. The alerts were sent out via Twilio/SendGrid APIs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What we learned:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On the frontend, in addition to building a UI from scratch for the first time, we learned about incorporating new design systems. Ana created 2 databases (Postgres &amp;gt; RethinkDB &amp;gt; Postgres) and deployed both of them! We also learned that no matter how good the last demo recording was, you&amp;rsquo;re likely to just keep re-recording up until the deadline. &lt;em&gt;(Two more SPS Values: Thirst For Growth  and Know More To Be More.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Since we wanted our tool to function as an app instead of just a webpage, in the future we hope to learn how to make this a better cross-platform tool. For example, we would like to include recurring tasks, symptom and mood tracking, and a caregiver mode where you can set alerts for others. Additionally, the API will be made public for easy integration with applications like Trello, Google Calendar, Siri, and Alexa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What we enjoyed:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The highlight of the hackathon: our team won!  &lt;em&gt;(Again, demonstrating those SPS Values: Succeed Together &amp;amp; Win Today, Win Tomorrow.)&lt;/em&gt;  We also enjoyed the opportunity to work with new teammates located across the country (and world) in Michigan and Spain! A beginner developer on our team had never seen an application built from scratch before! It was fun showing her how everything worked, helping her contribute, and answering all her excellent questions. It was also refreshing to work on a side project where we could be as creative and as innovative as we wanted.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>