<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Raygun</title>
    <description>The latest articles on Forem by Raygun (@raygun).</description>
    <link>https://forem.com/raygun</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F374%2F29700ed4-cae9-405e-b592-65b0377ae4e8.jpg</url>
      <title>Forem: Raygun</title>
      <link>https://forem.com/raygun</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/raygun"/>
    <language>en</language>
    <item>
      <title>Part one: 7 must-know object-oriented software patterns (and their pitfalls)</title>
      <dc:creator>Raygun Staff</dc:creator>
      <pubDate>Tue, 08 Aug 2023 20:13:09 +0000</pubDate>
      <link>https://forem.com/raygun/part-one-7-must-know-object-oriented-software-patterns-and-their-pitfalls-3g03</link>
      <guid>https://forem.com/raygun/part-one-7-must-know-object-oriented-software-patterns-and-their-pitfalls-3g03</guid>
      <description>&lt;p&gt;&lt;strong&gt;The importance of object-oriented design patterns in software development&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Object-oriented (not orientated!) design is a fundamental principle of modern software engineering, a crucial concept that all developers need to understand and employ effectively. Software design patterns like object-oriented design serve as universal solutions to common problems, across a range of instances and domains. As software engineers advance in their careers, they actually often start using these patterns instinctively, even without knowing it.&lt;/p&gt;

&lt;p&gt;However, there’s a tough balance to strike. A developer who lacks knowledge or experience with these object-oriented design patterns often strays into suboptimal, ad-hoc solutions that violate key software engineering principles, such as code reusability and separation of concerns, potentially resulting in harder long-term maintenance.&lt;/p&gt;

&lt;p&gt;On the other hand, misusing these patterns or applying them too rigidly can cause unnecessary complexity, resulting in tangled code with too many layers of abstraction. Overuse can make the codebase difficult to understand and navigate, slowing down development and increasing the likelihood of errors.&lt;/p&gt;

