<?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: Precious Afolabi</title>
    <description>The latest articles on DEV Community by Precious Afolabi (@precix_phantom).</description>
    <link>https://dev.to/precix_phantom</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%2F3675282%2Fccf901f4-2732-472c-9468-7de0735da28a.png</url>
      <title>DEV Community: Precious Afolabi</title>
      <link>https://dev.to/precix_phantom</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/precix_phantom"/>
    <language>en</language>
    <item>
      <title>Week 13: Learning PostgreSQL and SQL Fundamentals</title>
      <dc:creator>Precious Afolabi</dc:creator>
      <pubDate>Mon, 30 Mar 2026 18:45:58 +0000</pubDate>
      <link>https://dev.to/precix_phantom/week-13-learning-postgresql-and-sql-fundamentals-2l0b</link>
      <guid>https://dev.to/precix_phantom/week-13-learning-postgresql-and-sql-fundamentals-2l0b</guid>
      <description>&lt;p&gt;&lt;strong&gt;PostgreSQL Fundamentals&lt;/strong&gt;&lt;br&gt;
Week 13 covered PostgreSQL from setup to aggregate functions. Lots of SQL practice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Getting Started&lt;/strong&gt;&lt;br&gt;
Installed PostgreSQL and learned the basics. Creating databases, connecting with psql, and understanding basic commands. The interface uses backslash commands for meta operations and SQL for data operations.&lt;br&gt;
Small thing that surprised me: semicolons matter. They end commands. Forget one, and your query hangs, waiting for you to finish. Similar to forgetting the return in JavaScript, where the function keeps running.&lt;br&gt;
SQL Queries&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SELECT and Filtering&lt;/strong&gt;&lt;br&gt;
Retrieving data with SELECT. All columns or specific ones. Filtering with WHERE using various conditions.&lt;br&gt;
Pattern matching with LIKE. Finding values with IN. Range checking with BETWEEN. Handling nulls with IS NULL.&lt;br&gt;
Sorting results with ORDER BY. Ascending or descending. Multiple columns. Limiting results with LIMIT for pagination.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Manipulation&lt;/strong&gt;&lt;br&gt;
INSERT adds new records. Single rows or multiple at once. The RETURNING clause shows what was inserted without a separate query.&lt;br&gt;
UPDATE modifies existing records. Single column or multiple. Conditional updates with WHERE. RETURNING shows what changed.&lt;br&gt;
DELETE removes records. Always test with SELECT first. Use transactions for safety. TRUNCATE for clearing entire tables.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aggregate Functions and GROUP BY&lt;/strong&gt;&lt;br&gt;
This was the challenging part. Aggregates calculate values across rows. COUNT for counting, SUM for totals, AVG for averages, MIN and MAX for extremes.&lt;br&gt;
GROUP BY organizes data into groups before aggregating. Instead of one result, you get one result per group.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WHERE vs HAVING&lt;/strong&gt;&lt;br&gt;
The key difference was that it took practice to understand.&lt;br&gt;
WHERE filters individual rows before grouping. It runs first, deciding which rows to include in the aggregation.&lt;br&gt;
HAVING filter groups after aggregation. It runs after GROUP BY, deciding which grouped results to show.&lt;/p&gt;

&lt;p&gt;Example: finding cities with more than 2 users where those users are over 25.&lt;br&gt;
WHERE age &amp;gt; 25 filters the rows first. Then GROUP BY city groups them. Then HAVING COUNT(*) &amp;gt; 2 filters the groups. WHERE operates on rows, HAVING operates on groups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practice Exercises&lt;/strong&gt;&lt;br&gt;
Worked through many queries. Sales data analysis, grouping by categories and regions, calculating totals and averages, and finding top performers.&lt;br&gt;
Counting distinct values, calculating percentages, combining multiple aggregates, and ordering grouped results. The repetition made the patterns clear.&lt;br&gt;
GROUP BY with multiple columns, HAVING with multiple conditions, and combining WHERE and HAVING in one query. Each exercise reinforced when to use which clause.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Lessons&lt;/strong&gt;&lt;br&gt;
Semicolons end commands. Forget them, and queries hang.&lt;br&gt;
WHERE filters before grouping, HAVING filters after. Different purposes, different timing.&lt;br&gt;
Aggregate functions need GROUP BY when you want per-group results instead of one overall result.&lt;br&gt;
Always test DELETE with SELECT first. Transactions provide safety.&lt;br&gt;
Practice is how SQL concepts stick. Reading about GROUP BY is different from writing 20 queries using it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Moving Forward&lt;/strong&gt;&lt;br&gt;
Continuing with SQL. Database design and relationships next. Connecting PostgreSQL to Node.js using the pg library. Starting MongoDB to understand NoSQL alongside relational databases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Question&lt;/strong&gt;: What SQL concept took you longest to understand?&lt;/p&gt;

</description>
      <category>postgressql</category>
      <category>sql</category>
      <category>database</category>
      <category>backend</category>
    </item>
    <item>
      <title>Week 12: Express.js and Refactoring Error Handling</title>
      <dc:creator>Precious Afolabi</dc:creator>
      <pubDate>Mon, 23 Mar 2026 12:12:45 +0000</pubDate>
      <link>https://dev.to/precix_phantom/week-12-expressjs-and-refactoring-error-handling-2jc5</link>
      <guid>https://dev.to/precix_phantom/week-12-expressjs-and-refactoring-error-handling-2jc5</guid>
      <description>&lt;p&gt;&lt;strong&gt;Express.js and Better Error Handling&lt;/strong&gt;&lt;br&gt;
