<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[rzkr.dev]]></title><description><![CDATA[Gratitude and Growth + Healthy Living 🙏🏼 ☀️]]></description><link>https://rzkr.dev/</link><image><url>https://rzkr.dev/favicon.png</url><title>rzkr.dev</title><link>https://rzkr.dev/</link></image><generator>Ghost 3.16</generator><lastBuildDate>Mon, 01 Sep 2025 11:01:58 GMT</lastBuildDate><atom:link href="https://rzkr.dev/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Unwritten Rules]]></title><description><![CDATA[A random collection of unwritten rules to help teams work better. ]]></description><link>https://rzkr.dev/unwritten-rules/</link><guid isPermaLink="false">5ffa10faf5113e04ed7a9f9f</guid><category><![CDATA[culture]]></category><dc:creator><![CDATA[Reza Karegaran]]></dc:creator><pubDate>Sat, 09 Jan 2021 20:28:08 GMT</pubDate><content:encoded><![CDATA[<p>It’s okay to decline meetings.<br><em>Be courteous and let the organizer know in advance when possible.</em></p><p>It’s okay to challenge meeting organizers to ask them for agendas, your intended contribution, and intended outcomes.</p><p>It’s okay to schedule long blocks of uninterrupted time on your calendar for deep work to get into the flow state.<br><em>Mark them as “DEEP WORK - DO NOT SCHEDULE!”.</em></p><p>It’s okay to step away from your desk to take a break and not be available.</p><p>It’s okay for you to not reply to an email or chat after your “normally available” hours.</p><p>It’s okay to challenge and clarify the priority of an invitations/discussions/initiatives. <br><em>Is this important? Is this important AND urgent? Where should this land against other priorities?</em></p><p>It’s okay to vent frustrated. <br><em>If you're a leader, be a thoughtful listener, don’t jump to conclusions and solitons. Process offline and and think about how you can take one step forward at a time together to remedy.</em></p><p>It’s okay to disagree and challenge directly, while caring personally. Including disagreeing with leaders!</p>]]></content:encoded></item><item><title><![CDATA[Thoughts on Technical Debt and Managing Legacy Tech]]></title><description><![CDATA[Avoid referring to technical debt as a thing, especially to business partners and stakeholders. We evolve technology, we don't take time to rebuild and rearchitect without solving a specific customer problem.]]></description><link>https://rzkr.dev/thoughts-on-technical-debt-and-managing-legacy-tech/</link><guid isPermaLink="false">5f678c2df5113e04ed7a9efa</guid><category><![CDATA[technical debt]]></category><category><![CDATA[legacy software]]></category><dc:creator><![CDATA[Reza Karegaran]]></dc:creator><pubDate>Tue, 01 Sep 2020 18:07:00 GMT</pubDate><content:encoded><![CDATA[<p>tl;dr -- Avoid referring to technical debt as a thing, especially to business partners and stakeholders. We <em>evolve</em> technology; we don't take time to rebuild and rearchitect without solving a specific customer problem.</p><h2 id="technical-debt">Technical Debt</h2><p>I’ll usually refer to technical debt as a tool, like taking a loan out, we can do it, it might help accelerate efforts or reach the finish line sooner, but we’re leveraging ourselves. Unless we put a “payment plan” in place, we’ll ultimately end up bankrupt.</p><p>Technical debt is a tool we use sparingly.</p><p><strong>How do we decide to take on technical debt? <em>We're deliberate:</em></strong></p><p>Product Managers and Engineering Managers work to ensure:</p><ol><li>We’re explicit when we take on debt, “Hey guys, we’re taking out a loan and incurring some interest.”</li><li>We’re explicit about how we intend to pay back the debt, “Here’s where we’re reserving capacity on roadmap/plans to back this debt back.”</li></ol><p><strong>How do we pay down technical debt? <em>We favor doing it opportunistically.</em></strong></p><!--kg-card-begin: markdown--><p>When a product team is taking on new work, we should think about each software change/additions/improvements we’re planning, and think about the systems we need to change, and then ask ourselves a few questions:</p>
<ol>
<li>
<p>What’s the right way to make this change? IOW, without cutting corners and incurring technical debt. (Avoid getting trapped by the sunk cost fallacy on existing code.)</p>
</li>
<li>
<p>What would that cost to do it right from a delivery timeline perspective?</p>
</li>
<li>
<p>Is there some technical debt in our way we haven’t fully paid back yet?</p>
<ul>
<li>Is now the right time to “accelerate our payments” and fix this for the new change?</li>
</ul>
</li>
<li>
<p>Can we do this right and deliver on the customer outcome with a reasonable delivery timeline?</p>
<ul>
<li>If yes, then we should always prefer this option and not take on any technical debt.</li>
</ul>
</li>
</ol>
<!--kg-card-end: markdown--><h2 id="thoughts-on-managing-legacy-software">Thoughts on Managing Legacy Software</h2><!--kg-card-begin: markdown--><p>Avoid automatically calling any old or arcane software technical debt.</p>
<p>I've seen many technology leaders make this mistake and sometimes leads to poor decision making and ultimately wasted effort rebuilding systems that don't provide real and measurable value to customers or the organization.</p>
<blockquote>
<p><em>&quot;This system was designed years ago, nobody understands it, let's rebuild it the right way!&quot;</em> -- Some Software Engineer (also, me, at some point early in my career)</p>
</blockquote>
<p>We must prioritize changes to systems and technology with specific and measurable outcomes for customers, the team, or the organization.</p>
<p><strong>What do we instead?</strong></p>
<p>If technology/software/systems are working and providing commensurate value, and there we aren't necessarily planning changes in this area, why are we devoting any energy to rebuilding it?</p>
<p>Let's instead make it easy to manage and change! We can do this by:</p>
<ol>
<li>
<p>Ensuring the right instrumentation and monitoring are in place.</p>
</li>
<li>
<p>Ensuring the right build-and-deploy automation is in place.</p>
</li>
</ol>
<p><strong>Questions to guide whether we should consider rebuilding/investing:</strong></p>
<ol>
<li>
<p>What's the rate of change for this system/technology?</p>
</li>
<li>
<p>Is there an inherent risk of maintaining this technology? Vendor support, warranty, community support, etc.</p>
</li>
<li>
<p>If the answer is &quot;yes&quot; to either above, then it's probably a good candidate to start evolving toward more modern modular technology.</p>
</li>
</ol>
<!--kg-card-end: markdown--><h2 id="poised-to-deploy-as-an-operating-philosophy">"Poised to Deploy" as an Operating Philosophy</h2><!--kg-card-begin: markdown--><p>Finally, here's a great keynote from the 2016 Velocity Conference (that I attended!), where Richard Cook talks about the value of adapting systems continuously.</p>
<p>He argues that it's not the system that we need to focus on; it's the ability to make changes and adapt the system that leads to value creation. He calls it being &quot;Poised to deploy.&quot; &quot;Being unable to deploy is an existential threat.&quot;</p>
<p>I regularly emphasize the importance of instrumentation and build-and-deploy tooling for all systems as a first step. This makes it inherently easier to change the system and evolve and adapt it to customer needs.</p>
<p><a href="https://www.oreilly.com/radar/poised-to-deploy-the-c-suite-and-adaptive-capacity/">Poised to deploy: The C-suite and adaptive capacity</a></p>
<blockquote>
<p>&quot;Resilience is sustained adaptability. Being continuously poised to deploy is the ideal state to grasp opportunities and cope with challenges. This sustained adaptability is expensive and requires full-on DevOps. We are exploring how this all works, and the results are surprising and encouraging.&quot; -- Richard Cook</p>
</blockquote>
<p>Poised to Deploy</p>
<ol>
<li>
<p>Knowing what the platform is supposed to do;</p>
</li>
<li>
<p>Knowing how the platform works;</p>
</li>
<li>
<p>Knowing what the platform's behaviors means;</p>
</li>
<li>
<p>Being able to devise a change that addressees 1,2, and 3;</p>
</li>
<li>
<p>Being able to predict the effects of change;</p>
</li>
<li>
<p>Being able to force the platform to change in that way</p>
</li>
<li>
<p>Being prepared to deal with the consequences</p>
</li>
</ol>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Elevated Privileges for Just-In-Time Access]]></title><description><![CDATA[A novel approach for granting engineering teams just-in-time access to production database environments.]]></description><link>https://rzkr.dev/elevated-privaledges-for-just-in-time-access/</link><guid isPermaLink="false">5f67995bf5113e04ed7a9f29</guid><category><![CDATA[story time]]></category><category><![CDATA[chatops]]></category><category><![CDATA[devops]]></category><dc:creator><![CDATA[Reza Karegaran]]></dc:creator><pubDate>Mon, 18 Nov 2019 19:05:00 GMT</pubDate><content:encoded><![CDATA[<p>eSpecialtyCorp was once a leading ecommerce retailer of specialty automotive parts and aftermarket accessories. Unlike commodity retail, selling automotive accessories introduces an interesting and challenging complication: nearly every product has detailed vehicle fitment information. The permutations can be dizzying. As you might imagine, this complication early on forced the engineering team to design a considerable amount of custom software as the company grew.</p><p>So, what's the problem?</p><p>As eSpecialtyCorp grew from a small ecommerce startup to a company serving millions of customers, our engineering teams started to suffer from typical growing pains:</p><ul><li>a proliferation of patchwork technology</li><li>a massive monolith, strongly coupled to several front-end applications</li><li>ample amounts of "glue and duct tape" holding the pieces together</li></ul><p>Once an environment that was easy for a small team of engineers to manage and reason about, it had ballooned and become unwieldy for even our most experienced senior engineers to work, iterate, and operate effectively. Our database footprint alone grew from three databases to several dozen (multiplied by integration, QA, and production environments). We knew that if we wanted to continue scaling, we needed to adopt modern patterns while also leveling up our engineering practice.</p><p><strong>Monolith to Microservices; Maturing an Engineering Organization</strong></p><p>eSpecialtyCorp had embraced microservices. We were on our way to decomposing our monolithic applications opportunistically as we'd designed new features. We'd built lots of automation around provisioning infrastructure, configuration management, and build-and-deploy tooling. Lots of elements were moving more smoothly than before, except for the database.</p><p>Remember those three databases? Nearly everyone in the technology group (and several folks outside of the group) had access to production environments, including access to sometimes sensitive and personally identifiable information (PII). We had a serious problem on our hands that posed too much risk and had to solve before our next PCI audit. The Payment Card Industry (PCI) mandates that merchants have authorized third-parties to audit their security and operating practices around how they store and manage PII.</p><p>We immediately relinquished access to the production databases from most of the team, sans our systems administrators, which immediately backfired. We'd hamstrung our teams; they couldn't as quickly diagnose problems with their apps, and they couldn't process customer support tickets, which routinely required query access to production databases. Our SLAs slipped, and our customer service started to suffer.</p><h3 id="-gmdb-to-the-rescue-">/gmdb to the rescue.</h3><p>After quickly reinstating production access to a few engineers on each team, we knew we needed a better system in place long-term.</p><p>We started by establishing the following guiding principles for our approach.</p><ul><li>No one should have permanently elevated or administrative privileges to the systems that support our software. To reduce risk, we should operate in a mode that provides the least privileges possible to get our jobs done.</li><li>Teams must have elevated access to systems when they need it.</li><li>Elevated access must be intentional and deliberate.</li><li>Elevated access must be temporary.</li><li>Elevated access must be transparent and auditable.</li></ul><p>We'd start with our database environment first, then move onto the remaining infrastructure components, servers, load balancers, firewalls, etc. Ultimately, helping our teams get the resources they needed to build and maintain good software.</p><p>In a matter of days, we'd shipped version 1.0 to our engineering teams.</p><h2 id="the-solution-">The solution.</h2><p>Our teams were already well-versed in collaborating asynchronously utilizing tools like Mattermost (an open-source Slack alternative). We'd started to adopt the "ChatOps" philosophy; most of our builds were reporting into their respective channels, helping create transparency around how our teams operated and helping them ship code more frequently.</p><p>We developed a series of Powershell scripts and access control lists (although fairly rudimentary, more than sufficient to test our assumptions for v1.0!) and tied them to what Slack calls "slash commands" allows users to execute commands right inside of a channel.</p><p>Here’s how the basic interface was constructed in v1.0:</p><p>/gmdb --database-server “[database-server]” --database-name: “[database-name]” --access: [read | write | pii | admin]</p><p>After entering the slash command into the channel, a Powershell script would run performing the following actions</p><ol><li>Validated input</li><li>Validated the user was permitted to request access</li><li>Provisioned temporary access for the user; automatically expiring after 30 minutes of inactivity</li><li>Logged the request in the channel</li></ol><p>By implementing this simple solution, we'd quickly achieved all of most of our goals. People no longer had permanent access to production environments, limiting inadvertent changes or mistakes. We now had more sophisticated logging and controls in place in support of an eventual PCI audit. And most importantly, our engineering teams could serve their customers effectively while limiting risk!</p><p>Delivering a solution like gmdb was a critical milestone in helping our teams understand how to make progress while maturing our engineering practice. That we should expect to encounter some rough patches along the way, but if we remained disciplined and could take a step back to help us better understand the problem, that we'd be more likely to succeed.</p>]]></content:encoded></item><item><title><![CDATA[Culture Change and Embracing Progress]]></title><description><![CDATA[What follows is part of a note I sent to my team near the end of 2017 to thank them for the progress we'd made. The business was going through its most challenging transition in years: declining sales, dwindling profit, change in ownership, layoffs, and multiple restructurings. ]]></description><link>https://rzkr.dev/culture-change-and-progress/</link><guid isPermaLink="false">5f67a125f5113e04ed7a9f6a</guid><category><![CDATA[culture]]></category><category><![CDATA[teams]]></category><dc:creator><![CDATA[Reza Karegaran]]></dc:creator><pubDate>Fri, 15 Dec 2017 19:38:00 GMT</pubDate><content:encoded><![CDATA[<p><em>What follows is part of a note I sent to my team near the end of 2017 to thank them for the progress we'd made. The business was going through its most challenging transition in years: declining sales, dwindling profit, change in ownership, layoffs, and multiple restructurings. This was one of the most challenging times for me professionally and where I grew tremendously as a leader.</em></p><p>Team,</p><p>I want to take a moment to thank you all for the hard work and dedication you put in every single day to support our incredible group. In what seemed like the most challenging and tumultuous year, you all persevered and embraced the grind with the hope of making things better. I've always had confidence that we could turn the tide with our teammates' support; I believe it's begun.</p><p>So, how do we continue making progress? In what ways do we have to change to get better? How will each person on this team contribute, in concrete terms, to making us the highest-performing team?</p><p>Be radically candid with each other. Candor must override hierarchy. Build and nurture relationships with your peers and your business partners to enable a continuous loop of thoughtful and honest feedback. Without open communication, we rob each other of the chance to experiment, fail, and, most importantly, learn from our mistakes.</p><p>Embrace change. ​Be respectful, be empathetic, and ask, "can this be done differently?" I believe change begets growth. It may be uncomfortable at times, but if real and valuable learnings result from the change, it was worth the pain.</p><blockquote><em>"The challenger needs support to find its footing. Protection of the new, not the future, not the past, must be a conscious effort." -- Ed Catmull, Creativity Inc.</em></blockquote><p>I have confidence in our team and our leaders that next year, with continued growth and progress, we can confidently and proudly say that we're one of the best engineering practices in San Diego (baby steps).</p><p>Best,</p><p>Reza</p><blockquote><em>"And it ought to be remembered that there is nothing more difficult to take in hand, more perilous to conduct, or more uncertain in its success, than to take the lead in the introduction of a new order of things. Because the innovator has for enemies all those who have done well under the old conditions, and lukewarm defenders in those who may do well under the new. This coolness arises partly from fear of the opponents, who have the laws on their side, and partly from the incredulity of men, who do not readily believe in new things until they have had a long experience of them. Thus it happens that whenever those who are hostile have the opportunity to attack they do it like partisans, whilst the others defend lukewarmly, in such wise that the prince is endangered along with them."-- Machiavelli - The Prince, Chapter 6</em></blockquote>]]></content:encoded></item></channel></rss>