<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://eldarlrd.is-a.dev/eldarlrd/blog</id>
    <title>eldarlrd Blog</title>
    <updated>2025-11-25T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://eldarlrd.is-a.dev/eldarlrd/blog"/>
    <subtitle>eldarlrd Blog</subtitle>
    <icon>https://eldarlrd.is-a.dev/eldarlrd/https://github.com/eldarlrd.png</icon>
    <entry>
        <title type="html"><![CDATA[🧠 Cognitive Complexity]]></title>
        <id>https://eldarlrd.is-a.dev/eldarlrd/blog/2025/11/25/cognitive-complexity</id>
        <link href="https://eldarlrd.is-a.dev/eldarlrd/blog/2025/11/25/cognitive-complexity"/>
        <updated>2025-11-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Explaining cognitive complexity measurement for writing cleaner & more maintainable code.]]></summary>
        <content type="html"><![CDATA[<p><strong>Explaining cognitive complexity measurement for writing cleaner &amp; more maintainable code.</strong></p>
<p>A new method <a href="https://sonarsource.com/docs/CognitiveComplexity.pdf" target="_blank" rel="noopener noreferrer" class="">published by SonarSource in 2017,</a> overcomes the shortcomings of
cyclomatic complexity, helping to better identify
problematic code fragments in large codebases written in modern languages. It also tries to better reflect the mental model of a
software developer, rather than strictly following an arbitrary mathematical model.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="problem">Problem<a href="https://eldarlrd.is-a.dev/eldarlrd/blog/2025/11/25/cognitive-complexity#problem" class="hash-link" aria-label="Direct link to Problem" title="Direct link to Problem" translate="no">​</a></h3>
<p>The best way to illustrate this problem is by starting with showing code fragments of varying complexity and why it’s necessary to have
measurement tools in the first place.</p>
<span class="text--center"><p><a href="https://blog.devgenius.io/sonarqube-cognitive-complexity-265640dbad3e" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" src="https://mstone.ai/wp-content/uploads/2025/02/img-increased-cognitive-complexity.jpg" alt="A linked list" title="Code problems counted &amp; 
visualized" class="img_ev3q"></a></p></span>
<p>Here’s a straightforward, simple example of a summarizer written in Python.</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Sum all numbers in an array.</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token keyword" style="color:rgb(12, 150, 155)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">sum_of_numbers</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">numbers</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    total </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(170, 9, 130)">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token keyword" style="color:rgb(12, 150, 155)">for</span><span class="token plain"> num </span><span class="token keyword" style="color:rgb(12, 150, 155)">in</span><span class="token plain"> numbers</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">        total </span><span class="token operator" style="color:rgb(12, 150, 155)">+=</span><span class="token plain"> num</span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token keyword" style="color:rgb(12, 150, 155)">return</span><span class="token plain"> total</span><br></div></code></pre></div></div>
<p>It consists of a single loop, has no nested conditions, and is easy to read &amp; understand, resulting in a very low cognitive load.</p>
<p>Meanwhile, the code below is overly complicated and awkward, making it difficult to understand at a glance, increasing cognitive load
substantially.</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Authenticate &amp; Authorize the user.</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token keyword" style="color:rgb(12, 150, 155)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">authenticate_and_authorize</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">user</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> password</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> roles</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token keyword" style="color:rgb(12, 150, 155)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">not</span><span class="token plain"> user </span><span class="token keyword" style="color:rgb(12, 150, 155)">or</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">not</span><span class="token plain"> password</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">        </span><span class="token keyword" style="color:rgb(12, 150, 155)">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(72, 118, 214)">'Missing credentials'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token keyword" style="color:rgb(12, 150, 155)">if</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(72, 118, 214)">len</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">password</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">&lt;</span><span class="token plain"> </span><span class="token number" style="color:rgb(170, 9, 130)">8</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">        </span><span class="token keyword" style="color:rgb(12, 150, 155)">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(72, 118, 214)">'Password too short'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token keyword" style="color:rgb(12, 150, 155)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">not</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(72, 118, 214)">any</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">char</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">isdigit</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">for</span><span class="token plain"> char </span><span class="token keyword" style="color:rgb(12, 150, 155)">in</span><span class="token plain"> password</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">        </span><span class="token keyword" style="color:rgb(12, 150, 155)">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(72, 118, 214)">'Password must contain a digit'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token keyword" style="color:rgb(12, 150, 155)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">not</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(72, 118, 214)">any</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">char</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">isupper</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">for</span><span class="token plain"> char </span><span class="token keyword" style="color:rgb(12, 150, 155)">in</span><span class="token plain"> password</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">        </span><span class="token keyword" style="color:rgb(12, 150, 155)">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(72, 118, 214)">'Password must contain a capital letter'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token keyword" style="color:rgb(12, 150, 155)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">not</span><span class="token plain"> user</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token string" style="color:rgb(72, 118, 214)">'active'</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(188, 84, 84)">False</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">        </span><span class="token keyword" style="color:rgb(12, 150, 155)">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(72, 118, 214)">'Inactive account'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token keyword" style="color:rgb(12, 150, 155)">if</span><span class="token plain"> user</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token string" style="color:rgb(72, 118, 214)">'locked'</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(188, 84, 84)">False</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">        </span><span class="token keyword" style="color:rgb(12, 150, 155)">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(72, 118, 214)">'Account locked'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token keyword" style="color:rgb(12, 150, 155)">if</span><span class="token plain"> user</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token string" style="color:rgb(72, 118, 214)">'password'</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">!=</span><span class="token plain"> password</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">        </span><span class="token keyword" style="color:rgb(12, 150, 155)">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(72, 118, 214)">'Invalid password'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token keyword" style="color:rgb(12, 150, 155)">if</span><span class="token plain"> roles </span><span class="token keyword" style="color:rgb(12, 150, 155)">and</span><span class="token plain"> user</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token string" style="color:rgb(72, 118, 214)">'role'</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">not</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">in</span><span class="token plain"> roles</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">        </span><span class="token keyword" style="color:rgb(12, 150, 155)">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(72, 118, 214)">'Role not allowed'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token keyword" style="color:rgb(12, 150, 155)">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(72, 118, 214)">'Access granted'</span><br></div></code></pre></div></div>
<p>This function is obviously a mess; it’s very clear that something must be done about it to simplify and make it more pleasant to the eye.</p>
<p>Something like this is far better and clearly highlights the issue.</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Authenticate &amp; Authorize the user (clean version).</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token keyword" style="color:rgb(12, 150, 155)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">authenticate_and_authorize</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">user</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> password</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> roles</span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token boolean" style="color:rgb(188, 84, 84)">None</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token keyword" style="color:rgb(12, 150, 155)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">not</span><span class="token plain"> user </span><span class="token keyword" style="color:rgb(12, 150, 155)">or</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">not</span><span class="token plain"> password</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">        </span><span class="token keyword" style="color:rgb(12, 150, 155)">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(72, 118, 214)">'Missing credentials'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    error </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> run_checks</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">        </span><span class="token keyword" style="color:rgb(12, 150, 155)">lambda</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"> validate_password</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">password</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">        </span><span class="token keyword" style="color:rgb(12, 150, 155)">lambda</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"> check_account</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">user</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">        </span><span class="token keyword" style="color:rgb(12, 150, 155)">lambda</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"> verify_password</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">user</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> password</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">        </span><span class="token keyword" style="color:rgb(12, 150, 155)">lambda</span><span class="token punctuation" style="color:rgb(153, 76, 195)">:</span><span class="token plain"> check_role</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">user</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> roles</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token keyword" style="color:rgb(12, 150, 155)">return</span><span class="token plain"> error </span><span class="token keyword" style="color:rgb(12, 150, 155)">or</span><span class="token plain"> </span><span class="token string" style="color:rgb(72, 118, 214)">'Access granted'</span><br></div></code></pre></div></div>
<p>While the overall file increased in size due to code splitting, the main function is now very easy to wrap your head around.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="methodology">Methodology<a href="https://eldarlrd.is-a.dev/eldarlrd/blog/2025/11/25/cognitive-complexity#methodology" class="hash-link" aria-label="Direct link to Methodology" title="Direct link to Methodology" translate="no">​</a></h3>
<p>Cognitive Complexity is measured by the following three rules:</p>
<ol>
<li class=""><strong>Ignore structures that allow multiple statements to be readably shorthanded
into one.</strong></li>
<li class=""><strong>Increment (add one) for each break in the linear flow of the code.</strong></li>
<li class=""><strong>Increment when flow-breaking structures are nested.</strong></li>
</ol>
<p>Complexity score uses four different types of increments:</p>
<ul>
<li class=""><strong>Nesting</strong> - assessed for nesting control flow structures inside each other.</li>
<li class=""><strong>Structural</strong> - assessed on control flow structures that are subject to a nesting
increment, and that increase the nesting count.</li>
<li class=""><strong>Fundamental</strong> - assessed on statements not subject to a nesting increment.</li>
<li class=""><strong>Hybrid</strong> - assessed on control flow structures that are not subject to a nesting
increment, but which do increase the nesting count.</li>
</ul>
<p>This distinction makes it useful to understand where the score is coming from and what exactly the problem is with the code block.</p>
<p>Here are concrete examples considered to make the score better reflect what software developers think of code.</p>
<ul>
<li class=""><strong>Shorthands are ignored.</strong></li>
<li class=""><strong>Loops and recursions increment.</strong></li>
<li class=""><strong>Conditionals, catches, and switches increment.</strong></li>
</ul>
<p>With all of this taken into account, these would be the general suggestions to lower the score, thus writing cleaner code.</p>
<span class="text--center"><p><a href="https://mstone.ai/glossary/cognitive-complexity" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" src="https://mstone.ai/wp-content/uploads/2025/02/img-reduce-cognitive-complexity.jpg" alt="A colored chart" title="Chart of emerging suggestions" class="img_ev3q"></a></p></span>
<ul>
<li class=""><strong>Break down large functions into smaller methods.</strong></li>
<li class=""><strong>Flatten nested structures with early returns.</strong></li>
<li class=""><strong>Adopt clear, consistent naming conventions.</strong></li>
<li class=""><strong>Leverage analysis tools such as linters &amp; formatters.</strong></li>
<li class=""><strong>Teamwork helps unwrap &amp; explain problematic code.</strong></li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="conclusion">Conclusion<a href="https://eldarlrd.is-a.dev/eldarlrd/blog/2025/11/25/cognitive-complexity#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h3>
<p>By using the explained methodology, applying the aforementioned suggestions, and following the emerging guidelines, software engineers
will be able to write better, cleaner code with efficiency and ease, being able to better understand which parts of code need
refactoring and the exact reasons why.</p>
<p>Happy Coding!</p>]]></content>
        <author>
            <name>Eldar Pashazade</name>
            <email>eldarlrd@pm.me</email>
            <uri>https://eldarlrd.is-a.dev</uri>
        </author>
        <category label="neuroscience" term="neuroscience"/>
        <category label="psychology" term="psychology"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[📈 Big O]]></title>
        <id>https://eldarlrd.is-a.dev/eldarlrd/blog/2024/07/19/big-o</id>
        <link href="https://eldarlrd.is-a.dev/eldarlrd/blog/2024/07/19/big-o"/>
        <updated>2024-07-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[On a mathematical tool used to calculate time complexity in software algorithms.]]></summary>
        <content type="html"><![CDATA[<p><strong>On a mathematical tool used to calculate time complexity in software algorithms.</strong></p>
<p>Also known as <em>Landau's notation,</em> it allows for measuring the speed of a given function based on the specifics of its implementation, where
O is the rate of growth of the function, standing for its order of approximation. This effectively allows for easier comparison of the
implementations, ultimately making it possible to deliver an optimal solution for a given problem.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="complexity">Complexity<a href="https://eldarlrd.is-a.dev/eldarlrd/blog/2024/07/19/big-o#complexity" class="hash-link" aria-label="Direct link to Complexity" title="Direct link to Complexity" translate="no">​</a></h3>
<p><a href="https://web.mit.edu/16.070/www/lecture/big_o.pdf" target="_blank" rel="noopener noreferrer" class="">Big O notation</a> measures the complexity of an algorithm by measuring the input to output
execution rate. This rate takes into account programming concepts and elements such as loops and conditional statements.</p>
<p>In general, the fewer elements you have, the faster the execution rate and, thus, the simpler the notation. For Big O, many time
complexities exist; however, these six are considered to be the main ones and are encountered most commonly:</p>
<span class="text--center"><p><a href="https://freecodecamp.org/news/big-o-cheat-sheet-time-complexity-chart" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" src="https://miro.medium.com/v2/resize:fit:720/format:webp/0*VcwxCIytalgxqvGA.png" alt="A colored line chart" title="Big O performance comparison" class="img_ev3q"></a></p></span>
<ul>
<li class=""><strong>O(1)</strong> Constant Time</li>
<li class=""><strong>O(n)</strong> Linear Time</li>
<li class=""><strong>O(log n)</strong> Logarithmic Time</li>
<li class=""><strong>O(n²)</strong> Quadratic Time</li>
<li class=""><strong>O(2ⁿ)</strong> Exponential Time</li>
<li class=""><strong>O(n!)</strong> Factorial Time</li>
</ul>
<p>As can be seen from the chart, time complexities differ in performance, and thus, the goal is to optimize the implementation to be as simple
as possible.</p>
<p><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript" target="_blank" rel="noopener noreferrer" class="">JavaScript</a> is used for the appropriate examples.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="o1-constant-time">O(1) Constant Time<a href="https://eldarlrd.is-a.dev/eldarlrd/blog/2024/07/19/big-o#o1-constant-time" class="hash-link" aria-label="Direct link to O(1) Constant Time" title="Direct link to O(1) Constant Time" translate="no">​</a></h3>
<p>Constant time algorithms are independent of the input and therefore always execute with the exact same speed.</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Check if a number is even or odd.</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token keyword" style="color:rgb(12, 150, 155)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(153, 76, 195);font-style:italic">isEven</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token parameter">n</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> n </span><span class="token operator" style="color:rgb(12, 150, 155)">%</span><span class="token plain"> </span><span class="token number" style="color:rgb(170, 9, 130)">2</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">===</span><span class="token plain"> </span><span class="token number" style="color:rgb(170, 9, 130)">0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><br></div></code></pre></div></div>
<p>That's because this function has only a single execution step.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="on-linear-time">O(n) Linear Time<a href="https://eldarlrd.is-a.dev/eldarlrd/blog/2024/07/19/big-o#on-linear-time" class="hash-link" aria-label="Direct link to O(n) Linear Time" title="Direct link to O(n) Linear Time" translate="no">​</a></h3>
<p>Linear time algorithms are linearly dependent on the input. As in, as the input increases in size, so does the number of execution steps
required.</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Sum all the values in an array.</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token keyword" style="color:rgb(12, 150, 155)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(153, 76, 195);font-style:italic">sumArray</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token parameter">n</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> n</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token method function property-access" style="color:rgb(153, 76, 195);font-style:italic">reduce</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token parameter">sum</span><span class="token parameter punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token parameter"> value</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> sum </span><span class="token operator" style="color:rgb(12, 150, 155)">+</span><span class="token plain"> value</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(170, 9, 130)">0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="olog-n-logarithmic-time">O(log n) Logarithmic Time<a href="https://eldarlrd.is-a.dev/eldarlrd/blog/2024/07/19/big-o#olog-n-logarithmic-time" class="hash-link" aria-label="Direct link to O(log n) Logarithmic Time" title="Direct link to O(log n) Logarithmic Time" translate="no">​</a></h3>
<p>Logarithmic time algorithms are dependent on the logarithm of the input, meaning that the execution steps decrease as the input size
increases.</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Searching through a binary search tree.</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token keyword" style="color:rgb(12, 150, 155)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(153, 76, 195);font-style:italic">searchBST</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token parameter">node</span><span class="token parameter punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token parameter"> n</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(12, 150, 155)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token operator" style="color:rgb(12, 150, 155)">!</span><span class="token plain">node </span><span class="token operator" style="color:rgb(12, 150, 155)">||</span><span class="token plain"> node</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token property-access">value</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">===</span><span class="token plain"> n</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(12, 150, 155)">return</span><span class="token plain"> node</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(12, 150, 155)">return</span><span class="token plain"> n </span><span class="token operator" style="color:rgb(12, 150, 155)">&lt;</span><span class="token plain"> node</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token property-access">value</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">?</span><span class="token plain"> </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">searchBST</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">node</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token property-access">left</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> n</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">searchBST</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">node</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token property-access">right</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> n</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="on-quadratic-time">O(n²) Quadratic Time<a href="https://eldarlrd.is-a.dev/eldarlrd/blog/2024/07/19/big-o#on-quadratic-time" class="hash-link" aria-label="Direct link to O(n²) Quadratic Time" title="Direct link to O(n²) Quadratic Time" translate="no">​</a></h3>
<p>Quadratic time algorithms double in their execution steps. This commonly happens due to operations such as nested loops.</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Checking for duplicate elements in an array.</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token keyword" style="color:rgb(12, 150, 155)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(153, 76, 195);font-style:italic">hasDuplicates</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token parameter">n</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(12, 150, 155)">for</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token keyword" style="color:rgb(12, 150, 155)">const</span><span class="token plain"> i </span><span class="token keyword" style="color:rgb(12, 150, 155)">in</span><span class="token plain"> n</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(12, 150, 155)">for</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token keyword" style="color:rgb(12, 150, 155)">const</span><span class="token plain"> j </span><span class="token keyword" style="color:rgb(12, 150, 155)">in</span><span class="token plain"> n</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(12, 150, 155)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">i </span><span class="token operator" style="color:rgb(12, 150, 155)">!==</span><span class="token plain"> j </span><span class="token operator" style="color:rgb(12, 150, 155)">&amp;&amp;</span><span class="token plain"> n</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">i</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">===</span><span class="token plain"> n</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">j</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(12, 150, 155)">return</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(188, 84, 84)">true</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(12, 150, 155)">return</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(188, 84, 84)">false</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="o2ⁿ-exponential-time">O(2ⁿ) Exponential Time<a href="https://eldarlrd.is-a.dev/eldarlrd/blog/2024/07/19/big-o#o2%E2%81%BF-exponential-time" class="hash-link" aria-label="Direct link to O(2ⁿ) Exponential Time" title="Direct link to O(2ⁿ) Exponential Time" translate="no">​</a></h3>
<p>Exponential time algorithms increase in execution steps exponentially depending on the size of the input. This often happens with recursive
functions, a classic example of which is shown below.</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Find the nth Fibonacci number.</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token keyword" style="color:rgb(12, 150, 155)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(153, 76, 195);font-style:italic">fibonacci</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token parameter">n</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(12, 150, 155)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">n </span><span class="token operator" style="color:rgb(12, 150, 155)">&lt;=</span><span class="token plain"> </span><span class="token number" style="color:rgb(170, 9, 130)">1</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(12, 150, 155)">return</span><span class="token plain"> n</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(12, 150, 155)">return</span><span class="token plain"> </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">fibonacci</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">n </span><span class="token operator" style="color:rgb(12, 150, 155)">-</span><span class="token plain"> </span><span class="token number" style="color:rgb(170, 9, 130)">1</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">+</span><span class="token plain"> </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">fibonacci</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">n </span><span class="token operator" style="color:rgb(12, 150, 155)">-</span><span class="token plain"> </span><span class="token number" style="color:rgb(170, 9, 130)">2</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="on-factorial-time">O(n!) Factorial Time<a href="https://eldarlrd.is-a.dev/eldarlrd/blog/2024/07/19/big-o#on-factorial-time" class="hash-link" aria-label="Direct link to O(n!) Factorial Time" title="Direct link to O(n!) Factorial Time" translate="no">​</a></h3>
<p>Factorial time algorithms have execution steps that grow factorially with the size of the input. This results in the worst performance
possible.</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Generate all permutations of an array.</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token keyword" style="color:rgb(12, 150, 155)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(153, 76, 195);font-style:italic">permuteArray</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token parameter">n</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token keyword" style="color:rgb(12, 150, 155)">const</span><span class="token plain"> result </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token keyword" style="color:rgb(12, 150, 155)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(153, 76, 195);font-style:italic">permutate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token parameter">currArr</span><span class="token parameter punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token parameter"> remainArr</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(12, 150, 155)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">remainArr</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token property-access">length</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">===</span><span class="token plain"> </span><span class="token number" style="color:rgb(170, 9, 130)">0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> result</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token method function property-access" style="color:rgb(153, 76, 195);font-style:italic">push</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">currArr</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(12, 150, 155)">else</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">      </span><span class="token keyword control-flow" style="color:rgb(12, 150, 155)">for</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token keyword" style="color:rgb(12, 150, 155)">let</span><span class="token plain"> i </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(170, 9, 130)">0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"> i </span><span class="token operator" style="color:rgb(12, 150, 155)">&lt;</span><span class="token plain"> remainArr</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token property-access">length</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"> i</span><span class="token operator" style="color:rgb(12, 150, 155)">++</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">        </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">permutate</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token spread operator" style="color:rgb(12, 150, 155)">...</span><span class="token plain">currArr</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> remainArr</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">i</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token spread operator" style="color:rgb(12, 150, 155)">...</span><span class="token plain">remainArr</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token method function property-access" style="color:rgb(153, 76, 195);font-style:italic">slice</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token number" style="color:rgb(170, 9, 130)">0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> i</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token spread operator" style="color:rgb(12, 150, 155)">...</span><span class="token plain">remainArr</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token method function property-access" style="color:rgb(153, 76, 195);font-style:italic">slice</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">i </span><span class="token operator" style="color:rgb(12, 150, 155)">+</span><span class="token plain"> </span><span class="token number" style="color:rgb(170, 9, 130)">1</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">permutate</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> n</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(12, 150, 155)">return</span><span class="token plain"> result</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><br></div></code></pre></div></div>
<p>This concludes a brief explanation of the mathematical concept of Big O notation and its implications in software development.</p>
<p>Happy Coding!</p>]]></content>
        <author>
            <name>Eldar Pashazade</name>
            <email>eldarlrd@pm.me</email>
            <uri>https://eldarlrd.is-a.dev</uri>
        </author>
        <category label="computer-science" term="computer-science"/>
        <category label="math" term="math"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[🔑 Licenses]]></title>
        <id>https://eldarlrd.is-a.dev/eldarlrd/blog/2023/08/23/licenses</id>
        <link href="https://eldarlrd.is-a.dev/eldarlrd/blog/2023/08/23/licenses"/>
        <updated>2023-08-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A brief explanation of copyright, trademarks, patents, and software licenses from a historical perspective and the open source movement.]]></summary>
        <content type="html"><![CDATA[<p><strong>A brief explanation of copyright, trademarks, patents, and software licenses from a historical perspective and the open source movement.</strong></p>
<p>In 1886, ten European countries convened in <em>Berne, Switzerland,</em> to sign the legal principles on the protection of the rights of artists,
architects, and the common man. This was done primarily to counter the companies of the time that would steal a foreign artist's work,
modify it, and then resell it under their own brand for profit. Prior to this convention, combating such behavior would require the artist
to explicitly state copyright and then go on to personally defend it in court.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="copyright">Copyright<a href="https://eldarlrd.is-a.dev/eldarlrd/blog/2023/08/23/licenses#copyright" class="hash-link" aria-label="Direct link to Copyright" title="Direct link to Copyright" translate="no">​</a></h3>
<p>After the <a href="https://wipo.int/treaties/en/ip/berne" target="_blank" rel="noopener noreferrer" class="">Berne Convention,</a> copyright was automatically asserted as soon as the work was created.
As in, as soon as artistic work is made, it is already copyrighted by the creator, and thus it'll be protected. This work includes anything
like text, images, architecture, hardware, etc. The convention has now been ratified in nearly all countries in the world.</p>
<p>But then, why do we keep seeing ©, (c), and "Copyright" notices everywhere? There are two reasons.</p>
<p>First, the U.S. did not ratify the convention <a href="https://copyright.gov/title17/92appk.pdf" target="_blank" rel="noopener noreferrer" class="">until 1989,</a> but instead they opted to make
explicit copyright assertions easier by creating the © sign and requiring its presence on any work of art alongside the name of the artist
and the date of production. Because of this, until ratification, artists were required to put © on the work for it to be considered
copyrighted.</p>
<p>Second, the reason why artists and companies insist on using the ©, (c), and/or "Copyright" is because explicit statements make it easier to
defend the copyright in court.</p>
<p>Why (c)? Because typical typewriters don't have the © sign, it'd get approximated to (c).</p>
<p>All copyrights, trademarks, and patents are recognized by all the members of the convention. The word "Copyright" must always be written in
English.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="trademark">Trademark<a href="https://eldarlrd.is-a.dev/eldarlrd/blog/2023/08/23/licenses#trademark" class="hash-link" aria-label="Direct link to Trademark" title="Direct link to Trademark" translate="no">​</a></h3>
<p>Trademarks, often indicated with ™, are a way of registering a brand name, logo, slogan, etc. so that the product can have an official
signature of being genuine. Coca-Cola is a trademarked brand name; one can't release their own product under that name to lure potential
customers into buying their product instead. Trademarks have to be renewed with the body that issued them.</p>
<p>Registered trademarks carry the ® symbol, which signifies that the trademark has
been <a href="https://uspto.gov/sites/default/files/trademarks/law/Trademark_Statutes.pdf" target="_blank" rel="noopener noreferrer" class="">officially registered</a> by the appropriate state office.
It, too, is sometimes approximated to (r).</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="patents">Patents<a href="https://eldarlrd.is-a.dev/eldarlrd/blog/2023/08/23/licenses#patents" class="hash-link" aria-label="Direct link to Patents" title="Direct link to Patents" translate="no">​</a></h3>
<p>Patents are a way of registering an invention by publishing the schematics for it publicly and, in return, getting a 20 year
grant <a href="https://uspto.gov/web/offices/pac/mpep/consolidated_laws.pdf" target="_blank" rel="noopener noreferrer" class="">enforced by the state</a> to be the sole producer of the given invention.
It's meant to reward and incentivize inventions by giving the innovator a headstart so that they can capitalize on their idea and make a
profit. However, after 20 years, the patent expires and cannot be renewed. Meaning every other interested body can now produce the same
invention themselves using the public schematics.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="software-licenses">Software Licenses<a href="https://eldarlrd.is-a.dev/eldarlrd/blog/2023/08/23/licenses#software-licenses" class="hash-link" aria-label="Direct link to Software Licenses" title="Direct link to Software Licenses" translate="no">​</a></h3>
<p>If one desires to share the right to modify, publish, or resell work, they have to provide a license. They're a lease given by the copyright
holder that allows some other body to interact with the work in the capacity that is provided in the license. It's recommended that one use
officially registered licenses and not create their own, since said licenses have already likely been defended in court.</p>
<p>There are many different types of licenses for various categories of work, Software is considered to be <em>text material</em> and has its own
commonly used set of <a href="https://opensource.org/licenses" target="_blank" rel="noopener noreferrer" class="">open source licenses.</a></p>
<span class="text--center"><p><a href="https://github.blog/2015-03-09-open-source-license-usage-on-github-com" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" src="https://miro.medium.com/v2/resize:fit:720/format:webp/1*veAZORAsRKvXWCjlHA_nuA.png" alt="A colored pie chart" title="2015 GitHub statistics for license use" class="img_ev3q"></a></p></span>
<p>The most popular license now is the permissive <a href="https://mit-license.org/" target="_blank" rel="noopener noreferrer" class="">MIT License,</a> which allows anyone to copy, modify, and republish
work as well as use it as a part of proprietary software for profit. This is the license that companies like to work with since it allows
them to use the program with the fewest strings attached.</p>
<p>Another common open source license is the <a href="https://apache.org/licenses/LICENSE-2.0.html" target="_blank" rel="noopener noreferrer" class="">Apache 2.0 License,</a> which is quite similar but
more elaborate in its wording. A similar <a href="https://isc.org/licenses" target="_blank" rel="noopener noreferrer" class="">ISC License</a> is used by default for npm packages.</p>
<p>There are also more restrictive licenses, like the ones made by the <a href="https://fsf.org/" target="_blank" rel="noopener noreferrer" class="">Free Software Foundation.</a> The Linux kernel is
licensed under <a href="https://gnu.org/licenses/old-licenses/gpl-2.0.html" target="_blank" rel="noopener noreferrer" class="">GPLv2,</a> and many more recent programs are licensed
under <a href="https://gnu.org/licenses/gpl-3.0.html" target="_blank" rel="noopener noreferrer" class="">GPLv3.</a> Another license of the same family, <a href="https://gnu.org/licenses/lgpl-3.0.html" target="_blank" rel="noopener noreferrer" class="">LGPLv3,</a>
is used for various software libraries. <a href="https://gnu.org/licenses/agpl-3.0.html" target="_blank" rel="noopener noreferrer" class="">AGPLv3</a> additionally covers software that's <em>shared over
networks</em> like websites.</p>
<p>Yet another popular family of licenses includes the <a href="https://opensource.org/license/BSD-3-clause" target="_blank" rel="noopener noreferrer" class="">BSD 3-Clause License</a> and the more
permissive <a href="https://opensource.org/license/bsd-2-clause" target="_blank" rel="noopener noreferrer" class="">BSD 2-Clause License.</a></p>
<p>The less elaborate <a href="https://opensource.org/license/unlicense" target="_blank" rel="noopener noreferrer" class="">Unlicense</a> and the
meme <a href="http://wtfpl.net/about" target="_blank" rel="noopener noreferrer" class="">Do What the F*** You Want To Public License</a> are about as permissive as one can get.</p>
<p>A couple of useful tools to help pick a license most suitable for one's software are <a href="https://choosealicense.com/" target="_blank" rel="noopener noreferrer" class="">Choose a License</a> and
the <a href="https://ufal.github.io/public-license-selector" target="_blank" rel="noopener noreferrer" class="">License Selector.</a></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="licensing-process">Licensing Process<a href="https://eldarlrd.is-a.dev/eldarlrd/blog/2023/08/23/licenses#licensing-process" class="hash-link" aria-label="Direct link to Licensing Process" title="Direct link to Licensing Process" translate="no">​</a></h3>
<p>Publicizing the software source code alone <em>does not suffice to make it truly open source.</em> The code in such an instance is only free to
observe but cannot be freely worked on.</p>
<p>To make the code open, it has to be licensed. This can be done
in <a href="https://docs.github.com/en/communities/setting-up-your-project-for-healthy-contributions/adding-a-license-to-a-repository" target="_blank" rel="noopener noreferrer" class="">various ways,</a>
by either including the license as a text file at the root of the project and/or putting explicit notices as comments at the top of the
files.</p>
<p>Some licenses allow modification of their clauses and notices, while others do not.</p>
<p>When you specify the license used, it's recommended to use the official <a href="https://spdx.org/licenses" target="_blank" rel="noopener noreferrer" class="">SPDX identifier.</a> Apache 2.0 would be
specified as "Apache-2.0".</p>
<p>An example <a href="https://jsdoc.app/tags-license.html" target="_blank" rel="noopener noreferrer" class="">license notice</a> in a JavaScript file as instructed by JSDoc.</p>
<p>The license file may get separated from the source code; however, with appropriate notices, the licensing is more explicit and permanent.</p>
<p>Hopefully this has been an insightful dive into the topic of copyright and licensing, helping you pick a license for your next project.</p>
<p>Happy Coding!</p>]]></content>
        <author>
            <name>Eldar Pashazade</name>
            <email>eldarlrd@pm.me</email>
            <uri>https://eldarlrd.is-a.dev</uri>
        </author>
        <category label="open-source" term="open-source"/>
        <category label="free-software" term="free-software"/>
    </entry>
</feed>