Week 12 covered Express.js fundamentals and refactoring my blog platform with proper error handling patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Express.js Fundamentals&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Middleware&lt;/strong&gt;&lt;br&gt;
Middleware is how Express processes requests. Functions that run before your route handlers. Each middleware can modify the request, send a response, or pass control to the next middleware.&lt;/p&gt;

&lt;p&gt;Built-in middleware parses JSON bodies and URL-encoded data. Custom middleware handles logging, authentication, and timing. The order matters. Middleware runs in the order you define it.&lt;/p&gt;

&lt;p&gt;Understanding middleware flow changed how I structure applications. Instead of handling everything in route handlers, break concerns into separate middleware functions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Routing and Controllers&lt;/strong&gt;&lt;br&gt;
Express routing maps URLs to handlers. Instead of one massive file, separate routes into logical groups. User routes, post routes, comment routes.&lt;br&gt;
Controllers handle the business logic. Route files define endpoints, and controllers implement what happens when those endpoints are hit—clean separation of concerns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Validation&lt;/strong&gt;&lt;br&gt;
Input validation with express-validator. Define validation rules, check for errors, and return appropriate responses. Users send all kinds of invalid data. Validation catches it before it reaches your database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Centralized Error Handling&lt;/strong&gt;&lt;br&gt;
This was the game changer. Instead of repeating try/catch blocks in every async function, use two utilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AppError Class&lt;/strong&gt;&lt;br&gt;
Custom error class that includes status code and message. Throw this instead of generic errors.&lt;br&gt;
When something goes wrong, throw an AppError with the appropriate status code. The centralized error handler catches it and sends the right response.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;catchAsync Wrapper&lt;/strong&gt;&lt;br&gt;
Wraps async route handlers. Automatically catches errors and forwards them to the error-handling middleware. No more try/catch in every function.&lt;br&gt;
Before catchAsync, every async controller had repetitive error handling. After catchAsync, the code is clean, and errors are handled consistently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Global Error Handler&lt;/strong&gt;&lt;br&gt;
One middleware at the end catches all errors. Whether you threw an AppError or something unexpected happened, it handles the response.&lt;br&gt;
Errors get logged, appropriate status codes get sent, and users get meaningful error messages instead of crashes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Refactoring My Blog Platform&lt;/strong&gt;&lt;br&gt;
Applied these patterns to my existing blog platform project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Changed&lt;/strong&gt;&lt;br&gt;
Added AppError and catchAsync throughout all controllers. Removed repetitive try/catch blocks. Errors now flow to one central handler instead of being handled inconsistently everywhere.&lt;/p&gt;

&lt;p&gt;Implemented a comments API. Users can create comments on blog posts and delete their own comments. Full CRUD operations with proper error handling, validation, and authentication middleware.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Challenge&lt;/strong&gt;&lt;br&gt;
Understanding how error handling actually works was tricky. How errors propagate in async functions, when to throw versus when to pass to next, how the global error handler receives them.&lt;br&gt;
The pattern clicked after refactoring existing code. Seeing all the repetition disappear made the value clear.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Result&lt;/strong&gt;&lt;br&gt;
Cleaner controllers. Consistent error responses. One place to modify error handling instead of updating dozens of try/catch blocks. Adding new features is faster because the error handling is already solved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Lessons&lt;/strong&gt;&lt;br&gt;
Middleware order matters. Authentication before validation before handlers.&lt;br&gt;
Centralized error handling removes boilerplate and ensures consistency.&lt;br&gt;
AppError and catchAsync are simple patterns that make code significantly cleaner.&lt;br&gt;
Validation prevents bad data from reaching your database.&lt;br&gt;
Error handling isn't optional. Things break in production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Moving Forward&lt;/strong&gt;&lt;br&gt;
Starting databases. Learning MongoDB and PostgreSQL fundamentals. Understanding both NoSQL and relational databases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project Links&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/Precixphantom/blog-platform" rel="noopener noreferrer"&gt;https://github.com/Precixphantom/blog-platform&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Live Demo&lt;/strong&gt;: &lt;a href="https://blog-platform-6wv2.onrender.com" rel="noopener noreferrer"&gt;https://blog-platform-6wv2.onrender.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Question: How do you handle errors in your backend applications?&lt;/p&gt;

</description>
      <category>express</category>
      <category>node</category>
      <category>backend</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Week 11: Node.js Fundamentals and Understanding Core Modules</title>
      <dc:creator>Precious Afolabi</dc:creator>
      <pubDate>Mon, 16 Mar 2026 10:34:40 +0000</pubDate>
      <link>https://dev.to/precix_phantom/week-11-nodejs-fundamentals-and-understanding-core-modules-4nio</link>
      <guid>https://dev.to/precix_phantom/week-11-nodejs-fundamentals-and-understanding-core-modules-4nio</guid>
      <description>&lt;p&gt;Node.js Fundamentals&lt;br&gt;
Week 11 covered Node.js core modules and finished the weather CLI from last week.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core Modules&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File System Module&lt;/strong&gt;&lt;br&gt;
The fs module handles all file operations. Reading files, writing data, checking existence, creating directories, and getting file stats.&lt;br&gt;
Using fs/promises makes everything work with async/await. Clean async code without callbacks.&lt;/p&gt;

