<?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>Forem: Md. Maruf Sarker</title>
    <description>The latest articles on Forem by Md. Maruf Sarker (@marufsarker).</description>
    <link>https://forem.com/marufsarker</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%2F2585327%2F0aa70976-a958-4691-86bf-8ca0696ef297.jpg</url>
      <title>Forem: Md. Maruf Sarker</title>
      <link>https://forem.com/marufsarker</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/marufsarker"/>
    <language>en</language>
    <item>
      <title>The real reason your code becomes messy and how DI fixes it</title>
      <dc:creator>Md. Maruf Sarker</dc:creator>
      <pubDate>Thu, 19 Mar 2026 23:11:19 +0000</pubDate>
      <link>https://forem.com/marufsarker/the-real-reason-your-code-becomes-messy-and-how-di-fixes-it-48cb</link>
      <guid>https://forem.com/marufsarker/the-real-reason-your-code-becomes-messy-and-how-di-fixes-it-48cb</guid>
      <description>&lt;p&gt;Most people think Dependency Injection (DI) is some advanced .NET magic or framework feature. It’s not. It’s actually a very simple idea, but once you understand it properly, it completely changes how you design systems.&lt;/p&gt;

&lt;p&gt;Think about a real-life scenario. You’re building a Food Delivery App. There’s an OrderService that places orders, and after placing an order, it needs to notify the user. The most straightforward way (what most beginners do) is: inside OrderService, you directly create an EmailService and send an email. It works, no problem.&lt;/p&gt;

&lt;p&gt;But then reality hits.&lt;/p&gt;

&lt;p&gt;Product team comes and says:&lt;br&gt;
“Users want SMS notifications.”&lt;br&gt;
Then later: “Add push notifications.”&lt;br&gt;
Then: “For some users, don’t notify at all.”&lt;/p&gt;

&lt;p&gt;Now your OrderService starts growing like this messy switch-case or if-else jungle. Every new requirement means you go back and modify the same class again and again. This is where the real problem is - your core logic (placing orders) is now tightly coupled with notification logic.&lt;/p&gt;

&lt;p&gt;This is exactly what DI tries to solve.&lt;/p&gt;

&lt;p&gt;Instead of saying:&lt;br&gt;
“I will send email from here”&lt;/p&gt;

&lt;p&gt;You change your thinking to:&lt;br&gt;
“I need something that can notify”&lt;/p&gt;

&lt;p&gt;That’s it. You introduce a contract like INotificationService. Now you can have multiple implementations: Email, SMS, Push, whatever. Your OrderService doesn’t know or care which one is being used. It just calls “notify”.&lt;/p&gt;

&lt;p&gt;Now comes the key idea.&lt;/p&gt;

&lt;p&gt;Instead of creating the dependency inside the class (new EmailService()), you let something else provide it. That “something” is usually the DI container.&lt;/p&gt;

&lt;p&gt;So when your application runs, the framework does something like:&lt;br&gt;
“OrderService needs INotificationService? Cool, here’s an EmailService (or SMS, or anything you configured).”&lt;/p&gt;

&lt;p&gt;Your class doesn’t decide anymore. It just uses.&lt;/p&gt;

&lt;p&gt;This one change sounds small, but the impact is huge.&lt;/p&gt;

&lt;p&gt;Now when requirements change, you don’t touch OrderService. You just change what gets injected. Today email, tomorrow SMS, next week maybe a third-party API. Your core logic stays clean and stable.&lt;/p&gt;

&lt;p&gt;This also connects directly to how modern frameworks like ASP.NET Core work internally. When a request comes in, the framework creates your controller, sees what it needs in the constructor, and automatically provides those dependencies from the container. You never write new - the system wires everything together for you.&lt;/p&gt;

&lt;p&gt;The deeper point here is not just “how to use DI”, but why it exists.&lt;/p&gt;

&lt;p&gt;DI is about removing hardcoded decisions from your code. It separates “what you do” from “how it’s done”. That’s why your code becomes easier to change, easier to test, and much more scalable as the system grows.&lt;/p&gt;

&lt;p&gt;Actual way to think about it:&lt;br&gt;
Before DI → “I decide everything inside my class”&lt;br&gt;
After DI → “I focus on my job, system decides the rest”&lt;/p&gt;

&lt;p&gt;And honestly, in real-world projects, this is the difference between code that works today and code that survives after 6 months of changes.&lt;/p&gt;

&lt;p&gt;So next time you see DI, don’t think about syntax or builder.Services.AddScoped. Think about this:&lt;/p&gt;

&lt;p&gt;You are not injecting services.&lt;br&gt;
You are injecting flexibility into your system.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>dependencyinjection</category>
      <category>di</category>
      <category>backenddevelopment</category>
    </item>
    <item>
      <title>Installing .NET 10 on Linux (Pop!_OS) — The Real Journey 🚀</title>
      <dc:creator>Md. Maruf Sarker</dc:creator>
      <pubDate>Sat, 14 Mar 2026 11:37:11 +0000</pubDate>
      <link>https://forem.com/marufsarker/installing-net-10-on-linux-popos-the-real-journey-a9k</link>
      <guid>https://forem.com/marufsarker/installing-net-10-on-linux-popos-the-real-journey-a9k</guid>
      <description>&lt;p&gt;So today I decided:&lt;br&gt;
“Let’s install &lt;strong&gt;.NET 10&lt;/strong&gt; on my Pop!_OS dev machine.”&lt;/p&gt;

&lt;p&gt;Simple, right?&lt;/p&gt;

&lt;p&gt;Microsoft docs say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; dotnet-sdk-10.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reality check from Linux:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;E: Unable to locate package dotnet-sdk-10.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Linux basically said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“That package? Never heard of it bro.” 💀&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So here’s the &lt;strong&gt;full A → Z journey&lt;/strong&gt; of installing &lt;strong&gt;.NET 10 on Linux properly&lt;/strong&gt;, without breaking your dev environment.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 0 — Read the Docs Completely 📚
&lt;/h1&gt;

&lt;p&gt;Before running &lt;strong&gt;any command&lt;/strong&gt;, read the &lt;strong&gt;entire documentation first&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Not just the command block.&lt;/p&gt;

&lt;p&gt;Many times we jump straight to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;copy → paste → run&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But docs often contain important notes like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;supported OS versions&lt;/li&gt;
&lt;li&gt;repository limitations&lt;/li&gt;
&lt;li&gt;architecture support&lt;/li&gt;
&lt;li&gt;alternative installation methods&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If I had read the &lt;strong&gt;whole doc first&lt;/strong&gt;, I would have immediately seen that the &lt;strong&gt;Ubuntu 22.04 repo may not contain .NET 10 yet&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Lesson learned:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Always read the &lt;strong&gt;entire doc&lt;/strong&gt;, not just the command snippet.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Step 1 — Understand the Problem 🧠
&lt;/h1&gt;

&lt;p&gt;My machine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OS: &lt;strong&gt;Pop!_OS (Ubuntu 22.04 base)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Repo: Microsoft Ubuntu repo&lt;/li&gt;
&lt;li&gt;Installed SDKs:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet &lt;span class="nt"&gt;--list-sdks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;8.0.418
9.0.203
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Meaning:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Version&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;.NET 8&lt;/td&gt;
&lt;td&gt;LTS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.NET 9&lt;/td&gt;
&lt;td&gt;Latest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.NET 10&lt;/td&gt;
&lt;td&gt;❌ Not in repo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;So APT couldn’t install it.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 2 — Use Microsoft's install script
&lt;/h1&gt;

&lt;p&gt;When the repo doesn’t have the SDK yet, Microsoft provides an &lt;strong&gt;official install script&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Download it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget https://dot.net/v1/dotnet-install.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make it executable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x dotnet-install.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install .NET 10:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./dotnet-install.sh &lt;span class="nt"&gt;--channel&lt;/span&gt; 10.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After installation the script said:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Installed version is 10.0.201
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But when I checked:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet &lt;span class="nt"&gt;--list-sdks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It still showed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;8.0
9.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wait… what?&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 3 — The PATH Problem 🧩
&lt;/h1&gt;

&lt;p&gt;The script installs .NET here:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.dotnet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But my system installation lives here:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/usr/share/dotnet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So Linux was still using the &lt;strong&gt;APT version of dotnet&lt;/strong&gt;.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;DOTNET_ROOT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/.dotnet
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/.dotnet:&lt;span class="nv"&gt;$PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the prompt changed instantly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;dotnet --version
10.0.201
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nice.&lt;/p&gt;

&lt;p&gt;But there was another problem…&lt;/p&gt;

&lt;p&gt;Now only &lt;strong&gt;.NET 10 appeared&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 4 — Two Different .NET Installations
&lt;/h1&gt;

&lt;p&gt;My system now had &lt;strong&gt;two separate dotnet environments&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Location&lt;/th&gt;
&lt;th&gt;Installed SDKs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/usr/share/dotnet&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;8.0, 9.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~/.dotnet&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;10.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Which is messy.&lt;/p&gt;

