Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,15 @@ export const meta = {
title:
"Block traffic to your website from Russia and Belarus using CloudFront",
description:
"We want to invite you all to block your website traffic from Russia and Belarus to show support for the Ukranian people. the following tutorial will help you to enable CloudFront Geographic Restrictions and block traffic.",
"We want to invite you all to block your website traffic from Russia and Belarus to show support for the Ukrainian people. the following tutorial will help you to enable CloudFront Geographic Restrictions and block traffic.",
category: "AWS",
image: blogHeader,
date: 1645837875000,
updatedAt: 1645837875000,
author: "davidabram",
editor: "velimirujevic",
abstract:
"Russia invaded Ukraine on the 24th of February 2022. Belarus offers logistic support to the Russian army. This website won't be available in Russia and Belarus until the invasion stops. We don't intend to punish our readers from Russia and Belarus but to show dissatisfaction and disapproval of the political and philosophical stance of the Russian government. Our company and I are strong supporters and believers in individual liberty, free trade, and free association. In addition to being against war, we strongly oppose evil and destructive ideas that support autocracies. Make no mistake, this is not the doing of one man, but a joint effort of individuals who believe it is not you who should be deciding how to live your life. We want to invite you all to block your website traffic from Russia and Belarus to show support for the Ukranian people. the following tutorial will help you to enable CloudFront Geographic Restrictions and block traffic.",
"Russia invaded Ukraine on the 24th of February 2022. Belarus offers logistic support to the Russian army. This website won't be available in Russia and Belarus until the invasion stops. We don't intend to punish our readers from Russia and Belarus but to show dissatisfaction and disapproval of the political and philosophical stance of the Russian government. Our company and I are strong supporters and believers in individual liberty, free trade, and free association. In addition to being against war, we strongly oppose evil and destructive ideas that support autocracies. Make no mistake, this is not the doing of one man, but a joint effort of individuals who believe it is not you who should be deciding how to live your life. We want to invite you all to block your website traffic from Russia and Belarus to show support for the Ukrainian people. the following tutorial will help you to enable CloudFront Geographic Restrictions and block traffic.",
pageType: "blog-posting"
};

Expand Down Expand Up @@ -63,7 +63,7 @@ Check `Restriction type` - `Block list` and select from the dropdown Russia and

<br />

You have just blocked all traffic from Russia and Belarus. All visitors from those locations will get 403 (Forrbidden) status code.
You have just blocked all traffic from Russia and Belarus. All visitors from those locations will get 403 (Forbidden) status code.

<ResponsiveImage
src={step4}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export const meta = {
updatedAt: 1721554208034,
author: "davidabram",
editor: "velimirujevic",
abstract: "On July 19, 2024, CrowdStrike's Falcon Sensor update caused widespread disruptions on millions of Windows systems, leading to \"blue screens of death\" and boot loops. The issue, an erorr in the C++ code of a system driver, impacted aviation, media, banking, and healthcare sectors, grounding flights and disrupting emergency services. This incident highlights a failure in CrowdStrike's development and deployment processes, as such errors should be caught by automated code sanitization tools. It underscores the importance of rigorous testing, CI/CD practices, and phased rollouts to prevent widespread disruptions in critical systems. Robust testing and deployment strategies are essential, even with memory-safe programming languages.",
abstract: "On July 19, 2024, CrowdStrike's Falcon Sensor update caused widespread disruptions on millions of Windows systems, leading to \"blue screens of death\" and boot loops. The issue, an error in the C++ code of a system driver, impacted aviation, media, banking, and healthcare sectors, grounding flights and disrupting emergency services. This incident highlights a failure in CrowdStrike's development and deployment processes, as such errors should be caught by automated code sanitization tools. It underscores the importance of rigorous testing, CI/CD practices, and phased rollouts to prevent widespread disruptions in critical systems. Robust testing and deployment strategies are essential, even with memory-safe programming languages.",
pageType: "blog-posting"
};

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
import blogHeader from "../../content/images/blogs/developer-bad-day-fix-this-mess.png?preset=responsive";
import BlogLayout from "../../Layouts/BlogLayout";
import ContentTable from "../../components/Blog/ContentTable";

export const meta = {
id: "developer-bad-day-fix-this-mess",
title: "Developer’s Bad Day: Can We Fix This Mess?",
description: "Bad days can be a major productivity killer for developers. Learn how tooling and infrastructure issues, process inefficiencies, team dynamics, and personal struggles contribute to these frustrating experiences, and what you can do to fix the mess.",
category: "After work talks",
image: blogHeader,
date: 1733910668000,
updatedAt: 1733910668000,
author: "davidabram",
editor: "velimirujevic",
abstract: "Bad days are not just a minor annoyance for developers, but seemingly a full-blown existential crisis. A study by Microsoft reveals that tooling and infrastructure issues, process inefficiencies, team dynamics, and personal struggles can combine to create a perfect storm of frustration. This article explores the common causes of bad days among developers, from the frustrations of unreliable tools and inefficient processes to the emotional toll of feeling undervalued and unsupported. It also presents data-driven evidence of the impact of these issues on productivity and offers practical solutions for fixing the problems that contribute to these frustrating experiences.",
pageType: "blog-posting"
};


