<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Signals Archives - ShiftMag</title>
	<atom:link href="https://shiftmag.dev/category/signals/feed/" rel="self" type="application/rss+xml" />
	<link>https://shiftmag.dev/category/signals/</link>
	<description>Insightful engineering content &#38; community</description>
	<lastBuildDate>Fri, 27 Sep 2024 09:50:26 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://shiftmag.dev/wp-content/uploads/2024/08/cropped-ShiftMag-favicon-32x32.png</url>
	<title>Signals Archives - ShiftMag</title>
	<link>https://shiftmag.dev/category/signals/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>How to handle any mystery project that falls in your lap</title>
		<link>https://shiftmag.dev/how-to-handle-any-mystery-project-that-falls-in-your-lap-3761/</link>
		
		<dc:creator><![CDATA[Dario Filipovic]]></dc:creator>
		<pubDate>Fri, 27 Sep 2024 09:18:40 +0000</pubDate>
				<category><![CDATA[Signals]]></category>
		<category><![CDATA[Infobip Signals]]></category>
		<category><![CDATA[product development]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=3761</guid>

					<description><![CDATA[<p>Have you ever been assigned to a project where neither you nor your team knew where to begin, with only vague ideas to guide you? Well, I have.</p>
<p>The post <a href="https://shiftmag.dev/how-to-handle-any-mystery-project-that-falls-in-your-lap-3761/">How to handle any mystery project that falls in your lap</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-post-featured-image"><img fetchpriority="high" decoding="async" width="1200" height="630" src="https://shiftmag.dev/wp-content/uploads/2024/09/Mystery-project-2.png?x94846" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2024/09/Mystery-project-2.png 1200w, https://shiftmag.dev/wp-content/uploads/2024/09/Mystery-project-2-300x158.png 300w, https://shiftmag.dev/wp-content/uploads/2024/09/Mystery-project-2-1024x538.png 1024w, https://shiftmag.dev/wp-content/uploads/2024/09/Mystery-project-2-768x403.png 768w" sizes="(max-width: 1200px) 100vw, 1200px" /></figure>


<p class="wp-block-paragraph">We were entering unfamiliar territory, different from our usual experience. This caused some initial uncertainty, but we recognized that adjustments were essential to move forward effectively.</p>



<p class="wp-block-paragraph">Here’s the story of that project.</p>



<h2 class="wp-block-heading"><span id="this-is-how-infobip-signals-was-born">This is how Infobip Signals was born&nbsp;</span></h2>



<p class="wp-block-paragraph">The product in question was our new product &#8211; <a href="https://www.infobip.com/docs/signals" target="_blank" rel="noreferrer noopener">Signals</a>.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">Its purpose was to<strong> detect and block artificially generated traffic</strong>, specifically SMS traffic sent through our platform but initiated by our clients&#8217; end users. This primarily refers to 2FA messages. To give you some context, these are the messages containing verification codes that you, the end-user, request and receive via SMS.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">We had some skeleton service as a baseline and a couple of initial ideas of where to start.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">Our first task was to <strong>verify existing and develop new ways to detect such traffic</strong>. This quickly consumed our development time, resulting in hours of analyzing traffic graphs, querying databases, and reviewing in-house reports of suspicious traffic increases.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">The success was moderate, but we felt like we were chasing our tails. With inconclusive results, it was hard for us as developers to implement something we weren&#8217;t sure would work.&nbsp;</p>



<p class="wp-block-paragraph">We faced many open questions that were impossible to ignore.&nbsp;</p>



<p class="wp-block-paragraph">Consider what you&#8217;d look for if someone were artificially inflating your SMS traffic and increasing your bill:&nbsp;</p>



<ul class="wp-block-list">
<li>Who is responsible?&nbsp;</li>
</ul>



<ul class="wp-block-list">
<li>How are they doing it?&nbsp;</li>
</ul>



<ul class="wp-block-list">
<li>Are they using multiple phones or virtual numbers?&nbsp;</li>
</ul>



<ul class="wp-block-list">
<li>Is it automated or human-operated?&nbsp;</li>
</ul>



<ul class="wp-block-list">
<li>What are the volumetric patterns in the traffic to watch for?&nbsp;&nbsp;</li>
</ul>



<h2 class="wp-block-heading">Let&#8217;s bring in the Data Scientists&nbsp;</h2>



<p class="wp-block-paragraph">It became clear that we needed a new approach to tackle this problem effectively.&nbsp;</p>



<p class="wp-block-paragraph">We decided to <strong>bring in a Data Science team</strong> to handle identifying traffic patterns. This allowed us to focus more on implementation, even though it still involved many uncertainties that we needed to address.&nbsp;</p>



<p class="wp-block-paragraph">Data scientists excelled at deciphering requirements, automating data processing, analyzing statistics, and detecting anomalies—tasks beyond traditional developer roles.&nbsp;</p>



<p class="wp-block-paragraph">Meanwhile, <strong>our operations team managed daily tasks and client interactions</strong>. This setup is crucial as our product expands, inevitably introducing greater complexity and unknowns.&nbsp;</p>



<h2 class="wp-block-heading"><span id="have-the-procedures-in-place">Have the procedures in place</span></h2>



<p class="wp-block-paragraph">So, returning to when we, the developers needed to decipher traffic patterns on our own &#8211; it was chaotic. We had unstructured blocks of text written from individual perspectives, yielding no actionable conclusions for implementation. </p>



<p class="wp-block-paragraph">Thus, <strong>we devised a structured procedure</strong> that resembles the following:&nbsp;</p>



<figure class="wp-block-image size-full"><img decoding="async" width="604" height="144" src="https://shiftmag.dev/wp-content/uploads/2024/09/Picture-1.png?x94846" alt="" class="wp-image-4350" srcset="https://shiftmag.dev/wp-content/uploads/2024/09/Picture-1.png 604w, https://shiftmag.dev/wp-content/uploads/2024/09/Picture-1-300x72.png 300w" sizes="(max-width: 604px) 100vw, 604px" /></figure>



<p class="wp-block-paragraph">This procedure involves rechecking results with the team at various stages, systematically reducing the uncertainty that plagued this stage of development. It also provides the flexibility to halt implementation at multiple checkpoints if needed.&nbsp;</p>



<p class="wp-block-paragraph">Most importantly, this approach compelled us to move forward and built in the capability to revert pattern detection to testing phases if issues arose.&nbsp;</p>



<h2 class="wp-block-heading"><span id="getting-our-hands-dirty">Getting our hands dirty&nbsp;</span></h2>



<p class="wp-block-paragraph">In our case, <strong>we conducted our investigation by engaging with our clients</strong>, who were highly cooperative and motivated to resolve the issue. To provide context, some reported annual losses they estimated at 60 million USD.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">This collaboration<strong> yielded valuable insights and fresh perspectives</strong> on the problem. For example, we learned that attackers were using VPNs to shuffle IP addresses, thwarting attempts to correlate IPs with phone numbers and to be able to identify bad actors more accurately. Such information was instrumental and beyond what we could have gathered independently. </p>



<p class="wp-block-paragraph">It&#8217;s always reassuring when your suspicions are confirmed, isn&#8217;t it? Even better when clients guide your development in the correct direction. </p>



<p class="wp-block-paragraph">On the research front, <strong>our focus was predominantly technical </strong>&#8211; determining which methods, algorithms, or technologies would effectively detect fraudulent traffic.&nbsp;</p>



<p class="wp-block-paragraph">Consider that we&#8217;re dealing with tens of thousands of messages per second, requiring processing that incorporates historical data analysis. This is a significant challenge. Therefore, it was essential for us to allocate sufficient time to validate the technical aspects of our solution.&nbsp;</p>



<h2 class="wp-block-heading">Don&#8217;t forget to backlog!</h2>



<p class="wp-block-paragraph">If we lacked sufficient information to implement suspicious traffic pattern detection, we simply deferred it to the backlog. It may sound like basic Agile development, but it&#8217;s crucial to regularly revisit these tasks and actively break them down. Often, as we advanced, new insights shed light on old problems, allowing us to resume work on them.&nbsp;</p>



<p class="wp-block-paragraph">Tasks like these are fundamental to the product and require heightened attention and frequent review.&nbsp;</p>



<p class="wp-block-paragraph">And always keep your backlog lean!&nbsp;</p>



<h2 class="wp-block-heading"><span id="measure-twice-and-cut-once">Measure twice and cut once</span></h2>



<p class="wp-block-paragraph">Considering complexity versus benefits, <strong>some features simply aren&#8217;t worth pursuing</strong>. There&#8217;s nothing wrong with discarding such ideas—it&#8217;s far better than implementing something incorrectly and enduring its consequences later. </p>



<p class="wp-block-paragraph">For instance, we encountered cases where intricate traffic analysis would only impact a minuscule fraction of mobile numbers, clearly falling into the &#8220;not worth it&#8221; category. However, most decisions aren&#8217;t as straightforward.&nbsp;</p>



<p class="wp-block-paragraph">Always <strong>consider key metrics</strong> (request volume, current loads, user numbers, etc.). This enables you to swiftly reject unnecessary or resource-intensive features before they integrate into your system.  </p>



<h2 class="wp-block-heading"><span id="fast-cycle-pocs">Fast cycle PoCs</span></h2>



<p class="wp-block-paragraph"><span style="box-sizing: border-box; margin: 0px; padding: 0px;">Don&#8217;t forget to <strong>c</strong></span>reate a proper Proof of Concept (PoC)—it may not necessarily make it to production but is crucial for testing ideas. Good component isolation ensures easy disabling or removal of these procedures if needed. </p>



<p class="wp-block-paragraph">Think of PoCs as experimental branches of a tree &#8211; some may thrive, others may not. Develop them with the Pareto principle in mind: focus on the 20% of features critical for the PoC to function 80% of the time.. This approach verifies whether the concept is viable for production. You might use it in production briefly to gather and analyze data or find it needs rewriting for scalability. </p>



<p class="wp-block-paragraph"><strong>Valuable concepts earn dedicated development time</strong>. Lack of allocated time can signal a feature&#8217;s lower priority or potential for removal.&nbsp;</p>



<p class="wp-block-paragraph">However, PoCs shouldn&#8217;t replace thorough planning; they&#8217;re ideal for situations where uncertainty requires gathering data before making a decision.&nbsp;</p>



<h2 class="wp-block-heading"><span id="remember-it-doesn%e2%80%99t-have-to-be-perfect">Remember, it doesn’t have to be perfect</span></h2>



<p class="wp-block-paragraph">Embracing probabilities was a shift for me, moving away from exact specifications to a world where <strong>uncertainties could still be valuable</strong>.&nbsp;</p>



<p class="wp-block-paragraph">Not everything needs to be perfectly accurate to be beneficial.&nbsp;</p>



<p class="wp-block-paragraph">While this advice might not directly apply to your project,<strong> the key is to remain open-minded</strong>. Recognize when you&#8217;re stuck in a mindset where every problem seems like a nail to be hammered. By stepping back, reflecting, and adjusting as necessary, you can navigate challenges more effectively.&nbsp;</p>



<h2 class="wp-block-heading"><span id="reaping-rewards">Reaping rewards</span></h2>



<p class="wp-block-paragraph">And what were the results? Speaking from my own experience, I can attest that this approach worked well for us. However, as we understand, the success of any project is often influenced by various factors, some of which are beyond our control.&nbsp;</p>



<p class="wp-block-paragraph">Ultimately, we achieved <strong>a profitable and moderately complex product</strong> with satisfied paying customers.&nbsp;</p>



<p class="wp-block-paragraph">In summary, this article can be condensed into two key steps:&nbsp;</p>



<ol class="wp-block-list">
<li><strong>Let the team grow</strong></li>
</ol>



<p class="wp-block-paragraph">Understanding and solving a problem takes time. I recently came across an article that emphasized the importance of this &#8211; hence the <a href="https://www.theregister.com/2024/06/05/agile_failure_rates/" target="_blank" rel="noreferrer noopener">268% higher failure rates for Agile software projects</a> (and no, I&#8217;m not advocating for waterfall methodology!).&nbsp;</p>



<p class="wp-block-paragraph">Often, the rush from receiving a feature request to implementation is too brief for thorough execution.&nbsp;</p>



<p class="wp-block-paragraph">The most successful methods allocate adequate time and effort to understanding and breaking down problems. This principle should be embraced by everyone, from project managers to developers. </p>



<p class="wp-block-paragraph">This approach not only results in effective solutions but also fosters team growth and diverse experiences. It allows for self-organization, learning opportunities, and extensive PoC development and builds confidence as the product evolves. </p>



<p class="wp-block-paragraph"><strong>2. Profit </strong></p>



<p class="wp-block-paragraph">Our efforts resulted in a <strong><a href="https://www.infobip.com/docs/signals" target="_blank" rel="noreferrer noopener">reliable solution trusted by dozens of clients</a></strong>, including leading global companies. They depend on us to block suspicious traffic effectively and reduce costs—an immense responsibility given the direct impact on their traffic volume. </p>



<p class="wp-block-paragraph"><strong>This trust has significantly increased our traffic</strong>, benefiting everyone involved.&nbsp;</p>



<p class="wp-block-paragraph">The challenge isn&#8217;t the unknowns themselves &#8211; they&#8217;re always present. It&#8217;s about how you approach and systematically address them, uncovering unexpected benefits along the journey.&nbsp;</p>
<p>The post <a href="https://shiftmag.dev/how-to-handle-any-mystery-project-that-falls-in-your-lap-3761/">How to handle any mystery project that falls in your lap</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>From a feature to a problem &#8211; from a problem to an opportunity</title>
		<link>https://shiftmag.dev/from-a-feature-to-a-problem-from-a-problem-to-opportunity-3744/</link>
		
		<dc:creator><![CDATA[Denis Gerić]]></dc:creator>
		<pubDate>Thu, 25 Jul 2024 11:11:31 +0000</pubDate>
				<category><![CDATA[Signals]]></category>
		<category><![CDATA[fake OTP traffic]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[Infobip Signals]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=3744</guid>

					<description><![CDATA[<p>Our feature for sending SMS to "Trusted MSISDNs" hit distribution snags in our microservices setup. This hiccup not only got us back on track but also sparked ideas for turbocharging our entire system.</p>
<p>The post <a href="https://shiftmag.dev/from-a-feature-to-a-problem-from-a-problem-to-opportunity-3744/">From a feature to a problem &#8211; from a problem to an opportunity</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-post-featured-image"><img decoding="async" width="1050" height="551" src="https://shiftmag.dev/wp-content/uploads/2024/07/new-feature-development.png?x94846" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2024/07/new-feature-development.png 1050w, https://shiftmag.dev/wp-content/uploads/2024/07/new-feature-development-300x157.png 300w, https://shiftmag.dev/wp-content/uploads/2024/07/new-feature-development-1024x537.png 1024w, https://shiftmag.dev/wp-content/uploads/2024/07/new-feature-development-768x403.png 768w" sizes="(max-width: 1050px) 100vw, 1050px" /></figure>


<p class="wp-block-paragraph">Houston, we have a problem!</p>



<p class="wp-block-paragraph">What the hell is going on?! <strong>Alerts started popping up everywhere</strong>, multiple services crashed and mass confusion arose between colleagues trying to pinpoint the center of the problem. </p>



<p class="wp-block-paragraph">This does not happen very often, and when it does, it usually involves a bigger problem that is out of our reach (Kafka problems, datacenter issues, etc.) and has nothing to do with our code, but this was not the case.</p>



<h2 class="wp-block-heading"><span id="let-me-present-you-the-feature"><strong>Let me present you the feature</strong></span></h2>



<p class="wp-block-paragraph">Our feature allowed our customers to import a <strong>large </strong><span style="box-sizing: border-box; margin: 0px; padding: 0px;"><strong>num</strong></span><strong>ber of mobile numbers and whitelist them,&nbsp;ensuring that the SMS that is sent to those numbers is not blocked at any moment,</strong> even if our analysis detected them as fraudulent. This ensured that traffic sent to those mobile numbers was always sent. We call these &#8220;Trusted MSISDNs&#8221;&nbsp;</p>



<p class="wp-block-paragraph">The problem was <strong>how we distributed those numbers to other services,</strong> which needed to be aware of this information.&nbsp;</p>



<h2 class="wp-block-heading">Our architecture wasn&#8217;t ready</h2>



<p class="wp-block-paragraph">Since we are working with microservice architecture<span style="box-sizing: border-box; margin: 0px; padding: 0px;">,&nbsp;<strong>we are using a configuration service to send configuration updates to other services using HTTP(RMI)</strong>. The configuration service also received information about Trusted MSISDNs, stored them in the database, and then sent them as&nbsp;</span>part of the configuration file to other services. This is where the problem started.&nbsp;</p>



<p class="wp-block-paragraph">We did not expect that a huge amount of Trusted MSISDNs would become a burden to our configuration file:&nbsp;</p>



<p class="wp-block-paragraph">1. <strong>Configuration files became much larger </strong>&#8211; resulting in HTTP timeouts&nbsp;&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">2. <strong>Serialization and De-serialization took more time and used much more RAM&nbsp;</strong></p>



<p class="wp-block-paragraph">3. Configurations were stored in memory and updated often, resulting in being <strong>too big for our virtual machine&nbsp;</strong></p>



<p class="wp-block-paragraph"><span style="box-sizing: border-box; margin: 0px; padding: 0px;">As a result, when services tried to fetch configuration,&nbsp;<strong>they either had timeouts all the time,</strong>&nbsp;making them work with non-updated configuration,&nbsp;<strong>or they fetched configuration and crashed</strong>&nbsp;because not enough RAM was added to the service to handle de-serialization.</span>&nbsp;&nbsp;</p>



<h2 class="wp-block-heading"><span id="you-cannot-think-of-everything">You cannot think of everything</span></h2>



<p class="wp-block-paragraph"><span style="box-sizing: border-box; margin: 0px; padding: 0px;">This functionality was developed first as a proof of concept, and eventually,&nbsp;<strong>it was improved to the point where we used it in production</strong>.</span> We followed the architecture we already had, and it worked well without apparent problems.&nbsp;</p>



<p class="wp-block-paragraph">Millions of numbers were imported, the UI tested, and the feature was in production for many weeks. Sometimes, you can&#8217;t think of everything, and in our case, the estimation of imported numbers was not big enough—and we thought big.</p>



<p class="wp-block-paragraph">We recognized that as our product evolves, <strong>our architecture must also adapt</strong> to accommodate our expanding customer base. This functionality received more attention than we initially thought, and we needed to change our approach.</p>



<h2 class="wp-block-heading"><span id="solving-http-issues-and-optimizing-future-features">Solving HTTP issues and optimizing future features</span></h2>



<p class="wp-block-paragraph">We have moved from RMI and <strong>started using Kafka to resolve our HTTP(RMI) issues</strong>, and the in-memory configuration was switched to Redis as a fast-responding database.&nbsp;</p>



<p class="wp-block-paragraph">The problem that occurred opened our eyes and made us take the first step in changing how we handled configurations. It also changed how we think about future features, where we already took different approaches and where a huge amount of data does not represent a problem.</p>



<p class="wp-block-paragraph">This alert showed us a potentially big problem over time that could be much harder to handle if it came all at once. It was time for a change.</p>



<h2 class="wp-block-heading">Crisis &#8211; &gt; Opportunity</h2>



<p class="wp-block-paragraph"><span style="box-sizing: border-box; margin: 0px; padding: 0px;">Problems sometimes&nbsp;<strong>lead us to resolv</strong></span><strong>e more than one issue and tackle core problems.</strong> However, due to our busy schedules, these issues never get the spotlight.&nbsp;</p>



<p class="wp-block-paragraph">Sometimes, unforeseen challenges can drive significant improvements, transforming crises into opportunities. You never know. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Maybe the problem you have today will make your life easier tomorrow.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">Embrace problems and good luck!</p>



<p class="wp-block-paragraph"><em>Find out more <span style="box-sizing: border-box; margin: 0px; padding: 0px;">a</span>bout&nbsp;<a href="https://www.infobip.com/developers/blog/how-to-fight-fake-otp-traffic-using-infobip-signals">how to combat fake OTP traffic</a>.</em></p>
<p>The post <a href="https://shiftmag.dev/from-a-feature-to-a-problem-from-a-problem-to-opportunity-3744/">From a feature to a problem &#8211; from a problem to an opportunity</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 

Served from: shiftmag.dev @ 2026-06-05 18:14:13 by W3 Total Cache
-->