<?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: Caelora</title>
    <description>The latest articles on DEV Community by Caelora (@caelora).</description>
    <link>https://dev.to/caelora</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4044992%2Fb784496e-0cf3-4f6b-9a0c-e9b88691f08d.jpg</url>
      <title>DEV Community: Caelora</title>
      <link>https://dev.to/caelora</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/caelora"/>
    <language>en</language>
    <item>
      <title>When the Network Breaks: A Developer’s View of Mobile and Internet Support</title>
      <dc:creator>Caelora</dc:creator>
      <pubDate>Fri, 18 Sep 2026 06:38:08 +0000</pubDate>
      <link>https://dev.to/caelora/when-the-network-breaks-a-developers-view-of-mobile-and-internet-support-ih2</link>
      <guid>https://dev.to/caelora/when-the-network-breaks-a-developers-view-of-mobile-and-internet-support-ih2</guid>
      <description>&lt;p&gt;When an application stops responding, developers rarely start by saying, "The internet is broken."&lt;/p&gt;

&lt;p&gt;They usually ask a series of more specific questions:&lt;/p&gt;

&lt;p&gt;Is DNS working? Is the device connected to the network? Can the server be reached? Is the request being rejected? Is there packet loss? Did the service itself fail?&lt;/p&gt;

&lt;p&gt;The same mindset can be applied to everyday mobile and internet problems.&lt;/p&gt;

&lt;p&gt;From a user's perspective, a failed connection may simply look like "no internet." Technically, however, there are several layers between a device and the service it is trying to reach. Understanding those layers can make troubleshooting much more systematic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Think in Layers
&lt;/h2&gt;

&lt;p&gt;A useful way to troubleshoot connectivity is to work from the lowest layer upward.&lt;/p&gt;

&lt;p&gt;Consider a smartphone trying to access a website.&lt;/p&gt;

&lt;p&gt;First, the device needs a connection to a mobile network or Wi-Fi network. The network then needs to provide an IP configuration. DNS may be required to translate a domain name into an IP address. Finally, the device needs to establish a connection to the destination server.&lt;/p&gt;

&lt;p&gt;A failure at any one of these stages can produce a similar symptom: the website does not load.&lt;/p&gt;

&lt;p&gt;This is why randomly changing settings is usually less effective than testing each layer independently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start With the Client
&lt;/h2&gt;

&lt;p&gt;The client device should normally be the first thing to investigate.&lt;/p&gt;

&lt;p&gt;Check whether Wi-Fi or mobile data is enabled. Verify that the device recognizes the SIM card or wireless network. Restarting the network interface, enabling Airplane Mode temporarily, or rebooting the device can eliminate temporary state-related problems.&lt;/p&gt;

&lt;p&gt;Developers use a similar principle when debugging applications: establish whether the problem can be reproduced consistently.&lt;/p&gt;

&lt;p&gt;If one device cannot connect while another device on the same network works normally, the problem is less likely to be a complete network outage.&lt;/p&gt;

&lt;p&gt;That distinction is valuable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate Connectivity From Service Availability
&lt;/h2&gt;

&lt;p&gt;A common troubleshooting mistake is assuming that an application failure automatically means the network is down.&lt;/p&gt;

&lt;p&gt;Imagine a phone connected to Wi-Fi but unable to open one particular website. Other websites work normally.&lt;/p&gt;

&lt;p&gt;The network connection itself may be fine.&lt;/p&gt;

&lt;p&gt;The problem could instead involve DNS resolution, the destination server, TLS negotiation, routing, or the application service.&lt;/p&gt;

&lt;p&gt;The same logic applies to mobile networks.&lt;/p&gt;

&lt;p&gt;If calls work but mobile data does not, the problem is different from a complete loss of cellular connectivity. If only one application fails while everything else works, investigating the application may make more sense than changing network settings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Observable Symptoms
&lt;/h2&gt;

&lt;p&gt;In software engineering, observability is built around signals such as logs, metrics, and traces.&lt;/p&gt;

&lt;p&gt;Users do not normally have access to infrastructure-level telemetry, but they can still collect useful observations.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;When did the failure start?&lt;/li&gt;
&lt;li&gt;Does it happen continuously or intermittently?&lt;/li&gt;
&lt;li&gt;Does it affect one device or multiple devices?&lt;/li&gt;
&lt;li&gt;Does switching between Wi-Fi and mobile data change the result?&lt;/li&gt;
&lt;li&gt;Are calls and SMS still working?&lt;/li&gt;
&lt;li&gt;Does restarting the device temporarily fix it?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These observations effectively become a small incident report.&lt;/p&gt;

