<?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: Alina Ramfu</title>
    <description>The latest articles on DEV Community by Alina Ramfu (@alinaramfu).</description>
    <link>https://dev.to/alinaramfu</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%2F1206481%2F479eb1c6-5889-4dfa-918e-cc28bf6d43a7.jpg</url>
      <title>DEV Community: Alina Ramfu</title>
      <link>https://dev.to/alinaramfu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alinaramfu"/>
    <language>en</language>
    <item>
      <title>Leading Without Constraining: What I Learned About True Leadership</title>
      <dc:creator>Alina Ramfu</dc:creator>
      <pubDate>Wed, 11 Feb 2026 14:18:59 +0000</pubDate>
      <link>https://dev.to/alinaramfu/leading-without-constraining-what-i-learned-about-true-leadership-3dkd</link>
      <guid>https://dev.to/alinaramfu/leading-without-constraining-what-i-learned-about-true-leadership-3dkd</guid>
      <description>&lt;p&gt;Throughout my professional career, I’ve had the opportunity to work with people who approached challenges in very different ways. Different perspectives. Different styles of handling delivery. Different reactions to tight deadlines, innovation pressure, or critical production incidents.&lt;/p&gt;

&lt;p&gt;I’ve seen technical managers visibly stressed over a production release gone wrong. I’ve seen managers push hard deadlines, insisting that a specific feature must be delivered by a certain date, no matter what.&lt;/p&gt;

&lt;p&gt;But I’ve also worked with technical leads.&lt;/p&gt;

&lt;p&gt;And I say lead intentionally.&lt;/p&gt;

&lt;p&gt;Because these were the people who, regardless of the chaos around them, guided their teams toward success. They didn’t simply manage tasks — they led people. They created clarity in uncertainty. They built confidence in moments of doubt. They turned obstacles into opportunities to grow.&lt;/p&gt;

&lt;p&gt;Years passed. I gained experience across projects, teams, and industries. Eventually, I found myself in a new position — mentoring a fairly large group of people.&lt;/p&gt;

&lt;p&gt;To be honest, it was scary at first.&lt;/p&gt;

&lt;p&gt;With responsibility comes pressure. And whenever I felt stress building up, I paused and asked myself one simple question: “What would a leader do?” More specifically: What would my last tech lead do?&lt;/p&gt;

&lt;p&gt;If there is one essential lesson I learned from him, it’s this: When you give a team enough freedom, confidence, and resources, the outcome can surpass even your highest expectations. So that’s exactly what I chose to do. Building, Not Controlling.&lt;/p&gt;

&lt;p&gt;For nearly five months, I focused on creating an environment of growth rather than control. I shared books, online courses, and practical learning materials. I designed requirements from scratch and let them implement solutions on their own. I encouraged learning by doing.&lt;/p&gt;

&lt;p&gt;We evolved into working in teams, adopting Agile practices. We worked on presentation skills, collaboration, team spirit, and technical depth.&lt;br&gt;
We discussed not only how to write code, but how to present yourself, how to communicate ideas, how to ask for help, and how to support others. It wasn’t just about technology. It was about building professionals.&lt;/p&gt;

&lt;p&gt;The outcome? It amazed even me. Some of them are already contributing to commercial projects and delivering outstanding results. Others became involved in a Machine Learning proof of concept while also exploring Full Stack Development. Some are still in the learning phase — but growing so steadily that they could confidently walk into an interview and perform flawlessly. What changed wasn’t just their technical skills. It was their confidence. &lt;/p&gt;

&lt;p&gt;So what was the secret ingredient? Leading without constraining. Empowering instead of controlling. Providing the right tools and trusting people to use them. Creating a mindset where saying “I don’t know” is not weakness — and asking for help is not failure.&lt;/p&gt;

&lt;p&gt;True leadership isn’t about pressure. It isn’t about rigid control or fear of mistakes. It’s about building an environment where people feel capable, supported, and trusted. Because when you do that, they won’t just meet expectations. They’ll exceed them.&lt;/p&gt;

</description>
      <category>career</category>
      <category>leadership</category>
      <category>management</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>How to notify tabs with the same origin using Broadcast Channel</title>
      <dc:creator>Alina Ramfu</dc:creator>
      <pubDate>Mon, 19 Feb 2024 19:54:32 +0000</pubDate>
      <link>https://dev.to/alinaramfu/how-to-notify-tabs-with-the-same-origin-using-broadcast-channel-47k4</link>
      <guid>https://dev.to/alinaramfu/how-to-notify-tabs-with-the-same-origin-using-broadcast-channel-47k4</guid>
      <description>&lt;p&gt;Keeping track of the state of your objects in session and local storage ain't easy. &lt;/p&gt;

&lt;p&gt;I learned that on my own while developing a feature that allows the user, to add items in the application (which are kept on the client side) and manipulate them (edit/delete) before actually sending the whole bunch of items to an API or cancelling the entire operation, thus removing them from the session storage.&lt;/p&gt;

&lt;p&gt;Everything worked fine and I was happy with how the data handling was done, right until I heard that there are users of this application that are duplicating their tabs: right clicking the browser's tab and then selecting "Duplicate".&lt;/p&gt;

&lt;p&gt;Just to give a little bit of context here, if I have one opened tab and I have 3 elements in session storage, then I duplicate the tab, the second tab will also contain the same 3 elements that the first tab had in session storage. If user then adds a 4th element in the first tab, that will not be visible to the duplicated one(s) though.&lt;/p&gt;

