<?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: Itoro James</title>
    <description>The latest articles on DEV Community by Itoro James (@khaytorah).</description>
    <link>https://dev.to/khaytorah</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%2F2722850%2Fde40ee26-411b-4642-9937-7e17cbef6295.jpeg</url>
      <title>DEV Community: Itoro James</title>
      <link>https://dev.to/khaytorah</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/khaytorah"/>
    <language>en</language>
    <item>
      <title>Databases, OLTP vs OLAP, and Normalization</title>
      <dc:creator>Itoro James</dc:creator>
      <pubDate>Mon, 20 Jul 2026 19:19:44 +0000</pubDate>
      <link>https://dev.to/khaytorah/databases-oltp-vs-olap-and-normalization-35kc</link>
      <guid>https://dev.to/khaytorah/databases-oltp-vs-olap-and-normalization-35kc</guid>
      <description>&lt;p&gt;&lt;strong&gt;Your contact list is a database&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So is the sticky note where you jot down your shopping list. So is a shoebox full of receipts, if you're organized enough to sort them.&lt;/p&gt;

&lt;p&gt;Database engineers might wince at that. But strip away the jargon, and a database is just this: &lt;strong&gt;an organized place to store data so it can be found again later&lt;/strong&gt;. Scale it up, add rules, and hand control of it to specialized software, and you get what companies call a "real" database. That software is called a &lt;strong&gt;DBMS (Database Management System)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There are two broad families of databases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Relational databases&lt;/strong&gt; - data lives in neat tables with rows and columns, like a set of connected spreadsheets. Think MySQL, PostgreSQL. Data here follows strict rules about structure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Non-relational databases&lt;/strong&gt; - data doesn't have to follow a fixed table structure. It might be stored as flexible documents, key-value pairs, or graphs. Think MongoDB. Good for messier, less predictable data.&lt;br&gt;
Neither is "better." They're tools for different jobs, and most companies use both, depending on what they're storing.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;OLTP vs OLAP: same business, two different jobs&lt;/strong&gt;&lt;br&gt;
Databases don't just differ in structure. They differ in purpose.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OLTP (Online Transaction Processing)&lt;/strong&gt; handles things happening right now, one at a time, fast.&lt;/p&gt;

&lt;p&gt;Withdraw cash from an ATM and the system checks your balance, subtracts the amount, and confirms it instantly, correctly, every time. That's OLTP: small, frequent, real-time operations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OLAP (Online Analytical Processing)&lt;/strong&gt; handles looking back, scanning huge amounts of history to find a pattern.&lt;/p&gt;

&lt;p&gt;"What was our average withdrawal across all branches last quarter?" isn't a question about one transaction. It's a question about millions of them. OLAP systems are built to chew through that kind of load, even if the answer takes a few seconds or minutes to arrive.&lt;/p&gt;

&lt;p&gt;Picture a bank branch: OLTP is the cashier at the counter, serving one customer at a time. OLAP is the analyst upstairs, going through a year of receipts to spot a trend. Same building, same business, entirely different jobs which is why they need entirely different tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Normalization: fixing the copy-paste problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Normalization lives on the OLTP side. It's a set of rules for organizing a relational database so a fact only lives in one place, and updating it doesn't turn into a scavenger hunt.&lt;/p&gt;

&lt;p&gt;Take a messy table storing student enrollments:&lt;/p&gt;

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

&lt;p&gt;Mr. Doe's email shows up twice. Change it tomorrow, and you have to find and update every row he appears in. Miss one, and now two different emails exist for the same person, and there will be the question of "which one is correct"?&lt;/p&gt;

&lt;p&gt;Normalization fixes this by splitting the data into separate, linked tables:&lt;/p&gt;

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

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

&lt;p&gt;Now Mr. Doe's email exists in exactly one place. Change it once, and every course linked to him is correct automatically. That's normalization: store each fact once, and link related facts instead of repeating them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this matters more than it sounds&lt;/strong&gt;&lt;br&gt;
This is the invisible layer under every app you use. Your bank app shows the right balance because OLTP and normalization are quietly doing their job. A company's leadership sees an accurate quarterly report instead of five contradictory spreadsheets because OLAP is running on properly-structured data underneath.&lt;/p&gt;