&lt;p&gt;Instead of reporting "my internet is broken," a user can provide information that helps narrow down the failure domain.&lt;/p&gt;

&lt;h2&gt;
  
  
  When Self-Service Is Not Enough
&lt;/h2&gt;

&lt;p&gt;Technical troubleshooting eventually reaches a boundary where the user cannot inspect the underlying infrastructure.&lt;/p&gt;

&lt;p&gt;A mobile customer cannot directly inspect a carrier's radio network, subscriber database, or backend provisioning system. A home internet customer cannot access the provider's access network or authentication infrastructure.&lt;/p&gt;

&lt;p&gt;This is where customer support becomes an important part of the technical workflow.&lt;/p&gt;

&lt;p&gt;For example, someone searching for information about &lt;a href="https://callcenterno.vip/1612/cara-hubungi-indosat/" rel="noopener noreferrer"&gt;how to contact Indosat&lt;/a&gt; may simply need the correct support channel after local troubleshooting has failed.&lt;/p&gt;

&lt;p&gt;The same applies to home broadband services. A user experiencing a persistent connection failure can check information about how to contact IndiHome 147 before reporting the incident.&lt;/p&gt;

&lt;p&gt;For IM3 users, a reference covering how to contact an IM3 operator can serve a similar purpose.&lt;/p&gt;

&lt;p&gt;The links are not the troubleshooting process itself. They are the next step when the failure moves beyond what can be diagnosed from the client side.&lt;/p&gt;

&lt;h2&gt;
  
  
  Treat Support Tickets Like Incident Reports
&lt;/h2&gt;

&lt;p&gt;There is an interesting similarity between customer support and incident management.&lt;/p&gt;

&lt;p&gt;A good support request contains enough information for another person to reproduce or investigate the problem.&lt;/p&gt;

&lt;p&gt;A useful report might look 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;Issue: Mobile data unavailable

Started: 10:30 UTC
Device: Android smartphone
Network: Mobile data
Calls: Working
SMS: Working
Data: Not working
Location: Same location where service normally works
Restarted: Yes
Airplane Mode test: Yes
SIM tested in another device: Yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is much more useful than a vague description.&lt;/p&gt;

&lt;p&gt;The support team can now investigate specific possibilities instead of starting from zero.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build a Troubleshooting Decision Tree
&lt;/h2&gt;

&lt;p&gt;The entire process can be simplified into a decision tree:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Connection unavailable
        |
        v
Is the device connected?
   /             \
 No               Yes
 |                 |
Check Wi-Fi/     Test another
mobile settings  service
                   |
                   v
          Is everything affected?
             /            \
           Yes             No
            |               |
      Check network       Check the
      or provider         application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact decision tree will vary depending on the technology, but the principle remains the same: eliminate possibilities one at a time.&lt;/p&gt;

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

&lt;p&gt;Connectivity problems are often treated as simple consumer issues, but they can be surprisingly complex underneath the surface.&lt;/p&gt;

&lt;p&gt;A single failed webpage request can involve the device, wireless network, IP configuration, DNS, routing, security protocols, and the destination service.&lt;/p&gt;

&lt;p&gt;Thinking like a developer helps turn an unclear problem into a sequence of testable questions.&lt;/p&gt;

&lt;p&gt;And when the failure exists beyond the client side, good customer support provides the bridge between the user's observations and the provider's infrastructure.&lt;/p&gt;

&lt;p&gt;That combination—structured troubleshooting, useful observations, and reliable support channels—is what makes technical problems easier to diagnose and resolve.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
    </item>
    <item>
      <title>7 Git Commands I Use Every Single Day</title>
      <dc:creator>Caelora</dc:creator>
      <pubDate>Tue, 28 Jul 2026 03:50:33 +0000</pubDate>
      <link>https://dev.to/caelora/7-git-commands-i-use-every-single-day-436a</link>
      <guid>https://dev.to/caelora/7-git-commands-i-use-every-single-day-436a</guid>
      <description>&lt;p&gt;Git has hundreds of commands, but honestly, I only use a handful of them every day. These commands cover almost everything I need—from checking changes to syncing with remote repositories.&lt;/p&gt;

&lt;p&gt;Here are my daily essentials.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. &lt;code&gt;git status&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;This is probably the command I run the most.&lt;/p&gt;

