<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Oleh’s Substack]]></title><description><![CDATA[My personal Substack]]></description><link>https://olehbezhenar.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!W6nz!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Folehbezhenar.substack.com%2Fimg%2Fsubstack.png</url><title>Oleh’s Substack</title><link>https://olehbezhenar.substack.com</link></image><generator>Substack</generator><lastBuildDate>Thu, 09 Apr 2026 02:23:16 GMT</lastBuildDate><atom:link href="https://olehbezhenar.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Oleh Bezhenar]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[olehbezhenar@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[olehbezhenar@substack.com]]></itunes:email><itunes:name><![CDATA[Oleh Bezhenar]]></itunes:name></itunes:owner><itunes:author><![CDATA[Oleh Bezhenar]]></itunes:author><googleplay:owner><![CDATA[olehbezhenar@substack.com]]></googleplay:owner><googleplay:email><![CDATA[olehbezhenar@substack.com]]></googleplay:email><googleplay:author><![CDATA[Oleh Bezhenar]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Data Pipeline Patterns]]></title><description><![CDATA[When you want to prepare application data for analysis, you need to create a process called a data pipeline.]]></description><link>https://olehbezhenar.substack.com/p/data-pipeline-patterns</link><guid isPermaLink="false">https://olehbezhenar.substack.com/p/data-pipeline-patterns</guid><dc:creator><![CDATA[Oleh Bezhenar]]></dc:creator><pubDate>Sat, 07 Oct 2023 06:06:42 GMT</pubDate><content:encoded><![CDATA[<p>When you want to prepare application data for analysis, you need to create a process called a data pipeline. This process collects, prepares, transforms, and transfers the data from an application to a data storage place like a data lake. It's important to carefully think about the requirements for this data pipeline because they involve specific rules.</p><p>There are generally three patterns for data pipelines:</p><ol><li><p>Extract Transform Load (ETL): In this pattern, data is first collected and filtered if necessary. Then, it's aggregated and processed before being stored in a data warehouse. ETL works well when data consistency is crucial, like historical data. However, it has downsides like slower speed, complexity, and limited scalability. Popular tools for this pattern include Apache Spark, AWS Glue, and Azure Data Factory.</p></li><li><p>Extract Load Transform (ELT): Similar to ETL, data is first collected, but instead of processing it right away, the raw data is stored first. Then, it's transformed within the data warehouse. ELT is suitable for situations that need more flexibility or when the data isn't fully structured. However, it requires a data warehouse with robust transformation capabilities, which adds to management efforts. Most popular solutions support this pattern, except AWS Glue.</p></li><li><p>Extract Transform Load Transform (ETLT): This approach is a hybrid, aiming to balance ETL's consistency and ELT's flexibility. Data is partially pre-processed, then stored, and finally processed again to its desired format. While it offers some consistency and speed benefits, it demands more planning and effort during the design stage. It's useful for scenarios requiring complex data transformations.</p></li></ol>]]></content:encoded></item><item><title><![CDATA[TOML]]></title><description><![CDATA[YAML, JSON, INI, and TOML are popular choices for configuration files, and they are replacing XML for good.]]></description><link>https://olehbezhenar.substack.com/p/toml</link><guid isPermaLink="false">https://olehbezhenar.substack.com/p/toml</guid><dc:creator><![CDATA[Oleh Bezhenar]]></dc:creator><pubDate>Fri, 06 Oct 2023 02:45:01 GMT</pubDate><content:encoded><![CDATA[<p>YAML, JSON, INI, and TOML are popular choices for configuration files, and they are replacing XML for good. While the first three are familiar and straightforward, TOML (Tom's Obvious Minimal Language) is an interesting choice.</p><p>The official description of TOML says:</p><blockquote><p>TOML aims to be a simple configuration file format that's easy to read because it has clear rules. TOML is designed to easily turn into a data structure, like a table or a dictionary, in many programming languages. TOML should be easy to change into data structures in many different programming languages.</p></blockquote><p>TOML lets you create objects, which are called tables here, using a simple syntax that avoids the need for nesting objects. For example:</p><pre><code><code>[parent-object] field1 = "the value" [parent-object.child-object] field2 = "another value"</code></code></pre><p>The same goes for arrays of objects:</p><pre><code><code>[[user]] id = "1" name = "user1" [[user]] id = "2" name = "user2"</code></code></pre><p>Another interesting feature is its support for date and time:</p><pre><code><code>ldt1 = 1979-05-27T07:32:00 ldt2 = 1979-05-27T00:32:00.999999</code></code></pre><p>In terms of file size, TOML generally falls between JSON and YAML.</p>]]></content:encoded></item><item><title><![CDATA[Personal Productivity System]]></title><description><![CDATA[Organizing your life isn't a one-size-fits-all solution.]]></description><link>https://olehbezhenar.substack.com/p/personal-productivity-system</link><guid isPermaLink="false">https://olehbezhenar.substack.com/p/personal-productivity-system</guid><dc:creator><![CDATA[Oleh Bezhenar]]></dc:creator><pubDate>Thu, 05 Oct 2023 03:34:25 GMT</pubDate><content:encoded><![CDATA[<p>Organizing your life isn't a one-size-fits-all solution. Everyone has their own journey to find what works for them. During my journey, I've tried different methods. Some didn't work, and some did. Here's what didn't work for me:</p><p>Methods That Didn't Work:</p><ol><li><p><strong>Kanban/Scrum for Personal Use:</strong></p><ul><li><p>These methods are great for projects but require a lot of effort when you have various projects, chores, and daily tasks.</p></li><li><p>When the board gets filled with too many tasks, it becomes overwhelming. Tools like Trello didn't help me manage my tasks effectively.</p></li></ul></li><li><p><strong>GTD (Getting Things Done):</strong></p><ul><li><p>GTD works well for structured projects, but it started to break down for me over time.</p></li><li><p>The "Sometimes/Maybe Later" category became a mess with too many projects and tasks without clear start dates.</p></li></ul></li><li><p><strong>Bullet Journaling:</strong></p><ul><li><p>While I liked the idea of a paper-based system, it didn't work for me because many of my projects are digital.</p></li></ul></li></ol><p>What I'm Looking For:</p><p>Through these experiences, I've figured out what I need in an organizational system:</p><ul><li><p><strong>Quick Capture:</strong>&nbsp;I want a system that lets me record ideas quickly without delay.</p></li><li><p><strong>Inbox:</strong>&nbsp;During idea capture, I don't want to worry about when or where to do something. I need a simple inbox to collect my ideas.</p></li><li><p><strong>Projects and Tags:</strong>&nbsp;Projects are great for grouping tasks by goals, while tags help categorize tasks by context for better planning.</p></li><li><p><strong>Scalability:</strong>&nbsp;The system should be easy for everyday tasks but also flexible for bigger projects.</p></li><li><p><strong>Centralization:</strong>&nbsp;Using multiple tools for personal organization is a hassle. I want one simple system to stick with.</p></li><li><p><strong>Resilience:</strong>&nbsp;Sometimes, I step away from my system, and when I return, I want to pick up where I left off, not start over.</p></li></ul><p>What Works for Me:</p><p>Currently, I'm using a simple to-do app like Todoist or TickTick. It supports projects and tags. I don't use a "sometimes/maybe" folder; instead, I schedule all tasks I'm actively working on and keep the rest under filter "Unscheduled." I have a special task type called "milestones" to remind me of my overall direction, and I can adjust priorities as needed. For prioritization, I use the Eisenhower matrix. I find the "Quick Capture" feature in my to-do app very helpful. I also experiment with retrospectives and use project comments to store project-specific notes.</p>]]></content:encoded></item><item><title><![CDATA[Reflecting On 30 Days Of Daily Posting]]></title><description><![CDATA[30 days ago, I started an experiment where I committed to posting daily notes on topics I'm interested in.]]></description><link>https://olehbezhenar.substack.com/p/reflecting-on-30-days-of-daily-posting</link><guid isPermaLink="false">https://olehbezhenar.substack.com/p/reflecting-on-30-days-of-daily-posting</guid><dc:creator><![CDATA[Oleh Bezhenar]]></dc:creator><pubDate>Wed, 04 Oct 2023 04:44:27 GMT</pubDate><content:encoded><![CDATA[<p>30 days ago, I started an experiment where I committed to posting daily notes on topics I'm interested in. Here's a brief look back on this period:</p><ul><li><p>It encouraged me to research areas that interest me.</p></li><li><p>It motivated me to stay updated on industry trends.</p></li><li><p>It pushed me to dive deeper into each topic and double-check the facts I thought I knew.</p></li><li><p>Sometimes, it's disappointing to discard a note halfway through when I realize I don't like it.</p></li><li><p>Other times, it's discouraging to admit my lack of expertise in a specific topic, but I'm trying to post anyway, as it's the area I'm currently investigating.</p></li></ul><p>Overall, I've decided to continue this experiment for at least three more months, and I'll share another update then. Thank you guys for your support.</p>]]></content:encoded></item><item><title><![CDATA[GPT Function Calling]]></title><description><![CDATA[I've been exploring the GPT API, and one of its cool features is called Function Calling. Basically, this allows the AI model to use code that you give it in a special format called JSON, and it's wrapped up in something called a "schema."]]></description><link>https://olehbezhenar.substack.com/p/gpt-function-calling</link><guid isPermaLink="false">https://olehbezhenar.substack.com/p/gpt-function-calling</guid><dc:creator><![CDATA[Oleh Bezhenar]]></dc:creator><pubDate>Tue, 03 Oct 2023 03:24:58 GMT</pubDate><content:encoded><![CDATA[<p>I've been exploring the GPT API, and one of its cool features is called&nbsp;<a href="https://platform.openai.com/docs/guides/gpt/function-calling">Function Calling</a>. Basically, this allows the AI model to use code that you give it in a special format called JSON, and it's wrapped up in something called a "schema."</p><p>You can do some interesting things with this feature. For example, you can make a program that can understand and run code that you provide. It's similar to how a Code Interpreter works.</p><p>You can also use this to make your chatbot work with other programs. This means you can create a chat-based interface for your app. And if you combine it with a code interpreter, the API can even create code that works with your existing software.</p>]]></content:encoded></item><item><title><![CDATA[Customer Segmentation]]></title><description><![CDATA[Customer segmentation is the process of categorizing a company's customers into groups based on common characteristics.]]></description><link>https://olehbezhenar.substack.com/p/customer-segmentation</link><guid isPermaLink="false">https://olehbezhenar.substack.com/p/customer-segmentation</guid><dc:creator><![CDATA[Oleh Bezhenar]]></dc:creator><pubDate>Mon, 02 Oct 2023 02:18:33 GMT</pubDate><content:encoded><![CDATA[<blockquote><p>Customer segmentation is the process of categorizing a company's customers into groups based on common characteristics. This enables companies to effectively and appropriately tailor their marketing efforts to each group.</p></blockquote><p>There are four primary types of customer segmentation:</p><ol><li><p><strong>Demographic segmentation:</strong>&nbsp;This method involves dividing customers into groups based on shared characteristics such as age, gender, income, occupation, education level, marital status, and location.</p></li><li><p><strong>Psychographic segmentation:</strong>&nbsp;In this approach, customers are grouped based on their lifestyle, interests, values, and attitudes.</p></li><li><p><strong>Behavioral segmentation:</strong>&nbsp;This method classifies customers into different groups based on their purchase history, usage patterns, brand loyalty, and responses to marketing campaigns.</p></li><li><p><strong>Geographic segmentation:</strong>&nbsp;Here, customers are divided into groups based on their location, which can include country, region, city, or neighborhood.</p></li></ol><p>Customer segmentation offers various benefits, including optimizing your marketing strategy and defining specific marketing channels that target each segment. It also helps identify ways to improve products tailored to specific segments and even test various pricing options.</p><p>Segmentation can be carried out in various ways, such as through surveys, cold calls, collecting membership data, insights from customer support interactions, purchase history analysis, online analytics, and machine learning.</p><p>Here are some application examples:</p><ul><li><p>Implementing different pricing strategies for students.</p></li><li><p>Offering family discounts.</p></li><li><p>Conducting age and gender-specific marketing campaigns (Netflix serves as a great example).</p></li><li><p>Developing distinct products for various cultural groups.</p></li><li><p>Sending customized messages based on how customers discovered a service.</p></li></ul>]]></content:encoded></item><item><title><![CDATA[LLM as a Standard Text Interface]]></title><description><![CDATA[The Portable Operating System Interface (POSIX) is a family of standards that defines a set of APIs (Application Programming Interfaces) and conventions for building and interacting with operating systems.]]></description><link>https://olehbezhenar.substack.com/p/llm-as-a-standard-text-interface</link><guid isPermaLink="false">https://olehbezhenar.substack.com/p/llm-as-a-standard-text-interface</guid><dc:creator><![CDATA[Oleh Bezhenar]]></dc:creator><pubDate>Sun, 01 Oct 2023 04:40:08 GMT</pubDate><content:encoded><![CDATA[<blockquote><p>The Portable Operating System Interface (POSIX) is a family of standards that defines a set of APIs (Application Programming Interfaces) and conventions for building and interacting with operating systems.</p></blockquote><p>POSIX is designed to enhance the portability of applications. Essentially, this standard defines what a Unix-like operating system is. Among various components, such as Error Codes and Inter-Process Communication standards, it includes a list of utilities that are familiar to us, such as&nbsp;<code>cd</code>,&nbsp;<code>ls</code>,&nbsp;<code>mkdir</code>, and many more. These utilities have shaped how people interact with operating systems using text for decades.</p><p>It appears that we are witnessing a resurgence of text-based interfaces in the form of LLMs. Technologies like ChatGPT plugins, Microsoft Copilot 365, and the recently updated Bard indicate that LLMs might serve as text-based interfaces for a range of services and applications. I'm wondering if we will eventually establish a set of standards to define the interaction between LLMs and extensions, similar to how POSIX standardized Unix-like systems in its time.</p><p>Several factors could contribute to the emergence of such standards. Some of them:</p><p><strong>1. User Demands:</strong>&nbsp;In a competitive market with multiple chat-based services that support third-party plugins, having a set of standards would enable compatibility across platforms or easy switching between them.</p><p><strong>2. Technology Maturity:</strong>&nbsp;As these interfaces become more mature, and their applications span various domains, standardization may naturally evolve. The absence of disruptive changes and widespread usage can lead to the establishment of these standards.</p>]]></content:encoded></item><item><title><![CDATA[Apple and AI]]></title><description><![CDATA[In its latest event, Apple didn't utilize AI even once, in contrast to its closest competitor, Google.]]></description><link>https://olehbezhenar.substack.com/p/apple-and-ai</link><guid isPermaLink="false">https://olehbezhenar.substack.com/p/apple-and-ai</guid><dc:creator><![CDATA[Oleh Bezhenar]]></dc:creator><pubDate>Sat, 30 Sep 2023 02:48:31 GMT</pubDate><content:encoded><![CDATA[<p>In its latest event, Apple didn't utilize AI even once, in contrast to its closest competitor, Google. While refraining from making any announcements, the new generations of iPhone and Apple Watch boast more powerful Neural Engines. I believe Apple will take a different approach from what we currently observe in the market. Instead of further enhancing their existing cloud-based Siri experience, they will shift towards on-device processing. This strategy aligns with their strong stance on security and privacy, as we've already seen them testing on-device Siri processing with the Apple Watch. I'm curious about what they could offer with offline AI and have a few thoughts:</p><ol><li><p>Context-aware on-device search: Imagine being able to search across all types of files, including images, documents, and videos, and retrieve information in any format simply by asking Siri.</p></li><li><p>Context-aware writing assistance: With training based on your email history, typing suggestions could become context-aware, offering email responses that align with your ongoing conversations.</p></li><li><p>Deeper integration with other applications: It would be fascinating to enable any app to leverage an API that creates a "skill" for the local assistant, much like how you can extend ChatGPT with extensions. This could potentially open up new niches for apps centered around AI interaction.</p></li></ol>]]></content:encoded></item><item><title><![CDATA[Homeostasis]]></title><description><![CDATA[Homeostasis is a self-regulating process that enables biological systems to maintain stability while adapting to changing environmental conditions.]]></description><link>https://olehbezhenar.substack.com/p/homeostasis</link><guid isPermaLink="false">https://olehbezhenar.substack.com/p/homeostasis</guid><dc:creator><![CDATA[Oleh Bezhenar]]></dc:creator><pubDate>Fri, 29 Sep 2023 05:15:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!dWxu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1536d75a-e4ea-4824-9539-eabbe2c1709e_726x470.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p><em><strong>Homeostasis is a self-regulating process that enables biological systems to maintain stability while adapting to changing environmental conditions. It describes how an organism can keep its internal environment relatively constant, allowing it to adapt and survive in a frequently challenging environment.</strong></em></p></blockquote><p>Homeostasis consists of several key components:</p><ol><li><p><strong>Receptor:</strong>&nbsp;As the name suggests, receptors detect changes in the external or internal surroundings. They initiate a cascade of reactions to uphold homeostasis.</p></li><li><p><strong>Control Center:</strong>&nbsp;Also referred to as the integration center, the control center receives information from the receptors and processes it.</p></li><li><p><strong>Effector:</strong>&nbsp;Effectors respond according to the instructions received from the control center, either reducing or enhancing the stimulus as needed.</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dWxu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1536d75a-e4ea-4824-9539-eabbe2c1709e_726x470.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dWxu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1536d75a-e4ea-4824-9539-eabbe2c1709e_726x470.png 424w, https://substackcdn.com/image/fetch/$s_!dWxu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1536d75a-e4ea-4824-9539-eabbe2c1709e_726x470.png 848w, https://substackcdn.com/image/fetch/$s_!dWxu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1536d75a-e4ea-4824-9539-eabbe2c1709e_726x470.png 1272w, https://substackcdn.com/image/fetch/$s_!dWxu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1536d75a-e4ea-4824-9539-eabbe2c1709e_726x470.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dWxu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1536d75a-e4ea-4824-9539-eabbe2c1709e_726x470.png" width="726" height="470" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1536d75a-e4ea-4824-9539-eabbe2c1709e_726x470.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:470,&quot;width&quot;:726,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Homeostasis Diagram&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Homeostasis Diagram" title="Homeostasis Diagram" srcset="https://substackcdn.com/image/fetch/$s_!dWxu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1536d75a-e4ea-4824-9539-eabbe2c1709e_726x470.png 424w, https://substackcdn.com/image/fetch/$s_!dWxu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1536d75a-e4ea-4824-9539-eabbe2c1709e_726x470.png 848w, https://substackcdn.com/image/fetch/$s_!dWxu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1536d75a-e4ea-4824-9539-eabbe2c1709e_726x470.png 1272w, https://substackcdn.com/image/fetch/$s_!dWxu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1536d75a-e4ea-4824-9539-eabbe2c1709e_726x470.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The concept of homeostasis finds widespread application in software engineering across various domains and industries. Here are some notable examples:</p><ul><li><p><strong>Configuration as Code:</strong>&nbsp;Technologies like Kubernetes, Terraform, and CloudFormation adopt an approach where users declare the desired system state, and the system autonomously determines how to achieve and maintain it.</p></li><li><p><strong>Elasticity:</strong>&nbsp;Systems can dynamically scale up or down in response to workload fluctuations, ensuring they can efficiently perform their tasks.</p></li><li><p><strong>Self-Healing:</strong>&nbsp;Container orchestrators such as Kubernetes attempt to restart a malfunctioning service if it stops responding to health checks or exhibits unusual behavior.</p></li></ul><p>Overall, the  concept of homeostasis closely aligns with the idea of a desired state and a declarative approach to programming. A straightforward and widely used example is markup languages, where developers specify the desired page state, and the browser is responsible for rendering it as closely as possible to that desired state.</p>]]></content:encoded></item><item><title><![CDATA[Quality Gates]]></title><description><![CDATA[A quality gate is a critical checkpoint in the software development lifecycle that assesses whether software meets specific criteria.]]></description><link>https://olehbezhenar.substack.com/p/quality-gates</link><guid isPermaLink="false">https://olehbezhenar.substack.com/p/quality-gates</guid><dc:creator><![CDATA[Oleh Bezhenar]]></dc:creator><pubDate>Thu, 28 Sep 2023 04:38:10 GMT</pubDate><content:encoded><![CDATA[<p>A quality gate is a critical checkpoint in the software development lifecycle that assesses whether software meets specific criteria. Its primary goal is to identify and fix as many issues as possible before releasing the software. Quality gates may include, but are not limited to, the following checks:</p><ul><li><p><strong>Build:</strong>&nbsp;Checking if the software builds and compiles without any errors.</p></li><li><p><strong>Linting:</strong>&nbsp;Ensuring that the codebase adheres to accepted best practices.</p></li><li><p><strong>Tests:</strong>&nbsp;Including both functional tests and coverage reports.</p></li></ul><p>Typical locations for implementing quality gates are:</p><ul><li><p><strong>Local Environment:</strong>&nbsp;Usually implemented with pre-commit hooks, this allows for early issue detection during code commit. Among other checks, it's an excellent place to enforce code style using tools like Prettier and validate naming conventions for the branch.</p></li><li><p><strong>PR Validation:</strong>&nbsp;These checks duplicate those in the local environment, in case a developer skips pre-commit hooks using the&nbsp;<code>--no-verify</code>&nbsp;option. They also add PR-specific validations. For example, Azure can check if the associated work item was created or if a description was provided for the PR.</p></li><li><p><strong>Main Branch Actions:</strong>&nbsp;This is the best place to run extensive integration and automation tests in addition to the previous checks. It ensures that the software continues to meet quality standards after merging into the main branch.</p></li></ul><p>This setup works exceptionally well with temporary teams, such as contractors or outsourcers, to ensure that the codebase complies with defined standards.</p>]]></content:encoded></item><item><title><![CDATA[Model First VS Query First]]></title><description><![CDATA[SQL is a good example of an abstraction that works in most cases (I assume the 80/20 rule is applicable here).]]></description><link>https://olehbezhenar.substack.com/p/model-first-vs-query-first</link><guid isPermaLink="false">https://olehbezhenar.substack.com/p/model-first-vs-query-first</guid><dc:creator><![CDATA[Oleh Bezhenar]]></dc:creator><pubDate>Wed, 27 Sep 2023 04:40:14 GMT</pubDate><content:encoded><![CDATA[<p>SQL is a good example of an abstraction that works in most cases (I assume the 80/20 rule is applicable here). But, like most abstractions, it cracks under pressure, and instead of writing readable, well-structured queries, developers find themselves writing dynamic SQL, tweaking indices, and investigating execution plans.</p><p>I think query-first data modelling, as used in Apache Cassandra, is more transparent compared to model-first, used in SQL:</p><ul><li><p>It doesn't try to hide the physical nature of the query and insists on picking a good index beforehand, thus not faltering under high loads, allowing it to handle huge workloads.</p></li><li><p>It doesn't presume complete data integrity, and thus techniques like partitioning don't seem alien. CQL, for instance, insists on picking a good partition key when modelling your data, presuming partitioning from the beginning.</p></li></ul>]]></content:encoded></item><item><title><![CDATA[Complexity Analysis]]></title><description><![CDATA[I didn't realize that there are so many ways to do complexity analysis in software engineering.]]></description><link>https://olehbezhenar.substack.com/p/complexity-analysis</link><guid isPermaLink="false">https://olehbezhenar.substack.com/p/complexity-analysis</guid><dc:creator><![CDATA[Oleh Bezhenar]]></dc:creator><pubDate>Tue, 26 Sep 2023 04:46:20 GMT</pubDate><content:encoded><![CDATA[<p>I didn't realize that there are so many ways to do complexity analysis in software engineering. Some of them:</p><ul><li><p><strong>Story Points</strong>: This is a classic one. The team decides on a minimum point and then compares the complexity of other tasks to this minimum. Usually, they use the Fibonacci Sequence and Planning Poker for this.</p></li><li><p><strong>T-Shirt Sizes</strong>: This method uses a set of predefined sizes like XS, S, M, L, XL, etc., to estimate the complexity.</p></li><li><p><strong>Ideal Days</strong>: This is straightforward. The team estimates how many ideal workdays they need to finish a task.</p></li><li><p><strong>Function Point Analysis (FPA)</strong>: This feels more academic. It considers things like the number of external outputs and internal interfaces. You can learn more about it&nbsp;<a href="https://www.geeksforgeeks.org/software-engineering-functional-point-fp-analysis/">here</a>.</p></li><li><p><strong>The Matrix Method</strong>: This is a visual method. It uses time on the X-axis and complexity on the Y-axis.</p></li></ul>]]></content:encoded></item><item><title><![CDATA[Explicit Error Handling]]></title><description><![CDATA[When I first started using Go, it took me some time to become familiar with its error handling approach.]]></description><link>https://olehbezhenar.substack.com/p/explicit-error-handling</link><guid isPermaLink="false">https://olehbezhenar.substack.com/p/explicit-error-handling</guid><dc:creator><![CDATA[Oleh Bezhenar]]></dc:creator><pubDate>Mon, 25 Sep 2023 04:31:50 GMT</pubDate><content:encoded><![CDATA[<p>When I first started using Go, it took me some time to become familiar with its error handling approach. In comparison to the traditional control flow approach, where exceptions are handled in a separate block (try/catch), modern languages like Go and Rust use a different approach called explicit error handling. In this approach, the error is one of the return values, and the developer is expected to check and handle it right away.</p><p>For example, in Go:</p><pre><code><code>value, err := someFunction()
if err != nil {
    // handle the error
}
</code></code></pre><p>In Rust, you would use&nbsp;<code>Result&lt;T, E&gt;</code>, which is an enum with two variants:&nbsp;<code>Ok(value)</code>&nbsp;and&nbsp;<code>Err(value)</code>:</p><pre><code><code>match some_function() {
    Ok(value) =&gt; {
        // use the value
    },
    Err(e) =&gt; {
        // handle the error
    },
}
</code></code></pre><p>Both languages also have a similar concept called "panic" mode, which represents unrecoverable errors that should interrupt the execution.</p><p>Explicit error handling arguably helps developers write more readable error handling code because it is closely related to the actual place where the error will occur, as opposed to the control flow approach, where the&nbsp;<code>catch</code>&nbsp;block might be in a separate function or buried deep within many other function calls that might produce the error, or even worse, hidden by a generic exception.</p>]]></content:encoded></item><item><title><![CDATA[Red Ocean Blue Ocean]]></title><description><![CDATA["Red Ocean, Blue Ocean" is the concept from the business strategy book "Blue Ocean Strategy" by W.]]></description><link>https://olehbezhenar.substack.com/p/red-ocean-blue-ocean</link><guid isPermaLink="false">https://olehbezhenar.substack.com/p/red-ocean-blue-ocean</guid><dc:creator><![CDATA[Oleh Bezhenar]]></dc:creator><pubDate>Sun, 24 Sep 2023 05:47:23 GMT</pubDate><content:encoded><![CDATA[<p>"Red Ocean, Blue Ocean" is the concept from the business strategy book "Blue Ocean Strategy" by W. Chan Kim and Ren&#233;e Mauborgne that aims to help companies grow under different market conditions and adjust their actions accordingly to market "temperature":</p><ul><li><p><strong>Red Ocean</strong>: an already established market with competitors. How to take advantage?</p><ul><li><p>Better cost;</p></li><li><p>Better quality;</p></li><li><p>Focus on a specific niche;</p></li><li><p>Better branding;</p></li><li><p>Relationships;</p></li></ul></li><li><p><strong>Blue Ocean</strong>: an unknown market space, where demand is created rather than fought over. How to win:</p><ul><li><p>Innovate</p></li><li><p>Create new demand</p></li><li><p>Attract new customers The Blue Ocean almost always looks more appealing due to the lack of competitors; however, you should be a visionary to see them. While the Red Ocean may seem rough, knowing the rules and the market might help you secure your share.</p></li></ul></li></ul>]]></content:encoded></item><item><title><![CDATA[The Paradox Of Choice]]></title><description><![CDATA[In his book "The Paradox of Choice," Barry Schwartz mentioned that having too many choices could lead to less satisfaction and greater regret.]]></description><link>https://olehbezhenar.substack.com/p/the-paradox-of-choice</link><guid isPermaLink="false">https://olehbezhenar.substack.com/p/the-paradox-of-choice</guid><dc:creator><![CDATA[Oleh Bezhenar]]></dc:creator><pubDate>Sat, 23 Sep 2023 04:14:35 GMT</pubDate><content:encoded><![CDATA[<p>In his book "The Paradox of Choice," Barry Schwartz mentioned that having too many choices could lead to less satisfaction and greater regret. The paradox is related to the following characteristics:</p><ul><li><p><strong>Choice Overload:</strong> Studies <strong><a href="https://www.nature.com/articles/s41562-018-0440-2">have shown</a></strong> that once a certain threshold is reached, there is a decrease in interest. This is particularly evident in retail, where stores know how many different brands are enough to keep customers interested, but not too many to overwhelm them.</p></li><li><p><strong>Escalation of Expectations:</strong> The more choices you have, the more you tend to believe that there must be "the best one" among them.</p></li><li><p><strong>Regret and Opportunity Costs:</strong> This is closely tied to the previous point; people tend to experience more regret when they have to choose between various options.</p></li></ul><p>How to cope with the Paradox Of Choice? Schwartz divides decision-makers into "maximizers" - those who constantly seek the best possible option, and "satisfiers" - those who are content with a good enough option. By proactively limiting the number of choices to those that have been proven to be "good enough," you can reduce decision anxiety for a significant portion of consumer-based choices.</p>]]></content:encoded></item><item><title><![CDATA[WAL and SQLite]]></title><description><![CDATA[The Pocket Base, an open-source backend, made an interesting choice for their persistent storage: SQLite.]]></description><link>https://olehbezhenar.substack.com/p/wal-and-sqlite</link><guid isPermaLink="false">https://olehbezhenar.substack.com/p/wal-and-sqlite</guid><dc:creator><![CDATA[Oleh Bezhenar]]></dc:creator><pubDate>Thu, 21 Sep 2023 22:33:33 GMT</pubDate><content:encoded><![CDATA[<p>The <strong><a href="https://pocketbase.io/">Pocket Base</a></strong>, an open-source backend, made an interesting choice for their persistent storage: SQLite. In the industry, SQLite is usually used for simple client-side storage because it's lightweight, portable, and doesn't need much setup. However, it lacks some features, like OUTER JOINs, and doesn't support multiple writers or user management. This choice raises some questions.</p><p>Here's their <strong><a href="https://pocketbase.io/faq">response</a></strong>:</p><blockquote><p><em><strong>PocketBase uses embedded SQLite (in WAL mode) and has no plans to support other databases. For most queries, SQLite (in WAL mode) performs better than traditional databases like MySQL, MariaDB, or PostgreSQL, especially for read operations. If you need replication and disaster recovery, you can consider using <a href="https://litestream.io/">Litestream</a>.</strong></em></p></blockquote><p>Basically, they're writing into a <strong><a href="https://www.sqlite.org/wal.html">WAL</a></strong> (Write-Ahead Logging) instead of using a rollback journal to address some critical issues with SQLite:</p><ol><li><p><strong>Increased Concurrency:</strong> Using WAL allows multiple readers and a writer to work at the same time. Readers don't block writers, and writers don't block readers, so reading and writing can happen at the same time.</p></li><li><p><strong>Improved Performance:</strong> Writing a commit to the end of the WAL file is faster than writing to the middle of the main database file. This makes transactions faster with WAL.</p></li><li><p><strong>Crash Recovery:</strong> It's more robust if there's a crash. Changes are first written to the WAL file and then transferred to the database file, reducing the risk of database corruption.</p></li><li><p><strong>Disk I/O Reduction:</strong> With WAL, disk operations are more sequential, which reduces the time spent on disk seek operations.</p></li></ol>]]></content:encoded></item><item><title><![CDATA[Hofstadter's Law]]></title><description><![CDATA[Hofstadter's Law addresses the common problem of accurately estimating the time it will take to complete a task.]]></description><link>https://olehbezhenar.substack.com/p/hofstadters-law</link><guid isPermaLink="false">https://olehbezhenar.substack.com/p/hofstadters-law</guid><dc:creator><![CDATA[Oleh Bezhenar]]></dc:creator><pubDate>Wed, 20 Sep 2023 22:16:54 GMT</pubDate><content:encoded><![CDATA[<p>Hofstadter's Law addresses the common problem of accurately estimating the time it will take to complete a task.</p><blockquote><p><em><strong>&nbsp;"It always takes longer than you expect, even when you take into account Hofstadter's Law."</strong></em></p></blockquote><p>Bill Gates' <strong><a href="https://www.goodreads.com/quotes/302999-most-people-overestimate-what-they-can-do-in-one-year">interpretation</a></strong> of this law especially resonates with me:</p><blockquote><p><em><strong>"Most people overestimate what they can do in one year and underestimate what they can do in ten years."</strong></em></p></blockquote><ul><li><p>You overestimate what you can achieve in a gym in one month, and underestimate progress for six.</p></li><li><p>You overestimate your ability to learn something in a month, but underestimate what you can learn in one year.</p></li><li><p>You overestimate your saving ability for a particular paycheck, but underestimate what you can save in one year.</p></li></ul><p>While planning something, I try to take this law into account and be more humble in my short-term goals, and more ambitious with long-term ones.</p>]]></content:encoded></item><item><title><![CDATA[Not Invented Here (NIH) Syndrome]]></title><description><![CDATA[Not Invented Here (NIH) syndrome is a tendency to build in-house software instead of utilizing existing options.]]></description><link>https://olehbezhenar.substack.com/p/not-invented-here-nih-syndrome</link><guid isPermaLink="false">https://olehbezhenar.substack.com/p/not-invented-here-nih-syndrome</guid><dc:creator><![CDATA[Oleh Bezhenar]]></dc:creator><pubDate>Tue, 19 Sep 2023 21:57:47 GMT</pubDate><content:encoded><![CDATA[<p>Not Invented Here (NIH) syndrome is a tendency to build in-house software instead of utilizing existing options. In its simplest form, it's a constant need to reinvent the wheel. Here are some notable examples:</p><ol><li><p><strong>Netscape Navigator:</strong> Netscape decided to rewrite its entire codebase for Netscape Navigator 5.0, believing that starting from scratch would enable them to leapfrog the competition. Unfortunately, the project took much longer than expected, and by the time Netscape 6.0 (5.0 was skipped altogether) was released in 2000, Internet Explorer had taken over the browser market. Netscape's market share never recovered.</p></li><li><p><strong>Digg v4:</strong> Social news aggregator Digg decided to rewrite its entire codebase for version 4, moving away from MySQL and Memcache to Cassandra. The move was not well-received by users, and numerous bugs and performance issues led to a mass exodus to competitors like Reddit. The company's value plummeted, and they were eventually sold for a fraction of their peak value.</p></li><li><p><strong>Rewriting Quake by id Software:</strong> John Carmack, a co-founder of id Software, decided to rewrite the Quake game engine from scratch in C++, moving away from C. The rewrite ended up taking much longer than anticipated and led to numerous bugs and stability issues, damaging the game's reputation.</p></li><li><p><strong>Friendster:</strong> One of the first social networking sites, Friendster, faced scalability issues as more users joined. Instead of improving and optimizing their existing platform, they decided to rewrite the entire codebase. The result was a buggy, slow platform that frustrated users and led to a rapid decline in the user base.</p></li><li><p><strong>HealthCare.gov:</strong> When the U.S. government launched HealthCare.gov in 2013, it was a disaster due to numerous technical issues. Despite the government's massive resources, the site suffered from poor performance and frequent crashes. A key reason for the site's issues was that the government insisted on custom-building much of the site's functionality rather than using proven existing solutions.</p></li></ol>]]></content:encoded></item><item><title><![CDATA[Cloud IDEs]]></title><description><![CDATA[I was working in StackBlitz and thinking about the potential future of Cloud Integrated Development Environments (IDEs).]]></description><link>https://olehbezhenar.substack.com/p/cloud-ides</link><guid isPermaLink="false">https://olehbezhenar.substack.com/p/cloud-ides</guid><dc:creator><![CDATA[Oleh Bezhenar]]></dc:creator><pubDate>Mon, 18 Sep 2023 21:18:27 GMT</pubDate><content:encoded><![CDATA[<p>I was working in StackBlitz and thinking about the potential future of Cloud Integrated Development Environments (IDEs). While they provide a convenient way to quickly set up configured development environments, I believe they won't entirely replace on-device development environments for everyday engineering tasks. They may, however, find their niche in replacing Virtual Desktop Environment (VDE) software, especially in situations where contractual restrictions prevent storing codebases locally, as is often the case for consulting companies.</p><p>Here are some reasons why I think local development environments will continue to dominate:</p><ol><li><p><strong>Freedom of Tooling Choice</strong>: In your local environment, you have the freedom to select and customize tools and plugins that align perfectly with your workflow. You can even use proprietary tools if necessary, which can be challenging to integrate into online IDEs.</p></li><li><p><strong>Databases</strong>: While it's possible to create a development database in the cloud for certain use cases, having a local database can be indispensable. Whether you need it for testing migrations or simply for experimenting with data, a local environment offers greater flexibility. GitHub Codespaces does allow the use of Docker images, but this can add to your bill, leading to the next point.</p></li><li><p><strong>Pricing</strong>: Cloud IDEs often come with a price tag. GitHub Codespaces, for instance, bills on a per-core, per-hour basis, while CodeSandbox charges $15 per month per editor. AWS Cloud9's pricing is tied to the underlying EC2 instance usage. Paying a monthly fee for a tool that offers a subset of the capabilities available in your local environment may not be cost-effective for many developers.</p></li></ol>]]></content:encoded></item><item><title><![CDATA[Tokenization]]></title><description><![CDATA[Tokenization is the process of breaking down text into components, known as tokens.]]></description><link>https://olehbezhenar.substack.com/p/tokenization</link><guid isPermaLink="false">https://olehbezhenar.substack.com/p/tokenization</guid><dc:creator><![CDATA[Oleh Bezhenar]]></dc:creator><pubDate>Sun, 17 Sep 2023 19:31:32 GMT</pubDate><content:encoded><![CDATA[<p><strong><a href="https://nlp.stanford.edu/IR-book/html/htmledition/tokenization-1.html">Tokenization</a></strong> is the process of breaking down text into components, known as tokens. Each token might represent an individual word or phrase. This process is required to make the data more manageable and suitable for various NLP tasks (text mining, ML, or text analysis). Let's have a look at the <strong><a href="https://en.wikipedia.org/wiki/BERT_(language_model)">BERT</a></strong>-like model tokenization process:</p><ul><li><p>Normalization (any clean-up of the text that is deemed necessary, such as removing spaces or accents, Unicode normalization, etc.)</p></li><li><p>Pre-tokenization (splitting the input into words)</p></li><li><p>Running the input through the model (using the pre-tokenized words to produce a sequence of tokens)</p></li><li><p>Post-processing (adding the special tokens of the tokenizer, generating the attention mask and token type IDs)</p></li></ul><p>Example:</p><pre><code><code>"Hello how are U today?" - Input
    |
    v
