<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sanudin</title>
    <description>The latest articles on DEV Community by Sanudin (@sanudin-dev).</description>
    <link>https://dev.to/sanudin-dev</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%2F3760854%2Fd3829bce-f434-4f4c-a857-ce8b6eca446a.png</url>
      <title>DEV Community: Sanudin</title>
      <link>https://dev.to/sanudin-dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sanudin-dev"/>
    <language>en</language>
    <item>
      <title>Git &amp; Collaboration: A Beginner's Guide (With Real Analogies)</title>
      <dc:creator>Sanudin</dc:creator>
      <pubDate>Mon, 08 Jun 2026 00:39:41 +0000</pubDate>
      <link>https://dev.to/sanudin-dev/git-collaboration-a-beginners-guide-with-real-analogies-4oh7</link>
      <guid>https://dev.to/sanudin-dev/git-collaboration-a-beginners-guide-with-real-analogies-4oh7</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🌐 Read this post in Bahasa Indonesia &lt;a href="https://dev.to/sanudin-dev/git-kolaborasi-panduan-untuk-pemula-lengkap-dengan-analogi-56ch"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📝 A note on this article&lt;/strong&gt;&lt;br&gt;
This post is based on my personal study notes on version control and Git collaboration. To make these notes more readable and useful — for myself and for others — I worked with AI to help expand and structure them into a proper blog format. The ideas, learning journey, and understanding are mine; the AI helped with the writing and presentation.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Learning Git doesn't have to be intimidating. In this article, I'll break down the essential concepts of version control and collaboration — using simple analogies that anyone can understand.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Git?
&lt;/h2&gt;

&lt;p&gt;Git is a &lt;strong&gt;version control system&lt;/strong&gt;. Think of it as a save system for your code — like save points in a video game. Every time you save (commit), Git remembers the state of your project at that moment. If something goes wrong, you can always go back.&lt;/p&gt;




&lt;h2&gt;
  
  
  Repository: Your Project's Warehouse
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;repository&lt;/strong&gt; (or "repo") is the folder that Git watches. There are two types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local repository&lt;/strong&gt;: lives on your computer. Your personal workspace.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote repository&lt;/strong&gt;: lives on a server (GitHub, GitLab, Bitbucket). The "official" shared copy your team can access.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They stay connected through a Remote URL, so you can push your local changes up and pull others' changes down.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git init                            &lt;span class="c"&gt;# Start tracking a folder&lt;/span&gt;
git remote add origin &amp;lt;url&amp;gt;         &lt;span class="c"&gt;# Connect to a remote repo&lt;/span&gt;
git push origin main                &lt;span class="c"&gt;# Send commits to remote&lt;/span&gt;
git pull origin main                &lt;span class="c"&gt;# Get latest from remote&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Commit: Your Project's Save Point
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;commit&lt;/strong&gt; is a snapshot of your project at a specific moment. Each commit has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A message describing what changed&lt;/li&gt;
&lt;li&gt;A unique ID (hash)&lt;/li&gt;
&lt;li&gt;A timestamp
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;                           &lt;span class="c"&gt;# Stage all changes&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add homepage layout"&lt;/span&gt; &lt;span class="c"&gt;# Save a snapshot&lt;/span&gt;
git log &lt;span class="nt"&gt;--oneline&lt;/span&gt;                   &lt;span class="c"&gt;# View commit history&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Write meaningful commit messages. Future you will thank present you.&lt;/p&gt;




&lt;h2&gt;
  
  
  Checkout, Reset, Revert: Traveling Through Time
&lt;/h2&gt;

&lt;p&gt;These three commands all interact with your commit history — but in very different ways:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;git checkout&lt;/code&gt; — Visit the Past (Temporarily)
&lt;/h3&gt;

&lt;p&gt;Like a time traveler with a visitor's pass. You can look around at an old commit without changing anything permanently.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout &amp;lt;commit-hash&amp;gt;          &lt;span class="c"&gt;# Visit an old commit&lt;/span&gt;
git checkout main                   &lt;span class="c"&gt;# Go back to the present&lt;/span&gt;
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; new-branch &amp;lt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;   &lt;span class="c"&gt;# Start a new branch from old commit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;git reset&lt;/code&gt; — Erase History
&lt;/h3&gt;

&lt;p&gt;Goes back to a past commit and &lt;strong&gt;removes&lt;/strong&gt; everything that came after. Use with care — especially if you've already pushed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git reset &lt;span class="nt"&gt;--soft&lt;/span&gt; HEAD~1             &lt;span class="c"&gt;# Undo last commit, keep changes staged&lt;/span&gt;
git reset &lt;span class="nt"&gt;--hard&lt;/span&gt; HEAD~1             &lt;span class="c"&gt;# Undo last commit, delete changes too&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;git revert&lt;/code&gt; — The Safe Undo
&lt;/h3&gt;

&lt;p&gt;Creates a &lt;strong&gt;new commit&lt;/strong&gt; that reverses a previous one. History stays intact — the safest option when working on a shared repo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git revert &amp;lt;commit-hash&amp;gt;            &lt;span class="c"&gt;# Undo a commit safely&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Rule of thumb: if you've already pushed, use &lt;code&gt;revert&lt;/code&gt;. If you haven't, &lt;code&gt;reset&lt;/code&gt; is fine.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Branches: Parallel Universes for Your Code
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;branch&lt;/strong&gt; is an independent line of development. You can create branches to work on features or fixes without touching the stable &lt;code&gt;main&lt;/code&gt; branch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git switch &lt;span class="nt"&gt;-c&lt;/span&gt; feature/dark-mode     &lt;span class="c"&gt;# Create and switch to new branch&lt;/span&gt;
git switch main                     &lt;span class="c"&gt;# Switch back to main&lt;/span&gt;
git branch &lt;span class="nt"&gt;-d&lt;/span&gt; feature/dark-mode     &lt;span class="c"&gt;# Delete merged branch&lt;/span&gt;
git push origin feature/dark-mode   &lt;span class="c"&gt;# Push branch to remote&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A common branch naming convention:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Prefix&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;New feature&lt;/td&gt;
&lt;td&gt;&lt;code&gt;feature/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;feature/dark-mode&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bug fix&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fix/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fix/login-redirect&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Urgent fix&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hotfix/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hotfix/payment-crash&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Stash: The Pause Button for Unfinished Work
&lt;/h2&gt;

&lt;p&gt;You're halfway through a feature. Code is messy, not ready to commit. Then your team lead says: &lt;em&gt;"Can you quickly fix that bug on main?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You can't switch branches with uncommitted changes. But you're not ready to commit either. The answer: &lt;strong&gt;stash it&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Analogy:&lt;/strong&gt; You're drawing a picture but need to use the table for something else. You put everything in a drawer. Later, you open the drawer and continue exactly where you left off.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git stash                           &lt;span class="c"&gt;# Save work temporarily&lt;/span&gt;
git switch fix/some-bug             &lt;span class="c"&gt;# Switch branches freely&lt;/span&gt;
&lt;span class="c"&gt;# ... fix the bug, commit, come back ...&lt;/span&gt;
git switch feature/dark-mode
git stash pop                       &lt;span class="c"&gt;# Restore your work&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adding a label makes it easier to manage multiple stashes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git stash push &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"WIP: dark mode palette"&lt;/span&gt;   &lt;span class="c"&gt;# Named stash&lt;/span&gt;
git stash list                               &lt;span class="c"&gt;# See all stashes&lt;/span&gt;
git stash pop                                &lt;span class="c"&gt;# Restore latest&lt;/span&gt;
git stash apply stash@&lt;span class="o"&gt;{&lt;/span&gt;1&lt;span class="o"&gt;}&lt;/span&gt;                    &lt;span class="c"&gt;# Restore specific (keep in list)&lt;/span&gt;
git stash drop stash@&lt;span class="o"&gt;{&lt;/span&gt;1&lt;span class="o"&gt;}&lt;/span&gt;                     &lt;span class="c"&gt;# Remove specific&lt;/span&gt;
git stash &lt;span class="nt"&gt;-u&lt;/span&gt;                                 &lt;span class="c"&gt;# Include untracked (new) files&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Merge &amp;amp; Pull Requests: Bringing It All Together
&lt;/h2&gt;

