<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: sakib ahamed shahon </title>
    <description>The latest articles on DEV Community by sakib ahamed shahon  (@sakib3201).</description>
    <link>https://dev.to/sakib3201</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F600945%2Fa7793838-cb5c-4f80-8720-e7fa22177ce0.jpg</url>
      <title>DEV Community: sakib ahamed shahon </title>
      <link>https://dev.to/sakib3201</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sakib3201"/>
    <language>en</language>
    <item>
      <title>Wordcamp Dhaka 2025 এর থেকে যা শিখলাম তার OSTA (Overly Simplified Take Away)</title>
      <dc:creator>sakib ahamed shahon </dc:creator>
      <pubDate>Sun, 19 Oct 2025 15:03:03 +0000</pubDate>
      <link>https://dev.to/sakib3201/wordcamp-dhaka-2025-er-theke-yaa-shikhlaam-taar-osta-2af</link>
      <guid>https://dev.to/sakib3201/wordcamp-dhaka-2025-er-theke-yaa-shikhlaam-taar-osta-2af</guid>
      <description>&lt;p&gt;1.&lt;strong&gt;সুমিত সাহা ভাইয়ের সেশন — Unlocking the Invisible Layer: How MCP Servers Help You See WordPress Differently&lt;/strong&gt;: &lt;/p&gt;

&lt;p&gt;MCP ব্যবহার করলে আপনার সফটওয়্যার AI ব্যবহার করতে পারে। একরকম REST API-র মতো, কিন্তু AI-এর জন্য। &lt;/p&gt;

&lt;p&gt;উদাহরণ হিসেবে ধরুন — যদি LinkedIn-এর MCP সার্ভারের সাথে ChatGPT যুক্ত করেন এবং ChatGPT-কে বলেন “WordCamp নিয়ে কোনো পোস্ট চোখে পড়লে কমেন্টে গিয়ে ‘আমিও গিয়েছিলাম’ লিখে আসো”, তাহলে MCP-এর মাধ্যমে LinkedIn সেই কাজটা করতে পারত।&lt;/p&gt;

&lt;p&gt;WordPress নিজেদের একটা MCP সার্ভার বানিয়েছে (যেটা এখন ডিপ্রিকেটেড, কিন্তু শেখার জন্য দারুণ)। এমনকি তারা MCP adapter নিয়েও কাজ করছে যাতে ভবিষ্যতে আরও উন্নত MCP সাপোর্ট আনা যায়।&lt;/p&gt;

&lt;p&gt;2.&lt;strong&gt;শাহরিয়ার হাসান ভাইয়ের সেশন — LLM SEO – The Next Frontier of SEO&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Google-এর ট্রাফিক কমছে, আর এখন আপনার প্রোডাক্টকে AI-এর উত্তরে নিয়ে আসাটাই দিন দিন বেশি গুরুত্বপূর্ণ হয়ে উঠছে। তাই, আপনার কনটেন্টকে AI-এর জন্য fine-tune করা এখন আগের যেকোনো সময়ের চেয়ে বেশি দরকারি। Common AI যেমন ChatGPT, Perplexity — এরা ডিফল্টভাবে Bing ব্যবহার করে (Google না, তবে চাইলে Google দিয়েও কাজ করে)।&lt;/p&gt;

&lt;p&gt;LLM SEO-র জন্য এখন ব্যাকলিংকের চেয়ে ব্র্যান্ড হাইলাইটিং অনেক বেশি কাজের।&lt;/p&gt;

&lt;p&gt;3.&lt;strong&gt;মোহাম্মদ এমরান হাসান ভাইয়ের সেশন — Building SaaS-backed Plugins&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;WordPress প্লাগইন মানেই PHP-এর backend-এ বানাতে হবে এমন কোনো নিয়ম নেই।&lt;/p&gt;

&lt;p&gt;চাইলেই SaaS আর WordPress মিলিয়ে best of both worlds প্লাগইন বানানো যায়।&lt;/p&gt;

&lt;p&gt;যেখানে SaaS REST API serve করবে — ফলে SaaS-এর scalability, performance, control, আর ease of development পাওয়া যাবে — আর WordPress-এর মাধ্যমে বিশাল market share ধরা যাবে।&lt;/p&gt;

&lt;p&gt;ভাবুন তো, ব্যবহারকারীর জন্য WordPress প্লাগইনের মতো সহজ setup, আর backend-এ Golang বা Rust-এর performance — একদম smooth scalability!&lt;/p&gt;

&lt;p&gt;তবে downside ও আছে — SaaS backend-এর সাথে WordPress data sync রাখা টেকনিক্যালি একটু চ্যালেঞ্জিং (যদিও খুব কঠিন না)।&lt;/p&gt;

&lt;p&gt;আর SaaS infrastructure maintain করার ঝামেলাটাও নিতে হয়।&lt;/p&gt;

&lt;p&gt;তবুও এটা WordPress প্লাগইন ডেভেলপমেন্টে একদম নতুন একটা refreshing দৃষ্টিভঙ্গি।&lt;/p&gt;

&lt;p&gt;4.&lt;strong&gt;মিজানুর রহমান মিজান ভাইয়ের সেশন — Faceless or Fearless: How WP Professionals Can Win with Both Video Paths&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;ভিডিও বানানো এখন খুবই গুরুত্বপূর্ণ।&lt;/p&gt;

&lt;p&gt;মুখ দেখাতে যদি hesitation থাকে বা ভালো setup না থাকে, তাহলে faceless ভিডিওও একটা চমৎকার বিকল্প হতে পারে।&lt;/p&gt;

&lt;p&gt;সবশেষে — ভিডিও কনটেন্ট বানানোর গুরুত্ব অপরিসীম।&lt;/p&gt;

&lt;p&gt;5.&lt;strong&gt;আরাফাত ইসলাম ভাইয়ের সেশন — Scaling WordPress for High Traffic Websites&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;WordPress দিয়েও বিশাল ট্রাফিক হ্যান্ডেল করা যায়।&lt;/p&gt;

&lt;p&gt;তবে এর জন্য out-of-the-box না গিয়ে backend-এ custom architecture নিতে হয়।&lt;/p&gt;

&lt;p&gt;Database read replication, efficient querying, PHP-FPM usage, JIT advantage, proper indexing, PHP FFI — এইসব টেকনিক ব্যবহার করলে WordPress দিয়েও লাখ লাখ request হ্যান্ডেল করা সম্ভব।&lt;/p&gt;

&lt;p&gt;6.&lt;strong&gt;আশিফ মাহমুদ ভাইয়ের সেশন — Scratch to Pinnacle: The Mind Mapping of Unfolding Ideas&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;সব সময় problem থেকে solution না ভেবে, অনেক সময় solution থেকে problem চিন্তাও দরকার (basically bottom-up approach)।&lt;/p&gt;

&lt;p&gt;Product planning-এর সময় tech-এর nitty-gritty এর আগে user কী পাবে, তার journey কেমন হবে — সেটাতেই বেশি ফোকাস দিতে হয়।&lt;/p&gt;