&lt;p&gt;Before doing anything, I always check the current state of my repository.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It tells me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which files have changed&lt;/li&gt;
&lt;li&gt;What's staged&lt;/li&gt;
&lt;li&gt;What's untracked&lt;/li&gt;
&lt;li&gt;Which branch I'm on&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. &lt;code&gt;git diff&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;One habit that has saved me from countless mistakes is reviewing the actual changes before committing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git diff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If I've already staged files, I'll use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git diff &lt;span class="nt"&gt;--staged&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Seeing the exact lines that changed helps catch accidental edits before they become part of the commit history.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. &lt;code&gt;git add&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Once everything looks good, I stage the files.&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 &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or, if I only want specific files:&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 src/app.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. &lt;code&gt;git commit&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Every commit should explain &lt;em&gt;why&lt;/em&gt; the change exists.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Fix login validation"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Small, focused commits make debugging and code reviews much easier.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. &lt;code&gt;git pull&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Before starting new work, I make sure my local branch is up to date.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git pull
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This reduces merge conflicts later.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. &lt;code&gt;git push&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Once everything is ready:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple, but one of the most satisfying commands after finishing a feature.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. &lt;code&gt;git log --oneline&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Need to quickly review recent commits?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log &lt;span class="nt"&gt;--oneline&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's much cleaner than the default log and gives a quick overview of project history.&lt;/p&gt;




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

&lt;p&gt;You don't need to memorize every Git command to be productive.&lt;/p&gt;

&lt;p&gt;For me, these seven commands handle about 95% of my day-to-day Git workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git status&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git diff&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git diff --staged&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git add&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git commit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git pull&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git push&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git log --oneline&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm always curious to learn new workflows, though.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's one Git command you use every day that you think more developers should know?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pls find me at &lt;a href="https://callcenterno.vip/" rel="noopener noreferrer"&gt;callcenterno.vip&lt;/a&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>beginners</category>
    </item>
    <item>
      <title>My Side Projects Started Growing After I Stopped Waiting for "Perfect"</title>
      <dc:creator>Caelora</dc:creator>
      <pubDate>Sun, 26 Jul 2026 01:31:20 +0000</pubDate>
      <link>https://dev.to/caelora/my-side-projects-started-growing-after-i-stopped-waiting-for-perfect-1ke0</link>
      <guid>https://dev.to/caelora/my-side-projects-started-growing-after-i-stopped-waiting-for-perfect-1ke0</guid>
      <description>&lt;p&gt;I used to spend more time planning projects than actually building them.&lt;/p&gt;

&lt;p&gt;I'd think about the tech stack.&lt;/p&gt;

&lt;p&gt;The database.&lt;/p&gt;

&lt;p&gt;Authentication.&lt;/p&gt;

&lt;p&gt;Folder structure.&lt;/p&gt;

&lt;p&gt;CI/CD.&lt;/p&gt;

&lt;p&gt;Docker.&lt;/p&gt;

&lt;p&gt;Kubernetes.&lt;/p&gt;

&lt;p&gt;Monitoring.&lt;/p&gt;

&lt;p&gt;By the time I finished planning...&lt;/p&gt;

&lt;p&gt;I was already tired.&lt;/p&gt;

&lt;p&gt;The project never even started.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then I tried something different
&lt;/h2&gt;

&lt;p&gt;One weekend I gave myself a simple rule.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build something that works in one day.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No fancy architecture.&lt;/p&gt;

&lt;p&gt;No microservices.&lt;/p&gt;

&lt;p&gt;No "future-proof" decisions.&lt;/p&gt;

&lt;p&gt;Just make it work.&lt;/p&gt;

&lt;p&gt;That project was ugly.&lt;/p&gt;

&lt;p&gt;The UI wasn't great.&lt;/p&gt;

&lt;p&gt;The code wasn't perfect.&lt;/p&gt;

&lt;p&gt;But people actually used it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shipping teaches things tutorials don't
&lt;/h2&gt;

&lt;p&gt;When real users start clicking your app, you notice problems that never appear in toy projects.&lt;/p&gt;

&lt;p&gt;Your loading state is confusing.&lt;/p&gt;

&lt;p&gt;Your error messages make no sense.&lt;/p&gt;

&lt;p&gt;Someone tries something you never expected.&lt;/p&gt;

&lt;p&gt;And suddenly you're solving real problems instead of imaginary ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perfection is expensive
&lt;/h2&gt;

&lt;p&gt;I've realized perfection has a hidden cost.&lt;/p&gt;

&lt;p&gt;Every extra day polishing an unreleased project is another day without feedback.&lt;/p&gt;

&lt;p&gt;You don't know if people even want your idea.&lt;/p&gt;

&lt;p&gt;You're optimizing for users that don't exist yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  My new workflow
&lt;/h2&gt;

&lt;p&gt;Now I ask myself only three questions before starting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does it solve one problem?&lt;/li&gt;
&lt;li&gt;Can I build it this weekend?&lt;/li&gt;
&lt;li&gt;Can someone use it on Monday?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the answer is yes...&lt;/p&gt;

&lt;p&gt;I start coding.&lt;/p&gt;