&lt;p&gt;Error handling is critical. File operations fail often. Files don't exist, permissions are incorrect, and the disk is full. Every operation needs try/catch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Path Module&lt;/strong&gt;&lt;br&gt;
The path module handles file paths correctly across operating systems. Windows uses backslashes, Unix uses forward slashes. Path handles this automatically.&lt;br&gt;
Join builds paths correctly. Resolve gets absolute paths. Dirname, basename, and extname extract path components.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Events Module&lt;/strong&gt;&lt;br&gt;
EventEmitter is how Node.js handles events internally. You create events, listen for them, and emit them when things happen.&lt;br&gt;
This pattern appears everywhere in Node.js. Streams use events, servers use events, and core modules are built on EventEmitter.&lt;br&gt;
Understanding events changed how I see Node.js architecture. It's event-driven at the core.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CommonJS vs ES6 Modules&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The difference between module systems was interesting, especially **with __filename and __dirname.&lt;br&gt;
In CommonJS, __filename and __dirname are available as globals. They give you the current file path and directory.&lt;br&gt;
In ES6 modules, these don't exist. You need to use import.meta.url and path functions to get the same information. Different approach for the same result.&lt;br&gt;
This matters when migrating old Node.js code to ES6 modules. Code that uses __dirname directly will break.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Weather CLI Project&lt;/strong&gt;&lt;br&gt;
Finished the weather CLI from Week 10.&lt;br&gt;
The tool fetches weather data from OpenWeather API and displays it in the terminal. Pass a city name, get the current weather.&lt;br&gt;
Features: fetch by city, handle invalid cities with errors, display temperature, show conditions and humidity, and format output readably.&lt;br&gt;
Used fetch for API requests, process.argv for command line arguments, and fs for configuration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTP Basics&lt;/strong&gt;&lt;br&gt;
Started learning HTTP fundamentals and building servers with the http module.&lt;br&gt;
Understanding request and response. Clients send requests with method, URL, and headers. Servers send responses with a status code, headers, and body.&lt;br&gt;
Status codes matter. 200 for success, 404 for not found, 500 for errors, 201 for created.&lt;br&gt;
Handling different HTTP methods. GET for retrieving, POST for creating, PUT for updating, and DELETE for removing.&lt;br&gt;
Built a basic server handling different routes and methods. Routing based on URL and method. Parsing request bodies. Setting correct status codes and content types.&lt;br&gt;
Understanding HTTP before frameworks makes everything clearer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Lessons&lt;/strong&gt;&lt;br&gt;
File operations need error handling. Things fail in production.&lt;br&gt;
The Path module prevents cross-platform bugs. Never build paths manually.&lt;br&gt;
Events are fundamental to Node.js. EventEmitter is everywhere.&lt;br&gt;
ES6 modules handle __filename and _ _ dirname differently from CommonJS.&lt;br&gt;
HTTP is simpler than it seems. Request in, response out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Moving Forward&lt;/strong&gt;&lt;br&gt;
Starting Express.js and building APIs. Moving from the raw HTTP module to proper frameworks.&lt;/p&gt;

&lt;p&gt;Question: What Node.js concept was hardest for you to understand?Share**&lt;/p&gt;

</description>
      <category>node</category>
      <category>javascript</category>
      <category>backend</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Week 10: Working with APIs and Starting to Build</title>
      <dc:creator>Precious Afolabi</dc:creator>
      <pubDate>Mon, 09 Mar 2026 19:33:14 +0000</pubDate>
      <link>https://dev.to/precix_phantom/week-10-working-with-apis-and-starting-to-build-4493</link>
      <guid>https://dev.to/precix_phantom/week-10-working-with-apis-and-starting-to-build-4493</guid>
      <description>&lt;p&gt;&lt;strong&gt;Working with APIs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Week 10 was about working with APIs using the Fetch API. Also started building a weather CLI project, though exam week meant I didn't finish it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learning Fetch API&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Learned how to make different types of API requests. GET requests to fetch data, POST requests to send data, handling JSON responses, and structuring API calls properly.&lt;br&gt;
Practiced with public APIs like JSONPlaceholder to understand how real API interactions work. Fetching users, posts, creating new posts, updating existing ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Error Handling with Fetch&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Understanding how fetch handles errors changed how I approach async operations.&lt;/p&gt;

&lt;p&gt;Fetch doesn't throw errors for failed HTTP requests. A 404 or 500 status is still a resolved promise. The fetch succeeded in making the request and getting a response, even if that response says "not found" or "server error".&lt;/p&gt;

&lt;p&gt;You have to check response.ok or response.status manually. Response.ok is true for status codes 200-299. Anything else means something went wrong.&lt;br&gt;
But that's just HTTP errors. &lt;/p&gt;

&lt;p&gt;There's also network failures when the request can't be made at all. Invalid JSON when the response isn't valid JSON. Missing data when the response structure isn't what you expect.&lt;/p&gt;

&lt;p&gt;Each type of error needs different handling. Network failures get caught by try/catch. HTTP errors need manual checking. Invalid JSON throws when you call response.json(). Missing data needs validation after parsing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building a Weather CLI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Started building a weather CLI that fetches current weather data from OpenWeather API.&lt;br&gt;
Got the basic structure working and started implementing the main functions. Making the API request with city parameters, checking if the response is valid, parsing the weather data, displaying temperature and conditions.&lt;br&gt;
Exam week meant I couldn't finish everything planned, but the core functionality is there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What This Week Taught Me&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There's a difference between learning concepts and applying them. Understanding async/await from last week was one thing. Using it to fetch real data from APIs, handle errors properly, and build something functional is different.&lt;/p&gt;

&lt;p&gt;APIs are how backend systems communicate. Everything connects through HTTP requests and JSON responses. This is what backend development actually is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Moving Forward&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Going into Node.js fundamentals. Learning how to build actual backend servers, handle routes, work with the file system, and create real applications.&lt;/p&gt;