&lt;p&gt;Get this layer wrong, and every dashboard, report, and model built on top of it inherits the mess.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One-line takeaway:&lt;/strong&gt; &lt;em&gt;OLTP keeps the present accurate. OLAP makes sense of the past. Normalization is what keeps OLTP trustworthy enough for OLAP to rely on.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>database</category>
      <category>sql</category>
      <category>beginners</category>
      <category>dataengineering</category>
    </item>
    <item>
      <title>Data Engineering: The Data Field's Unknown Child</title>
      <dc:creator>Itoro James</dc:creator>
      <pubDate>Sun, 12 Jul 2026 14:53:50 +0000</pubDate>
      <link>https://dev.to/khaytorah/data-engineering-the-data-fields-unknown-child-4510</link>
      <guid>https://dev.to/khaytorah/data-engineering-the-data-fields-unknown-child-4510</guid>
      <description>&lt;p&gt;&lt;strong&gt;Why has nobody explained this to me before?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you've spent any time around tech content, you've heard of Data Science. You've probably also heard of Data Analytics. Both have flashy job titles, viral LinkedIn posts, and "become a Data Scientist in 6 months" bootcamps aimed squarely at career switchers like me.&lt;/p&gt;

&lt;p&gt;But somewhere behind both of them quietly, without the fanfare sits Data Engineering, and almost nobody talks about it.&lt;/p&gt;

&lt;p&gt;That silence is exactly why I wanted to write about it first. Because once you understand what Data Engineering actually is, everything else in the data world makes a lot more sense.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So what is Data Engineering, actually?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In plain English: &lt;strong&gt;Data Engineers build the systems that move, clean, and store data so that other people can use it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Think about a company like a food delivery app. Every order, every rider location ping, every rating that's raw data being generated constantly, from dozens of different sources, in messy, inconsistent formats.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;Data Engineer&lt;/strong&gt; builds the pipelines that collect all of that raw data, clean it up, and store it somewhere usable.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Data Analyst&lt;/strong&gt; then queries that clean data to answer questions like "which city has the slowest delivery times?"&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Data Scientist&lt;/strong&gt; builds models on top of that same clean data to predict things like "which riders are likely to churn next month?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notice the order. The Analyst and the Scientist can only do their jobs because the Engineer already did theirs. Without clean, reliable, well-organized data, a Data Scientist's fancy model is just guesswork dressed up in Python.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does it "sit" so quietly, then?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A few reasons, as far as I can tell:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;It's infrastructure, not insight.&lt;/strong&gt;&lt;br&gt;
Data Science produces headlines "AI predicts X," "model achieves Y% accuracy." Data Engineering produces something less quotable: a pipeline that ran successfully at 2 AM without anyone noticing. Good infrastructure is invisible by design. Nobody writes a viral post about "the database didn't crash today."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;It's less "sexy" in job-market marketing.&lt;/strong&gt;&lt;br&gt;
Bootcamps sell dreams, and "predict the future with machine learning" sells better than "learn to build reliable data pipelines." So the content ecosystem courses, influencers, breakdown videos naturally tilts toward Data Science and Analytics, even though Engineering is arguably the harder, more foundational skill.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;You only notice it when it breaks.&lt;/strong&gt;&lt;br&gt;
Nobody thanks the Data Engineer when the dashboard loads instantly with accurate numbers. Everybody notices when the dashboard is broken, showing yesterday's data, or missing half the rows. Data Engineering's success is measured in the absence of complaints, which is a terrible way to build a reputation, but a great way to build a company.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The analogy that made it click for me&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As a frontend developer, this is the comparison that finally made it land:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Engineers are the plumbers and electricians of a data-driven company.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you turn on a tap and clean water comes out, you don't think about the reservoir, the treatment plant, the pipes, or the pressure systems that made that possible. You just expect water. The same is true of data, analysts and scientists just expect clean, available data to "be there" when they need it. Data Engineers are the ones who built and maintain the pipes.&lt;/p&gt;

&lt;p&gt;Nobody builds a monument to the person who plumbed the building. But try running a city without them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it actually matters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's the part that changed how I see this field: bad data engineering quietly poisons everything downstream.&lt;/p&gt;

&lt;p&gt;If the pipeline that feeds a company's dashboards has a silent bug, say, it's double-counting orders from one region, every analyst report, every business decision, and every model trained on that data inherits the mistake. Nobody notices until a "insight" from that data turns out to be catastrophically wrong.&lt;/p&gt;