&lt;p&gt;User-কে নিজের মতো engineer ভেবে না নিয়ে, একদম সাধারণ ব্যবহারকারী হিসেবে ভাবা উচিত।&lt;/p&gt;

&lt;p&gt;Planning করার সময় একদম fresh ভাবে, কোনো bias বা pre-conceived belief ছাড়া চিন্তা করা দরকার।&lt;/p&gt;

&lt;p&gt;7.&lt;strong&gt;নিজাম উদ্দিন ভাইয়ের সেশন — How AI is transforming WordPress&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;আসলে ভবিষ্যতে AI কী করবে সেটা কেউ জানে না। তবে এক জিনিস নিশ্চিত — যা হবে, সেটা একদম নতুনভাবে হবে। &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ভয়ের কিছু নেই — সব চাকরি হারাবে না, বরং ট্রান্সফর্ম হবে।&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User experience পুরোপুরি বদলে যাবে।&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;WordPress ইতিমধ্যেই AI adopt করতে একাধিক পদক্ষেপ নিয়েছে।&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ভবিষ্যতে WordPress প্লাগইন বা প্রোডাক্ট যদি AI integrate না করতে পারে বা AI-powered UX দিতে না পারে, তাহলে টিকে থাকা কঠিন হবে (কারণ অন্যরা তো ঠিকই দেবে)।&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;8.&lt;strong&gt;হাসিন হায়দার ভাইয়ের সেশন — WordPress Security in Action: Hardening Your Site and Server&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;কাউকে direct password access দেওয়া যাবে না সার্ভারে।&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SSH ব্যবহার করতে হবে এবং নিজের IP ছাড়া অন্য IP দিয়ে অ্যাক্সেস করা বন্ধ রাখতে হবে।&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;তারপর অপ্রয়োজনীয় সবকিছু সার্ভার থেকে সরিয়ে দিতে হবে, যাতে চাইলে কেউই এলোমেলো কিছু করতে না পারে।&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;WordPress সাইট সুরক্ষার জন্য একাধিক ট্রাস্টেড, ওপেন সোর্স, লাইটওয়েট প্লাগইন ইতিমধ্যেই আছে — সেগুলোই ব্যবহার করা উচিত।&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;PatchStack (একটা সাইট যেখানে বিভিন্ন প্লাগইনের vulnerability রিপোর্ট হয়) এ নজর রাখা দরকার, আর auto upgrade বন্ধ রাখা ভালো।&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;খুবই সংক্ষিপ্তভাবে লিখলাম। মূল সেশনগুলোতে আরও অনেক গুরুত্বপূর্ণ বিষয় ছিল — টেকনিক্যাল ডিটেইলে গেলে লেখা অনেক বড় হয়ে যাবে, তাই এড়িয়ে গেলাম। আমার নোটগুলো গুছিয়ে নিতে পারলে, ধীরে ধীরে প্রতিটা বিষয়ের উপর আমার নিজস্ব R&amp;amp;D ফাইন্ডিংসহ বিস্তারিতভাবে লিখব ইন শা আল্লাহ।&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>wcdhaka2025</category>
      <category>learning</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Refactoring conditionals: The first steps to cleaner code.</title>
      <dc:creator>sakib ahamed shahon </dc:creator>
      <pubDate>Sun, 03 Nov 2024 18:38:32 +0000</pubDate>
      <link>https://dev.to/sakib3201/refactoring-conditionals-the-first-steps-to-cleaner-code-11bk</link>
      <guid>https://dev.to/sakib3201/refactoring-conditionals-the-first-steps-to-cleaner-code-11bk</guid>
      <description>&lt;p&gt;In the previous part we started on decomposing conditionals or breaking complex conditional logic into simpler readable functions. Today we'll look into the below techniques:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Consolidating conditional expression: Gathering conditions that trigger the same action at a single place.&lt;/li&gt;
&lt;li&gt;Improving Nested Conditionals: Replacing nested conditionals with guard clauses.&lt;/li&gt;
&lt;li&gt;Reducing conditions through polymorphism (For OOP only): Put conditions in a superclass and override the methods in subclass to automatically perform actions without being dependent on multiple conditionals&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now let's look at the first technique.&lt;/p&gt;

&lt;h2&gt;
  
  
  Consolidating conditional expression
&lt;/h2&gt;

&lt;p&gt;Whenever we spot multiple conditions resulting in the same action or returning the same values, we can gather them together and use them at the same place effectively reducing repetition and often giving contextual clarity.&lt;/p&gt;

&lt;p&gt;Let's take a look at an example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;isEmployeeEligibleForRaise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nf"&gt;hasEnoughSeniority&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// There can be multiple operations in between the conditions. &lt;/span&gt;
    &lt;span class="c1"&gt;// It doesn't matter if they are not effected by the operations&lt;/span&gt;
    &lt;span class="nf"&gt;randomOperationsOne&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; 

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nf"&gt;gotRaiseRecently&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;randomOperationsTwo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nf"&gt;highPerforming&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above example the first three conditions all return the same output. Instead of having them at separate places or in separate conditions, we can consolidate all of them in a single conditional and return the same value like below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;isEmployeeEligibleForRaise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nf"&gt;hasEnoughSeniority&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
        &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nf"&gt;gotRaiseRecently&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
        &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nf"&gt;highPerforming&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;randomOperationsOne&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; 
    &lt;span class="nf"&gt;randomOperationsTwo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This way we can reduce the duplication in code and also keep responsible logics for a particular output at the same place. Which helps with both debugging and readability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Improving Nested Conditionals
&lt;/h2&gt;

&lt;p&gt;Nested conditionals can make code difficult to understand, especially when there are many nested levels with minimal separation. This complexity can obscure which conditions apply to which parts of the code.&lt;/p&gt;

&lt;p&gt;Consider the following example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;processOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isPaid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isInStock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isValid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Order processed successfully.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Order is not valid.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Order is not in stock.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Order is not paid.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By using guard clauses, we can simplify and flatten the structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;processOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isPaid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Order is not paid.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isInStock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Order is not in stock.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isValid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Order is not valid.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Order processed successfully.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above code does the same work but is much more readable while not losing the step by step separation of nested conditions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reducing conditions through polymorphism
&lt;/h2&gt;