&lt;p&gt;When your feature is ready, you &lt;strong&gt;merge&lt;/strong&gt; it back into &lt;code&gt;main&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git switch main
git merge feature/dark-mode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On GitHub/GitLab, this is typically done through a &lt;strong&gt;Pull Request&lt;/strong&gt; (PR) — a formal process where:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You push your branch and open a PR&lt;/li&gt;
&lt;li&gt;Teammates review your code and leave feedback&lt;/li&gt;
&lt;li&gt;Once approved, it gets merged&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Merge Options
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;What happens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Merge commit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All commits preserved + merge commit added&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Squash and merge&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All commits squashed into one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rebase and merge&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Commits replayed on top of main, no merge commit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Handling Conflicts
&lt;/h3&gt;

&lt;p&gt;When two branches edit the same line, Git can't auto-merge. You'll see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD
&lt;/span&gt;&lt;span class="p"&gt;const msg = "Hello!";
&lt;/span&gt;&lt;span class="gh"&gt;=======
&lt;/span&gt;&lt;span class="p"&gt;const msg = "Hi there!";
&lt;/span&gt;&lt;span class="gi"&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; feature/dark-mode
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Manually resolve it, then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &amp;lt;file&amp;gt;
git commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Code Reviews: The Quality Gate
&lt;/h2&gt;

&lt;p&gt;Before a PR is merged, someone reviews it. Good reviewers check for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Logical correctness&lt;/li&gt;
&lt;li&gt;Readability and naming&lt;/li&gt;
&lt;li&gt;Test coverage&lt;/li&gt;
&lt;li&gt;Complexity (is it simpler than it needs to be?)&lt;/li&gt;
&lt;li&gt;Style guideline compliance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Code reviews aren't just about catching mistakes — they're also how knowledge spreads through a team.&lt;/p&gt;




&lt;h2&gt;
  
  
  Fork &amp;amp; Clone: Contributing Without Access
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Forking&lt;/strong&gt; copies someone else's repo into your GitHub account. &lt;strong&gt;Cloning&lt;/strong&gt; copies a repo to your local machine.&lt;/p&gt;

&lt;p&gt;The typical open-source contribution flow:&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;# 1. Fork on GitHub (click the Fork button)&lt;/span&gt;

&lt;span class="c"&gt;# 2. Clone your fork&lt;/span&gt;
git clone https://github.com/your-username/the-project.git

&lt;span class="c"&gt;# 3. Add original repo as upstream&lt;/span&gt;
git remote add upstream https://github.com/original-owner/the-project.git

&lt;span class="c"&gt;# 4. Create a branch, make changes, push&lt;/span&gt;
git switch &lt;span class="nt"&gt;-c&lt;/span&gt; fix/typo-readme
git add &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Fix typo in README"&lt;/span&gt;
git push origin fix/typo-readme

&lt;span class="c"&gt;# 5. Open a Pull Request on GitHub&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Keeping Your Fork Synced
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git fetch upstream
git switch main
git merge upstream/main
git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Git GUI Apps: You Don't Have to Type Everything
&lt;/h2&gt;

&lt;p&gt;Knowing the commands makes you a stronger developer — but you don't have to use the terminal every day. There's a whole ecosystem of GUI (Graphical User Interface) apps that let you commit, branch, merge, and stash by clicking buttons, with a visual map of your repo history.&lt;/p&gt;

&lt;p&gt;Here are the most popular ones:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;App&lt;/th&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub Desktop&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mac, Windows&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Beginners, GitHub users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;GitLens&lt;/strong&gt; (VS Code ext.)&lt;/td&gt;
&lt;td&gt;All OS&lt;/td&gt;
&lt;td&gt;Free / Paid&lt;/td&gt;
&lt;td&gt;Devs living in VS Code/Cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitKraken&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mac, Win, Linux&lt;/td&gt;
&lt;td&gt;Free (limited) / Paid&lt;/td&gt;
&lt;td&gt;Visual power users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fork&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mac, Windows&lt;/td&gt;
&lt;td&gt;Free trial / ~$50&lt;/td&gt;
&lt;td&gt;Speed + power balance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sourcetree&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mac, Windows&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Atlassian/Bitbucket users&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;GitHub Desktop&lt;/strong&gt; is the simplest — made by GitHub, focused on the essentials. &lt;strong&gt;GitLens&lt;/strong&gt; is a VS Code extension that adds inline blame, visual commit graphs, and stash management right inside your editor. &lt;strong&gt;GitKraken&lt;/strong&gt; has a stunning commit graph and drag-and-drop merging. &lt;strong&gt;Fork&lt;/strong&gt; hits a great balance of speed and power. &lt;strong&gt;Sourcetree&lt;/strong&gt; (by Atlassian) is free and feature-rich, especially if you use Bitbucket.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Even if you use a GUI app daily, knowing the underlying commands helps you debug problems and work on servers where no GUI exists. Think of GUI apps as a productivity layer on top of your Git knowledge — not a replacement for it.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;In Short&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Repository&lt;/td&gt;
&lt;td&gt;Warehouse for your project files + history&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Commit&lt;/td&gt;
&lt;td&gt;A saved snapshot with a message&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Checkout&lt;/td&gt;
&lt;td&gt;Visit past commits temporarily&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reset&lt;/td&gt;
&lt;td&gt;Erase commit history (use carefully)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Revert&lt;/td&gt;
&lt;td&gt;Safely undo a commit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Branch&lt;/td&gt;
&lt;td&gt;Independent line of development&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stash&lt;/td&gt;
&lt;td&gt;Temporarily save unfinished work&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Merge&lt;/td&gt;
&lt;td&gt;Combine branches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pull Request&lt;/td&gt;
&lt;td&gt;Formal request to review and merge code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fork&lt;/td&gt;
&lt;td&gt;Copy someone else's repo to your account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clone&lt;/td&gt;
&lt;td&gt;Copy a repo to your local machine&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;The more you use it, the more natural it feels. One commit at a time. 🚀&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published as a series (Git for Everyone) at: &lt;a href="https://sanudin.dev/blog/git-for-everyone__part-1-what-is-git-repository-commit" rel="noopener noreferrer"&gt;What Is Git, Repository, and Commit&lt;/a&gt; | &lt;a href="https://sanudin.dev/blog/git-for-everyone__part-2-checkout-reset-revert" rel="noopener noreferrer"&gt;Traveling Through Time — Checkout, Reset, and Revert&lt;br&gt;
&lt;/a&gt; | &lt;a href="https://sanudin.dev/blog/git-for-everyone__part-3-branches-stash-workflow" rel="noopener noreferrer"&gt;Branches, Stash, and Git Workflow&lt;/a&gt; | &lt;a href="https://sanudin.dev/blog/git-for-everyone__part-4-merge-pull-request-code-review" rel="noopener noreferrer"&gt;Merge, Pull Requests, and Code Reviews&lt;/a&gt; | &lt;a href="https://sanudin.dev/blog/git-for-everyone__part-5-fork-clone-open-source" rel="noopener noreferrer"&gt;Fork, Clone, and Open Source Collaboration&lt;/a&gt; | &lt;a href="https://sanudin.dev/blog/git-for-everyone__part-6-git-gui-apps" rel="noopener noreferrer"&gt;Git GUI Apps — You Don't Have to Use the Terminal&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>beginners</category>
      <category>versioncontrol</category>
      <category>programming</category>
    </item>
    <item>
      <title>Git &amp; Kolaborasi: Panduan untuk Pemula (Lengkap dengan Analogi)</title>
      <dc:creator>Sanudin</dc:creator>
      <pubDate>Mon, 08 Jun 2026 00:36:09 +0000</pubDate>
      <link>https://dev.to/sanudin-dev/git-kolaborasi-panduan-untuk-pemula-lengkap-dengan-analogi-56ch</link>
      <guid>https://dev.to/sanudin-dev/git-kolaborasi-panduan-untuk-pemula-lengkap-dengan-analogi-56ch</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🌐 Baca artikel ini dalam Bahasa Inggris di &lt;a href="https://dev.to/sanudin-dev/git-collaboration-a-beginners-guide-with-real-analogies-4oh7"&gt;sini&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📝 Catatan tentang artikel ini&lt;/strong&gt;&lt;br&gt;