&lt;p&gt;In other words: Data Science gets the credit, but Data Engineering is the thing that determines whether that credit was even earned.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who needs Data Engineers the most?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Any company past the "spreadsheet stage.&lt;/strong&gt;" Once data is coming from more than 2-3 sources (app events, payments, third-party APIs, customer support tools), someone needs to be building pipelines to unify it or every team ends up with a different, slightly wrong version of "the numbers."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Companies investing in AI or ML.&lt;/strong&gt; Every machine learning model is downstream of a data pipeline. Companies rushing to "add AI" without solid data engineering are building on sand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Science and Analytics teams themselves.&lt;/strong&gt; Ironically, the people who get the least public credit for Data Engineering are often the ones the Data Science team relies on most heavily, and complains about least publicly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regulated industries (finance, healthcare, insurance).&lt;/strong&gt; Where data has to be traceable, auditable, and correct not just "roughly right" the engineering behind it is not optional, it's the whole game.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;One-line takeaway&lt;/strong&gt;: &lt;em&gt;Data Science asks the questions. Data Engineering makes sure there's an honest answer to give.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is post #1 in my public log of transitioning from frontend development into Data Engineering, starting with DataCamp's Associate Data Engineer in SQL track. Follow along as I break down what I'm learning, one concept at a time.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>career</category>
      <category>data</category>
      <category>dataengineering</category>
    </item>
    <item>
      <title>Contributing to a Browser Used by Millions - A personal experience</title>
      <dc:creator>Itoro James</dc:creator>
      <pubDate>Thu, 16 Apr 2026 21:04:11 +0000</pubDate>
      <link>https://dev.to/khaytorah/contributing-to-a-browser-used-by-millions-3g23</link>
      <guid>https://dev.to/khaytorah/contributing-to-a-browser-used-by-millions-3g23</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;Choosing the Project&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;When I saw the Firefox project listed, I almost skipped it because it looked like one of the easiest projects, and I assumed it would attract the most people. My thinking was: if everyone is going there, maybe I shouldn’t.&lt;/p&gt;

&lt;p&gt;But then a friend told me something:&lt;/p&gt;

&lt;p&gt;“It’s not always about doing it. Sometimes it’s about doing it well.”&lt;/p&gt;

&lt;p&gt;So I chose Firefox. And I told myself: don’t just do it, try to do it well.&lt;br&gt;
Did I do it well? Honestly, I don’t know. I’ll probably ask my mentors for feedback.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Setting up the Codebase&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Setting up the project was straightforward for me, but when I opened the codebase, I was honestly blown away.&lt;br&gt;
Firefox is huge.&lt;/p&gt;

&lt;p&gt;My first instinct was to understand as much of it as I could, at least the sidebar. &lt;br&gt;
I initially tried to understand it details by details, i then realized that wasnt efficient, given time constraints, so i tried to understand the structure instead, how components were connected and the flow of things. With time i got a hang of it, and started to feel familiar, not simple, but familiar enough to navigate.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Ready to make my first contribution&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Finding the first bug to contribute to wasn't easy at all, every bug i thought to be interesting already had multiple contributors indicating interest, or someone already submitting a patch, assigned or not. It felt like i was late to the party, the competition was real. In a bit not to be left behind, i submitted my first fix without being assigned the bug, it was a documentation fix, nothing technical, but at least i felt safe, i had made a contribution.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Bug That Was Closed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;My second contribution attempt hit differently:&lt;br&gt;
Bug 1982519: No default icon shown when an extension icon is missing&lt;/p&gt;

&lt;p&gt;Early on, I suspected the issue wasn’t really a bug, or had already been fixed. But I still went ahead and built a solution.&lt;/p&gt;

&lt;p&gt;When I submitted it, Rob Wu from the Firefox extensions team questioned my use of a generic regex. After a few back-and-forth comments, things became clearer for both of us, and the bug was eventually marked out of scope and closed.&lt;/p&gt;

&lt;p&gt;When I first saw his comment, imposter syndrome kicked in.&lt;br&gt;
It doesn’t always announce itself loudly, it just shows up quietly and makes you feel like everyone else knows something you don’t.&lt;/p&gt;