&lt;p&gt;Whenever conditionals are used for performing operations for conditions with very little variation between each conditions, instead of making multiple conditions we can simply create a class and subclasses with method overrides to replace complex conditions with simple polymorphism. Here's a good example of such case where we have a set of payment gateways like PayPal, Stripe and Authorize.net. We want to calculate the charges for each of these gateways. The charges are different for each of them. Like below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculateCharges&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;gateway&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;charge&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;gateway&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PayPal&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;charge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.03&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.30&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 3% fee + $0.30 fixed fee for PayPal&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;gateway&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Stripe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;charge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.029&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 2.9% fee + $0.25 fixed fee for Stripe&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;gateway&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AuthorizeNet&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;charge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.025&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 2.5% fee + $0.20 fixed fee for Authorize.Net&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Unsupported payment gateway&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;charge&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of writing a condition for each of them, we can create a base class and override the charge method in each of the subclasses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Base class for payment gateway&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PaymentGateway&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Default charge method to be overridden by subclasses&lt;/span&gt;
  &lt;span class="nf"&gt;charge&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;charge() method must be implemented in subclass&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// PayPal subclass&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PayPal&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;PaymentGateway&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;charge&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.03&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.30&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 3% fee + $0.30 fixed fee for PayPal&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Stripe subclass&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Stripe&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;PaymentGateway&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;charge&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.029&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 2.9% fee + $0.25 fixed fee for Stripe&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Authorize.Net subclass&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AuthorizeNet&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;PaymentGateway&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;charge&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.025&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 2.5% fee + $0.20 fixed fee for Authorize.Net&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After declaring the main class and creating its subclasses we can simply use them in the function like below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculateCharges&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;paymentGateway&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;paymentGateway&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;charge&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach means there can now be any number of payment gateway and in no case would we have to create any large if else ladders and each case can be separately modified without worrying about other cases (paymentGateways). Changes in any subclasses implementation will also be applicable across the codebase so modifications won't have to be repeated.&lt;/p&gt;

&lt;p&gt;These concludes the basic of improving or refactoring conditional statements in our code. One important thing to remember is each application needs to be applied in a case by case basis if its necessary. Different teams may have pre-agreed methods of handling such cases, in such case its better to follow convention instead of personal preferences. Code readability is much more about teams total understanding and agreement than personal preferences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Side note:&lt;/strong&gt; I am personally still a junior in terms of experience. So take all of my words with a bit of salt and consult team members before attempting to make major code refactoring. Many parts of a code may seemingly go against clean coding standards yet might be there for a good reason for that specific case.&lt;/p&gt;

</description>
      <category>refactorit</category>
      <category>beginners</category>
      <category>cleancode</category>
    </item>
    <item>
      <title>Refactoring: How to improve legacy code one step at a time. Starting with "if statements".</title>
      <dc:creator>sakib ahamed shahon </dc:creator>
      <pubDate>Sun, 27 Oct 2024 11:43:03 +0000</pubDate>
      <link>https://dev.to/sakib3201/refactoring-snippets-how-to-improve-legacy-code-one-step-at-a-time-starting-with-if-statements-19g8</link>
      <guid>https://dev.to/sakib3201/refactoring-snippets-how-to-improve-legacy-code-one-step-at-a-time-starting-with-if-statements-19g8</guid>
      <description>&lt;p&gt;This is the first post of a series of posts focusing on learning how to methodically improve legacy code, providing actionable steps for detecting bad codes, improving those code with small easy to digest examples.&lt;/p&gt;

&lt;h1&gt;
  
  
  What is refactoring?
&lt;/h1&gt;

&lt;p&gt;Refactoring can be considered as making changes to code that is focused on improving its readability and maintainability while keeping its functionality the same.&lt;/p&gt;

&lt;p&gt;Changing code for performance improvement can also be considered refactoring in certain cases but during the series "refactoring" will be used solely in the context of increasing code quality from a maintainability and readability perspective.&lt;/p&gt;

&lt;h1&gt;
  
  
  What is bad code?
&lt;/h1&gt;

&lt;p&gt;Any code that is hard to understand, modify or you simply go "The hell is this!" is bad code. (Sorry for the oversimplified explanation here)&lt;/p&gt;

&lt;h1&gt;
  
  
  Why is refactoring important?
&lt;/h1&gt;

&lt;p&gt;Well refactoring code is important because every line of bad code is black hole for sucking a developer's time and energy. Both of which developers have a limited amount of. IF it takes 6 hours to figure out what a code is doing than its 6 hours less of actually making the code do what you want it to do. Thus, it's always important to maintain a shiny code base that's so easy to understand that it feels like the person who wrote it is explaining to you himself.&lt;/p&gt;

&lt;p&gt;In this series we will learn how to do just that (well not that good, but you get what I mean) and improve existing legacy code to point where its no longer at a level of "What the hell is this!" the next time you (or someone else) reads it, instead its at a level of "Okay I understand this" right off the bat.&lt;/p&gt;

&lt;p&gt;So, let's start with the simplest part we can improve, the "If statements". &lt;/p&gt;

&lt;h1&gt;
  
  
  Improving If statements
&lt;/h1&gt;

&lt;p&gt;Whether it's the classic if-else ladder or a simple if statements it's a given that you'll be using it a lot whether you're an intern or a senior dev. Since its written frequently it's also read a lot too. Often due to its perceived simplicity, it's easy to overlook its quality while writing. So, well start off with a common technique of improving if statements or conditionals in general in a codebase. &lt;/p&gt;

&lt;h2&gt;
  
  
  Decomposing conditionals
&lt;/h2&gt;

&lt;p&gt;Let's look at the below code snippet where we have to calculate the weekly salary of an employee. Where the salary per hour differs for employees with different experience and how many hours employee has worked in contrast to his mandatory work hours.&lt;/p&gt;

&lt;p&gt;Let's look at the bad way to write the code or our starting point first. We'll look at a function that is used to return the per hour salary of an employee.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;employee&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Congkey&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Experience&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hours worked&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Mandatory Work Hour&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;salaryPerHour&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="c1"&gt;// Unclear about the purpose of the conditions&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Experience&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hours worked&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Mandatory Work Hour&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c1"&gt;// return statements don't indicate what they are. &lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Experience&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Experience&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hours worked&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Mandatory Work Hour&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Experience&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here we cant really tell why the conditions exist or what is the purpose of the return values are. This can be improved by wrapping the conditions in functions with self-explanatory names aka decomposing conditions.&lt;/p&gt;

&lt;p&gt;For example it can be improved at first as below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;salaryPerHour&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="c1"&gt;// return statements don't indicate what they are.&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isSenior&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hours worked&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Mandatory Work Hour&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; 
    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isMidLevel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hours worked&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Mandatory Work Hour&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isJunior&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hours worked&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Mandatory Work Hour&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// extracted conditions&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;isSenior&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Experience&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;isMidLevel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Experience&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Experience&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;isJunior&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Experience&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this stage the conditions inside &lt;code&gt;SalaryPerHour&lt;/code&gt; is cleaner as we can tell what each condition is for. But it's yet unclear what the return values actually are for each condition or why they are so. We can specify it by extracting the return values into their own functions.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;salaryPerHour&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isSenior&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;seniorLevelHourlyRate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; 
    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isMidLevel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;midLevelHourlyRate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isJunior&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;JuniorLevelHourlyRate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// extracted conditions&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;isSenior&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Experience&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;isMidLevel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Experience&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Experience&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;isJunior&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Experience&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;seniorHourlyRate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hours worked&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Mandatory Work Hour&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;midLevelHourlyRate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hours worked&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Mandatory Work Hour&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;juniorLevelHourlyRate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hours worked&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Mandatory Work Hour&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we can also tell what each condition is for and what the conditions are returning. This will make changing the function much easier as each function is well separated and clearly self-explanatory. For OOP we can do the same by decomposing conditions inside methods. Smaller functions also help with testing the code and minimizing chances of error. This is also an application of Single responsibility principle of Object-Oriented Programming.&lt;/p&gt;