"hello how are u today?" - Case normalization
    |
    v
["hello", "how", "are", "u", "td", "##ay", "?"] - Subword tokenization
    |
    v
["CLS", "hello", "how", "are", "u", "td","##ay","?","SEP"] - Assigning special tokens
</code></code></pre><p>Here <code>today</code> has been split into <code>td</code>, <code>##ay</code>. This technique is known as Subword Tokenization, often used in models like BERT to handle out-of-vocabulary words.</p><blockquote><p><em><strong>Subword tokenization algorithms rely on the principle that frequently used words should not be split into smaller subwords, but rare words should be decomposed into meaningful subwords. For instance&nbsp;</strong></em><code>"annoyingly"</code>&nbsp;might be considered a rare word and could be decomposed into&nbsp;<code>"annoying"</code>&nbsp;and&nbsp;<code>"ly"</code>. Both&nbsp;<code>"annoying"</code>&nbsp;and&nbsp;<code>"ly"</code>&nbsp;as stand-alone subwords would appear more frequently while at the same time the meaning of&nbsp;<code>"annoyingly"</code>&nbsp;is kept by the composite meaning of&nbsp;<code>"annoying"</code>&nbsp;and&nbsp;<code>"ly"</code>. This is especially useful in agglutinative languages such as Turkish, where you can form (almost) arbitrarily long complex words by stringing together subwords. <strong><a href="https://huggingface.co/docs/transformers/tokenizer_summary#subword-tokenization">Source</a></strong></p></blockquote><p>Special tokens are used for classification in BERT like models. The <code>CLS</code> token is used to represent the entire context of the input for tasks like classification, while the <code>SEP</code> token is used to separate different sentences or contexts within the same text.</p>]]></content:encoded></item></channel></rss>