Artikel ini dibuat berdasarkan catatan belajar pribadi saya tentang version control dan Git kolaborasi. Untuk membuat catatan tersebut lebih mudah dibaca dan bermanfaat — bagi saya dan orang lain — saya menggunakan bantuan AI untuk mengembangkan dan menyusunnya menjadi artikel blog. Ide, perjalanan belajar, dan pemahamannya adalah milik saya; AI membantu di bagian penulisan dan penyajiannya.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Belajar Git itu tidak harus membingungkan. Di artikel ini, saya akan menjelaskan konsep-konsep penting dalam version control dan kolaborasi menggunakan bahasa yang sederhana — bahkan dengan analogi yang bisa dipahami anak kecil sekalipun.&lt;/p&gt;




&lt;h2&gt;
  
  
  Apa Itu Git?
&lt;/h2&gt;

&lt;p&gt;Git adalah &lt;strong&gt;version control system&lt;/strong&gt; — sistem yang merekam setiap perubahan yang kamu lakukan pada file-file proyekmu.&lt;/p&gt;

&lt;p&gt;Bayangkan Git seperti fitur &lt;em&gt;save point&lt;/em&gt; di video game. Setiap kali kamu menyimpan (commit), Git mengambil "foto" dari kondisi proyekmu saat itu. Kalau ada yang salah, kamu bisa kembali ke foto sebelumnya.&lt;/p&gt;