&lt;p&gt;The next post of this series will contain more techniques on improving if statements.&lt;/p&gt;

&lt;p&gt;[Side note: I am starting this series as a summarized lessons of what I have learned on refactoring legacy code. I am by no means a great expert, what I say is context specific and might not be usable for your specific case. There are incredible software engineers who have written books, research paper or has tutorials on this topic. So if you find something more to improve upon what I have written leave a comment and I'll make changes accordingly. And if you have enjoyed or found the post helpful still leave feedback as your appreciation and knowing that my work is helping someone is the greatest motivator for me.]&lt;/p&gt;

</description>
      <category>refactorit</category>
      <category>cleancoding</category>
      <category>beginners</category>
    </item>
    <item>
      <title>🎯 Top 3 software development Skills you don't learn as a beginner, but you really should.</title>
      <dc:creator>sakib ahamed shahon </dc:creator>
      <pubDate>Sun, 25 Aug 2024 18:09:55 +0000</pubDate>
      <link>https://dev.to/sakib3201/top-3-software-development-skills-you-dont-learn-as-a-beginner-but-you-really-should-gc2</link>
      <guid>https://dev.to/sakib3201/top-3-software-development-skills-you-dont-learn-as-a-beginner-but-you-really-should-gc2</guid>
      <description>&lt;p&gt;By beginners I am referring to people who are preparing for entry level software jobs or internships and not people just starting out to learn programming. Over the time I have come to realize that a lot of things we learn on the job could be learned beforehand and could give you an edge when learning. Although there's a huge difference between building you first blog site that just runs on your machine and building the same thing for 10k+ concurrent users a lot of the needed skills are very difficult to learn solo. However, there are some skills that you can not only learn but hone to get an edge over all your competitors and even get ahead once you land a job, all by yourself. &lt;/p&gt;

&lt;p&gt;💡 Here's my top 3 picks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Automated Testing :&lt;/strong&gt; Whether its writing basic feature tests or writing enough unit tests to give your codebase a 100% coverage, learning to check whether your code is functioning the way it should without opening a bunch of pages or clicking buttons is a massive time saver. Although learning to write tests and writing tests take time they save far more time down the line. This is something you can learn on your own for whatever stack you use and having these tests on your portfolio projects or GitHub repo will surely help you standing out.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Methodical refactoring :&lt;/strong&gt; Most of the time you'll be working with legacy code instead of developing something new from ground up. Learning to spot bad code, methodically improving them is invaluable. Although making great improvements take a lot of experience specially at an architectural level but learning to avoid code duplication, improving nested if-else ladders or breaking down oversized methods is relatively easy. There isn't much content on this topic online as videos but there's some great books on refactoring and you can search for code reviews on YouTube for your stack.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you're particularly interested in this topic I suggest reading "Refactoring" by Martin Fowler. Something that I found greatly helpful personally.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Written communication:&lt;/strong&gt; Whether its writing documentation, user manual or design docs being able to write short, clear and organized documents is a core software engineering skills because on the workplace you're likely to never work alone. And written documents are one of the most comprehensive ways of sharing information. You can learn this by writing a good readme for your personal projects as well as user guides and FAQ's.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;[&lt;strong&gt;Side note:&lt;/strong&gt; All this being said, I am still a junior and consider myself a beginner since I have been working as a software engineer slightly over a year. So, take my opinions with a bit of salt and you have better points or something that I missed out but is also really important write them in the comments.]&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>beginners</category>
      <category>discuss</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>🧿 3 things that set apart great feedback from mediocre ones. (And how you can do it too)</title>
      <dc:creator>sakib ahamed shahon </dc:creator>
      <pubDate>Wed, 14 Feb 2024 13:17:15 +0000</pubDate>
      <link>https://dev.to/sakib3201/3-things-that-set-apart-great-feedback-from-mediocre-ones-and-how-you-can-do-it-too-fgo</link>
      <guid>https://dev.to/sakib3201/3-things-that-set-apart-great-feedback-from-mediocre-ones-and-how-you-can-do-it-too-fgo</guid>
      <description>&lt;p&gt;No matter what industry you're in, as long as you're part of a team giving feedback to others whether on a decision, product or plan is unavoidable. It's also a part of professional communication, teamwork, and leadership skills. Yet very few people can do it well and those that can set them apart quickly become leaders, mentors, and top communicators in their professional sphere.&lt;/p&gt;

&lt;p&gt;🎯 Here are 3 ways to make the quality of your feedback awesome:&lt;/p&gt;

&lt;p&gt;💡Objective analysis:&lt;br&gt;
Imagine you're presented with a really slow website and must give your feedback on it.&lt;br&gt;
Now compare the below two feedbacks:&lt;/p&gt;

&lt;p&gt;❌ Feedback-1: The website is slow, it takes forever to load. Users won't like it.&lt;/p&gt;

&lt;p&gt;✅ Feedback-2: The website takes 12 seconds to load. 80% of our users stop visiting sites if it takes over 5 seconds.&lt;/p&gt;

&lt;p&gt;The first one just tells me something is bad. the second one answers why it's bad or how we define good or bad. The purpose of any feedback in a professional setting is to help people improve. Usage of objective measurements like time, percentage, money etc shows your analytical ability and helps you take better actions to improve.&lt;/p&gt;

&lt;p&gt;💡 Offer a solution or alternate option:&lt;br&gt;
A very good thing to do after giving feedback is to help explore ways to improve it. Let's again check two pieces of feedback:&lt;/p&gt;

&lt;p&gt;❌ Feedback-1: This website is just too bad. It needs to be improved.&lt;/p&gt;

&lt;p&gt;✅ Feedback-2: I believe trying to improve the website loading time by using techniques X, Y or Z is a good option to explore.&lt;/p&gt;

&lt;p&gt;Here the second feedback shows initiative, a problem-solving attitude, and genuine effort behind your feedback. while the first one is the almost perfunctory response.&lt;/p&gt;

&lt;p&gt;💡 Say with Empathy:&lt;br&gt;
All professional tasks no matter how poorly done has people's effort in them. So, while giving feedback make sure to show respect, empathy and courtesy. Here's an example:&lt;/p&gt;

&lt;p&gt;❌ Feedback-1: This website is slow and low quality, I don't think its even usable.&lt;/p&gt;

&lt;p&gt;✅ Feedback-2: I understand that building a website with strict performance requirements is tough and I see a lot of effort behind it. But we can't still put it into operation as it doesn't meet the performance criteria, I believe the responsible personnel can surely come up with a solution with a little more time.&lt;/p&gt;

&lt;p&gt;The second feedback shows your acknowledgment of people's effort and your trust in their ability to improve, while the first one shows harsh judgment and a lack of empathy. By acknowledging effort, showing trust, and respect your feedback will both be better received and you'll be seen as a better leader and team player.&lt;/p&gt;

&lt;p&gt;In short, when giving feedback be objective and analytical about it, suggest solutions, and acknowledge people's effort behind the work. And always remain respectful.&lt;/p&gt;

&lt;p&gt;How else can we make our feedback better? Give your best feedback in the comments. &lt;/p&gt;

</description>
      <category>beginners</category>
      <category>community</category>
      <category>discuss</category>
    </item>
    <item>
      <title>প্রোগ্রামিং প্রতিযোগিতার নানান ধরন ।</title>
      <dc:creator>sakib ahamed shahon </dc:creator>
      <pubDate>Sat, 10 Feb 2024 18:16:00 +0000</pubDate>
      <link>https://dev.to/sakib3201/prograamin-prtiyogitaar-naanaan-dhrn--go3</link>
      <guid>https://dev.to/sakib3201/prograamin-prtiyogitaar-naanaan-dhrn--go3</guid>
      <description>&lt;p&gt;কন্টেস্ট বললেই সাধারণত এলগোরিদমিক কন্টেস্ট এর কথা মনে পরে শুরুতে । তবে প্রোগ্রামিং ওরিয়েন্টেড প্রতিযোগিতা অনেক ধরনেরই হয়।&lt;br&gt;
তার মধ্যে ৪ ধরনের প্রতিযোগিতা সম্পর্কে বলি :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;১ - এলগোরিদমিক কন্টেস্ট --&amp;gt;&lt;/strong&gt; মূলত কিছু প্রোগ্রামিং সমস্যা সমাধান করা লাগে যাতে ইনপুট এর ভিত্তিতে তোমার কোড সঠিক অউটপুট দেয়।&lt;br&gt;
শর্ট আর লং দুই ফরম্যাটে হয়। লং ফরম্যাট এর মধ্যে পরে আইসিপিসি ধাঁচের প্রতিযোগিতা গুলো । সাধারণত এই ফরম্যাটে টিম ভিত্তিক কাজ করা লাগে, আর প্রব্লেম জটিলও হয় বেশী । শর্ট কন্টেস্টের মধ্য পরে ২-৩ ঘণ্টার একক প্রতিযোগিতা । মূলত অনলাইন জাজ গুলতে এমন বেশী হয়। নতুনদের জন্য বেশী উপযোগী ।&lt;br&gt;
এই ধরনের প্রতিযোগিতা অনুশীলন এর জন্য codeforces , codechef , hackerrank, hackerearth ,lightoj , spoj এমন অনেক প্ল্যাটফর্ম আছে।&lt;br&gt;
দরকার পরে ডাটা স্ট্রাকচার এবং এলগোরিদম এর দক্ষতা । আর অন্তত একটা প্রোগ্রামিং ল্যাঙ্গুয়েজে ভাল দক্ষতা। সি-তে শুরু করা যায় তবে ভাল করার জন্য সি প্লাস প্লাস , বিশেষ ভাবে STL(Standard Template Library) এর ব্যাবহার জানা দরকার।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;২ - সিটিএফ (CTF : Capture the flag) --&amp;gt;&lt;/strong&gt; মূলত সাইবার সিকিউরিটি এর উপর কন্টেস্ট । বিভিন্ন সিস্টেমের দুর্বলতা বের করা ,নেটওয়ার্কিং , ক্রিপ্টোগ্রাফি ইত্যাদির দক্ষতা লাগে। ফরম্যাট যদিও বেশ আলাদা হয় প্রতিযোগিতা ভেদে তবে প্রয়োজনীয় দক্ষতা প্রায় ক্ষেত্রে একি ।বেশিরভাগই আমার জানা মতে দলগত প্রতিযোগিতা । Jeopardy , attack &amp;amp; defense মূলধারায় দুই ফরম্যাট এর প্রতিযোগিতা বেশী ।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;৩ - হ্যাঁকাথন --&amp;gt;&lt;/strong&gt; মূলত কোন বাস্তবিক সমস্যার সমাধান করতে কোন অ্যাপ / ওয়েবসাইট / সফটওয়্যার এর প্রটোটাইপ দাড়া করাতে বলা হয়। Nasa Space Apps Challenge এ ধরনের প্রতিযোগিতার ভাল উদাহরন ।&lt;br&gt;
মূলত একটা অ্যাপ / ওয়েবসাইট / সফটওয়্যার এর প্রটোটাইপ দাড়া করাতে যা যা লাগে সব দরকারি । এর পাশা পাশি প্রেজেন্টেশান দেয়ার দক্ষতা , ক্ষেত্র বিশেষে ভিডিও এডিটিং এবং ফর্মাল লিখালিখির দক্ষতাও দরকারি।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;৪ - মেশিন লার্নিং / এ.আই. কন্টেস্ট --&amp;gt;&lt;/strong&gt; মূলত কোন বিশেষ সমস্যার জন্য ডাটাসেট দেওয়া থাকে । ঐ ডাটার ব্যাবহার করে কোন কাজ করার জন্য এমএল মডেল তৈরি করা লাগে । কিছু ক্ষেত্রে একাধিক ডাটাসেট দেয়া থাকে ।&lt;br&gt;
মূলত বিভিন্ন এমএল মডেল এর জ্ঞান, ডাটা এনালাইসিস ও ভিজুয়ালাইজেশন , পাইথন / ম্যাটল্যাব / 'R' জাতিয় প্রোগ্রামিং ল্যাঙ্গুয়েজ ও তার সাথে বিভিন্ন প্রয়োজনীয় লাইব্রেরি কোড জানা থাকা দরকার।&lt;br&gt;
শিখতে , প্র্যাকটিস করতে এবং প্রতিযোগিতায় অংশ নেয়ার জন্য নতুনদের জন্য সবচেয়ে ভাল প্ল্যাটফর্ম Kaggle.&lt;br&gt;
Kaggle সরাসরি কোড লিখে কাজ হাতেকলমে শুরু করার জন্য সবচেয়ে ভাল । এছাড়া অনেক ডাটাসেটও ব্যাবহার এর জন্য পাওয়া যায়।&lt;br&gt;
এসব এর বাইরেও গেম জ্যাম , টেকনোলজি স্পেসিফিক অনেক প্রতিযোগীতাও আছে। নিজের অভিজ্ঞতা কম থাকায় ঐ বিষয় আমি লিখলাম না।&lt;/p&gt;

&lt;p&gt;১-৪ সবই যে কেউ শুরু করতে পারে , তবে প্রত্যেকটারই কিছু পূর্বশর্ত আছে , হতে পারে কোন প্রোগ্রামিং ল্যাঙ্গুয়েজ , হতে পারে কোন টুলস শিখা ।তাই , একাবারে নতুন যারা তারা প্রথমে সবই খোঁজ নিয়ে অংশ নিয়ে দেখতে পারো। তবে কোন একটা বা বড়জোর দুইটাতে লেগে থাকা উচিৎ।&lt;br&gt;
যেকোনো কিছুতেই ভাল করতে সময় , শ্রম আর মনোযোগ দেয়া লাগে । শুরুতেই সব পারবে এমন না ভেবে , মজার জন্য অংশ নিলেই ভাল।&lt;/p&gt;

</description>
      <category>competativeprogramming</category>
      <category>beginners</category>
      <category>bangla</category>
      <category>contest</category>
    </item>
    <item>
      <title>প্রোগ্রামিং কন্টেস্ট এর জন্য শুরুতে যা যা শিখবো (কমন টপিক)</title>
      <dc:creator>sakib ahamed shahon </dc:creator>
      <pubDate>Sat, 10 Feb 2024 18:11:09 +0000</pubDate>
      <link>https://dev.to/sakib3201/prograamin-knttestt-er-jny-shurute-yaa-yaa-shikhbo-kmn-ttpik-3jck</link>
      <guid>https://dev.to/sakib3201/prograamin-knttestt-er-jny-shurute-yaa-yaa-shikhbo-kmn-ttpik-3jck</guid>
      <description>&lt;p&gt;কন্টেস্ট এর প্রিপারেশন এর জন্য স্টেপ বাই স্টেপ কিছু টোপীক কভার করা ভাল । বিগেনার হিসেবে যে টপিক গুলো জানা থাকা দরকার আর যা যা শিখা দরকার তার লিস্ট অনেকটা নিচের মত :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Basic Syntax :&lt;/strong&gt; একেবারে শুরুর পর্যায় । আশা করা যায় এই স্টেপে লুপ , 
অপেরটর , কন্ডিশন , এ্যরে , স্ট্রাকচার ইত্যাদি পারো ।
Implementation problem : খুবি সাধারন সমস্যা , কোন ফর্মুলা থেকে অউটপুট বের করা বা যা বলা আছে তেমন ভাবে কোন সিমুলেশন চালাতে পারা ।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;STL &amp;amp; Data structure Basics :&lt;/strong&gt; STL বা Standard Template Library C++ এর অংশ। অনেক কাজ আর ডাটা স্ট্রাকচার বিল্ডিন থাকে সেগুলো ব্যাবহার করতে শিখা । (আর C++ খুব একটা কঠিন না, যা সি তে কাজ করে সেই কোড C++ এও কাজ করে)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sorting :&lt;/strong&gt; বিভিন্ন ধরনের ডাটাকে সর্ট করা , সর্টিং এর শর্তগুলো বদলাতে পারা , Quick sort, merge sort etc কিছু এল্গ শিখা দরকার পরে।&lt;/li&gt;
&lt;li&gt;Binary Search :সাজানো ডাটা থেকে তথ্য খোজা , কিছু সমীকরণ এর সমাধান করতে পারা Binary Search algorithm দিয়ে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Greedy Method :&lt;/strong&gt; প্রতি স্টেপে সবচেয়ে ভাল উত্তর নিয়ে সল্যুশন বের করার একটা টেকনিক ।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Basic Graph representation :&lt;/strong&gt; বিভিন্ন ধরনের গ্রাফ কি , কোডে কিভাবে রেপ্রেসেন্ট করে এদের এতটুকু জানা।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BFS &amp;amp; DFS :&lt;/strong&gt; গ্রাফ এর তথ্য বের করা এবং সিস্টেম্যাটিকালি বের করা বা ট্রাভারস করা।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Basic Number theory :&lt;/strong&gt; (LCM ,GCD, prime factoring) কিছু থিউরি আর মৌলীক সংখ্যা নিয়ে কাজ করতে বিশেষ কিছু এলগোরিদম জানা।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Basic Dynamic programming :&lt;/strong&gt; প্রায় সব সম্ভাব্য আন্সার থেকে সেরা টা বের করা তাও অনেক তারা তারি , বিশেষ আপ্রচ । নতুনদের জন্য একটু কঠিন , তাই অনুশীলন বেশী প্রয়োজন ।&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;টপিক গুলো সবই এত অল্প কথায় বোঝানোর মত না। তবে নাম জানা থাকলে অন্ততও ইউটিউব আর গুগল থেকে নিজেই শিখা যাবে। শিখার সবচেয়ে ভাল উপায় প্রতি টপিক এর থেউরি শিখেই ঐ টপিক এর ৫-১০টা প্রবলেম সল্ভ করা । এবং খেয়াল রাখা যাতে সহজ থেকে আসতে আসতে কঠিন সমস্যা সমাধান করা হয়।একি ডিফিকাল্টটির প্রবলেম বার বার সল্ভ করলে উন্নতি হওয়া থেমে যায় দ্রুত । তাই ক্রমাগত প্রব্লেম এর ডিফিকাল্টি বাড়াতে থাকতে হয়। &lt;/p&gt;

</description>
      <category>competativeprogramming</category>
      <category>dsa</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Types of Programming Competitions: An intro for New Programmers</title>
      <dc:creator>sakib ahamed shahon </dc:creator>
      <pubDate>Sat, 10 Feb 2024 17:53:58 +0000</pubDate>
      <link>https://dev.to/sakib3201/types-of-programming-competitions-an-intro-for-new-programmers-3pm6</link>
      <guid>https://dev.to/sakib3201/types-of-programming-competitions-an-intro-for-new-programmers-3pm6</guid>
      <description>&lt;p&gt;Programming competitions are fantastic opportunities for young programmers to showcase their skills, learn new concepts, and connect with others. There are many different types of competitions available, each with its unique appeal and challenges. They come in different formats, on different topics, and with varying degrees of requirements. &lt;/p&gt;

&lt;p&gt;In this article, we'll look into the four that seem to be the most common for new programmers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1) Algorithmic Problem-Solving Contests:&lt;/strong&gt; These competitions focus on solving programming problems with accurate outputs based on given inputs.&lt;br&gt;
They are commonly divided into two broad categories, Short (2-3 hours) and Long (ICPC, NCPC, etc) formats based on time or in Team-based (usually Long contests) and individual (usually Short contests).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Essential Skills:

&lt;ul&gt;
&lt;li&gt;Data structures and algorithms&lt;/li&gt;
&lt;li&gt;Programming languages (C, C++, STL)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Practice Platforms to hone your skills:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Codeforces&lt;/li&gt;
&lt;li&gt;Codechef&lt;/li&gt;
&lt;li&gt;HackerRank&lt;/li&gt;
&lt;li&gt;Hackerearth&lt;/li&gt;
&lt;li&gt;LightOJ&lt;/li&gt;
&lt;li&gt;SPOJ&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2) CTF (Capture the Flag):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Emphasizes cybersecurity expertise.&lt;/li&gt;
&lt;li&gt;Various formats: Jeopardy, Attack &amp;amp; Defense&lt;/li&gt;
&lt;li&gt;Team-based competitions.&lt;/li&gt;
&lt;li&gt;Essential Skills:

&lt;ul&gt;
&lt;li&gt;System vulnerabilities&lt;/li&gt;
&lt;li&gt;Networking&lt;/li&gt;
&lt;li&gt;Cryptography&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3) Hackathons:&lt;/strong&gt; These are competitions focused on developing app/website/software prototypes to address real-world problems. You not only build the solution but usually also pitch your solution for a real-world problem. Some of these even require you to consider the business aspect of your solutions.&lt;/p&gt;

&lt;p&gt;Essential Skills:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Programming&lt;/li&gt;
&lt;li&gt;Design&lt;/li&gt;
&lt;li&gt;Presentation&lt;/li&gt;
&lt;li&gt;Video editing&lt;/li&gt;
&lt;li&gt;Writing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4) Machine Learning/AI Contests:&lt;/strong&gt; These types of competitions require you to create machine learning models using provided datasets or code AI bots/agents to perform specific tasks. Although they have a relatively high requirement for entry they are great for people who love AI and Machine learning.&lt;/p&gt;

&lt;p&gt;Essential Skills:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Machine learning&lt;/li&gt;
&lt;li&gt;Data analysis&lt;/li&gt;
&lt;li&gt;Python, R, or any programming language with good tools for machine learning, data science libraries.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Learning &amp;amp; Practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kaggle: The go-to platform&lt;/li&gt;
&lt;li&gt;Exploring data sets&lt;/li&gt;
&lt;li&gt;Codingames&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Different people love different types of programming contests. However, algorithmic contests are the most dominant one that doesn't mean there aren't any other contests of value or ones that have fun. What's important is to explore as many as you can and find the ones you enjoy the most or the ones that align with your personal goals.&lt;/p&gt;