&lt;p&gt;Best practice on Linux is to keep everything in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/usr/share/dotnet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So I installed .NET 10 &lt;strong&gt;system-wide&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 5 — Install .NET 10 System-wide
&lt;/h1&gt;

&lt;p&gt;Run the installer with sudo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; ./dotnet-install.sh &lt;span class="nt"&gt;--channel&lt;/span&gt; 10.0 &lt;span class="nt"&gt;--install-dir&lt;/span&gt; /usr/share/dotnet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/usr/share/dotnet/sdk/10.0.201
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Step 6 — Remove the Old Local Installation
&lt;/h1&gt;

&lt;p&gt;Since &lt;code&gt;.NET&lt;/code&gt; was already installed in &lt;code&gt;~/.dotnet&lt;/code&gt;, the shell kept using it.&lt;/p&gt;

&lt;p&gt;Remove it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/.dotnet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reset bash cache:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;hash&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Step 7 — Verify Everything
&lt;/h1&gt;

&lt;p&gt;Now run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet &lt;span class="nt"&gt;--list-sdks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;8.0.418
9.0.203
10.0.201
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10.0.201
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Boom.&lt;/p&gt;

&lt;p&gt;Clean setup.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Linux .NET Setup 💻
&lt;/h1&gt;

&lt;p&gt;My machine now looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/usr/share/dotnet/sdk
├── 8.0.418
├── 9.0.203
└── 10.0.201
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Meaning:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;SDK&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;.NET 8&lt;/td&gt;
&lt;td&gt;LTS (production apps)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.NET 9&lt;/td&gt;
&lt;td&gt;Current release&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.NET 10&lt;/td&gt;
&lt;td&gt;Latest development&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  Pro Tip — Use global.json
&lt;/h1&gt;

&lt;p&gt;Real projects lock the SDK version.&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 json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sdk"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"8.0.418"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;teammates use the same SDK&lt;/li&gt;
&lt;li&gt;CI/CD builds correctly&lt;/li&gt;
&lt;li&gt;no version mismatch&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  dotnet #linux #backend #softwareengineering #devlife
&lt;/h1&gt;

</description>
      <category>webdev</category>
      <category>csharp</category>
      <category>dotnet</category>
      <category>aspnet</category>
    </item>
    <item>
      <title>Pattern Matching vs Manual Casting in C#</title>
      <dc:creator>Md. Maruf Sarker</dc:creator>
      <pubDate>Mon, 09 Mar 2026 08:52:41 +0000</pubDate>
      <link>https://forem.com/marufsarker/pattern-matching-vs-manual-casting-in-c-3ih0</link>
      <guid>https://forem.com/marufsarker/pattern-matching-vs-manual-casting-in-c-3ih0</guid>
      <description>&lt;p&gt;When working with &lt;strong&gt;polymorphism&lt;/strong&gt; in C#, you often deal with a base type that can represent many different derived types.&lt;/p&gt;

&lt;p&gt;For example, in a payment system you might have a base class &lt;code&gt;Payment&lt;/code&gt;, and several derived classes like &lt;code&gt;CreditCardPayment&lt;/code&gt;, &lt;code&gt;BankTransferPayment&lt;/code&gt;, and &lt;code&gt;MobilePayment&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;When you store these objects in a &lt;code&gt;List&amp;lt;Payment&amp;gt;&lt;/code&gt;, the compiler only knows that each item is a &lt;code&gt;Payment&lt;/code&gt;. But sometimes you need to access properties that exist only on the specific child types.&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;type checking and casting&lt;/strong&gt; come into play.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Old Way: Manual Casting
&lt;/h1&gt;

&lt;p&gt;Before modern pattern matching features were introduced, developers had to manually check the type and then cast the object.&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 csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payment&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;CreditCardPayment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;cc&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CreditCardPayment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;payment&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CardLastFour&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 two steps are happening:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check the type with &lt;code&gt;is&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Cast the object manually using &lt;code&gt;(CreditCardPayment)&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This works, but it has a few problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More boilerplate code&lt;/li&gt;
&lt;li&gt;Easy to forget the type check&lt;/li&gt;
&lt;li&gt;Harder to read when multiple types are involved&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you have several derived types, the code quickly becomes messy.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payment&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;CreditCardPayment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;cc&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CreditCardPayment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;payment&lt;/span&gt;&lt;span class="p"&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="n"&gt;payment&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;BankTransferPayment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;bt&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BankTransferPayment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;payment&lt;/span&gt;&lt;span class="p"&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="n"&gt;payment&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;MobilePayment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;mp&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MobilePayment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;payment&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 pattern was very common in older C# codebases.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Modern Way: Pattern Matching
&lt;/h1&gt;

&lt;p&gt;C# introduced &lt;strong&gt;pattern matching&lt;/strong&gt; to simplify type checks and casting.&lt;/p&gt;

&lt;p&gt;Instead of two steps, you can do both in a single line.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payment&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;CreditCardPayment&lt;/span&gt; &lt;span class="n"&gt;cc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CardLastFour&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;What happens here?&lt;/p&gt;

&lt;p&gt;The compiler:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Checks if &lt;code&gt;payment&lt;/code&gt; is &lt;code&gt;CreditCardPayment&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;If true, automatically casts it&lt;/li&gt;
&lt;li&gt;Assigns the result to &lt;code&gt;cc&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Inside the block, &lt;code&gt;cc&lt;/code&gt; is already strongly typed.&lt;/p&gt;

&lt;p&gt;No manual casting required.&lt;/p&gt;




&lt;h1&gt;
  
  
  Switch Pattern Matching
&lt;/h1&gt;

&lt;p&gt;Pattern matching becomes even more powerful when used with &lt;code&gt;switch&lt;/code&gt;.&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 csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;details&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;payment&lt;/span&gt; &lt;span class="k"&gt;switch&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;CreditCardPayment&lt;/span&gt; &lt;span class="n"&gt;cc&lt;/span&gt;   &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;$"Credit Card ending in &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CardLastFour&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;BankTransferPayment&lt;/span&gt; &lt;span class="n"&gt;bt&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;$"Bank Transfer via &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;bt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BankName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;MobilePayment&lt;/span&gt; &lt;span class="n"&gt;mp&lt;/span&gt;       &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;$"&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;mp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Provider&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; | Phone: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;mp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PhoneNumber&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;_&lt;/span&gt;                      &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"Unknown payment type"&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each branch automatically provides a typed variable.&lt;/p&gt;

&lt;p&gt;So inside the first branch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cc&lt;/code&gt; is a &lt;code&gt;CreditCardPayment&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inside the second:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;bt&lt;/code&gt; is a &lt;code&gt;BankTransferPayment&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inside the third:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;mp&lt;/code&gt; is a &lt;code&gt;MobilePayment&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No casting required anywhere.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why Pattern Matching is Better
&lt;/h1&gt;

&lt;h3&gt;
  
  
  1. Less Code
&lt;/h3&gt;

&lt;p&gt;Manual casting requires extra lines and repeated type checks.&lt;/p&gt;

&lt;p&gt;Pattern matching compresses the logic into a single clean expression.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Safer
&lt;/h3&gt;

&lt;p&gt;Manual casting can throw exceptions if you forget the type check.&lt;/p&gt;

&lt;p&gt;Pattern matching only runs the block if the type matches.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. More Readable
&lt;/h3&gt;

&lt;p&gt;Compare these two:&lt;/p&gt;

&lt;p&gt;Manual casting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payment&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;CreditCardPayment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;cc&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CreditCardPayment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;payment&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;Pattern matching:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payment&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;CreditCardPayment&lt;/span&gt; &lt;span class="n"&gt;cc&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The intent is much clearer.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Powerful with Switch Expressions
&lt;/h3&gt;

&lt;p&gt;Pattern matching enables expressive &lt;code&gt;switch&lt;/code&gt; logic that works very well with polymorphism.&lt;/p&gt;

&lt;p&gt;It keeps the code structured and avoids large chains of &lt;code&gt;if-else&lt;/code&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Real-World Use Case
&lt;/h1&gt;

&lt;p&gt;In the payment system example, we store all payments in a single list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Payment&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;payments&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each object could be a different type.&lt;/p&gt;

&lt;p&gt;When generating a payment summary, we use pattern matching to safely access the correct properties for each payment type.&lt;/p&gt;

&lt;p&gt;This allows the code to remain &lt;strong&gt;clean, type-safe, and maintainable&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  When Should You Use Pattern Matching?
&lt;/h1&gt;