&lt;p&gt;Question: What tripped you up when you first worked with APIs?&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>api</category>
      <category>node</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Week 9: Understanding Asynchronous JavaScript</title>
      <dc:creator>Precious Afolabi</dc:creator>
      <pubDate>Mon, 02 Mar 2026 16:15:12 +0000</pubDate>
      <link>https://dev.to/precix_phantom/week-9-understanding-asynchronous-javascript-5bmg</link>
      <guid>https://dev.to/precix_phantom/week-9-understanding-asynchronous-javascript-5bmg</guid>
      <description>&lt;p&gt;Asynchronous JavaScript&lt;/p&gt;

&lt;p&gt;Week 9 was about understanding how JavaScript handles asynchronous operations. Callbacks, promises, async/await, and the event loop.&lt;/p&gt;

&lt;p&gt;Callbacks and the Event Loop&lt;br&gt;
The breakthrough. Understanding how JavaScript's call stack works with the event loop. JavaScript is single-threaded, but the event loop makes it feel concurrent.&lt;/p&gt;

&lt;p&gt;Learned why setTimeout doesn't guarantee exact timing, how asynchronous operations don't block execution, and how the call stack, web APIs, and callback queue work together.&lt;br&gt;
Callback hell showed why we need better solutions. Nested callbacks three levels deep become unreadable pyramids of doom.&lt;/p&gt;

&lt;p&gt;Promises&lt;br&gt;
Promises flatten callback hell into readable chains. Creating promises with resolve and reject, chaining with then and catch, handling errors properly.&lt;br&gt;
Promise.all runs multiple operations in parallel and waits for all to complete. Promise.race returns whichever finishes first.&lt;/p&gt;

&lt;p&gt;Async/Await&lt;br&gt;
Async/await changed everything. Same asynchronous code, written like synchronous code. No more then chains. Just await the result.&lt;br&gt;
Error handling uses try/catch. Cleaner syntax, easier to reason about.&lt;/p&gt;

&lt;p&gt;Sequential vs Parallel&lt;br&gt;
Sequential awaits happen one after another. Three operations take three seconds total.&lt;br&gt;
Promise.all runs them in parallel. Three operations take one second total if they can run simultaneously.&lt;br&gt;
Error handling was tricky. Understanding when to use try/catch, when errors propagate, and how to handle failures properly.&lt;/p&gt;

&lt;p&gt;Key Lesson&lt;br&gt;
Understanding the event loop is critical for backend. It explains how JavaScript handles concurrency despite being single-threaded.&lt;/p&gt;

&lt;p&gt;Moving Forward&lt;br&gt;
Building projects with APIs, applying async JavaScript in real scenarios, and starting Node.js fundamentals.&lt;/p&gt;

&lt;p&gt;Question: What took you longest to understand when learning JavaScript?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>async</category>
      <category>backend</category>
    </item>
    <item>
      <title>Weeks 6-8: Advanced Arrays, Problem-Solving Patterns, and Building a Data CLI</title>
      <dc:creator>Precious Afolabi</dc:creator>
      <pubDate>Mon, 02 Mar 2026 15:44:57 +0000</pubDate>
      <link>https://dev.to/precix_phantom/weeks-6-8-advanced-arrays-problem-solving-patterns-and-building-a-data-cli-4ll</link>
      <guid>https://dev.to/precix_phantom/weeks-6-8-advanced-arrays-problem-solving-patterns-and-building-a-data-cli-4ll</guid>
      <description>&lt;p&gt;Three Weeks of Backend Fundamentals: Arrays, Patterns, and Building a Real Tool&lt;/p&gt;

&lt;p&gt;Weeks 6 through 8 were a turning point. Not because the content was the hardest so far, but because it was the first time everything started connecting. Arrays, performance, patterns, Node.js. Here's what those three weeks looked like.&lt;/p&gt;

&lt;p&gt;Week 6: Advanced Array Methods + Big O&lt;br&gt;
This week was about using array methods on realistic data, not just [1, 2, 3] examples.&lt;br&gt;
Working with product data meant chaining methods together to answer real questions — total value of in-stock items, most expensive item per category, filtering by rating and price simultaneously.&lt;br&gt;
The one that clicked hardest was reduce for grouping:&lt;/p&gt;

&lt;p&gt;const grouped = products.reduce((acc, p) =&amp;gt; {&lt;br&gt;
  if (!acc[p.category]) acc[p.category] = [];&lt;br&gt;
  acc[p.category].push(p);&lt;br&gt;
  return acc;&lt;br&gt;
}, {});&lt;/p&gt;

&lt;p&gt;Once you understand this pattern, you see it everywhere.&lt;br&gt;
Big O in Plain Terms&lt;br&gt;
The Big O section was kept practical, not academic. The number that stuck:&lt;/p&gt;

&lt;p&gt;Processing 1,000 items with O(n) = 1,000 operations. With O(n²) = 1,000,000 operations.&lt;/p&gt;

&lt;p&gt;That's not a footnote — that's the difference between a backend that handles load and one that falls over. Nested loops feel harmless on small data. At scale, they're a problem waiting to happen.&lt;/p&gt;