&lt;p&gt;Let me know if you know of other interesting formats or have any queries.&lt;/p&gt;

&lt;p&gt;[Side note: This is mostly for students who haven't yet graduated or are completely new to programming. Many more niche competitions have not been included for that reason. But you if think there's some way to improve this post do let me know. As a new writer, I appreciate your feedback]&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Top 10 Online competitive programming platforms review</title>
      <dc:creator>sakib ahamed shahon </dc:creator>
      <pubDate>Fri, 13 May 2022 09:04:28 +0000</pubDate>
      <link>https://dev.to/sakib3201/10-online-competitive-programming-platforms-review-4dkf</link>
      <guid>https://dev.to/sakib3201/10-online-competitive-programming-platforms-review-4dkf</guid>
      <description>&lt;p&gt;When you are just starting out as a competitive programmer selecting one online judge can become a bit daunting. Specially with so many out there. But not all platforms are made the same. While some are excellent for their active community and regular contest , some might have an organized collection of limited but very high quality content. That's why I am writing a review on 10 common online judges(competitive programming platforms) and my experience using them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code Forces :&lt;/strong&gt; By far the most popular online judge. Their best part is that contest are by all means very frequent and has one of the most active community in the competitive programming world. For people who will be taking part in short (2-3 hour) contest regularly this platform is the best. On the downside because the contests are so frequent a large number of problems are being added all the time. And finding a curated set of problem for you to practice becomes really tough at times.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code Chef :&lt;/strong&gt; Also holds frequent and regular contest. I loved their monthly long contest (last for 2-3 days) which I believe is a good place for beginner to learn as they can think about problems without the constant pressure of running out of time. They also have great regional support as a large number of problem statements come in different languages. Has some feature as lists of curated problems for beginners. Overall a complete platform. Also they often provide video editorial/tutorial for the problems making it an excellent platform for learners.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hacker Rank :&lt;/strong&gt; Contests aren't held with that much consistency. But has excellent tutorials and problem sets for gaining proficiency in different programming languages and topic based learning. Its more geared towards technical interview prep than for competitive programming. But their C++ module was immensely helpful for learning C++ STL (Standard Template Library) for me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hacker Earth :&lt;/strong&gt; Regular contests for recruitment are held but not that many for pure and fun competitive programming. Still an excellent platform . Specially they have a organized collection of problems covering almost all topics step by step. You can find it under their codemonk feature. Which provides an overall roadmap for beginners as well as a good list of problems to practice on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Light Oj :&lt;/strong&gt; Best resource I found for topic based learning and problem solving. Specially if you are taking part in ACM ICPC this might prove to be a great resource. They have a relatively smaller collection of problems (around only 500) but each one is very well written, classic and fun problem. Each problem has a good take away lesson. Their editorials are opensource. Which means they are community driven and excellent place for opensource contributions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;At Coder :&lt;/strong&gt; A Japanese platform but has good English language support. Holds regular contests and their problem statements are very clear , concise and to the point. For beginners who are struggling with brute force , implementation problems or just looking for easy problems to solve this is a good place to start. Specially for simply increasing speed for solving those really easy problems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Online Judge :&lt;/strong&gt; Previously known as &lt;code&gt;UVA&lt;/code&gt; this online judge has been around for fairly long. They have some good problems but the platform itself is quite old fashioned and doesn't have that many features. One downside is that a lot of their problem statements are simply cumbersome and confusing. So, unless you have a list of curated problems from this site I personally don't recommend new programmers to practice using this site. There are simply better options.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SPOJ :&lt;/strong&gt; Kind of old platform, but has quality problems. The judge is a bit fussy about time and quite often you have to optimize every millisecond out of your code. This however teaches you to writing code that writes really fast in whatever language you are practicing in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Timus :&lt;/strong&gt; Has good collection of problems. Specially of mathematical nature. But not that good in general cases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beecrowd :&lt;/strong&gt; Previously known as &lt;code&gt;URI online judge&lt;/code&gt; , is a good place for absolute newbies . But after solving about 70-100 problems is best and more efficient to move to other platforms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summary :&lt;/strong&gt; If you are a beginner starting out than &lt;code&gt;LightOj&lt;/code&gt; will be best for targeted topic based practicing, &lt;code&gt;Code Forces&lt;/code&gt; and &lt;code&gt;Code Chef&lt;/code&gt; for regular contests and general practicing , &lt;code&gt;Hacker Rank&lt;/code&gt; for increasing proficiency in programming languages.&lt;/p&gt;