&lt;p&gt;Use pattern matching when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You have a base class with multiple derived types&lt;/li&gt;
&lt;li&gt;You need to access properties specific to those types&lt;/li&gt;
&lt;li&gt;You want safer and cleaner code than manual casting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is especially useful when working with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Polymorphism&lt;/li&gt;
&lt;li&gt;Domain models&lt;/li&gt;
&lt;li&gt;Event systems&lt;/li&gt;
&lt;li&gt;Result types&lt;/li&gt;
&lt;li&gt;API response handling&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Manual casting was the standard approach for many years.&lt;br&gt;
But modern C# encourages &lt;strong&gt;pattern matching&lt;/strong&gt; because it is cleaner, safer, and easier to read.&lt;/p&gt;

&lt;p&gt;Instead of writing extra checks and casts, you can let the language handle it for you.&lt;/p&gt;

&lt;p&gt;Small improvements like this are why modern C# codebases feel significantly more expressive and maintainable.&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>polymorphism</category>
      <category>patternmatching</category>
      <category>oop</category>
    </item>
    <item>
      <title>YouTube Channel, Gmail, NID &amp; Monetization: A Complete Guide for New Creators</title>
      <dc:creator>Md. Maruf Sarker</dc:creator>
      <pubDate>Fri, 06 Mar 2026 17:55:38 +0000</pubDate>
      <link>https://forem.com/marufsarker/youtube-channel-gmail-nid-monetization-a-complete-guide-for-new-creators-2j1i</link>
      <guid>https://forem.com/marufsarker/youtube-channel-gmail-nid-monetization-a-complete-guide-for-new-creators-2j1i</guid>
      <description>&lt;p&gt;Starting a YouTube channel today is easier than ever. However, many creators—especially beginners—have important questions about &lt;strong&gt;Gmail accounts, identity verification, NID requirements, AdSense, security, and monetization&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Common questions include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does my Gmail name have to match my National ID (NID)?&lt;/li&gt;
&lt;li&gt;Can I use a different name for my YouTube channel?&lt;/li&gt;
&lt;li&gt;When does identity verification matter?&lt;/li&gt;
&lt;li&gt;How do I protect my channel from hackers?&lt;/li&gt;
&lt;li&gt;What is the safest structure for managing a YouTube channel?&lt;/li&gt;
&lt;li&gt;How can I reach monetization faster?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This guide answers all these questions in detail based on policies and guidelines from Google and YouTube.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Does Your Gmail Name Need to Match Your National ID (NID)?
&lt;/h2&gt;

&lt;p&gt;The short answer is &lt;strong&gt;no&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When creating a channel on YouTube, the Gmail account used to create or manage the channel &lt;strong&gt;does not need to match your legal name or National ID (NID)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Creators are free to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use any Gmail username&lt;/li&gt;
&lt;li&gt;Choose any YouTube channel name&lt;/li&gt;
&lt;li&gt;Operate under a brand name or pseudonym&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;Gmail:&lt;br&gt;
&lt;code&gt;techcreatorbd@gmail.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;YouTube Channel Name:&lt;br&gt;
&lt;code&gt;Tech Creator BD&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Legal Identity (NID):&lt;br&gt;
&lt;code&gt;Md. Maruf Sarker&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This setup is completely valid.&lt;/p&gt;

&lt;p&gt;Viewers will only see the &lt;strong&gt;channel name&lt;/strong&gt;, not the Gmail address behind it.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. When Does Identity Actually Matter?
&lt;/h2&gt;

&lt;p&gt;Identity becomes important &lt;strong&gt;when you start earning money&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To monetize your channel through the &lt;strong&gt;YouTube Partner Program&lt;/strong&gt;, you must connect a &lt;strong&gt;Google AdSense account&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is where legal identity verification is required.&lt;/p&gt;

&lt;p&gt;AdSense may request:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;National ID card&lt;/li&gt;
&lt;li&gt;Passport&lt;/li&gt;
&lt;li&gt;Driving license&lt;/li&gt;
&lt;li&gt;Address verification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;strong&gt;payment profile name must match your legal identity documents&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;Payment Profile Name:&lt;br&gt;
&lt;code&gt;Md. Maruf Sarker&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If the name on AdSense does not match your ID, verification may fail and payments could be delayed or blocked.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Relationship Between Gmail, YouTube Channel, and AdSense
&lt;/h2&gt;

&lt;p&gt;Think of the system in three layers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gmail Account
&lt;/h3&gt;

&lt;p&gt;Used for login and management.&lt;/p&gt;

&lt;p&gt;No legal name required.&lt;/p&gt;

&lt;h3&gt;
  
  
  YouTube Channel
&lt;/h3&gt;

&lt;p&gt;Public-facing identity.&lt;/p&gt;

&lt;p&gt;Can be a brand name.&lt;/p&gt;

&lt;h3&gt;
  
  
  AdSense Account
&lt;/h3&gt;

&lt;p&gt;Used for payments.&lt;/p&gt;

&lt;p&gt;Must match your legal identity.&lt;/p&gt;

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

&lt;p&gt;Gmail: &lt;code&gt;techcreatorbd@gmail.com&lt;/code&gt;&lt;br&gt;
Channel: &lt;code&gt;Tech Creator BD&lt;/code&gt;&lt;br&gt;
AdSense Payment Name: &lt;code&gt;Md. Maruf Sarker&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Common AdSense Mistakes That Cause Monetization Problems
&lt;/h2&gt;

&lt;p&gt;Many creators face issues because of avoidable mistakes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using a Fake Name in AdSense
&lt;/h3&gt;

&lt;p&gt;Some creators use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nicknames&lt;/li&gt;
&lt;li&gt;Channel names&lt;/li&gt;
&lt;li&gt;Random names&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But AdSense requires &lt;strong&gt;legal identity verification&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Always use the &lt;strong&gt;exact name from your ID&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Using Someone Else’s AdSense Account
&lt;/h3&gt;

&lt;p&gt;Some creators link their channel to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Friend’s AdSense&lt;/li&gt;
&lt;li&gt;Agency AdSense&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Problems that can occur:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They legally control the revenue&lt;/li&gt;
&lt;li&gt;Your payments depend on them&lt;/li&gt;
&lt;li&gt;Tax details belong to them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is always safer to &lt;strong&gt;create your own AdSense account&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Incorrect Address for PIN Verification
&lt;/h3&gt;

&lt;p&gt;After earning $10, Google sends a &lt;strong&gt;PIN code by mail&lt;/strong&gt; to verify your address.&lt;/p&gt;

&lt;p&gt;If the address is wrong, verification may fail.&lt;/p&gt;

&lt;p&gt;Example address format:&lt;/p&gt;

&lt;p&gt;Name: Md. Maruf Sarker&lt;br&gt;
Area: Kaliganj&lt;br&gt;
District: Gazipur&lt;br&gt;
Postal Code: 1720&lt;br&gt;
Country: Bangladesh&lt;/p&gt;




&lt;h3&gt;
  
  
  Creating Multiple AdSense Accounts
&lt;/h3&gt;

&lt;p&gt;Google allows &lt;strong&gt;only one AdSense account per person&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Creating multiple accounts can lead to suspension.&lt;/p&gt;




&lt;h3&gt;
  
  
  Selecting the Wrong Country
&lt;/h3&gt;

&lt;p&gt;Always choose the country where you actually live.&lt;/p&gt;

&lt;p&gt;For Bangladeshi creators:&lt;/p&gt;

&lt;p&gt;Country: Bangladesh&lt;/p&gt;




&lt;h2&gt;
  
  
  5. The Safest Way to Structure a YouTube Channel
&lt;/h2&gt;

&lt;p&gt;Many creators lose their channels due to poor account structure.&lt;/p&gt;

&lt;p&gt;The safest setup uses a &lt;strong&gt;Brand Account&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;p&gt;Gmail → YouTube Channel&lt;/p&gt;

&lt;p&gt;Use:&lt;/p&gt;

&lt;p&gt;Gmail → Brand Account → YouTube Channel&lt;/p&gt;

&lt;p&gt;Advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple owners allowed&lt;/li&gt;
&lt;li&gt;Channel ownership transferable&lt;/li&gt;
&lt;li&gt;Editors can upload videos without accessing your Gmail&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. The Two-Email Owner Security System
&lt;/h2&gt;

&lt;p&gt;Professional creators often use &lt;strong&gt;two separate Google accounts&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Primary Owner Gmail&lt;br&gt;
Backup Owner Gmail&lt;/p&gt;

&lt;p&gt;Both are assigned as &lt;strong&gt;owners&lt;/strong&gt; of the Brand Account.&lt;/p&gt;

&lt;p&gt;Structure:&lt;/p&gt;

&lt;p&gt;Primary Gmail&lt;br&gt;
Backup Gmail&lt;br&gt;
↓&lt;br&gt;
Brand Account&lt;br&gt;
↓&lt;br&gt;
YouTube Channel&lt;/p&gt;

&lt;p&gt;If one email is lost or hacked, the other owner can recover the channel.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Essential Security Settings
&lt;/h2&gt;

&lt;p&gt;You should enable strong security on your Google account.&lt;/p&gt;