&lt;p&gt;Week 7: Problem-Solving Patterns&lt;br&gt;
This was the most valuable week. Two patterns that genuinely show up everywhere:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Frequency Counter
Instead of comparing every item against every other item (O(n²)), you count occurrences in an object first, then check against it. Two separate loops instead of nested ones.
javascriptfunction isAnagram(str1, str2) {
if (str1.length !== str2.length) return false;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;const freq = {};&lt;br&gt;
  for (let char of str1) freq[char] = (freq[char] || 0) + 1;&lt;br&gt;
  for (let char of str2) {&lt;br&gt;
    if (!freq[char]) return false;&lt;br&gt;
    freq[char]--;&lt;br&gt;
  }&lt;br&gt;
  return true;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;O(n) time. You trade a little space to avoid expensive nested loops. Worth it almost every time.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Two Pointers
Works on sorted data. One pointer at the start, one at the end, moving inward based on what you find:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;function pairSum(arr, target) {&lt;br&gt;
  let left = 0;&lt;br&gt;
  let right = arr.length - 1;&lt;/p&gt;

&lt;p&gt;while (left &amp;lt; right) {&lt;br&gt;
    const sum = arr[left] + arr[right];&lt;br&gt;
    if (sum === target) return [left, right];&lt;br&gt;
    if (sum &amp;lt; target) left++;&lt;br&gt;
    else right--;&lt;br&gt;
  }&lt;br&gt;
  return null;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;O(n) time, O(1) space. No extra memory. You're using the structure of the sorted array itself to guide the search — which feels almost like a cheat code once it clicks.&lt;br&gt;
What both patterns have in common: there's almost always a smarter approach than brute force. Big O gives you the lens to recognize when you've found it.&lt;/p&gt;

&lt;p&gt;Week 8: Building a Data Processing CLI&lt;br&gt;
Week 8 was about applying everything — not more exercises, but an actual working tool.&lt;br&gt;
The project: a command-line sales data analyzer that processes JSON files.&lt;br&gt;
bashnode analyzer.js data.json --sum price&lt;br&gt;
node analyzer.js data.json --filter "region=Lagos"&lt;br&gt;
node analyzer.js data.json --group region&lt;br&gt;
node analyzer.js data.json --stats price&lt;/p&gt;

&lt;p&gt;Each command maps to a function. groupBy uses the reduce pattern from Week 6. filterData splits the condition string and applies it. getStats maps, reduces, and spreads all in one go:&lt;/p&gt;

&lt;p&gt;async function getStats(data, field) {&lt;br&gt;
  const values = data.map(item =&amp;gt; item[field]);&lt;br&gt;
  return {&lt;br&gt;
    min: Math.min(...values),&lt;br&gt;
    max: Math.max(...values),&lt;br&gt;
    avg: values.reduce((sum, val) =&amp;gt; sum + val, 0) / values.length,&lt;br&gt;
    total: values.reduce((sum, val) =&amp;gt; sum + val, 0)&lt;br&gt;
  };&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;The whole thing comes together in a main() function that reads process.argv, loads the file with fs/promises, and routes to the right handler.&lt;br&gt;
Why It Matters Beyond the Exercise&lt;br&gt;
The CLI is simple. But the patterns inside it are exactly what runs in:&lt;/p&gt;

&lt;p&gt;REST APIs processing incoming request data&lt;br&gt;
Database query results being transformed before returning&lt;br&gt;
Batch jobs running against thousands of records&lt;br&gt;
Data pipelines aggregating in real time&lt;/p&gt;

&lt;p&gt;Load data → filter → transform → aggregate → return. That loop is backend work. The interface changes, the logic doesn't.&lt;/p&gt;

&lt;p&gt;The Shift That Happened&lt;br&gt;
Before these weeks, arrays, Big O, and patterns felt like three separate topics in a curriculum.&lt;br&gt;
After building the CLI, they feel like one thing.&lt;br&gt;
Array methods implement the patterns. Big O tells you which pattern to reach for. The patterns combine to solve real problems. Reading about reduce is fine. Using it to group sales by region and generate stats is when you actually understand it.&lt;/p&gt;

&lt;p&gt;What's Next&lt;br&gt;
Asynchronous JavaScript — promises, async/await, and finally connecting to external APIs. The backend foundation is there. Time to make it talk to the outside world.&lt;/p&gt;

&lt;p&gt;What's the hardest part of learning for you — grasping new concepts, or applying them to build something? Drop it in the comments.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>problemsolving</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Weeks 4 &amp; 5: Recursion and Arrays in JavaScript</title>
      <dc:creator>Precious Afolabi</dc:creator>
      <pubDate>Mon, 02 Feb 2026 12:59:39 +0000</pubDate>
      <link>https://dev.to/precix_phantom/weeks-4-5-recursion-and-arrays-in-javascript-10ic</link>
      <guid>https://dev.to/precix_phantom/weeks-4-5-recursion-and-arrays-in-javascript-10ic</guid>
      <description>&lt;p&gt;Two Weeks of Core JavaScript Concepts&lt;/p&gt;

&lt;p&gt;Weeks 4 and 5 covered two fundamental topics: recursion and arrays. Here's what I learned and built.&lt;/p&gt;

&lt;p&gt;Week 4: Recursion and Completing the Calculator&lt;br&gt;
Started Week 4 by finishing my CLI calculator from Week 3. University tests pushed it back, so I adjusted my timeline. The calculator includes basic operations, advanced operations like power and square root, memory functions, calculation history, and chain operations using a prev keyword.&lt;br&gt;
javascriptCalculator Ready&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;add 5 3&lt;br&gt;
Result: 8&lt;br&gt;
multiply prev 2&lt;br&gt;
Result: 16&lt;br&gt;
store&lt;br&gt;
Stored: 16&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then moved into recursion. Reading about it was confusing, and watching videos was still abstract. Building simple examples made it click. Understanding how each function call builds on the previous one, then returns values back up.&lt;br&gt;
Recursion Examples&lt;br&gt;
Factorial:&lt;br&gt;
javascriptfunction factorial(n) {&lt;br&gt;
  if (n === 1) return 1;&lt;br&gt;
  return n * factorial(n - 1);&lt;br&gt;
}&lt;br&gt;
Fibonacci:&lt;br&gt;
javascriptfunction fibonacci(n) {&lt;br&gt;
  if (n &amp;lt;= 1) return n;&lt;br&gt;
  return fibonacci(n - 1) + fibonacci(n - 2);&lt;br&gt;
}&lt;br&gt;
String Reversal:&lt;br&gt;
javascriptfunction reverseString(str) {&lt;br&gt;
  if (str === "") return "";&lt;br&gt;
  return reverseString(str.substring(1)) + str.charAt(0);&lt;br&gt;
}&lt;br&gt;
Palindrome Checker:&lt;br&gt;
javascriptfunction isPalindrome(str) {&lt;br&gt;
  if (str.length &amp;lt;= 1) return true;&lt;br&gt;
  if (str[0] !== str[str.length - 1]) return false;&lt;br&gt;
  return isPalindrome(str.substring(1, str.length - 1));&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Built recursive solutions for factorials, Fibonacci sequences, string reversal, and palindrome checking. Each one reinforced the pattern: base case to stop recursion, recursive case that calls itself with a simpler input.&lt;br&gt;
Week 5: Arrays and Method Chaining&lt;br&gt;
Week 5 was about arrays, from basic operations to chaining methods that changed how I approach data manipulation.&lt;br&gt;
Array Fundamentals&lt;br&gt;
Started with creating arrays, accessing elements, and basic manipulation with push, pop, shift, and unshift.&lt;br&gt;
The critical lesson: arrays are reference types.&lt;br&gt;
javascriptlet arr1 = [1, 2, 3];&lt;br&gt;
let arr2 = arr1; // Reference copy&lt;br&gt;
let arr3 = [...arr1]; // Shallow copy&lt;/p&gt;

&lt;p&gt;arr2.push(4);&lt;br&gt;
console.log(arr1); // [1, 2, 3, 4]&lt;br&gt;
console.log(arr3); // [1, 2, 3]&lt;br&gt;
When you assign arr2 = arr1, both variables point to the same array. The spread operator creates a new array.&lt;/p&gt;

&lt;p&gt;Iteration Methods&lt;br&gt;
Explored different ways to loop through arrays: traditional for loops, for...of loops, and forEach. Ran performance tests on arrays with a million elements. Traditional for loops won on speed, forEach wins on readability.&lt;br&gt;
Transform Methods&lt;br&gt;
map() transforms every element:&lt;br&gt;
javascriptconst numbers = [1, 2, 3, 4, 5];&lt;br&gt;
const doubled = numbers.map(n =&amp;gt; n * 2);&lt;br&gt;
// [2, 4, 6, 8, 10]&lt;br&gt;
filter() selects elements that pass a test:&lt;br&gt;
javascriptconst numbers = [1, 2, 3, 4, 5, 6];&lt;br&gt;
const evens = numbers.filter(num =&amp;gt; num % 2 === 0);&lt;br&gt;
// [2, 4, 6]&lt;br&gt;
reduce() accumulates to a single value:&lt;br&gt;
javascriptconst numbers = [1, 2, 3, 4, 5];&lt;br&gt;
const sum = numbers.reduce((acc, num) =&amp;gt; acc + num, 0);&lt;br&gt;
// 15&lt;/p&gt;

&lt;p&gt;Search and Test Methods&lt;br&gt;
find() and findIndex() locate elements:&lt;br&gt;
javascriptconst users = [{id: 1, name: "Alice"}, {id: 2, name: "Bob"}];&lt;br&gt;
const user = users.find(u =&amp;gt; u.id === 2);&lt;br&gt;
some() and every() test conditions:&lt;br&gt;
javascriptconst numbers = [1, 2, 3, 4, 5];&lt;br&gt;
numbers.some(n =&amp;gt; n &amp;gt; 3); // true&lt;br&gt;
numbers.every(n =&amp;gt; n &amp;gt; 0); // true&lt;/p&gt;

&lt;p&gt;Method Chaining&lt;br&gt;
This is where things clicked. Instead of nested loops, chain operations:&lt;br&gt;
javascriptconst numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];&lt;/p&gt;

&lt;p&gt;// Sum of squares of even numbers&lt;br&gt;
const result = numbers&lt;br&gt;
  .filter(n =&amp;gt; n % 2 === 0)&lt;br&gt;
  .map(n =&amp;gt; n * n)&lt;br&gt;
  .reduce((sum, n) =&amp;gt; sum + n, 0);&lt;br&gt;
// 220&lt;br&gt;
Each step is clear: filter for even numbers, square them, sum the results.&lt;/p&gt;

&lt;p&gt;Key Lessons&lt;/p&gt;

&lt;p&gt;Recursion: Every recursive function needs a base case and a recursive case. The base case stops the recursion, the recursive case solves a simpler version of the problem.&lt;br&gt;
Arrays as references: Be conscious of how you copy arrays. Assignment creates a reference, spread operator creates a shallow copy.&lt;/p&gt;

&lt;p&gt;Array methods: Map for transforming, filter for selecting, reduce for accumulating. These cover most data transformations.&lt;br&gt;
Method chaining: Chain operations to create readable data pipelines instead of nested loops.&lt;/p&gt;

&lt;p&gt;Moving Forward&lt;br&gt;
From here, I'm going into advanced array manipulation and data structures.&lt;/p&gt;

&lt;p&gt;Question: What concept took you multiple attempts to understand?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>recursion</category>
    </item>
    <item>
      <title>Weeks 2 &amp; 3 - Loops, Strings, Functions &amp; Why "Understanding" is Different from "Making it Work."</title>
      <dc:creator>Precious Afolabi</dc:creator>
      <pubDate>Sat, 17 Jan 2026 23:06:15 +0000</pubDate>
      <link>https://dev.to/precix_phantom/weeks-2-3-loops-strings-functions-why-understanding-is-different-from-making-it-work-j9b</link>
      <guid>https://dev.to/precix_phantom/weeks-2-3-loops-strings-functions-why-understanding-is-different-from-making-it-work-j9b</guid>
      <description>&lt;p&gt;Two weeks down. Loops, strings, functions, scope, and closures. If you asked me before this, I would've said I understood loops. Turns out there's a huge difference between making code work and actually understanding why it works.&lt;/p&gt;

&lt;p&gt;Week 2: The Nested Loop Revelation&lt;/p&gt;

&lt;p&gt;I spent hours staring at for(let j = 0; j &amp;lt;= i; j++) trying to figure out what that j &amp;lt;= i was actually doing.&lt;br&gt;
Then it clicked. The inner loop depends on the outer loop's counter. When i = 0, j runs once. When i = 1, j runs twice. That relationship is what makes half the patterns in programming work, and I've been using it without understanding it.&lt;/p&gt;

&lt;p&gt;String methods showed me something else: you can chain them because each one returns a string. text.toLowerCase().trim().split(' ') works because toLowerCase() gives back a string, trim() takes that string and gives back another one, then split() works on that result. Small thing, but it changed how I think about methods.&lt;/p&gt;

&lt;p&gt;The Project: Built a text analyzer. Takes in text, finds the most common word, checks for palindromes, counts everything. No libraries, just loops and string methods. The "find the most common word" part made me actually think instead of just Googling for a solution.&lt;/p&gt;

&lt;p&gt;Week 3: The Documentation Trap&lt;br&gt;
Functions, scope, and closures. This week was harder. Not because of time - the concepts themselves demanded more.&lt;br&gt;
I'd read documentation, watch endless tutorial videos, and still not understand what they were saying. Then I'd build something small and it would click. Reading gives you the map. Building shows you the terrain.&lt;/p&gt;

&lt;p&gt;Finally understanding closures and how functions can return other functions felt like unlocking something. It's one thing to read about it, another to see why it actually matters.&lt;/p&gt;

&lt;p&gt;The Reality: Uni tests meant I didn't finish the project I planned for this week. That's how it goes sometimes. You adapt.&lt;/p&gt;

&lt;p&gt;What I'm Learning About Learning&lt;br&gt;
Progress isn't smooth. Some days you code for hours. Other days, the power cuts out between classes and you're just trying to keep up. But the pattern is clear now: confusion is part of the process. Read, watch, stay confused, then build something small. That's when it clicks.&lt;/p&gt;

&lt;p&gt;Next week: recursion and arrays.&lt;/p&gt;

&lt;p&gt;Question for you: What's one thing in code you thought you understood but later realized you had no idea how it actually worked?&lt;/p&gt;

&lt;p&gt;Connect:&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/Precixphantom" rel="noopener noreferrer"&gt;https://github.com/Precixphantom&lt;/a&gt;&lt;br&gt;
LinkedIn: &lt;a href="https://www.linkedin.com/in/precious-afolabi-34194138b/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/precious-afolabi-34194138b/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>learning</category>
      <category>javascript</category>
      <category>backend</category>
    </item>
    <item>
      <title>Week 1 - JavaScript Fundamentals &amp; My First Mini Project</title>
      <dc:creator>Precious Afolabi</dc:creator>
      <pubDate>Sun, 04 Jan 2026 21:07:22 +0000</pubDate>
      <link>https://dev.to/precix_phantom/week-1-javascript-fundamentals-my-first-mini-project-c6g</link>
      <guid>https://dev.to/precix_phantom/week-1-javascript-fundamentals-my-first-mini-project-c6g</guid>
      <description>&lt;p&gt;Week 1 is wrapped. I spent the past week working through JavaScript fundamentals - variables, data types, operators, and conditionals. The goal was to build a solid foundation before moving to more complex concepts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I Built&lt;/strong&gt;&lt;br&gt;
Created a simple quiz program in Node.js. It asks 5 JavaScript questions, takes user input, calculates the score, and displays a grade. &lt;br&gt;
Simple concept, but actually building it revealed gaps I didn't know I had.&lt;br&gt;
The trickiest part? Getting user input to work in Node.js. I had to figure out the readline module, which handles things asynchronously. &lt;br&gt;
Coming from basic JavaScript exercises to dealing with async patterns was a bigger jump than expected. Took some googling and trial-and-error, but I got it working.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I Figured Out&lt;/strong&gt;&lt;br&gt;
The most useful thing I learned wasn't syntax or methods - it was how to actually start building.&lt;br&gt;
I sat there looking at a blank file thinking "where do I even begin?" The quiz needed questions, input handling, scoring, grade calculation - it felt like too much at once.&lt;/p&gt;

&lt;p&gt;Then I just made one question work. That's it. Once that worked, I added another question. Then I figured out scoring. Then the grade display.&lt;br&gt;
Turns out you don't need to see the whole path before you start. Just get one small thing working, then build from there. Sounds obvious when I say it now, but actually doing it was different.&lt;/p&gt;

&lt;p&gt;The technical stuff - learning readline, dealing with async code - that was challenging too. But learning to just start with one small piece instead of trying to solve everything at once? That's what made the difference.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Real Challenge&lt;/strong&gt;&lt;br&gt;
Consistency. I didn't code every single day like I planned. Some days I went hard for 2-3 hours. Other days, nothing. Life happened, motivation wavered, and I didn't stick to the schedule.&lt;/p&gt;

&lt;p&gt;But here's what I'm taking away: when I did show up and code, I made real progress. I built something that works. I understand the concepts. That counts.&lt;br&gt;
Next week I'm setting a specific time slot instead of just "whenever I feel like it." Structure helps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resources That Helped&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;javascript.info - Clear explanations with practical examples&lt;/p&gt;

&lt;p&gt;freeCodeCamp - Interactive exercises that reinforced concepts&lt;/p&gt;

&lt;p&gt;Good old Google, when I got stuck&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next Week&lt;/strong&gt;&lt;br&gt;
Focusing on loops and strings. Going to build something that combines both concepts.&lt;/p&gt;

&lt;p&gt;If you're learning too, drop a comment. What are you working on? What's challenging you right now?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connect with me:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/Precixphantom" rel="noopener noreferrer"&gt;https://github.com/Precixphantom&lt;/a&gt;&lt;br&gt;
LinkedIn: &lt;a href="https://www.linkedin.com/in/precious-afolabi-34194138b/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/precious-afolabi-34194138b/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>learning</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Making an Unconventional Move 5 Months Into Backend Development</title>
      <dc:creator>Precious Afolabi</dc:creator>
      <pubDate>Mon, 29 Dec 2025 14:35:54 +0000</pubDate>
      <link>https://dev.to/precix_phantom/making-an-unconventional-move-5-months-into-backend-development-55bn</link>
      <guid>https://dev.to/precix_phantom/making-an-unconventional-move-5-months-into-backend-development-55bn</guid>
      <description>&lt;p&gt;The Unconventional Decision&lt;br&gt;
I'm making a move that might seem counterintuitive for someone 5 months into backend development: I'm going back to strengthen my fundamentals instead of just pushing forward.&lt;br&gt;
Here's the context. Over the past 5 months, I've been building with Node.js and have some projects to show:&lt;/p&gt;

&lt;p&gt;Chronos API: Study tracker with JWT authentication, automated email reminders using node-cron, background jobs, and production deployment on Render&lt;br&gt;
Blog Platform: Full CRUD operations, user authentication, and session management with EJS&lt;/p&gt;

&lt;p&gt;Both work. Both are deployed. Most people would keep building at this point. But I realized something important: I can build features by following patterns and documentation, but when it comes to understanding what's actually happening under the hood or making informed architectural decisions, I want more confidence.&lt;br&gt;
Why This Makes Sense&lt;br&gt;
Right now, I can make things work. But I want to understand, not just implement. I want to be able to explain my code and make decisions based on understanding, not just what worked in the last tutorial.&lt;br&gt;
As a CS student actively looking for internships, I know employers care about how you think and solve problems, not just what you've built. This is about developing that deeper understanding.&lt;br&gt;
What I'm Focusing On&lt;br&gt;
Instead of rushing to learn new frameworks and tools, I'm going back to strengthen:&lt;/p&gt;

&lt;p&gt;JavaScript fundamentals (closures, async patterns, prototypes)&lt;br&gt;
How Node.js actually works&lt;br&gt;
HTTP and web protocols&lt;br&gt;
API design principles&lt;br&gt;
Database design and optimization&lt;br&gt;
Testing and code quality&lt;/p&gt;

&lt;p&gt;The Approach&lt;br&gt;
How I'm doing it:&lt;/p&gt;

&lt;p&gt;Learning systematically through a structured roadmap&lt;br&gt;
Building progressive projects that increase in complexity&lt;br&gt;
Documenting everything publicly with weekly updates&lt;br&gt;
Sharing code, challenges, and what I'm learning&lt;/p&gt;

&lt;p&gt;Why publicly?&lt;br&gt;
Two reasons. First, accountability - posting updates keeps me consistent. Second, I want to show how I approach learning and problem-solving, not just finished projects.&lt;br&gt;
What To Expect&lt;br&gt;
Every week I'll share:&lt;/p&gt;

&lt;p&gt;What I'm learning and why it matters&lt;br&gt;
Projects I'm building with code walkthroughs&lt;br&gt;
Challenges I'm facing and how I'm solving them&lt;br&gt;
Resources that are actually helping&lt;br&gt;
Honest updates on progress&lt;/p&gt;

&lt;p&gt;No fluff. Just real learning and real progress.&lt;br&gt;
Let's Connect&lt;br&gt;
If you're learning backend development, working on similar goals, or just starting out, I'd love to connect. Drop a comment with what you're working on or reach out.&lt;br&gt;
Find me:&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/Precixphantom" rel="noopener noreferrer"&gt;https://github.com/Precixphantom&lt;/a&gt;&lt;br&gt;
LinkedIn: &lt;a href="https://www.linkedin.com/in/precious-afolabi-34194138b/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/precious-afolabi-34194138b/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Week 1 update coming soon.&lt;/p&gt;

&lt;h1&gt;
  
  
  BackendDevelopment #NodeJS #LearningInPublic #WebDevelopment
&lt;/h1&gt;

</description>
      <category>backend</category>
      <category>node</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