&lt;h2&gt;
  
  
  Repository: Gudang Proyekmu
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Repository&lt;/strong&gt; (atau "repo") adalah folder yang diawasi oleh Git. Ada dua jenisnya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local repository&lt;/strong&gt;: ada di komputermu sendiri. Ruang kerja pribadimu.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote repository&lt;/strong&gt;: ada di server (GitHub, GitLab, Bitbucket). Salinan "resmi" yang bisa diakses seluruh tim.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keduanya terhubung lewat Remote URL, sehingga kamu bisa mengirim perubahan ke remote (&lt;em&gt;push&lt;/em&gt;) atau mengambil perubahan terbaru dari sana (&lt;em&gt;pull&lt;/em&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git init                            &lt;span class="c"&gt;# Mulai memantau sebuah folder&lt;/span&gt;
git remote add origin &amp;lt;url&amp;gt;         &lt;span class="c"&gt;# Hubungkan ke remote repo&lt;/span&gt;
git push origin main                &lt;span class="c"&gt;# Kirim commit ke remote&lt;/span&gt;
git pull origin main                &lt;span class="c"&gt;# Ambil update terbaru dari remote&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Analogi:&lt;/strong&gt; Local repo adalah buku sketsamu di rumah. Remote repo adalah papan pengumuman kelas — semua orang bisa melihat dan mengaksesnya.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Commit: Save Point Proyekmu
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Commit&lt;/strong&gt; adalah snapshot dari kondisi proyekmu pada satu titik waktu. Setiap commit berisi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pesan yang menjelaskan apa yang berubah&lt;/li&gt;
&lt;li&gt;ID unik (hash)&lt;/li&gt;
&lt;li&gt;Timestamp
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;                           &lt;span class="c"&gt;# Staging semua perubahan&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Tambah layout halaman utama"&lt;/span&gt;  &lt;span class="c"&gt;# Simpan snapshot&lt;/span&gt;
git log &lt;span class="nt"&gt;--oneline&lt;/span&gt;                   &lt;span class="c"&gt;# Lihat riwayat commit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tulis pesan commit yang jelas dan bermakna. Dirimu di masa depan — dan rekan timmu — akan berterima kasih.&lt;/p&gt;




&lt;h2&gt;
  
  
  Checkout, Reset, Revert: Mesin Waktu Git
&lt;/h2&gt;

&lt;p&gt;Ketiga perintah ini berinteraksi dengan riwayat commit — tapi dengan cara yang sangat berbeda:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;git checkout&lt;/code&gt; — Kunjungi Masa Lalu (Sementara)
&lt;/h3&gt;

&lt;p&gt;Seperti mesin waktu dengan tiket visitor. Kamu bisa melihat kondisi kode di commit lama tanpa mengubah apapun secara permanen.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout &amp;lt;commit-hash&amp;gt;          &lt;span class="c"&gt;# Kunjungi commit lama&lt;/span&gt;
git checkout main                   &lt;span class="c"&gt;# Kembali ke sekarang&lt;/span&gt;
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; branch-baru &amp;lt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="c"&gt;# Buat branch baru dari commit lama&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;git reset&lt;/code&gt; — Hapus Riwayat
&lt;/h3&gt;

&lt;p&gt;Kembali ke commit tertentu dan &lt;strong&gt;menghapus&lt;/strong&gt; semua yang terjadi setelahnya. Gunakan dengan hati-hati — terutama jika sudah di-push ke remote.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git reset &lt;span class="nt"&gt;--soft&lt;/span&gt; HEAD~1             &lt;span class="c"&gt;# Undo commit terakhir, perubahan tetap ada (staged)&lt;/span&gt;
git reset &lt;span class="nt"&gt;--hard&lt;/span&gt; HEAD~1             &lt;span class="c"&gt;# Undo commit terakhir, perubahan ikut terhapus&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;git revert&lt;/code&gt; — Undo yang Aman
&lt;/h3&gt;

&lt;p&gt;Membuat &lt;strong&gt;commit baru&lt;/strong&gt; yang membalikkan efek dari commit sebelumnya. Riwayat tetap utuh — pilihan paling aman saat bekerja di repo bersama.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git revert &amp;lt;commit-hash&amp;gt;            &lt;span class="c"&gt;# Undo sebuah commit dengan aman&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Panduan praktis:&lt;/strong&gt; Kalau sudah di-push, gunakan &lt;code&gt;revert&lt;/code&gt;. Kalau belum, &lt;code&gt;reset&lt;/code&gt; tidak masalah.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Branch: Jalur Paralel untuk Kode
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Branch&lt;/strong&gt; adalah jalur pengembangan yang terpisah. Kamu bisa membuat branch untuk mengerjakan fitur atau perbaikan bug tanpa menyentuh branch &lt;code&gt;main&lt;/code&gt; yang stabil.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git switch &lt;span class="nt"&gt;-c&lt;/span&gt; feature/dark-mode     &lt;span class="c"&gt;# Buat dan pindah ke branch baru&lt;/span&gt;
git switch main                     &lt;span class="c"&gt;# Kembali ke main&lt;/span&gt;
git branch &lt;span class="nt"&gt;-d&lt;/span&gt; feature/dark-mode     &lt;span class="c"&gt;# Hapus branch yang sudah di-merge&lt;/span&gt;
git push origin feature/dark-mode   &lt;span class="c"&gt;# Push branch ke remote&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Konvensi penamaan branch yang umum:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tipe&lt;/th&gt;
&lt;th&gt;Prefix&lt;/th&gt;
&lt;th&gt;Contoh&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fitur baru&lt;/td&gt;
&lt;td&gt;&lt;code&gt;feature/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;feature/dark-mode&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Perbaikan bug&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fix/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fix/login-redirect&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hotfix mendesak&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hotfix/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hotfix/payment-crash&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Analogi:&lt;/strong&gt; Bayangkan sungai yang mengalir. Branch adalah anak sungai yang memisah diri untuk menjelajahi jalur lain — dan nantinya bergabung kembali ke sungai utama.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Stash: Tombol Pause untuk Pekerjaan yang Belum Selesai
&lt;/h2&gt;

&lt;p&gt;Kamu sedang di tengah-tengah mengerjakan sebuah fitur. Kode masih berantakan, belum siap untuk di-commit. Tiba-tiba team lead bilang: &lt;em&gt;"Bisa tolong perbaiki bug itu di branch main sekarang?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Kamu tidak bisa switch branch dengan perubahan yang belum di-commit. Tapi kamu juga belum siap commit. Jawabannya: &lt;strong&gt;simpan dulu dengan stash&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Analogi:&lt;/strong&gt; Kamu sedang menggambar tapi meja harus dipakai untuk hal lain. Kamu dengan rapi menyimpan gambar dan pensil ke dalam laci. Nanti kamu buka lacinya dan lanjut persis dari titik yang sama.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git stash                           &lt;span class="c"&gt;# Simpan pekerjaan sementara&lt;/span&gt;
git switch fix/some-bug             &lt;span class="c"&gt;# Bebas pindah branch&lt;/span&gt;
&lt;span class="c"&gt;# ... perbaiki bug, commit, balik lagi ...&lt;/span&gt;
git switch feature/dark-mode
git stash pop                       &lt;span class="c"&gt;# Kembalikan pekerjaanmu&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Menambahkan label membuat stash lebih mudah dikelola:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git stash push &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"WIP: palet dark mode"&lt;/span&gt;     &lt;span class="c"&gt;# Stash dengan nama&lt;/span&gt;
git stash list                               &lt;span class="c"&gt;# Lihat semua stash&lt;/span&gt;
git stash pop                                &lt;span class="c"&gt;# Kembalikan stash terbaru&lt;/span&gt;
git stash apply stash@&lt;span class="o"&gt;{&lt;/span&gt;1&lt;span class="o"&gt;}&lt;/span&gt;                    &lt;span class="c"&gt;# Kembalikan stash tertentu (tetap di list)&lt;/span&gt;
git stash drop stash@&lt;span class="o"&gt;{&lt;/span&gt;1&lt;span class="o"&gt;}&lt;/span&gt;                     &lt;span class="c"&gt;# Hapus stash tertentu&lt;/span&gt;
git stash &lt;span class="nt"&gt;-u&lt;/span&gt;                                 &lt;span class="c"&gt;# Sertakan file baru yang belum di-track&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Merge &amp;amp; Pull Request: Menyatukan Pekerjaan
&lt;/h2&gt;

&lt;p&gt;Saat fiturmu selesai, kamu &lt;strong&gt;merge&lt;/strong&gt; branch-mu kembali ke &lt;code&gt;main&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git switch main
git merge feature/dark-mode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Di GitHub/GitLab, proses ini biasanya dilakukan lewat &lt;strong&gt;Pull Request&lt;/strong&gt; (PR):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Push branch-mu dan buka PR&lt;/li&gt;
&lt;li&gt;Rekan tim me-review kode dan meninggalkan komentar&lt;/li&gt;
&lt;li&gt;Setelah disetujui, kode di-merge&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Tiga Opsi Merge
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metode&lt;/th&gt;
&lt;th&gt;Yang Terjadi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Merge commit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Semua commit dipertahankan + merge commit ditambahkan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Squash and merge&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Semua commit digabung jadi satu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rebase and merge&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Commit diputar ulang di atas main, tanpa merge commit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Menangani Conflict
&lt;/h3&gt;

&lt;p&gt;Ketika dua branch mengedit baris yang sama, Git tidak bisa merge otomatis. Kamu akan melihat:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD
&lt;/span&gt;&lt;span class="p"&gt;const msg = "Halo!";
&lt;/span&gt;&lt;span class="gh"&gt;=======
&lt;/span&gt;&lt;span class="p"&gt;const msg = "Hai semuanya!";
&lt;/span&gt;&lt;span class="gi"&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; feature/dark-mode
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selesaikan secara manual, lalu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &amp;lt;file&amp;gt;
git commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Code Review: Pintu Gerbang Kualitas
&lt;/h2&gt;

&lt;p&gt;Sebelum PR di-merge, seseorang akan me-review kodenya. Reviewer yang baik memeriksa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apakah logikanya benar?&lt;/li&gt;
&lt;li&gt;Apakah kode mudah dibaca dan penamaannya jelas?&lt;/li&gt;
&lt;li&gt;Apakah ada test yang cukup?&lt;/li&gt;
&lt;li&gt;Apakah kode lebih kompleks dari yang seharusnya?&lt;/li&gt;
&lt;li&gt;Apakah sesuai dengan style guideline tim?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Code review bukan sekadar mencari kesalahan — ini juga cara pengetahuan menyebar di seluruh tim. Jangan lupa juga memberikan pujian ketika kode sudah ditulis dengan baik.&lt;/p&gt;




&lt;h2&gt;
  
  
  Fork &amp;amp; Clone: Berkontribusi Tanpa Akses
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Forking&lt;/strong&gt; menyalin repo orang lain ke akun GitHub-mu. &lt;strong&gt;Cloning&lt;/strong&gt; menyalin repo ke komputer lokalmu.&lt;/p&gt;

&lt;p&gt;Alur kontribusi open source yang umum:&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;# 1. Fork di GitHub (klik tombol Fork)&lt;/span&gt;

&lt;span class="c"&gt;# 2. Clone fork-mu&lt;/span&gt;
git clone https://github.com/username-kamu/nama-proyek.git

&lt;span class="c"&gt;# 3. Tambahkan repo asli sebagai upstream&lt;/span&gt;
git remote add upstream https://github.com/pemilik-asli/nama-proyek.git

&lt;span class="c"&gt;# 4. Buat branch, buat perubahan, push&lt;/span&gt;
git switch &lt;span class="nt"&gt;-c&lt;/span&gt; fix/typo-readme
git add &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Perbaiki typo di README"&lt;/span&gt;
git push origin fix/typo-readme

&lt;span class="c"&gt;# 5. Buka Pull Request di GitHub&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sinkronisasi Fork-mu
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git fetch upstream
git switch main
git merge upstream/main
git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Perbedaan Fork vs Clone:&lt;/strong&gt; Fork menyalin ke akun GitHub-mu (remote). Clone menyalin ke komputermu (lokal). Keduanya tidak mempengaruhi repo asli.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Tips untuk Mulai Berkontribusi
&lt;/h2&gt;

&lt;p&gt;Kalau kamu baru ingin terjun ke open source:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Mulai dari yang kecil&lt;/strong&gt; — perbaiki typo di dokumentasi, tambahkan komentar, perbaiki README. Jangan langsung menyerang bug paling kompleks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pelajari ekosistem proyek&lt;/strong&gt; — baca &lt;code&gt;README.md&lt;/code&gt;, &lt;code&gt;CONTRIBUTING.md&lt;/code&gt;, dan riwayat commit untuk memahami konvensi yang digunakan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ikuti konvensi yang ada&lt;/strong&gt; — cara menulis commit, penamaan branch, format PR description.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Aplikasi Git GUI: Tidak Harus Selalu Pakai Terminal
&lt;/h2&gt;

&lt;p&gt;Mengetahui perintahnya membuatmu jadi developer yang lebih kuat — tapi kamu tidak harus mengetik di terminal setiap hari. Ada banyak &lt;strong&gt;aplikasi GUI (Graphical User Interface)&lt;/strong&gt; yang memungkinkan kamu commit, branch, merge, dan stash hanya dengan klik, plus visualisasi riwayat repo yang mudah dipahami.&lt;/p&gt;

&lt;p&gt;Berikut yang paling populer:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aplikasi&lt;/th&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Harga&lt;/th&gt;
&lt;th&gt;Cocok Untuk&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub Desktop&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mac, Windows&lt;/td&gt;
&lt;td&gt;Gratis&lt;/td&gt;
&lt;td&gt;Pemula, pengguna GitHub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;GitLens&lt;/strong&gt; (ext. VS Code)&lt;/td&gt;
&lt;td&gt;Semua OS&lt;/td&gt;
&lt;td&gt;Gratis / Berbayar&lt;/td&gt;
&lt;td&gt;Developer yang sehari-hari di VS Code/Cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitKraken&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mac, Win, Linux&lt;/td&gt;
&lt;td&gt;Gratis (terbatas) / Berbayar&lt;/td&gt;
&lt;td&gt;Power user visual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fork&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mac, Windows&lt;/td&gt;
&lt;td&gt;Gratis trial / ~$50&lt;/td&gt;
&lt;td&gt;Keseimbangan kecepatan &amp;amp; fitur&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sourcetree&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mac, Windows&lt;/td&gt;
&lt;td&gt;Gratis&lt;/td&gt;
&lt;td&gt;Pengguna Atlassian/Bitbucket&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;GitHub Desktop&lt;/strong&gt; adalah yang paling sederhana — dibuat oleh GitHub, fokus pada hal-hal esensial. &lt;strong&gt;GitLens&lt;/strong&gt; adalah ekstensi VS Code yang menambahkan inline blame, visual commit graph, dan manajemen stash langsung di dalam editor-mu. &lt;strong&gt;GitKraken&lt;/strong&gt; punya tampilan commit graph yang keren dan fitur drag-and-drop untuk merge. &lt;strong&gt;Fork&lt;/strong&gt; menawarkan keseimbangan yang baik antara kecepatan dan fitur. &lt;strong&gt;Sourcetree&lt;/strong&gt; (buatan Atlassian) gratis dan kaya fitur, terutama kalau kamu pakai Bitbucket.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Meskipun pakai aplikasi GUI sehari-hari, memahami perintah dasarnya tetap penting — untuk debugging dan bekerja di server yang tidak punya GUI. Anggap aplikasi GUI sebagai lapisan produktivitas di atas pengetahuan Git-mu, bukan penggantinya.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Ringkasan
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Konsep&lt;/th&gt;
&lt;th&gt;Singkatnya&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Repository&lt;/td&gt;
&lt;td&gt;Gudang untuk file dan riwayat proyekmu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Commit&lt;/td&gt;
&lt;td&gt;Snapshot tersimpan dengan pesan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Checkout&lt;/td&gt;
&lt;td&gt;Kunjungi commit lama sementara&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reset&lt;/td&gt;
&lt;td&gt;Hapus riwayat commit (hati-hati)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Revert&lt;/td&gt;
&lt;td&gt;Undo commit dengan aman&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Branch&lt;/td&gt;
&lt;td&gt;Jalur pengembangan terpisah&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stash&lt;/td&gt;
&lt;td&gt;Simpan sementara pekerjaan yang belum selesai&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Merge&lt;/td&gt;
&lt;td&gt;Gabungkan dua branch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pull Request&lt;/td&gt;
&lt;td&gt;Permintaan formal untuk review dan merge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fork&lt;/td&gt;
&lt;td&gt;Salin repo orang lain ke akunmu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clone&lt;/td&gt;
&lt;td&gt;Salin repo ke komputer lokalmu&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;Mulai dari yang kecil, commit sesering mungkin, dan jangan takut membuat branch baru. Satu commit pada satu waktu. 🚀&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published as a series (Git for Everyone) at: &lt;a href="https://sanudin.dev/blog/git-for-everyone__part-1-what-is-git-repository-commit" rel="noopener noreferrer"&gt;What Is Git, Repository, and Commit&lt;/a&gt; | &lt;a href="https://sanudin.dev/blog/git-for-everyone__part-2-checkout-reset-revert" rel="noopener noreferrer"&gt;Traveling Through Time — Checkout, Reset, and Revert&lt;br&gt;
&lt;/a&gt; | &lt;a href="https://sanudin.dev/blog/git-for-everyone__part-3-branches-stash-workflow" rel="noopener noreferrer"&gt;Branches, Stash, and Git Workflow&lt;/a&gt; | &lt;a href="https://sanudin.dev/blog/git-for-everyone__part-4-merge-pull-request-code-review" rel="noopener noreferrer"&gt;Merge, Pull Requests, and Code Reviews&lt;/a&gt; | &lt;a href="https://sanudin.dev/blog/git-for-everyone__part-5-fork-clone-open-source" rel="noopener noreferrer"&gt;Fork, Clone, and Open Source Collaboration&lt;/a&gt; | &lt;a href="https://sanudin.dev/blog/git-for-everyone__part-6-git-gui-apps" rel="noopener noreferrer"&gt;Git GUI Apps — You Don't Have to Use the Terminal&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>beginners</category>
      <category>versioncontrol</category>
      <category>programming</category>
    </item>
    <item>
      <title>From OOP to SOLID: Everything You Need to Know in One Article</title>
      <dc:creator>Sanudin</dc:creator>
      <pubDate>Sun, 24 May 2026 16:52:32 +0000</pubDate>
      <link>https://dev.to/sanudin-dev/from-oop-to-solid-everything-you-need-to-know-in-one-article-44co</link>
      <guid>https://dev.to/sanudin-dev/from-oop-to-solid-everything-you-need-to-know-in-one-article-44co</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🌐 Read this post in Bahasa Indonesia &lt;a href="https://dev.to/sanudin-dev/dari-oop-ke-solid-semua-yang-perlu-kamu-tahu-dalam-satu-artikel-1b6o"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📝 A note on this article&lt;/strong&gt;&lt;br&gt;
This post is based on my personal study notes on OOP and SOLID principles. To make these notes more readable and useful — for myself and for others — I worked with AI to help expand and structure them into a proper blog format. The ideas, learning journey, and understanding are mine; the AI helped with the writing and presentation.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Good code doesn't happen by accident. Behind every codebase that's a pleasure to work with, there's a set of ideas guiding how things are structured and connected.&lt;/p&gt;

&lt;p&gt;This article covers that full journey — from what OOP is, how objects relate, what bad design looks like, and finally: the five SOLID principles that tie it all together.&lt;/p&gt;

&lt;p&gt;Let's go.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdx0eigrfmq8wyqzc70l0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdx0eigrfmq8wyqzc70l0.png" alt="blueprint with robot sketches" width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 1: What Is OOP?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Object Oriented Programming (OOP)&lt;/strong&gt; is a way of writing code that mirrors the real world. Instead of one long list of instructions, you group related data and behavior into &lt;em&gt;objects&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🤖 Think of a robot toy. It has &lt;strong&gt;properties&lt;/strong&gt; (color, height, battery) and &lt;strong&gt;behaviors&lt;/strong&gt; (walk, talk, wave). In OOP, that robot is an object — and the blueprint used to build it is called a &lt;strong&gt;class&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Two key terms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Class&lt;/strong&gt; — the blueprint (template)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Object&lt;/strong&gt; — a real instance built from the blueprint&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Four Pillars
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pillar&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inheritance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A child class inherits properties and behaviors from a parent class&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Encapsulation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Internal data is hidden — only controlled access is allowed from outside&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Abstraction&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Complex internals are hidden; only what's needed is exposed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Polymorphism&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The same action can behave differently depending on the object&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqoftx9p60uad20eabucb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqoftx9p60uad20eabucb.png" alt="robots connected by lines showing relationships" width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 2: How Objects Relate
&lt;/h2&gt;

&lt;p&gt;Objects don't exist in isolation. They connect, collaborate, and depend on each other — and the &lt;em&gt;type&lt;/em&gt; of relationship matters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Association
&lt;/h3&gt;

&lt;p&gt;Two objects know about each other and can interact. Comes in three cardinalities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One-to-one&lt;/strong&gt; — one passport per person&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-to-many&lt;/strong&gt; — one teacher, many students&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Many-to-many&lt;/strong&gt; — many students, many courses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inside association, when one object "owns" another, the relationship is either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Aggregation&lt;/strong&gt; (loose) — the child survives without the parent. A backpack contains books, but the books still exist if you throw the backpack away.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Composition&lt;/strong&gt; (tight) — the child cannot exist without the parent. A house has rooms; demolish the house, the rooms cease to exist.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dependency
&lt;/h3&gt;

&lt;p&gt;A temporary, usage-based relationship. One class uses another inside a method but doesn't hold onto it permanently. Weaker than association.&lt;/p&gt;

&lt;h3&gt;
  
  
  Generalization &amp;amp; Realization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Generalization&lt;/strong&gt; — pulling shared traits from multiple classes into one superclass (inheritance)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Realization&lt;/strong&gt; — a class implementing an interface, promising to fulfill a defined contract&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3grr9oexl2t6unn34oor.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3grr9oexl2t6unn34oor.png" alt="tangled cables or cracked structure" width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 3: What Bad Design Looks Like
&lt;/h2&gt;

&lt;p&gt;Before learning the rules, it helps to understand what you're guarding against. Robert C. Martin identified three symptoms of bad design:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🪨 Rigidity&lt;/strong&gt; — the system is hard to change. Touch one thing, and a cascade of other things need updating. Developers become afraid to make changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🍪 Fragility&lt;/strong&gt; — the system breaks in unexpected places when you make a change. You fix a bug in the payment module, and somehow the email notifications stop working.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🏗️ Immobility&lt;/strong&gt; — useful components can't be reused. They're so entangled with their surroundings that extracting them would take longer than rewriting from scratch.&lt;/p&gt;

&lt;p&gt;All three share the same root cause: &lt;strong&gt;poor management of dependencies&lt;/strong&gt; between components.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr8yvza2t207x7gsxizwu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr8yvza2t207x7gsxizwu.png" alt="five geometric shapes in a clean grid" width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 4: SOLID
&lt;/h2&gt;

&lt;p&gt;SOLID is a set of five principles that directly address the problems above. Each one targets a specific failure mode.&lt;/p&gt;




&lt;h3&gt;
  
  
  S — Single Responsibility Principle
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"A module should be responsible to one, and only one, actor."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every class should have exactly &lt;strong&gt;one reason to change&lt;/strong&gt; — it serves one actor (one group of stakeholders).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👨‍🍳 A restaurant worker who is simultaneously the chef, cashier, security guard, and delivery driver is a disaster waiting to happen. One change in one role disrupts all the others.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Split your classes. One responsibility each.&lt;/p&gt;




&lt;h3&gt;
  
  
  O — Open/Closed Principle
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"A software artifact should be open for extension but closed for modification."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Add new behavior by &lt;strong&gt;extending&lt;/strong&gt; — not by editing existing, working code.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔌 A power strip lets you plug in new devices without rewiring the strip itself. That's OCP in action.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When requirements change, slot in new code alongside the old — don't rewrite what's already working.&lt;/p&gt;




&lt;h3&gt;
  
  
  L — Liskov Substitution Principle
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"If S is a subtype of T, objects of type T may be replaced with objects of type S without altering program correctness."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A subclass must be &lt;strong&gt;fully substitutable&lt;/strong&gt; for its parent class. Every promise the parent makes, the child must keep.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🤖 If the parent robot can cook, the child robot must be able to cook too — not throw an error or silently do nothing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If your subclass has empty methods, stub implementations, or "not supported" throws — that's a Liskov violation.&lt;/p&gt;




&lt;h3&gt;
  
  
  I — Interface Segregation Principle
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Clients should not be forced to depend upon interfaces that they do not use."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Don't create fat interfaces that force classes to implement methods they don't need. &lt;strong&gt;Split interfaces&lt;/strong&gt; into smaller, focused ones.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🍴 Don't give every restaurant customer a steak knife, soup spoon, chopsticks, and a fondue skewer when they only ordered soup.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Smaller interfaces = narrower dependencies = changes stay localized.&lt;/p&gt;




&lt;h3&gt;
  
  
  D — Dependency Inversion Principle
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"High-level modules should not depend on low-level modules. Both should depend on abstractions."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Your business logic should not be hardwired to specific implementations. It should talk to &lt;strong&gt;interfaces&lt;/strong&gt; — and the low-level details implement those interfaces.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🤖 Don't solder a spatula into the robot's arm. Give the arm a standard connector, and let tools be swapped in and out.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is what makes infrastructure (databases, APIs, file systems) swappable without touching business logic.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Reference: SOLID at a Glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Principle&lt;/th&gt;
&lt;th&gt;Problem it solves&lt;/th&gt;
&lt;th&gt;Key question to ask&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SRP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Classes doing too much&lt;/td&gt;
&lt;td&gt;"Does this class serve more than one group of stakeholders?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OCP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Editing old code to add features&lt;/td&gt;
&lt;td&gt;"Can I add this as an extension instead of a modification?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LSP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Broken inheritance hierarchies&lt;/td&gt;
&lt;td&gt;"Can I swap the child for the parent without anything breaking?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ISP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fat interfaces with unused methods&lt;/td&gt;
&lt;td&gt;"Is this class forced to implement something it doesn't need?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DIP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Business logic locked to infrastructure&lt;/td&gt;
&lt;td&gt;"Does my high-level code depend on a concrete class it shouldn't?"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Where to Start
&lt;/h2&gt;

&lt;p&gt;If you're applying these for the first time:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start with SRP&lt;/strong&gt; — find your "doing too much" classes and split them&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check inheritance for LSP violations&lt;/strong&gt; — empty methods are the warning sign&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Introduce interfaces at infrastructure boundaries&lt;/strong&gt; — that's DIP in practice&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These principles aren't a checklist. They're questions to ask every time you sit down to write code.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published as a series at: &lt;a href="https://sanudin.dev/blog/oop-solid__part-1-what-is-oop" rel="noopener noreferrer"&gt;Part 1: What is OOP?&lt;/a&gt; | &lt;a href="https://sanudin.dev/blog/oop-solid__part-2-how-objects-relate" rel="noopener noreferrer"&gt;Part 2: When Objects Meet&lt;/a&gt; | &lt;a href="https://sanudin.dev/blog/oop-solid__part-3-why-bad-design-hurts" rel="noopener noreferrer"&gt;Part 3: Why Bad Design Hurts&lt;/a&gt; | &lt;a href="https://sanudin.dev/blog/oop-solid__part-4-solid" rel="noopener noreferrer"&gt;Part 4: SOLID&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>oop</category>
      <category>solid</category>
    </item>
    <item>
      <title>Dari OOP ke SOLID: Semua yang Perlu Kamu Tahu dalam Satu Artikel</title>
      <dc:creator>Sanudin</dc:creator>
      <pubDate>Sun, 24 May 2026 16:50:29 +0000</pubDate>
      <link>https://dev.to/sanudin-dev/dari-oop-ke-solid-semua-yang-perlu-kamu-tahu-dalam-satu-artikel-1b6o</link>
      <guid>https://dev.to/sanudin-dev/dari-oop-ke-solid-semua-yang-perlu-kamu-tahu-dalam-satu-artikel-1b6o</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🌐 Baca artikel ini dalam Bahasa Inggris di &lt;a href="https://dev.to/sanudin-dev/from-oop-to-solid-everything-you-need-to-know-in-one-article-44co"&gt;sini&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📝 Catatan tentang artikel ini&lt;/strong&gt;&lt;br&gt;
Artikel ini dibuat berdasarkan catatan belajar pribadi saya tentang OOP dan prinsip SOLID. Untuk membuat catatan tersebut lebih mudah dibaca dan bermanfaat — bagi saya dan orang lain — saya menggunakan bantuan AI untuk mengembangkan dan menyusunnya menjadi artikel blog. Ide, perjalanan belajar, dan pemahamannya adalah milik saya; AI membantu di bagian penulisan dan penyajiannya.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Kode yang enak dibaca dan mudah diubah bukan kebetulan. Di balik setiap codebase yang menyenangkan untuk dikerjakan, ada sekumpulan ide yang memandu bagaimana semuanya disusun dan dihubungkan.&lt;/p&gt;

&lt;p&gt;Artikel ini membahas perjalanan lengkap itu — mulai dari apa itu OOP, bagaimana objek saling berhubungan, seperti apa desain yang buruk, hingga akhirnya: lima prinsip SOLID yang menyatukan semuanya.&lt;/p&gt;

&lt;p&gt;Yuk mulai.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdx0eigrfmq8wyqzc70l0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdx0eigrfmq8wyqzc70l0.png" alt="blueprint with robot sketches" width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bagian 1: Apa Itu OOP?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Object Oriented Programming (OOP)&lt;/strong&gt; adalah cara menulis kode yang mencerminkan dunia nyata. Alih-alih satu daftar panjang instruksi, kamu mengelompokkan data dan perilaku yang saling berkaitan ke dalam &lt;em&gt;objek&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🤖 Bayangkan mainan robot. Robot punya &lt;strong&gt;properti&lt;/strong&gt; (warna, tinggi, baterai) dan &lt;strong&gt;perilaku&lt;/strong&gt; (berjalan, berbicara, melambaikan tangan). Dalam OOP, robot itu adalah objek — dan cetak biru yang digunakan untuk membuatnya disebut &lt;strong&gt;class&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dua istilah kunci:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Class&lt;/strong&gt; — cetak biru (template)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Object&lt;/strong&gt; — wujud nyata yang dibuat dari cetak biru tersebut&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Empat Pilar OOP
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pilar&lt;/th&gt;
&lt;th&gt;Fungsinya&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inheritance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Class anak mewarisi properti dan perilaku dari class induk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Encapsulation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Data internal disembunyikan — akses dari luar hanya melalui jalur yang ditentukan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Abstraction&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kerumitan internal disembunyikan; hanya yang perlu digunakan saja yang ditampilkan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Polymorphism&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Aksi yang sama bisa berperilaku berbeda tergantung pada objeknya&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqoftx9p60uad20eabucb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqoftx9p60uad20eabucb.png" alt="robots connected by lines showing relationships" width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bagian 2: Bagaimana Objek Saling Berhubungan
&lt;/h2&gt;

&lt;p&gt;Objek tidak hidup sendiri-sendiri. Mereka terhubung, bekerja sama, dan saling bergantung — dan &lt;em&gt;jenis&lt;/em&gt; hubungannya penting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Asosiasi
&lt;/h3&gt;

&lt;p&gt;Dua objek saling mengenal dan bisa berinteraksi. Ada tiga jenis kardinalitas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One-to-one&lt;/strong&gt; — satu orang satu paspor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-to-many&lt;/strong&gt; — satu guru, banyak murid&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Many-to-many&lt;/strong&gt; — banyak murid, banyak mata pelajaran&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dalam asosiasi, ketika satu objek "memiliki" objek lain, hubungannya bisa berupa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Aggregation&lt;/strong&gt; (longgar) — objek anak bisa hidup tanpa induknya. Tas ransel berisi buku, tapi bukunya tetap ada meski tasnya dibuang.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Composition&lt;/strong&gt; (erat) — objek anak tidak bisa eksis tanpa induknya. Rumah punya kamar; hancurkan rumahnya, kamarnya ikut lenyap.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dependency
&lt;/h3&gt;

&lt;p&gt;Hubungan sementara berbasis pemakaian. Satu class memakai class lain di dalam sebuah method, tapi tidak menyimpannya secara permanen. Lebih lemah dari asosiasi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Generalization &amp;amp; Realization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Generalization&lt;/strong&gt; — mengangkat sifat-sifat yang sama dari beberapa class ke satu superclass (pewarisan)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Realization&lt;/strong&gt; — sebuah class mengimplementasikan interface, berjanji untuk memenuhi kontrak yang sudah didefinisikan&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3grr9oexl2t6unn34oor.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3grr9oexl2t6unn34oor.png" alt="tangled cables or cracked structure" width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bagian 3: Seperti Apa Desain yang Buruk?
&lt;/h2&gt;

&lt;p&gt;Sebelum belajar aturannya, penting untuk memahami apa yang sedang kita hindari. Robert C. Martin mengidentifikasi tiga gejala desain yang buruk:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🪨 Rigidity (Kekakuan)&lt;/strong&gt; — sistem susah diubah. Sentuh satu hal, dan banyak hal lain ikut perlu diperbarui. Developer jadi takut untuk melakukan perubahan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🍪 Fragility (Kerapuhan)&lt;/strong&gt; — sistem rusak di tempat yang tidak terduga saat kamu melakukan perubahan. Kamu memperbaiki bug di modul pembayaran, tiba-tiba notifikasi email berhenti berfungsi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🏗️ Immobility (Ketidakmampuan Dipindahkan)&lt;/strong&gt; — komponen yang berguna tidak bisa dipakai ulang. Mereka terlalu kusut dengan sekitarnya sehingga mencabutnya butuh lebih lama dari menulis ulang dari awal.&lt;/p&gt;

&lt;p&gt;Ketiganya punya akar penyebab yang sama: &lt;strong&gt;pengelolaan dependensi antar komponen yang buruk&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr8yvza2t207x7gsxizwu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr8yvza2t207x7gsxizwu.png" alt="five geometric shapes in a clean grid" width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bagian 4: SOLID
&lt;/h2&gt;

&lt;p&gt;SOLID adalah lima prinsip yang secara langsung mengatasi masalah di atas. Masing-masing menargetkan kegagalan desain yang spesifik.&lt;/p&gt;




&lt;h3&gt;
  
  
  S — Single Responsibility Principle
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Sebuah modul harus bertanggung jawab pada satu, dan hanya satu, aktor."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Setiap class harus punya tepat &lt;strong&gt;satu alasan untuk berubah&lt;/strong&gt; — ia melayani satu aktor (satu kelompok stakeholder).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👨‍🍳 Seorang pekerja restoran yang sekaligus menjadi koki, kasir, satpam, dan pengantar makanan adalah bencana yang menunggu terjadi. Perubahan di satu peran mengganggu semua peran lainnya.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pisahkan class-mu. Satu tanggung jawab per class.&lt;/p&gt;




&lt;h3&gt;
  
  
  O — Open/Closed Principle
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Artefak perangkat lunak harus terbuka untuk ditambahkan, tapi tertutup untuk dimodifikasi."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tambahkan perilaku baru dengan cara &lt;strong&gt;memperluas&lt;/strong&gt; — bukan mengedit kode lama yang sudah berjalan.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔌 Stop kontak memungkinkan kamu mencolokkan perangkat baru tanpa perlu membongkar kabelnya. Itulah OCP dalam praktik.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ketika kebutuhan berubah, tambahkan kode baru di samping yang lama — jangan tulis ulang yang sudah berjalan.&lt;/p&gt;




&lt;h3&gt;
  
  
  L — Liskov Substitution Principle
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Jika S adalah subtipe dari T, objek bertipe T bisa digantikan dengan objek bertipe S tanpa mengubah kebenaran program."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sebuah subclass harus &lt;strong&gt;sepenuhnya bisa menggantikan&lt;/strong&gt; class induknya. Setiap janji yang dibuat induk, harus dipenuhi oleh anak.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🤖 Kalau robot induk bisa memasak, robot anak juga harus bisa memasak — bukan melempar error atau diam saja tanpa melakukan apa-apa.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Kalau subclass-mu punya method kosong, implementasi stub, atau melempar "not supported" — itu pelanggaran Liskov.&lt;/p&gt;




&lt;h3&gt;
  
  
  I — Interface Segregation Principle
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Client tidak boleh dipaksa bergantung pada interface yang tidak mereka gunakan."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Jangan buat interface besar yang memaksa class mengimplementasikan method yang tidak mereka butuhkan. &lt;strong&gt;Pecah interface&lt;/strong&gt; menjadi bagian-bagian kecil yang lebih fokus.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🍴 Jangan berikan setiap pelanggan restoran pisau steak, sendok sup, sumpit, dan tusuk fondue ketika mereka hanya memesan sup.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Interface yang lebih kecil = dependensi yang lebih sempit = perubahan tetap terlokalisir.&lt;/p&gt;




&lt;h3&gt;
  
  
  D — Dependency Inversion Principle
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Modul tingkat tinggi tidak boleh bergantung pada modul tingkat rendah. Keduanya harus bergantung pada abstraksi."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Logika bisnis tidak boleh terkait langsung dengan implementasi spesifik. Ia harus bicara dengan &lt;strong&gt;interface&lt;/strong&gt; — dan detail tingkat rendah yang mengimplementasikan interface tersebut.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🤖 Jangan solder spatula ke tangan robot. Beri tangannya konektor standar, dan biarkan alat-alatnya bisa diganti-ganti.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Inilah yang membuat infrastruktur (database, API, file system) bisa diganti tanpa menyentuh logika bisnis.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ringkasan Cepat: SOLID Sekilas
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prinsip&lt;/th&gt;
&lt;th&gt;Masalah yang diatasi&lt;/th&gt;
&lt;th&gt;Pertanyaan kuncinya&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SRP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Class mengerjakan terlalu banyak hal&lt;/td&gt;
&lt;td&gt;"Apakah class ini melayani lebih dari satu kelompok stakeholder?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OCP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mengedit kode lama untuk menambah fitur&lt;/td&gt;
&lt;td&gt;"Bisakah ini ditambahkan sebagai ekstensi, bukan modifikasi?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LSP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hirarki pewarisan yang rusak&lt;/td&gt;
&lt;td&gt;"Bisakah anak menggantikan induk tanpa ada yang rusak?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ISP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Interface gemuk dengan method yang tidak dipakai&lt;/td&gt;
&lt;td&gt;"Apakah class ini dipaksa mengimplementasikan sesuatu yang tidak dibutuhkan?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DIP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Logika bisnis terikat ke infrastruktur&lt;/td&gt;
&lt;td&gt;"Apakah kode tingkat tinggi bergantung pada class konkret yang seharusnya tidak?"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Mulai dari Mana?
&lt;/h2&gt;

&lt;p&gt;Kalau kamu baru pertama kali menerapkan ini:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Mulai dengan SRP&lt;/strong&gt; — cari class yang "mengerjakan terlalu banyak" dan pecah&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Periksa pewarisan untuk pelanggaran LSP&lt;/strong&gt; — method kosong adalah tanda peringatannya&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tambahkan interface di batas infrastruktur&lt;/strong&gt; — itulah DIP dalam praktik&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Prinsip-prinsip ini bukan checklist. Mereka adalah pertanyaan yang perlu kamu ajukan setiap kali duduk untuk menulis kode.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published as a series at: &lt;a href="https://sanudin.dev/blog/oop-solid__part-1-what-is-oop" rel="noopener noreferrer"&gt;Part 1: What is OOP?&lt;/a&gt; | &lt;a href="https://sanudin.dev/blog/oop-solid__part-2-how-objects-relate" rel="noopener noreferrer"&gt;Part 2: When Objects Meet&lt;/a&gt; | &lt;a href="https://sanudin.dev/blog/oop-solid__part-3-why-bad-design-hurts" rel="noopener noreferrer"&gt;Part 3: Why Bad Design Hurts&lt;/a&gt; | &lt;a href="https://sanudin.dev/blog/oop-solid__part-4-solid" rel="noopener noreferrer"&gt;Part 4: SOLID&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>oop</category>
      <category>solid</category>
    </item>
  </channel>
</rss>