&lt;p&gt;Important settings include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Two-Factor Authentication (2FA)&lt;/li&gt;
&lt;li&gt;Recovery email&lt;/li&gt;
&lt;li&gt;Recovery phone number&lt;/li&gt;
&lt;li&gt;Security alerts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using an &lt;strong&gt;authenticator app&lt;/strong&gt; is safer than SMS verification.&lt;/p&gt;

&lt;p&gt;Some creators also use &lt;strong&gt;hardware security keys&lt;/strong&gt; for maximum protection.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. How Most YouTube Channels Get Hacked
&lt;/h2&gt;

&lt;p&gt;Many channels are hacked through social engineering.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fake Sponsorship Emails
&lt;/h3&gt;

&lt;p&gt;Creators receive emails offering sponsorships.&lt;/p&gt;

&lt;p&gt;These emails contain files such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ZIP archives&lt;/li&gt;
&lt;li&gt;Fake contracts&lt;/li&gt;
&lt;li&gt;Malware disguised as documents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Opening these files can steal login cookies and session tokens.&lt;/p&gt;




&lt;h3&gt;
  
  
  Fake Copyright Emails
&lt;/h3&gt;

&lt;p&gt;Attackers send emails pretending to be YouTube support.&lt;/p&gt;

&lt;p&gt;The email contains a fake login page.&lt;/p&gt;

&lt;p&gt;Entering your password allows attackers to access your account.&lt;/p&gt;




&lt;h3&gt;
  
  
  Malicious Browser Extensions
&lt;/h3&gt;

&lt;p&gt;Some extensions promise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Subscriber growth&lt;/li&gt;
&lt;li&gt;Analytics tools&lt;/li&gt;
&lt;li&gt;Automation features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But secretly steal account data.&lt;/p&gt;

&lt;p&gt;Always install extensions from trusted developers.&lt;/p&gt;




&lt;h3&gt;
  
  
  Pirated Software
&lt;/h3&gt;

&lt;p&gt;Cracked editing software or plugins often contain malware.&lt;/p&gt;

&lt;p&gt;These can steal browser cookies and bypass 2FA.&lt;/p&gt;




&lt;h3&gt;
  
  
  Team Member Security Risks
&lt;/h3&gt;

&lt;p&gt;If an editor’s Gmail account is hacked, attackers may gain channel access.&lt;/p&gt;

&lt;p&gt;Always give editors &lt;strong&gt;limited permissions&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. What to Do if Your Channel Is Hacked
&lt;/h2&gt;

&lt;p&gt;If your channel is compromised:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Secure your Google account immediately&lt;/li&gt;
&lt;li&gt;Remove unknown devices&lt;/li&gt;
&lt;li&gt;Reset your password&lt;/li&gt;
&lt;li&gt;Contact YouTube Creator Support&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Acting quickly can help recover the channel.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Step-by-Step Guide to Creating a Secure YouTube Channel
&lt;/h2&gt;

&lt;p&gt;Here is a simple setup process.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Create a Dedicated Owner Gmail
&lt;/h3&gt;

&lt;p&gt;Use this account only for channel ownership.&lt;/p&gt;

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

&lt;p&gt;&lt;code&gt;owner.maruf@gmail.com&lt;/code&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 2: Create a Backup Gmail
&lt;/h3&gt;

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

&lt;p&gt;&lt;code&gt;maruf.backup@gmail.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This account will be your secondary owner.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 3: Enable Security Settings
&lt;/h3&gt;

&lt;p&gt;Activate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Two-Factor Authentication&lt;/li&gt;
&lt;li&gt;Recovery email&lt;/li&gt;
&lt;li&gt;Security alerts&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Step 4: Create a Brand Account Channel
&lt;/h3&gt;

&lt;p&gt;Create your channel under a &lt;strong&gt;Brand Account&lt;/strong&gt; instead of your personal Gmail.&lt;/p&gt;

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

&lt;p&gt;Channel Name: Tech Creator BD&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 5: Add the Backup Owner
&lt;/h3&gt;

&lt;p&gt;Add your second Gmail as &lt;strong&gt;Owner&lt;/strong&gt; in channel permissions.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 6: Add Editors
&lt;/h3&gt;

&lt;p&gt;Editors can upload videos without accessing your Gmail.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 7: Connect AdSense When Eligible
&lt;/h3&gt;

&lt;p&gt;When you meet the requirements for monetization, connect your AdSense account.&lt;/p&gt;

&lt;p&gt;Payment profile name must match your legal identity.&lt;/p&gt;




&lt;h2&gt;
  
  
  11. Monetization Requirements
&lt;/h2&gt;

&lt;p&gt;To join the YouTube Partner Program you must meet one of these:&lt;/p&gt;

&lt;h3&gt;
  
  
  Standard Path
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;1,000 subscribers&lt;/li&gt;
&lt;li&gt;4,000 watch hours in the last 12 months&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Shorts Path
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;1,000 subscribers&lt;/li&gt;
&lt;li&gt;10 million Shorts views in 90 days&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Early Fan Funding Access
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;500 subscribers&lt;/li&gt;
&lt;li&gt;3 uploads in 90 days&lt;/li&gt;
&lt;li&gt;3,000 watch hours or 3 million Shorts views&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  12. Strategy to Reach Monetization Faster
&lt;/h2&gt;

&lt;p&gt;Many creators grow faster using a &lt;strong&gt;Shorts + Long Video strategy&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Shorts
&lt;/h3&gt;

&lt;p&gt;Purpose: discoverability&lt;/p&gt;

&lt;p&gt;Length: 10–30 seconds&lt;/p&gt;

&lt;p&gt;Goal:&lt;br&gt;
1–2 Shorts per day&lt;/p&gt;




&lt;h3&gt;
  
  
  Long Videos
&lt;/h3&gt;

&lt;p&gt;Purpose: watch time&lt;/p&gt;

&lt;p&gt;Length: 6–12 minutes&lt;/p&gt;

&lt;p&gt;Goal:&lt;br&gt;
2–3 long videos per week&lt;/p&gt;




&lt;h2&gt;
  
  
  13. Focus on One Niche
&lt;/h2&gt;

&lt;p&gt;Channels grow faster when focused on one topic.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Programming&lt;/li&gt;
&lt;li&gt;Technology&lt;/li&gt;
&lt;li&gt;Education&lt;/li&gt;
&lt;li&gt;Finance&lt;/li&gt;
&lt;li&gt;Productivity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consistency helps the algorithm recommend your content.&lt;/p&gt;




&lt;h2&gt;
  
  
  14. Improve Titles and Thumbnails
&lt;/h2&gt;

&lt;p&gt;Bad title:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;C++ Tutorial&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Better title:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Learn C++ in 15 Minutes – The Fastest Beginner Guide&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Thumbnails should include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Large readable text&lt;/li&gt;
&lt;li&gt;Strong contrast&lt;/li&gt;
&lt;li&gt;Clear visual focus&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  15. Use Trending Topics
&lt;/h2&gt;

&lt;p&gt;Combining your niche with trending topics helps growth.&lt;/p&gt;

&lt;p&gt;Example topics for programming channels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI tools for developers&lt;/li&gt;
&lt;li&gt;Coding interview tips&lt;/li&gt;
&lt;li&gt;LeetCode strategies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Trending topics bring new viewers through search and recommendations.&lt;/p&gt;




&lt;h2&gt;
  
  
  16. Upload Consistently
&lt;/h2&gt;

&lt;p&gt;Recommended schedule:&lt;/p&gt;

&lt;p&gt;Daily&lt;br&gt;
1–2 Shorts&lt;/p&gt;

&lt;p&gt;Weekly&lt;br&gt;
2–3 long videos&lt;/p&gt;

&lt;p&gt;Consistency increases algorithm visibility.&lt;/p&gt;




&lt;h2&gt;
  
  
  17. Analyze YouTube Analytics
&lt;/h2&gt;

&lt;p&gt;Important metrics include:&lt;/p&gt;

&lt;p&gt;Click-through rate: 6–10%&lt;/p&gt;

&lt;p&gt;Audience retention: 40–60%&lt;/p&gt;

&lt;p&gt;Improving these metrics increases recommendations.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Building a YouTube channel is not just about uploading videos.&lt;/p&gt;

&lt;p&gt;Success requires understanding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Account structure&lt;/li&gt;
&lt;li&gt;Identity verification&lt;/li&gt;
&lt;li&gt;AdSense requirements&lt;/li&gt;
&lt;li&gt;Security practices&lt;/li&gt;
&lt;li&gt;Content strategy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A secure and well-structured channel protects your work and ensures that when monetization arrives, you can receive payments smoothly.&lt;/p&gt;

&lt;p&gt;By combining &lt;strong&gt;proper account setup, strong security, and consistent content creation&lt;/strong&gt;, creators can grow their channels safely and sustainably.&lt;/p&gt;