&lt;p&gt;Platform links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://codeforces.com" rel="noopener noreferrer"&gt;Code Forces&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.codechef.com" rel="noopener noreferrer"&gt;Code Chef&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hackerrank.com" rel="noopener noreferrer"&gt;Hacker Rank&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hackerearth.com" rel="noopener noreferrer"&gt;Hacker Earth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lightoj.com" rel="noopener noreferrer"&gt;LightOj&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://atcoder.jp" rel="noopener noreferrer"&gt;At Coder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.beecrowd.com.br" rel="noopener noreferrer"&gt;URI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://onlinejudge.org" rel="noopener noreferrer"&gt;UVA&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>competitiveprogramming</category>
      <category>beginners</category>
      <category>programmingcontest</category>
      <category>cp</category>
    </item>
    <item>
      <title>কম্পেটিটিভ প্রোগ্রামিং ও নতুনদের শুরুর জন্য ১০টি অনলাইন জাজের রিভিউ</title>
      <dc:creator>sakib ahamed shahon </dc:creator>
      <pubDate>Fri, 13 May 2022 08:23:45 +0000</pubDate>
      <link>https://dev.to/sakib3201/kmpettittibh-prograamin-o-ntunder-shurur-jny-10tti-anlaain-jaajer-ribhiu-19co</link>
      <guid>https://dev.to/sakib3201/kmpettittibh-prograamin-o-ntunder-shurur-jny-10tti-anlaain-jaajer-ribhiu-19co</guid>
      <description>&lt;p&gt;কম্পেটিটিভ প্রোগ্রামিং এর শুরুতে আসলে এত্ত এত্ত জাজ চোখে পরে যে অনেক সময় কোনটায় কখন প্রাক্টিস করবো বোঝা যায় না। আবার অনেক সময় প্রশ্ন জাগে যে কোনটা সবচেয়ে ভাল জাজ । তাই মুটামুটি কমন জাজ গুলোর একটা ইন্ট্রো দেওয়া ।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code Forces :&lt;/strong&gt; মোস্ট পপুলার অনলাইন জাজ , প্রবলেম এর কুয়ালিটি বেশ ভাল। সবচেয়ে ভাল দিক নিয়মিত কন্টেস্ট হয় এবং প্রচুর পারটিসিপেন্ট থাকে। যারা রেগুলার কন্টেস্ট করতে চায় তাদের জন্য আমার মতে সেরা প্ল্যাটফর্ম । অসুবিধার মধ্য পরে টপিক ভিত্তিক ভাবে গুছানো প্রবলেম পাওয়া, এছাড়া প্রচুর কন্টেস্ট হওয়াতে এই জাজে নতুন নতুন প্রবলেম অ্যাড হতেই থাকে। অনেক ক্ষেত্রেই নতুনরা এত প্রবলেম যাচাই বাছাই করতে পারে না ।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code Chef :&lt;/strong&gt; এখানেও রেগুলার কন্টেস্ট হয় । এদের লং কন্টেস্ট নতুনদের শিখার জন্য বেশ ভাল । প্রব্লেম স্টেটমেন্ট বেশ ক্লিয়ার এবং অনেক প্রবলেম স্টেটমেন্ট বাংলাতেও পাওয়া যায় । ওদের প্রবলেম গুলো বেশ সহজ ভাবে লিখা । এছাড়া এদের লারনিং সিরিজে নতুনদের জন্য গুছানো বেশ কিছু প্রবলেম এর কালেকশন আছে ।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hacker Rank :&lt;/strong&gt; কন্টেস্ট রেগুলার না হলেও ল্যাঙ্গুয়েজ স্পেসিফিক শিখার জন্য এবং টপিক বেসড শিখার জন্য বেশ ভাল। স্পেশালি সিপিপি এর STL শিখার জন্য খুবি ভাল কিছু মডিউল আছে ।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hacker Earth :&lt;/strong&gt; ওদের এলগও ভিজুলাইজেশন এর জন্য কিছু ফিচার শিখার জন্য বেশ ভাল। এছাড়া ওদের কোডমাঙ্ক মডিউলে মুটা মুটি স্টেপ বাই স্টেপ বেশ ভাল একটা গাইড দেওয়া আছে প্রবলেম সল্ভিং এর ।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Light Oj :&lt;/strong&gt; টপিক বেসড শিখার জন্য খুবি ভাল একটা প্লাটফর্ম । ওদের প্রবলেম এর পরিমাণ কম । মোট হয়তো ৫০০ এরো কম । কিন্তু সব প্রবলেমি খুব ভাল কুয়ালিটির । যারা আইসিপিসি এর জন্য বা এই জাতীয় ফরম্যাট এর জন্য প্রস্তুতি নিচ্ছ তাদের জন্য খুবি ভাল।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;At Coder :&lt;/strong&gt; নতুনদের ইমপ্লেমেন্টেশন প্রবলেম প্র্যাকটিস এর জন্য খুবি ভাল । স্ট্যাটমেন্ট খুবি সহজ ভাবে লিখা । যাদের ইংলিশ একটু দুর্বল বা স্টেটমেন্টে চেয়েছে কি তাই বুঝতেই ধৈর্য শেষ তাদের জন্য খুবি ভাল । এছাড়া মুটা মুটি নিয়মিত কন্টেস্টো হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;URI :&lt;/strong&gt; একেবারে অ আ ক খ এর জন্য চলে। তবে খুব বেশী প্রাকটিস না করাই ভাল । কেউ করলেও ১০০ এর মত সল্ভের পর বাদ দেওয়া ভাল।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UVA :&lt;/strong&gt; বেশ পুরাতন জাজ । অনেক ভাল সমস্যা আছে এতে , কিন্তু স্টেট্মেন্ট গুলো অনেক বড় , অনেক ক্ষেত্রেই ইনপুট অউটপুট ফরম্যাট ঠিক করতে ভুগতে হয়। তাই প্রধান অনুশীলন এর জন্য না ব্যাবহার করাই ভাল। কিছু বাছাই করা সমস্যার জন্য ব্যাবহার করাই ভাল।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SPOJ :&lt;/strong&gt; পুরাতন জাজ । অনেকটা আউটডেটেড । ভাল সমস্যা আছে , কিন্তু খুজে বের করতে সময় লাগে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TIMUS :&lt;/strong&gt; ম্যাথের অনেক ভাল প্রবলেম আছে । তবে জেনেরাল কেসে ভাল না খুব ।&lt;/p&gt;