&lt;p&gt;Everything else can wait.&lt;/p&gt;

&lt;h2&gt;
  
  
  Funny enough...
&lt;/h2&gt;

&lt;p&gt;The projects I spent months planning never launched.&lt;/p&gt;

&lt;p&gt;The projects I built in a weekend are the ones still online today.&lt;/p&gt;

&lt;p&gt;Not because they're better.&lt;/p&gt;

&lt;p&gt;Because they actually exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;Your first version isn't supposed to impress people.&lt;/p&gt;

&lt;p&gt;It's supposed to teach you something.&lt;/p&gt;

&lt;p&gt;You can always improve software that exists.&lt;/p&gt;

&lt;p&gt;You can't improve software that's still inside your notebook.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>webdev</category>
      <category>programming</category>
      <category>career</category>
    </item>
    <item>
      <title>I Stopped Chasing AI Frameworks and Started Building with Plain APIs</title>
      <dc:creator>Caelora</dc:creator>
      <pubDate>Sun, 26 Jul 2026 01:26:45 +0000</pubDate>
      <link>https://dev.to/caelora/i-stopped-chasing-ai-frameworks-and-started-building-with-plain-apis-56o5</link>
      <guid>https://dev.to/caelora/i-stopped-chasing-ai-frameworks-and-started-building-with-plain-apis-56o5</guid>
      <description>&lt;p&gt;When I first got into AI development, I thought I needed to learn every new framework that appeared on GitHub.&lt;/p&gt;

&lt;p&gt;LangChain.&lt;br&gt;
CrewAI.&lt;br&gt;
AutoGen.&lt;br&gt;
LangGraph.&lt;br&gt;
LlamaIndex.&lt;/p&gt;

&lt;p&gt;Every week, there seemed to be another library promising to make AI agents easier.&lt;/p&gt;

&lt;p&gt;I kept bookmarking repositories instead of actually building anything.&lt;/p&gt;

&lt;p&gt;Eventually, I decided to ignore all of them for a weekend.&lt;/p&gt;

&lt;p&gt;Instead, I opened the OpenAI API documentation and started from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  The surprising part
&lt;/h2&gt;

&lt;p&gt;The first chatbot I built was around 60 lines of code.&lt;/p&gt;

&lt;p&gt;Adding conversation history wasn't difficult.&lt;/p&gt;

&lt;p&gt;Calling a weather API wasn't difficult.&lt;/p&gt;

&lt;p&gt;Generating structured JSON wasn't difficult either.&lt;/p&gt;

&lt;p&gt;Suddenly I realized something:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Most AI frameworks aren't introducing new capabilities—they're packaging patterns that you can learn yourself.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That realization completely changed how I approached AI projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frameworks aren't the enemy
&lt;/h2&gt;

&lt;p&gt;Don't get me wrong.&lt;/p&gt;

&lt;p&gt;Frameworks are useful.&lt;/p&gt;

&lt;p&gt;They solve repetitive problems.&lt;/p&gt;

&lt;p&gt;They standardize workflows.&lt;/p&gt;

&lt;p&gt;They save time once your project grows.&lt;/p&gt;

&lt;p&gt;The problem is when beginners mistake the framework for the technology.&lt;/p&gt;

&lt;p&gt;It's like learning React before understanding JavaScript.&lt;/p&gt;

&lt;p&gt;Or learning Kubernetes before understanding Docker.&lt;/p&gt;

&lt;p&gt;You'll eventually hit a wall because you never learned the fundamentals.&lt;/p&gt;

&lt;h2&gt;
  
  
  What every beginner should build first
&lt;/h2&gt;

&lt;p&gt;Before touching any AI framework, I'd recommend building these yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A basic chatbot&lt;/li&gt;
&lt;li&gt;Conversation memory&lt;/li&gt;
&lt;li&gt;Function/tool calling&lt;/li&gt;
&lt;li&gt;Streaming responses&lt;/li&gt;
&lt;li&gt;JSON structured outputs&lt;/li&gt;
&lt;li&gt;A simple RAG app&lt;/li&gt;
&lt;li&gt;A tiny agent loop&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these require thousands of lines of code.&lt;/p&gt;

&lt;p&gt;Most can be built in an afternoon.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;When something breaks inside a framework, you'll know &lt;em&gt;why&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;When a model behaves strangely, you'll understand where the prompt lives.&lt;/p&gt;

&lt;p&gt;When tokens get expensive, you'll know exactly what's consuming them.&lt;/p&gt;

&lt;p&gt;And when a new framework becomes popular next month...&lt;/p&gt;

&lt;p&gt;...you'll learn it in hours instead of weeks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;The AI ecosystem moves incredibly fast.&lt;/p&gt;