</description>
      <category>youtube</category>
      <category>channel</category>
      <category>monetization</category>
      <category>creators</category>
    </item>
    <item>
      <title>Nil Pointer Panic at 3 AM: Choosing the Right Go Database Tool to Save Your Sleep</title>
      <dc:creator>Md. Maruf Sarker</dc:creator>
      <pubDate>Tue, 26 Aug 2025 16:30:03 +0000</pubDate>
      <link>https://forem.com/marufsarker/nil-pointer-panic-at-3-am-choosing-the-right-go-database-tool-to-save-your-sleep-24n1</link>
      <guid>https://forem.com/marufsarker/nil-pointer-panic-at-3-am-choosing-the-right-go-database-tool-to-save-your-sleep-24n1</guid>
      <description>&lt;p&gt;It’s a familiar horror story for backend developers: a frantic alert wakes you up, and you trace the production error back to a nil pointer dereference.&lt;br&gt;&lt;br&gt;
The culprit? A simple typo in a raw SQL query string that went unnoticed until it was too late.&lt;br&gt;&lt;br&gt;
This isn't just a bug; it's a symptom of the tools we use.&lt;/p&gt;

&lt;p&gt;In Go, how we talk to our database can mean the difference between compile-time confidence and runtime nightmares.&lt;/p&gt;

&lt;p&gt;So, how do we choose the right tool for the job?&lt;br&gt;&lt;br&gt;
Let's explore four popular approaches—&lt;strong&gt;database/sql, SQLX, GORM, and SQLC&lt;/strong&gt;—by looking at what they are, why you'd use them, and how they handle a simple, real-world task: fetching a user account from a database.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Foundation: database/sql
&lt;/h2&gt;
&lt;h3&gt;
  
  
  What is it?
&lt;/h3&gt;

&lt;p&gt;This is Go's built-in, standard library for database access. It provides a lightweight, no-frills interface for executing raw SQL queries.&lt;br&gt;&lt;br&gt;
It's not a driver itself but defines the standard interface that drivers for databases like PostgreSQL or MySQL must implement.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why use it?
&lt;/h3&gt;

&lt;p&gt;You use &lt;code&gt;database/sql&lt;/code&gt; when you need maximum performance and direct control.&lt;br&gt;&lt;br&gt;
There are no abstractions between you and your SQL, meaning no hidden overhead.&lt;/p&gt;
&lt;h3&gt;
  
  
  How does it work?
&lt;/h3&gt;

&lt;p&gt;Let's fetch an account. Notice the manual, error-prone process of scanning each column into a struct field.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// Assume db is an initialized *sql.DB&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Account&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ID&lt;/span&gt;        &lt;span class="kt"&gt;int64&lt;/span&gt;
    &lt;span class="n"&gt;Owner&lt;/span&gt;     &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;Balance&lt;/span&gt;   &lt;span class="kt"&gt;int64&lt;/span&gt;
    &lt;span class="n"&gt;Currency&lt;/span&gt;  &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;CreatedAt&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;GetAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="kt"&gt;int64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Account&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;account&lt;/span&gt; &lt;span class="n"&gt;Account&lt;/span&gt;
    &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QueryRow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SELECT id, owner, balance, currency, created_at FROM accounts WHERE id = $1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Manually scan each column into the struct's fields.&lt;/span&gt;
    &lt;span class="c"&gt;// A mismatch in order or a new column will break this at runtime.&lt;/span&gt;
    &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Scan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Owner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Balance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Currency&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreatedAt&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="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Account&lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The Verdict:&lt;/strong&gt;&lt;br&gt;
Powerful and fast, but verbose and risky for anything complex.&lt;br&gt;
A typo in the &lt;code&gt;SELECT&lt;/code&gt; statement or changing the column order will only be caught when &lt;code&gt;row.Scan&lt;/code&gt; fails in production.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Convenient Extension: SQLX
&lt;/h2&gt;
&lt;h3&gt;
  
  
  What is it?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;sqlx&lt;/code&gt; is a popular library that builds directly on top of &lt;code&gt;database/sql&lt;/code&gt;.&lt;br&gt;
It doesn't change the fundamentals but adds a set of extensions to make common tasks dramatically easier, especially scanning query results into structs.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why use it?
&lt;/h3&gt;