&lt;p&gt;I started questioning everything, was I wrong? Was my approach off?&lt;/p&gt;

&lt;p&gt;But communication helped. We clarified things. I understood his perspective, and he understood mine.&lt;br&gt;
That helped a lot.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Bug That Almost Broke Me&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;My last bug turned into my longest week:&lt;br&gt;
Bug 2015491: a keyboard navigation issue in Firefox’s tab notes feature&lt;/p&gt;

&lt;p&gt;When a user navigates to the Cancel Button and presses Enter, the expected behavior is for the text box modal to close, and the note not saved. However, the note was still being saved.&lt;/p&gt;

&lt;p&gt;I fixed it and submitted my patch. It was landed, then got reverted by the sherrif.&lt;br&gt;
I fixed it again. Reverted.&lt;br&gt;
Again, reverted.&lt;br&gt;
Three backouts, three different failure messages.&lt;/p&gt;

&lt;p&gt;That was tough.&lt;/p&gt;

&lt;p&gt;The self-doubt crept in. The temptation to open ChatGPT got stronger. That quiet voice started asking: do you actually know what you’re doing?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But this bug became the highlight of my experience.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At one point, I found a “fix” something that made all the tests pass. Clean, green, Done.&lt;/p&gt;

&lt;p&gt;I had already spent more time on this than I expected, part of me just wanted to submit it and move on.&lt;br&gt;
But I knew that wasnt fixing the bug, it was just masking the problem.&lt;/p&gt;

&lt;p&gt;I knew where the issue was, there was an existing test in &lt;code&gt;browser_b_notes_telementry.js&lt;/code&gt;, that had a line of code there that didn't seem logically right, and was affecting my test, but as at the time i couldn't find the exact problem.&lt;/p&gt;

&lt;p&gt;And that was the real test for me.&lt;br&gt;
Not the code. Not the bug.&lt;br&gt;
The choice.&lt;/p&gt;

&lt;p&gt;Submit something that looks correct, or hold back and do what’s actually correct and better.&lt;/p&gt;

&lt;p&gt;I could have submitted it, it probably would have landed, no one might have noticed.&lt;br&gt;
But I chose to speak up and ask for help.&lt;/p&gt;

&lt;p&gt;And I’m glad I did.&lt;br&gt;
Not only did I fix the bug, I also helped identify and fix an issue in an existing test, something that wasn’t even reported as a bug yet.&lt;/p&gt;

&lt;p&gt;In a way, I caught a future bug.&lt;/p&gt;

&lt;p&gt;That’s something I’m genuinely proud of. Not because everything went smoothly, but because I chose integrity when it would have been easier not to.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Rule That Made it Better&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Firefox banned the use of AI tools during the contribution phase.&lt;br&gt;
I decided to fully commit to that.&lt;br&gt;
No AI-generated code. No AI explanations. Every bug, every fix, every mistake were all mine.&lt;/p&gt;

&lt;p&gt;It wasn’t easy, there were moments I really wanted to open ChatGPT and just get unstuck quickly.&lt;br&gt;
During this experience i realized something.&lt;br&gt;
I had forgotten what it felt like to sit with a problem. To be confused and stay there for a while, to think through it without immediately reaching for a shortcut.&lt;/p&gt;

&lt;p&gt;This experience led me to realize something, AI is an incredible tool, however, it is quietly weakening our ability to think (deeply) if we rely on it too much.&lt;/p&gt;

&lt;p&gt;Working without it was uncomfortable at times, but the sense of total ownership at the end? That felt different, even better.&lt;/p&gt;

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

&lt;p&gt;My code is now in Firefox 151.&lt;br&gt;
Millions of users will benefit from a fix I wrote from my laptop in Abuja, Nigeria, without a single line of AI-generated code.&lt;/p&gt;

&lt;p&gt;I made only two contributions to the Firefox project, if you exclude the out-of-scope one, just two.&lt;/p&gt;

&lt;p&gt;But the experience, the growth, and the impact mean far more than the number.&lt;/p&gt;

&lt;p&gt;I want to say a special thank you to Kelly, Nikki, Stephen, Rob, and Jeremy. I also want to say thank you to my fellow contributors, your blogs inspired me to put this out there.&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>opensource</category>
      <category>firefox</category>
      <category>outreachy</category>
    </item>
  </channel>
</rss>