&lt;p&gt;Frameworks will come and go.&lt;/p&gt;

&lt;p&gt;APIs will change.&lt;/p&gt;

&lt;p&gt;Model names will change.&lt;/p&gt;

&lt;p&gt;But understanding the fundamentals will always be valuable.&lt;/p&gt;

&lt;p&gt;Sometimes the fastest way to learn isn't by installing another dependency.&lt;/p&gt;

&lt;p&gt;It's by writing one more file from scratch.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>sharepointframework</category>
      <category>api</category>
    </item>
    <item>
      <title>Why Every Developer Should Learn Docker (Even for Small Projects)</title>
      <dc:creator>Caelora</dc:creator>
      <pubDate>Fri, 24 Jul 2026 07:17:26 +0000</pubDate>
      <link>https://dev.to/caelora/why-every-developer-should-learn-docker-even-for-small-projects-29jg</link>
      <guid>https://dev.to/caelora/why-every-developer-should-learn-docker-even-for-small-projects-29jg</guid>
      <description>&lt;h1&gt;
  
  
  Why Every Developer Should Learn Docker (Even for Small Projects)
&lt;/h1&gt;

&lt;p&gt;If you've ever heard someone say, &lt;em&gt;"It works on my machine,"&lt;/em&gt; you've already encountered one of the biggest problems in software development.&lt;/p&gt;

&lt;p&gt;Different operating systems, dependency versions, and local configurations can make the same project behave differently across computers.&lt;/p&gt;

&lt;p&gt;That's exactly the problem Docker was built to solve.&lt;/p&gt;

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

&lt;p&gt;Docker is a platform that packages your application together with everything it needs to run:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Programming language runtime&lt;/li&gt;
&lt;li&gt;Dependencies&lt;/li&gt;
&lt;li&gt;Libraries&lt;/li&gt;
&lt;li&gt;Environment variables&lt;/li&gt;
&lt;li&gt;System tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of telling someone how to set up your project, you simply share a Docker image or a Docker Compose file.&lt;/p&gt;

&lt;p&gt;If Docker runs, your application runs too.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I Started Using Docker
&lt;/h2&gt;

&lt;p&gt;When I first learned web development, setting up a new project was frustrating.&lt;/p&gt;

&lt;p&gt;Sometimes I needed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js 18&lt;/li&gt;
&lt;li&gt;PostgreSQL 15&lt;/li&gt;
&lt;li&gt;Redis&lt;/li&gt;
&lt;li&gt;MongoDB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Installing everything manually often caused version conflicts.&lt;/p&gt;

&lt;p&gt;After switching to Docker, setting up a project became much easier.&lt;/p&gt;

&lt;p&gt;Instead of spending 30 minutes configuring my environment, I could start everything with one command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Simple Example
&lt;/h2&gt;

&lt;p&gt;Imagine you're building a Node.js API.&lt;/p&gt;

&lt;p&gt;Without Docker, every team member has to install:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;npm&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;Environment variables&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With Docker, everyone uses the same environment.&lt;/p&gt;