&lt;p&gt;You want the performance and control of raw SQL but hate the boilerplate of manual scanning.&lt;br&gt;
&lt;code&gt;sqlx&lt;/code&gt; is the perfect middle ground.&lt;/p&gt;
&lt;h3&gt;
  
  
  How does it work?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;sqlx&lt;/code&gt; uses struct tags and reflection to automatically map column names to struct fields. Look how much cleaner our function becomes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// Assume db is an initialized *sqlx.DB&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Account&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ID&lt;/span&gt;        &lt;span class="kt"&gt;int64&lt;/span&gt;     &lt;span class="s"&gt;`db:"id"`&lt;/span&gt;
    &lt;span class="n"&gt;Owner&lt;/span&gt;     &lt;span class="kt"&gt;string&lt;/span&gt;    &lt;span class="s"&gt;`db:"owner"`&lt;/span&gt;
    &lt;span class="n"&gt;Balance&lt;/span&gt;   &lt;span class="kt"&gt;int64&lt;/span&gt;     &lt;span class="s"&gt;`db:"balance"`&lt;/span&gt;
    &lt;span class="n"&gt;Currency&lt;/span&gt;  &lt;span class="kt"&gt;string&lt;/span&gt;    &lt;span class="s"&gt;`db:"currency"`&lt;/span&gt;
    &lt;span class="n"&gt;CreatedAt&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt; &lt;span class="s"&gt;`db:"created_at"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;GetAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;sqlx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="kt"&gt;int64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Account&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;account&lt;/span&gt; &lt;span class="n"&gt;Account&lt;/span&gt;
    &lt;span class="c"&gt;// No more manual scanning! sqlx handles it.&lt;/span&gt;
    &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"SELECT * FROM accounts WHERE id = $1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Account&lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The Verdict:&lt;/strong&gt;&lt;br&gt;
A fantastic quality-of-life improvement over &lt;code&gt;database/sql&lt;/code&gt;.&lt;br&gt;
It's still executing raw SQL, so query typos are a runtime problem, but the data mapping is much safer and less tedious.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Full Abstraction: GORM
&lt;/h2&gt;
&lt;h3&gt;
  
  
  What is it?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://gorm.io/" rel="noopener noreferrer"&gt;GORM&lt;/a&gt; is a full-featured Object-Relational Mapper (ORM).&lt;br&gt;
It abstracts away SQL entirely, allowing you to interact with your database using Go code and structs.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why use it?
&lt;/h3&gt;

&lt;p&gt;You want to develop quickly. GORM handles the SQL generation for common CRUD (Create, Read, Update, Delete) operations, saving you from writing repetitive queries.&lt;br&gt;
It's great for rapid prototyping and standard application development.&lt;/p&gt;
&lt;h3&gt;
  
  
  How does it work?
&lt;/h3&gt;

&lt;p&gt;With GORM, you call Go methods that the library translates into SQL. Our &lt;code&gt;GetAccount&lt;/code&gt; function no longer contains any SQL.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// Assume db is an initialized *gorm.DB&lt;/span&gt;

&lt;span class="c"&gt;// GORM uses struct tags for table and column mapping.&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Account&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ID&lt;/span&gt;        &lt;span class="kt"&gt;int64&lt;/span&gt; &lt;span class="s"&gt;`gorm:"primaryKey"`&lt;/span&gt;
    &lt;span class="n"&gt;Owner&lt;/span&gt;     &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;Balance&lt;/span&gt;   &lt;span class="kt"&gt;int64&lt;/span&gt;
    &lt;span class="n"&gt;Currency&lt;/span&gt;  &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;CreatedAt&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;GetAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;gorm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="kt"&gt;int64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Account&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;account&lt;/span&gt; &lt;span class="n"&gt;Account&lt;/span&gt;
    &lt;span class="c"&gt;// GORM generates the "SELECT * FROM accounts WHERE id = ?" query.&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;First&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Account&lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The Verdict:&lt;/strong&gt;&lt;br&gt;
Incredibly fast for development, but it comes with trade-offs.&lt;br&gt;
You're learning GORM's API instead of SQL, and the generated queries might not be as performant as hand-written ones.&lt;br&gt;
It can feel like "magic," which can be difficult to debug on high-load systems.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Compile-Time Guardian: SQLC
&lt;/h2&gt;
&lt;h3&gt;
  
  
  What is it?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://sqlc.dev/" rel="noopener noreferrer"&gt;SQLC&lt;/a&gt; is a modern marvel. It's not an ORM or a library; it's a code generator.&lt;br&gt;
You write raw SQL queries in &lt;code&gt;.sql&lt;/code&gt; files, and &lt;code&gt;sqlc&lt;/code&gt; generates fully type-safe, idiomatic Go code that you can call in your application.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why use it?
&lt;/h3&gt;

&lt;p&gt;You want the performance of raw SQL and the safety of a compiler.&lt;br&gt;
&lt;code&gt;sqlc&lt;/code&gt; catches errors in your SQL before your application ever runs.&lt;/p&gt;
&lt;h3&gt;
  
  
  How does it work?
&lt;/h3&gt;

&lt;p&gt;It's a two-step process. First, you write the SQL.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- file: query.sql&lt;/span&gt;
&lt;span class="c1"&gt;-- name: GetAccount :one&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;accounts&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, you run the &lt;code&gt;sqlc generate&lt;/code&gt; command. It creates a Go file with this function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// file: query.sql.go (auto-generated by sqlc)&lt;/span&gt;

&lt;span class="c"&gt;// ... (structs and db connection setup)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Queries&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;GetAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="kt"&gt;int64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Account&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QueryRowContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;getAccount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="n"&gt;Account&lt;/span&gt;
    &lt;span class="c"&gt;// The generated code is guaranteed to match your query.&lt;/span&gt;
    &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Scan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Owner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Balance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Currency&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreatedAt&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="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you had a typo in &lt;code&gt;query.sql&lt;/code&gt; (e.g., &lt;code&gt;SELEC *&lt;/code&gt;), &lt;code&gt;sqlc&lt;/code&gt; would fail to generate code, giving you an immediate error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Verdict:&lt;/strong&gt;&lt;br&gt;
The best of all worlds for many applications.&lt;br&gt;
It gives you the full power of SQL, the performance of &lt;code&gt;database/sql&lt;/code&gt;, and the safety of compile-time checks.&lt;br&gt;
The initial setup is slightly more involved, but it pays for itself by preventing entire classes of runtime bugs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Which Tool Should You Use?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;For ultimate control and micro-optimizations:&lt;/strong&gt; Stick with &lt;code&gt;database/sql&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For a simple, ergonomic boost over the standard library:&lt;/strong&gt; &lt;code&gt;sqlx&lt;/code&gt; is your go-to.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For rapid development and CRUD-heavy apps:&lt;/strong&gt; GORM will get you moving the fastest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For building robust, performant, and type-safe applications:&lt;/strong&gt; &lt;code&gt;sqlc&lt;/code&gt; is the modern, superior choice that will save you from those 3 AM production alerts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Choose wisely, and happy coding!&lt;/p&gt;

</description>
      <category>database</category>
      <category>go</category>
      <category>sql</category>
      <category>postgres</category>
    </item>
    <item>
      <title>What's Really Powering Your Computer? Meet the Daemons</title>
      <dc:creator>Md. Maruf Sarker</dc:creator>
      <pubDate>Wed, 02 Jul 2025 10:13:14 +0000</pubDate>
      <link>https://forem.com/marufsarker/whats-really-powering-your-computer-meet-the-daemons-6c5</link>
      <guid>https://forem.com/marufsarker/whats-really-powering-your-computer-meet-the-daemons-6c5</guid>
      <description>&lt;p&gt;Hey everyone!&lt;/p&gt;

&lt;p&gt;You know that feeling when you hit "print" and your document just… prints? Or click a web link and, boom, there's a page? It feels like magic, right? But behind all that instant gratification, lurking just out of sight, is a whole silent army making it happen. And no, I'm not talking about mythical beasts (though the name might suggest it!). I'm talking about something called a &lt;strong&gt;daemon&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In the tech world, a &lt;strong&gt;daemon&lt;/strong&gt; (pronounced "DAY-mon" or "DEE-mon," depending on who you ask!) is simply a computer program that chills out in the background, doing its job without you ever needing to click on it. Think of them as your computer's dedicated, always-on personal assistants.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Do These "Invisible Helpers" Even Exist?
&lt;/h2&gt;

&lt;p&gt;Seriously, why can't everything just have a window I can click? Well, imagine the chaos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Printer Panic:&lt;/strong&gt; Every time you wanted to print, you'd have to manually open a "printer manager" app, find your file, hit print, and then keep the app open until it finished! What a nightmare.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web Server Woes:&lt;/strong&gt; Your website would only be online when you had its server application open and actively running on your screen. Close the window? Website's down!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See? Totally impractical. Daemons solve this by being:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Always On, Always Ready:&lt;/strong&gt; They're like that 24/7 convenience store of your operating system – always open for business.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set It and Forget It:&lt;/strong&gt; Once they're running, they handle their tasks independently. You don't need to babysit them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Unsung System Stewards:&lt;/strong&gt; Many daemons manage critical system resources and low-level functionalities that regular user applications typically don't directly control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Efficiency Experts:&lt;/strong&gt; By having one dedicated helper for a task, it's way more efficient than every app trying to do the same thing at once.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Meet the Daemons: You Use Them Every Day!
&lt;/h2&gt;

&lt;p&gt;You probably interact with daemons constantly without even realizing it. They're that good at being invisible!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The SSH Daemon (&lt;code&gt;sshd&lt;/code&gt;):&lt;/strong&gt; Ever logged into a remote server from your terminal? That's &lt;code&gt;sshd&lt;/code&gt; on the server-side, patiently listening for your connection and making sure you're allowed in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web Server Daemons (&lt;code&gt;httpd&lt;/code&gt; or &lt;code&gt;nginx&lt;/code&gt;):&lt;/strong&gt; Every single website you visit is served up by one of these guys, listening for your browser's request and sending back the web page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Print Daemon (&lt;code&gt;cupsd&lt;/code&gt;):&lt;/strong&gt; If you've ever printed from your Linux machine, this daemon is responsible for managing your print queue and sending documents to the printer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;systemd&lt;/code&gt; (The Daemon Overlord):&lt;/strong&gt; This one's the big boss. When your Linux machine boots up, &lt;code&gt;systemd&lt;/code&gt; is the very first thing to run, and its job is to launch, manage, and oversee almost all the other daemons and services. Talk about a full-time job!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Docker Daemon (&lt;code&gt;dockerd&lt;/code&gt;):&lt;/strong&gt; For anyone working with containers, &lt;code&gt;dockerd&lt;/code&gt; is the central figure. When you type a &lt;code&gt;docker&lt;/code&gt; command (like &lt;code&gt;docker run&lt;/code&gt; or &lt;code&gt;docker build&lt;/code&gt;), your command-line tool actually just sends a message to the &lt;code&gt;dockerd&lt;/code&gt; daemon, and the daemon then handles all the heavy lifting of creating and managing your containers, images, networks, and volumes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wrapping It Up
&lt;/h2&gt;

&lt;p&gt;So, the next time you marvel at your internet speed popping up in the corner of your screen (thanks, GNOME extensions!) or a massive software project compiles smoothly, take a moment to appreciate the unsung heroes – the &lt;strong&gt;daemons&lt;/strong&gt;. They're the invisible, dedicated workhorses that keep your digital life running smoothly, and understanding them helps us appreciate the clever engineering behind our favorite operating systems.&lt;/p&gt;

&lt;p&gt;What are your favorite "silent heroes" on your system? Let me know in the comments!&lt;/p&gt;

</description>
      <category>deamons</category>
      <category>systemd</category>
      <category>ssh</category>
      <category>docker</category>
    </item>
    <item>
      <title>Docker Buildx: Build Multi-Platform Images Like a Pro</title>
      <dc:creator>Md. Maruf Sarker</dc:creator>
      <pubDate>Tue, 01 Jul 2025 05:16:22 +0000</pubDate>
      <link>https://forem.com/marufsarker/docker-buildx-build-multi-platform-images-like-a-pro-31hn</link>
      <guid>https://forem.com/marufsarker/docker-buildx-build-multi-platform-images-like-a-pro-31hn</guid>
      <description>&lt;p&gt;When building Docker images, developers often face platform compatibility issues — especially when deploying to different architectures like &lt;strong&gt;amd64&lt;/strong&gt; or &lt;strong&gt;arm64&lt;/strong&gt; (used in newer Macs, Raspberry Pi, cloud servers, etc.). Thankfully, &lt;strong&gt;Docker Buildx&lt;/strong&gt; is here to solve that problem.&lt;/p&gt;

&lt;p&gt;In this post, you’ll learn what Buildx is, why it matters, and how to use it with real examples.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔍 What Is Docker Buildx?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Docker Buildx&lt;/strong&gt; is an extended build command that provides advanced features powered by &lt;strong&gt;BuildKit&lt;/strong&gt;, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-platform image builds (e.g., &lt;code&gt;linux/amd64&lt;/code&gt;, &lt;code&gt;linux/arm64&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Faster builds with cache&lt;/li&gt;
&lt;li&gt;Cross-platform CI/CD pipelines&lt;/li&gt;
&lt;li&gt;Export options for Docker Hub, tar files, and more&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🤔 Why Use Docker Buildx?
&lt;/h2&gt;

&lt;p&gt;Imagine building a Docker image on your Mac (which runs on &lt;strong&gt;ARM64&lt;/strong&gt;) and trying to deploy it to a cloud server (which runs on &lt;strong&gt;AMD64&lt;/strong&gt;). Without Buildx, this mismatch often breaks your app.&lt;/p&gt;

&lt;p&gt;With Buildx, you can build a single image that works on &lt;strong&gt;multiple platforms&lt;/strong&gt; like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker buildx build &lt;span class="nt"&gt;--platform&lt;/span&gt; linux/amd64,linux/arm64 ...

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No compatibility issues. No surprises.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ How to Use Docker Buildx
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Set Up Buildx
&lt;/h3&gt;

&lt;p&gt;Docker Buildx is built into Docker 19.03 and above.&lt;/p&gt;

&lt;p&gt;Run this to create and use a new builder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker buildx create &lt;span class="nt"&gt;--use&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Optional) Bootstrap and inspect:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker buildx inspect &lt;span class="nt"&gt;--bootstrap&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Build a Multi-Platform Docker Image
&lt;/h3&gt;

&lt;p&gt;Let’s say you have a simple Dockerfile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Dockerfile&lt;/span&gt;
FROM node:20-alpine
WORKDIR /app
COPY &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
RUN npm &lt;span class="nb"&gt;install
&lt;/span&gt;CMD &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"npm"&lt;/span&gt;, &lt;span class="s2"&gt;"start"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now build and push a multi-arch image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker buildx build &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--platform&lt;/span&gt; linux/amd64,linux/arm64 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-t&lt;/span&gt; yourusername/yourimage:latest &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--push&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Automate with GitHub Actions
&lt;/h3&gt;

&lt;p&gt;You can integrate Buildx into CI/CD pipelines like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Docker Image CI&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;main"&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout Code&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Set up Docker Buildx&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker/setup-buildx-action@v3&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Log in to Docker Hub&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker/login-action@v3&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.DOCKER_USERNAME }}&lt;/span&gt;
          &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.DOCKER_PASSWORD }}&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build and Push Multi-Platform Image&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;docker buildx build \&lt;/span&gt;
            &lt;span class="s"&gt;--platform linux/amd64,linux/arm64 \&lt;/span&gt;
            &lt;span class="s"&gt;-t yourusername/yourimage:latest \&lt;/span&gt;
            &lt;span class="s"&gt;--push .&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set your Docker Hub credentials as GitHub Secrets named DOCKER_USERNAME and DOCKER_PASSWORD.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Inspect Image Platform Support
&lt;/h3&gt;

&lt;p&gt;Check what platforms your Docker image supports:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker buildx imagetools inspect yourusername/yourimage:latest

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Bonus: Clean Up
&lt;/h2&gt;

&lt;p&gt;Clean unused resources:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker system prune -af          # Remove all unused data
docker builder prune             # Clean up Buildx cache

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Docker Buildx is a must-have tool for modern DevOps workflows. Whether you’re building locally or automating in CI/CD, it ensures your images are compatible across different environments.&lt;/p&gt;

&lt;p&gt;If you want your Docker images to “just work” anywhere — use Buildx!&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Reference
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Enable Buildx&lt;/span&gt;
docker buildx create &lt;span class="nt"&gt;--use&lt;/span&gt;

&lt;span class="c"&gt;# Multi-arch build &amp;amp; push&lt;/span&gt;
docker buildx build &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--platform&lt;/span&gt; linux/amd64,linux/arm64 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-t&lt;/span&gt; your/image:latest &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--push&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Inspect the image&lt;/span&gt;
docker buildx imagetools inspect your/image:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>docker</category>
      <category>github</category>
      <category>cicd</category>
      <category>devops</category>
    </item>
    <item>
      <title>What Can In-Browser JavaScript Do and What are its Limitations?</title>
      <dc:creator>Md. Maruf Sarker</dc:creator>
      <pubDate>Wed, 18 Dec 2024 12:25:12 +0000</pubDate>
      <link>https://forem.com/marufsarker/what-can-in-browser-javascript-do-and-what-are-its-limitations-106l</link>
      <guid>https://forem.com/marufsarker/what-can-in-browser-javascript-do-and-what-are-its-limitations-106l</guid>
      <description>&lt;p&gt;JavaScript is a powerful and versatile programming language primarily designed for use in web browsers. It allows developers to create dynamic and interactive web experiences. However, its capabilities are deliberately restricted to ensure user safety and privacy. Here’s a closer look at what in-browser JavaScript can and cannot do.  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What Can In-Browser JavaScript Do?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In-browser JavaScript enables developers to interact with and manipulate web pages, users, and servers. Here are some of its key capabilities:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Webpage Manipulation:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript can add new HTML elements to a webpage, modify existing content, and change styles dynamically.
&lt;/li&gt;
&lt;li&gt;This is used for creating interactive features like dynamic menus, image sliders, and live content updates.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;User Interaction:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It can respond to user actions such as mouse clicks, pointer movements, and key presses.
&lt;/li&gt;
&lt;li&gt;For example, JavaScript can validate form inputs, show tooltips, or handle drag-and-drop actions.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Network Communication:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript can send and receive data from servers without requiring a page reload.
&lt;/li&gt;
&lt;li&gt;This is done using technologies like AJAX (Asynchronous JavaScript and XML) and COMET, enabling seamless interactions like live chat or real-time notifications.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Working with Cookies and Local Storage:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript can read, set, and delete browser cookies.
&lt;/li&gt;
&lt;li&gt;It can also store data on the client side using local storage or session storage, which is useful for remembering user preferences or temporarily storing form data.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;User Notifications and Prompts:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It can display messages to users, such as alerts or confirmation boxes.
&lt;/li&gt;
&lt;li&gt;JavaScript can also ask for input or notify users through browser notifications.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Device Interaction (With Permissions):&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript can interact with hardware devices like cameras, microphones, and GPS, but only with explicit user consent.
&lt;/li&gt;
&lt;li&gt;This is commonly used for video conferencing apps or location-based services.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What Can’t In-Browser JavaScript Do?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;JavaScript's in-browser limitations exist to protect users from malicious websites. Here are some key restrictions:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Access to Local Files and System Functions:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript cannot read, write, or execute files on the user’s hard drive.
&lt;/li&gt;
&lt;li&gt;File access is limited to scenarios where the user explicitly selects or uploads files, such as through an &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt; element or drag-and-drop actions.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Unauthorized Hardware Access:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript cannot enable or use devices like cameras, microphones, or sensors without the user’s explicit permission.
&lt;/li&gt;
&lt;li&gt;For example, a malicious webpage cannot secretly activate your webcam or microphone.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cross-Tab and Cross-Domain Restrictions:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;By default, JavaScript cannot access data from other tabs or browser windows, even if they are open simultaneously.
&lt;/li&gt;
&lt;li&gt;This is enforced by the &lt;strong&gt;Same Origin Policy&lt;/strong&gt;, which blocks JavaScript from accessing content from a different domain, protocol, or port.
&lt;/li&gt;
&lt;li&gt;Cross-origin communication is possible but requires explicit permissions through mechanisms like &lt;strong&gt;CORS (Cross-Origin Resource Sharing)&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Restricted Network Communication:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;While JavaScript can send requests to servers, it is limited to the domain the current webpage originated from unless the target domain explicitly allows cross-origin requests.
&lt;/li&gt;
&lt;li&gt;This prevents unauthorized data exchange between websites.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;System-Level Operations:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript cannot interact directly with the operating system, such as modifying system settings, installing software, or running external programs.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Why Are These Limitations in Place?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The restrictions on in-browser JavaScript are designed with &lt;strong&gt;user safety and privacy&lt;/strong&gt; in mind. Without these limitations, malicious websites could:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access sensitive information from other browser tabs, such as login sessions or personal data.
&lt;/li&gt;
&lt;li&gt;Execute harmful actions on the user’s device, such as deleting files or stealing data.
&lt;/li&gt;
&lt;li&gt;Spy on users through unauthorized hardware access.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By enforcing these boundaries, browsers create a secure environment where JavaScript can be safely executed without compromising user trust.  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In-browser JavaScript is a versatile tool that forms the backbone of modern web development. It enables dynamic webpage content, interactive user interfaces, and seamless server communication. However, it operates within strict security boundaries to ensure user safety. Understanding what JavaScript can and cannot do is crucial for developers aiming to build secure and efficient web applications.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Job Interview Preparation as a Programmer</title>
      <dc:creator>Md. Maruf Sarker</dc:creator>
      <pubDate>Wed, 18 Dec 2024 12:07:59 +0000</pubDate>
      <link>https://forem.com/marufsarker/job-interview-preperation-as-a-programmer-90k</link>
      <guid>https://forem.com/marufsarker/job-interview-preperation-as-a-programmer-90k</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Step 1: Understand the Interview Process&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;What to Do&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learn about the interview stages and the expectations for your target roles and companies.&lt;/li&gt;
&lt;li&gt;Research interview experiences on platforms like Glassdoor.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.glassdoor.com" rel="noopener noreferrer"&gt;Glassdoor&lt;/a&gt;: Company-specific interview questions.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.levels.fyi" rel="noopener noreferrer"&gt;Levels.fyi&lt;/a&gt;: Compensation and role expectations.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Step 2: LeetCode and DSA Mastery&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Beginner Level&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Solve easy problems and understand how to approach coding questions.&lt;/li&gt;
&lt;li&gt;Focus on basic DSA concepts.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://neetcode.io/" rel="noopener noreferrer"&gt;NeetCode Roadmap&lt;/a&gt;: Free curated playlists for DSA.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://leetcode.com/explore/" rel="noopener noreferrer"&gt;LeetCode Explore&lt;/a&gt;: Beginner-friendly study plans.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Intermediate Level&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Progress to medium problems and implement common patterns.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://leetcode.com/discuss/general-discussion/460599/blind-75-leetcode-questions" rel="noopener noreferrer"&gt;Blind 75&lt;/a&gt;: Top 75 problems covering key patterns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Books&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;"Cracking the Coding Interview" by Gayle Laakmann McDowell.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Advanced Level&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Tackle hard problems and mock interviews.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://codeforces.com" rel="noopener noreferrer"&gt;Codeforces&lt;/a&gt;: Competitive programming for advanced problem-solving.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.interviewbit.com" rel="noopener noreferrer"&gt;InterviewBit&lt;/a&gt;: Coding practice tailored for interviews.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Step 3: Strengthen CS Fundamentals&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Operating Systems&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Learn processes, threads, concurrency, and memory management.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://pages.cs.wisc.edu/~remzi/OSTEP/" rel="noopener noreferrer"&gt;Operating Systems: Three Easy Pieces&lt;/a&gt;: Free textbook.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-828-operating-system-engineering-fall-2012/" rel="noopener noreferrer"&gt;MIT OpenCourseWare: Operating Systems&lt;/a&gt;: Lecture videos.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Databases&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Focus on SQL, database normalization, indexing, and transactions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://sqlzoo.net/" rel="noopener noreferrer"&gt;SQLZoo&lt;/a&gt;: Hands-on practice for SQL queries.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/playlist?list=PLLy_2iUCG87CQhELCytvX3Gb9rh4jtqF-" rel="noopener noreferrer"&gt;DBMS by Gate Smashers&lt;/a&gt;: In-depth video tutorials.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Computer Networks&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Study networking protocols, TCP/IP, and HTTP basics.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://inl.info.ucl.ac.be/CNP3" rel="noopener noreferrer"&gt;Computer Networking: Principles, Protocols, and Practice&lt;/a&gt;: Free book.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cs144.github.io/" rel="noopener noreferrer"&gt;Stanford Lecture Series on Networking&lt;/a&gt;: Practical approach.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;OOP Principles&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Master design patterns, inheritance, and polymorphism.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://refactoring.guru/design-patterns" rel="noopener noreferrer"&gt;Refactoring Guru&lt;/a&gt;: Visual guide to design patterns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Books&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;"Head First Design Patterns" by Eric Freeman.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;System Design&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Learn to build scalable systems.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.educative.io/courses/grokking-the-system-design-interview" rel="noopener noreferrer"&gt;Grokking the System Design Interview&lt;/a&gt;: Paid course.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/donnemartin/system-design-primer" rel="noopener noreferrer"&gt;System Design Primer&lt;/a&gt;: Free GitHub repository.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Step 4: Develop Practical Coding Skills&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Projects&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Build full-stack projects and deploy them.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.freecodecamp.org/" rel="noopener noreferrer"&gt;freeCodeCamp&lt;/a&gt;: Full-stack project tutorials.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.theodinproject.com/" rel="noopener noreferrer"&gt;The Odin Project&lt;/a&gt;: Beginner-friendly resources.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Version Control&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Learn Git for collaboration.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://git-scm.com/book/en/v2" rel="noopener noreferrer"&gt;Pro Git&lt;/a&gt;: Free book.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://lab.github.com/" rel="noopener noreferrer"&gt;GitHub Learning Lab&lt;/a&gt;: Interactive Git tutorials.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open Source&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Contribute to repositories.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/explore" rel="noopener noreferrer"&gt;GitHub Explore&lt;/a&gt;: Find open-source projects.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/firstcontributions/first-contributions" rel="noopener noreferrer"&gt;First Contributions&lt;/a&gt;: Beginner-friendly open-source guide.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Step 5: Behavioral and Soft Skills&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;STAR Method&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Structure answers for behavioral questions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://biginterview.com/" rel="noopener noreferrer"&gt;Big Interview&lt;/a&gt;: Behavioral interview tips.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/results?search_query=star+method" rel="noopener noreferrer"&gt;YouTube: STAR Method Explained&lt;/a&gt;: Free video explanations.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Communication&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Practice explaining code out loud during mock interviews.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.pramp.com/" rel="noopener noreferrer"&gt;Mock Interview Platforms&lt;/a&gt;: Free mock interviews.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Step 6: Mock Interviews&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Simulate Real Interviews&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Pair up with peers or use platforms.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.pramp.com/" rel="noopener noreferrer"&gt;Pramp&lt;/a&gt;: Free peer-to-peer mock interviews.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.interviewing.io/" rel="noopener noreferrer"&gt;Interviewing.io&lt;/a&gt;: Mock interviews with professionals.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;AI-Based Feedback&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Use platforms providing AI-driven feedback.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.hackerrank.com/interview/interview-preparation-kit" rel="noopener noreferrer"&gt;HackerRank Interview Preparation Kit&lt;/a&gt;: Comprehensive prep resources.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Step 7: Job-Specific Skills&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Computing&lt;/strong&gt; (if relevant):

&lt;ul&gt;
&lt;li&gt;Learn AWS, Azure, or Google Cloud basics.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/free/" rel="noopener noreferrer"&gt;AWS Free Tier&lt;/a&gt;: Practice cloud tools.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://acloudguru.com/" rel="noopener noreferrer"&gt;A Cloud Guru&lt;/a&gt;: Paid courses.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Domain-Specific Knowledge&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Learn AI/ML, DevOps, or cybersecurity based on interests.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.coursera.org/" rel="noopener noreferrer"&gt;Coursera&lt;/a&gt;: Domain-specific courses.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.kaggle.com/" rel="noopener noreferrer"&gt;Kaggle&lt;/a&gt;: AI/ML practice.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Step 8: Final Preparations&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Revise Key Topics&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Review solved problems and core concepts.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[Your Notes]: Keep a concise summary of key concepts.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apps.ankiweb.net/" rel="noopener noreferrer"&gt;Anki&lt;/a&gt;: Use flashcards for quick revision.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Mock Interviews&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Conduct technical and behavioral mock interviews.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.geeksforgeeks.org/" rel="noopener noreferrer"&gt;GeeksforGeeks Interview Experiences&lt;/a&gt;: Company-specific prep.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Step 9: Relax and Build Confidence&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Take breaks, exercise, and ensure you’re mentally prepared for interviews.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Summary Table of Resources&lt;/strong&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Topic&lt;/th&gt;
&lt;th&gt;Resource Link&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DSA Practice&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://leetcode.com" rel="noopener noreferrer"&gt;LeetCode&lt;/a&gt;, &lt;a href="https://neetcode.io/" rel="noopener noreferrer"&gt;NeetCode&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;System Design&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/donnemartin/system-design-primer" rel="noopener noreferrer"&gt;System Design Primer&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Computer Networks&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://cs144.github.io/" rel="noopener noreferrer"&gt;CS144&lt;/a&gt;, &lt;a href="https://inl.info.ucl.ac.be/CNP3" rel="noopener noreferrer"&gt;Networking Book&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQL&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://sqlzoo.net/" rel="noopener noreferrer"&gt;SQLZoo&lt;/a&gt;, &lt;a href="https://leetcode.com/problemset/database/" rel="noopener noreferrer"&gt;LeetCode SQL&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Behavioral Questions&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://biginterview.com/" rel="noopener noreferrer"&gt;Big Interview&lt;/a&gt;, &lt;a href="https://glassdoor.com" rel="noopener noreferrer"&gt;Glassdoor&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mock Interviews&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://www.pramp.com/" rel="noopener noreferrer"&gt;Pramp&lt;/a&gt;, &lt;a href="https://www.interviewing.io/" rel="noopener noreferrer"&gt;Interviewing.io&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full-Stack Projects&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://www.freecodecamp.org/" rel="noopener noreferrer"&gt;freeCodeCamp&lt;/a&gt;, &lt;a href="https://www.theodinproject.com/" rel="noopener noreferrer"&gt;The Odin Project&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>interview</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