&lt;p&gt;In part one of this article, we'll explore 4 of the most common &lt;a href="https://raygun.com/blog/oop-concepts-java/"&gt;object-oriented programming&lt;/a&gt; patterns using an array of example programming languages. We'll discuss how to apply these patterns in your software development effectively, compare them to ad hoc solutions, and demonstrate some common &lt;a href="https://en.wikipedia.org/wiki/Anti-pattern"&gt;antipatterns&lt;/a&gt; that result from misuse or overuse. Our goal is to provide you with a comprehensive understanding of these patterns, help you avoid common pitfalls, and equip you with best practices to apply these patterns effectively in your development work.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is part one of a thorough, 2-part exploration of these OOP patterns, covering the &lt;strong&gt;extension&lt;/strong&gt; design pattern, the &lt;strong&gt;singleton&lt;/strong&gt; pattern, the &lt;strong&gt;exception shielding&lt;/strong&gt; pattern and the &lt;strong&gt;object pool&lt;/strong&gt; pattern. &lt;a href="//raygun.com/blog/object-oriented-software-patterns-part-two"&gt;Find part two here&lt;/a&gt;, exploring &lt;strong&gt;composite bridge&lt;/strong&gt;, &lt;strong&gt;iterator&lt;/strong&gt; and &lt;strong&gt;lock&lt;/strong&gt; design patterns.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In this post:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Extension Method&lt;/li&gt;
&lt;li&gt;Singleton&lt;/li&gt;
&lt;li&gt;Exception Shielding&lt;/li&gt;
&lt;li&gt;Object Pool&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Wrapping up&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Extension method {#extension-method}
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Defining the extension design pattern
&lt;/h4&gt;

&lt;p&gt;The &lt;a href="https://en.wikipedia.org/wiki/Extension_method#:~:text=In%20object%2Doriented%20computer%20programming,some%20object%2Doriented%20programming%20languages."&gt;extension method&lt;/a&gt; is a design pattern that solves a common problem: adding functionality to an existing class without modifying its source code. This is especially useful when you don’t have access to the original class source code or need to add functionality to a system type.&lt;/p&gt;

&lt;h4&gt;
  
  
  Using the extension design pattern
&lt;/h4&gt;

&lt;p&gt;The extension method must be used judiciously. It’s tempting to lean on this object-oriented pattern as a convenient way to add functionality to a class, even when you have direct access to the class' source code. Overuse or misuse of the extension method can lead to unnecessary complexity, resulting in a convoluted code structure that’s difficult to understand and navigate. This is a stark example of how the inappropriate application of a design pattern can hinder development and increase the risk of errors.&lt;/p&gt;

&lt;p&gt;Use the Extension Method with care. It's well-suited for small utilities or for extending system types, but not for types that you own and can modify directly. Instead, aim to extend the actual class with new methods, preserving code cleanliness and maintainability and adhering to &lt;a href="https://www.codeproject.com/Articles/768052/Golden-Rules-Of-Good-OOP"&gt;object-oriented programming best practices&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Without
&lt;/h4&gt;

&lt;p&gt;As an illustrative example of the extension design pattern in C#, let's look at a case-insensitive string comparison. In a direct approach, the developer might use the &lt;code&gt;Equals&lt;/code&gt; method with an extra parameter for &lt;code&gt;StringComparison.OrdinalIgnoreCase&lt;/code&gt;. This works, but can get clunky with repeated use. We could also create a new &lt;a href="https://www.codeproject.com/Articles/768052/Golden-Rules-Of-Good-OOP"&gt;static method&lt;/a&gt; for comparing two strings, but this would violate object-oriented principles by decoupling data from functionality.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{&amp;lt; highlight csharp&amp;gt;}}
string myString = "TeSt!";

/* Ad Hoc Option 1 */
if (myString.Equals("test!", StringComparison.OrdinalIgnoreCase)) { … }

/* Ad Hoc Option 2 */
if (NewStaticMethodEqualsIgnoreCase(myString, "test!")) { … }  
{{&amp;lt; /highlight &amp;gt;}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  With
&lt;/h4&gt;

&lt;p&gt;Instead, an elegant solution uses the Extension Method. We can create a new method, &lt;code&gt;EqualsIgnoreCase&lt;/code&gt;, which extends the &lt;code&gt;string&lt;/code&gt; class, yielding natural and readable code while preserving the &lt;a href="https://www.techtarget.com/searchapparchitecture/tip/A-breakdown-of-object-oriented-programming-concepts"&gt;object-oriented principle of associating data with functionality&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{&amp;lt; highlight csharp&amp;gt;}}
public static class StringExtensions
{
    public static bool EqualsIgnoreCase(this string str, string compareWith)
    {
        return str.Equals(compareWith, StringComparison.OrdinalIgnoreCase);
    }
}

string myString = "TeSt!";
if (myString.EqualsIgnoreCase("test!")) { … }
{{&amp;lt; /highlight &amp;gt;}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Antipattern
&lt;/h4&gt;

&lt;p&gt;We still need to beware of falling into antipatterns. The extension method is not a one-size-fits-all solution. When a developer owns a class and needs to perform data manipulation entirely within the scope of that class, it’s more appropriate to add a new method within the class itself, rather than resorting to an extension method. This ensures we’re leveraging object-oriented design, keeping related data and functionality together in a logical and maintainable way.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{&amp;lt; highlight csharp&amp;gt;}}
public class Customer
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public static class CustomerExtensions
{
    public static string GetFullName(this Customer customer)
    {
        return $"{customer.FirstName} {customer.LastName}";
    }
}
{{&amp;lt; /highlight &amp;gt;}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Instead
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{&amp;lt; highlight csharp&amp;gt;}}
public class Customer
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public string GetFullName()
    {
        return $"{FirstName} {LastName}";
    }
}
{{&amp;lt; /highlight &amp;gt;}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Singleton {#singleton}
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Defining the singleton pattern
&lt;/h4&gt;

&lt;p&gt;The purpose of the &lt;a href="https://en.wikipedia.org/wiki/Singleton_pattern"&gt;Singleton pattern in software design&lt;/a&gt; is enforcement of a single instance (i.e., object) of a class throughout a running application. It also provides a global point of access to this instance, making it easily accessible across different components of the system.&lt;/p&gt;

&lt;h4&gt;
  
  
  Using the singleton pattern
&lt;/h4&gt;

&lt;p&gt;The singleton pattern is helpful where we need a single point of control or coordination, like database connections or &lt;a href="https://dev.tov"&gt;logging&lt;/a&gt; services. It streamlines these processes by ensuring that the same instance is used consistently across different parts of the software, promoting coherency and reducing potential for error.&lt;/p&gt;

&lt;p&gt;However, the Singleton pattern, like all tools, can be misused. It's common, and dangerous, to view the Singleton as a catch-all place for code that doesn't quite fit elsewhere. This can lead to a Singleton that's overburdened and difficult to manage, filled with miscellaneous code that should be organized better. This dumping ground strategy can also make the Singleton hard to test and prone to &lt;a href="https://www.ibm.com/docs/en/db2/11.1?topic=design-concurrency-issues"&gt;concurrency issues&lt;/a&gt;, given its global accessibility. &lt;/p&gt;

&lt;h4&gt;
  
  
  Without
&lt;/h4&gt;

&lt;p&gt;Here’s a common scenario in Java, where a developer needs to log events across an application. An initial approach might be to simply create new Logger objects as needed and then discard them once they've served their purpose. This approach, while seemingly straightforward, can lead to problems.&lt;/p&gt;

&lt;p&gt;Repeatedly creating and discarding Logger objects can result in subpar performance due to the overhead associated with object creation and &lt;a href="https://raygun.com/blog/c-sharp-performance-tips-tricks/#gc"&gt;garbage collection&lt;/a&gt;. Even worse, it can lead to synchronization issues. As various Logger instances write to the log, entries could overlap and become muddled, creating a garbled, confusing log.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{&amp;lt; highlight shell&amp;gt;}}
void myFunction() {
    …
    Logger logger = new Logger(...);
    logger.log("Message"); /*Potential synchronization conflicts!*/
    …
}
{{&amp;lt; /highlight &amp;gt;}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  With
&lt;/h4&gt;

&lt;p&gt;A more efficient solution is to employ the Singleton pattern for our Logger. This way, we create a single instance of the Logger class and store it in a static field within the class itself. To enforce the Singleton behavior, we mark the constructor as private. This prevents any external invocations, stopping additional Logger instances from being created.&lt;/p&gt;

&lt;p&gt;Access to the singleton Logger is then managed through a synchronized getInstance method. Synchronization ensures &lt;a href="https://raygun.com/blog/c-sharp-performance-tips-tricks/#gc"&gt;thread-safety,&lt;/a&gt; preventing race conditions that could create multiple Logger instances simultaneously.&lt;/p&gt;

&lt;p&gt;The Singleton approach also allows a streamlined initialization process for various logging mechanisms. In our example, we need to log events both to &lt;a href="https://raygun.com/platform/crash-reporting"&gt;Raygun's Crash Reporting&lt;/a&gt; service and to local disk storage. Using a Singleton Logger, we can manage both efficiently from a central location.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{&amp;lt; highlight shell&amp;gt;}}
public class Logger {
    private static Logger instance;
    private RaygunClient raygunClient;
    private DiskLogging diskLogging;

    private Logger() {
        raygunClient = new RaygunClient("api-key");
        diskLogging = new DiskLogging(...);
    }

    public static synchronized Logger getInstance() {
        if (instance == null) {
                instance = new Logger();
        }
        return instance;
    }

    public void log(String message) {
        raygunClient.send(message);
        diskLogging.write(message);
    }
}

Logger.getInstance().log("Message");
{{&amp;lt; /highlight &amp;gt;}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Antipattern
&lt;/h4&gt;

&lt;p&gt;While widely used, Singleton critics label it an antipattern. They argue it encourages &lt;a href="https://embeddedartistry.com/fieldatlas/the-problems-with-global-variables/"&gt;global state&lt;/a&gt;, making the code unpredictable and violating the &lt;a href="https://en.wikipedia.org/wiki/Single-responsibility_principle"&gt;Single Responsibility Principle&lt;/a&gt;. Singletons can also generate concurrency issues, obfuscate dependencies, and complicate refactoring efforts due to their pervasive presence in the codebase. However, Singleton can still be helpful in the right context.&lt;/p&gt;

&lt;p&gt;Misuse of the Singleton pattern can violate the tenets of object-oriented design. A common pitfall is using the Singleton as a global data dump, transforming it into a code equivalent of an overstuffed closet. This is clearly illustrated in our example, where the Logger instance has been burdened with a mishmash of global fields that don’t align with its primary function.&lt;/p&gt;

&lt;p&gt;Consider the following Java code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{&amp;lt; highlight java&amp;gt;}}
public class Logger {
    private static Logger instance;
    …
    private long lastTimeAUserLoggedIn;
    private String applicationReleaseVersion;
    private Object someGlobalObjectADevAddedTenVersionsAgo;
    …
}

Logger.getInstance().someGlobalObjectADevAddedTenVersionsAgo.wtf();
{{&amp;lt; /highlight &amp;gt;}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, the Logger Singleton has been laden with fields such as &lt;code&gt;lastTimeAUserLoggedIn&lt;/code&gt;, applicationReleaseVersion, and a vague &lt;code&gt;someGlobalObjectADevAddedTenVersionsAgo&lt;/code&gt;. The presence of these fields in the &lt;code&gt;Logger&lt;/code&gt; class not only muddles the class's purpose but also makes the system confusing and hard to maintain. Developers are left puzzling over the purpose of &lt;code&gt;someGlobalObjectADevAddedTenVersionsAgo&lt;/code&gt; and why it's even part of the Logger class. This is a prime example of how misusing the Singleton pattern can lead to bloated and confusing code.&lt;/p&gt;

&lt;h4&gt;
  
  
  Instead
&lt;/h4&gt;

&lt;p&gt;A more sophisticated approach to handle global configurations like the &lt;code&gt;applicationReleaseVersion&lt;/code&gt; is to use Java's built-in &lt;code&gt;Properties&lt;/code&gt; class. This allows you to maintain a set of &lt;a href="https://raygun.com/blog/c-sharp-performance-tips-tricks/#gc"&gt;key-value pairs&lt;/a&gt; where both are Strings, making it an ideal choice for storing configuration data.&lt;/p&gt;

&lt;p&gt;In this context, we can have a Singleton class &lt;code&gt;AppConfig&lt;/code&gt; that encapsulates a &lt;code&gt;Properties&lt;/code&gt; object. The &lt;code&gt;Properties&lt;/code&gt; object can be populated at the startup of the application, loading key-value pairs from a configuration file. This not only promotes &lt;a href="https://help.sap.com/doc/abapdocu_753_index_htm/7.53/en-US/abenseperation_concerns_guidl.htm#:~:text=Separation%20of%20concerns%20is%20a,and%20arrangement%20in%20software%20layers."&gt;separation of concerns&lt;/a&gt; but also allows the configurations to be easily modified without changing the source code.&lt;/p&gt;

&lt;p&gt;Here's an example of how to structure the AppConfig Singleton class in Java:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{&amp;lt; highlight java&amp;gt;}}
public class AppConfig {
    private static AppConfig instance;
    private static final RaygunClient raygunClient = new RaygunClient("API-KEY");

    private Properties properties;

    private AppConfig() {
        properties = new Properties();
        try (InputStream input = getClass().getClassLoader().getResourceAsStream("app.config")) {
            if (input == null) {
                raygunClient.send("Unable to find config file!");
                return;
            }

            //load properties from the config file
            properties.load(input);
        } catch (IOException ex) {
            raygunClient.send(ex);
        }
    }

    public static synchronized AppConfig getInstance() {
        if (instance == null) {
            instance = new AppConfig();
        }
        return instance;
    }

    public String getProperty(String key) {
        return properties.getProperty(key);
    }
}
{{&amp;lt; /highlight &amp;gt;}}

In th
is example, the `AppConfig` class loads key-value pairs from a file named app.config located in the classpath at the startup of the application. Then we can use the `getProperty` method to retrieve the application's version or any other configuration data as needed:

{{&amp;lt; highlight java&amp;gt;}}
String applicationVersion = AppConfig.getInstance().getProperty("applicationReleaseVersion");
{{&amp;lt; /highlight &amp;gt;}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This not only promotes better organization and separation of concerns but also provides a flexible and efficient way to manage application configurations.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Exception Shielding{#exception-shielding}
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Defining the exception shielding pattern
&lt;/h4&gt;

&lt;p&gt;The &lt;a href="http://www.brucejmack.net/guides/Pattern%20Documents/WebServicePatterns/ExceptionShielding.htm"&gt;exception shielding&lt;/a&gt; design pattern aims to prevent the spread of sensitive or unnecessary exception information beyond the architectural boundaries of a system. This is particularly essential in user-facing systems, like web apps, where unhandled exceptions can reveal sensitive details about the system’s inner workings or result in a poor user experience. Exception shielding ensures that the user only sees meaningful, non-sensitive error information.&lt;/p&gt;

&lt;h4&gt;
  
  
  Using the exception shielding pattern
&lt;/h4&gt;

&lt;p&gt;A key rule of thumb when implementing exception shielding is to only catch exceptions that you can meaningfully handle. This means exceptions where your code can either recover from the error, perform some mitigation steps, or enrich the exception details before rethrowing it. Avoid blanket-catching all exceptions without any handling logic, as this can lead to silently swallowed errors, making debugging a nightmarish process.&lt;/p&gt;

&lt;p&gt;Every exception that you catch but can't handle properly should be logged or recorded. Ignoring an exception, or catching it only to rethrow a less specific one without a fix or logging can bury crucial diagnostic information. &lt;a href="https://learn.microsoft.com/en-us/dotnet/standard/exceptions/best-practices-for-exceptions"&gt;Effective exception handling&lt;/a&gt; should balance protecting the system and preserving information.&lt;/p&gt;

&lt;h4&gt;
  
  
  Without
&lt;/h4&gt;

&lt;p&gt;Let's consider the following Node.js Express application route handler, designed to fetch and display a customer's data based on their ID.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{&amp;lt; highlight js&amp;gt;}}
app.get('/customer/:id', (req, res) =&amp;gt; {
    const customerId = req.params.id;
    res.send(displayCustomer(customerId);
});
{{&amp;lt; /highlight &amp;gt;}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While this route handler is straightforward and concise, it doesn't include any exception handling. This means if something goes wrong within the displayCustomer function, like a database error, or if the customer with the provided ID doesn't exist, an error will be thrown. This unhandled error can potentially crash the entire application, or at least interrupt its normal operation.&lt;/p&gt;

&lt;p&gt;Plus, depending on the configuration of your server, this unhandled error might expose sensitive details to the end user, like database schema information or proprietary business logic. This could mean a significant security risk and a poor user experience, sending raw error messages instead of a &lt;a href="https://raygun.com/blog/5-tips-for-writing-great-software-error-messages/"&gt;helpful, user-friendly response&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Antipattern
&lt;/h4&gt;

&lt;p&gt;Let's break down Exception Shielding further via two common antipatterns: &lt;a href="https://docs.aws.amazon.com/codeguru/detector-library/python/swallow-exceptions/"&gt;Exception Swallowing &lt;/a&gt;and Incorrect Exception Chaining or Exception Wrapping. These antipatterns illustrate misuse of try-catch blocks, and even though they can satisfy compiler requirements, they often introduce more problems than they solve.&lt;/p&gt;

&lt;h4&gt;
  
  
  Antipattern 1: Exception Swallowing
&lt;/h4&gt;

&lt;p&gt;In the following Node.js code snippet, a try-catch block is used, but the catch block is left empty. This is known as exception swallowing. While the code will still run, it can lead to unseen errors, making debugging difficult.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{&amp;lt; highlight js&amp;gt;}}
/* Antipattern 1: Exception Swallowing*/
app.get('/customer/:id', (req, res) =&amp;gt; {
    const customerId = req.params.id;
    var response = "";
    try {
        response = displayCustomer(customerId);
    } catch (err) {
        /*Do Nothing! Exception Swallowed…*/
    } finally {
        res.send(response);
    }
});
{{&amp;lt; /highlight &amp;gt;}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Antipattern 2: Incorrect Exception Chaining or Exception Wrapping
&lt;/h4&gt;

&lt;p&gt;Incorrect Exception Chaining (or Exception Wrapping) happens when a new generic error is thrown, instead of correctly handling an exception or passing it along with sufficient information. This discards any valuable details from the original error, including its stack trace.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{&amp;lt; highlight js&amp;gt;}}
/* Antipattern 2: Exception Chaining or Exception Wrapping*/
/*Creating, throwing new exception discards info in original*/
} catch (err) {
    throw new Error("My error text");
}
{{&amp;lt; /highlight &amp;gt;}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  With/Instead
&lt;/h4&gt;

&lt;p&gt;The exception shielding design pattern, when used correctly, can significantly enhance your application's robustness and user experience. Below, we're applying this pattern in a Node.js web application, using &lt;a href="https://raygun.com/platform/crash-reporting"&gt;Raygun error monitoring&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{&amp;lt; highlight js&amp;gt;}}
const raygun = require('raygun');
const raygunClient = new raygun.Client().init({ apiKey: 'api-key' });

app.get('/customer/:id', (req, res) =&amp;gt; {
    const customerId = req.params.id;
    try {
        const response = displayCustomer(customerId);
        res.send(response);
    } catch (err) {
        raygunClient.send(err);
        res.status(500).send('Error while processing your request.');
    }
});
{{&amp;lt; /highlight &amp;gt;}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above code, any exceptions thrown during the execution of displayCustomer are caught and logged by Raygun. The user-facing response, however, is a generic 500 error message, free of any unnecessary or sensitive exception information.&lt;/p&gt;

&lt;p&gt;If you need to throw a new error, always try to attach the original error to preserve useful debugging information. Here's an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{&amp;lt; highlight js&amp;gt;}}
/*Alternatively, if new Error must be thrown, attach the original to it*/
} catch (err) {
    raygunClient.send(err);
    const higherLevelError = new Error('A higher level error occurred');
    higherLevelError.originalError = err;
    throw higherLevelError;
}
{{&amp;lt; /highlight &amp;gt;}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this snippet, we create a new error, but also keep a reference to the original error. This retains the valuable debugging information from the initial error, even as we raise a new error to be handled at a higher level of our application.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Object Pool{#object-pool}
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Defining the object pool pattern
&lt;/h4&gt;

&lt;p&gt;The object pool design pattern provides an efficient way to manage resources that are expensive to create and release. It &lt;a href="https://www.oreilly.com/library/view/java-performance-tuning/0596000154/ch04s02.html"&gt;recycles objects&lt;/a&gt; that are no longer in use, reducing the costly overhead of resource acquisition and release. Examples could be database connections, thread pools, or large bitmap objects.&lt;/p&gt;

&lt;h4&gt;
  
  
  Using the object pool pattern
&lt;/h4&gt;

&lt;p&gt;However, like our other object-oriented design patterns, we should use object pool only in the right context. It isn't a universal solution for all types of objects. Some language runtimes provide a multitude of optimizations that work "under-the-hood". For example, in C++ and C#, objects can be &lt;a href="https://www.geeksforgeeks.org/stack-vs-heap-memory-allocation/"&gt;allocated on the stack&lt;/a&gt;, offering better performance in certain scenarios compared to an object pool.&lt;/p&gt;

&lt;h4&gt;
  
  
  Without
&lt;/h4&gt;

&lt;p&gt;In the example provided, we have a class Enemy in C++ (inspired by the efficacy of the &lt;a href="https://gameprogrammingpatterns.com/object-pool.html"&gt;object pool pattern in game development&lt;/a&gt;). To create an instance of the class, we use the new keyword which triggers the constructor, allocating memory on the heap and initializing the new object. Once we're done using the object, we call delete to deallocate the memory.&lt;/p&gt;

&lt;p&gt;This is effective for simple applications or when the Enemy instances are infrequently created and destroyed. However, it has its issues, particularly for performance-critical applications or those creating and destroying a large number of instances in short time spans.&lt;/p&gt;

&lt;p&gt;Each call to create and delete involves memory allocation and deallocation operations which are expensive in terms of CPU time. If this is happening frequently, it can lead to significant performance overhead. Repeated allocation and deallocation of memory can also lead to &lt;a href="https://www.softwareverify.com/blog/memory-fragmentation-your-worst-nightmare/"&gt;heap fragmentation&lt;/a&gt;, which can degrade performance over time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{&amp;lt; highlight cpp&amp;gt;}}
class Enemy {
private:
    …
public:
    Enemy() {
        …
    }

    ~Enemy() {
        …
    }
}

Enemy* enemy = new Enemy();
…
delete enemy;
{{&amp;lt; /highlight &amp;gt;}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  With
&lt;/h4&gt;

&lt;p&gt;In this revised object pool example, we implement an EnemyPool class (which falls under the object pool design pattern). Instead of creating and destroying Enemy objects each time we need them, we pre-allocate a pool of Enemy instances and recycle them. This can dramatically reduce the overhead of frequent memory allocation and deallocation.&lt;/p&gt;

&lt;p&gt;In the constructor of EnemyPool, a specified number of Enemy objects are pre-allocated and stored in a stack data structure for use when needed. The getEnemy method retrieves an Enemy object from the stack if one is available, otherwise it throws an error. Once the Enemy object is no longer needed, it's returned to the pool using the returnEnemy method, where it gets pushed back onto the stack for reuse.&lt;/p&gt;

&lt;p&gt;The destructor of EnemyPool ensures that all the Enemy objects are properly deleted when the EnemyPool object goes out of scope. This prevents &lt;a href="https://raygun.com/blog/memory-leak-detection/"&gt;memory leaks.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{&amp;lt; highlight cpp&amp;gt;}}
class EnemyPool {
private:
    std::stack&amp;lt;Enemy*&amp;gt; available;

public:
    EnemyPool(int size) {
        for (int i = 0; i &amp;lt; size; ++i) {
            available.push(new Enemy());
        }
    }

    ~EnemyPool() {
        while (!available.empty()) {
            delete available.top();
            available.pop();
        }
    }

    Enemy* getEnemy() {
        if (available.empty()) {
            throw std::runtime_error("No enemies available");
        }

        Enemy* enemy = available.top();
        available.pop();

        return enemy;
    }

    void returnEnemy(Enemy* enemy) {
        available.push(enemy);
    }
};
{{&amp;lt; /highlight &amp;gt;}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This design pattern is beneficial for performance-critical applications or if we’re creating and destroying a large number of instances rapidly. It reduces the number of memory allocation and deallocation operations, mitigates heap fragmentation, and generally increases application speed and efficiency. But be careful not to hold onto Enemy objects for longer than necessary, to ensure that there are always enough available in the pool.&lt;/p&gt;

&lt;h4&gt;
  
  
  Antipattern
&lt;/h4&gt;

&lt;p&gt;The misuse of the Object Pool pattern can lead to unnecessary complexity and potential memory leaks. The antipattern presented here shows an Enemy object being borrowed from the EnemyPool and then returned back to the pool within a function. This may seem correct, but it poses a few problems.&lt;/p&gt;

&lt;p&gt;A big issue arises if an exception gets thrown or an early return is encountered within the function, skipping the returnEnemy method. In this case, we end up with a memory leak as the Enemy object is never returned to the pool and can’t be reclaimed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{&amp;lt; highlight cpp&amp;gt;}}
void functionLocalEnemy(EnemyPool enemyPool) {
    const enemy = enemyPool.getEnemy();
    …
    enemyPool.returnEnemy(enemy);
}
{{&amp;lt; /highlight &amp;gt;}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Instead
&lt;/h4&gt;

&lt;p&gt;Instead of using the Object Pool pattern in this situation, you can try a simpler approach. If the scope of an object is limited to a single function or block, it might be more efficient and safer to allocate it on the stack. When you declare an Enemy object inside a function like functionLocalEnemy, the Enemy instance is created on the stack when the function is entered and automatically deallocated when the function exits. This stack-based allocation and deallocation is handled by the runtime, so there's no need to remember to deallocate the object manually, preventing potential memory leaks.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{&amp;lt; highlight cpp&amp;gt;}}
void functionLocalEnemy(EnemyPool enemyPool) {
    Enemy enemy; /*Allocate on the stack*/
    …
} /*Stack object automatically deallocated on function exit*/
{{&amp;lt; /highlight &amp;gt;}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Wrapping up{#wrap}
&lt;/h3&gt;

&lt;p&gt;That’s the first 4 of our 7 essential object-oriented software patterns, and you should now have a solid grasp of the extension method, singleton, exception shielding, and object pool design patterns. &lt;em&gt;(&lt;a href="//raygun.com/blog/object-oriented-software-patterns-part-two"&gt;You can find part two here&lt;/a&gt;, exploring &lt;strong&gt;composite bridge&lt;/strong&gt;, &lt;strong&gt;iterator&lt;/strong&gt; and &lt;strong&gt;lock&lt;/strong&gt; design patterns.)&lt;/em&gt; These patterns, used appropriately, provide robust solutions to common challenges, leading to more efficient and resilient software development. These are among the most common object oriented design patterns for good reason, and serve as vital tools in a developer's arsenal, promoting code reusability, separation of concerns, and overall software engineering best practices.&lt;/p&gt;

&lt;p&gt;However, we have to reiterate how important it is to be discerning in the application of these patterns. As shown by our examples, misuse or over-application can lead to a tangle of complexity, obscuring the simplicity and clarity that characterizes good code. A proficient software engineer understands when a pattern adds value and when it might obscure the essence of the code. Striking a balance between robust design patterns and clean, simple code is a show of serious engineering finesse, and is a skill to practise and hone over time. &lt;/p&gt;

&lt;p&gt;To assist in this process, developers can leverage software intelligence tools like &lt;a href="https://raygun.com/platform/crash-reporting"&gt;Raygun Crash Reporting&lt;/a&gt;, which can provide deep insights into your application's health, alerting you when things go wrong and helping you diagnose the root cause of issues more efficiently. &lt;a href="https://raygun.com/platform/real-user-monitoring"&gt;Raygun's Real User Monitoring (RUM)&lt;/a&gt; tool can provide valuable insights into how your application performs in real-world conditions, helping you understand where performance bottlenecks may exist and guiding optimization efforts. And lastly, &lt;a href="https://raygun.com/platform/apm"&gt;Raygun's Application Performance Monitoring (APM)&lt;/a&gt; tool can give you the visibility you need to understand how effectively your design patterns are performing in your live environment, alerting you to any issues before they become problematic. &lt;a href="https://app.raygun.com/signup"&gt;Take a 14-day trial of Raygun, no credit card needed, for free here&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;With the intelligent use of design patterns and the powerful insights offered by Raygun's tools you'll be building bulletproof software that is efficient, maintainable, and high quality. Happy coding!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Author &amp;amp; Affiliations&lt;/strong&gt; &lt;br&gt;
Dr. Panos Patros, CPEng &lt;br&gt;
Principal Engineer, Raygun&lt;br&gt;
New Zealand Adjunct Professor in Computer Science, IBM Center of Advanced Studies-Atlantic, UNB&lt;br&gt;
Canada Steering Committee Member, IT Engineers, Engineering New Zealand &lt;/p&gt;

</description>
      <category>oop</category>
      <category>tutorial</category>
      <category>design</category>
      <category>objectoriented</category>
    </item>
    <item>
      <title>Announcing Ruby support for Raygun APM</title>
      <dc:creator>Raygun Staff</dc:creator>
      <pubDate>Thu, 26 Nov 2020 23:18:11 +0000</pubDate>
      <link>https://forem.com/raygun/announcing-ruby-support-for-raygun-apm-79n</link>
      <guid>https://forem.com/raygun/announcing-ruby-support-for-raygun-apm-79n</guid>
      <description>&lt;p&gt;We’ve built &lt;a href="https://raygun.com/platform/apm" rel="noopener noreferrer"&gt;Raygun APM&lt;/a&gt; to be the best solution on the market today, with more code-level detail, better visualization, and powerful infrastructure that helps developers discover and diagnose performance bottlenecks in a fraction of the time — and for a fraction of the cost.&lt;/p&gt;




&lt;p&gt;That’s why we are thrilled to launch the next chapter in our ongoing support for Application Performance Monitoring: Ruby support for Raygun APM. Ruby teams can now get end-to-end monitoring with features like detailed trace transactions, dashboards, code execution, and more.&lt;/p&gt;

&lt;p&gt;These features normally cost thousands per month with a traditional APM tool. But with Raygun’s usage-based pricing model, you can now get sophisticated &lt;a href="https://raygun.com/ruby-performance-monitoring" rel="noopener noreferrer"&gt;Ruby performance monitoring&lt;/a&gt; for a more efficient price — no matter what your environment looks like.&lt;/p&gt;




&lt;h3&gt;
  
  
  How is Raygun APM different?
&lt;/h3&gt;

&lt;p&gt;When we first launched APM, we knew we needed to be better than other APM solutions on the market.&lt;/p&gt;

&lt;p&gt;As a technical team ourselves, we know that many APM tools fail to give meaningful data to developers, making debugging and troubleshooting time-consuming. What’s more, current pricing models make traditional APM tools inaccessible to companies operating in modern development environments.&lt;/p&gt;

&lt;p&gt;We built Raygun’s APM from the ground up with these problems top of mind, which is why we can say that &lt;strong&gt;we are different&lt;/strong&gt;. Raygun is a developer-friendly product that excels in delivering the necessary details needed to fix problems quickly, without the heavy restrictions traditional tools carry.&lt;/p&gt;

&lt;p&gt;Our latest support for Ruby also reflects that.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;“With our previous APM tool, we struggled to correlate the problem to cause. Raygun APM doesn’t just tell you what is slow, it tells you why.”&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Vidar Sømme, Chief Development Officer, Vetserve&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Find and solve Ruby performance problems fast
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvwhi57a92f7bbmihpnkq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvwhi57a92f7bbmihpnkq.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Raygun APM delivers more code-level detail with our flame chart&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We’ve put a lot of thought into how developers will use this every day. We know that when there’s a lot of data flowing, charts can get overwhelming and it can be difficult to discover, prioritize, and resolve issues.&lt;/p&gt;

&lt;p&gt;When you’re in the discovery phase, the customizable &lt;a href="https://raygun.com/documentation/product-guides/apm/overview/" rel="noopener noreferrer"&gt;Overview page&lt;/a&gt; visualizes all the high-level data you need to spot performance trends over a certain time. Monitor Apdex score, slowest requests and methods, active issues, and more for full visibility into your application performance.&lt;/p&gt;

&lt;p&gt;If you’re not sure where to start, our unique automatic &lt;a href="https://raygun.com/documentation/product-guides/apm/issues" rel="noopener noreferrer"&gt;issue creation engine&lt;/a&gt; curates a list of your most urgent performance issues for you, sorted by priority.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fv0qss1uwdzqnqcp2j0nj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fv0qss1uwdzqnqcp2j0nj.png" alt="Raygun shows more detail with our GitHub issues page"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Raygun's issue detection engine helps you to prioritize and sort issues&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Behind the scenes, there are many causes of poor performance, and you’ll want to find and resolve them as quickly as possible before they affect your customers. With Raygun APM, getting more actionable detail into an issue has never been easier.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://raygun.com/documentation/product-guides/apm/traces/" rel="noopener noreferrer"&gt;Traces page&lt;/a&gt; of Raygun APM is where you can find all the traces for your application so you can start to drill down into the specifics.&lt;/p&gt;

&lt;p&gt;Clicking on an individual trace will take you to the &lt;strong&gt;flame chart&lt;/strong&gt; which shows you the state of your code at &lt;em&gt;every millisecond&lt;/em&gt; during the performance profile. This gives you a way to know exactly which function was executing at any point during the recording, how long it ran for, and where it was called from.&lt;/p&gt;

&lt;p&gt;The flame chart allows you to visualize your code rather than just using a call tree view. Once you’ve isolated the issue, drill down into the details of the call, such as the execution time, parent percentage, duplicates, and hotpath. The detail doesn’t end there — the GitHub integration will link you to the exact line of code.&lt;/p&gt;

&lt;p&gt;At the end of the day, Ruby developers want to build fast and efficient applications. This resolution workflow helps you deliver great work and avoid spending too much time debugging and tracking down issues.&lt;/p&gt;




&lt;h3&gt;
  
  
  Raygun APM is built for Ruby
&lt;/h3&gt;

&lt;p&gt;Raygun APM works harmoniously with Ruby so you can optimize application performance. With this release, we’ve baked in specific features that support faster trouble-shooting for Ruby apps.&lt;/p&gt;

&lt;h4&gt;
  
  
  Monitor SQL queries
&lt;/h4&gt;

&lt;p&gt;Raygun APM provides excellent support for filtering and drilling down into &lt;a href="https://raygun.com/blog/sql-performance-tuning-tips/" rel="noopener noreferrer"&gt;SQL performance metrics&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Keep tabs on HTTP API calls and how it affects your application
&lt;/h4&gt;

&lt;p&gt;Services and applications, especially in modern cloud computing paradigms and microservices oriented deployments, coexist with others. The Raygun APM platform has great support for tracking and &lt;a href="https://raygun.com/documentation/product-guides/apm/rules/" rel="noopener noreferrer"&gt;creating rules&lt;/a&gt; for external HTTP API calls.&lt;/p&gt;

&lt;h4&gt;
  
  
  Support for tracing Sidekiq background jobs
&lt;/h4&gt;

&lt;p&gt;Sidekiq uses threads to handle many jobs at the same time in the same process. Discover performance problems in Sidekiq threads quickly.&lt;/p&gt;

&lt;h4&gt;
  
  
  Support for Heroku with a Buildpack
&lt;/h4&gt;

&lt;p&gt;Raygun APM offers seamless integration with the Heroku platform via a &lt;a href="https://elements.heroku.com/buildpacks/mindscapehq/heroku-buildpack-raygun-apm" rel="noopener noreferrer"&gt;Buildpack&lt;/a&gt;, so you can get all the benefits of APM for your Rails app.&lt;/p&gt;

&lt;h4&gt;
  
  
  Reduced overhead
&lt;/h4&gt;

&lt;p&gt;We built APM using a fast communication protocol and optimized code to reduce the profiling overhead. This allows us to emit detailed trace information for Ruby apps with a low-performance impact.&lt;/p&gt;

&lt;p&gt;While these features help to get granular into performance problems, how do you know if they have made an impact on the real people using your website? Our &lt;a href="https://raygun.com/blog/rum-vs-apm/" rel="noopener noreferrer"&gt;Real User Monitoring (RUM) solution&lt;/a&gt; enabled alongside APM answers these questions and more.&lt;/p&gt;




&lt;h3&gt;
  
  
  Understand how server-side performance impacts users with APM and RUM
&lt;/h3&gt;

&lt;p&gt;With Raygun APM, you can combine server-side timings with front-end performance data from RUM to get a complete view of your user experience. Once you integrate with RUM for a small additional fee, you won’t be left trying to manually correlate user data between tools, and you’ll be able to assign dev resources to where it matters the most.&lt;/p&gt;

&lt;p&gt;In the video below, you can see that Raygun APM detected a problem. Watch how you can click through to Real User Monitoring to see the performance breakdown of the page, including the server percentage of load time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxlj9n8ekkrwb3vwktnle.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxlj9n8ekkrwb3vwktnle.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;With Real User Monitoring and APM enabled, get user-level detail for server performance problems&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Accessible pricing for modern development teams
&lt;/h3&gt;

&lt;p&gt;Raygun offers sophisticated yet cost-effective application performance monitoring across the whole stack, no matter if you are using microservices or monolithic architectures. Our &lt;a href="https://raygun.com/platform/apm#pricing" rel="noopener noreferrer"&gt;usage-based pricing&lt;/a&gt; starts at &lt;strong&gt;just $8 per month&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Integrations available on release
&lt;/h3&gt;

&lt;p&gt;Raygun APM for Ruby works with your current development environment and already has all of the features you need to diagnose issues quickly. Slack, Jira, and GitHub integrations are all available today, with more being released soon.&lt;/p&gt;

&lt;h4&gt;
  
  
  Slack
&lt;/h4&gt;

&lt;p&gt;Report issues directly into a specific channel where you can assign, ignore, or resolve issues directly in Slack. Advanced filtering makes sure you are only alerted to the issues that matter.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fiwymvk1uwyre8c8f3wmo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fiwymvk1uwyre8c8f3wmo.png" alt="Raygun APM for Ruby alerts you of issues in your team's Slack"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Jira Software
&lt;/h4&gt;

&lt;p&gt;There’s no need to copy-paste contextual information about errors into tickets in Jira. Create a new issue or add information to an existing issue in just a couple of clicks. All the information you and your team need to resolve the error will appear on the ticket.&lt;/p&gt;

&lt;h4&gt;
  
  
  GitHub
&lt;/h4&gt;

&lt;p&gt;Raygun's source code integration with GitHub links the diagnostic details captured to the source code in your GitHub repository for faster resolution.&lt;/p&gt;

&lt;p&gt;&lt;a href="/blog/images/announcing-ruby-apm/github-integration.png" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/announcing-ruby-apm/github-integration.png" alt="Raygun APM has an integration with GitHub to help devs find the exact line of code"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you'd like to read more about our integrations, you can head to our &lt;a href="https://raygun.com/documentation/product-guides/apm/integrations/overview/" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to get set up with Raygun APM for Ruby
&lt;/h3&gt;

&lt;p&gt;It’s easy to get started with our lightweight agent. Simply &lt;a href="https://raygun.com/platform/apm" rel="noopener noreferrer"&gt;take a free 14-day trial today&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here are some quick links for getting set up.&lt;/p&gt;

&lt;p&gt;You can find all the below instructions in the &lt;a href="https://raygun.com/documentation/product-guides/apm/getting-started/" rel="noopener noreferrer"&gt;Getting Started&lt;/a&gt; documentation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://raygun.com/documentation/product-guides/apm/agent/installation/" rel="noopener noreferrer"&gt;Agent installation guides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raygun.com/documentation/language-guides/ruby/apm/installation/" rel="noopener noreferrer"&gt;Set up the Ruby profiling gem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raygun.com/documentation/product-guides/apm/workflow-guide/" rel="noopener noreferrer"&gt;Best practices for adding Ruby APM to your workflow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you need any additional help getting set up, &lt;a href="https://raygun.com/about/contact" rel="noopener noreferrer"&gt;contact our team here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Raygun’s latest support for Ruby provides end-to-end monitoring capabilities across your entire tech stack. We provide more detail and better data visualization than any solution on the market today. Thanks to our usage-based pricing, you’ll get sophisticated Ruby performance monitoring for a great price, no matter what your architecture looks like.&lt;/p&gt;

&lt;p&gt;Raygun APM is currently available for Ruby, .NET, Azure App Service, and .NET Core, but watch this space for Node.js, Java, and more. &lt;a href="https://docs.google.com/forms/d/e/1FAIpQLSedqbo5gsJEiSO6wxj3YslJdA4_c-DarOz5kFNSqDuUJ21ufA/viewform" rel="noopener noreferrer"&gt;Request to be notified when your language becomes available&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>performance</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>Keeping Netflix reliable, tech leaders' views on customer experience, and the Advent of Code</title>
      <dc:creator>Raygun Staff</dc:creator>
      <pubDate>Thu, 26 Nov 2020 22:00:53 +0000</pubDate>
      <link>https://forem.com/raygun/keeping-netflix-reliable-tech-leaders-views-on-customer-experience-and-the-advent-of-code-4o7k</link>
      <guid>https://forem.com/raygun/keeping-netflix-reliable-tech-leaders-views-on-customer-experience-and-the-advent-of-code-4o7k</guid>
      <description>&lt;p&gt;Hi folks, &lt;/p&gt;

&lt;p&gt;Welcome back to Performance Matters. This time, we're proud to bring you the recording from our live &lt;a href="https://raygun.com/blog/tech-leaders-panel-auckland/" rel="noopener noreferrer"&gt;Tech Leaders event&lt;/a&gt;. With Raygun's CEO John-Daniel Trask at the helm, the conversation brought together a wealth of insights into how to prioritize the customer during design and development. &lt;/p&gt;

&lt;p&gt;Read on for the latest engineering article from Netflix, the t-shirt inspired by 40ms of latency, and the holiday challenge Avent of Code is almost here. &lt;/p&gt;

&lt;p&gt;Enjoy! &lt;/p&gt;

&lt;p&gt;Your Curator &lt;/p&gt;




&lt;h3&gt;
  
  
  FEATURED ARTICLES
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fob1o6qygdnpoqk40xhl2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fob1o6qygdnpoqk40xhl2.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How tech leaders are prioritizing customer experience&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In today’s climate, companies are faced with many challenges. But one thing should remain the same — the focus on delivering value to the customer. Raygun's latest Tech Leaders' Panel brought this sentiment front-and-center. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://raygun.com/blog/tech-leaders-panel-auckland/" rel="noopener noreferrer"&gt;Read the highlights and watch the full panel&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Keeping Netflix reliable&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Netflix engineering team share how they build a more resilient system with load shedding.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://netflixtechblog.com/keeping-netflix-reliable-using-prioritized-load-shedding-6cc827b02f94" rel="noopener noreferrer"&gt;Read the breakdown&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;40 milliseconds of latency&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Rachelbythebay recalls no matter what the team tried, 40 milliseconds of latency remained.  &lt;/p&gt;

&lt;p&gt;&lt;a href="http://rachelbythebay.com/w/2020/10/14/lag/" rel="noopener noreferrer"&gt;See where it was found&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  BUG OF THE WEEK
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Hacking Apple&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A white-hat hacker team of 20-year olds spent three months hacking into Apple. They found 55 vulnerabilities, 11 of them critical, potentially earning the team half a million dollars. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://arstechnica.com/information-technology/2020/10/white-hat-hackers-who-had-control-of-internal-apple-network-get-288000-reward/" rel="noopener noreferrer"&gt;Read the overview&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The large-scale AWS outage&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At the time of writing this edition of Performance Matters, AWS is currently having an outage, taking a portion of the internet down with it. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://status.aws.amazon.com/" rel="noopener noreferrer"&gt;View the status page&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  COMMUNITY
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The Advent of Code is here&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A fun and collaborative project for you and your team to get involved in is the Advent of Code challenge. A new coding challenge unlocks every day from December 1st. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/klyse/advent-of-code-2020-2c04"&gt;Join in and create a leaderboard&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;If you think Performance Matters is pretty great, why not &lt;a href="https://performancematters.dev/" rel="noopener noreferrer"&gt;sign up&lt;/a&gt; to receive it in your inbox every week? 🙌&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgylnptlhm42m5jlmim8p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgylnptlhm42m5jlmim8p.png" alt="Made with Love by Raygun"&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>performance</category>
      <category>monitoring</category>
      <category>performancematters</category>
    </item>
    <item>
      <title>APM workflows, performance and emotion, and PS5 crashing Walmart's website</title>
      <dc:creator>Raygun Staff</dc:creator>
      <pubDate>Thu, 19 Nov 2020 21:15:17 +0000</pubDate>
      <link>https://forem.com/raygun/apm-workflows-performance-and-emotion-and-ps5-crashing-walmart-s-website-2k4l</link>
      <guid>https://forem.com/raygun/apm-workflows-performance-and-emotion-and-ps5-crashing-walmart-s-website-2k4l</guid>
      <description>&lt;p&gt;Hey folks, &lt;/p&gt;

&lt;p&gt;Welcome back to yet another edition of Performance Matters, your hub for software performance tips, tricks, and news. &lt;/p&gt;

&lt;p&gt;Do you feel as though you have an effective APM workflow? Well, this week we're digging deep and providing &lt;a href="https://raygun.com/blog/apm-workflow-guide/"&gt;3 powerful workflows&lt;/a&gt; that you can use with Raygun. We'll also be looking into how emotion and performance are correlated, the PS5 launch taking down Walmart's website and more.&lt;/p&gt;

&lt;p&gt;Enjoy! &lt;/p&gt;

&lt;p&gt;Your Curator &lt;/p&gt;




&lt;h3&gt;
  
  
  FEATURED ARTICLES
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--O4dPC6nA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/py3a8d9fn2buhvzgkzk9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--O4dPC6nA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/py3a8d9fn2buhvzgkzk9.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to build 3 powerful APM workflows with Raygun&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There are many ways we can approach improving application performance on any given day. By the end of this article, you’ll have a powerful new APM workflow at each stage of your SDLC that will help you detect, diagnose, and resolve performance problems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://raygun.com/blog/apm-workflow-guide/"&gt;Improve your workflow&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Performance's impact on emotion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;How does your site make users feel? Performance and emotion are more closely intertwined than you think.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tech.bluesmoon.info/2020/11/understanding-emotion-for-happy-users.html"&gt;Delight your users&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Back/forward cache&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Optimize your pages for instant loads when using the browser's back and forward buttons.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://web.dev/bfcache/"&gt;Reap the benefits&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  BUG OF THE WEEK
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Walmart disappointed several gamers this week&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With the release of the brand new PS5, it should come as no surprise that gamers flooded to retailers stocking the elusive console in record numbers. Unfortunately, Walmart's website couldn't keep up with the demand. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.gamespot.com/articles/walmarts-website-has-issues-as-people-frantically-order-ps5/1100-6484378/"&gt;The power of gamers&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  COMMUNITY
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The speed geek's favorite time of year&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Passionate about a topic? Working on a new tool? Have a technique you want to teach? Research you’ve done? Tell the web performance community!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://calendar.perfplanet.com/contribute/"&gt;Make a contribution&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The results are in!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the Google Page Experience Update was rolling out in December 2020, how ready and optimized do you think your site(s) would be? &lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/izzionfire/status/1328378928390672384"&gt;See what the polls say&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;If you think Performance Matters is pretty great, why not &lt;a href="https://performancematters.dev/"&gt;sign up&lt;/a&gt; to receive it in your inbox every week? 🙌&lt;/p&gt;




&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZgPJXwdz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/gylnptlhm42m5jlmim8p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZgPJXwdz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/gylnptlhm42m5jlmim8p.png" alt="Made with Love by Raygun"&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>performance</category>
      <category>monitoring</category>
      <category>performancematters</category>
    </item>
    <item>
      <title>Search engines, speed tests, and debugging at Google</title>
      <dc:creator>Raygun Staff</dc:creator>
      <pubDate>Thu, 12 Nov 2020 20:38:02 +0000</pubDate>
      <link>https://forem.com/raygun/search-engines-speed-tests-and-debugging-at-google-3o27</link>
      <guid>https://forem.com/raygun/search-engines-speed-tests-and-debugging-at-google-3o27</guid>
      <description>&lt;p&gt;Hey folks, &lt;/p&gt;

&lt;p&gt;Welcome back to Performance Matters 👋 This week, we're inspired by &lt;a href="https://webmasters.googleblog.com/2020/11/timing-for-page-experience.html"&gt;Google's announcement&lt;/a&gt; that page experience signals would be included in Google Search ranking from May 2021. This should come as no surprise, but it's a timely reminder to keep pushing for speed and adopting new performance metrics.&lt;/p&gt;

&lt;p&gt;We've also released &lt;a href="https://raygun.com/blog/october-launch-notes-2020/"&gt;Raygun's October launch notes&lt;/a&gt; if you want to catch up on what we've been shipping 🚀&lt;/p&gt;

&lt;p&gt;Enjoy! &lt;/p&gt;

&lt;p&gt;Your Curator &lt;/p&gt;




&lt;h3&gt;
  
  
  FEATURED ARTICLES
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2AQTAhY9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/o5ir7969g2ygofqyedn7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2AQTAhY9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/o5ir7969g2ygofqyedn7.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web performance and search engines&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There is a lot of talk about web performance as a ranking signal in Search Engines and how important or not it is, but often people are overlooking how performance affects multiple phases of a search engine such as crawling, rendering, and indexing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ldnwebperf.org/sessions/web-performance-and-search-engines-a-look-beyond-ranking/"&gt;Take a look beyond ranking&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Reducing variability in metrics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This article looks at three different websites and investigates how much running tests 1, 3, 5, or 7 times reduces variability.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.debugbear.com/blog/web-performance-test-variability"&gt;Find your average speed&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Getting fast and staying there&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Getting fast is difficult, staying fast even more so. How do successful companies ensure that their site speed stays at peak?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://simonhearne.com/2020/getting-fast-staying-there/"&gt;Maintain your speed&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  BUG OF THE WEEK
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Debugging incidents in Google's distributed systems&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Learn how engineers at Google debug production issues, including the types of tools, high-level strategies, and low-level tasks that engineers use in varying combinations to debug effectively.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dl.acm.org/doi/pdf/10.1145/3400899.3404974"&gt;Google's debugging workflow&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  COMMUNITY
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Npm's new public roadmap and feedback process&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Npm is the world’s largest package registry, powering the world’s largest development community—JavaScript. Their new public roadmap and feedback process takes their collaboration with the community to a whole new level.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.blog/2020-10-22-introducing-the-npm-public-roadmap-and-a-new-feedback-process/"&gt;Npm's open lines of communication&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Raygun's launch notes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tech Leaders’ Panel, spike protection, and more. Catch up on all the updates in our monthly launch notes. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://raygun.com/blog/october-launch-notes-2020/"&gt;See what we've been working on&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;If you think Performance Matters is pretty great, why not &lt;a href="https://performancematters.dev/"&gt;sign up&lt;/a&gt; to receive it in your inbox every week? 🙌&lt;/p&gt;




&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZgPJXwdz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/gylnptlhm42m5jlmim8p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZgPJXwdz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/gylnptlhm42m5jlmim8p.png" alt="Made with Love by Raygun"&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>performance</category>
      <category>monitoring</category>
      <category>performancematters</category>
    </item>
    <item>
      <title>Redefining customer experience, Ruby EC2 instances, and register for AWS re:Invent</title>
      <dc:creator>Raygun Staff</dc:creator>
      <pubDate>Thu, 05 Nov 2020 20:39:04 +0000</pubDate>
      <link>https://forem.com/raygun/redefining-customer-experience-ruby-ec2-instances-and-register-for-aws-re-invent-2929</link>
      <guid>https://forem.com/raygun/redefining-customer-experience-ruby-ec2-instances-and-register-for-aws-re-invent-2929</guid>
      <description>&lt;p&gt;Hi folks, &lt;/p&gt;

&lt;p&gt;Welcome to Performance Matters. This week, we're excited to bring you the &lt;a href="https://youtu.be/mLGVeNkv0LA" rel="noopener noreferrer"&gt;latest Tech Leaders' panel event&lt;/a&gt;. You won't want to miss the insights on building customer-centric software from some of the brightest minds in tech. &lt;/p&gt;

&lt;p&gt;We've also got the latest from CSS-Tricks, an interesting case study on which EC2 instance you should use for your Rails app, and an invite to the virtual AWS re:Invent conference.  &lt;/p&gt;

&lt;p&gt;Enjoy! &lt;/p&gt;

&lt;p&gt;Your Curator &lt;/p&gt;




&lt;h3&gt;
  
  
  FEATURED ARTICLES
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fl4xoek0292w053yiofhg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fl4xoek0292w053yiofhg.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tech Leaders event now on YouTube&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In today’s digital world, leading companies are having to redefine what it means to deliver a flawless experience for their customers. This panel discussion holds some excellent learnings from seasoned leaders and is worth a watch. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/mLGVeNkv0LA" rel="noopener noreferrer"&gt;Customer experiences in today's digital world&lt;/a&gt;&lt;/p&gt;

&lt;center&gt;*(Please note that in New Zealand we have no social distancing rules or mask requirements in place.)*&lt;/center&gt;




&lt;p&gt;&lt;strong&gt;CSS Tricks and performance&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The latest version of the popular newsletter has a strong focus on Real User Monitoring and performance. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://css-tricks.com/newsletter/223-core-web-vital-tooling/" rel="noopener noreferrer"&gt;Read the web version&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The best EC2 instance type&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So what type of EC2 instances should you run your Rails app on? The answer is simpler than it looks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.fastruby.io/blog/rails/performance/ruby/best-ec2-instance-for-rails-apps.html" rel="noopener noreferrer"&gt;Read the breakdown&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  BUG OF THE WEEK
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The software bugs that are years old, but haven't been patched&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Almost two-thirds of vulnerabilities on enterprise networks involve flaws that are over two years old that have not been patched, despite fixes being available. They’re now at risk from bugs that could have been fixed years ago. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.zdnet.com/article/these-software-bugs-are-years-old-but-businesses-still-arent-patching-them/" rel="noopener noreferrer"&gt;Read the article&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  COMMUNITY
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;AWS re:Invent registration is open — and it's free&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Unlimited access to hundreds of sessions, this year's AWS event is not to be missed. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://reinvent.awsevents.com/" rel="noopener noreferrer"&gt;Check out the speakers and register here&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;If you think Performance Matters is pretty great, why not &lt;a href="https://performancematters.dev/" rel="noopener noreferrer"&gt;sign up&lt;/a&gt; to receive it in your inbox every week? 🙌&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgylnptlhm42m5jlmim8p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgylnptlhm42m5jlmim8p.png" alt="Made with Love by Raygun"&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>performance</category>
      <category>performancematters</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>Optimizing WordPress &amp; Webflow, what is RUM, and the Tech Leaders' Livestream</title>
      <dc:creator>Raygun Staff</dc:creator>
      <pubDate>Thu, 29 Oct 2020 20:52:42 +0000</pubDate>
      <link>https://forem.com/raygun/optimizing-wordpress-webflow-what-is-rum-and-the-tech-leaders-livestream-57h1</link>
      <guid>https://forem.com/raygun/optimizing-wordpress-webflow-what-is-rum-and-the-tech-leaders-livestream-57h1</guid>
      <description>&lt;p&gt;Hi folks, &lt;/p&gt;

&lt;p&gt;Welcome back to Performance Matters. Next week we're excited to bring you the &lt;a href="https://www.eventbrite.co.nz/e/livestream-tech-leaders-panel-new-zealand-tickets-127082550329"&gt;Tech Leaders' Panel event&lt;/a&gt;, live all the way from NZ. Join us, as we talk with leaders from Vend, Xero, and Lancom, about how they're putting the customer experience at the center of their development workflow.&lt;/p&gt;

&lt;p&gt;In this edition, we're digging deep into performance optimizations on WordPress and Webflow, recapping the benefits of RUM, and looking at the real-world implications of voter registration websites crashing a week out from an election.&lt;/p&gt;

&lt;p&gt;Enjoy! &lt;/p&gt;

&lt;p&gt;Your Curator &lt;/p&gt;




&lt;h3&gt;
  
  
  FEATURED ARTICLES
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--A72SQsHH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1cooo8qem6mt9nwc3voz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A72SQsHH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1cooo8qem6mt9nwc3voz.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is Real User Monitoring and how can it help teams?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Real User Monitoring tools help software teams to identify front-end performance issues, measure trends in application performance, and improve the customer experience. Find out whether it's right for you. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://raygun.com/learn/what-is-real-user-monitoring"&gt;How RUM can help&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Performance optimizations to speed up your Webflow site&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A handful of recent updates to Webflow that let you optimize your site for even faster performance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://webflow.com/blog/performance-optimization-features-to-make-your-site-run-even-faster"&gt;Speed up Webflow&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;28 tips to help speed up your WordPress site&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A comprehensive list of tips to help you get the best performance possible from your WordPress site. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://onlinemediamasters.com/slow-wordpress-site/"&gt;Optimize WordPress&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  BUG OF THE WEEK
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Registration websites are crashing, locking out would-be voters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;From Florida, callers said the voter registration website had collapsed, locking them out just as the deadline for registering to vote approached.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://thenextweb.com/syndication/2020/10/28/voter-registration-websites-are-crashing-locking-out-would-be-voters/"&gt;Here's how they reacted&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  COMMUNITY
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Monitoring what matters: Prioritizing customer experiences in today's digital world (Livestream)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this &lt;a href="https://www.eventbrite.co.nz/e/livestream-tech-leaders-panel-new-zealand-tickets-127082550329"&gt;exclusive panel discussion&lt;/a&gt;, you will learn how software teams at Vend, Xero, Tend Health, and Lancom put the customer experience at the center of their development workflow, closing the feedback loop between code and customer. Join us live - we'd love to see you there!&lt;/p&gt;




&lt;p&gt;If you think Performance Matters is pretty great, why not &lt;a href="https://performancematters.dev/"&gt;sign up&lt;/a&gt; to receive it in your inbox every week? 🙌&lt;/p&gt;




&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZgPJXwdz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/gylnptlhm42m5jlmim8p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZgPJXwdz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/gylnptlhm42m5jlmim8p.png" alt="Made with Love by Raygun"&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>performance</category>
      <category>monitoring</category>
      <category>performancematters</category>
    </item>
    <item>
      <title>Monitoring and Performance Wrap Up - October 2020</title>
      <dc:creator>Raygun Staff</dc:creator>
      <pubDate>Thu, 29 Oct 2020 00:56:56 +0000</pubDate>
      <link>https://forem.com/raygun/monitoring-and-performance-wrap-up-october-2020-199j</link>
      <guid>https://forem.com/raygun/monitoring-and-performance-wrap-up-october-2020-199j</guid>
      <description>&lt;p&gt;Hi! I'm Helen, one of your friendly mods looking after the #monitoring and #performance tags. &lt;/p&gt;

&lt;p&gt;At the end of each month, I'll be showcasing some of the great posts, projects, and insights from the Dev community. &lt;/p&gt;




&lt;p&gt;To kick us off this month we have &lt;a href="https://dev.to/jstarmx"&gt;James&lt;/a&gt; who has written their first post detailing the mechanics of each step a browser goes through to render a web page so that each can be considered and optimised during development. Welcome to Dev James!&lt;/p&gt;





&lt;div class="ltag__link"&gt;
  &lt;div class="ltag__link__content"&gt;
    &lt;div class="missing"&gt;
      &lt;h2&gt;Article No Longer Available&lt;/h2&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;





&lt;p&gt;Next, &lt;a href="https://dev.to/codyjasonbennett"&gt;Cody&lt;/a&gt; introduces us to the Observer API. There are four different types of observers that observe different things -- from the DOM to browser performance.&lt;/p&gt;





&lt;div class="ltag__link"&gt;
  &lt;div class="ltag__link__content"&gt;
    &lt;div class="missing"&gt;
      &lt;h2&gt;Article No Longer Available&lt;/h2&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;





&lt;p&gt;&lt;a href="https://dev.to/jsbroks"&gt;Justin&lt;/a&gt; then shows us how to optimise using lazy loading components in Vue. A few extra seconds could have a huge impact on the number of users visiting your site. This means that having a fast site is important, not just for ranking well in Google Search Engine, but for having users interact with your webpage.&lt;/p&gt;





&lt;div class="ltag__link"&gt;
  &lt;a href="/jsbroks" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F443133%2F36a9a77d-37c7-43fd-bb93-313032ed09c7.png" alt="jsbroks"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/jsbroks/lazy-loading-components-in-vue-3-21o7" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Lazy loading components in Vue 3&lt;/h2&gt;
      &lt;h3&gt;Justin Brooks ・ Oct 5 '20&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#vue&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#performance&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;





&lt;p&gt;Sticking with Vue, our next post from &lt;a href="https://dev.to/marianapicolo"&gt;Mariana&lt;/a&gt; takes us through a refactoring project. Refactors are never easy but can make a huge difference in performance. This is Mariana's first post too, welcome to Dev!&lt;/p&gt;





&lt;div class="ltag__link"&gt;
  &lt;a href="/marianapicolo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F87404%2Fc6400ecd-f681-49ac-b6d4-b9c8e419c07a.jpg" alt="marianapicolo"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/marianapicolo/my-notes-about-conducting-a-massive-refactor-in-a-vue-js-website-bo7" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;My notes about conducting a massive refactor in a Vue.js website&lt;/h2&gt;
      &lt;h3&gt;Mariana Pícolo ・ Oct 22 '20&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#vue&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#frontend&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#architecture&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#performance&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;





&lt;p&gt;Next, &lt;a href="https://dev.to/brenohq"&gt;Breno&lt;/a&gt; focuses on the first steps you can take to approach web performance. Great first post, welcome to Dev Breno!&lt;/p&gt;





&lt;div class="ltag__link"&gt;
  &lt;a href="/brenohq" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F476765%2Fc00f3ef9-d1f7-45af-8bd3-aaf2dc512393.jpeg" alt="brenohq"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/brenohq/5-things-you-need-to-know-about-web-performance-in-2020-33j8" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;5 things you need to know about web performance in 2020&lt;/h2&gt;
      &lt;h3&gt;Breno Henrique ・ Oct 5 '20&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#performance&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#html&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#javascript&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;





&lt;p&gt;To wrap up this months posts we have a discussion from &lt;a href="https://dev.to/pp"&gt;Pawel&lt;/a&gt; from the Dev team on lazing loading images. Are there any cons and gotchas to look out for? Check out the discussion for more.&lt;/p&gt;





&lt;div class="ltag__link"&gt;
  &lt;a href="/devteam" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F1%2Fd908a186-5651-4a5a-9f76-15200bc6801f.jpg" alt="The DEV Team"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F257782%2Fc0b05267-63ab-4829-83c8-9ad687d49959.png" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/devteam/any-reason-for-not-using-loading-lazy-attribute-3gn8" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Any reason for not using loading="lazy" attribute?&lt;/h2&gt;
      &lt;h3&gt;Paweł Ludwiczak for The DEV Team ・ Oct 26 '20&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#html&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#performance&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#explainlikeimfive&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;








&lt;p&gt;That's all for this month! For more, check out the #monitoring and #performance tags.&lt;/p&gt;

</description>
      <category>monitoring</category>
      <category>performance</category>
      <category>bestofdev</category>
    </item>
    <item>
      <title>The cost of QA is falling, LinkedIn's scale achievements, and taking care of the details</title>
      <dc:creator>Raygun Staff</dc:creator>
      <pubDate>Mon, 26 Oct 2020 20:20:33 +0000</pubDate>
      <link>https://forem.com/raygun/the-cost-of-qa-is-falling-linkedin-s-scale-achievements-and-taking-care-of-the-details-14c0</link>
      <guid>https://forem.com/raygun/the-cost-of-qa-is-falling-linkedin-s-scale-achievements-and-taking-care-of-the-details-14c0</guid>
      <description>&lt;p&gt;Hi folks, &lt;/p&gt;

&lt;p&gt;Welcome back to Performance Matters. &lt;/p&gt;

&lt;p&gt;In this edition, we have something for everyone. Read about how the cost of software quality could be falling, LinkedIn Engineering's deep dive on Linux filesystem performance regressions, and the virtual summit coming to your screens soon. &lt;/p&gt;

&lt;p&gt;Enjoy! &lt;/p&gt;

&lt;p&gt;Your Curator &lt;/p&gt;




&lt;h3&gt;
  
  
  FEATURED ARTICLES
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Wiwr9q7T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/olvrn7uisnsivuz66cb2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Wiwr9q7T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/olvrn7uisnsivuz66cb2.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A move in the right direction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The results are in: Quality assurance (QA) testing quality is going up while costs are coming down. The share of IT budget allocated to QA testing has been falling year-on-year for the last four years.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.forbes.com/sites/forbestechcouncil/2020/10/20/three-reasons-software-testing-delivers-better-quality-for-less-money/"&gt;What does that mean for software teams?&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Preserving software quality&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;From formatting code to writing docs, the mundane tasks could be the most important. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.scottlogic.com/2020/10/15/van-halens-rider-and-software-development.html"&gt;Build a culture of quality&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Linux perf. regressions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;LinkedIn shares a new set of learnings from refining their processes for scale. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://engineering.linkedin.com/blog/2020/fixing-linux-filesystem-performance-regressions"&gt;Read the case study&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  BUG OF THE WEEK
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The cause of Twitter's outage is still unclear&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;“We have no evidence of a security breach or hack, and we’re currently investigating internal causes,” a Twitter spokesperson said in a statement to The Verge.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.theverge.com/2020/10/15/21518367/twitter-down-outage-tweets"&gt;So what happened?&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  COMMUNITY
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;DevOps Experience&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Returning for its third year, DevOps Experience is back with more great stories of DevOps transformations, including talks on observability and monitoring. With speakers from Netflix, Microsoft, and more, it's worth adding to the calendar. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://devopsexperience.io/"&gt;Get the details and see the line-up&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;If you think Performance Matters is pretty great, why not &lt;a href="https://performancematters.dev/"&gt;sign up&lt;/a&gt; to receive it in your inbox every week? 🙌&lt;/p&gt;




&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZgPJXwdz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/gylnptlhm42m5jlmim8p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZgPJXwdz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/gylnptlhm42m5jlmim8p.png" alt="Made with Love by Raygun"&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>performance</category>
      <category>monitoring</category>
      <category>performancematters</category>
      <category>testing</category>
    </item>
    <item>
      <title>Business outcomes vs. performance, Heroku's struggle, and free Stanford CS courses</title>
      <dc:creator>Raygun Staff</dc:creator>
      <pubDate>Thu, 15 Oct 2020 20:39:48 +0000</pubDate>
      <link>https://forem.com/raygun/business-outcomes-vs-performance-heroku-s-struggle-and-free-stanford-cs-courses-2f3c</link>
      <guid>https://forem.com/raygun/business-outcomes-vs-performance-heroku-s-struggle-and-free-stanford-cs-courses-2f3c</guid>
      <description>&lt;p&gt;Hi folks, &lt;/p&gt;

&lt;p&gt;Welcome back to Performance Matters. Thank you to everyone who has had a chance to check out our new &lt;a href="https://raygun.com/blog/announcing-ruby-application-performance-monitoring/" rel="noopener noreferrer"&gt;Ruby APM!&lt;/a&gt; We hope you're enjoying using it as much as we enjoyed making it 🚀&lt;/p&gt;

&lt;p&gt;Today, we're digging deep into the link between site speed and business outcomes, the performance of Ruby 3.0.0-preview1, and why Heroku's raw power is struggling to keep up.  &lt;/p&gt;

&lt;p&gt;Enjoy! &lt;/p&gt;

&lt;p&gt;Your Curator &lt;/p&gt;




&lt;h3&gt;
  
  
  FEATURED ARTICLES
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgl72e3oyleezsrw9zh7t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgl72e3oyleezsrw9zh7t.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengthening the link between site speed and business outcomes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As performance advocates, we champion the idea that improving performance adds value, but improving site speed comes with a cost. We need to persuade other stakeholders to prioritize and invest in performance by showing its value.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://andydavies.me/blog/2020/10/12/strengthening-the-link-between-site-speed-and-business-outcomes/" rel="noopener noreferrer"&gt;Make the perfect pitch&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;How's the performance of Ruby 3.0.0–preview1?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;How does the new preview's performance stack up on Rails? And how reliable are these numbers?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.fastruby.io/blog/rails/performance/ruby/hows-the-performance-of-ruby-3.0.0-preview1.html" rel="noopener noreferrer"&gt;Let's find out&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Heroku is being left in the dust when it comes to raw power&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When thinking about server pricing, don't forget about single-thread performance. Slower ≠ cheaper.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mailchi.mp/railsspeed/why-single-thread-performance-matters?e=667f67d277" rel="noopener noreferrer"&gt;See why&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  BUG OF THE WEEK
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Microsoft’s cloud-based Azure App Services could have allowed server-side forgery requests and remote code-execution attacks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Researchers have disclosed two flaws in Microsoft’s Azure web hosting application service, App Services, which if exploited could enable an attacker to take over administrative servers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://threatpost.com/microsoft-azure-flaws-servers-takeover/159965/" rel="noopener noreferrer"&gt;Understand the flaws&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  COMMUNITY
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;150+ Stanford Computer Science courses available online&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A compilation of over 150 Stanford on-campus computer science courses that are, to varying degrees, available online.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.classcentral.com/report/stanford-on-campus-courses/" rel="noopener noreferrer"&gt;Start learning&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Raygun's September launch notes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Raygun’s Launch Notes are your regular round-up of all the improvements we made to Raygun last month — from significant features to performance updates.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://raygun.com/blog/september-launch-notes-2020/" rel="noopener noreferrer"&gt;What's been happening&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;If you think Performance Matters is pretty great, why not &lt;a href="https://performancematters.dev/" rel="noopener noreferrer"&gt;sign up&lt;/a&gt; to receive it in your inbox every week? 🙌&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9uejrprdahebsqbx1myx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9uejrprdahebsqbx1myx.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>performancematters</category>
      <category>performance</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>Announcing Ruby APM, causal graphs at Slack, and Carole Baskin's take on AWS</title>
      <dc:creator>Raygun Staff</dc:creator>
      <pubDate>Thu, 08 Oct 2020 20:42:51 +0000</pubDate>
      <link>https://forem.com/raygun/announcing-ruby-apm-casual-graphs-at-slack-and-carole-baskin-s-take-on-aws-2l6o</link>
      <guid>https://forem.com/raygun/announcing-ruby-apm-casual-graphs-at-slack-and-carole-baskin-s-take-on-aws-2l6o</guid>
      <description>&lt;p&gt;Hi folks, &lt;/p&gt;

&lt;p&gt;Welcome back to Performance Matters. This week at Raygun, we've been busy &lt;a href="https://raygun.com/blog/announcing-ruby-application-performance-monitoring" rel="noopener noreferrer"&gt;launching the general availability of Ruby APM&lt;/a&gt; 🙌.  Read all about how we're different from other APM players, and how we are redefining what APM should be for developers.&lt;/p&gt;

&lt;p&gt;Read on for the latest update from the Chromium blog, how Slack's senior software engineers approach debugging complex systems, and David Hasselhof, Flavor Flav, and Carole Baskin help simplify DevOps. &lt;/p&gt;

&lt;p&gt;Enjoy! &lt;/p&gt;

&lt;p&gt;Your Curator &lt;/p&gt;




&lt;h3&gt;
  
  
  FEATURED ARTICLES
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuxmsk0tk65qpbexgi4kr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuxmsk0tk65qpbexgi4kr.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ruby APM now available in Raygun&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We are thrilled to launch the next chapter in our ongoing support for Application Performance Monitoring: Ruby support for Raygun APM. Ruby teams can now get end-to-end monitoring with features like detailed trace transactions, dashboards, code execution, and more.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://raygun.com/blog/announcing-ruby-application-performance-monitoring" rel="noopener noreferrer"&gt;Read about the launch&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Chrome is deploying HTTP/3 and IETF and QUIC&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The latest update to Google will bring some additional performance improvements to Chrome.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.chromium.org/2020/10/chrome-is-deploying-http3-and-ietf-quic.html" rel="noopener noreferrer"&gt;Read the announcement&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tracing at Slack — Thinking in causal graphs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;“Why is it slow?” is the hardest problem to debug in a complex distributed system like Slack.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://slack.engineering/tracing-at-slack-thinking-in-causal-graphs/" rel="noopener noreferrer"&gt;Diagnosing slow channels&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  BUG OF THE WEEK
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A Facebook bug exposed anonymous admins of pages&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A bad code update allowed anyone to easily reveal which accounts posted to Facebook Pages—including celebrities and politicians—for several hours. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.wired.com/story/facebook-bug-page-admins-edit-history-doxxing/" rel="noopener noreferrer"&gt;The unexpected bug&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  COMMUNITY
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Celebrities explain DevOps&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;David Hasselhof, Flavor Flav, and Carole Baskin help simplify AWS, Kubernetes, and Docker. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://cto.ai/blog/celebrities-explain-devops/" rel="noopener noreferrer"&gt;Please enjoy the video thoroughly&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;If you think Performance Matters is pretty great, why not &lt;a href="https://performancematters.dev/" rel="noopener noreferrer"&gt;sign up&lt;/a&gt; to receive it in your inbox every week? 🙌&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8sahfwo6v3g5llqmozcn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8sahfwo6v3g5llqmozcn.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>performance</category>
      <category>monitoring</category>
      <category>performancematters</category>
    </item>
    <item>
      <title>Shopify's Ruby monolith, common PostgreSQL bottlenecks, and Wikipedia's new look</title>
      <dc:creator>Raygun Staff</dc:creator>
      <pubDate>Fri, 02 Oct 2020 02:25:51 +0000</pubDate>
      <link>https://forem.com/raygun/shopify-s-ruby-monolith-common-postgresql-bottlenecks-and-wikipedia-s-new-look-2od7</link>
      <guid>https://forem.com/raygun/shopify-s-ruby-monolith-common-postgresql-bottlenecks-and-wikipedia-s-new-look-2od7</guid>
      <description>&lt;p&gt;Hi folks, &lt;/p&gt;

&lt;p&gt;Welcome back to Performance Matters. It's been another big week here at Raygun with the launch of &lt;a href="https://raygun.com/blog/xhr-level-detail-response-codes/?utm_medium=email&amp;amp;utm_source=perfmatters&amp;amp;utm_campaign=xhrresponse&amp;amp;utm_content=blog" rel="noopener noreferrer"&gt;XHR-level detail for response codes&lt;/a&gt;. This latest feature is part of our journey to provide best-in-class support for single-page applications ⚡️&lt;/p&gt;

&lt;p&gt;In this edition, we're diving deep into the state of Shopify's monolith, we have a guide to solving common PostgreSQL issues, plus why Wikipedia is getting a new look 👀&lt;/p&gt;

&lt;p&gt;Enjoy! &lt;/p&gt;

&lt;p&gt;Your Curator &lt;/p&gt;




&lt;h3&gt;
  
  
  FEATURED ARTICLES
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcpsmgkzhis8v4qh1gjt3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcpsmgkzhis8v4qh1gjt3.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Under deconstruction: The state of Shopify's monolith&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Shopify's core monolith has over 2.8 million lines of Ruby code and 500,000 commits. Over three years ago, Shopify founded a team to investigate how to make their Rails monoliths more modular by creating smaller, independent units of code. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://engineering.shopify.com/blogs/engineering/shopify-monolith" rel="noopener noreferrer"&gt;See the progress (and learnings)&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;PostgreSQL Performance Issues&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Step-by-step guide on using PG Extras library to spot and resolve common PostgreSQL issues.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pawelurbanek.com/postgresql-fix-performance" rel="noopener noreferrer"&gt;Read the guide&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;My website is slow, now what?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You built a great-looking, feature-rich website. But it also has a big problem: it’s just too slow. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/wix-engineering/watch-my-website-is-slow-now-what-dan-shappir-d3d4e882399c" rel="noopener noreferrer"&gt;What do you do? &lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  BUG OF THE WEEK
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Microsoft outage brings down Azure, Office 365, and Teams&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Some users were unable to log into Microsoft's Office 365, Teams, Outlook, and other offerings for three hours late on Monday US time, due to a botched upgrade. Worryingly, the US also suffered an interruption to 911 emergency call services at the same time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.datacenterdynamics.com/en/news/microsoft-outage-brings-down-azure-office-365-and-teams/" rel="noopener noreferrer"&gt;Find out what happened&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  COMMUNITY
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Wikipedia is getting a new look for the first time in 10 years&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Wikipedia has remained a critical and widely-used resource for knowledge across the world for the past two decades and it's about to get a series of improvements. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://diff.wikimedia.org/2020/09/23/wikipedia-is-getting-a-new-look-for-the-first-time-in-10-years-heres-why/" rel="noopener noreferrer"&gt;Here's why&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;SIGNAL 2020 – Now available on-demand&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Twilio’s annual customer and developer conference brings a ton of developers and tech leaders together to help build better customer communications and experiences. This year's event has just wrapped up but now all the content is available on-demand. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://signal.twilio.com/" rel="noopener noreferrer"&gt;Check it out &lt;/a&gt;&lt;/p&gt;




&lt;p&gt;If you think Performance Matters is pretty great, why not &lt;a href="https://performancematters.dev/" rel="noopener noreferrer"&gt;sign up&lt;/a&gt; to receive it in your inbox every week? 🙌&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ff3in3d0co2914exwgmkp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ff3in3d0co2914exwgmkp.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>performancematters</category>
      <category>performance</category>
      <category>monitoring</category>
      <category>ruby</category>
    </item>
  </channel>
</rss>