&lt;p&gt;A basic Dockerfile looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:20&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["npm", "start"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now anyone can run the application without worrying about different Node.js versions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Docker Compose Makes It Better
&lt;/h2&gt;

&lt;p&gt;Real applications usually need more than one service.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Backend API&lt;/li&gt;
&lt;li&gt;Database&lt;/li&gt;
&lt;li&gt;Redis cache&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Docker Compose lets you start everything together.&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;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&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="s"&gt;.&lt;/span&gt;

  &lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:16&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of opening multiple terminals and starting services manually, one command launches the entire stack.&lt;/p&gt;




&lt;h2&gt;
  
  
  Benefits I've Noticed
&lt;/h2&gt;

&lt;p&gt;After using Docker regularly, I noticed several improvements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Faster onboarding
&lt;/h3&gt;

&lt;p&gt;New developers can run a project within minutes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fewer environment issues
&lt;/h3&gt;

&lt;p&gt;No more "works on my machine" conversations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cleaner computer
&lt;/h3&gt;

&lt;p&gt;I don't have dozens of database installations and conflicting versions anymore.&lt;/p&gt;

&lt;h3&gt;
  
  
  Easier deployment
&lt;/h3&gt;

&lt;p&gt;The same container used during development can often be deployed to production with minimal changes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Is Docker Difficult?
&lt;/h2&gt;

&lt;p&gt;At first, yes.&lt;/p&gt;

&lt;p&gt;The documentation introduces many concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Images&lt;/li&gt;
&lt;li&gt;Containers&lt;/li&gt;
&lt;li&gt;Volumes&lt;/li&gt;
&lt;li&gt;Networks&lt;/li&gt;
&lt;li&gt;Compose&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It can feel overwhelming.&lt;/p&gt;

&lt;p&gt;But once you understand the difference between an image and a container, everything starts to make sense.&lt;/p&gt;

&lt;p&gt;You don't need to master every Docker feature on day one.&lt;/p&gt;

&lt;p&gt;Learn the basics first.&lt;/p&gt;




&lt;h2&gt;
  
  
  Should Beginners Learn Docker?
&lt;/h2&gt;

&lt;p&gt;Absolutely—but not immediately.&lt;/p&gt;

&lt;p&gt;If you're just starting programming, focus on learning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Variables&lt;/li&gt;
&lt;li&gt;Functions&lt;/li&gt;
&lt;li&gt;Loops&lt;/li&gt;
&lt;li&gt;APIs&lt;/li&gt;
&lt;li&gt;Databases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you've built a few projects, Docker becomes much easier to appreciate because you'll understand the problems it solves.&lt;/p&gt;




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

&lt;p&gt;Docker isn't just for large companies or DevOps engineers.&lt;/p&gt;

&lt;p&gt;Even small personal projects benefit from having a consistent development environment.&lt;/p&gt;

&lt;p&gt;If you're tired of installation issues, dependency conflicts, or spending too much time configuring projects, Docker is worth learning.&lt;/p&gt;

&lt;p&gt;It may have a learning curve, but it's one of the best investments you can make as a developer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are you already using Docker in your projects, or are you planning to learn it? I'd love to hear your experience in the comments.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>docker</category>
    </item>
    <item>
      <title>5 Git Commands Every Developer Should Know</title>
      <dc:creator>Caelora</dc:creator>
      <pubDate>Fri, 24 Jul 2026 07:13:49 +0000</pubDate>
      <link>https://dev.to/caelora/5-git-commands-every-developer-should-know-2ifn</link>
      <guid>https://dev.to/caelora/5-git-commands-every-developer-should-know-2ifn</guid>
      <description>&lt;h1&gt;
  
  
  5 Git Commands Every Developer Should Know
&lt;/h1&gt;

&lt;p&gt;Git is one of the most important tools every developer uses, yet many people only know a few basic commands.&lt;/p&gt;

&lt;p&gt;Learning a handful of additional Git commands can save time, reduce mistakes, and make collaboration much easier.&lt;/p&gt;

&lt;p&gt;Here are five Git commands I use almost every day.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Check What Changed
&lt;/h2&gt;

&lt;p&gt;Before committing anything, always check your changes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modified files&lt;/li&gt;
&lt;li&gt;New files&lt;/li&gt;
&lt;li&gt;Deleted files&lt;/li&gt;
&lt;li&gt;Files ready to commit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Running &lt;code&gt;git status&lt;/code&gt; before every commit is a good habit.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. View Your Commit History
&lt;/h2&gt;

&lt;p&gt;Need to know what happened recently?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log &lt;span class="nt"&gt;--oneline&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of showing long commit details, this command displays a clean, compact history.&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 plaintext"&gt;&lt;code&gt;f82d4f1 Fix login bug
1ab8c72 Update README
8ce44f0 Add authentication
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's much easier to read than the default output.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Create a New Branch
&lt;/h2&gt;

&lt;p&gt;Never work directly on the main branch.&lt;/p&gt;

&lt;p&gt;Create a feature branch instead.&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 &lt;span class="nt"&gt;-b&lt;/span&gt; feature/login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or, with newer Git versions:&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/login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps your work isolated until it's ready to merge.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Undo Staged Changes
&lt;/h2&gt;

&lt;p&gt;Accidentally added the wrong file?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git restore &lt;span class="nt"&gt;--staged&lt;/span&gt; filename.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This removes the file from the staging area without deleting your changes.&lt;/p&gt;

&lt;p&gt;It's much safer than trying to fix mistakes later.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Pull Before You Push
&lt;/h2&gt;

&lt;p&gt;Before pushing your code, make sure your local branch is up to date.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git pull origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This helps avoid unnecessary merge conflicts and ensures you're working with the latest code.&lt;/p&gt;




&lt;h1&gt;
  
  
  Bonus Tip
&lt;/h1&gt;

&lt;p&gt;If you forget a command, Git has built-in help.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git &lt;span class="nb"&gt;help&lt;/span&gt; &amp;lt;&lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git &lt;span class="nb"&gt;help &lt;/span&gt;commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The documentation is surprisingly helpful.&lt;/p&gt;




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

&lt;p&gt;You don't need to memorize every Git command.&lt;/p&gt;

&lt;p&gt;Mastering a small set of frequently used commands will make your daily workflow smoother and reduce common mistakes.&lt;/p&gt;

&lt;p&gt;The five commands I recommend every beginner learns are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git status&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git log --oneline&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git switch -c&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git restore --staged&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git pull&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you're comfortable with these, learning more advanced Git features becomes much easier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which Git command do you use the most? Let me know in the comments!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Stop Using console.log Everywhere: Better Ways to Debug JavaScript</title>
      <dc:creator>Caelora</dc:creator>
      <pubDate>Fri, 24 Jul 2026 07:03:37 +0000</pubDate>
      <link>https://dev.to/caelora/stop-using-consolelog-everywhere-better-ways-to-debug-javascript-4kf4</link>
      <guid>https://dev.to/caelora/stop-using-consolelog-everywhere-better-ways-to-debug-javascript-4kf4</guid>
      <description>&lt;h1&gt;
  
  
  Stop Using &lt;code&gt;console.log()&lt;/code&gt; Everywhere: Better Ways to Debug JavaScript
&lt;/h1&gt;

&lt;p&gt;If you're learning JavaScript, you've probably written something like this hundreds of times:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There's absolutely nothing wrong with using &lt;code&gt;console.log()&lt;/code&gt;. Every developer starts there, and even experienced developers still use it.&lt;/p&gt;

&lt;p&gt;However, as your application grows, relying only on &lt;code&gt;console.log()&lt;/code&gt; can make debugging slower and your code harder to maintain.&lt;/p&gt;

&lt;p&gt;Here are several debugging techniques that can save you time and make your development workflow much more efficient.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Use the Browser Debugger
&lt;/h2&gt;

&lt;p&gt;Instead of printing every variable, use the built-in JavaScript debugger.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculateTotal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;debugger&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&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;When execution reaches the &lt;code&gt;debugger&lt;/code&gt; statement, the browser pauses your application. You can inspect variables, check the call stack, and execute code step by step.&lt;/p&gt;

&lt;p&gt;This is much more powerful than printing dozens of log statements.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Display Objects with &lt;code&gt;console.table()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Large arrays of objects quickly become difficult to read.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output becomes a clean table that's much easier to understand.&lt;/p&gt;

&lt;p&gt;This works especially well for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API responses&lt;/li&gt;
&lt;li&gt;Product lists&lt;/li&gt;
&lt;li&gt;User records&lt;/li&gt;
&lt;li&gt;Database results&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Organize Logs with &lt;code&gt;console.group()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;If your application produces many log messages, grouping them makes the console much cleaner.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Login Process&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Checking credentials...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Loading user...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Authentication successful&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groupEnd&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now related messages stay together, making debugging much easier.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Measure Performance
&lt;/h2&gt;

&lt;p&gt;Need to know how long a function takes?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fetchUsers&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchUsers&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timeEnd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fetchUsers&lt;/span&gt;&lt;span class="dl"&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 instantly tells you how long an operation required without installing additional tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Take Advantage of Breakpoints
&lt;/h2&gt;

&lt;p&gt;Modern browsers include excellent debugging tools.&lt;/p&gt;

&lt;p&gt;Simply click beside a line number in Chrome or Firefox DevTools to create a breakpoint.&lt;/p&gt;

&lt;p&gt;When execution stops, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inspect variables&lt;/li&gt;
&lt;li&gt;View the call stack&lt;/li&gt;
&lt;li&gt;Execute code manually&lt;/li&gt;
&lt;li&gt;Step through your application line by line&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For complex bugs, breakpoints are often much faster than adding dozens of log statements.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Read Error Messages Carefully
&lt;/h2&gt;

&lt;p&gt;Many developers immediately search Google after seeing an error.&lt;/p&gt;

&lt;p&gt;Instead, spend a few seconds reading it.&lt;/p&gt;

&lt;p&gt;Most JavaScript errors already tell you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which file caused the problem&lt;/li&gt;
&lt;li&gt;The line number&lt;/li&gt;
&lt;li&gt;The type of error&lt;/li&gt;
&lt;li&gt;The function where it happened&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Understanding error messages is a skill that will dramatically improve your debugging speed.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Clean Up Before Deploying
&lt;/h2&gt;

&lt;p&gt;We've all forgotten to remove debugging code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;HERE&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;TEST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;WHY IS THIS UNDEFINED?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before pushing your code to production:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remove unnecessary &lt;code&gt;console.log()&lt;/code&gt; calls.&lt;/li&gt;
&lt;li&gt;Delete forgotten &lt;code&gt;debugger&lt;/code&gt; statements.&lt;/li&gt;
&lt;li&gt;Keep only meaningful error logging where appropriate.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A clean codebase is much easier to maintain.&lt;/p&gt;




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

&lt;p&gt;&lt;code&gt;console.log()&lt;/code&gt; isn't bad—it remains one of the simplest and fastest debugging tools available.&lt;/p&gt;

&lt;p&gt;But combining it with browser DevTools, breakpoints, &lt;code&gt;console.table()&lt;/code&gt;, and performance timers can significantly improve your workflow.&lt;/p&gt;

&lt;p&gt;As your projects become larger and more complex, learning these debugging techniques will save you hours of frustration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What debugging technique do you use most often? Share your favorite tips in the comments!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>debugging</category>
      <category>programming</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>7 VS Code Extensions I Install on Every New Computer</title>
      <dc:creator>Caelora</dc:creator>
      <pubDate>Fri, 24 Jul 2026 06:57:51 +0000</pubDate>
      <link>https://dev.to/caelora/7-vs-code-extensions-i-install-on-every-new-computer-2oe0</link>
      <guid>https://dev.to/caelora/7-vs-code-extensions-i-install-on-every-new-computer-2oe0</guid>
      <description>&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnh9v38hk61g8begg4ou0.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnh9v38hk61g8begg4ou0.jpg" alt=" " width="640" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  7 VS Code Extensions I Install on Every New Computer
&lt;/h1&gt;

&lt;p&gt;Every time I reinstall Windows or buy a new laptop, the first application I install is Visual Studio Code. But VS Code alone isn't enough. The real productivity boost comes from its extensions.&lt;/p&gt;

&lt;p&gt;After years of web development, I've narrowed my list down to seven extensions that I install immediately. These extensions save time, improve code quality, and make development much more enjoyable.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Prettier
&lt;/h2&gt;

&lt;p&gt;Nobody likes arguing about code formatting.&lt;/p&gt;

&lt;p&gt;Prettier automatically formats your code every time you save, keeping your project clean and consistent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why I use it&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consistent formatting&lt;/li&gt;
&lt;li&gt;Works with almost every language&lt;/li&gt;
&lt;li&gt;Saves time during code reviews
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"editor.formatOnSave"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. ESLint
&lt;/h2&gt;

&lt;p&gt;ESLint catches mistakes before they become bugs.&lt;/p&gt;

&lt;p&gt;Instead of discovering issues after deployment, you'll see warnings directly in your editor.&lt;/p&gt;

&lt;p&gt;It also helps enforce coding standards across your team.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. GitLens
&lt;/h2&gt;

&lt;p&gt;GitLens makes Git much easier to understand.&lt;/p&gt;

&lt;p&gt;With one hover, you can instantly see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who changed a line&lt;/li&gt;
&lt;li&gt;When it was changed&lt;/li&gt;
&lt;li&gt;Why it was changed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is incredibly useful when working on large projects.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Error Lens
&lt;/h2&gt;

&lt;p&gt;Normally, VS Code shows errors at the bottom of the screen.&lt;/p&gt;

&lt;p&gt;Error Lens displays them directly beside your code, making debugging much faster.&lt;/p&gt;

&lt;p&gt;Small extension, huge productivity boost.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Auto Rename Tag
&lt;/h2&gt;

&lt;p&gt;If you're working with HTML, React, or Vue, this extension is a lifesaver.&lt;/p&gt;

&lt;p&gt;Rename an opening tag...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;...and the closing tag updates automatically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No more broken markup.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Path Intellisense
&lt;/h2&gt;

&lt;p&gt;Import paths can become annoying in large projects.&lt;/p&gt;

&lt;p&gt;Instead of typing long file paths manually, this extension autocompletes them for you.&lt;/p&gt;

&lt;p&gt;It's simple but saves countless keystrokes every day.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Thunder Client
&lt;/h2&gt;

&lt;p&gt;Sometimes you don't want to open Postman just to test one API endpoint.&lt;/p&gt;

&lt;p&gt;Thunder Client lives inside VS Code and lets you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send HTTP requests&lt;/li&gt;
&lt;li&gt;Test REST APIs&lt;/li&gt;
&lt;li&gt;Organize collections&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Perfect for backend developers.&lt;/p&gt;




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

&lt;p&gt;VS Code is already a fantastic editor, but the right extensions can dramatically improve your workflow.&lt;/p&gt;

&lt;p&gt;If I had to choose only three, they would be:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Prettier&lt;/li&gt;
&lt;li&gt;ESLint&lt;/li&gt;
&lt;li&gt;GitLens&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Those three alone eliminate many common development headaches.&lt;/p&gt;

&lt;p&gt;What VS Code extension can't you live without? Let me know in the comments!&lt;/p&gt;

</description>
      <category>debugging</category>
      <category>programming</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
