<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Oleksiy Kovyrin</title>
	<atom:link href="https://kovyrin.net/feed/" rel="self" type="application/rss+xml" />
	<link>https://kovyrin.net</link>
	<description>Yet Another Admin&#039;s blog</description>
	<lastBuildDate>Sat, 20 Jul 2024 01:03:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.9.2</generator>
	<item>
		<title>Thinking of the person who pressed Go on today&#8217;s Crowdstrike release</title>
		<link>https://kovyrin.net/2024/07/20/beginner-mistakes/</link>
		<pubDate>Sat, 20 Jul 2024 00:15:40 +0000</pubDate>
		<dc:creator><![CDATA[Oleksiy Kovyrin]]></dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Networks]]></category>

		<guid isPermaLink="false">https://kovyrin.net/?p=893</guid>
		<description><![CDATA[Someone, somewhere, is the person who pressed go on that software update. And right now they know exactly what they did and what it has done. And as someone who knows that sinking feeling when you realise you’ve screwed up at work, I cannot imagine the state of them right now. &#8212; Jim Waterson (@jimwaterson) [&#8230;]]]></description>
				<content:encoded><![CDATA[<blockquote class="twitter-tweet">
<p lang="en" dir="ltr">Someone, somewhere, is the person who pressed go on that software update. And right now they know exactly what they did and what it has done. And as someone who knows that sinking feeling when you realise you’ve screwed up at work, I cannot imagine the state of them right now.</p>
<p>&mdash; Jim Waterson (@jimwaterson) <a href="https://twitter.com/jimwaterson/status/1814196139442237769?ref_src=twsrc%5Etfw">July 19, 2024</a></p></blockquote>
<p> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<p>Today’s tweet about the <a href="https://thehackernews.com/2024/07/faulty-crowdstrike-update-crashes.html" rel="noopener" target="_blank">Crowdstrike incident</a>, which seemingly brought the modern IT world to a standstill, reminded me of the darkest day of my professional life — when I accidentally knocked out internet access in a city of over 200,000 people.</p>
<hr />
<p>It was my second year of university and I worked for a the largest local ISP in my home city as a junior system administrator. We had a large wireless network (~100km in diameter) covering our whole city and many surrounding rural areas. This network was used by all major commercial banks and many large enterprises in the area (bank branches, large factories, radio stations, etc).</p>
<p>To cover such a large area (in Ukraine in early 2000s), about 50% of which were rural villages and towns, we basically had to build a huge wifi network, that had a very powerful antenna in the center and many smaller regional points of presence would connect to it using directional wifi antennas and then distribute the traffic locally. The core router connected to the central antenna was located at the top floor of the highest building in the area about 20 min away from our office.</p>
<p>One day I was working on some monitoring scripts for the central router (which was basically a custom-built FreeBSD server). I&#8217;d run those scripts on a local stand I had on my table, make some changes, run it again, etc. We did not have VMs back then, so experimental work would happen on real hardware that was a clone of a production box. In the middle of my local debugging, I received a monitoring alert from our production saying that our core router had some (non-critical) issues. Since I was on-call that day, I decided take a look. Fixing the issue on the router, I went back to my debugging and successfully finished the job after about an hour.</p>
<p>And that&#8217;s where things went wrong&#8230; When I wanted to shut down my local machine, I switched to a terminal that was connected to the box, typed &#8220;poweroff&#8221;, pressed Enter&#8230; and only then realized that I did it on a wrong server! <img src="https://s.w.org/images/core/emoji/2.3/72x72/1f926-1f3fb-200d-2642-fe0f.png" alt="🤦🏻‍♂️" class="wp-smiley" style="height: 1em; max-height: 1em;" /> I had that second terminal window opened ever since the monitoring alert an hour ago, and now I ended up shutting down the core router for our whole city-wide network!</p>
<p>What&#8217;s cool is that there was no blame in the aftermath of the incident. The team understood the mistake and focused on fixing the problem. We ended up having to drive to the central station and manually power the router back on. Back then we did not have any remote power management set up for that server and IPMI did not exist back then. Dark times indeed! <img src="https://s.w.org/images/core/emoji/2.3/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>As a result of that mistake, our whole city&#8217;s banking infrastructure and a bunch of other important services were down for ~30 minutes. Following the incident, we have made a number of improvements to our infrastructure and our processes (I don&#8217;t remember the details now) making the system a lot more resilient to similar errors.</p>
<p>Looking back now, huge kudos to my bosses for not firing me back then! This incident profoundly influenced my career in many ways:</p>
<p>First, the thrill of managing such vast infrastructures made me want to stay in technical operations rather than shifting to pure software development, a path many of my peers chose at the time. Then, having experienced such a massive error firsthand, I&#8217;ve always done my absolute best to safeguard my systems against failures, optimizing for quick recovery and being paranoid about backups and redundancy.  Finally, it was a pivotal moment in my understanding of the value of blameless incident process long before the emergence of the modern blameless DevOps and SRE cultures — a management lesson that has deeply informed my approach to leadership and system design ever since.</p>
]]></content:encoded>
			</item>
		<item>
		<title>Interview: Inside Shopify’s Modular Monolith</title>
		<link>https://kovyrin.net/2024/06/16/interview-inside-shopify-monolith/</link>
		<pubDate>Sun, 16 Jun 2024 18:57:50 +0000</pubDate>
		<dc:creator><![CDATA[Oleksiy Kovyrin]]></dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[My Projects]]></category>

		<guid isPermaLink="false">https://kovyrin.net/?p=887</guid>
		<description><![CDATA[This is my interview with Dr. Milan Milanovic originally published on his newsletter Tech World With Milan where we discussed Shopify  architecture, tech stack, testing, culture, and more. 1.  Who is Oleksiy? I have spent most of my career in technical operations (system administration, later called DevOps, nowadays encompassed by platform engineering and SRE disciplines). Along the way, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>This is my interview with <strong><a href="https://milan.milanovic.org/" rel="">Dr. Milan Milanovic</a> </strong>originally <a href="https://newsletter.techworld-with-milan.com/p/inside-shopifys-modular-monolith">published</a> on his newsletter <a href="https://newsletter.techworld-with-milan.com/">Tech World With Milan</a> where we discussed Shopify  architecture, tech stack, testing, culture, and more.</p>
<h2 class="header-with-anchor-widget">1.  Who is <a href="https://www.linkedin.com/in/kovyrin" rel="">Oleksiy</a>?</h2>
<p>I have spent most of my career in technical operations (system administration, later called DevOps, nowadays encompassed by platform engineering and SRE disciplines). Along the way, I worked at Percona as a MySQL performance consultant and then operated some of the largest Ruby on Rails applications in the world, all the while <a href="https://shopify.engineering/" rel="">following</a> the incredible story of Shopify’s development and growth.</p>
<p>Finally, after decades of work in operations, when a startup I was at got acquired by Elastic, I decided to move into software engineering. After 5 years there, I needed a bigger challenge, which felt like the right moment to join Shopify.</p>
<p>I started with the Storefronts group (the team responsible for Storefront themes, all the related infrastructure, and the Storefront rendering infrastructure) at Shopify at the beginning of 2022. Two years later, I can confidently say that Shopify’s culture is unique. I<strong> enjoy working with the team here due to the incredible talent density I have never encountered</strong>. Every day, I am humbled by the caliber of people I can work with and the level of problems I get to solve.</p>
<h2 class="header-with-anchor-widget">2.  What is the role of the Principal Engineer at Shopify?</h2>
<p>Before joining Shopify, I was excited about all the possibilities associated with the Principal Engineer role. Immediately, I was surprised at how diverse the Principal Engineering discipline was at the company. We have a range of engineers here, from extremely deep and narrow experts to amazing architects coordinating challenging projects across the company. Even more impressive is that you have a lot of agency in the shape of a Principal Engineer you will be, provided that the work aligns with the overarching mission of making commerce better for everyone. After 2 years with the company,<strong> I found myself in a sweet spot of spending ~75% of my time doing deep technical work across multiple areas of Storefronts infrastructure, and the rest is spent on project leadership, coordination, etc.</strong></p>
<h2 class="header-with-anchor-widget">3.  The recent <a href="https://twitter.com/ShopifyEng/status/1729500623773573265" rel="">tweet</a> by Shopify Engineering shows impressive results achieved by your system. What is Shopify&#8217;s overall architecture?</h2>
<p>The infrastructure at Shopify was one of the most surprising parts of the company for me. I have spent my whole career building large, heavily loaded systems based on <strong>Ruby on Rails</strong>. Joining Shopify and knowing upfront a lot about the amount of traffic they handled during Black Friday, Cyber Monday (<a href="https://bfcm.shopify.com/" rel="">BFCM</a>), and flash sales, I was half-expecting to find some magic sauce inside. But the reality turned out to be very different: the team here is extremely pragmatic when building anything. It comes from Shopify’s Founder and CEO <a href="https://twitter.com/tobi" rel="">Tobi Lütke</a> himself: <strong>if something can be made simpler, we try to make it so</strong>. As a result, the whole system behind those impressive numbers is built on top of fairly common components: <strong>Ruby, Rails, MySQL/Vitess, Memcached/Redis, Kafka, Elasticsearch, etc., scaled horizontally</strong>.</p>
<div class="captioned-image-container" style="text-align: center;">
<figure>
<div class="image2-inset">
<picture><source srcset="https://substackcdn.com/image/fetch/w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17f98aa8-258a-412e-b147-a5d9faff4c37_583x473.png 424w, https://substackcdn.com/image/fetch/w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17f98aa8-258a-412e-b147-a5d9faff4c37_583x473.png 848w, https://substackcdn.com/image/fetch/w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17f98aa8-258a-412e-b147-a5d9faff4c37_583x473.png 1272w, https://substackcdn.com/image/fetch/w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17f98aa8-258a-412e-b147-a5d9faff4c37_583x473.png 1456w" type="image/webp" sizes="100vw" /><img class="sizing-normal aligncenter" title="" src="https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17f98aa8-258a-412e-b147-a5d9faff4c37_583x473.png" sizes="100vw" srcset="https://substackcdn.com/image/fetch/w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17f98aa8-258a-412e-b147-a5d9faff4c37_583x473.png 424w, https://substackcdn.com/image/fetch/w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17f98aa8-258a-412e-b147-a5d9faff4c37_583x473.png 848w, https://substackcdn.com/image/fetch/w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17f98aa8-258a-412e-b147-a5d9faff4c37_583x473.png 1272w, https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17f98aa8-258a-412e-b147-a5d9faff4c37_583x473.png 1456w" alt="" width="583" height="473" data-attrs="{&quot;src&quot;:&quot;https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17f98aa8-258a-412e-b147-a5d9faff4c37_583x473.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:473,&quot;width&quot;:583,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:49926,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://twitter.com/ShopifyEng/status/1729500623773573265https://twitter.com/ShopifyEng/status/1729500623773573265&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null}" /></picture>
<div></div>
</div><figcaption class="image-caption">Shopify Engineering Tweet about the amount of traffic they handled during Black Friday</figcaption></figure>
</div>
<p>What makes Shopify unique is the level of mastery the teams have built around those key components:<strong> we employ <a href="https://shopify.engineering/shopify-ruby-at-scale-research-investment" rel="">Ruby</a> core contributors</strong> (who keep <a href="https://shopify.engineering/ruby-yjit-is-production-ready" rel="">making Ruby faster</a>), Rails core contributors (improving Rails), <strong>MySQL experts</strong> (who know how to operate MySQL at scale), and <strong>we contribute to and maintain all kinds of <a href="https://shopify.engineering/shopify-open-source-philosophy" rel="">open-source projects</a> that support our infrastructure</strong>. As a result, even the simplest components in our infrastructure tend to be deployed, managed, and scaled exceptionally well, leading to a system that can scale to many orders of magnitude over the baseline capacity and still perform well.</p>
<h2 class="header-with-anchor-widget">4.  What is Shopify&#8217;s tech stack?</h2>
<p>Given that databases (and stateful systems in general) are the most complex components to scale, <strong>we focus our scaling on MySQL first</strong>. All shops on the platform are split into groups, each hosted on a dedicated set of database servers called a <strong><a href="https://shopify.engineering/a-pods-architecture-to-allow-shopify-to-scale" rel="">pod</a></strong>. Each pod is wholly isolated from the rest of the database infrastructure, limiting the blast radius of most database-related incidents to a relatively small group of shops. Some more prominent merchants get their dedicated pods that guarantee complete resource isolation.</p>
<p>Over the past year, some applications <a href="https://shopify.engineering/horizontally-scaling-the-rails-backend-of-shop-app-with-vitess" rel="">started relying on Vitess</a> to help with the horizontal sharding of their data.</p>
<p>On top of the database layer is a reasonably standard Ruby on Rails stack: <strong>Ruby and Rails applications running on Puma</strong>, using <strong>Memcached </strong>for ephemeral storage needs and <strong>Elasticsearch </strong>for full-text search. <strong>Nginx + Lua</strong> is used for sophisticated tasks, from smart routing across multiple regions to rate limiting, abuse protection, etc.</p>
<p>This runs on top of <strong>Kubernetes hosted on <a href="https://shopify.engineering/shopify-infrastructure-collaboration-with-google" rel="">Google Cloud</a></strong> in many regions worldwide, making the infrastructure extremely scalable and responsive to wild traffic fluctuations.</p>
<p>Check the full Shopify tech stack at <a href="https://stackshare.io/shopify/e-commerce-at-scale-inside-shopifys-tech-stack" rel="">Stackshare</a>.</p>
<div class="captioned-image-container" style="text-align: center;">
<figure>
<div class="image2-inset">
<picture><source srcset="https://substackcdn.com/image/fetch/w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83c8b057-7f2f-4e7a-8721-7cfc370f8243_600x306.png 424w, https://substackcdn.com/image/fetch/w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83c8b057-7f2f-4e7a-8721-7cfc370f8243_600x306.png 848w, https://substackcdn.com/image/fetch/w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83c8b057-7f2f-4e7a-8721-7cfc370f8243_600x306.png 1272w, https://substackcdn.com/image/fetch/w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83c8b057-7f2f-4e7a-8721-7cfc370f8243_600x306.png 1456w" type="image/webp" sizes="100vw" /><img class="sizing-normal aligncenter" src="https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83c8b057-7f2f-4e7a-8721-7cfc370f8243_600x306.png" sizes="100vw" srcset="https://substackcdn.com/image/fetch/w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83c8b057-7f2f-4e7a-8721-7cfc370f8243_600x306.png 424w, https://substackcdn.com/image/fetch/w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83c8b057-7f2f-4e7a-8721-7cfc370f8243_600x306.png 848w, https://substackcdn.com/image/fetch/w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83c8b057-7f2f-4e7a-8721-7cfc370f8243_600x306.png 1272w, https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83c8b057-7f2f-4e7a-8721-7cfc370f8243_600x306.png 1456w" alt="" width="600" height="306" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/83c8b057-7f2f-4e7a-8721-7cfc370f8243_600x306.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:306,&quot;width&quot;:600,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null}" /></picture>
<div class="image-link-expand"></div>
</div><figcaption class="image-caption">A Pods Architecture To Allow Shopify To Scale (Source: <a href="https://shopify.engineering/a-pods-architecture-to-allow-shopify-to-scale" rel="">Shopify Engineering</a>)</figcaption></figure>
</div>
<blockquote>
<h3>What are Pods exactly?</h3>
<p><em>The idea behind pods at Shopify is to split all of our data into a set of completely independent database (MySQL) clusters using shop_id as the sharding key to ensure resource isolation between different tenants and localize the impact of a “noisy neighbor” problem across the platform. </em></p>
<p><em>Only the databases are podded since they are the hardest component to scale. Everything else that is stateless is scaled automatically according to the incoming traffic levels and other load parameters using a custom Kubernetes autoscale.</em></p></blockquote>
<h2 class="header-with-anchor-widget">5. Is the monolith going to be broken into microservices?</h2>
<p>Shopify fully embraces the idea of a <strong><a href="https://signalvnoise.com/svn3/the-majestic-monolith/" rel="">Majestic Monolith</a></strong>—most user-facing functionality people tend to associate with the company is served by a single large Ruby on Rails application called “Shopify Core.” Internally, <a href="https://shopify.engineering/deconstructing-monolith-designing-software-maximizes-developer-productivity" rel="">the monolith is split into multiple components</a> focused on different business domains. Many custom (later open-sourced) machinery have been built to <a href="https://github.com/Shopify/tapioca" rel="">enforce coding standards</a>, <a href="https://github.com/Shopify/packwerk" rel="">API boundaries</a> between components, etc.</p>
<p>The rendering application behind all Shopify storefronts is completely separate from the monolith. This was one of the cases where it made perfect sense to split functionality from Core because it is relatively simple. Load data from a database, render Liquid code, and send the HTML back to the user – the absolute majority of requests it handles. <strong>Given the amount of traffic on this application, even a small improvement in its efficiency results in enormous resource savings</strong>. So, when it was initially built, the team set several strict constraints on how the code is written, what features of Ruby we prefer to avoid, how we deal with memory usage, etc. This allowed us to build a pretty efficient application in a language we love while carefully controlling memory allocation and the resources we spend rendering storefronts.</p>
<div class="captioned-image-container" style="text-align: center;">
<figure>
<div class="image2-inset">
<picture><source srcset="https://substackcdn.com/image/fetch/w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11ea28cb-1806-43ee-890d-47201694e459_1600x1348.png 424w, https://substackcdn.com/image/fetch/w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11ea28cb-1806-43ee-890d-47201694e459_1600x1348.png 848w, https://substackcdn.com/image/fetch/w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11ea28cb-1806-43ee-890d-47201694e459_1600x1348.png 1272w, https://substackcdn.com/image/fetch/w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11ea28cb-1806-43ee-890d-47201694e459_1600x1348.png 1456w" type="image/webp" sizes="100vw" /><img class="aligncenter" src="https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11ea28cb-1806-43ee-890d-47201694e459_1600x1348.png" sizes="100vw" srcset="https://substackcdn.com/image/fetch/w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11ea28cb-1806-43ee-890d-47201694e459_1600x1348.png 424w, https://substackcdn.com/image/fetch/w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11ea28cb-1806-43ee-890d-47201694e459_1600x1348.png 848w, https://substackcdn.com/image/fetch/w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11ea28cb-1806-43ee-890d-47201694e459_1600x1348.png 1272w, https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11ea28cb-1806-43ee-890d-47201694e459_1600x1348.png 1456w" alt="" width="585" height="493" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/11ea28cb-1806-43ee-890d-47201694e459_1600x1348.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1227,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null}" /></picture>
<div class="image-link-expand"></div>
</div><figcaption class="image-caption">Shopify application components</figcaption></figure>
</div>
<p>In parallel with this effort, the Ruby infrastructure team (working on <a href="https://github.com/Shopify/yjit" rel="">YJIT</a>, among other things) <strong>has made the language significantly faster with each release</strong>. Finally, in the last year, we started rewriting parts of this application in Rust to improve efficiency further.</p>
<p>Answering your question about the future of the monolith, I think outside of a few other localized cases, most of the functionality of the Shopify platform will probably be handled by the Core monolith for a long time, given how well it has worked for us so far using relatively standard horizontal scalability techniques.</p>
<h2 class="header-with-anchor-widget">6. How do you do testing?</h2>
<p>Our testing infrastructure is a <strong>multi-layered set of checks that allows us to deploy hundreds of times daily while keeping the platform safe</strong>. It starts with a set of tests on each application: your typical unit/integration tests, etc. Those are required for a change to propagate into a deployment pipeline (based on the <a href="https://github.com/Shopify/shipit-engine" rel="">Shipit</a> engine, created by Shopify and open-sourced years ago.</p>
<div class="captioned-image-container" style="text-align: center;">
<figure>
<div class="image2-inset">
<picture><source srcset="https://substackcdn.com/image/fetch/w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa78c2f7-cd3a-4917-92cd-63eb6a5b5176_1600x849.png 424w, https://substackcdn.com/image/fetch/w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa78c2f7-cd3a-4917-92cd-63eb6a5b5176_1600x849.png 848w, https://substackcdn.com/image/fetch/w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa78c2f7-cd3a-4917-92cd-63eb6a5b5176_1600x849.png 1272w, https://substackcdn.com/image/fetch/w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa78c2f7-cd3a-4917-92cd-63eb6a5b5176_1600x849.png 1456w" type="image/webp" sizes="100vw" /><img class="sizing-normal aligncenter" src="https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa78c2f7-cd3a-4917-92cd-63eb6a5b5176_1600x849.png" sizes="100vw" srcset="https://substackcdn.com/image/fetch/w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa78c2f7-cd3a-4917-92cd-63eb6a5b5176_1600x849.png 424w, https://substackcdn.com/image/fetch/w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa78c2f7-cd3a-4917-92cd-63eb6a5b5176_1600x849.png 848w, https://substackcdn.com/image/fetch/w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa78c2f7-cd3a-4917-92cd-63eb6a5b5176_1600x849.png 1272w, https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa78c2f7-cd3a-4917-92cd-63eb6a5b5176_1600x849.png 1456w" alt="" width="725" height="385" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aa78c2f7-cd3a-4917-92cd-63eb6a5b5176_1600x849.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:773,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null}" /></picture>
<div class="image-link-expand"></div>
</div><figcaption class="image-caption">Shopify overall infrastructure</figcaption></figure>
</div>
<p>During the deployment, a very important step is <strong>canary testing</strong>: a change will be deployed onto a small subset of production instances, and automation will monitor a set of key health metrics for the platform. If any metrics move in the wrong direction, the change is automatically reverted and removed from production immediately, allowing developers to figure out what went wrong and try again when they fix the problem. Only after testing a change on canaries for some time the deployment pipeline performs a full deployment. The same approach is used for significant schema changes, etc.</p>
<h2 class="header-with-anchor-widget">7. How do you do deployments?</h2>
<p>All Shopify deployments are based on <strong>Kubernetes </strong>(running on <a href="https://shopify.engineering/shopify-infrastructure-collaboration-with-google" rel="">GCP</a>), so each application is a container (or a fleet of containers) somewhere in one of our clusters. Our deployment pipeline is built on the <strong><a href="https://github.com/Shopify/shipit-engine" rel="">Shipit</a> engine</strong> (created by Shopify and open-sourced years ago). Deployment pipelines can get pretty complex, but it mostly boils down to building an image, deploying it to canaries, waiting to ensure things are healthy, and gradually rolling out the change wider across the global fleet of Kubernetes clusters.</p>
<p>Shipit also maintains the deployment queue and merges multiple pull requests into a single deployment to increase the pipeline&#8217;s throughput.</p>
<div class="captioned-image-container" style="text-align: center;">
<figure>
<div class="image2-inset">
<picture><source srcset="https://substackcdn.com/image/fetch/w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42767f34-dd3f-41e8-b089-8bd68428aaa4_1024x495.png 424w, https://substackcdn.com/image/fetch/w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42767f34-dd3f-41e8-b089-8bd68428aaa4_1024x495.png 848w, https://substackcdn.com/image/fetch/w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42767f34-dd3f-41e8-b089-8bd68428aaa4_1024x495.png 1272w, https://substackcdn.com/image/fetch/w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42767f34-dd3f-41e8-b089-8bd68428aaa4_1024x495.png 1456w" type="image/webp" sizes="100vw" /><img class="sizing-normal aligncenter" src="https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42767f34-dd3f-41e8-b089-8bd68428aaa4_1024x495.png" sizes="100vw" srcset="https://substackcdn.com/image/fetch/w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42767f34-dd3f-41e8-b089-8bd68428aaa4_1024x495.png 424w, https://substackcdn.com/image/fetch/w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42767f34-dd3f-41e8-b089-8bd68428aaa4_1024x495.png 848w, https://substackcdn.com/image/fetch/w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42767f34-dd3f-41e8-b089-8bd68428aaa4_1024x495.png 1272w, https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42767f34-dd3f-41e8-b089-8bd68428aaa4_1024x495.png 1456w" alt="" width="670" height="324" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/42767f34-dd3f-41e8-b089-8bd68428aaa4_1024x495.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:495,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null}" /></picture>
<div class="image-link-expand"></div>
</div><figcaption class="image-caption">Shipit open-source deployment tool by Shopify (<a href="https://shopify.engineering/introducing-shipit" rel="">Source</a>)</figcaption></figure>
</div>
<h2 class="header-with-anchor-widget">8. How do you handle failures in the system?<span style="font-size: 16px;"> </span></h2>
<p>The whole system is built with many redundancy and horizontal auto-scaling (if possible), which helps prevent large-scale outages. But there are always big and small fires to handle. So, <strong>we have a dedicated site reliability team responsible for keeping the platform healthy in the face of constant change and adversarial problems like bots and DDoS attacks</strong>. They have built many automated tools to help us handle traffic flashes and, if needed, degrade gracefully. Some interesting examples: <strong>they have automated traffic analysis tools helping them scope ongoing incidents down to specific pods, shops, page types, or traffic sources</strong>; then the team can control the flow of traffic by pod or shop, re-route traffic between regions, block or slow down requests from specific parts of the world, prioritize particular types of traffic and apply anti-adversarial measures across our network to mitigate attacks.</p>
<p>Finally, <strong>each application has an owner team</strong> (or a set of teams) that can be paged if their application gets unhealthy. They help troubleshoot and resolve incidents around the clock (being a distributed company helps a lot here since we have people across many time zones).</p>
<h2 class="header-with-anchor-widget">9. What challenges are you working on right now in your team?</h2>
<p>We have just finished a large project to increase the global footprint of our <strong>Storefront rendering infrastructure</strong>, rolling out new regions in Europe, Asia, Australia, and North America. The project required coordination across many different teams (from networking to databases to operations, etc.) and involved <strong>building completely new tools for filtered database replication</strong> (since we cannot replicate all of our data into all regions due to cost and data residency requirements), making changes in the application itself to allow for rendering without having access to all data, etc. This large effort has reduced latency for our buyers worldwide and made their shopping experiences smoother.</p>
<p>Next on our radar are further improvements in Liquid rendering performance, database access optimization, and other performance-related work.</p>
]]></content:encoded>
			</item>
		<item>
		<title>Farewell to Elastic and The New Chapter</title>
		<link>https://kovyrin.net/2022/02/23/farewell-to-elastic-and-the-new-chapter/</link>
		<pubDate>Wed, 23 Feb 2022 23:48:04 +0000</pubDate>
		<dc:creator><![CDATA[Oleksiy Kovyrin]]></dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">https://kovyrin.net/?p=881</guid>
		<description><![CDATA[Today was my last day at Elastic. After 4.5 years with the company and almost 9 years with the Swiftype (and later Enterprise Search) team, I have decided to move on and see what else is out there. I wanted to use this post to clarify the reasoning behind the decision because a lot of [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Today was my last day at Elastic. After 4.5 years with the company and almost 9 years with the Swiftype (and later Enterprise Search) team, I have decided to move on and see what else is out there. I wanted to use this post to clarify the reasoning behind the decision because a lot of people have been reaching out over the past month wondering about the details.</p>
<p>For most of my career (for at least 15-17 years before joining Elastic) I have worked in small to medium-sized startups, always in SaaS, moving really fast and having my impact on the business be mostly tied to my ability to ship. I loved that, even though it was often painful and stressful. My brain ended up being trained to derive dopamine from the constant feeling of shipping, constant feeling of overcoming challenges and solving problems.</p>
<p>Then, we got acquired by Elastic &#8211; a truly amazing company, honestly, the best company I have ever worked for and, unfortunately, a company that ships packaged software with its inherent effects on development process. At first, while my projects revolved around security and compliance, then around internal code migrations, integration into the Elastic ecosystem, etc, I felt really happy &#8211; I would do the really challenging work and derive pleasure from overcoming those challenges.</p>
<p>Unfortunately, over time the initial rush of excitement faded away and I have realized, that the most challenging problems within our product have been solved and I ended up in a position of working on a packaged product, building features with a release cycle of 6-8 weeks. The product is amazing, the features are really exciting, but the very long feedback cycle simply did not work for me after so many years in SaaS.</p>
<p>I still believe in Elastic, I love the company, the team and the amazing culture we have built over the years. But I need to ship faster, move faster, get feedback from my users sooner. After considering different options, I have decided to join Shopify &#8211; a large and fast moving Rails-based company, where I hope to get a chance to once again experience the thrill of fast delivery and tight feedback loops. Let&#8217;s see how it goes <img src="https://s.w.org/images/core/emoji/2.3/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
			</item>
		<item>
		<title>Edge Web Server Testing at Swiftype</title>
		<link>https://kovyrin.net/2018/04/28/edge-web-server-testing-at-swiftype/</link>
		<pubDate>Sat, 28 Apr 2018 20:38:34 +0000</pubDate>
		<dc:creator><![CDATA[Oleksiy Kovyrin]]></dc:creator>
				<category><![CDATA[Admin-tips]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Networks]]></category>
		<category><![CDATA[infrastructure]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[swiftype]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">https://kovyrin.net/?p=847</guid>
		<description><![CDATA[This article has been originally posted on Swiftype Engineering blog. For any modern technology company, a comprehensive application test suite is an absolute necessity. Automated testing suites allow developers to move faster while avoiding any loss of code quality or system stability. Software development has seen great benefit come from the adoption of automated testing frameworks [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>This article has been originally posted on <a href="https://swiftype.engineering/edge-web-server-testing-at-swiftype-2e3e328d4553">Swiftype Engineering blog</a>.</p>
<hr />
<p id="66cf" class="graf graf--p graf-after--figure">For any modern technology company, a comprehensive application test suite is an absolute necessity. Automated testing suites allow developers to move faster while avoiding any loss of code quality or system stability. Software development has seen great benefit come from the adoption of automated testing frameworks and methodologies, however, the culture of automated testing has neglected one key area of modern web application serving stack: web application edge routing and multiplexing rulesets.</p>
<p id="f15a" class="graf graf--p graf-after--p">From modern load balancer appliances that allow for <a class="markup--anchor markup--p-anchor" href="https://devcentral.f5.com/articles/irules-concepts-tcl-the-how-and-why" target="_blank" rel="noopener" data-href="https://devcentral.f5.com/articles/irules-concepts-tcl-the-how-and-why">TCL based rule sets</a>; local or remotely hosted <a class="markup--anchor markup--p-anchor" href="https://varnish-cache.org/docs/trunk/users-guide/vcl.html" target="_blank" rel="noopener" data-href="https://varnish-cache.org/docs/trunk/users-guide/vcl.html">varnish VCL rules</a>; or in the power and flexibility that <a class="markup--anchor markup--p-anchor" href="https://www.nginx.com/" target="_blank" rel="noopener" data-href="https://www.nginx.com/">Nginx</a> and <a class="markup--anchor markup--p-anchor" href="https://openresty.org/en/" target="_blank" rel="noopener" data-href="https://openresty.org/en/">OpenResty</a> make available <a class="markup--anchor markup--p-anchor" href="https://github.com/openresty/lua-nginx-module" target="_blank" rel="noopener" data-href="https://github.com/openresty/lua-nginx-module">through LUA</a>, edge routing rulesets have become a vital part of application serving controls.</p>
<p id="bd74" class="graf graf--p graf-after--p">Over the past decade or so, it has become possible to incorporate more and more logic into edge web server infrastructures. Almost every modern web server has support for scripting, enabling developers to make their edge servers smarter than ever before. Unfortunately, the application logic configured within web servers is often much harder to test than that hosted directly in application code, and thus too often software teams resort to manual testing, or worse, customers as testers, by shipping their changes to production without edge routing testing having been performed.</p>
<p id="c0d1" class="graf graf--p graf-after--p graf--trailing">In this post, I would like to explain the approach <a class="markup--anchor markup--p-anchor" href="https://swiftype.com/" target="_blank" rel="noopener" data-href="https://swiftype.com/">Swiftype</a> has taken to ensure that our test suites account for our use of complex edge web server logic<br />
to manage our production traffic flow, and thus that we can confidently deploy changes to our application infrastructure with little or no risk.</p>
<p><span id="more-847"></span></p>
<h3 id="fb1b" class="graf graf--h3 graf--leading">Our Web Infrastructure</h3>
<p id="d4e0" class="graf graf--p graf-after--h3">Before I go into details of our edge web server configuration testing, it may be helpful to share an overview of the infrastructure behind our web services and applications.</p>
<p id="a11e" class="graf graf--p graf-after--p">Swiftype has evolved from a relatively simple Rails monolith and is still largely powered by a set of Ruby applications served by Unicorn application servers. To balance traffic between the multitude of application instances, we use <a href="http://www.haproxy.org/">Haproxy</a> (mainly for its observability features and the fair load balancing implementation). Finally, there is an O<a class="markup--anchor markup--p-anchor" href="http://openresty.org/en/" target="_blank" rel="noopener" data-href="http://openresty.org/en/">penResty</a> (nginx+lua) layer at the edge of our infrastructure that is responsible for many key functions: SSL termination and enforcement, rate limiting, as well as providing flexible traffic management and routing functionality (written in Lua) customized specifically for the <a class="markup--anchor markup--p-anchor" href="https://swiftype.com/developers" target="_blank" rel="noopener" data-href="https://swiftype.com/developers">Swiftype API</a>.</p>
<p id="b989" class="graf graf--p graf-after--p">Here is a simple diagram of our web application infrastructure:</p>
<div id="attachment_851" style="max-width: 935px" class="wp-caption aligncenter"><a href="https://kovyrin.net/wp-content/uploads/2018/04/nginx-testing.png"><img class="wp-image-851 size-large" src="https://kovyrin.net/wp-content/uploads/2018/04/nginx-testing-925x1024.png" alt="" width="925" height="1024" srcset="https://kovyrin.net/wp-content/uploads/2018/04/nginx-testing-925x1024.png 925w, https://kovyrin.net/wp-content/uploads/2018/04/nginx-testing-271x300.png 271w, https://kovyrin.net/wp-content/uploads/2018/04/nginx-testing-768x850.png 768w" sizes="(max-width: 925px) 100vw, 925px" /></a><p class="wp-caption-text">Swiftype web infrastructure overview</p></div>
<h3 id="5217" class="graf graf--h3 graf-after--figure">Testing Edge Web Servers</h3>
<p id="092e" class="graf graf--p graf-after--h3">Swiftype’s edge web server configuration contains thousands of lines of code: from Nginx configs to custom templates rendered during deployment, to complex Lua logic used to manage production API traffic.Any mistake in this configuration, if not caught in testing, could lead to an outage at our edge, and considering that 100% of our API traffic is served through this layer, any outage at the edge is likely to be very impactful to our customers and our business. This is why we have invested time and resources to build a system that allows us to test our edge configuration changes in development and on CI before they are deployed to production systems.</p>
<h4 id="3fe7" class="graf graf--h4 graf-after--p">Testing Workflow Overview</h4>
<p id="320f" class="graf graf--p graf-after--h4">The first step in safely introducing change is ensuring that development and testing environments are quarantined from production environments. To do this we have created an “isolated” runtime mode for our edge web server stack. All changes to our edge configurations are first developed and run in this “isolated” mode. The “isolated” mode has no references to production backend infrastructure, and thus by employing the “isolated” mode, developers are able to iterate very quickly in a local environment without fear of harmful repercussions. All tests are written to run as part of the “isolated” mode employ a mock server to emulate production backends and primarily focus on the unit-testing of specific new features that are being implemented.</p>
<p id="7c35" class="graf graf--p graf-after--p">When we are confident enough in our unit-tested set of changes, we could run the same set of tests in an “acceptance testing” mode when the mock server used in isolated tests is replaced with an Haproxy load balancer with access to production networks. Working on tests and running them in this mode allows us to ensure with the highest degree of certainty that our changes will work in a real production environment since we exercise our whole stack while running the test suite.</p>
<h4 id="9767" class="graf graf--h4 graf-after--p">Testing Environment Overview</h4>
<p id="759b" class="graf graf--p graf-after--h4">Our testing environment employs Docker containers to serve in place of our production web servers. The test environment is comprised of the following components:</p>
<ul class="postList">
<li id="98b2" class="graf graf--li graf-after--p">A loopback network interface on which a full complement of production IPs are configured to account for every service we are planning to test (e.g. a service foo.swiftype.com pointing to an IP address 10.1.0.x in production is tested in a local “isolated” testing environment with IP 10.1.0.x assigned to an alias on the local loopback interface). This allows us to perform end-to-end testing: DNS resolution, TCP service connections to a specific IP address, etc. without needing access to production, nor local /etc/hosts or name resolution changes.</li>
<li id="ab31" class="graf graf--li graf-after--li">For use cases where we are testing changes that are not represented in DNS (for example, when preparing edge servers for serving traffic currently handled by a different service), we may still employ local /etc/hosts entries to point the DNS name for a service to a local IP address for the period of testing. In this scenario, we ensure that our tests have been written in a way that is independent of the DNS configuration, and thus that the tests can be reused at a later date, or when the configuration has been deployed to production.</li>
<li id="7e1f" class="graf graf--li graf-after--li">An OpenResty server instance with the configuration we need to test.</li>
<li id="4e95" class="graf graf--li graf-after--li">A test runner process (based on RSpec and a custom framework for writing our tests).</li>
<li id="119d" class="graf graf--li graf-after--li">An optional Mock server. (As noted above, this might be docker in a local test environment, or in CI, and is likely to be used as part of the test runner process, where it emulates an external application/service; serves in place of a production backends; or acts as a local Haproxy instance running a production configuration and may even route traffic to real production backends.</li>
</ul>
<h4 id="6539" class="graf graf--h4 graf-after--li">Isolated Testing Walkthrough</h4>
<p id="f491" class="graf graf--p graf-after--h4">Here is how a test for a hypothetical service foo.swiftype.com (registered in DNS as 1.2.3.4) is performed in an isolated environment:</p>
<ol class="postList">
<li id="da1c" class="graf graf--li graf-after--p">We automatically assign 1.2.3.4 as an alias on a loopback interface.</li>
<li id="0a27" class="graf graf--li graf-after--li">We start a mock server listening on the localhost configured to respond on the same port used by the foo.swiftype.com Nginx server backend (in production, there would be haproxy on that port) with a specific stub response.</li>
<li id="117e" class="graf graf--li graf-after--li">Our test performs a DNS resolution for foo.swiftype.com, receives 10.1.0.x as the IP of the service, connects to the local Nginx instance listening on 10.1.0.x (bound to a loopback interface) and performs a test call.</li>
<li id="9250" class="graf graf--li graf-after--li">Nginx, receiving the test request, performs all configured operations and forwards the request to a backend, which in this case is handled by the local mock server. The call result is then returned by Nginx to the test runner.</li>
<li id="eb88" class="graf graf--li graf-after--li">The test runner performs all defined testing against the server response: These tests can be very thorough, as the test runner has access to the server response code, all headers, and also the response body, and can thus confirm that all data returned meets each test’s specifications before concluding if the process as a whole has passed or failed test validation.</li>
<li id="407d" class="graf graf--li graf-after--li">Specific to isolated testing: In some use cases, we may validate the state of the Mock server, verifying that it has received all call we expected it to receive and that each call represented the data and headers expected. This can be very useful for testing changes where our web layer has been configured to alter requests (rewrite, add or remove headers, etc.) prior to passing them to a given backend.</li>
</ol>
<p id="3cb6" class="graf graf--p graf-after--li">Here is a diagram illustrating a test running in an isolated environment:</p>
<div id="attachment_850" style="max-width: 1034px" class="wp-caption aligncenter"><a href="https://kovyrin.net/wp-content/uploads/2018/04/isolated-nginx-testing.png"><img class="wp-image-850 size-large" src="https://kovyrin.net/wp-content/uploads/2018/04/isolated-nginx-testing-1024x840.png" alt="" width="1024" height="840" srcset="https://kovyrin.net/wp-content/uploads/2018/04/isolated-nginx-testing-1024x840.png 1024w, https://kovyrin.net/wp-content/uploads/2018/04/isolated-nginx-testing-300x246.png 300w, https://kovyrin.net/wp-content/uploads/2018/04/isolated-nginx-testing-768x630.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><p class="wp-caption-text">An isolated testing environment</p></div>
<h4 id="032e" class="graf graf--h4 graf-after--figure">Acceptance Testing Walkthrough</h4>
<p id="0e94" class="graf graf--p graf-after--h4">When all of our tests have passed in our “isolated” environment, and we want to make sure our configurations work in a non-mock, physically “production-like” environment (or during our periodic acceptance test runs that must also run in a production mirroring environment), we use an “acceptance testing” mode. In this mode, we replace our mock server with a real production Haproxy load balancer instance talking to real production backends (or a subset of backends representing a real production application).</p>
<p id="3b3a" class="graf graf--p graf-after--p">Here is what happens during an acceptance test for the same hypothetical service foo.swiftype.com (registered in DNS as 1.2.3.4):</p>
<ol class="postList">
<li id="02e1" class="graf graf--li graf-after--p">We automatically assign 1.2.3.4 as an alias on a loopback interface.</li>
<li id="5913" class="graf graf--li graf-after--li">We start a dedicated production Haproxy instance, with a configuration pointing to production backend applications, and bind this dedicated haproxy instance to localhost. (This exactly mirrors what we do in production, where haproxy is always a dedicated localhost service).</li>
<li id="dd02" class="graf graf--li graf-after--li">Our test performs DNS resolution for foo.swiftype.com, receives 10.1.0.x as the IP of the service, connects to a local Nginx instance listening on 10.1.0.x (bound to a loopback interface), and performs a test call.</li>
<li id="dd45" class="graf graf--li graf-after--li">Nginx, receiving a test request, performs whatever operations are defined and forwards it to a local Haproxy backend, which in turn sends the request to a production application instance. When a call is complete, the result is returned by Nginx to the test runner.</li>
<li id="76e6" class="graf graf--li graf-after--li">The test runner performs all defined checks on the response and defines whether the call and response are identified as passing or failing the test.</li>
</ol>
<p id="e63b" class="graf graf--p graf-after--li">Here is a diagram illustrating a test call made in an acceptance testing environment:</p>
<div id="attachment_849" style="max-width: 947px" class="wp-caption aligncenter"><a href="https://kovyrin.net/wp-content/uploads/2018/04/acceptance-nginx-testing.png"><img class="wp-image-849 size-large" src="https://kovyrin.net/wp-content/uploads/2018/04/acceptance-nginx-testing-937x1024.png" alt="" width="937" height="1024" srcset="https://kovyrin.net/wp-content/uploads/2018/04/acceptance-nginx-testing-937x1024.png 937w, https://kovyrin.net/wp-content/uploads/2018/04/acceptance-nginx-testing-274x300.png 274w, https://kovyrin.net/wp-content/uploads/2018/04/acceptance-nginx-testing-768x840.png 768w" sizes="(max-width: 937px) 100vw, 937px" /></a><p class="wp-caption-text">A test call within the acceptance testing environment</p></div>
<h4 class="graf graf--h4 graf-after--figure"></h4>
<h3 id="4feb" class="graf graf--h3 graf-after--figure">Conclusion</h3>
<p id="458e" class="graf graf--p graf-after--h3">Using our edge web server testing framework for the past few years, we have been able to perform hundreds of high-risk changes in our production edge infrastructure without any significant incidents being caused by the deploying of an untested configuration update. Our testing framework provides us the assurances we need, such that we can make very dramatic changes to our web application edge routing (services that affect every production request) and that we can be confident in our ability to introduce these changes safely.</p>
<p id="c56a" class="graf graf--p graf-after--p graf--trailing">We highly recommend that every engineering team tasked with building or operating complex edge server configurations adopt some level of testing that allows the team to iterate faster without fear of compromising these critical components.</p>
]]></content:encoded>
			</item>
		<item>
		<title>Compliance-Driven Development or the Story Behind Swiftype’s SOC2 Certification</title>
		<link>https://kovyrin.net/2018/01/18/compliance-driven-development-or-the-story-behind-swiftypes-soc2-certification/</link>
		<pubDate>Thu, 18 Jan 2018 17:06:31 +0000</pubDate>
		<dc:creator><![CDATA[Oleksiy Kovyrin]]></dc:creator>
				<category><![CDATA[Compliance and Security]]></category>
		<category><![CDATA[My Projects]]></category>
		<category><![CDATA[certification]]></category>
		<category><![CDATA[compliance]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[SOC2]]></category>
		<category><![CDATA[swiftype]]></category>

		<guid isPermaLink="false">https://kovyrin.net/?p=837</guid>
		<description><![CDATA[Based on my experience, just a decade ago not many people within the Silicon Valley startup community considered compliance an important stepping stone in a company’s development roadmap. And when it came to compliance for startups, it was nearly synonymous with PCI/DSS — mandatory certification used by the credit card industry. Over the last few [&#8230;]]]></description>
				<content:encoded><![CDATA[<section class="section section--body section--first">
<div class="section-content">
<div class="section-inner sectionLayout--insetColumn">
<section class="section section--body">
<div class="section-divider">Based on my experience, just a decade ago not many people within the Silicon Valley startup community considered compliance an important stepping stone in a company’s development roadmap. And when it came to compliance for startups, it was nearly synonymous with <a class="markup--anchor markup--p-anchor" href="https://en.wikipedia.org/wiki/Payment_Card_Industry_Data_Security_Standard" target="_blank" rel="noopener" data-href="https://en.wikipedia.org/wiki/Payment_Card_Industry_Data_Security_Standard">PCI/DSS</a> — mandatory certification used by the credit card industry. Over the last few years though, the rise in the number of startups working with large amounts of private and confidential data (<a class="markup--anchor markup--p-anchor" href="https://en.wikipedia.org/wiki/Financial_technology" target="_blank" rel="noopener" data-href="https://en.wikipedia.org/wiki/Financial_technology">fintech</a>, healthcare, etc) and subsequently the rise in the <a class="markup--anchor markup--p-anchor" href="https://en.wikipedia.org/wiki/Equifax#May-July_2017_security_breach" target="_blank" rel="noopener" data-href="https://en.wikipedia.org/wiki/Equifax#May-July_2017_security_breach">magnitude</a> of data breaches, led our industry to accept the idea that compliance and certifications are not just for the “big guys”. Nowadays, even very small companies are pressed to go through formal certifications if they want people to trust them with private or confidential data.</div>
<div class="section-content">
<div class="section-inner sectionLayout--insetColumn">
<p class="graf graf--p">That is exactly what happened to <a class="markup--anchor markup--p-anchor" href="https://swiftype.com/" target="_blank" rel="noopener" data-href="https://swiftype.com/">Swiftype</a> at the beginning of 2017. While preparing for a public release of our latest product (<a class="markup--anchor markup--p-anchor" href="https://swiftype.com/enterprise-search" target="_blank" rel="noopener" data-href="https://swiftype.com/enterprise-search">Swiftype Enterprise Search</a>), we understood that it was going to involve a lot of confidential information and we would need to be able to assure our customers of our capabilities to protect their data. In addition to the marketing aspect, there was a security angle to the problem as well: we were looking for a standard framework that could be used by our small team to ensure the safety of customer data, guiding us through the process. Based on those considerations, we decided to go through a formal <a class="markup--anchor markup--p-anchor" href="http://www.aicpa.org/InterestAreas/FRC/AssuranceAdvisoryServices/Pages/SORHome.aspx" target="_blank" rel="noopener" data-href="http://www.aicpa.org/InterestAreas/FRC/AssuranceAdvisoryServices/Pages/SORHome.aspx">SOC 2 certification</a>. In this article, I will describe our journey towards the <a class="markup--anchor markup--p-anchor" href="https://swiftype.com/security" target="_blank" rel="noopener" data-href="https://swiftype.com/security">certification</a> and our findings along the way.</p>
<p>&nbsp;</p>
</div>
</div>
</section>
<p><span id="more-837"></span></p>
<section class="section section--body">
<div class="section-divider">
<hr class="section-divider" />
</div>
<div class="section-content">
<div class="section-inner sectionLayout--insetColumn">
<h3 class="graf graf--h3">Different Ways of Approaching Certification</h3>
<p class="graf graf--p">Based on my experience with various certifications (during my career, I’ve had a chance to participate in PCI/DSS, ISO27001 and SOC 2), there are at least two primary ways of looking at and preparing for an audit.</p>
<h4 class="graf graf--h4">A Passive Approach</h4>
<p class="graf graf--p">You hire an auditing company, wait for them to hand you a list of requests, scramble to collect some evidence and keep going back and forth with them until you have a required minimum — just enough to pass the certification. If you miss some controls, the auditor often provides you with generic examples to be used. This approach is typical for large (and old-school) companies who view certification and compliance as an obligation.</p>
<p class="graf graf--p">Even though this is the cheapest (in the short term) way of achieving a certification, I am not a fan of this approach for multiple reasons:</p>
<ul class="postList">
<li class="graf graf--li">You often end up with a random set of processes and controls designed to fit a generic large company that are handed over to you by an outside consultant. Those processes often feel very formal and alien to a culture of a fast-moving startup.</li>
<li class="graf graf--li">By viewing the certification process as an obligation (something “we have to do”), you miss out on the opportunity to use it as a driver for improvement in all areas of your business: from infrastructure security to onboarding processes, to accounting, HR and so on.</li>
<li class="graf graf--li">Being generic, a lot of processes you introduce by being passive during a certification end up relying heavily on bureaucratic approach and are very manual. This may be too painful for a small company with a limited staff juggling different roles and responsibilities.</li>
</ul>
<p class="graf graf--p">In general, I do not believe a small to medium-sized company should use this approach when preparing for and going through any certification. By doing so, you are missing out on many potential benefits of compliance-related efforts.</p>
<h4 class="graf graf--h4">An Active Approach</h4>
<p class="graf graf--p">Another, drastically different approach to compliance is based on a simple idea — you have decided to get certified because you understand the value behind it, you’re spending resources on doing it, so you better use it as an opportunity to improve your business, your infrastructure, your team and gain as much as possible from the process. Here is how it works:</p>
<ul class="postList">
<li class="graf graf--li">First, you collect the list of requirements and <a class="markup--anchor markup--li-anchor" href="https://www.ssae-16.com/ssae-16-terminology/criteria/" target="_blank" rel="noopener" data-href="https://www.ssae-16.com/ssae-16-terminology/criteria/">criteria</a> that your company will be tested against during the audit.</li>
<li class="graf graf--li">Then, you analyze the current state of the company according to each of the criteria.</li>
<li class="graf graf--li">And, finally, you carefully map those lists to each other, looking for any gaps that you will need to fill.</li>
</ul>
<p class="graf graf--p">By actively analyzing the state of your company, you will understand what is missing and will be in a position to fix those issues by changing your infrastructure, introducing new processes, etc. You will understand not only what needs to be done, but why it is being done and, since you know how your company operates, you should be able to tailor those changes to your unique environment and make them feel much more natural. Another very important aspect of the active approach to compliance in a modern technical startup is that you should be able to automate a lot of your compliance needs, significantly reducing the additional workload caused by compliance-related changes within your company.</p>
<p class="graf graf--p">I was lucky to get introduced to this approach at <a class="markup--anchor markup--p-anchor" href="https://eligible.com/blog/eligible-announces-soc2-certification/" target="_blank" rel="noopener" data-href="https://eligible.com/blog/eligible-announces-soc2-certification/">Eligible</a> by <a class="markup--anchor markup--p-anchor" href="http://aaronbedra.com/" target="_blank" rel="noopener" data-href="http://aaronbedra.com/">Aaron Bedra</a>, and it has changed my view on compliance forever. Applying the same method at Swiftype only reinforced my conviction that compliance-related work in a small company may be hugely beneficial while being done in a non-disruptive way.</p>
<h3 class="graf graf--h3">Initial Gap Analysis</h3>
<p class="graf graf--p">As described above, the first step in our preparation for SOC 2 certification was so-called “gap analysis” — a process of mapping the list of <a class="markup--anchor markup--p-anchor" href="https://www.ssae-16.com/ssae-16-terminology/criteria/" target="_blank" rel="noopener" data-href="https://www.ssae-16.com/ssae-16-terminology/criteria/">criteria</a> for a certification with the current state of the company and finding all of the criteria that require additional controls and processes to be introduced within the company.</p>
<p class="graf graf--p">The most useful document during this step was the official list of Trust Services Criteria <a class="markup--anchor markup--p-anchor" href="http://www.aicpastore.com/Cybersecurity/trust-services-criteria/PRDOVR~PC-TSPC13/PC-TSPC13.jsp" target="_blank" rel="noopener" data-href="http://www.aicpastore.com/Cybersecurity/trust-services-criteria/PRDOVR~PC-TSPC13/PC-TSPC13.jsp">published on AICPA website</a>. The document contains a list of all criteria used during the audit and, what was enormously helpful, a list of illustrative risks and illustrative controls associated with each criterion. Those illustrative examples helped us better understand the reasoning behind each criterion and define what our internal controls should look like.</p>
<p class="graf graf--p">Based on the official documentation from AICPA, we created a large spreadsheet, which mapped SOC 2 criteria to illustrative risks, then each risk was mapped to an internal control we already had or needed to implement.</p>
<p class="graf graf--p">Here is a small snippet from the spreadsheet:</p>
</div>
<div class="section-inner sectionLayout--outsetColumn">
<figure class="graf graf--figure graf--layoutOutsetCenter">
<p><div style="max-width: 650px" class="wp-caption aligncenter"><img class="graf-image" src="https://cdn-images-1.medium.com/max/2000/1*ijW0ocmw8K8LvYbXwVXMlw.png" alt="" width="640" height="322" data-image-id="1*ijW0ocmw8K8LvYbXwVXMlw.png" data-width="2922" data-height="1470" /><p class="wp-caption-text">SOC 2 Criteria Mapping</p></div><figcaption class="imageCaption"></figcaption></figure>
</div>
<div class="section-inner sectionLayout--insetColumn">
<p class="graf graf--p">As you can see, control activities (specific things we do within the company to address different risks) within the document end up repeating, since one control activity often addresses multiple risks and hence applies to different criteria. After we collected a list of control activities, we grouped them into logical collections — internal controls within our company.</p>
<p class="graf graf--p">When the document was ready, it became the main tool used for preparation for the audit, helping us track the progress of implementation for each control activity and each control within the company.</p>
<h3 class="graf graf--h3">Designing Controls</h3>
<p class="graf graf--p">As I already mentioned before, the illustrative controls provided by AICPA within their Trust Services Criteria list were really helpful for guiding the process of designing our own internal controls. We would take each criterion, look at each illustrative risk and illustrative control and ask ourselves a simple question: how could we address the illustrative risk in the most efficient way using internal automation and other technological solutions at our disposal? The result would very often be much simpler than the illustrative control, but as long as it addressed the underlying risk, we were confident enough it would work for us.</p>
<p class="graf graf--p">Just as with any other aspect of building a company, there are many people who have designed and implemented compliance and security controls before, and it is always useful to understand what other people did and why before you make your own decisions. While designing our own controls, we looked at available public information on <a class="markup--anchor markup--p-anchor" href="http://www.aicpa.org/InterestAreas/FRC/AssuranceAdvisoryServices/DownloadableDocuments/SOC2_CSA_CCM_Report.pdf" target="_blank" rel="noopener" data-href="http://www.aicpa.org/InterestAreas/FRC/AssuranceAdvisoryServices/DownloadableDocuments/SOC2_CSA_CCM_Report.pdf">SOC 2</a> and <a class="markup--anchor markup--p-anchor" href="https://www.isaca.org/Journal/archives/2011/Volume-4/Pages/Planning-for-and-Implementing-ISO27001.aspx" target="_blank" rel="noopener" data-href="https://www.isaca.org/Journal/archives/2011/Volume-4/Pages/Planning-for-and-Implementing-ISO27001.aspx">ISO 27001</a> controls, talked to our peers within the industry and researched security controls used by our vendors (many companies publish information about their security controls or are willing to provide you with their SOC 2 reports). But we always strived to make controls our own — make sure they would fit within our existing culture, our existing processes, etc. Changing existing processes that worked for us for years was the last option, and we only did it when we could see a clear improvement for the company as the result of the change.</p>
<h3 class="graf graf--h3">Tracking the Implementation</h3>
<p class="graf graf--p">After we performed the initial gap analysis, we ended up with a very long list of control activities designed for our company. To make it easier to control the process of implementing those controls, we used Jira. Here are some ideas that helped us along the way:</p>
<ul class="postList">
<li class="graf graf--li">First, we created a dedicated Jira project for tracking our internal controls — each logically grouped set of control activities from the gap analysis document ended up being represented with a single CONTROL Jira issue, that would contain information about those control activities, map them to relevant SOC 2 criteria, etc.</li>
<li class="graf graf--li">Then we created Jira issues for our engineering and operations teams (TECHOPS and ENG in our case); one issue per control activity we needed to implement — this made sure that we would not drop anything on the floor during the implementation process and would be able to incorporate compliance-related work into our normal business operations and Jira-based sprint planning. All implementation Jira issues have been tagged with a “SOC2” label to make it easier to find them across different team projects.</li>
<li class="graf graf--li">Finally, we linked implementation Jira issues to controls by making implementation issues “block” controls — this made it very easy to tell what needed to be done before a control would be considered fully implemented at Swiftype by looking at a specific CONTROL issue and seeing all blocking implementation items on it.</li>
</ul>
<p class="graf graf--p">Here is an example snippet of a CONTROL issue from our internal Jira tracker:</p>
</div>
<div class="section-inner sectionLayout--outsetColumn">
<figure class="graf graf--figure graf--layoutOutsetCenter"><img class="graf-image" src="https://cdn-images-1.medium.com/max/2000/1*ayIdNocfqtWNoxZh_9cZrQ.png" alt="" width="638" height="460" data-image-id="1*ayIdNocfqtWNoxZh_9cZrQ.png" data-width="1870" data-height="1346" /></figure>
</div>
<div class="section-inner sectionLayout--insetColumn">
<h3 class="graf graf--h3">Internal Pre-Audit Control Testing</h3>
<p class="graf graf--p">As I explained at the beginning of the article, ever since the beginning of the process we aimed to pass the audit without any exceptions — we wanted to be sure our system was designed properly without any gaps between the compliance criteria and our internal controls. To ensure our audit would go as smoothly as possible, we performed internal control testing during the final stretch before our on-site visit from the auditors.</p>
<p class="graf graf--p">The testing was done using the following simple process:</p>
<ol class="postList">
<li class="graf graf--li">For each CONTROL issue listed in our Jira</li>
<li class="graf graf--li">Make sure all blocking implementation issues have been completed</li>
<li class="graf graf--li">Check each SOC 2 criteria related to a specific CONTROL, get a list of illustrative risks listed in the original document and make sure we:</li>
</ol>
<ul class="postList">
<li class="graf graf--li">Have relevant policies in place addressing the risk</li>
<li class="graf graf--li">Have automation in place providing us with alerts and audit trails addressing the risk</li>
<li class="graf graf--li">Could provide evidence of both the policies and automation if asked during the audit</li>
</ul>
<p class="graf graf--p">When we tested a control, we would mark it as Done in Jira, helping us track the controls that still needed attention.</p>
<p class="graf graf--p">This phase is where our very active and involved process finally met the old-school evidence-based process typically used by large companies. Since certification is based on providing auditors with evidence, they always require you to upload hundreds of pieces of content (documents, screenshots, logs, etc.) to their portals before the on-site audit. In turn, while doing our internal testing, we would always make sure we could provide any evidence required. This meant that after each test had been finished, we would upload relevant evidence pieces into the auditor portal and make notes on how it was obtained so that we could quickly do it again during the on-site audit.</p>
<h3 class="graf graf--h3">Our Findings and Future Plans</h3>
<p class="graf graf--p">During the on-site audit, we were often complimented by the auditor’s staff for being so well prepared and having our controls so well laid out. But most importantly, we have not noticed any slowdown in our team’s day-to-day operations after implementing all of our internal controls. I believe that is a true testament to the active and involved preparation process we have gone through and to all the automation we put in place, allowing our small team to continue focusing on building the product and the company instead of being slowed down by the old, paper-heavy process often associated with compliance.</p>
<p class="graf graf--p">We believe that many aspects of our company improved thanks to the compliance-related efforts of our team and all the changes we were able to make while guided by the reliable, industry-tested framework of SOC 2. We’re looking forward to providing <a class="markup--anchor markup--p-anchor" href="https://swiftype.com/security" target="_blank" rel="noopener" data-href="https://swiftype.com/security">safe and secure services to our customers</a> and are happy to have AICPA certify our ability to do so.</p>
</div>
</div>
</section>
</div>
</div>
</section>
<p>&nbsp;</p>
<p>&nbsp;</p>
<section class="section section--body section--last">
<div class="section-content">
<div class="section-inner sectionLayout--insetColumn">
<p id="b94f" class="graf graf--p graf-after--p graf--trailing">
</div>
</div>
</section>
]]></content:encoded>
			</item>
		<item>
		<title>My Favourite Books in 2017</title>
		<link>https://kovyrin.net/2018/01/02/my-favourite-books-in-2017/</link>
		<pubDate>Tue, 02 Jan 2018 02:09:34 +0000</pubDate>
		<dc:creator><![CDATA[Oleksiy Kovyrin]]></dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[Links]]></category>
		<category><![CDATA[2017]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[links]]></category>

		<guid isPermaLink="false">https://kovyrin.net/?p=834</guid>
		<description><![CDATA[Following the very ambitious and successful 2016 challenge, I have decided to keep the goal at the same level of 36 books for 2017 to prove to myself that it is sustainable and wasn’t a one-off success. Surprising myself, I have crushed the goal and finished 39 books this year. Below is summary of the best [&#8230;]]]></description>
				<content:encoded><![CDATA[<p id="d338" class="graf graf--p graf-after--h3">Following the very ambitious and successful <a class="markup--anchor markup--p-anchor" href="https://medium.com/@kovyrin/my-favourite-books-in-2016-4d401b51ffe9" target="_blank" data-href="https://medium.com/@kovyrin/my-favourite-books-in-2016-4d401b51ffe9">2016 challenge</a>, I have decided to keep the goal at the same level of 36 books for 2017 to prove to myself that it is sustainable and wasn’t a one-off success. Surprising myself, I have crushed the goal and finished 39 books this year. Below is summary of the best of those books.</p>
<h3 id="4ebf" class="graf graf--h3 graf-after--p">Business, Management and Leadership</h3>
<p id="8f43" class="graf graf--p graf-after--h3">After changing my job at the beginning of 2017 and returning to <a class="markup--anchor markup--p-anchor" href="https://swiftype.com/" target="_blank" rel="nofollow noopener" data-href="https://swiftype.com/">Swiftype</a> to focus on Technical Operations team leadership, I continued working on improving my skills in this area and read a number of truly awesome books:</p>
<ul class="postList">
<li id="4fb2" class="graf graf--li graf--startsWithDoubleQuote graf-after--p">“<a class="markup--anchor markup--li-anchor" href="http://amzn.to/2EuENb9" target="_blank" rel="nofollow noopener" data-href="http://amzn.to/2EuENb9">The Effective Executive: The Definitive Guide to Getting the Right Things Done</a>” by Peter F. Drucker — this classic has immediately become one of my favourite leadership books of all time. There are many useful lessons I learned from it (like the notion that all knowledge workers should consider themselves executives in some sense), but the most powerful was the part on executive time management.</li>
<li id="1403" class="graf graf--li graf--startsWithDoubleQuote graf-after--li">“<a class="markup--anchor markup--li-anchor" href="http://amzn.to/2EtFpNY" target="_blank" rel="nofollow noopener" data-href="http://amzn.to/2EtFpNY">Hatching Twitter: A True Story of Money, Power, Friendship, and Betrayal</a>” by Nick Bilton — A truly horrifying “Game of Thrones”-like story behind the early years of Twitter. I didn’t think shit like that actually happened in real life… I guess the book made me grow up a little and realize, that simply doing your best to push your company forward is not always enough. I’d highly recommend this book to anybody working in a fast growing company or thinking about starting a VC-backed business.</li>
<li id="157d" class="graf graf--li graf--startsWithDoubleQuote graf-after--li">“<a class="markup--anchor markup--li-anchor" href="http://amzn.to/2C8a4Pd" target="_blank" rel="nofollow noopener" data-href="http://amzn.to/2C8a4Pd">Shoe Dog: A Memoir by the Creator of NIKE</a>” by Phil Knight — a great story of a great company built by regular people striving for quality results. Heavily reinforces the notion that to be an entrepreneur you need to be a bit crazy and slightly masochistic. Overall, a very fascinating tale of a multi-decade development of a company — a strong contrast with all the modern stories about internet businesses. A must read for people thinking about starting a business.</li>
</ul>
<h3 id="ad00" class="graf graf--h3 graf-after--li">Health, Medicine and Mortality</h3>
<p id="3bbb" class="graf graf--p graf-after--h3">I have always been fascinated by the history of medicine, medical stories and the inner workings of the modern medical system. Unfortunately, this year I’ve had to interact with it a lot and that made me seriously consider the fact of our mortality. This has led me upon a quest to learn more about the topics of medicine, mortality and philosophy.</p>
<ul class="postList">
<li id="adc5" class="graf graf--li graf--startsWithDoubleQuote graf-after--p">“<a class="markup--anchor markup--li-anchor" href="http://amzn.to/2CCDzK0" target="_blank" rel="nofollow noopener" data-href="http://amzn.to/2CCDzK0">When Breath Becomes Air</a>” by Paul Kalanithi — Fantastic memoir! Terrifying, depressing, beautifully described story of a young neurosurgeon, his cancer diagnosis, his battle with the horrible disease and up to the very end of his life. I found the story of Paul very relatable and just like with <a class="markup--anchor markup--li-anchor" href="http://amzn.to/2hVrWa6" target="_blank" rel="nofollow noopener" data-href="http://amzn.to/2hVrWa6">Atul Gawande’s book I’ve read last year</a>, it brought forth very important questions on how should we deal with our own mortality. Paul gave us a great example of one of the options for how we may choose to spend our last days — the same way we may want to spend our lives: “<em class="markup--em markup--li-em">You can’t reach perfection, but you can believe in an asymptote toward which you are ceaselessly striving</em>”.</li>
<li id="f31c" class="graf graf--li graf--startsWithDoubleQuote graf-after--li">“<a class="markup--anchor markup--li-anchor" href="http://amzn.to/2lzLnUW" target="_blank" rel="nofollow noopener" data-href="http://amzn.to/2lzLnUW">The Emperor of All Maladies</a>” by Siddhartha Mukherjee — probably the best book on cancer out there (based on my limited research). The author takes us on a long, very interesting and terrifying trip through the dark ages of human war against cancer and explains why after so much time we are still only starting to understand how to deal with it and there is still a long road ahead. Highly recommended to anybody interested in the history of medicine or wants to understand more about the reason behind a malady that kills more than 8 million people each year.</li>
<li id="e09e" class="graf graf--li graf--startsWithDoubleQuote graf-after--li">“<a class="markup--anchor markup--li-anchor" href="http://amzn.to/2CaQQIZ" target="_blank" rel="nofollow noopener" data-href="http://amzn.to/2CaQQIZ">Complications: A Surgeon’s Notes on an Imperfect Science</a>” by Atul Gawande — once again, one of my favourite authors manages to explain a hard problem of complications in healthcare and give us a sobering look at the limits and fallibilities of modern medicine.</li>
<li id="6c15" class="graf graf--li graf-after--li">Bonus: “<a class="markup--anchor markup--li-anchor" href="http://amzn.to/2C7bZUt" target="_blank" rel="nofollow noopener" data-href="http://amzn.to/2C7bZUt">On The Shortness Of Life</a>” by Seneca — It is amazing how something written 2000 years ago can have such profound relevance today. I found this short book really inspiring and it has led me to start my road to adapting some of Stoic techniques including mindfulness and meditation.</li>
</ul>
<h3 id="f2ca" class="graf graf--h3 graf-after--li">Miscellaneous</h3>
<p id="6130" class="graf graf--p graf-after--h3">Few more books I found very interesting:</p>
<ul class="postList">
<li id="3a8c" class="graf graf--li graf--startsWithDoubleQuote graf-after--p">“<a class="markup--anchor markup--li-anchor" href="http://amzn.to/2DIpMRu" target="_blank" rel="nofollow noopener" data-href="http://amzn.to/2DIpMRu">Born a Crime: Stories From a South African Childhood</a>” by Trevor Noah — Listened to this book on Audible and absolutely loved it! Hearing Noah’s voice describing his crazy childhood in South Africa mixing fun and absolutely horrifying details of his life there and the struggles he had to endure being a coloured kid under and right after Apartheid.<br />
Even though it was never as scary as what Noah is describing in his book, I have found in his stories a lot of things I could relate to based on my childhood in late USSR and then in 1990s Ukraine which was going through an economic meltdown with all of the usual attributes like crime and crazy unemployment.</li>
<li id="802d" class="graf graf--li graf--startsWithDoubleQuote graf-after--li">“<a class="markup--anchor markup--li-anchor" href="http://amzn.to/2DJRVrq" target="_blank" rel="nofollow noopener" data-href="http://amzn.to/2DJRVrq">I Can’t Make This Up: Life Lessons</a>” by Kevin Hart — I have never been a particular fan of Kevin Hart. Not that I disliked him, just didn’t really follow his career. This book (I absolutely recommend the audiobook version!) ended up being one of the biggest literary surprises ever for me: it is the funniest inspirational read and the most inspiring comic memoir I’ve ever read (or, in this case, listened to). Kevin’s dedication to his craft, his work ethic and perseverance are truly inspiring and his success is absolutely well-earned.</li>
<li id="05b5" class="graf graf--li graf--startsWithDoubleQuote graf-after--li">“<a class="markup--anchor markup--li-anchor" href="http://amzn.to/2lF0NaH" target="_blank" rel="nofollow noopener" data-href="http://amzn.to/2lF0NaH">Kingpin: How One Hacker Took Over the Billion-Dollar Cybercrime Underground</a>” by Kevin Poulsen — Terrifying read… I’ve never realized how close the early years of my career as a systems administrator and developer took me to the crazy world of underground computer crime that was unfolding around us.<br />
I’ve spent a few weeks week wondering if doing what Max and other people in this story did is the result of an innate personality trait or just a set of coincidences, a bad hand the life deals a computer specialist, turning them into a criminal. For many people working in this industry, it is always about the craft, the challenge of building systems (just like the bind hack was for Max) and I am not sure there is a point in one’s career when you make a conscious decision to become a criminal. Unfortunately, even after finishing the book I don’t have an answer to this question.<br />
The book is a fascinating primer on the effects of bad and the need for good security in today’s computerized society and I’d highly recommend it to everybody working with computers on a daily basis.</li>
<li id="bba4" class="graf graf--li graf--startsWithDoubleQuote graf-after--li">“<a class="markup--anchor markup--li-anchor" href="http://amzn.to/2lCKZVO" target="_blank" rel="nofollow noopener" data-href="http://amzn.to/2lCKZVO">Modern Romance</a>” by Aziz Ansari — very interesting insight into the crazy modern world of dating and romance. Made me really appreciate the fact that I have already found the love of my life and hope will never need to participate in the technology-driven culture today’s singles have to deal with. Really recommend listening to the audiobook, Aziz is very funny even when he’s talking about a serious topic like this.</li>
<li id="62fa" class="graf graf--li graf--startsWithDoubleQuote graf-after--li">“<a class="markup--anchor markup--li-anchor" href="http://amzn.to/2lFhjai" target="_blank" rel="nofollow noopener" data-href="http://amzn.to/2lFhjai">The Year of Living Danishly: My Twelve Months Unearthing the Secrets of the World’s Happiest Country</a>” by Helen Russell — Really liked this book. It offers a glimpse into a society surprisingly different from what many modern North Americans would consider normal. Reading about all kinds of Danish customs, I would think back to the times I grew up in USSR and realize, that modern Danish life is very close to what was promised by the party back then. The only difference — they’ve managed to make it work long term.<br />
Even though not many of us could or want to relocate to Denmark or to affect our government policies, there is a lot in this book that many of us could apply in our lives: trusting people more, striving for a better work-life balance, exercising more, surrounding ourselves with beautiful things, etc.</li>
</ul>
<p id="861f" class="graf graf--p graf-after--li graf--trailing">I hope you enjoyed this overview of the best books I’ve read in 2017. Let me know you liked it!</p>
]]></content:encoded>
			</item>
		<item>
		<title>My Favourite Books in 2016</title>
		<link>https://kovyrin.net/2017/01/06/my-favourite-books-in-2016/</link>
		<pubDate>Fri, 06 Jan 2017 01:28:14 +0000</pubDate>
		<dc:creator><![CDATA[Oleksiy Kovyrin]]></dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[2016]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[reading]]></category>
		<category><![CDATA[startups]]></category>

		<guid isPermaLink="false">http://kovyrin.net/?p=829</guid>
		<description><![CDATA[I’ve planned to read 36 books in 2016 and managed to hit that number a few hours before the NY! The best of those 36 books are listed below. Business, Management and Leadership Considering the new role I’ve started in January 2016 (first-time CTO of a growing startup company), my reading last year was heavily [&#8230;]]]></description>
				<content:encoded><![CDATA[<p class="graf graf--p">I’ve <a class="markup--anchor markup--p-anchor" href="https://www.goodreads.com/user_challenges/3735102" target="_blank" data-href="https://www.goodreads.com/user_challenges/3735102">planned to read 36 books in 2016</a> and managed to hit that number a few hours before the NY! The best of those 36 books are listed below.</p>
<h3 class="graf graf--h3">Business, Management and Leadership</h3>
<p class="graf graf--p">Considering the new role I’ve started in January 2016 (first-time CTO of a growing startup company), my reading last year was heavily geared towards business, management and leadership topics. Here are my favourite books in this category:</p>
<ul class="postList">
<li class="graf graf--li graf--startsWithDoubleQuote">“<a class="markup--anchor markup--li-anchor" href="http://amzn.to/2iUnCon" target="_blank" data-href="http://amzn.to/2iUnCon">The Hard Thing About Hard Things: Building a Business When There Are No Easy Answers</a>” — in my opinion, a must-read book for anybody interested in starting a company or already building one. A treasure trove of great advice for startup founders on building and managing their teams.</li>
<li class="graf graf--li graf--startsWithDoubleQuote"><strong class="markup--strong markup--li-strong">“</strong><a class="markup--anchor markup--li-anchor" href="http://amzn.to/2jeY5dd" target="_blank" data-href="http://amzn.to/2jeY5dd">Crossing the Chasm: Marketing and Selling High-Tech Products to Mainstream Customers</a><strong class="markup--strong markup--li-strong">”</strong> — the author explains why so many companies, that find an initial product-market fit, subsequently fail to grow into leaders of their respective markets and often die a slow and painful death. The concept of a chasm and, especially, the idea of the whole product were very powerful for my understanding of what I felt in many companies I worked for — mainstream customers could not use your product unless they are provided with a minimum set of components and services to solve their problem. Very important read for leaders of modern SaaS companies, especially for API/platform enterprises.</li>
<li class="graf graf--li graf--startsWithDoubleQuote">“<a class="markup--anchor markup--li-anchor" href="http://amzn.to/2iIgVX2" target="_blank" data-href="http://amzn.to/2iIgVX2">Turn the Ship Around!: A True Story of Turning Followers into Leaders</a>” — an inspiring story of a navy captain transforming one of the worst-performing crews in the fleet into a perfectly functioning team by pushing control down to individual team members.</li>
<li class="graf graf--li graf--startsWithDoubleQuote">“<a class="markup--anchor markup--li-anchor" href="http://amzn.to/2iUmBwD" target="_blank" data-href="http://amzn.to/2iUmBwD">The Score Takes Care of Itself</a>” — inspiring story of one of the best sport team transformations and the man behind it, legendary coach Bill Walsh.</li>
</ul>
<h3 class="graf graf--h3">Miscellaneous</h3>
<p class="graf graf--p">Few more books I found very interesting:</p>
<ul class="postList">
<li class="graf graf--li graf--startsWithDoubleQuote">“<a class="markup--anchor markup--li-anchor" href="http://amzn.to/2iItkKp" target="_blank" data-href="http://amzn.to/2iItkKp">The Collapse of Parenting: How We Hurt Our Kids When We Treat Them Like Grown-Ups</a>” — maybe it is just a confirmation bias, but I absolutely loved this book. The author focuses on a few serious problems in today’s parenting and the resulting decline in the achievement and psychological health of American children. He finally managed put into words something that was bothering me for 10 years since moving to Canada. Now that I became a parent and would have to raise a child in this environment, I was glad to hear that I wasn’t crazy not to agree with the approach that is being pushed on modern parents by American society.</li>
<li class="graf graf--li graf--startsWithDoubleQuote">“<a class="markup--anchor markup--li-anchor" href="http://amzn.to/2hVrWa6" target="_blank" data-href="http://amzn.to/2hVrWa6">Being Mortal: Medicine and What Matters in the End</a>” — one of my favourite authors, Atul Gawande, explores the current state of end of life care in the USA, Canada, and Western Europe. Terrifying at first, the book makes you consider your own mortality and think about the choices you are bound to make eventually for yourself and, potentially, for your close family members.</li>
<li class="graf graf--li graf--startsWithDoubleQuote">“<a class="markup--anchor markup--li-anchor" href="http://amzn.to/2iMwJKJ" target="_blank" data-href="http://amzn.to/2iMwJKJ">Sapiens: A Brief History of Humankind</a>” — a captivating overview of our history as human species: from 70,000 years ago until the 20th century: how we evolved, how we affected other species on the planet and how did we end up where we are today. A long, but very interesting read!</li>
<li class="graf graf--li graf--startsWithDoubleQuote">“<a class="markup--anchor markup--li-anchor" href="http://amzn.to/2iInwQY" target="_blank" data-href="http://amzn.to/2iInwQY">The Road To Sparta: Retracing the Ancient Battle and Epic Run that Inspired the World’s Greatest Foot Race</a>” — fascinating story of Dean Karnazes (one of the most famous ultra-distance runners in the world) and his exploration of the legend of the Marathon. Highly recommended to anybody interested in running.</li>
<li class="graf graf--li graf--startsWithDoubleQuote">“<a class="markup--anchor markup--li-anchor" href="http://amzn.to/2iIuhT6" target="_blank" data-href="http://amzn.to/2iIuhT6">Catastrophic Care: How American Health Care Killed My Father — and How We Can Fix It</a>” — very detailed overview of what is broken in US healthcare today. Even if you don’t have anything to do with US healthcare market, the book is a great collection of stories about side-effects of what initially looked like great ideas, but ended up screwing the system even further.</li>
</ul>
<h3 class="graf graf--h3">Fiction</h3>
<p class="graf graf--p">I was always a huge fan of sci-fi fiction and this past year I have discovered a few real gems that ended up on my all time favourite list:</p>
<ul class="postList">
<li class="graf graf--li graf--startsWithDoubleQuote">“<a class="markup--anchor markup--li-anchor" href="http://amzn.to/2iIpnoR" target="_blank" data-href="http://amzn.to/2iIpnoR">Remembrance of Earth’s Past (aka The Three Body Problem)</a>” series by a Chinese author Liu Cixin — huge universe, highly-detailed and powerful characters, timeline spanning centuries — you can find all of it here. But on top of the standard components of a good space opera, there is this previously unknown to me layer of Chinese culture, language, philosophy.<br />
This trilogy has become an instant classic for me and is in the top-10 of my all time favourites next to Asimov’s “Foundation” and Peter F. Hamilton’s “Void”.</li>
<li class="graf graf--li"><a class="markup--anchor markup--li-anchor" href="http://amzn.to/2j8B5by" target="_blank" data-href="http://amzn.to/2j8B5by">Everything from Niel Gainman</a>! Up until this year when I got exposed to his writing, I’ve never realized how much pleasure one could get from reading prose. I’m not sure how he does it, but if he were to publish a book of obituaries or classifieds, I’d be willing to read that too — I enjoyed his English so much! Favourite books so far: “<a class="markup--anchor markup--li-anchor" href="http://amzn.to/2iIsA8a" target="_blank" data-href="http://amzn.to/2iIsA8a">The Graveyard Book</a>” and “<a class="markup--anchor markup--li-anchor" href="http://amzn.to/2iInVTv" target="_blank" data-href="http://amzn.to/2iInVTv">The Ocean at the End of the Lane</a>”.</li>
</ul>
<p class="graf graf--p">I hope you enjoyed this overview of the best books I’ve read in 2016. Let me know you liked it!</p>
]]></content:encoded>
			</item>
		<item>
		<title>DbCharmer Development: I Give Up</title>
		<link>https://kovyrin.net/2014/11/14/dbcharmer-suspended/</link>
		<pubDate>Fri, 14 Nov 2014 04:17:50 +0000</pubDate>
		<dc:creator><![CDATA[Oleksiy Kovyrin]]></dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[My Projects]]></category>
		<category><![CDATA[DbCharmer]]></category>

		<guid isPermaLink="false">http://kovyrin.net/?p=810</guid>
		<description><![CDATA[About 6 years ago (feels like an eternity in Rails world) working at Scribd I&#8217;ve started working on porting our codebase from some old version or Rails to a slightly newer one. That&#8217;s when I realized, that there wasn&#8217;t a ruby gem to help us manage MySQL connections for our vertically sharded databases (different models [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>About 6 years ago (feels like an eternity in Rails world) working at Scribd I&#8217;ve started working on porting our codebase from some old version or Rails to a slightly newer one. That&#8217;s when I realized, that there wasn&#8217;t a ruby gem to help us manage MySQL connections for our vertically sharded databases (different models on different servers). I&#8217;ve started hacking on some code to replace whatever we were using back then, finished the first version of the migration branch and then decided to open the code for other people to use. That&#8217;s how the DbCharmer ruby gem was born.</p>
<p>For the next few years a lot of new functionality we needed has been added to the gem, making it more complex and immensely more powerful. I&#8217;ve enjoyed working on it, developing those features, contributing to the community. But then I left Scribd, stopped being a user of DbCharmer and the situation drastically changed. For quite some time (years) I would keep fighting to make the code work with newer and newer versions of Rails, struggling to wrap my head around more and more (sometimes useless) abstractions Rails Core team decided to throw into ActiveRecord. </p>
<p>Finally, in the last 2 years (while trying to make DbCharmer compatible with Rails 4.0) it has become more and more apparent, that I simply do not want to do this anymore. I do not need DbCharmer to support Rails 4.0+, while it is very clear that many users need it and constant nagging in the issues and the mailing list, asking for updates generated a lot of anxiety for me, anxiety I couldn&#8217;t do much about (the worst kind). As the result, since I simply do not see any good reasons to keep fighting this uphill battle (and developing stuff like this for ActiveRecord IS a constant battle!) I officially give up.</p>
<p><span id="more-810"></span></p>
<p>After some long and painful consideration I&#8217;ve decided to officially suspend the project. Here is what the suspension means in this case:</p>
<ul>
<li>I will stop making any changes in DbCharmer code</li>
<li>Pull Requests and Issues functionality on the project repository will be disabled (I will dump the issues somewhere for future reference, but no new messages could be added)</li>
<li>There will be a huge message in the project README explaining that no Rails versions beyond the latest 3.2.x are supported and there are no plans to do any development to make the code work with Rails 4.0+</li>
<li>Project mailing list will be disabled</li>
<li>Project website will be moved to a github domain (with the same message explaining the project status)</li>
</ul>
<p>I&#8217;m really sorry if any of the users of the project still had some hopes regarding the Rails4 branch and potential upgrade to the newer Rails versions, but 3.2.x will be the last version officially supported by the project.</p>
<hr/>
<p>Now, here are my answers to the questions that people have asked me about this decision (I&#8217;ve talked to a few of the largest users of the project already):</p>
<p><b>Are you going to kill the repo?</b> – No, the repository (and even the rails4 branch) are going to stay intact. I&#8217;m just going to clearly mark it as inactive to make sure people do not try to use it with new Rails versions or expect the project to support those in the future.</p>
<p><b>What about Rubygems?</b> – All rubygems versions released up until this point will stay active and accessible as long as rubygems is alive. Though no updates will be provided for any Rails versions beyond 3.2.x.</p>
<p><b>Why not crowdfund the development?</b> – This is a really tough issue I struggled with for a long time. The problem here is that for many years now I had been very fortunate to be in a position when I&#8217;m not motivated by the money anymore. So crowdfunding the development would only increase my anxiety 10x, while not really changing the situation on the motivation side. That&#8217;s the opposite of what I need at this point.</p>
<p><b>What if you need DbCharmer functionality on your current or some next job?</b> – This is why I&#8217;m not deleting the repo, gems, etc and calling it a suspension and not a closure <img src="https://s.w.org/images/core/emoji/2.3/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> There is a chance, that one day I will end up in a situation, where I will really need all those wonderful features I&#8217;ve enjoyed with DbCharmer for years. And I&#8217;m pretty sure, that unless there will be another project available on the market, I will try to revive the project (or build something new upon the most important pieces of DbCharmer codebase). But nobody knows what will happen, so for now the project is suspended.</p>
<p><b>Can I help with the development? Maybe send in a patch?</b> – Another very tough issue. Accepting patches still requires a lot of time and dedication to review, understand and test them. And that is not something I want to do at this point. The only real way to resume the development of the project at this point would be to transfer the ownership to somebody else. But unless someone creates a fork, shows a true dedication to the project (making sure all the incoming changes are 100% test-covered and battle-tested, etc), I&#8217;m not ready to do that. If you have some ideas on this matter, you could ping me any time.</p>
]]></content:encoded>
			</item>
		<item>
		<title>Interesting Resources for Technical Operations Engineers</title>
		<link>https://kovyrin.net/2013/09/23/techops-resources/</link>
		<comments>https://kovyrin.net/2013/09/23/techops-resources/#comments</comments>
		<pubDate>Mon, 23 Sep 2013 04:15:57 +0000</pubDate>
		<dc:creator><![CDATA[Oleksiy Kovyrin]]></dc:creator>
				<category><![CDATA[Admin-tips]]></category>
		<category><![CDATA[Links]]></category>
		<category><![CDATA[My Projects]]></category>
		<category><![CDATA[blogs]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[devops]]></category>
		<category><![CDATA[operations]]></category>
		<category><![CDATA[podcasts]]></category>
		<category><![CDATA[systems administration]]></category>
		<category><![CDATA[technical operations]]></category>
		<category><![CDATA[techops]]></category>

		<guid isPermaLink="false">http://kovyrin.net/?p=708</guid>
		<description><![CDATA[As a leader of a technical operations team I often have to work on technical operations engineer hiring. This process involves a lot of interviews with candidates and during those interviews along with many challenging practical questions I really love to ask questions like &#8220;What are the most important resources you think an Operations Engineer [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>As a leader of a technical operations team I often have to work on technical operations engineer hiring. This process involves a lot of interviews with candidates and during those interviews along with many challenging practical questions I really love to ask questions like &#8220;What are the most important resources you think an Operations Engineer should follow?&#8221;, &#8220;What books in your opinion are must-read for a techops engineer?&#8221; or &#8220;Who are your personal heroes in IT community?&#8221;. Those questions often give me a lot of information about candidates, their experience, who they are looking up to in the community, what they are interested in, and if they are actively working on improving their professional level.</p>
<p>Recently, one of the candidates asked me to share my lists with him and I thought this information could be valuable to other people so I have decided to share it here on my blog.</p>
<p><span id="more-708"></span></p>
<hr />
<h3>Must-Read Books List</h3>
<p>First of all, I would like to share a list of books I believe every professional in our field should read at some point in their life. You may notice that many of these books are not too technical or are not really related to the pure systems administration part of a techops job. I still think those are very important because technical operations work on senior levels involves much more than just making sure things work as expected. A lot of it involves time management, crisis management and many other topics that are equally important for a professional in this field.</p>
<p>So, here is the list (with not particular ordering, grouped by topics):</p>
<p><strong>Systems and Networks Administration</strong></p>
<ul>
<li><a href="http://www.amazon.com/gp/product/0321637739/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0321637739&amp;linkCode=as2&amp;tag=techops-20">Advanced Programming in the UNIX Environment</a><br />
by W. Richard Stevens and Stephen A. Rago</li>
<li><a href="http://www.amazon.com/gp/product/B007I8S1TY/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B007I8S1TY&amp;linkCode=as2&amp;tag=techops-20">High Performance MySQL: Optimization, Backups, and Replication</a><br />
by Baron Schwartz, Peter Zaitsev and Vadim Tkachenko</li>
<li><a href="http://www.amazon.com/gp/product/0131480057/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0131480057&amp;linkCode=as2&amp;tag=techops-20">UNIX and Linux System Administration Handbook</a><br />
by Evi Nemeth, Garth Snyder, Trent R. Hein and Ben Whaley</li>
</ul>
<p><strong>Technical Operations, Architecture, Scalability</strong></p>
<ul>
<li><a href="http://www.amazon.com/gp/product/B0043M4Z34/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B0043M4Z34&amp;linkCode=as2&amp;tag=techops-20">Web Operations: Keeping the Data On Time</a><br />
by John Allspaw and Jesse Robbins</li>
<li><a href="http://www.amazon.com/gp/product/B00A32NXZO/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B00A32NXZO&amp;linkCode=as2&amp;tag=techops-20">Release It!: Design and Deploy Production-Ready Software</a><br />
by Michael T. Nygard</li>
<li><a href="http://www.amazon.com/gp/product/B001M60BLE/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B001M60BLE&amp;linkCode=as2&amp;tag=kovyrin-20">Scalable Internet Architectures</a><br />
by Theo Schlossnagle</li>
<li><a href="http://www.amazon.com/gp/product/B0026OR2Y0/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B0026OR2Y0&amp;linkCode=as2&amp;tag=techops-20">The Art of Capacity Planning: Scaling Web Resources</a><br />
by John Allspaw</li>
</ul>
<p><strong>Project, Release and Time Management</strong></p>
<ul>
<li><a href="http://www.amazon.com/gp/product/B00AZRBLHO/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B00AZRBLHO&amp;linkCode=as2&amp;tag=techops-20">The Phoenix Project: A Novel About IT, DevOps, and Helping Your Business Win</a><br />
by Gene Kim, Kevin Behr and George Spafford</li>
<li><a href="http://www.amazon.com/gp/product/B0057H2M70/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B0057H2M70&amp;linkCode=as2&amp;tag=techops-20">Kanban: Successful Evolutionary Change for Your Technology Business</a><br />
by David J. Anderson</li>
<li><a href="http://www.amazon.com/gp/product/0321601912/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0321601912&amp;linkCode=as2&amp;tag=kovyrin-20">Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation</a><br />
by Jez Humble and David Farley</li>
<li><a href="http://www.amazon.com/gp/product/B000FC0SWS/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B000FC0SWS&amp;linkCode=as2&amp;tag=techops-20">The Power of Full Engagement: Managing Energy, Not Time, is the Key to High Performance and Personal Renewal</a><br />
by Jim Loehr and Tony Schwartz</li>
</ul>
<p><strong>Other</strong></p>
<ul>
<li><a href="http://www.amazon.com/gp/product/B000FC0O7M/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B000FC0O7M&amp;linkCode=as2&amp;tag=techops-20">Failure Is Not an Option: Mission Control from Mercury to Apollo 13 and Beyond</a><br />
by Gene Kranz</li>
<li><a href="http://www.amazon.com/gp/product/B008EKF87S/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B008EKF87S&amp;linkCode=as2&amp;tag=techops-20">Team Geek: A Software Developer&#8217;s Guide to Working Well with Others</a><br />
by Brian W. Fitzpatrick and Ben Collins-Sussman</li>
<li><a href="http://www.amazon.com/gp/product/B0083DJWGO/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B0083DJWGO&amp;linkCode=as2&amp;tag=techops-20">Antifragile: Things That Gain from Disorder</a><br />
by Nassim Nicholas Taleb</li>
<li><a href="http://www.amazon.com/gp/product/B00BL0OZ0E/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B00BL0OZ0E&amp;linkCode=as2&amp;tag=techops-20">The Field Guide to Understanding Human Error</a><br />
by Sidney Dekker</li>
<li><a href="http://www.amazon.com/gp/product/B009KOE1W0/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B009KOE1W0&amp;linkCode=as2&amp;tag=techops-20">Behind Human Error</a><br />
by David D. Woods, Sidney Dekker, Richard Cook, Leila Johannesen</li>
</ul>
<p>For more information on interesting books for technical operations engineers, you can check out the following book lists on GoodReads:</p>
<ul>
<li><a href="http://www.goodreads.com/list/show/30720.DevOps_Reading_List">DevOps Reading List</a></li>
<li><a href="http://www.goodreads.com/list/show/43193.Surge_2013_Reading_List">Surge 2013 Reading List</a></li>
</ul>
<hr />
<h3>Interesting Conferences</h3>
<p>Conferences, in my opinion, are an essential part in professional development of any engineer. Here is a list of conferences that could be useful for techops engineers:</p>
<ul>
<li><a href="http://surge.omniti.com/" target="_blank">Surge Conference</a> &#8211; in my opinion, this is definitely one of the best conferences dedicated to building and maintaining large web architectures. If I were to choose one conference a year to go to, it would definitely be Surge. Videos from previous years are freely available online: <a href="http://surge.omniti.com/2010/speakers/" target="_blank">2010</a>, <a href="http://surge.omniti.com/2011/speakers/" target="_blank">2011</a>, <a href="http://surge.omniti.com/2012/speakers/" target="_blank">2012</a>. 2013 videos should be available soon as well.</li>
<li><a href="http://velocityconf.com/" target="_blank">Oreilly&#8217;s Velocity Conference</a> &#8211; biggest and, probably, the oldest web operations and web performance event. In my opinion, recently it became too focused on web frontend performance, though it is still a really interesting event. Complete video compilations from the conference are available for sale: <a href="http://shop.oreilly.com/product/0636920021551.do" target="_blank">2011</a>, <a href="http://shop.oreilly.com/product/0636920027140.do" target="_blank">2012</a>, <a href="http://shop.oreilly.com/product/0636920030881.do" target="_blank">2013</a>.</li>
<li><a href="http://monitorama.com/" target="_blank">Monitorama Conference</a> &#8211; pretty new, but already very popular conference with interesting content for everyone interested in monitoring (which most ops engineers are). Sides and videos from the first ever Monitorama conference in 2013 are <a href="http://monitorama.com/#speakers" target="_blank">available online</a>.</li>
<li><a href="http://www.percona.com/live/conferences" target="_blank">Percona Live Conference</a> &#8211; really awesome event for anybody who has MySQL in their stack. Huge multi-track event with talks from the best and brightest people in MySQL community. Slides and keynote videos from 2013 event are <a href="http://www.percona.com/live/mysql-conference-2013/" target="_blank">available online</a>.</li>
<li><a href="http://devopsdays.org/" target="_blank">DevOps Days</a> &#8211; small <a href="http://devopsdays.org/events/" target="_blank">events</a> happening all around the world and becoming more and more popular. The major topic of these conferences is the DevOps movement, related team/project management practices, etc. <a href="http://vimeo.com/user9086015/albums/sort:date/format:thumbnail" target="_blank">Videos</a> and <a href="http://devopsdays.org/presentations/" target="_blank">slides from some of the events</a> are available online.</li>
</ul>
<p>Even if you do not have time to watch any of those conference videos, I think every operations engineer out there would really enjoy 2011 Surge Conference closing plenary session video where Theo Schlossnagle (one of my personal heroes in IT community) described a typical debugging session many of us go through every once in a while:</p>
<div class="video"><iframe src="//www.youtube.com/embed/ieCTIPG43no" width="300" height="150" frameborder="0" allowfullscreen="allowfullscreen"><br />
</iframe></div>
<hr />
<h3>Interesting Web Resources</h3>
<p>And last, but certainly not least, I would like to share a list of web resources I like to follow to stay up to date on the most recent news and fresh ideas within the web operations community and related areas:</p>
<p><b>Leading Industry Sites and Blogs</b></p>
<ul>
<li><a href="http://www.mysqlperformanceblog.com/">MySQL Performance Blog</a> from Percona &#8211; one of the best resources on MySQL performance</li>
<li><a href="http://highscalability.com/">High Scalability</a> &#8211; awesome resource with a lot of great articles on scalability, performance and design of large scale systems</li>
<li><a href="http://www.kitchensoap.com/">Kitchen Soap</a> &#8211; Blog by John Alspaw (another of my personal heroes in IT field)</li>
<li><a href="http://www.planetdevops.net/">DevOps Community Planet</a> &#8211; feed/news aggregator for the DevOps community</li>
<li><a href="http://www.reddit.com/r/devops/">DevOps Community on Reddit</a> &#8211; not too active, but still a useful resource for getting interesting news</li>
<li><a href="http://agilesysadmin.net/">Agile Sysadmin</a> &#8211; Blog of Stephen Nelson-Smith</li>
<li><a href="http://obfuscurity.com/">obfuscurity</a> &#8211; Blog by Jason Dixon, maintainer of Graphite, author of Descartes, Tasseo and other useful tools for metrics collection and displaying</li>
<li><a href="http://theagileadmin.com/">The Agile Admin</a> &#8211; Many interesting thoughts on agile web operations and devops</li>
<li><a href="http://www.opsbs.com/">Operation Bootstrap</a> &#8211; Blog of Aaron Nichols talking about many different aspects of working in operations</li>
</ul>
<p><b>Engineering Blogs of Large Web Companies</b></p>
<ul>
<li><a href="http://codeascraft.com/">Code as Craft</a> &#8211; Etsy Development and Operations blog</li>
<li><a href="https://blog.twitter.com/engineering">Twitter Engineering Blog</a></li>
<li><a href="http://techblog.netflix.com/">Netflix Tech Blog</a></li>
<li><a href="http://engineering.linkedin.com/blog">LinkedIn Engineering Blog</a></li>
</ul>
<p><b>Podcasts</b></p>
<ul>
<li><a href="http://5by5.tv/changelog">Changelog</a> &#8211; member-supported podcast on 5by5 network talking about interesting open source projects</li>
<li><a href="http://foodfightshow.org/">Food Fight</a> &#8211; bi-weekly podcast for Chef community</li>
<li><a href="http://devopscafe.org/">DevOps Cafe</a> &#8211; interviews with interesting members of DevOps community</li>
<li><a href="http://theshipshow.com/">The Ship Show</a> &#8211; twice-monthly podcast, featuring discussion on everything from build engineering to DevOps to release management, plus interviews, new tools and techniques, and reviews</li>
</ul>
<hr />
<p>And this is it! I hope these lists would be useful for young engineers going into the technical operations and for people who already work in this space. I am going to try to regularly update this post in the future to make sure it stays relevant for a long time.</p>
]]></content:encoded>
			<wfw:commentRss>https://kovyrin.net/2013/09/23/techops-resources/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Join Me at Swiftype!</title>
		<link>https://kovyrin.net/2013/09/18/swiftype-techops/</link>
		<comments>https://kovyrin.net/2013/09/18/swiftype-techops/#comments</comments>
		<pubDate>Wed, 18 Sep 2013 20:10:57 +0000</pubDate>
		<dc:creator><![CDATA[Oleksiy Kovyrin]]></dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[My Projects]]></category>
		<category><![CDATA[devops]]></category>
		<category><![CDATA[hiring]]></category>
		<category><![CDATA[operations]]></category>
		<category><![CDATA[swiftype]]></category>
		<category><![CDATA[sysops]]></category>
		<category><![CDATA[technical operations]]></category>
		<category><![CDATA[techops]]></category>

		<guid isPermaLink="false">http://kovyrin.net/?p=691</guid>
		<description><![CDATA[As you may have heard, last January I have joined Swiftype &#8211; an early stage startup focused on changing local site search for the better. It has been a blast for the past 8 months, we have done a lot of interesting things to make our infrastructure more stable and performant, immensely increased visibility into [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>As you <a href="http://kovyrin.net/2013/01/31/new-chapter-swiftype/" target="_blank">may have heard</a>, last January I have joined <a href="https://swiftype.com">Swiftype</a> &#8211; an early stage startup focused on changing local site search for the better. It has been a blast for the past 8 months, we have done a lot of interesting things to make our infrastructure more stable and performant, immensely increased visibility into our performance metrics, developed a strong foundation for the future growth of the company. Now we are looking to <a href="https://swiftype.com/jobs" target="_blank">expand our team</a> with great developers and technical operations people to push our infrastructure and the product even further.</p>
<p>Since I have joined Swiftype, I have been mainly focused on improving the infrastructure through better automation and monitoring, and worked on our backend code. Now I am looking for a few good operations engineers to join my team to work on a few key projects like building a new multi-datacenter infrastructure, creating a new data storage for our documents data, improving high-availability of our core services and much more.</p>
<p>To help us improve our infrastructure we are looking both for <a href="https://swiftype.com/jobs/senior-techops-engineer">senior operations engineers</a> and for more junior <a href="https://swiftype.com/jobs/techops-engineer">techops people</a> that we could help grow and develop within the company. Both positions could be either remote or we could assist you with relocation to San Francisco if you want to work in our office.</p>
<p>If you are interested, you can <a href="http://kovyrin.net/2009/02/07/rails-developer-for-a-large-startup-my-vision-of-an-ideal-candidate/" target="_blank">take a look</a> at an old, but still pretty relevant post I wrote many years ago on what I believe an ops candidate should know. And, of course, if you have any questions regarding these positions in Swiftype, please email me at <a href="mailto:kovyrin@swiftype.com">kovyrin@swiftype.com</a> or use any <a href="http://kovyrin.net/contact/" target="_blank">other means for contacting me</a> and I will try to get back to you as soon as possible. If you know someone who may be a great fit for these positions, please let them know!</p>
]]></content:encoded>
			<wfw:commentRss>https://kovyrin.net/2013/09/18/swiftype-techops/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