&lt;p&gt;সবশেষে নতুনদের ক্ষেত্রে, টপিক ধরে শিখার জন্য ভালও &lt;code&gt;LightOj&lt;/code&gt; , ল্যাঙ্গুয়েজ প্রফিসিয়েন্সির জন্য &lt;code&gt;Hacker Rank&lt;/code&gt; আর রেগুলার কন্টেস্ট এর জন্য &lt;code&gt;Code Forces&lt;/code&gt; এবং &lt;code&gt;Code Chef&lt;/code&gt; । আমার ব্যাক্তিগত অভিজ্ঞতার ভিত্তিতে মতামত দেয়া। অনেকের প্রেফারেন্স আলাদা হতে পারে।&lt;br&gt;
কারন সব প্ল্যাটফর্মই ভাল ভাল প্রবলেম দেয়া আছে । তবে বেশিরভাগ ক্ষেত্রেই বাছাই করাটা কষ্টের আর সময় সাপেক্ষ। তাই নতুনদের এই চার প্ল্যাটফর্মের মধেই থাকা ভাল ।&lt;/p&gt;

&lt;p&gt;Platform links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://codeforces.com" rel="noopener noreferrer"&gt;Code Forces&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.codechef.com" rel="noopener noreferrer"&gt;Code Chef&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hackerrank.com" rel="noopener noreferrer"&gt;Hacker Rank&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hackerearth.com" rel="noopener noreferrer"&gt;Hacker Earth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lightoj.com" rel="noopener noreferrer"&gt;Ligh Oj&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://atcoder.jp" rel="noopener noreferrer"&gt;At Coder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.beecrowd.com.br" rel="noopener noreferrer"&gt;URI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://onlinejudge.org" rel="noopener noreferrer"&gt;UVA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.spoj.com" rel="noopener noreferrer"&gt;SPOJ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://acm.timus.ru" rel="noopener noreferrer"&gt;TIMUS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programmingcontest</category>
      <category>onlinejudge</category>
      <category>competitiveprogramming</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
