• Advanced - C# - Software Engineering

    Advanced C# Tips: Optimize Recursive Functions With Tail Recursion

    Recursive functions are a staple in many programmers’ toolkits. They allow us to solve complex problems by having a function call itself with a different set of parameters until a certain condition is met, known as the base case. This is an elegant way to process data structures like trees or to perform repeated operations until a condition is satisfied. However, recursion comes with its cost. Each recursive call adds a new layer to the stack (a special area in a program’s memory) that tracks where each function should return control once it completes its execution. This is known as…

  • C# - Software Engineering - Advanced

    Advanced C# Tips: Beware of Micro-Optimizing at the Cost of Code Clarity

    Micro-optimizing refers to making small modifications to code in an attempt to improve performance, often at the expense of making the code harder to read, understand, and maintain. While it’s natural for developers to want their applications to run as efficiently as possible, it is also crucial to balance these optimizations with the overall clarity and maintainability of the code. Micro-optimizations may be a bit faster language constructs, helps to handle tricky algorithms for minor performance gains, or restructuring code in a way that makes it harder for others (or even yourself) to understand later. These optimizations are “micro” because…

  • Advanced - C# - Software Engineering

    Advanced C# Tips: Leverage Span for Safe Memory Access

    Span<T> in C# is an innovative feature that revolutionizes how developers work with contiguous memory regions, like arrays or memory blocks. The Span is introduced in C# 7.2 and it is designed to provide a more efficient way to handle slices of data. Technically, Span<T> is a ref struct that represents a contiguous region of arbitrary memory. It’s not limited to arrays; it can point to memory on the stack, in managed memory (like arrays or heap-allocated objects), or even unmanaged memory. This makes it incredibly versatile. The structure of Span<T> includes a pointer to the starting location of the…

  • Software Engineering - Advanced - C#

    Advanced C# Tips: Prefer for Loop Over foreach with Arrays

    In C#, when you want to go through all the items in an array one by one, you can use either a for loop or a foreach loop. Both will get the job done, but there’s a bit of a difference in how they do it, especially when it comes to performance. The for loop gives you more control. You have a counter that keeps track of which item you’re on, and you can use this counter to directly access each element in the array by its index. This is a straightforward operation, and it’s very fast because accessing elements…

  • C# - Software Engineering - Advanced

    Advanced C# Tips: Use readonly Modifier for Immutable Data

    The readonly modifier in C# is a keyword applied to fields that should not change after the constructor for an object has completed. Using readonly indicates that the data is intended to be immutable. This means that it cannot be changed once set. readonly can be particularly useful when you want to create an object that has certain properties that should remain constant throughout the object’s lifetime. It represents unchangeable states or fixed configurations. Immutable data has several advantages in software development. For instance, it is inherently thread-safe because if data cannot change. Multiple threads can access it concurrently without…

  • Amazon Web Services - C# - Beginner - JavaScript - Java - Python

    How to Access AWS Secrets Manager Programmatically with C#, Java, Python and JavaScript

    AWS Secrets Manager is a fully managed service that helps you easily store and retrieve credentials, API keys, and other sensitive data in a secure way. It integrates seamlessly with AWS Identity and Access Management (IAM) to ensure that only authorized users and applications can access your secrets. Beyond simple storage, it also offers basic security practices like automatic rotation of secrets. The main idea of using AWS Secrets Manager is that you no longer need to hardcode sensitive information in your applications or configuration files. Instead, you can reference them securely and fetch them when needed. This practice, sharply…

  • Beginner - Coding - C/C++

    Bedrock of Software – Part 3: The Influence of C on Modern Programming Languages

    Welcome to the third part of our blog series, “C, Bedrock of Software.” In the first part, we explored the origins of C. In the first part, we discussed its creation at Bell Labs and its role in the development of Unix. In the second part, we examined the symbiotic relationship between C and Unix. We saw how they evolved together, shaping the future of computing. In this part, we will focus on how C has influenced modern programming languages. We will see its impact on popular languages like Java, C#, C++, Objective-C, and others. This will show how C’s…

  • Advanced - C# - Software Engineering

    Advanced C# Tips:Prefer Lazy Initialization for Rarely Used Objects

    Lazy loading and eager loading are two contrasting approaches in managing how and when data is loaded into memory in programming, particularly relevant in the context of databases, data processing, and UI rendering. Lazy Loading In lazy loading, data is loaded only when it is required. This can enhance application performance and reduce memory usage, especially when dealing with large datasets or complex objects. For example, consider an e-commerce application that displays product details. With lazy loading, the detailed data for a product (like high-resolution images or reviews) is only loaded when a user selects that product, rather than loading…

  • Advanced - C# - Software Engineering - Programming Languages

    Advanced C# Tips: Avoid Excessive Inlining of Methods

    Inlining methods is a technique where the compiler replaces a method call with the actual method body’s code. While inlining can speed up your program by eliminating the overhead of a method call, excessive inlining can lead to problems. This approach needs to be used carefully since you need to balance performance gains with potential drawbacks. My suggestion will be my typical suggestion, do not use unless it is really necessary. Method inlining can reduce execution time, especially in certain loops or highly repetitive code paths since it removes the overhead of the method call itself. However, excessive inlining can…

  • Software Engineering - Intermediate - Advanced - C#

    Advanced C# Tips: Using Array Segments Instead of Copying Arrays

    Even though it is not a very popular C# tool, the ArraySegment<T> is quite old and it was introduced in .NET Framework 2.0, which was released in 2005. It is available for developers to utilize in their applications to improve performance when dealing with partial arrays. Technically, an ArraySegment is a struct, in other words, it is a value type in C#. When you instantiate an ArraySegment<T>, you are creating a lightweight object that doesn’t have the overhead of a class, such as a reference type’s heap allocation etc. The ArraySegment<T> struct internally holds three pieces of data: a reference…

  • Intermediate - Advanced - Coding - C# - Software Engineering

    Advanced C# Tips: Reuse Objects Where Possible

    Reusing objects in C# is a strategy that aligns with the principles of efficient memory management and application performance optimization. This concept is important in environments where memory resources are limited or when the cost of object creation is high. For instance mobile applications, embedded systems, or server applications handling multiple concurrent requests count as typical examples. The underlying technical reason for object reuse is to reduce the overhead related to the memory allocation and garbage collection. Every time an object is created, the .NET runtime needs to allocate space on the managed heap. As objects accumulate, the garbage collector…

  • C/C++ - Programming Languages - Beginner - Coding

    Bedrock of Software – Part 2: C and Unix – A Symbiotic Relationship

    The best way to describe the relationship between C and Unix will be mutual evolution. Both were developed at Bell Labs and each played a unique role in the other’s success. This symbiotic relationship not only led to the widespread adoption of both C and Unix but also set the foundations of modern computing. Or computing as we know it. Unix began as a small project led by Ken Thompson and Dennis Ritchie at Bell Labs. Remember, Dennis Ritchie is also the inventor of C programming language. The primary principle was to be a simple, multi-tasking, multi-user operating system. In…

  • Advanced - Coding - C# - Software Engineering

    Advanced C# Tips: Utilize ArrayPool for Frequent Array Allocations

    ArrayPool<T> in C# is a very useful but a less known feature. It has been around since .NET 2.0 but has never been popular. In order to understand ArrayPool, we can use the analogy of a communal bike-sharing system. Just as you can pick up a bike when you need it and return it when you’re done. ArrayPool<T> lets you borrow and return arrays, reducing the need to constantly create new ones. This is useful when working with large arrays or in scenarios where arrays are frequently created and discarded. For instance high-performance computing, data processing, or handling large datasets…

  • C# - Software Engineering - Advanced - Coding

    Advanced C# Tips: Consider Leveraging Bitwise Operations for Simple Calculations If Possible

    Bitwise operators in C# are special tools that let you work directly with the individual bits of a number’s binary representation. If you are reading this blog post, I assume you also know that in computing world, numbers are actually stored as sequences of bits. Bitwise operators allow you to perform operations on these sequences bit by bit. They are like the switches that can flip the bits in certain patterns. They allow for a variety of operations such as flipping bits on and off, shifting them left or right, or comparing two values bit by bit. However we can’t…

  • Advanced - Coding - C# - Software Engineering

    Advanced C# Tips: Use Exceptions Wisely

    Exceptions in C# are definitely a great facility but we need to use them wisely. We should leave the least possible probabilities of throwing an exception since exceptions come with a cost. Exceptions simply signal that something has gone wrong in your code. The purpose of an exception is to allow your program to understand and respond unexpected problems like cleaning up resources or notifying the user. However making decisions about the program’s logic is not among the primary purposes of exceptions. Even though I am talking through C#, this is true for all programming languages having exceptions. So, using…

  • C# - Software Engineering - Advanced

    Advanced C# Tips: Prefer Value Types Over Reference Types

    In C#, understanding the difference between value types and reference types is a fundamental topic when writing efficient and performant code. The choice between using a value type (like a struct) or a reference type (like a class) can have significant implications on both memory usage and performance. The technical reasoning behind preferring value types over reference types lies in how they are managed in memory. Reference types are stored on the managed heap and come with an overhead of garbage collection. It can affect performance especially if there are many allocations and deallocations. Additionally, accessing data through a reference…