You all know the feeling. You roll out of bed, half a bagel in one hand, coffee in the other, and you're ready to hit the ground coding. Today’s the day you're going to refactor that spaghetti mess, finally squash that elusive bug, or deploy that feature you've nurtured like a baby bird. You fire up your neovim and...

*Nothing works.*

Suddenly, the tools you rely on feel like they were designed by an evil genius determined to destroy your productivity. Builds fail for no reason, pull requests stall in limbo, and your teammates are *just* responsive enough to remind you that nobody’s here to help.

Welcome to a *bad day*.

Bad days for developers aren't just bad vibes or minor hiccups—they’re full-on existential crises wrapped in frustration.

A [study by Microsoft](https://arxiv.org/pdf/2410.18379) digs into the guts of these bad days to see what exactly makes them so soul-crushing. It's a pretty cool read.

Spoiler alert: it’s not just the tools. It's *everything* conspiring together in a perfect storm of frustration.

<ContentTable tocData={props.toc} />

<br />
<br />

## Tooling and Infrastructure woes

Tooling; The promise of automation, efficiency, and modern development practices. Except when it isn’t.

Imagine this:

You’re deep in the zone, cranking out lines of glorious code, feeling like a wizard. You submit a build and boom—it fails. Why? Who knows. A flaky test? A mysterious dependency issue? The server decided it’s on strike? All of the above.

One dev put it perfectly: *“Every single tool we use feels like it’s barely working most days.”*

It’s like trying to cook a family meal and your oven’s broken, the fridge is warm, and you only have spoons for cutlery. You’re not cooking; you’re just trying to survive. These issues drain your productivity and sap your vitality.

## Process Inefficiencies

As if unreliable tools weren’t enough, let’s talk about the *joy* of processes.

Meetings. Documentation black holes. Ambiguous ownership. Shifting priorities. You get the idea. These things are supposed to make development smoother, but sometimes they feel like a game of bureaucratic whodunit.

And the worst part? These inefficiencies pile up until your productive hours evaporate. A half of your day disappears while you're on meetings, leaving you with just enough time to start coding before getting interrupted again.

## Team Dynamics and Communication

We’re not talking about epic clashes of personalities—just the small, persistent stuff that grinds you down. Unresponsive teammates. Vague feedback. Passive-aggressive comments on your pull request. Maybe a bit of finger-pointing for good measure. It’s like being stuck in a dysfunctional family where everyone’s too polite to admit they hate the holiday dinner.

A dev from the study remarked: *“Smiles are contagious, and so is grumpiness.”* So when a bad day infects one person, it doesn’t take long before the whole team catches the vibe.

## Bad Days Hit Harder Than You Think

Okay, so your tools are garbage, processes are chaos, and team morale is crumbling. But the damage doesn’t end there. Bad days aren’t just bad for work—they bleed into every part of your life.

### Senior Devs - Disillusionment and Rage

For senior developers, bad days often come with a generous helping of frustration, cynicism, and the occasional urge to flip a table. After dealing with blockers for the hundredth time, the existential dread kicks in:

*“Why am I even driving on this road anymore?”*
Translation: Maybe it’s time to check LinkedIn.

Repeated bad days turn into serious doubts about whether the company *cares* about fixing the problems. And when senior devs start losing hope, well, let’s just say productivity isn’t the only thing on the chopping block.

### Junior Devs - Guilt and Imposter Syndrome

For junior devs, it’s a different flavor of misery. Instead of rage, they get guilt and self-doubt. When tools fail or processes block progress, they wonder if *they’re* the problem. One junior dev admitted, *“Am I just not competent enough to fix this?”*

The result? Sleepless nights, overwork, and the gnawing feeling that they’re not cut out for this. Meanwhile, the *actual* problem (broken systems and poor processes) keeps chugging along, unbothered.

### The Personal Spillover: Stress, Anxiety, and Overtime

Bad days don’t clock out when you do. They follow you home, mess with your sleep, strain your relationships, and sometimes make you a zombie parent or partner. Developers reported working late into the night just to “catch up,” sacrificing family time and self-care.

A dev summed it up: *“I feel like I’m not pulling my weight, so I work evenings to justify my existence as an employee.”*

That’s not just unhealthy—it’s unsustainable.

---

## But Wait—We Have Data!

It’s easy to dismiss these complaints as grumbling, but Microsoft’s study backed it up with hard data.

The study showed that:

**Pull requests stalled** significantly longer for developers who cited PR delays as a source of bad days.
**Build times ballooned** for those who reported slow builds dragging them down.

The numbers don’t lie: bad tools and processes aren’t just annoying; they’re productivity killers.

## So, Can We Fix This Mess?

Short answer: Yes.
Long answer: *Hell Yes, but it requires real effort.*

Here’s what developers are begging for:

**Better Tools**: Stop making devs fight their IDEs, CI pipelines, and flaky tests.
**Fewer but Better Meetings**: Respect their time. Let them code.
**Mentorship and Support**: Help junior devs see that it’s *not* their fault.
**Faster Feedback Loops**: Optimize PR reviews and build processes so devs don’t feel like they’re coding in quicksand.

## Conclusion - Listen, Then Act

Bad days for developers are a signal. They’re telling you that something’s broken—not just in the codebase, but in the environment.

The good news? These problems are fixable. Listen to your developers, believe their frustrations, and *do something* about it.

Because happy developers build great software. And great software makes *everyone’s* day better.

export default (props) => <BlogLayout meta={meta} {...props}>{props.children}</BlogLayout>;
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ There are a few ways to fix this problem. The first (and the best) way is to use

## Convert falsy values to Boolean

Alternatively, we can cast all our falsly values to Boolean or use the **`!!`** operator.
Alternatively, we can cast all our falsy values to Boolean or use the **`!!`** operator.
The **`!!`** operator is used to convert a value to a Boolean. It is essentially a shorthand way of converting a truthy or falsy value to true or false.

```tsx
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ The most obvious solution to this problem is to transform the Input component in
/*
Input component that is exported from component library

Controlled component's input element should recieve
Controlled component's input element should receive
value and onChange props for Input component to function properly

The inputValue should be stored in the parent's component state
Expand Down Expand Up @@ -141,7 +141,7 @@ But what if you want to keep your Input component uncontrolled? Another solution
/*
Input component that is exported from component library

Uncontrolled component's input element should recieve
Uncontrolled component's input element should receive
ref prop for Input component to function properly
*/
const InputComponent = ({ label, inputRef }) => {
Expand Down Expand Up @@ -209,15 +209,15 @@ Fortunately, there is a hook called [useImperativeHandle](https://reactjs.org/do

By using useImperativeHandle we can create a ‘custom component API’ which can be used in the parent component by accessing `ref.current` thanks to `forwardRef`.

Using the combination of both, we control what's exposed as the reference for our Input component. In our case we decided to expose a function `setInputValue` to set the value of the HTML `input` component, a function `clearInputValue` to clear it and a function`getInputValue` to retreive it.
Using the combination of both, we control what's exposed as the reference for our Input component. In our case we decided to expose a function `setInputValue` to set the value of the HTML `input` component, a function `clearInputValue` to clear it and a function`getInputValue` to retrieve it.

Check out the code below:

```jsx
/*
Input component that is exported from component library

ref is passed by forwardRef to the componentx
ref is passed by forwardRef to the component
*/
const InputComponent = forwardRef(({ label }, ref) => {
const inputRef = useRef(null);
Expand Down Expand Up @@ -298,7 +298,7 @@ When implementing forms in React, using controlled components is always the pref

The uncontrolled component approach without `forwardRef` / `useImperativeHandle` can lead to your DOM getting changed by accident and/or outside purview of React.

Although we have reinvented the Input component as an uncontrolled component using forwardRef and useImperativeHandle, I wouldn't suggest taking this approach unless you are implementing that component as part of a component library. Missuse of refs could lead you to pass refs through multiple components and a confusing data flow.
Although we have reinvented the Input component as an uncontrolled component using forwardRef and useImperativeHandle, I wouldn't suggest taking this approach unless you are implementing that component as part of a component library. Misuse of refs could lead you to pass refs through multiple components and a confusing data flow.

We are actively working on expanding our internal component library, always striving to create neat and tidy component APIs. That is why long term thinking and reusability are key factors in our decision making when it comes to logic building of our components. We hope you found our solution helpful, and of course, feel free to comment or contact us about any ambiguities you might encounter while going through this post.

Expand Down
4 changes: 2 additions & 2 deletions apps/company-website/src/pages/blog/the-dom-exercises.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export const meta = {
id: "the-dom-exercises",
title: "JavaScript DOM - Code Exercises",
description:
"The DOM or the Document Object Model of the page is created after the web page is loaded. Learn some DOM manuipulation with these exercises.",
"The DOM or the Document Object Model of the page is created after the web page is loaded. Learn some DOM manipulation with these exercises.",
category: "Learn JavaScript",
image: blogHeader,
date: 1619463600000,
Expand Down Expand Up @@ -282,7 +282,7 @@ You are building a web page that displays a list of items. The user should be ab
const app = document.getElementById("list-app");

// Create the necessary elements
const list = document.createElemeent("ul");
const list = document.createElement("ul");
const input = document.createElement("input");
input.setAttribute("type", "text");
const addButton = document.createElement("button");
Expand Down
Loading