<?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>software engineering Archives - ShiftMag</title>
	<atom:link href="https://shiftmag.dev/tag/software-engineering/feed/" rel="self" type="application/rss+xml" />
	<link>https://shiftmag.dev/tag/software-engineering/</link>
	<description>Insightful engineering content &#38; community</description>
	<lastBuildDate>Tue, 13 May 2025 13:17:09 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://shiftmag.dev/wp-content/uploads/2024/08/cropped-ShiftMag-favicon-32x32.png</url>
	<title>software engineering Archives - ShiftMag</title>
	<link>https://shiftmag.dev/tag/software-engineering/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Things ancient Romans taught me about software development </title>
		<link>https://shiftmag.dev/things-ancient-romans-taught-me-about-software-development-5214/</link>
		
		<dc:creator><![CDATA[Hrvoje Rancic]]></dc:creator>
		<pubDate>Tue, 13 May 2025 12:28:48 +0000</pubDate>
				<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Kent Beck]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[The Agile Manifesto]]></category>
		<category><![CDATA[Uncle Bob]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=5214</guid>

					<description><![CDATA[<p>History is the teacher of life. There are those who have been shipping software for decades, and there is much we can learn from them.</p>
<p>The post <a href="https://shiftmag.dev/things-ancient-romans-taught-me-about-software-development-5214/">Things ancient Romans taught me about software development </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="1536" height="1024" src="https://shiftmag.dev/wp-content/uploads/2025/04/software-engineering-philosophers.png?x91379" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2025/04/software-engineering-philosophers.png 1536w, https://shiftmag.dev/wp-content/uploads/2025/04/software-engineering-philosophers-300x200.png 300w, https://shiftmag.dev/wp-content/uploads/2025/04/software-engineering-philosophers-1024x683.png 1024w, https://shiftmag.dev/wp-content/uploads/2025/04/software-engineering-philosophers-768x512.png 768w" sizes="(max-width: 1536px) 100vw, 1536px" /></figure>


<h3 class="wp-block-heading"><span id="si-vis-pacem-para-bellum"><em>Si vis pacem, para bellum</em></span></h3>



<p>If you want peace, prepare for war. In other words, if you wish to handle traffic spikes, <strong>stress test the service</strong>. If it can handle twice the expected traffic, it will handle the expected traffic. A similar point was expressed by <strong>Kentus Becchus</strong>, who <a href="https://www.goodreads.com/quotes/10376041-write-tests-until-fear-is-transformed-into-boredom" target="_blank" rel="noreferrer noopener">famously wrote</a> <em>Scribe probationes donec timor in taedium mutetur</em>.</p>



<h3 class="wp-block-heading"><span id="aequam-memento-rebus-in-arduis-servare-mentem"><em>Aequam memento rebus in arduis servare mentem</em></span></h3>



<p>Remember to maintain a calm mind while doing difficult tasks. The natural response to a production outage is panicking. <a href="https://en.wikipedia.org/wiki/Phrases_from_The_Hitchhiker%27s_Guide_to_the_Galaxy#Don't_Panic" target="_blank" rel="noreferrer noopener"><strong>DON’T PANIC</strong></a>. Troubleshooting production issues is just an ordinary task with the highest priority.&nbsp;</p>



<h3 class="wp-block-heading"><span id="mens-sana-in-corpore-sano"><em>Mens sana in corpore sano</em></span></h3>



<p>A healthy mind in a healthy body. Software development involves a lot of thinking, but it also involves a lot of sitting, which is <strong>not a particularly healthy activity</strong>.&nbsp; To keep the mind fresh and sharp, sleep and physical activity are paramount, as <strong>Vladus Mihalcaeus</strong> <a href="https://x.com/vlad_mihalcea/status/1335981628322148354" target="_blank" rel="noreferrer noopener">has put</a> it <em>Somnus octo horarum optimus emendator est</em>.</p>



<h3 class="wp-block-heading"><span id="divide-et-impera"><em>Divide et impera</em> </span></h3>



<p>Divide and conquer. Apart from being <a href="https://en.wikipedia.org/wiki/Divide-and-conquer_algorithm" target="_blank" rel="noreferrer noopener">a well-known</a> algorithm design paradigm, it is a sound piece of advice: when faced with a complex task that takes a lot of time, <strong>divide it into a set of smaller tasks</strong> and handle those one at a time.&nbsp;&nbsp;</p>



<h3 class="wp-block-heading"><span id="ad-praesens-ova-cras-pullis-sunt-meliora"><em>Ad praesens ova cras pullis sunt meliora</em></span></h3>



<p>A bird in the hand is worth two in the bush. First implement the basic functionality<strong>,</strong> show it to the user, <strong>ask for feedback and iterate</strong>. The same idea is expressed in the old dictum from <a href="https://agilemanifesto.org/" target="_blank" rel="noreferrer noopener">the Manifestum</a> which teaches us to prefer working software over a mountain of requirements specifications. </p>



<h3 class="wp-block-heading"><span id="bene-vixit-bene-qui-latuit"><em>Bene vixit,&nbsp; bene qui latuit</em> </span></h3>



<p>He who remained hidden lived well. Although some malicious hackers may draw inspiration from this one, it is also inspiring to infrastructure engineers: if you break something, <strong>it will not go unnoticed</strong>.&nbsp;</p>



<h3 class="wp-block-heading"><span id="discere-faciendo"><em>Discere faciendo</em> </span></h3>



<p>Learn by doing. The mastery of software engineering cannot be attained only by speculative thought, reasoning from first principles, or by learning the sacred texts by heart, to learn how to build software it is necessary, but not sufficient, to build it.  </p>



<h3 class="wp-block-heading"><span id="panem-et-circenes"><em>Panem et circenes</em> </span></h3>



<p>Bread and circuses. A great deal of software engineering job is maintenance; it is necessary but not appreciated enough. To silence the murmurs, you need to show some impressive dashboard, shiny UI, or AI-related feature to management from time to time.  </p>



<h3 class="wp-block-heading"><span id="cessante-causa-cessante-effectus"><em>Cessante causa, cessante effectus </em></span></h3>



<p>When the cause ceases, the effect ceases. Unless you <strong>know the root cause of an incident</strong>, you cannot consider it resolved. Rebooting or scaling may resolve the issue temporarily, but this is just buying time to fix the real problem.&nbsp;</p>



<h3 class="wp-block-heading"><span id="verba-volant-littera-scripta-manent"><em>Verba volant, littera scripta manent</em>  </span></h3>



<p>Spoken words fly away, written ones remain. <strong>Agreements from meetings need to be written down</strong> in meeting notes, architectural decisions need to be documented, tasks need to have descriptions, when possible, agreements need to be expressed in code as automated checks. You will forget things!&nbsp;</p>



<h3 class="wp-block-heading"><span id="periculum-in-mora"><em>Periculum in mora</em> </span></h3>



<p>Danger in delay. Integrate code changes to main branch often and <strong>deploy often</strong>. The more you wait the harder it is to integrate the change and the riskier it is to deploy it.&nbsp;&nbsp;</p>



<h3 class="wp-block-heading"><span id="historia-est-magistra-vitae"><em>Historia est magistra vitae</em> </span></h3>



<p>History the teacher of life. As <strong>Patruus Bobus</strong> <a href="https://blog.cleancoder.com/uncle-bob/2014/06/20/MyLawn.html" target="_blank" rel="noreferrer noopener">points out</a> majority of programmers are not very experienced, however there are those who have been shipping software for decades, and there is much we can learn from them. <strong>Study their advice.&nbsp;</strong></p>



<h3 class="wp-block-heading"><span id="non-omnia-possumus-omnes"><em>Non omnia possumus omnes</em> </span></h3>



<p>We can’t all <span style="box-sizing: border-box; margin: 0px; padding: 0px;">do everything. It is easier to ship software in a<strong>&nbsp;cross-functiona</strong></span><strong>l </strong>team&nbsp;made up of<strong>&nbsp;</strong>people with different skill sets and roles.&nbsp;</p>



<h3 class="wp-block-heading"><span id="omnium-enim-rerum-principia-parva-sunt"><em>Omnium enim rerum principia parva sunt</em> </span></h3>



<p>The beginnings of all things are small. Big systems evolve from small systems. Create <a href="https://dannorth.net/best-simple-system-for-now/" target="_blank" rel="noreferrer noopener">the simplest thing that works well</a> and build on top of that. This was succinctly expressed by <strong>Johannes Gallus</strong> <a href="https://www.goodreads.com/quotes/9353506-a-complex-system-that-works-is-invariably-found-to-have" target="_blank" rel="noreferrer noopener">who wrote</a> <em>Systema complexum quod operatur, ex systemate simplici quod operavit ortum esse inventur</em>.</p>



<h3 class="wp-block-heading"><span id="pacta-sunt-servanda"><em>Pacta sunt servanda</em> </span></h3>



<p>Agreements must be kept. <strong>Take care not to break backwards compatibility</strong>. Take great care when designing APIs; if it exposes some functionality you did not intend to expose, do not whine when someone starts to use it. </p>



<h3 class="wp-block-heading"><span id="vinum-bonum-pax-in-domum"><em>Vinum bonum, pax in domum</em></span></h3>



<p>Good wine, peace in the house. Since <strong>building software is a group activity</strong>, it helps if members of the group can get along with each other. Occasional team building activity helps to foster a friendly atmosphere. </p>
<p>The post <a href="https://shiftmag.dev/things-ancient-romans-taught-me-about-software-development-5214/">Things ancient Romans taught me about software development </a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>There are 47 Million Developers in the World</title>
		<link>https://shiftmag.dev/there-are-47-million-developers-in-the-world-5200/</link>
		
		<dc:creator><![CDATA[Antonija Bilic Arar]]></dc:creator>
		<pubDate>Tue, 29 Apr 2025 17:29:42 +0000</pubDate>
				<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[developers]]></category>
		<category><![CDATA[how many developers]]></category>
		<category><![CDATA[SlashData]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=5200</guid>

					<description><![CDATA[<p>There are 50% more developers today than there were in 2022, but the number stopped growing in 2025. And they're getting older.</p>
<p>The post <a href="https://shiftmag.dev/there-are-47-million-developers-in-the-world-5200/">There are 47 Million Developers in the World</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="1200" height="630" src="https://shiftmag.dev/wp-content/uploads/2025/04/software-engineer.png?x91379" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2025/04/software-engineer.png 1200w, https://shiftmag.dev/wp-content/uploads/2025/04/software-engineer-300x158.png 300w, https://shiftmag.dev/wp-content/uploads/2025/04/software-engineer-1024x538.png 1024w, https://shiftmag.dev/wp-content/uploads/2025/04/software-engineer-768x403.png 768w" sizes="(max-width: 1200px) 100vw, 1200px" /></figure>


<p>As of the beginning of 2025, the estimated <strong>global developer population is over 47 million</strong>, according to a market research study by SlashData.<br><br>The number of professional developers <strong>increased from 21.8 million to 36.5 million</strong>, whereas the amateur developer population declined by over 1 million in the last year.<br><br>That&#8217;s 50% more software developers than in Q1 2022. The growth rate has varied, with a 15% increase from 2022 to 2023 and a <strong>21% spike from 2023 to 2024</strong>, attributed to post-pandemic investments and demand for digital services.</p>



<p>However, growth has decelerated to 10% in the last 12 months, indicating a shift towards a plateau in the developer ecosystem.</p>



<h2 class="wp-block-heading"></h2>



<p>The population estimates are derived using SlashData&#8217;s independent bottom-up methodology, which is based on reliable measurements from various sources. Data sources include the number of GitHub and Stack Overflow accounts, along with employment statistics from the USA and the European Union.<br><br>The methodology also incorporates data from their <strong>global developer survey</strong>, which has run 29 waves and reached over 10,000 developers globally in each wave, said <strong>Costas Korakitis</strong>, the director of research at SlashData.</p>



<h2 class="wp-block-heading"><span id="professional-and-amateur-developers"><strong>Professional and Amateur Developers</strong></span></h2>



<p>The professional developer population has grown significantly by 70% from 2022 to 2025, while the amateur developer segment has begun to contract. The number of professional developers has increased <strong>from 21.8 million to 36.5 million</strong>, while the amateur developer population experienced a <strong>decline of over 1 million in the last year</strong>.</p>



<p>This trend indicates that professionals remain in the field longer, while the traditional entry-level population is shrinking.</p>



<h2 class="wp-block-heading"><span id="developer-population-is-ageing"><strong>Developer Population is Ageing</strong></span></h2>



<p>The demographic profile of developers is gradually aging, with a decline in the percentage of developers aged 18 to 24 from 33% in early 2022 to 23% in early 2025.</p>



<p>At the same time, <strong>the share of developers aged 35 to 44 has increased from 22% to 26%</strong> during the same period.</p>



<p><strong>Western Europe and North Americ</strong>a continue to dominate the global developer population, each with approximately <strong>9.5 million developers</strong>. However, significant growth is happening in other regions, particularly in <strong>South Asia, which has nearly doubled its developer population</strong> from 4 million in 2022 to 7.5 million in 2025.</p>



<p><strong>Greater China has experienced explosive growth</strong>, tripling its developer population from 2.4 million to 5.8 million, driven by investments in education and local platforms. South America has also seen growth, increasing from 1.7 million to 3.4 million developers, with countries like Brazil and Argentina emerging as tech outsourcing hubs.</p>



<h2 class="wp-block-heading"><span id="more-backend-and-ai-less-mobile-developers"><strong>More Backend and AI, Less Mobile Developers</strong></span></h2>



<p>Web development remains the most popular application area, with <strong>over 23 million developers engaged in front-end and back-end applications.</strong></p>



<p>Backend services and data science/ML/AI applications are also significant focus areas for developers. At the same time, emerging sectors include the development of applications for third-party ecosystems and embedded software, which have experienced substantial growth since 2022.</p>



<p>Mobile app development and desktop applications have declined, possibly due to market saturation and rising acquisition costs.</p>



<h2 class="wp-block-heading"><span id="28-million-javascript-developers">28 million JavaScript Developers</span></h2>



<p><strong>JavaScript remains the most widely used programming language</strong>, with around 28 million users, followed closely by <strong>Java and Python, each with approximately 23 million users</strong>. Rust has emerged as the fastest-growing language, more than doubling its user base since 2022, driven by its focus on safety and performance.</p>



<p>Developer preferences are diversifying, with <strong>many using multiple languages</strong> depending on project requirements, indicating a shift towards selecting the right tools for specific tasks.</p>
<p>The post <a href="https://shiftmag.dev/there-are-47-million-developers-in-the-world-5200/">There are 47 Million Developers in the World</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to turn peak season chaos into a developer’s success story</title>
		<link>https://shiftmag.dev/how-to-turn-peak-season-chaos-into-a-developers-success-story-4816/</link>
		
		<dc:creator><![CDATA[Ivan Puskaric]]></dc:creator>
		<pubDate>Wed, 26 Feb 2025 13:11:23 +0000</pubDate>
				<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Black Friday]]></category>
		<category><![CDATA[load testing]]></category>
		<category><![CDATA[peak season infrastructure]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=4816</guid>

					<description><![CDATA[<p>Everyone experiences high-pressure days at work, but for our team Black Friday takes the crown.</p>
<p>The post <a href="https://shiftmag.dev/how-to-turn-peak-season-chaos-into-a-developers-success-story-4816/">How to turn peak season chaos into a developer’s success story</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="1200" height="630" src="https://shiftmag.dev/wp-content/uploads/2025/02/peak-season.png?x91379" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2025/02/peak-season.png 1200w, https://shiftmag.dev/wp-content/uploads/2025/02/peak-season-300x158.png 300w, https://shiftmag.dev/wp-content/uploads/2025/02/peak-season-1024x538.png 1024w, https://shiftmag.dev/wp-content/uploads/2025/02/peak-season-768x403.png 768w" sizes="(max-width: 1200px) 100vw, 1200px" /></figure>


<p>When high-demand periods hit, our clients<strong> inundate us with millions of messages</strong>, creating both objective and subjective stress. </p>



<p>On the objective side, the SMS processes we manage are <strong>vital to the company&#8217;s success</strong>, directly impacting revenue during critical moments. <a href="https://www.infobip.com/" target="_blank" rel="noreferrer noopener">Infobip</a> is a <strong>global B2B communication platform</strong>, so much of the communication from brands to their clients flows through us.</p>



<p>As you can imagine, <strong>the number of marketing SMS messages can skyrocket</strong> during promotional campaigns, holiday seasons, and product launches &#8211; not just on Black Friday. Handling tens of thousands of requests per second is no small feat. </p>



<p>Let’s explore how systematizing analysis, planning, and testing has eased the process &#8211; during peak times and throughout the year.</p>



<h2 class="wp-block-heading"><span id="expect-the-unexpected">Expect the unexpected!</span></h2>



<p>Perhaps it sounds <em>cliché</em>, but there’s a lot of truth to that phrase. If you don’t anticipate possible scenarios that could impact your system, many things will catch you off guard. </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>The goal is to <strong>reduce these surprises to a manageable level</strong>.</p>
</blockquote>



<p>We should all be familiar with <span style="box-sizing: border-box; margin: 0px; padding: 0px;">our systems&#8217; core functionaliti</span>es and main building blocks. These are typically described through happy path scenarios, which we test and monitor. While this is a good starting point,&nbsp;real stress doesn’t come from happy paths—it comes from the problems and failures that arise when things go wrong.</p>



<p>This is especially true for large-scale live products like ours, where maintaining top-tier availability and reliability is crucial. Managing risk means<strong> identifying the critical components</strong> in our application machinery, <strong>analyzing the impact of their failure, and determining how quickly we can recover or replace them</strong>.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>&#8216;We need to think about the unexpected&#8217; doesn&#8217;t mean we should anticipate a billion different problems. Instead, we should <strong>focus on groups of issues that could impact our critical processes</strong> &#8211; like network outages, database problems, or downstream service failures.</p>
</blockquote>



<p>This approach helps us create a matrix of processes, potential issues, and their impact.</p>



<p>Now that we know what we&#8217;re protecting and what we&#8217;re protecting against, we should <strong>develop plans for these scenarios and establish fallback solutions</strong>. This turns our initial uncertainty and fears into a sense of safety and confidence, even in situations beyond our control.</p>



<p>An important step in this process is to <strong>quantify everything</strong>. By making problems measurable, we can more easily automate both alerts and recovery processes.</p>



<h2 class="wp-block-heading"><span id="real-life-problems-for-sms">Real-life problems for SMS</span></h2>



<p>We identified that our crucial processes and properties include <strong>reliable message delivery, high throughput, and low latency</strong>.</p>



<p>High throughput is managed with an architecture that supports<strong> independent operation across nodes</strong>, allowing seamless scaling. Traffic peaks are handled through careful analysis and forecasting, ensuring adequate resources are in place.</p>



<p>We adopted <strong>a reactive programming approach </strong>to effectively address throughput and latency issues. This approach improves system responsiveness and scalability by efficiently handling asynchronous data streams.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Reliable message delivery is essential.</p>
</blockquote>



<p>However, we identified several issues that could compromise this reliability. As mentioned earlier, we did not attempt to address every potential issue but instead <strong>focused on the most critical problems</strong>, specifically the inability to send messages to the core processing system.</p>



<p>To mitigate these issues, we implemented <strong>persistent storage with retry mechanisms</strong> and established comprehensive monitoring to ensure prompt problem detection and resolution.</p>



<h2 class="wp-block-heading"><span id="rely-on-tests-not-assumptions">Rely on tests, not assumptions</span></h2>



<p>Assumptions can catch you off guard, especially when the system &#8211; and you &#8211; are pushed to the limit. If something seems to work but you&#8217;re unsure why, don&#8217;t rely on coincidences. Instead, address any uncertainties, assumptions, or potential coincidences by testing them while you still have time.</p>



<p>We use <strong>a suite of tests to validate the application&#8217;s functionalities through unit and integration testing, providing a solid foundation</strong>. However, since the application operates within a larger ecosystem, many challenges stem from its interactions with other systems.</p>



<p>End-to-end tests developed by our team can be executed as needed, which is highly beneficial. However, Black Friday brings significantly higher traffic and system stress. To prepare, <strong>we conduct intensive load testing well in advance</strong>.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>This testing <strong>brings together people from various sectors and applications</strong>, resulting in valuable insights that may not be obvious in daily operations. Much like frogs in gradually heated water fail to notice the danger, our applications can experience gradual performance degradation as they are built piece by piece. These issues often only surface during load testing.</p>
</blockquote>



<p><strong>Expectations continue to rise each year</strong>, driven by an increasing number of clients and higher system demands. One such challenge arose with message throughput: last year, expectations surged by 50%, and system performance dipped slightly due to various hardware and software changes. However, through timely load testing, we identified and resolved all issues, ensuring clients experienced seamless performance.</p>



<h2 class="wp-block-heading"><span id="real-life-bottlenecks-for-sms">Real-life bottlenecks for SMS</span></h2>



<p>We encountered a <strong>limitation in our storage solution</strong> that impacted performance during Black Friday. After research and testing, we successfully optimized the data flow logic to enhance efficiency.</p>



<p>We leveraged in-memory solutions more effectively, while the previously primary storage was now used only as a fallback. This change was logical, but altering the flow could introduce the risk of unexpected problems.</p>



<p>What was crucial in this process was our <strong>confidence in the testing we performed</strong>, including unit, integration, end-to-end, and load tests. This thorough testing ensured that we could make the change with assurance.</p>



<h2 class="wp-block-heading"><span id="work-once-benefit-many-times">Work once, benefit many times</span></h2>



<p>Don’t discard your tests and the effort behind them, just as you wouldn’t throw away your main code. <strong>Special load tests designed for Black Friday scenarios are stored as projects in our repositories</strong> and can be run as customizable Jenkins jobs. Load test servers can be created on demand, allowing us to run automated tests whenever needed on the data centers of our choice.</p>



<h2 class="wp-block-heading"><span id="organize-the-team-with-interchangeable-roles">Organize the team with interchangeable roles</span></h2>



<p>The team was maintaining a strong and reliable system, but at that time, it was mostly composed of relatively new employees.</p>



<p>By relying on one another and <strong>sharing knowledge</strong>, we built a flexible team with interchangeable roles. This reduced stress, enhanced collaboration, and allowed us to divide tasks, ensuring no one became overwhelmed.</p>



<h2 class="wp-block-heading"><span id="continuous-testing-brings-continuous-confidence">Continuous testing brings continuous confidence</span></h2>



<p>Think of it like this: &#8216;It’s easier to do one pushup a day than to try and do 365 all at once.&#8217; Similarly, <strong>continuous monitoring throughout the year</strong> reduces stress by keeping our system in shape over time. Rather than trying to boost performance after a year of development, regular checks and tests ensure steady progress.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>By testing every new feature as it&#8217;s implemented <strong>and conducting daily or ad-hoc load tests</strong>, we prevent performance bottlenecks from piling up. This approach allows for continuous development and avoids lengthy code freezes before major events.</p>
</blockquote>



<p>Consistency in testing and monitoring transforms uncertainty into confidence, keeping systems resilient and the team prepared to handle future needs.</p>
<p>The post <a href="https://shiftmag.dev/how-to-turn-peak-season-chaos-into-a-developers-success-story-4816/">How to turn peak season chaos into a developer’s success story</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>You&#8217;re not a senior engineer until you’ve worked on a legacy project</title>
		<link>https://shiftmag.dev/senior-software-engineer-legacy-code-4839/</link>
		
		<dc:creator><![CDATA[Alen Kosanovic]]></dc:creator>
		<pubDate>Mon, 27 Jan 2025 13:19:37 +0000</pubDate>
				<category><![CDATA[Career]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[legacy code]]></category>
		<category><![CDATA[legacy project]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=4839</guid>

					<description><![CDATA[<p>Everybody hates working on legacy projects, myself included. As fate would have it, one landed in my lap recently. </p>
<p>The post <a href="https://shiftmag.dev/senior-software-engineer-legacy-code-4839/">You&#8217;re not a senior engineer until you’ve worked on a legacy project</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-post-featured-image"><img loading="lazy" decoding="async" width="1200" height="630" src="https://shiftmag.dev/wp-content/uploads/2025/01/legacy-code.png?x91379" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2025/01/legacy-code.png 1200w, https://shiftmag.dev/wp-content/uploads/2025/01/legacy-code-300x158.png 300w, https://shiftmag.dev/wp-content/uploads/2025/01/legacy-code-1024x538.png 1024w, https://shiftmag.dev/wp-content/uploads/2025/01/legacy-code-768x403.png 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>


<p>Working on it didn’t make me hate legacy projects any less; it did help me get a deeper understanding of the processes and practices we use today. </p>



<p>I am proud that I am a part of a team that uses <strong>most of the best practices:</strong>&nbsp;</p>



<ul class="wp-block-list">
<li>Writing clean code and automated tests&nbsp;</li>



<li>Participating in pull requests and tasks reviews&nbsp;</li>



<li>The app is in production within the same day of merging into the master branch&nbsp;</li>



<li>Agile is well-adopted&nbsp;</li>
</ul>



<p> It’s not perfect. Pull requests sometimes contain trivial suggestions and discussions. The ops team usually messes something up (or at least that’s what we devs like to think). Our product owner occasionally wants us to fast-track some ‘easy’ features… again. But all in all, things are pretty good.&nbsp;</p>



<h2 class="wp-block-heading"><span id="a-trip-to-the-ant-museum">A trip to the Ant museum&nbsp;</span></h2>



<p>Since our team was performing well, our velocity was borrowed to another product, managed by another part of our company. We weren’t thrilled about it since the project <strong>uses an older version of Java, </strong>and the code wasn’t written the way we would do it. &nbsp;</p>



<p>The job was to add a few metrics – simple ones, like whether the app is running and for how long, is it processing data (fast enough). The project itself was in maintenance mode, and no new features had been added in a while. Since we are accustomed to adding metrics, this should have been a piece of cake.&nbsp;</p>



<p>Rolling up our sleeves, we first noticed that <strong>the project had been built using something very old - </strong><a href="https://en.wikipedia.org/wiki/Apache_Ant" target="_blank" rel="noreferrer noopener"><strong>Ant</strong></a><strong>  build files. </strong>They are big XML files that contain every piece of information on how to build the project in question. For example, you need to specify that the project needs to be compiled, tested, and packaged. All details like source, target, and resource location must be explicitly configured within those files. This used to be pretty common for many programming languages. You wrote a build file once, copied it on each new project, and then changed it until it worked for the new project. &nbsp;</p>



<p>Here’s what an Ant build file for a Hello World project would look like:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="692" src="https://shiftmag.dev/wp-content/uploads/2025/01/Screenshot-2025-01-27-at-14.07.35-1024x692.png?x91379" alt="" class="wp-image-4842" srcset="https://shiftmag.dev/wp-content/uploads/2025/01/Screenshot-2025-01-27-at-14.07.35-1024x692.png 1024w, https://shiftmag.dev/wp-content/uploads/2025/01/Screenshot-2025-01-27-at-14.07.35-300x203.png 300w, https://shiftmag.dev/wp-content/uploads/2025/01/Screenshot-2025-01-27-at-14.07.35-768x519.png 768w, https://shiftmag.dev/wp-content/uploads/2025/01/Screenshot-2025-01-27-at-14.07.35.png 1888w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>There must be a more convenient way to manage that, right? Well, that’s why the idea of <a href="https://en.wikipedia.org/wiki/Convention_over_configuration" target="_blank" rel="noreferrer noopener">convention over configuration</a> came to life, suggesting that developers only need to specify unconventional aspects of the application.&nbsp;<strong>Modern build tools have adopted</strong> <strong>this paradigm by providing developers with defaults that can be overridden if needed.</strong> That’s why most java source files are in src/main/java source, while the compiled classes are in the target folder—no need to specify this over and over.&nbsp;</p>



<p>That got us thinking about whether this approach would be helpful in our current projects. We had a huge application properties file, with most values having the same value (e.g., application port).&nbsp;<strong>Could we apply the same principle to our application properties?</strong>&nbsp;Most properties could have defaults, and our properties file wouldn’t be as large.&nbsp;</p>



<h2 class="wp-block-heading"><span id="things-we-take-for-granted">Things we take for granted</span></h2>



<p>Back to our legacy project – we managed to build and package our application! The tedious part was behind us, and we could start coding. But&nbsp;<strong>how do we embed our metrics component into the legacy code base</strong>? We took this for granted because our application framework usually handled it. &nbsp;</p>



<p>Now, what would be the best way to inject our metric components into various parts of the legacy code? Singletons! Well, it seemed the easiest way, at least, but the community considers them anti-patterns. Why? Isn’t our beloved XY framework relying on singletons? If not, what does it use? What is dependency injection? How does it function under the hood?&nbsp;</p>



<p><strong>These questions got us thinking about basic concepts that we took for granted</strong>. Using singletons wasn’t exactly a bad idea in this case since most of the code wasn’t covered with unit tests. Nevertheless, we couldn’t have a good night’s sleep unless the code was immaculate. We tried a different approach and ended up with decent and simple code – no singletons, no new abstractions.&nbsp;</p>



<h2 class="wp-block-heading"><span id="the-limited-role-of-developers">The limited role of developers&nbsp;</span></h2>



<p>The only thing left was to deploy it so that we could test it. This was a problem, of course—in this case, we were not the ones deploying or testing it.&nbsp;<strong>Deploying had to be done by the ops team, and testing by the test team.</strong>&nbsp;Why couldn’t we, as developers, manage the whole feature from start to production instead of opening tickets and waiting for other teams before we could close our task?</p>



<p>Firstly, we couldn’t avoid manual testing since much of the code wasn’t covered with tests. We also couldn’t deploy the application ourselves since the infrastructure didn’t allow us to. &nbsp;</p>



<p>This had us thinking about the reasons behind&nbsp;<strong>the separation of duties</strong>&nbsp;and&nbsp;<strong>how our current approach is better</strong>. Seeing that our lead and cycle time on this project was significantly higher than usual (it took us weeks to deliver something we usually deliver in several days), the evidence was strongly in favor of that.</p>



<h2 class="wp-block-heading"><span id="learn-outdated-practices-to-understand-current-ones">Learn outdated practices to understand current ones</span></h2>



<p>At the end of the <s>day</s> month, our metrics were up and running in production. My feelings about legacy projects haven’t changed – I still hate them, and I am not expecting you to hate them any less. &nbsp;</p>



<p>We couldn’t change the project we were assigned to, and these were the cards that we were dealt. What we could <strong>change is our attitude towards the legacy project</strong>. Instead of feeling resigned, we saw it as <strong>a place to ask questions and learn.</strong> &nbsp;</p>



<p>It taught us how things were done before and why they are done differently now. Instead of just knowing the best practices, we gained first-hand experience with the history behind them. &nbsp;</p>



<p>Once you start having this deep-rooted knowledge, other developers will recognize this and trust your knowledge and expertise. If you want to be that person, you better be ready to dig into some legacy projects.&nbsp;</p>
<p>The post <a href="https://shiftmag.dev/senior-software-engineer-legacy-code-4839/">You&#8217;re not a senior engineer until you’ve worked on a legacy project</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-04-30 21:44:28 by W3 Total Cache
-->