<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Global Engineering on Medium]]></title>
        <description><![CDATA[Stories by Global Engineering on Medium]]></description>
        <link>https://medium.com/@global-engineering?source=rss-9a5263157fc0------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*F9uha4sKYTeOeqEhnol2IQ.png</url>
            <title>Stories by Global Engineering on Medium</title>
            <link>https://medium.com/@global-engineering?source=rss-9a5263157fc0------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 23 May 2026 11:32:04 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@global-engineering/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[To What Extent Is Estimating Effort Beneficial to Squads: Does It Help or Hinder Us?]]></title>
            <link>https://engineering.global.com/to-what-extent-is-estimating-effort-beneficial-to-squads-does-it-help-or-hinder-us-edb82070b0f4?source=rss-9a5263157fc0------2</link>
            <guid isPermaLink="false">https://medium.com/p/edb82070b0f4</guid>
            <category><![CDATA[estimating]]></category>
            <category><![CDATA[storypoint-estimation]]></category>
            <category><![CDATA[estimations]]></category>
            <dc:creator><![CDATA[Global Engineering]]></dc:creator>
            <pubDate>Mon, 10 Jun 2024 10:02:35 GMT</pubDate>
            <atom:updated>2024-06-10T10:02:35.669Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/754/1*NrtyBxvgvswhK7aEsNpoWw.png" /></figure><p><em>By James Lawrence</em></p><p>In the world of agile development, estimating effort is a common practice. It involves predicting the amount of work required to complete a task, often quantified using story points. But does this practice actually benefit software teams, or does it create more obstacles than it removes?</p><p><strong>Key Definitions</strong></p><p>Before we go any further, it’s important to align on the meaning of the two terms below:</p><ul><li><strong>Estimating effort</strong> helps teams plan the amount of work they can realistically complete within a given timeframe.</li><li><strong>Story points</strong> are numerical values assigned to tasks based on their complexity, often following the Fibonacci sequence (0, 1, 2, 3, 5, 8, 13, etc.). These numbers help teams gauge the relative effort required for different tasks.</li></ul><p>When I first encountered these concepts, they seemed straightforward. However, I soon realised that estimation practices are highly subjective and can vary significantly between teams. This lead me to explore whether estimating effort is truly beneficial or if it might actually hinder team productivity; comparing the use of Story Points with the popular industry standard approach of #NoEstimates.</p><p><strong>Using Story Points</strong></p><p>In my role as a Delivery Manager for the Radio Fulfilment (aka gSchedule) team, I observed that our team lacked a consistent estimation process. The velocity (the number of story points committed vs. completed per sprint) appeared low due to inconsistent ticket sizing (despite a lot of work being done). This made it difficult to report on performance, confidently plan work going into sprints and create timelines.</p><p>To address this, I implemented a bucket system for estimation, where the team quickly discussed and sized all tickets into swim lanes. This method helped us calculate a more accurate velocity, averaging 56.4 points per sprint compared to the previous 9.4 points. The benefits were clear:</p><ul><li><strong>Accurate Reporting</strong>: Consistent estimation enabled more accurate performance tracking.</li><li><strong>Credible Planning</strong>: With reliable data, we could commit to release dates with greater confidence.</li><li><strong>Enhanced Coordination</strong>: Our improved planning process facilitated better coordination with other teams, especially as we moved towards self-service.</li></ul><p><strong>The No Estimates Approach</strong></p><p>Not all teams find value in estimating effort. The #NoEstimates movement, popularized by Woody Zuill, questions the purpose and effectiveness of traditional estimation methods. Here’s why some teams prefer not to estimate:</p><ul><li><strong>Focus on Value</strong>: Shifting focus from estimating tasks to delivering customer value encourages prioritizing features based on their importance rather than complexity.</li><li><strong>Reduced Overhead</strong>: Estimating can be time-consuming and sometimes leads to unproductive disagreements within the team.</li><li><strong>Improved Collaboration</strong>: Less time spent on estimation means more time for collaboration and breaking down work into smaller, manageable tasks.</li></ul><p>For instance, the gPO team works in Kanban and does not estimate effort. Instead, they track the average weekly number of tickets completed. This then allows them to monitor throughput by comparing the issues created versus resolved against their average.</p><p><strong>Comparing the Two Approaches</strong></p><p>Both techniques have pros and cons; their effectiveness can also depend on the team’s experience and working style.</p><h4><strong>Story Points</strong></h4><p><strong>Pros</strong>:</p><ul><li><strong>Versatile Planning</strong>: Allows teams to adjust their plans based on the specific work at hand.</li><li><strong>Momentum</strong>: Anecdotally, developers who size their own work can feel a greater sense of ownership and drive to meet delivery goals.</li></ul><p><strong>Cons</strong>:</p><ul><li><strong>Time-Consuming</strong>: Estimation can lead to lengthy discussions and disagreements.</li><li><strong>Inconsistent Reference Points</strong>: Without regular reflection, the accuracy of estimates can vary over time.</li></ul><h4><strong>No Estimates</strong></h4><p><strong>Pros</strong>:</p><ul><li><strong>More Time for Development</strong>: Developers spend less time on estimation and more on actual development.</li><li><strong>Agile Focus</strong>: Prioritises features based on user value rather than complexity.</li></ul><p><strong>Cons</strong>:</p><ul><li><strong>Consistency and Experience in Story Splitting Required</strong>: Throughput tracking without estimating requires tickets to be of a similar size, so that the calculated average accurately represents the throughput. Stories must be broken down consistently to the same granular level eg. ~3 days or less to complete each Story.</li></ul><p><strong>Conclusion: Does Estimating Effort with Story Points Help or Hinder?</strong></p><p>Based on my personal experience, I believe that estimating with Story Points is beneficial. Particularly for newer or changing teams that could benefit from a clear structure and more driven communication. For the Radio Fulfilment example, implementing a consistent estimation process improved visibility over our throughput and planning accuracy.</p><p>It’s important to note that, estimation practices should evolve with the team — it’s important to keep the technique relevant to current performance and needs.</p><p>Ultimately, the approach used to estimate effort depends on the team. It is a subjective technique and there isn’t a “correct” way of doing it. Teams should choose the method that best supports their workflow, ensuring they base their planning and reporting on accurate data. Regardless of the approach, tracking progress consistently and with team buy-in is crucial for delivering work with credibility.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=edb82070b0f4" width="1" height="1" alt=""><hr><p><a href="https://engineering.global.com/to-what-extent-is-estimating-effort-beneficial-to-squads-does-it-help-or-hinder-us-edb82070b0f4">To What Extent Is Estimating Effort Beneficial to Squads: Does It Help or Hinder Us?</a> was originally published in <a href="https://engineering.global.com">Global Technology Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Help Desk: A Jack of All Trades]]></title>
            <link>https://engineering.global.com/help-desk-a-jack-of-all-trades-25245562b73c?source=rss-9a5263157fc0------2</link>
            <guid isPermaLink="false">https://medium.com/p/25245562b73c</guid>
            <category><![CDATA[helpdesk]]></category>
            <dc:creator><![CDATA[Global Engineering]]></dc:creator>
            <pubDate>Thu, 30 May 2024 13:40:12 GMT</pubDate>
            <atom:updated>2024-05-30T13:40:12.652Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*h2ZSjqNcyx-VIqD9LE0STg.jpeg" /></figure><p><em>By Ali Ammani</em></p><p>Welcome to the world of help desk, where technical expertise meets exceptional customer service. In today’s digital age, organisations heavily rely on help desks to provide timely assistance and efficiently resolve technical issues. This blog post will delve into the intricacies of help desk operations, exploring key applications such as Microsoft Azure, Active Directory, Endtune, and ServiceNow, while also highlighting the crucial role of people-help aspects such as logging tickets.</p><p>At the core of every help desk lies a robust ecosystem of applications designed to streamline support processes and enhance user experience. Microsoft Azure (a cloud computing service) empowers help desk teams like mine to manage resources, deploy applications, and monitor performance seamlessly. Active Directory plays a vital role in identity management, facilitating user authentication, access control, and group policy management. Endtune (a comprehensive endpoint management solution) enables help desk professionals to configure, monitor, and troubleshoot devices across the organisation. And ServiceNow (a leading IT service management platform) serves as the central hub for logging, tracking, and resolving support tickets, ensuring transparency and accountability in the resolution process.</p><p>Beyond the daily support of applications, the success of a help desk lies in its ability to provide compassionate and effective support to end-users. Logging tickets serves as the initial point of contact between users and help desk agents, laying the foundation for a seamless support journey. Whether it’s resolving technical issues, providing guidance on software usage, or offering troubleshooting tips, help desk agents play a pivotal role in addressing user concerns and restoring productivity. By fostering a culture of empathy, patience, and professionalism, help desk teams can cultivate trust and confidence among users, strengthening the organisation’s overall IT infrastructure.</p><p>To optimise help desk operations and deliver exceptional service, organisations can implement the following best practices:</p><p>- <strong>Proactive Monitoring</strong>: Leveraging tools like Microsoft Azure and Endtune to proactively monitor system performance, identify potential issues, and take pre-emptive action to prevent disruptions.</p><p>- <strong>Streamlined Ticket Management:</strong> Utilising ServiceNow to streamline ticket logging, assignment, and resolution processes, ensuring prompt response times and efficient case handling.</p><p>- <strong>Continuous Training:</strong> Investing in ongoing training and development programmes to equip help desk agents with the latest technical skills and customer service techniques, empowering them to deliver superior support experiences.</p><p>- <strong>Knowledge Base Management:</strong> Maintaining a comprehensive knowledge base containing troubleshooting guides, FAQs, and best practices, enabling help desk agents to access relevant information quickly and efficiently.</p><p>- <strong>Performance Metrics Tracking:</strong> Monitoring key performance indicators such as first-call resolution rate, average response time, and customer satisfaction scores to measure help desk effectiveness and identify areas for improvement.</p><p>In conclusion, the help desk serves as a cornerstone of support within a business, providing technical expertise and assistance to end-users across the board. By leveraging great applications, while prioritising the people-help aspects of support, organisations like Global can create a positive and productive network that impacts every employee and serves as a catalyst for success.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=25245562b73c" width="1" height="1" alt=""><hr><p><a href="https://engineering.global.com/help-desk-a-jack-of-all-trades-25245562b73c">Help Desk: A Jack of All Trades</a> was originally published in <a href="https://engineering.global.com">Global Technology Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Unlocking the Power of AI with Effective Prompt Engineering]]></title>
            <link>https://engineering.global.com/unlocking-the-power-of-ai-with-effective-prompt-engineering-194f6d380601?source=rss-9a5263157fc0------2</link>
            <guid isPermaLink="false">https://medium.com/p/194f6d380601</guid>
            <category><![CDATA[prompt-engineering]]></category>
            <dc:creator><![CDATA[Global Engineering]]></dc:creator>
            <pubDate>Wed, 22 May 2024 14:45:25 GMT</pubDate>
            <atom:updated>2024-05-24T09:25:06.708Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PLxKnkjjHnLil0xMpjaeqQ.png" /></figure><p><em>By Marlon Gaspar</em></p><h4><strong>Understanding Prompts in Generative AI</strong></h4><p>A prompt acts as the primary interface between the user and generative AI models. This interaction is predominantly textual; you instruct the model via text, and the model executes the task based on your directions. Essentially, the prompt is your way of communicating what you want the AI to achieve.</p><p>For large language models (LLMs) such as GPT-4, prompts can range widely. They might be as straightforward as a query like “What is 1 + 1?” or as complex as a problem statement embedded with various data types, including raw data from a CSV file.</p><h4><strong>Understanding Prompt Engineering</strong></h4><p>Now that we’ve explored what a prompt is, let’s delve into the field of prompt engineering.</p><p>I like this succinct definition from McKinsey &amp; Company “Prompt engineering is the practice of designing inputs for generative AI tools that will produce optimal outputs.” As an analogy think of prompt engineering as a master chef crafting a gourmet recipe. Just as the chef carefully selects and combines ingredients to create a perfect dish, a prompt engineer carefully chooses words and structures them to elicit the desired output from an AI.</p><p>Continuing the chef analogy, prompt engineering blends domain knowledge with an understanding of different AI models. Essentially, the same way a chef must have an idea of what they want to cook before actually cooking and that the same ingredients yield different results under various methods, a prompt engineer must have a vision of their goals before prompting and recognise that different AI models respond uniquely to the same prompts.</p><h4><strong>The Business Case for Prompt Engineering</strong></h4><p>While the benefits of prompt engineering in enhancing AI interactions with Large Language Models (LLMs) such as ChatGPT and Claude are clear to those familiar with the field, they might not be as obvious to everyone. To clarify, here are four compelling reasons why businesses should consider incorporating prompt engineering:</p><ol><li><strong>Improved Accuracy and Relevance:</strong> Prompt engineering fine-tunes the interaction between users and AI, leading to more accurate and relevant responses.</li><li><strong>Increased Efficiency:</strong> By optimising prompts, businesses can reduce the time and resources spent on revising outputs. Efficient prompts lead to better first-time responses, speeding up workflows and reducing the need for follow-up queries.</li><li><strong>Innovative Use Cases and Applications:</strong> Well-crafted prompts can unlock new capabilities and applications for AI, from personalised marketing campaigns to advanced data analysis.</li><li><strong>Competitive Advantage:</strong> Businesses that master prompt crafting can leverage AI more effectively than their competitors, leading to enhanced operational capabilities.</li></ol><h4><strong>Principles of Prompt Engineering</strong></h4><p>With a solid understanding of what prompt engineering is and its benefits, we now turn our attention to the core principles that should guide every prompt creation process for Large Language Models (LLMs). These principles are essential for crafting effective and efficient prompts that maximise the AI’s capabilities.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UDVFbmNMohhI0WGUZgBHUw.png" /></figure><p>With the key principles of prompt engineering in mind, consider the example below. Analyse the prompt, identify which principles it violates, and think about how you might modify it to improve both the prompt and the resulting output. This exercise is designed to test your ability to integrate these principles into your approach to prompting.</p><p><em>Exercise Example:</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/820/1*1_y8dToMCwLlPveXytGepg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/904/1*-dPLbKPYv0LRXmDMOva6_Q.png" /></figure><p><em>Task:</em></p><ol><li>Identify Violations: Examine the prompt and list which of the six principles it breaches.</li><li>Propose Improvements: Suggest how to rephrase the prompt to make it more effective based on the principles outlined earlier.</li></ol><p><em>Bonus Points:</em> You identify issues beyond the principles I gave you.</p><p>Discussion: Reflect on how your proposed changes could alter the AI’s response, potentially making it more precise and relevant to the user’s needs.</p><h4><strong>Foundational Prompt Engineering Techniques</strong></h4><p>Now stepping into techniques, below is an overview of more common techniques which you can deploy in your prompts while also considering the principles I gave you earlier.</p><p><strong>Few shot prompting:</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/641/1*JzmzB31tLujB7uAsOpONnw.png" /><figcaption>Image source: <a href="https://newsletter.theaiedge.io/p/prompt-engineering-and-llmops-building">https://newsletter.theaiedge.io/p/prompt-engineering-and-llmops-building</a></figcaption></figure><p>Description:<strong> </strong>Few-shot prompting is a technique where demonstrations or examples are included in the prompt.</p><p><em>Example:</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/606/1*2l7NDcJSjbevGDSJ_SvCtw.png" /><figcaption>Image source: <a href="https://the-prompt-engineer.beehiiv.com/p/3-fewshot-prompting">https://the-prompt-engineer.beehiiv.com/p/3-fewshot-prompting</a></figcaption></figure><p><strong>Chain of thought prompting:</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/644/1*lJ548UuliLBKjPVcZR1q3A.png" /><figcaption>Image source: <a href="https://newsletter.theaiedge.io/p/prompt-engineering-and-llmops-building">https://newsletter.theaiedge.io/p/prompt-engineering-and-llmops-building</a></figcaption></figure><p>Description: Chain of thought (CoT) is a technique that structures an input prompt in a way that mimics human reasoning.</p><p><em>Example:</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/904/1*7Vb7BrXcnXT3Ni7PRVgFEg.png" /><figcaption>Image source: <a href="https://www.promptingguide.ai/">https://www.promptingguide.ai/</a></figcaption></figure><p><strong>Positive Prompting</strong></p><p>A common and effective strategy in prompt engineering is to emphasize what the model should do rather than what it should avoid. This approach encourages specificity and directs attention toward the details that are crucial for eliciting good responses from the model.</p><p><em>Example:</em></p><blockquote>Instead of saying, “Don’t give me too much technical jargon,” rephrase the prompt to say, “Use simple language and avoid technical jargon.” This tells the model exactly how to tailor the response to meet your needs.</blockquote><p><strong>Leading Words</strong></p><p>Instructing a model to “think step by step” before generating a response can lead to more accurate and reliable results. This technique, known as using “leading words,” strategically guides the model toward a more structured problem-solving approach.</p><p><strong>Ensuring clarity in your prompts</strong></p><p>Just as quotation marks, bullet points, and line breaks make text easier for us to parse, these formatting elements also enhance the readability for LLMs.</p><h4><strong>Advanced Prompt Engineering Techniques</strong></h4><p>Below are some examples of more advanced techniques which you could consider using where the foundational techniques mentioned previously are not quite up to par or suitable.</p><p><strong>Self-Consistency:</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/812/1*th3M4Qfovd26vSHLqbkjPg.png" /><figcaption>Image source: <a href="https://newsletter.theaiedge.io/p/prompt-engineering-and-llmops-building">https://newsletter.theaiedge.io/p/prompt-engineering-and-llmops-building</a></figcaption></figure><p>Description: Diverse reasoning paths are sampled in few-shot CoT, selecting the most consistent answer to enhance performance in tasks like arithmetic and common sense reasoning.</p><p><em>Example:</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*a2s6GL8ECyFpEdOr357bUA.png" /><figcaption>Image source: <a href="https://learnprompting.org/docs/intermediate/self_consistency">https://learnprompting.org/docs/intermediate/self_consistency</a></figcaption></figure><p><strong>Prompt chaining:</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/364/1*0J-1pAiOZhrYfjJg97BsIw.png" /><figcaption>Image source: <a href="https://newsletter.theaiedge.io/p/prompt-engineering-and-llmops-building">https://newsletter.theaiedge.io/p/prompt-engineering-and-llmops-building</a></figcaption></figure><p>Description: Prompt chaining uses sequential prompts to guide language models through complex, multi-step tasks.</p><p><em>Example:</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/682/1*tlC6jDLWmieGu-_LByYnXw.png" /><figcaption>Image source: <a href="https://cohere.com/blog/chaining-prompts">https://cohere.com/blog/chaining-prompts</a></figcaption></figure><p><strong>Tree of thought:</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/990/1*8cp8YbxXB93a8TZLFPyieQ.png" /><figcaption>Image source: <a href="https://www.promptingguide.ai/techniques/tot">https://www.promptingguide.ai/techniques/tot</a></figcaption></figure><p>Description: Tree of thought prompting” is a method that structures thinking like a tree. It begins with a central idea, the main trunk, and expands into related subtopics, the branches.</p><p><em>Example:</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1022/1*oGKtQdmZlOLgx41arg17rw.png" /><figcaption>Image source: <a href="https://blog.searce.com/tree-of-thought-prompting-unleashing-the-potential-of-ai-brainstorming-9a77a7d640b7">https://blog.searce.com/tree-of-thought-prompting-unleashing-the-potential-of-ai-brainstorming-9a77a7d640b7</a></figcaption></figure><p><strong>Tailoring Solutions for Specific Needs</strong></p><p>Prompt engineering also encompasses more specialised methods that can be particularly beneficial for Businesses. In this section, we explore two such methods: Retrieval-Augmented Generation (RAG) and the use of agents.</p><p><strong>Retrieval-Augmented Generation (RAG):</strong></p><p>Retrieval-augmented generation combines the capabilities of a standard language model with the power of information retrieval systems. This technique enhances the model’s responses by allowing it to access and incorporate external data dynamically.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/783/1*ZUbpTv5acQJ7fso6bs8oFg.png" /><figcaption>Image source: <a href="https://deci.ai/blog/fine-tuning-peft-prompt-engineering-and-rag-which-one-is-right-for-you/">https://deci.ai/blog/fine-tuning-peft-prompt-engineering-and-rag-which-one-is-right-for-you/</a></figcaption></figure><p><strong>Potential application of RAG within Business operations</strong></p><ul><li><strong>Internal chatbot</strong>: Enhances accuracy and timeliness of responses in internal chatbots, helping employees access up-to-date company policies.</li></ul><p><strong>The Use of Agents:</strong></p><p>Agents in prompt engineering refer to specialised prompts that instruct the AI to act as an intermediary or facilitator in achieving complex tasks. These agents can manage multi-step operations or handle tasks that require a series of interactions.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/644/1*RE20JPOWLABVO_qBc4QdXg.png" /><figcaption>Image source: <a href="https://www.promptingguide.ai/research/llm-agents">https://www.promptingguide.ai/research/llm-agents</a></figcaption></figure><p><strong>Potential applications of Agents within business operations:</strong></p><ul><li><strong>Post-campaign analysis: </strong>Automates the creation of detailed PowerPoint slides for marketing campaign analysis.</li></ul><h4><strong>Call to action</strong></h4><p>Now that we’ve explored prompt engineering, it’s clear that there are significant opportunities for both individual employees and businesses as a whole to harness these capabilities. Here are some practical steps we can take to integrate and benefit from prompt engineering in businesses:</p><p><strong>Actions for Individual employees:</strong></p><p><strong>1. Enhance Your Skill Set</strong></p><ul><li>Engage in workshops and training sessions provided by your employer</li><li>Consider completing a free course on prompt engineering:</li></ul><p><a href="https://www.deeplearning.ai/short-courses/chatgpt-prompt-engineering-for-developers/">https://www.deeplearning.ai/short-courses/chatgpt-prompt-engineering-for-developers/</a></p><p><a href="https://www.youtube.com/watch?v=kCc8FmEb1nY">https://www.youtube.com/watch?v=kCc8FmEb1nY</a></p><p><a href="https://www.youtube.com/watch?v=dOxUroR57xs">https://www.youtube.com/watch?v=dOxUroR57xs</a></p><ul><li>Use daily tasks as opportunities to practice and refine your prompt crafting skills.</li><li>Refer to the resource section included and have a look through some of the links for an even greater depth in Prompt engineering.</li><li>Remain Informed on the latest AI initiatives within your company and at large.</li></ul><p><strong>2. Innovate and Share</strong></p><ul><li>Test out different prompts in your work area and observe the outcomes. Document these experiments and share your insights with colleagues.</li><li>If you are currently using AI tools in your work area and find them useful share them with others either directly in conversation or via posts on relevant channels.</li></ul><p><strong>Actions for Businesses:</strong></p><p><strong>1. Invest in Resources</strong></p><ul><li>Acquire or subscribe to AI platforms and tools that allow non-experts to experiment with and deploy AI models.</li><li>Build a comprehensive repository of best practices, successful prompts, and troubleshooting tips accessible to all employees.</li><li>Offer training to understand AI technologies and prompt engineering basics. Online courses, workshops, webinars or even blogs like this one can be valuable.</li></ul><p><strong>2. Foster a Culture of Continuous Improvement</strong></p><ul><li>Recognise and reward individuals and teams who contribute significantly to advancing our prompt engineering capabilities.</li></ul><h4><strong>Resources for Further Reading</strong></h4><p>To deepen your understanding of prompt engineering, I’ve compiled a list of resources that have been instrumental in shaping the insights shared in this blog. These resources are categorised to help you navigate according to your interests, needs and level of current understanding:</p><p>1) Well-rounded source for overviews and detailed information: <a href="https://www.promptingguide.ai/readings">https://www.promptingguide.ai/readings</a></p><p>2) More focused on their own models but still a good general source: <a href="https://community.openai.com/c/prompting/8/l/top">https://community.openai.com/c/prompting/8/l/top</a></p><p>2a) <a href="https://platform.openai.com/docs/guides/prompt-engineering/strategy-write-clear-instructions">https://platform.openai.com/docs/guides/prompt-engineering/strategy-write-clear-instructions</a></p><p>3) Very advanced content: <a href="https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/">https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/</a></p><p>4) Additional resource to consider: <a href="https://github.com/brexhq/prompt-engineering">https://github.com/brexhq/prompt-engineering</a></p><p>5) Comprehensive list of 26 principles for prompt crafting: <a href="https://arxiv.org/pdf/2312.16171v1.pdf">https://arxiv.org/pdf/2312.16171v1.pdf</a></p><p>6) Encompasses beginner to advanced content: <a href="https://promptengineering.org/">https://promptengineering.org/</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=194f6d380601" width="1" height="1" alt=""><hr><p><a href="https://engineering.global.com/unlocking-the-power-of-ai-with-effective-prompt-engineering-194f6d380601">Unlocking the Power of AI with Effective Prompt Engineering</a> was originally published in <a href="https://engineering.global.com">Global Technology Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Data Pipelines: A Simple Guide for Beginners]]></title>
            <link>https://engineering.global.com/data-pipelines-a-simple-guide-for-beginners-e6c9fedbe0e1?source=rss-9a5263157fc0------2</link>
            <guid isPermaLink="false">https://medium.com/p/e6c9fedbe0e1</guid>
            <category><![CDATA[data-pipeline]]></category>
            <dc:creator><![CDATA[Global Engineering]]></dc:creator>
            <pubDate>Thu, 09 May 2024 12:42:42 GMT</pubDate>
            <atom:updated>2024-05-09T12:42:42.994Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bmjiKW9tQxK3e_DYXbe56Q.png" /></figure><p><em>By Alex Mickhael</em></p><p>In today’s world, where data is crucial for making smart decisions and staying ahead, efficient data handling is key. At the core of managing data is a vital concept: data pipelines. Let’s explore what they are, why they matter, and how they function.</p><p><strong>What are Data Pipelines?</strong></p><p>At its core, a data pipeline is a series of interconnected steps that facilitate the flow of data from its source to its destination. Think of it as a conveyor belt that transports raw data through various stages of processing, transformation, and storage, ultimately delivering valuable insights that drive business decisions.</p><p><strong>Why are Data Pipelines Important?</strong></p><p>Data pipelines play a crucial role in modern data architecture for several reasons:</p><p><strong>Efficiency:</strong> They automate data tasks like gathering, transforming, and loading, making workflows smoother and saving time and effort.</p><p><strong>Scalability:</strong> With data growing rapidly, pipelines handle larger loads without losing speed or reliability.</p><p><strong>Reliability</strong>: Pipelines include features for managing errors, validating data, and ensuring its quality, maintaining the trustworthiness of the processed data.</p><p><strong>Real-time Insights</strong>: Thanks to real-time processing, pipelines deliver timely insights, empowering businesses to react swiftly to market changes.</p><p><strong>How Do Data Pipelines Work?</strong></p><p>Data pipelines manage the journey of data from its source to its destination. Here’s a closer look at how they operate:</p><p><strong>Data Sources</strong>: These are where data comes from, like databases or applications. Pipelines pull data from these sources.</p><p><strong>Data Ingestion:</strong> Once data is pulled, it’s brought into the pipeline. This can happen in batches or in real-time.</p><p><strong>Data Processing:</strong> Inside the pipeline, data is cleaned, transformed, and structured for analysis. This ensures it’s ready to be used effectively.</p><p><strong>Data Storage:</strong> Processed data needs a place to stay. It’s stored in databases or data lakes until it’s needed for analysis.</p><p><strong>Data Orchestration:</strong> Data pipelines have many steps. Orchestration tools manage these steps, ensuring they happen in the right order and on time.</p><p><strong>Conclusion</strong></p><p>In conclusion, data pipelines are essential components of modern data architecture, enabling organizations to efficiently process and analyse large volumes of data from diverse sources. By understanding the importance of data pipelines and how they work, organisations can build robust data processing workflows that drive actionable insights and informed decision-making.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e6c9fedbe0e1" width="1" height="1" alt=""><hr><p><a href="https://engineering.global.com/data-pipelines-a-simple-guide-for-beginners-e6c9fedbe0e1">Data Pipelines: A Simple Guide for Beginners</a> was originally published in <a href="https://engineering.global.com">Global Technology Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Leak Detector]]></title>
            <link>https://global-engineering.medium.com/leak-detector-44deb849f006?source=rss-9a5263157fc0------2</link>
            <guid isPermaLink="false">https://medium.com/p/44deb849f006</guid>
            <category><![CDATA[prometheus]]></category>
            <category><![CDATA[java-heap-memory]]></category>
            <category><![CDATA[java-reflection]]></category>
            <category><![CDATA[java]]></category>
            <dc:creator><![CDATA[Global Engineering]]></dc:creator>
            <pubDate>Tue, 07 May 2024 10:34:13 GMT</pubDate>
            <atom:updated>2024-05-07T10:34:13.257Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*8cHykkc6w6C-0xLX" /></figure><p>By <a href="https://sakurajima.social/@t1rx">Kamran Bhatti</a></p><h3>Introduction</h3><p>Lets set the scene a bit. You get ready to start working on something when your phone gets pinged, theres been an alert for production. Your heart sinks a bit hoping its a miss fire but you check the alert and see its because JVM heap memory is too high. You inspect your metrics in grafana and see JVM heap memory has been steadily increasing over the past 4 hours and objects arent being collected correctly. You wonder if it was because of something you deployed into production just a couple days ago and start trying to diagnose the issue by grabbing some heap dumps to investigate which objects are still retained on the heap.</p><p>Hopefully this isnt a common occurrence but, no matter how much testing you perform, there will always be edge cases which cause issues in production. One that gave us a lot of trouble would be histogram timers. In this post, im going to walk through how we’ve used reflection to help us diagnose histogram timers not ending correctly and how using reflection just a tiny bit might be a good thing in high performance applications.</p><h3>Background on reflection</h3><h3>What is it?</h3><p>It allows us to inspect/modify classes, interfaces, fields and methods. We could also instantiate new objects, invoke methods and get/set field values regardless of their access modifiers.</p><h3>When should it be used?</h3><p>If you want to access methods, fields, classes or interfaces where they are set to final, private or protected, reflection can be very useful. In any other scenario, reflection should probably not be used as it is quite slow. This is because it must inspect the metadata of the bytecode to resolve against the string you provide instead of using precompiled addresses and constants.</p><h3>Where is reflection commonly used?</h3><p>One common scenario where reflection is used is in JUnit to retrieve and execute methods in a class by grabbing methods annotated with “@Test”</p><h3>Simple reflection example</h3><pre>public class Car {<br>   private String make;<br>   private String model;<br>   private String engineType;<br>}</pre><p>This is a simple example class which has private fields for make, model and engine type for a car. As the access modifiers for these fields is set to private, we can’t access them unless there is a public getter to retrieve the variable on the class.</p><pre>@Test<br>void shouldGetFieldsFromCarObject() {<br>   final var car = new Car();<br>   Field[] fields = car.getClass().getDeclaredFields();<br> <br>   List&lt;String&gt; actualFieldNames = getFieldNames(fields);<br> <br>   assertTrue(Arrays.asList(&quot;make&quot;, &quot;model&quot;, “engineType”)<br>      .containsAll(actualFieldNames));<br>}</pre><p>This example test shows that we can get all declared fields on a class where we can retrieve the field names on the class to validate against even though the access to these fields is private and we shouldn’t be able to retrieve them.</p><h3>How are we using reflection?</h3><h3>Why do we use reflection?</h3><p>Sometimes, we would see increased memory utilization where for some reason, objects weren’t being collected by the garbage collector but were living till tenor which would cause memory to steadily increase until an alert would fire that we were meeting a memory limit on a specific node. After grabbing and inspecting a heap dump in eclipse memory analyser, we discovered that the leak was being caused by a histogram timing event not being ended correctly.</p><p>We use Prometheus in our production servers to collect metrics and aggregate our alerts in one location. The majority of our application code runs asynchronously where we use futures to handle logic that we want to execute without blocking the main threads of our application from spinning. Sometimes, some logic being executed on a future could throw an exception or the result of a future could throw an exception causing any histogram timers that haven’t had been ended yet to not be collected, causing a memory leak in our production servers.</p><p>Like many production systems, there may be many histograms collecting metrics so diagnosing which histogram is leaking memory would become quite the ordeal where the flow for each histogram would need to be followed and checked to ensure that the timing events for that histogram would end correctly.</p><p>We use reflection to retrieve every histogram we are collecting metrics with, and we retrieve the counters on each histogram. If the counter on a histogram has lived longer than a given amount of time, we log that the histogram parent for that counter is leaking memory and this process runs every couple of seconds.</p><p>This approach allows us to narrow our search area to a specific histogram leaking memory instead of inspecting how the flow of every histogram is used to ensure their timing events are ended correctly however, this approach wouldn’t be possible if we didn’t know the average time a timing event should live for. This also means that diagnosing this specific issue becomes easier as if this log is firing, we know a histogram is leaking memory. Therefore, if this log isn’t firing, we know we would have to grab a heap dump or jfr to further diagnose a production issue.</p><p>Example of the reflection we are using.</p><pre>REFLECTED_HISTOGRAM_CHILDREN = SimpleCollector.class.getDeclaredField(&quot;children&quot;);<br>REFLECTED_HISTOGRAM_CHILDREN.setAccessible(true);<br>REFLECTED_START_TIME = Histogram.Timer.class.getDeclaredField(&quot;start&quot;);<br>REFLECTED_START_TIME.setAccessible(true);<br>REFLECTED_CHILD = Histogram.Timer.class.getDeclaredField(&quot;child&quot;);<br>REFLECTED_CHILD.setAccessible(true);<br>REFLECTED_HISTOGRAM_FULL_NAME = SimpleCollector.class.getDeclaredField(&quot;fullname&quot;);<br>REFLECTED_HISTOGRAM_FULL_NAME.setAccessible(true);<br>REFLECTED_HISTOGRAM_LABEL_NAMES = SimpleCollector.class.getDeclaredField(&quot;labelNames&quot;);<br>REFLECTED_HISTOGRAM_LABEL_NAMES.setAccessible(true);<br>REFLECTED_HISTOGRAM_TIMERS_MAP = AbstractMetricsReporter.class.getDeclaredField(&quot;histogramTimersMap&quot;);<br>REFLECTED_HISTOGRAM_TIMERS_MAP.setAccessible(true);</pre><p>This code snippet retrieves the children, fullname and labelNames fields on the SimpleCollector class, the start and child field on a HistogramTimer class and the histogramTimersMap on our custom AbstractMetricsReporter class.</p><p>We use this data to determine if a specific histogram is leaking after a given time period where we log out the name of the histogram, labels on the histogram and the amount of time the histogram has been leaking for to help narrow down our investigation for a histogram timers map leaking.</p><h3>Thoughts on reflection</h3><h3>Benefits</h3><p>Reflection allows us to retrieve values on classes, modify elements and redirect method calls if we chose to which gives us more control over how we would want a specific application or library to function.</p><h3>Drawbacks</h3><p>The main drawback of reflection is that it can be inefficient in some use cases. As you are retrieving information of a class or object as a string to then access from an object, the process of string matching to the correct variable/method and then type casting or executing your custom business logic is time consuming and isn’t very performant.</p><h3>When is it appropriate to use reflection?</h3><p>In most scenarios, I would recommend against using reflection. If the code that is being modified is in the user space and lives with the business logic or application code that you have specified, it makes more sense to create getters or setters to help with modifying the state of that object. Using reflection breaks object oriented paradigms and should be avoided if the functionality you are trying to achieve can be done without the use of reflection.</p><p>It makes more sense to use reflection for external libraries such as Prometheus where the functionality you are trying to achieve isn’t possible using the API of the underlying library. We have opted to execute this logic on a separate thread which Is executed periodically to ensure the rest of applications performance isn’t adversely affected by performing this reflection process continuously.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=44deb849f006" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[From Chemistry to Business Analysis: My journey into Tech]]></title>
            <link>https://engineering.global.com/from-chemistry-to-business-analysis-my-journey-into-tech-4349571e5bfa?source=rss-9a5263157fc0------2</link>
            <guid isPermaLink="false">https://medium.com/p/4349571e5bfa</guid>
            <category><![CDATA[business-analysis]]></category>
            <dc:creator><![CDATA[Global Engineering]]></dc:creator>
            <pubDate>Tue, 30 Apr 2024 14:20:12 GMT</pubDate>
            <atom:updated>2024-04-30T14:20:12.600Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/960/1*SnbsygRL2MMuWh0O7Jrdtg.jpeg" /></figure><p><em>By Yasmin Dawoodjee</em></p><p>Just over 6 months ago, I started a new career in Technology after studying chemistry in undergrad, the main question I always get asked is: “why?”. After being exposed to computational chemistry, (which is a branch of chemistry that uses computer simulations to assist in solving chemical problems), I realised that technology is an area I wanted to explore and could be the career for me. Following a quick gap year filled with short courses on the basics of code with Code First Girls and similar initiatives, I was offered a place on the Global Technology &amp; Digital Early Careers Programme! While most companies required a computer science degree or equivalent, my previous experiences have been treated as an asset and I’ve been able to use many transferrable skills which have helped me on this journey as an IT business analyst. Here’s what I’ve learnt in the last 6 months!</p><p><strong>Embracing Challenges</strong></p><p>One of the challenges I encountered quite early on was not having the same level of business knowledge as everyone else around me. However, I quickly learnt that it is not about what you know — it is about what you can learn. Success in the workplace isn’t solely dependent on your existing knowledge; it hinges on your capacity to absorb new information. As a newcomer to the job market, you’re unlikely to possess the exact experience required for most positions, no matter how many internships you’ve completed. Transitioning to full-time employment brings its own set of challenges. However, this is perfectly normal. No one anticipates you to have all the solutions from day one, and I’ve been lucky enough to have the support and opportunity for learning at every step of the way. Increasingly, especially for entry-level positions, companies are prioritizing traits and behaviours over specific skills.</p><p><strong>You don’t need to be a “techie” to work in tech</strong></p><p>Technology encompasses a wide range of roles, extending beyond the conventional image of a solitary engineer coding at a desk. While many tech jobs do require technical proficiency, they also demand essential soft skills such as communication, collaboration, critical thinking, and adaptability.</p><p>The roles within the tech industry can be broadly categorised as follows:</p><ul><li>Product owners, delivery managers and analysts: responsible for delivering IT systems and aligning them with the company’s objectives.</li><li>Data scientists and researchers: utilise technical expertise to tackle complex problems, driving innovation and progress.</li><li>Programmers and developers: Engage in building applications or solutions, often collaborating closely with business stakeholders for feedback.</li><li>IT support: provide assistance and resolve issues for both internal and external customers, witnessing the direct impact of their work on a daily basis.</li><li>Customer-facing technical roles: serve as trusted advisors to customers, offering insights into technology solutions and aiding in solving business challenges.</li></ul><p>As a business analyst in a tech department, I’ve found that one of the most valuable aspects of my role is the ability to bridge the gap between technical teams and non-technical stakeholders. Rather than being lost in a sea of tech jargon, BAs like myself focus on fostering communication and understanding. For instance, I’ve developed skills in translating complex technical concepts into plain language, which facilitates collaboration between developers, project managers, and business leaders. This ability to communicate effectively has been essential in ensuring that everyone involved in a project is on the same page and working towards shared goals.</p><p><strong>Professional development can happen through observation.</strong></p><p>I quickly learned that despite my usual way of learning is reading textbooks, or attending training sessions, learning doesn’t always happen through formal training or structured programs. Much of it occurs through observation, informal conversations, and absorption from experienced colleagues. Unsurprisingly, I learn by example and mirroring others — by asking to be in a variety of meetings and shadowing colleagues, I have the opportunity to witness effective communication, decision-making processes, and professional conduct first hand.</p><p>While remote working has its many benefits, being physically present in the office helps me absorb the company culture and understand the unwritten rules that contribute to success within the organization. This observational style learning is extremely valuable in shaping my own professional development.</p><p><strong>Diversity in tech matters</strong></p><p>I’ve been lucky enough to join a company where there are many initiatives to encourage diversity in tech. From regular women in tech meetups to a whole week filled events and training workshops during international women’s week, there is a lot to get involved in! A diverse workforce brings unique perspectives and experiences that can lead to more innovative solutions and a better understanding of customers. While many tech companies are now embracing diversity, there is still a long way to go. Here are a few statistics from this year’s <a href="https://report.techtalentcharter.co.uk/diversity-in-tech?utm_campaign=Diversity%20in%20Tech%20Report&amp;utm_medium=email&amp;_hsmi=296000613&amp;_hsenc=p2ANqtz--w5TMs5BFJMt0BEo6v9Fnjkr4TR25LXe9ChYXAAEv7_Au3cMbvM1xXvso-wmr1y8yLDuavrgdkUA-Bj-dGVBf4P7n_zA&amp;utm_content=296000613&amp;utm_source=hs_email">tech talent charter</a>.</p><ul><li>21% of senior tech role holders are women.</li><li>25% of UK tech employees are ethnic minorities; 5% are Black.</li><li>22% of software engineers are ethnic minorities.</li><li>Only 9% of tech employees are reported to be from lower socioeconomic backgrounds. This compares to 39% of the UK population.</li></ul><p><strong>What’s next?</strong></p><p>Reflecting over the past six months has made me eager for what lies ahead! It’s been a period of intense learning and adaptation, and I’m ready to carry that momentum forward. In the coming months, I plan to continue exploring different avenues within the tech industry, further developing my skills, and staying open to new opportunities. Networking, seeking guidance from mentors, and remaining resilient will be essential. With each new challenge, I know I’ll gain valuable experience that will help me advance in my career.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4349571e5bfa" width="1" height="1" alt=""><hr><p><a href="https://engineering.global.com/from-chemistry-to-business-analysis-my-journey-into-tech-4349571e5bfa">From Chemistry to Business Analysis: My journey into Tech</a> was originally published in <a href="https://engineering.global.com">Global Technology Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[GraphQL APIs]]></title>
            <link>https://engineering.global.com/graphql-apis-3cd082d76602?source=rss-9a5263157fc0------2</link>
            <guid isPermaLink="false">https://medium.com/p/3cd082d76602</guid>
            <category><![CDATA[api]]></category>
            <category><![CDATA[graphql]]></category>
            <dc:creator><![CDATA[Global Engineering]]></dc:creator>
            <pubDate>Tue, 23 Apr 2024 14:00:42 GMT</pubDate>
            <atom:updated>2024-05-22T14:54:18.186Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/960/1*9ziYIchuxXrH_BmsIVE56w.png" /></figure><p><em>By Joe Maskery</em></p><h4>What is an API?</h4><p>As someone new to software development, one of the most important concepts I have been introduced to is APIs. API stands for Application Programming Interface; they are mechanisms that enable two software applications to talk to each other using a set of protocols and definitions.</p><p>The most common types of API used at Global are REST and GraphQL. Whilst REST is the most popular type of API used today, GraphQL is relatively new and offers some exciting features which this blog post will summarise.</p><h4>GraphQL</h4><p>GraphQL is a data query and manipulation language and query runtime engine for APIs. The main selling point of GraphQL is that it allows clients to request only the exact data they need from the API, compared to REST where API responses are fixed and defined by the server.</p><h4>How it works</h4><p>GraphQL APIs only have a single endpoint where clients send all requests; these requests are then validated, interpreted, and executed by GraphQL. This is very different to REST APIs which have multiple endpoints to each fulfil a different request.</p><p>GraphQL has two main operation types: <em>queries </em>and <em>mutations</em>. Queries are requests that retrieve data from the server, like the HTTP GET method, whereas mutations are any request which modifies a resource, like the HTTP POST, PUT, and DELETE methods.</p><p>To setup a GraphQL API you need to define a schema file. This schema file should contain the definitions for all <em>Object </em>types that will be transferred across the API as part of a client request or a server response. Additionally, the schema file should contain definitions for any queries or mutations that the API will perform including their names, required parameters, and response objects.</p><p>Any query or mutation defined in the schema file will also require a <em>resolver</em>. Resolvers are methods or functions that are assigned to each operation to perform the logic required to resolve the request, e.g. retrieve the requested data from a database. The way resolvers are implemented will vary depending on the language or framework that the application uses.</p><p>In summary, the GraphQL schema file contains the definitions for all object types that can be transferred across the API, and the templates for all operations that can be performed by the API. A key feature of GraphQL is that it allows multiple operations to be sent and resolved as part of the same request. As long as the request is valid against the schema file all operations will be resolved in the single request.</p><h4>Pros and Cons</h4><p><strong><em>Advantages</em></strong></p><p>· <strong>Eliminates over-fetching</strong>: GraphQL allows clients to request only the exact data they need and nothing more. This reduces network traffic and improves the performance of client applications.</p><p>· <strong>Eliminates under-fetching</strong>: clients can retrieve all required data from a single request to the API, instead of making multiple requests to multiple different endpoints.</p><p>· <strong>Flexibility</strong>: clients have full control over the shape and structure of the data they receive and can retrieve nested or related data in a single request.</p><p>· <strong>Strongly typed schema</strong>: the GraphQL schema provides a clear contract between the client and the server, and clients can use introspection to see all available types and fields.</p><p>· <strong>Versionless APIs</strong>: because clients request only the specific fields they need, it is easier to add new types and fields without causing any breaking changes.</p><p><strong><em>Disadvantages:</em></strong></p><p>· <strong>Complexity</strong>: implementing a GraphQL API can be more complex than traditional APIs such as REST. It has a learning curve and developers need to pick up the key concepts such as the schemas, queries and mutations, and resolvers.</p><p>· <strong>Performance overhead</strong>: GraphQL servers need to parse and execute complex queries which can require more intensive processing when compared to REST APIs, especially for resource-intensive applications.</p><p>· <strong>Caching</strong>: caching is a challenge as GraphQL responses are generally unique to each query, especially compared to REST APIs where responses are more standardized.</p><h4>Example</h4><p>To illustrate the above points we can look at an example. Taking an example of a Spring application which handles Order-Lines and Order-Line-Items, the schema may look something like this:</p><pre>type OrderLine {<br>    orderId: ID!<br>    company: String!<br>    dateCreated: String!<br>    numItems: Int!<br>    totalPrice: Float!<br>    orderLineItems: [OrderLineItem!]<br>}<br><br>type OrderLineItem {<br>    itemId: ID!<br>    orderLineId: ID!<br>    orderLine: OrderLine<br>    product: String!<br>    startDate: String!<br>    endDate: String!<br>    duration: Int!<br>    price: Float!<br>}<br><br>input AddOrderLineRequest {<br>    company: String!<br>}<br><br>input AddOrderLineItemRequest {<br>    orderLineId: ID!<br>    product: String!<br>    startDate: String!<br>    endDate: String!<br>    price: Float!<br>}<br><br>type Query {<br>    getAllOrderLines: [OrderLine!]<br>    getOrderLineById(orderId: ID!): OrderLine<br><br>    getAllOrderLineItems: [OrderLineItem!]<br>    getOrderLineItemById(itemId: ID!): OrderLineItem<br>}<br><br>type Mutation {<br>    addOrderLine(addOrderLineRequest: AddOrderLineRequest!): String<br>    addOrderLineItem(addOrderLineItemRequest: AddOrderLineItemRequest!): String<br>}</pre><p>From the schema it is easy for us to see all available objects and operation types in the API and exactly how to call them.</p><p>Now we can see how easy it is to construct a request containing multiple queries and get the data back in a specific shape with only the required fields:</p><pre>query GetAllOrderLines {<br>    getAllOrderLines {<br>        orderId<br>        company<br>        dateCreated<br>        numItems<br>        totalPrice<br>        orderLineItems {<br>            product<br>        }<br>    }<br>    getOrderLineItemById(itemId: &quot;3&quot;) {<br>        itemId<br>        product<br>        startDate<br>        endDate<br>        duration<br>        price<br>        orderLine {<br>            company<br>        }<br>    }<br>}</pre><p>From the response we can see how easy it is to work with related data, as we are able to easily see the relationships between the Order-Lines and the Order-Line-Items.</p><pre>{<br>    &quot;data&quot;: {<br>        &quot;getAllOrderLines&quot;: [<br>            {<br>                &quot;orderId&quot;: &quot;1&quot;,<br>                &quot;company&quot;: &quot;Company 1&quot;,<br>                &quot;dateCreated&quot;: &quot;2024-04-03 14:05:24.927713&quot;,<br>                &quot;numItems&quot;: 3,<br>                &quot;totalPrice&quot;: 2178.99,<br>                &quot;orderLineItems&quot;: [<br>                    {<br>                        &quot;product&quot;: &quot;Bus asset&quot;<br>                    },<br>                    {<br>                        &quot;product&quot;: &quot;LU asset&quot;<br>                    },<br>                    {<br>                        &quot;product&quot;: &quot;Bus asset&quot;<br>                    }<br>                ]<br>            }<br>        ],<br>        &quot;getOrderLineItemById&quot;: {<br>            &quot;itemId&quot;: &quot;3&quot;,<br>            &quot;product&quot;: &quot;Bus asset&quot;,<br>            &quot;startDate&quot;: &quot;2023-11-13&quot;,<br>            &quot;endDate&quot;: &quot;2024-04-25&quot;,<br>            &quot;duration&quot;: 165,<br>            &quot;price&quot;: 423.99,<br>            &quot;orderLine&quot;: {<br>                &quot;company&quot;: &quot;Company 1&quot;<br>            }<br>        }<br>    }<br>}</pre><p>Both REST and GraphQL APIs have their pros and cons, and when deciding on which type of API to use it’s important to consider the requirements of your application. It’s also important to consider that GraphQL can be applied to an application on top of a REST API. In my team for example we have found it best to use a combination of GraphQL, for communication with the front-end, and REST APIs, for communication between back-end services, as each one has its benefits for slightly cases.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3cd082d76602" width="1" height="1" alt=""><hr><p><a href="https://engineering.global.com/graphql-apis-3cd082d76602">GraphQL APIs</a> was originally published in <a href="https://engineering.global.com">Global Technology Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Navigating the New Era of Out-of-Home Advertising with Global’s Open Direct API]]></title>
            <link>https://engineering.global.com/navigating-the-new-era-of-out-of-home-advertising-with-globals-open-direct-api-412b03820fe2?source=rss-9a5263157fc0------2</link>
            <guid isPermaLink="false">https://medium.com/p/412b03820fe2</guid>
            <category><![CDATA[api]]></category>
            <category><![CDATA[out-of-home-advertising]]></category>
            <dc:creator><![CDATA[Global Engineering]]></dc:creator>
            <pubDate>Thu, 18 Apr 2024 08:32:07 GMT</pubDate>
            <atom:updated>2024-04-18T08:32:07.496Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*B7wJH9mUAkYV0mY2wzZ2jQ.jpeg" /></figure><p><em>By Ella Myton</em></p><p>In the past, trading in the OOH world has been a bit like trying to navigate without a map. Each agency or specialist had their own way of working, which meant every integration required a custom approach. This not only slowed things down but also ate up valuable resources. With Open Direct, the aim is to change all that. By providing a standardised way for agencies and media owners to connect and trade.</p><p>So, what is Open Direct? OpenDirect is an API specification that revolutionises the way Out-of-Home (OOH) inventory is bought and sold. This was initialised through a collaborative effort involving industry giants such as AOL, Microsoft, Yahoo, and Yieldex. It was later bought to the IAB (Interactive Advertising Bureau) who released the first version in January 2015. What began as a solution crafted by a select few has blossomed into a universally embraced standard. With OpenDirect, buyers and media owners alike benefit from increased workflow efficiencies, greater control over inventory management, and a reliable means of automating the trade of OOH inventory. It’s not just a technological innovation; it’s a testament to the power of collaboration and standardisation in driving industry-wide progress. It gives buyers the ability to use their own platform to connect with media agencies such as Global to check the availability of inventory and book slots for both classic and digital frames.</p><p><strong>How is OpenDirect going to help Global?</strong></p><ul><li>Increased Efficiency: OpenDirect will facilitate faster deal closure and minimise administrative overhead by reducing manual intervention and streamlining workflows. This, in turn, will lead to substantial long-term cost savings.</li><li>Transparency is at the core of OpenDirect, as it promotes clarity in the advertising ecosystem by offering transparent terms, pricing, and delivery specifications from the outset. This commitment to transparency fosters trust between us and our customers, minimising the likelihood of disputes and paving a way to develop long lasting relationships. It also encourages greater collaboration, more frequent transactions, and a potential increase in spending from our buyers, ultimately leading to revenue growth.</li><li>Forecasting and Reporting: OpenDirect offers enhanced visibility into future inventory availability and demand for both Global and our Buyer. This access to real-time data and insights empowers us to optimise future inventory management strategies, thereby maximising revenue potential. Improved forecasting and planning capabilities result in a more efficient allocation of advertising budgets and increased revenue generation.</li></ul><p><strong>So, how’s it going now?</strong></p><p>The advancements in the development process have been incredible. We started under a year ago and the team have already released to pre-production. We are currently testing with the five of our main specialists that trade with us. The testing phase is where all the excitement is. It’s the first time we’ll see all the individual Jira tickets come together. Our specialists have successfully connected to Globals OpenDirect API, and we are so excited for the release to production. Watch this space!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=412b03820fe2" width="1" height="1" alt=""><hr><p><a href="https://engineering.global.com/navigating-the-new-era-of-out-of-home-advertising-with-globals-open-direct-api-412b03820fe2">Navigating the New Era of Out-of-Home Advertising with Global’s Open Direct API</a> was originally published in <a href="https://engineering.global.com">Global Technology Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Basics of Python Multithreading]]></title>
            <link>https://engineering.global.com/basics-of-python-multithreading-a21050189565?source=rss-9a5263157fc0------2</link>
            <guid isPermaLink="false">https://medium.com/p/a21050189565</guid>
            <category><![CDATA[python-multithreading]]></category>
            <dc:creator><![CDATA[Global Engineering]]></dc:creator>
            <pubDate>Mon, 15 Apr 2024 08:26:21 GMT</pubDate>
            <atom:updated>2024-04-15T08:26:21.446Z</atom:updated>
            <content:encoded><![CDATA[<p><em>By Cherilynn Atkinson</em></p><p>When a Python program is running, a thread executes instructions in the code. By default, one thread executes for a Python process. This thread is usually called the <em>main thread</em>.</p><p>The following code defines three functions. Each function sends a GET request to a specified webpage, waits for the server’s response to the HTTP request, then prints the status code of the response. The thread name and associated thread ID are also logged in the terminal. Here, the functions are executed sequentially — one after the other.</p><pre>import time <br>from loguru import logger <br>import threading <br>import requests <br><br># Define functions which try to request a webpage and print the status code <br>def task1(): <br>    logger.info(&quot;Task 1 started&quot;) <br>    logger.info(f&quot;Task 1 thread: {threading.current_thread().__class__.__name__}; thread ID: {threading.current_thread().ident}&quot;) <br>    response = requests.get(&quot;https://www.globalplayer.com&quot;) <br>    logger.info(f&quot;Task 1 status code: {response.status_code}&quot;) <br>    logger.info(&quot;Task 1 completed&quot;) <br><br>def task2(): <br>    logger.info(&quot;Task 2 started&quot;) <br>    logger.info(f&quot;Task 2 thread: {threading.current_thread().__class__.__name__}; thread ID: {threading.current_thread().ident}&quot;) <br>    response = requests.get(&quot;https://www.heart.co.uk&quot;) <br>    logger.info(f&quot;Task 2 status code: {response.status_code}&quot;) <br>    logger.info(&quot;Task 2 completed&quot;) <br><br>def task3(): <br>    logger.info(&quot;Task 3 started&quot;) <br>    logger.info(f&quot;Task 3 thread: {threading.current_thread().__class__.__name__}; thread ID: {threading.current_thread().ident}&quot;) <br>    response = requests.get(&quot;https://www.lbc.co.uk&quot;) <br>    logger.info(f&quot;Task 3 status code: {response.status_code}&quot;) <br>    logger.info(&quot;Task 3 completed&quot;) <br><br># Execute tasks sequentially <br>if __name__ == &quot;__main__&quot;: <br>    print(&quot;Sequential task execution:&quot;) <br>    start_time = time.time() <br><br>    task1() <br>    task2() <br>    task3() <br><br>    end_time = time.time() <br>    total_time = end_time - start_time <br>    logger.info(f&quot;Total time taken: {total_time} seconds&quot;) <br></pre><p>The functions execute in sequence, so task1() needs to be completed before task2() can start. Task1() makes a GET request to <a href="https://www.globalplayer.com/"><em>https://www.globalplayer.com</em></a>, waits for the response and prints the status code of the response. Task3() starts when task2() is complete. It takes around 0.4s in total for task1(), task2() and task3() to run:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/878/1*hX3Tdd7Jic9bzuJFEf6EKQ.png" /></figure><p>For each task, the same thread is used — the main thread.</p><p>If the tasks could start independently, without waiting for other tasks to finish, the program could execute more quickly. To do this, we could introduce more threads, which will allow separate parts of the program to run out of sequence.</p><p>One method of running multiple threads simultaneously is by using ThreadPoolExecutor, from the concurrent.futures module in the Python Standard Library. This uses a pool of threads to execute the functions asynchronously.</p><pre>import time<br>from loguru import logger<br>from concurrent.futures import ThreadPoolExecutor<br>import requests<br>import threading<br><br># Define functions which try to request a webpage and print the status code<br>def task1():<br>    logger.info(&quot;Task 1 started&quot;)<br>    logger.info(f&quot;Task 1 thread: {threading.current_thread().__class__.__name__}; thread ID: {threading.current_thread().ident}&quot;)<br>    response = requests.get(&quot;https://www.globalplayer.com&quot;)<br>    logger.info(f&quot;Task 1 status code: {response.status_code}&quot;)<br>    logger.info(&quot;Task 1 completed&quot;)<br><br>def task2():<br>    logger.info(&quot;Task 2 started&quot;)<br>    logger.info(f&quot;Task 2 thread: {threading.current_thread().__class__.__name__}; thread ID: {threading.current_thread().ident}&quot;)<br>    response = requests.get(&quot;https://www.heart.co.uk&quot;)<br>    logger.info(f&quot;Task 2 status code: {response.status_code}&quot;)<br>    logger.info(&quot;Task 2 completed&quot;)<br><br>def task3():<br>    logger.info(&quot;Task 3 started&quot;)<br>    logger.info(f&quot;Task 3 thread: {threading.current_thread().__class__.__name__}; thread ID: {threading.current_thread().ident}&quot;)<br>    response = requests.get(&quot;https://www.lbc.co.uk&quot;)<br>    logger.info(f&quot;Task 3 status code: {response.status_code}&quot;)<br>    logger.info(&quot;Task 3 completed&quot;)<br><br># Execute tasks asynchronously<br>if __name__ == &quot;__main__&quot;:<br>   print(&quot;Asynchronous task execution:&quot;)<br>    start_time = time.time()<br><br>    with ThreadPoolExecutor(max_workers=3) as executor:<br>        executor.submit(task1)<br>        executor.submit(task2)<br>        executor.submit(task3)<br><br>    end_time = time.time()<br>    total_time = end_time - start_time<br>    logger.info(f&quot;Total time taken: {total_time} seconds&quot;)</pre><p>This program can now run faster as, while task1() is waiting to finish, task2() can start, and so on. In the terminal output shown below, one particular execution ran in around 0.18s. New threads have been created here to have multiple, separate flows of execution.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/904/1*0R1EmZd9CKCJUCj5Nujrng.png" /></figure><p>Python threading can be used to decrease the time taken for a program to execute, by allowing tasks to run concurrently. The global interpreter lock restricts the potential of multithreading in Python, as it does not allow multiple threads to run two different processes at exactly the same time. Instead, the threads take turns running a process to speed up the overall program.</p><p>However, the global interpreter lock is released for I/O operations (such as web requests, like in the example above). So, multithreading can be used to run I/O operations concurrently.</p><p>An issue that can arise with multithreading is a race condition. Race conditions can occur when multiple threads attempt to make changes to a Python object at the same time. This can cause data to be changed incorrectly, introducing errors and potentially security vulnerabilities into the code. This can be avoided by synchronising access to shared data, using a lock, for example.</p><p>In summary, multithreading is one method of reducing the time taken for a Python process to execute. ThreadPoolExecutor can be used to introduce multiple threads, which can allow different parts of the program to run asynchronously.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a21050189565" width="1" height="1" alt=""><hr><p><a href="https://engineering.global.com/basics-of-python-multithreading-a21050189565">Basics of Python Multithreading</a> was originally published in <a href="https://engineering.global.com">Global Technology Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Finding Fires: Smoke Testing in Software Testing]]></title>
            <link>https://engineering.global.com/finding-fires-smoke-testing-in-software-testing-3414bcc1509c?source=rss-9a5263157fc0------2</link>
            <guid isPermaLink="false">https://medium.com/p/3414bcc1509c</guid>
            <category><![CDATA[testing]]></category>
            <dc:creator><![CDATA[Global Engineering]]></dc:creator>
            <pubDate>Mon, 08 Apr 2024 14:57:37 GMT</pubDate>
            <atom:updated>2024-04-10T15:20:17.755Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8Or636-XigubwZ8oHOzowQ.jpeg" /></figure><p><em>By Aislinn Wright</em></p><p>Finding Fires: Smoke Testing in Software Testing</p><p>Smoke testing, a form of software testing, is performed during the early stages of development as an initial test to establish that core functionality is performing as intended before moving to more detailed testing. Smoke testing is a cost-effective and time-efficient method to check the initial quality and stability of a new piece of software, preventing wasting resources on detailed testing that may need to be repeated should core functionality require changes.</p><p>Also known as verification testing or confidence testing, the term smoke testing originates from the electronics industry where the initial tests of electrical components included looking for visible smoke which could indicate a critical failure of a component. Smoke testing is now characterised by its broad but shallow testing modal, aiming only to test that core functionality has been achieved. Through testing core functionality early in the development process, critical bugs can be resolved swiftly with minimal impact on the wider project, preventing significant delays in the later stages of development.</p><p>Typically, smoke testing is carried out either on a daily or per build basis, as per the project’s needs. Daily testing is particularly beneficial for projects with frequent builds and continuous integration, ensuring that each build meets quality requirements and core functionality is not compromised by the introduction of new bugs. In the instance that a bug is introduced, by testing daily it is easier to pinpoint when bugs were introduced and roll back deployments if necessary.</p><p>Depending on the needs of a project, smoke testing can be adapted to target specific areas of the project. Two popular forms of smoke testing are acceptance smoke testing and UI smoke testing. Acceptance smoke testing aims to establish if a new piece of software meets the acceptance criteria previously agreed upon by clients or stakeholders of the project. Acceptance smoke testing is done only to establish that the MVP has been met with the intention of later performing more detailed testing. Alternatively, UI smoke testing focuses solely on the user interface components, ensuring that the customer facing product is functioning as intended to create a positive experience for the user.</p><p>Smoke testing can play a significant role in the software testing process, providing an early check of the quality of a new piece of software. Through broad but shallow early testing, smoke testing prevents wasting resources on detailed testing before core functionality has been established. Smoke testing has become a method to detect issues early, promoting the overall quality of the product.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3414bcc1509c" width="1" height="1" alt=""><hr><p><a href="https://engineering.global.com/finding-fires-smoke-testing-in-software-testing-3414bcc1509c">Finding Fires: Smoke Testing in Software Testing</a> was originally published in <a href="https://engineering.global.com">Global Technology Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>