&lt;p&gt;So, what I needed here, in order to maintain the data consistency, was to notify the second tab (or any other duplicated tab), that the user cancelled the operation / sent the items to be processed by the API / closed the tab, so that all the other duplicated tabs could get reset as well (clear the session storage).&lt;/p&gt;

&lt;p&gt;How could I achieve that? By using &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API"&gt;BroadcastChannel&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I created a BroadcastChannel in the javascript file of the page I needed&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const broadcastChannel = new BroadcastChannel('backloadingChannel');
const backloadingData = {
    message: "NotifyDuplicatedTabsWithSameSession",
    locationPathName: window.location.pathname
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and I attached a listener to the "Cancel" / "Send to API" buttons so that when they get clicked, they post a message to the channel&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (document.getElementById('js-Save') != null) {
    document.getElementById('js-Save').addEventListener('click', function () {
        broadcastChannel.postMessage(backloadingData);
    });
}  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and, in the app.js I was listening to the messages received and I was clearing out the sessionStorage and reloaded the page whenever a user clicked on "Cancel" / "Send to API" (the reload is not mandatory, but in my case, I needed it - there was also some extra logic behind the scenes but this is the main reason I used BroadcastChannel).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const channel = new BroadcastChannel('backloadingChannel');

channel.onmessage = () =&amp;gt; {
    if (sessionStorage.length &amp;gt; 0) {
            sessionStorage.clear();
            location.reload();
    }
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Having this code in place allowed me to maintain state of objects across duplicated tabs and it was the easiest and cleanest way of doing it considering the project structure and the goal I wanted to achieve. &lt;/p&gt;

&lt;p&gt;As I said in this article, I also needed to maintain the state if the user closed the browser's tab. With more details about handling that, I will write a different article where I'll explain how I managed to differentiate between reloading and closing the tabs.&lt;/p&gt;

&lt;p&gt;Until then, please let me know your thoughts on this. Have you ever needed to handle data in session storage using duplicated tabs? If yes, I would love to hear and learn from other's implementations.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Why 0 is better than NULL sometimes</title>
      <dc:creator>Alina Ramfu</dc:creator>
      <pubDate>Fri, 10 Nov 2023 08:25:31 +0000</pubDate>
      <link>https://dev.to/alinaramfu/why-0-is-better-than-null-sometimes-2i77</link>
      <guid>https://dev.to/alinaramfu/why-0-is-better-than-null-sometimes-2i77</guid>
      <description>&lt;p&gt;Working with big data requires attention to details, testing, retesting, comparing data returned by the stored procedures, views, table valued functions etc. with the expected result. So understanding the core concepts of SQL is a must. &lt;/p&gt;

&lt;p&gt;I am currently working on a project for an insurance company and the amount of data they have is huge. One of their main functionality is having reports where they can interpret the data as they need. &lt;/p&gt;

&lt;p&gt;While testing something on one of their reports, I found a bug in the stored procedure that fed the report with data. They were trying to JOIN two sets of data, the left hand side contained NULL on a particular column, and the right side contained 0 on the same particular column.&lt;/p&gt;

&lt;p&gt;While you may think that representing NULL on the right hand side was the fix to go to, this wouldn't have worked. Instead, this was  the point where I thought representing NULLs with 0s would work. I'll demonstrate below why NULL wasn't working and how representing it with 0 fixed this. &lt;/p&gt;

&lt;p&gt;Let's consider the following example:&lt;br&gt;
LEFT hand side:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VALUES (1, null), (2, 1), (3, 2)) leftHandSide(Id, fk)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;RIGHT hand side:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VALUES (null, '0'), (1, '1'), (2, '2')) rightHandSide(Id, fk)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I'm performing a JOIN between them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT * FROM 
(VALUES (1, null), (2, 1), (3, 2)) leftHandSide(Id, fk)
INNER JOIN 
(VALUES (null, '0'), (1, '1'), (2, '2')) rightHandSide(Id, fk)
ON rightHandSide.Id = leftHandSide.fk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And I want my result set to look like this, it won't work.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Id  fk  Id  fk
1 NULL NULL NULL
2   1   1   1
3   2   2   2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead I will only get the last 2 rows&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Id  fk  Id  fk
2   1   1   1
3   2   2   2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you have NULL values in a column, these will never be matched to other NULL values. This is because NULL signifies the absence of any value, and cannot be compared as they will never equal anything.&lt;/p&gt;

&lt;p&gt;So, what I did was to represent NULL to 0 so that my result set contains the 3 rows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Id  fk  Id  fk
1   0   0   0
2   1   1   1
3   2   2   2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;by simply doing&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT * FROM
(VALUES (1, ISNULL(NULL, 0)), (2, 1), (3, 2)) leftHandSide(Id, fk)
INNER JOIN 
(VALUES (ISNULL(NULL, 0), '0'), (1, '1'), (2, '2')) rightHandSide(Id, fk)
ON rightHandSide.Id = leftHandSide.fk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lesson learned: whenever you have to deal with NULL, and you don't understand why your result set is missing some rows that you expect, think about representing NULLs to 0s.&lt;/p&gt;

</description>
      <category>sql</category>
      <category>sqlserver</category>
    </item>
  </channel>
</rss>
