<?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>DEV Community: Saúl Zalimben</title>
    <description>The latest articles on DEV Community by Saúl Zalimben (@szalimben).</description>
    <link>https://dev.to/szalimben</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%2Fuser%2Fprofile_image%2F101466%2F77609329-54a4-4893-8eb9-f0de5e8a1659.jpg</url>
      <title>DEV Community: Saúl Zalimben</title>
      <link>https://dev.to/szalimben</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/szalimben"/>
    <language>en</language>
    <item>
      <title>Software Architecture Styles</title>
      <dc:creator>Saúl Zalimben</dc:creator>
      <pubDate>Mon, 23 Oct 2023 15:28:14 +0000</pubDate>
      <link>https://dev.to/szalimben/software-architecture-styles-5ffc</link>
      <guid>https://dev.to/szalimben/software-architecture-styles-5ffc</guid>
      <description>&lt;p&gt;Architecture styles help define the basic characteristics and behavior of an application. Some styles lend themselves to highly scalable systems, whereas others lend themselves to applications that allow developers to respond quickly to change.&lt;/p&gt;

&lt;p&gt;Knowing each architecture style’s characteristics, strengths, and weaknesses is necessary to choose the one that meets your specific business needs and goals.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Architecture styles&lt;/strong&gt; describe the macrostructure of a system. An architectural style improves partitioning and promotes design reuse by frequently solving recurring problems.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Architecture patterns&lt;/strong&gt;, on the other hand, describe reusable structural building block patterns that can be used within each of the architectural styles to solve a particular problem.&lt;br&gt;
They provide a structured solution to architectural issues, detailing how components and interactions should be structured for specific functionality.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fuploads%2Farticles%2Fvq4m87e0ow9jw702q665.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%2Fuploads%2Farticles%2Fvq4m87e0ow9jw702q665.png" alt="Architecture styles vs architecture patterns"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Architecture styles can be composed of architectural patterns, which in turn can be composed of design patterns.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;An architecture style can be composed of architectural patterns, which in turn can be composed of design patterns. Design patterns and architecture patterns are typically combined to form a complete solution.&lt;/p&gt;

&lt;p&gt;Architecture styles act in the same way, they can also be combined when building software solutions to form a complete solution.&lt;/p&gt;

&lt;p&gt;Hybrid architectural styles are common in the real world because not every architectural style can solve every business problem.&lt;/p&gt;

&lt;p&gt;The separation of what is architectural and what is design is not commonly agreed upon, nor are the patterns cataloged in any accepted form.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture Classification
&lt;/h2&gt;

&lt;p&gt;Architecture styles are classified as belonging to one of two main architectural structures: &lt;strong&gt;monolithic&lt;/strong&gt; (single deployment unit) and &lt;strong&gt;distributed&lt;/strong&gt; (many deployment units, usually consisting of services).&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%2Fuploads%2Farticles%2Fix8z8qjia93nq85omy4h.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%2Fuploads%2Farticles%2Fix8z8qjia93nq85omy4h.png" alt="Monolithic Architectures"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Monolithic architectures are single deployment units.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;While cost and simplicity are the main strong points of a monolithic architecture, operational characteristics such as scalability, fault tolerance, and elasticity are its weak points.&lt;/p&gt;

&lt;p&gt;Moreover, mean time to recovery (MTTR) and mean time to start (MTTS) are usually measured in minutes, meaning that once a failure does occur, it takes a long time for the application to start back up. These long startup times also impact scalability and elasticity.&lt;/p&gt;

&lt;h4&gt;
  
  
  What is Monolithic Architecture?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Monolithic architecture is an architectural style of designing and developing complete applications as a &lt;strong&gt;single unit&lt;/strong&gt;. For example, a traditional application will have a frontend API service, a load balancer, and a database.&lt;/li&gt;
&lt;li&gt;In this style, everything from user interface, business codes, and data access operations is included in the same code base. If all the functionalities of a project exist in a single code base, then that application is known as a monolithic application.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Advantages and disadvantages
&lt;/h4&gt;

&lt;p&gt;Since the project is a single code base, it is easy to pull and get started to develop. It is easy to debug business interactions across different modules.&lt;/p&gt;

&lt;p&gt;It becomes too large in code size with time. That's why it's difficult to manage, to work in parallel in the same code base, and to implement new features. Any changes need deploying the entire application and so on.&lt;/p&gt;

&lt;h4&gt;
  
  
  When to Consider This Style
&lt;/h4&gt;

&lt;p&gt;If you are building a small app, go with monolithic architecture because it's simpler. Building, testing, deploying, and troubleshooting them is simple. Scaling up is quick and easy. It is easier to deploy as only a single jar or war file is deployed.&lt;/p&gt;

&lt;p&gt;Also, this style should be considered if your team is small, around 3 to 5 people. You can meet all your business needs without dealing with extra architectural complexity. Focus on the business side, not the latest technology options.&lt;/p&gt;

&lt;p&gt;You can also use this when making a basic app with a known size and difficulty level. If your application is not very complex and doesn't need to handle a large amount of data, a monolithic architecture is a good choice.&lt;/p&gt;

&lt;p&gt;This architecture is a good fit to build a proof of concept and quick launch. This way, you can test your idea and decide to pivot or wrap up the project very fast. &lt;/p&gt;

&lt;h3&gt;
  
  
  Headless Architectures
&lt;/h3&gt;

&lt;p&gt;Headless architecture separates the website's frontend (UI) and backend (business logic). This way, businesses gain maneuverability and flexibility. This is a step towards distributed architectures like microservices.&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%2Fuploads%2Farticles%2F0ddbov97fmk9kyrxgram.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%2Fuploads%2Farticles%2F0ddbov97fmk9kyrxgram.png" alt="Headless Architecture"&gt;&lt;/a&gt; &lt;em&gt;Headless architectures consist of decoupling the frontend (presentation layer) and the backend (business logic) layers of a system&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;It uses APIs to connect the frontend and backend applications, while the frontend and backend aren't tightly coupled in headless architectures, they need to communicate with each other using the APIs.&lt;/p&gt;

&lt;h4&gt;
  
  
  Advantages and disadvantages
&lt;/h4&gt;

&lt;p&gt;This architecture separates the frontend and backend layers of a system so developers can make changes to either the frontend or backend without affecting the other component.&lt;/p&gt;

&lt;p&gt;The frontend can be deployed independently of the backend (and vice versa). But, if they are not in sync or the compatibility is broken the whole system would fail.&lt;/p&gt;

&lt;p&gt;The presentation layer is detached, but it still has the same drawbacks as monolithic architectures.&lt;/p&gt;

&lt;h3&gt;
  
  
  Modular Monolithic Architectures
&lt;/h3&gt;

&lt;p&gt;A modular monolith architecture is a software development approach that uses one big codebase, like monolithic architecture. However, the codebase is divided into separate modules. Each module can be developed, tested, and maintained independently.&lt;/p&gt;

&lt;p&gt;Each module is designed to be loosely coupled, meaning that changes to one module won’t affect any other. This allows a team to work on their own parts of the codebase without understanding the whole system. This makes it much faster and easier to make changes or add new features.&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%2Fuploads%2Farticles%2F3893k8lgmlqf2pe42spn.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%2Fuploads%2Farticles%2F3893k8lgmlqf2pe42spn.png" alt="Modular Monolithic Architectures"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Modular monolithic architectures divide the codebase logically into many modules.&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Advantages and disadvantages
&lt;/h4&gt;

&lt;p&gt;With this approach, productivity is increased by using a single codebase. Because developers are able to spot and fix problems as they arise. Developing a module doesn't need any infrastructure or continuous integration, no databases are required either. Modules can be added quickly.&lt;/p&gt;

&lt;p&gt;A simpler architecture than microservices, without needing extra tools like API Specifications or Message Brokers, Service Discovery, and so on. Yet, the project can be easily transformed into a microservice architecture by splitting the program into different services.&lt;/p&gt;

&lt;p&gt;Unfortunately, the codebase is divided into modules but not as deployment units. This means it has the same drawbacks as monolithic architectures.&lt;/p&gt;

&lt;h3&gt;
  
  
  Distributed Architectures
&lt;/h3&gt;

&lt;p&gt;Distributed architectures consist of multiple deployment units that work together to perform some sort of cohesive business function.&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%2Fuploads%2Farticles%2Frxlziqvgfnfq7zaqfx10.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%2Fuploads%2Farticles%2Frxlziqvgfnfq7zaqfx10.png" alt="Distributed Architectures"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Distributed architectures consist of multiple deployment units&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The superpowers of distributed architectures usually fall within operational characteristics—things like scalability, elasticity, fault tolerance, and in some cases, performance. &lt;/p&gt;

&lt;p&gt;Scalability and elasticity are usually at the service level in these architectural styles. Therefore, the time it takes to start and recover from errors in a modular application is significantly shorter. This time is usually measured in seconds, and sometimes even in milliseconds, instead of minutes.&lt;/p&gt;

&lt;h4&gt;
  
  
  Advantages and disadvantages
&lt;/h4&gt;

&lt;p&gt;The ability to respond quickly to change is a superpower of distributed architectures. Breaking down the application into smaller units makes it easier to find and make changes. This also reduces the amount of testing needed and lowers the risk of deployment.&lt;/p&gt;

&lt;p&gt;However, distributed architectures have a problem called the &lt;strong&gt;fallacies of distributed computing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The fallacies of distributed computing are a set of assertions describing false assumptions that programmers new to distributed applications invariably make. These fallacies  are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The network is reliable&lt;/li&gt;
&lt;li&gt;Latency is zero&lt;/li&gt;
&lt;li&gt;Bandwidth is infinite&lt;/li&gt;
&lt;li&gt;The network is secure&lt;/li&gt;
&lt;li&gt;Topology doesn't change&lt;/li&gt;
&lt;li&gt;There is one administrator&lt;/li&gt;
&lt;li&gt;Transport cost is zero&lt;/li&gt;
&lt;li&gt;The network is homogeneous&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Which One Should I Choose?
&lt;/h3&gt;

&lt;p&gt;If you're deciding between a monolithic or distributed architecture, ask yourself which characteristics your system needs to support.&lt;/p&gt;

&lt;p&gt;When systems have different architectural characteristics, they often need a distributed architecture. One example is when customers need a feature that can handle lots of users, respond quickly, be available all the time, and adapt easily. Also, a backend processing functionality that doesn’t need any of those characteristics.&lt;/p&gt;

&lt;p&gt;Simple systems or websites usually work best with a simpler and cheaper architecture style. Complex systems that do many business functions work best with more complex distributed architectures. &lt;/p&gt;

&lt;p&gt;Distributed architectures are good for high speed, scalability, and fault tolerance.&lt;/p&gt;

&lt;p&gt;When choosing between a &lt;strong&gt;monolithic&lt;/strong&gt; or &lt;strong&gt;distributed architecture&lt;/strong&gt;, some important questions to ask yourself are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What are the architectural characteristics that must be supported?&lt;/li&gt;
&lt;li&gt;What are the needs that must be covered?&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Monolith First
&lt;/h4&gt;

&lt;p&gt;Distributed architectures are useful, but their supporters admit that using them comes with a big "Premium" problem. This means they are only useful for more complicated systems, not for all. This premium issue, which is the cost of managing services, will slow down a team, favoring a monolith for simpler applications. &lt;/p&gt;

&lt;p&gt;A strong argument is made for starting with a monolith-first strategy. You should build a new application as a monolith, even if you think it will need a distributed architecture later.&lt;/p&gt;

&lt;p&gt;The logical way is to design a monolith carefully, focusing on making the software modular and organizing the data correctly. Pay attention to API boundaries and how the data is stored. If you do this well, it's quite easy to transition to distributed architectures.&lt;/p&gt;

&lt;p&gt;A more common approach is to start with a monolith and gradually peel off small services at the edges. Such an approach can leave a substantial monolith at the heart of the microservices architecture, but with most new developments occurring in the microservices the monolith is relatively quiescent.&lt;/p&gt;

&lt;p&gt;Another common approach is to just replace the monolith entirely. Don't worry about creating a monolith that you'll eventually get rid of, especially if it helps you launch quickly.&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%2Fuploads%2Farticles%2Fs1n2hgzzz5gd5cafq6lf.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%2Fuploads%2Farticles%2Fs1n2hgzzz5gd5cafq6lf.png" alt="Architectures styles by deployment"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Monolith First Strategy&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;You shouldn't start with microservices unless you have reasonable experience in building a microservices system in the team.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Richards, M. (2022). Software architecture patterns. 2nd Edition.&lt;/li&gt;
&lt;li&gt;Richards, M., &amp;amp; Ford, N. (2020). Fundamentals of software architecture: an engineering approach. O'Reilly Media.&lt;/li&gt;
&lt;li&gt;Ozkaya, M. Design Microservices Architecture with Patterns &amp;amp; Principles [MOOC]. Udemy. &lt;a href="https://www.udemy.com/course/design-microservices-architecture-with-patterns-principles/" rel="noopener noreferrer"&gt;https://www.udemy.com/course/design-microservices-architecture-with-patterns-principles/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Fowler, M. (2019, August 1). Software Architecture Guide. Martin Fowler. &lt;a href="https://martinfowler.com/architecture/" rel="noopener noreferrer"&gt;https://martinfowler.com/architecture/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Fowler, M. (2015, June 3). MonolithFirst. Martin Fowler. &lt;a href="https://martinfowler.com/bliki/MonolithFirst.html" rel="noopener noreferrer"&gt;https://martinfowler.com/bliki/MonolithFirst.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Acknowledgments
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cover image by &lt;a href="https://unsplash.com/@sonnar_mc" rel="noopener noreferrer"&gt;@Uwe Hensel&lt;/a&gt; on &lt;a href="https://unsplash.com/license" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>softwareengineering</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Software Architect</title>
      <dc:creator>Saúl Zalimben</dc:creator>
      <pubDate>Fri, 08 Sep 2023 23:37:44 +0000</pubDate>
      <link>https://dev.to/szalimben/software-architect-450</link>
      <guid>https://dev.to/szalimben/software-architect-450</guid>
      <description>&lt;p&gt;Software Architect is an expert developer who design software solutions from the ground up, making high-level decisions about each stage of the process including technical standards, tools, design principles, platforms to be used, etc., leading a team of engineers to create the final product.&lt;/p&gt;

&lt;p&gt;A software architect makes high-level design choices and frames technical standards. This might include tools, software coding standards, or platforms to be used. To be effective, a software architect needs broad (and deep) technical knowledge to make good decisions.&lt;/p&gt;

&lt;p&gt;An architect is expected to define the architecture decisions and design principles used to guide technology decisions within the team, the  department, or across the enterprise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Types of architect
&lt;/h2&gt;

&lt;p&gt;Difference between the types of architect and the style that Dave Rice exemplifies.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Architectus Reloadus&lt;/strong&gt; is the person who makes all the important decisions. The architect does this because a single mind is needed to ensure a system’s conceptual integrity. Often, such decisions must be made early on so that everyone else has a plan to follow. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architectus Oryzus&lt;/strong&gt;, this kind of architect must be very aware of what’s going on in the project, looking out for important issues and tackling them before they become a serious problem. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The most noticeable part of the architect's work is the &lt;strong&gt;intense collaboration&lt;/strong&gt; and &lt;strong&gt;guidance&lt;/strong&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Expectations of an Architect
&lt;/h2&gt;

&lt;p&gt;Defining the role of a software architect presents as much difficultly as defining software architecture. Thus, we should focus on the expectations of an architect.&lt;/p&gt;

&lt;p&gt;There are eight core expectations placed on a software architect, irrespective of any given role, title, or job description. The first key to effectiveness and success in the software architect role depends on understanding and practicing each of these expectations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Make Architecture Decisions
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;An architect is expected to define the architecture decisions and design principles used to guide technology decisions within the team, the department, or across the enterprise.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;An architect should guide rather than specify technology choices An architect should instead instruct development teams to identify the strengths and weaknesses of each framework, contextualize the problem to be solved, and let the team select the best fit for it.&lt;/p&gt;

&lt;p&gt;For example, an architect should advice about the the strong a reactive-based framework for front-end web development, hence guiding the development team in making the choice between Angular, React.js, Vue, or any of the other host of reactive-based web frameworks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Continually Analyze the Architecture
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;An architect is expected to continually analyze the architecture and current technology environment, and recommend solutions for improvement.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Architects must focus their energies on continually analyzing existing architectures to maintain or improve architecture characteristics as software evolves. An architect must holistically analyze changes in technology and problem domain to determine the soundness of the architecture.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep Current With Latest Trends
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;An architect is expected to keep current with the latest technology and industry trends.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The decisions an architect makes tend to be long lasting and generally difficult to change. Understanding and following key trends helps the architect prepare for the future and also helps the architect make the correct decision.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ensure Compliance With Decisions
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;An architect is expected to ensure compliance with architecture decisions and design principles.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ensuring compliance means that the architect is continually verifying that development teams are following the architecture decisions and design principles defined, documented, and communicated by the architect. &lt;/p&gt;

&lt;h3&gt;
  
  
  Diverse Exposure and Experience
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;An architect is expected to have exposure to multiple and diverse technologies, frameworks, platforms, and environments.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;An architect must at least be familiar with a variety of varying technologies. Most environments are heterogeneous, and at a minimum an architect should know how to interface with multiple systems and services, irrespective of the language, platform, and technology those systems or services are written in.&lt;/p&gt;

&lt;h3&gt;
  
  
  Have Business Domain Knowledge
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;An architect is expected to have a certain level of business domain expertise.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Effective software architects understand not only technology but also the business domain of a problem space. Without business domain knowledge, it is difficult to understand the business problem, goals, and requirements, making it difficult to design an effective architecture to meet the requirements of the business.&lt;/p&gt;

&lt;h3&gt;
  
  
  Possess Interpersonal Skills
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;An architect is expected to possess exceptional interpersonal skills, including teamwork, facilitation, and team leadership.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;An architect is not only expected to provide technical guidance on the team, but also expected to lead the development teams through the implementation of the architecture. Leadership skills are at least half what it takes to become effective software architect, regardless of the role or title the architect has.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understand and Navigate Politics
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;An architect is expected to understand the political climate of the enterprise and be able to navigate the politics.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Almost every decision an architect makes will be challenged. Architectural decisions will be challenged by product owners, project managers, and business stakeholders due to increased costs or increased effort (time) involved.&lt;/p&gt;

&lt;p&gt;Architectural decisions will also be challenged by developers who feel their approach is better. In either case, the architect must navigate the politics of the company and apply basic negotiation skills to get most decisions approved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Fowler, M. (2003). Who Needs an Architect?. IEEE Computer Society. &lt;a href="https://martinfowler.com/ieeeSoftware/whoNeedsArchitect.pdf"&gt;https://martinfowler.com/ieeeSoftware/whoNeedsArchitect.pdf&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Richards, M. (2022). Software architecture patterns. 2nd Edition.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Acknowledgments
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cover image by &lt;a href="https://unsplash.com/@kaleidico"&gt;@kaleidico&lt;/a&gt; on &lt;a href="https://unsplash.com/license"&gt;Unsplash&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>architecture</category>
      <category>architect</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Software Architecture</title>
      <dc:creator>Saúl Zalimben</dc:creator>
      <pubDate>Tue, 01 Aug 2023 16:19:16 +0000</pubDate>
      <link>https://dev.to/szalimben/software-architecture-1d3e</link>
      <guid>https://dev.to/szalimben/software-architecture-1d3e</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Architecture is about the important stuff… whatever that is.&lt;br&gt;
--Ralph Johnson&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this rapidly evolving digital landscape, where innovation and efficiency reign supreme, the role of software architecture has become more critical than ever. Fundamentally, software architecture acts as a blueprint for the organization, operation, and communication of software parts. This ensures the robustness, scalability, and upgradability of the system.&lt;/p&gt;

&lt;p&gt;A capable software architect creates a solid and elegant software solution that tackles complicated problems and meets user needs, much as a talented architect creates an impressive skyscraper. The complex balancing act required by software architecture ranges from choosing the right design patterns and technologies to enhancing performance and security while staying within budget and time restrictions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Definition
&lt;/h2&gt;

&lt;p&gt;Despite the lack of a clear definition, we can nevertheless benefit from the following definitions of software architecture:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"In most successful software projects, the expert developers working on that project have a shared understanding of the system design. This shared understanding is called &lt;strong&gt;architecture&lt;/strong&gt;."&lt;br&gt;
-- Ralph Johnson&lt;/p&gt;

&lt;p&gt;"Software architecture involves understanding and organising a system, all of its components, their interactions, the environment in which they operate, and the core principles which will be used to design the software."&lt;br&gt;
-- Anna Mleczko&lt;/p&gt;

&lt;p&gt;"Software architecture is the set of structures needed to reason about a software system and the discipline of creating such structures and systems. Each structure comprises software elements, relations among them, and properties of both elements and relations."&lt;br&gt;
-- Wikipedia&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, we will agree on the following definition: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Software architecture describes how an application is built including its components, how they interact with each other, the environment in which they operate, and so on. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NaUquKxx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ue9jcth1d1lvm798lpq8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NaUquKxx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ue9jcth1d1lvm798lpq8.png" alt="Dimensions of Arquitecture" width="800" height="475"&gt;&lt;/a&gt;&lt;br&gt;
Figure 1. &lt;em&gt;Architecture consists of the structure combined with architecture characteristics (“-ilities”), architecture decisions, and design principles.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Dimensions
&lt;/h2&gt;

&lt;p&gt;Software architecture consists of the structure of the system (denoted as the heavy black lines supporting the architecture), combined with architecture characteristics (“-ilities”) the system must support, architecture decisions, and finally design principles. We can refer to these components as &lt;strong&gt;dimensions&lt;/strong&gt; of Software Architecture. &lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;structure&lt;/strong&gt; of the system refers to the type of architecture style (or styles) the system is implemented in (such as microservices, layered, microkernel, and so on). Describing an architecture only by its structure does not wholly explain the architecture.&lt;/p&gt;

&lt;p&gt;For example, if an architect is asked to describe an architecture and that architect responds “It’s a microservices architecture”. Here, the architect is only talking about the structure of the system but not the architecture of the system. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Knowledge of the architecture characteristics, architecture decisions, and design principles are also needed to fully understand the architecture of the system.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ll3dCxlS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i3l0oqapmmmjb8x2zv6i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ll3dCxlS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i3l0oqapmmmjb8x2zv6i.png" alt="Structure dimension" width="800" height="427"&gt;&lt;/a&gt; &lt;br&gt;
Figure 2. &lt;em&gt;Structure refers to the type of architecture styles used in the system.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architecture characteristics&lt;/strong&gt; are another dimension of defining software architecture. The architecture characteristics define the success criteria of a system, which is generally orthogonal to the functionality of the system. &lt;/p&gt;

&lt;p&gt;In general, the characteristics do not need knowledge of the functionality of the system, yet they are required in order for the system to function properly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1xRX8Lnm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1yoj13crfdi0b9vrshka.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1xRX8Lnm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1yoj13crfdi0b9vrshka.png" alt="Architecture characteristics dimension" width="800" height="424"&gt;&lt;/a&gt;&lt;br&gt;
Figure 3. &lt;em&gt;Architecture characteristics refers to the “-ilities” that the system must support&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architecture decisions&lt;/strong&gt; define the “rules” for how a system should be constructed. For example, an architect might make an architecture decision that only the business and services layer within a layered architecture may access the database, thus restricting the presentation layer from making direct database calls. &lt;/p&gt;

&lt;p&gt;Architecture decisions form the constraints of the system and direct the development teams on what is and what isn’t allowed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--827530o1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/epnp245ev6zn7akwht60.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--827530o1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/epnp245ev6zn7akwht60.png" alt="Architecture decisions dimension" width="800" height="426"&gt;&lt;/a&gt;&lt;br&gt;
Figure 4. &lt;em&gt;Architecture decisions are rules for constructing systems.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Design Principles&lt;/strong&gt; differ from an architecture decision in that a design principle is a guideline rather than a hard-and-fast rule. &lt;/p&gt;

&lt;p&gt;For example, a design principle can state that the development teams should leverage asynchronous messaging between services within a microservices architecture to increase performance. &lt;/p&gt;

&lt;p&gt;An architecture decision (rule) could never cover every condition and option for communication between services in an architecture decision, so a design principle can be used to provide guidance for the preferred method (in this case asynchronous messaging) to allow the developer to choose a more appropriate communication protocol (such as REST or gRPC) given a specific circumstance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uj4FV4D3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5fsc538tumd6eilwjj0e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uj4FV4D3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5fsc538tumd6eilwjj0e.png" alt="Design principles dimension" width="800" height="426"&gt;&lt;/a&gt;&lt;br&gt;
Figure 5. &lt;em&gt;Design principles are guidelines for constructing systems.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Laws of Software Architecture
&lt;/h2&gt;

&lt;p&gt;Although the range of software design is wide, there are unifying characteristics. The first law was discovered by Mark Richards and Neal Ford by accident as they kept running against it: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Everything in software architecture is a tradeoff.&lt;/strong&gt;&lt;br&gt;
—1st Law of Software Architecture&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nothing exists on a nice clean spectrum for software architects—every decision must take into account many opposing factors.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If an architect thinks they have discovered something that isn’t a trade-off, more likely they just haven’t identified the tradeoff yet.&lt;/strong&gt;&lt;br&gt;
—Corollary 1&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Richards, M. (2022). Software architecture patterns. 2nd Edition.&lt;/li&gt;
&lt;li&gt;Richards, M., &amp;amp; Ford, N. (2020). Fundamentals of software architecture: an engineering approach. O'Reilly Media.&lt;/li&gt;
&lt;li&gt;Ozkaya, M. Design Microservices Architecture with Patterns &amp;amp; Principles [MOOC]. Udemy. &lt;a href="https://www.udemy.com/course/design-microservices-architecture-with-patterns-principles/"&gt;https://www.udemy.com/course/design-microservices-architecture-with-patterns-principles/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Fowler, M. (2019, August 1). Software Architecture Guide. Martin Fowler. &lt;a href="https://martinfowler.com/architecture/"&gt;https://martinfowler.com/architecture/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Acknowledgments
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cover image by &lt;a href="https://unsplash.com/@killerfvith"&gt;Alex wong&lt;/a&gt; on &lt;a href="https://unsplash.com/license"&gt;Unsplash&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Content images were extracted from Richards, M. (2022) and Richards, M., &amp;amp; Ford, N. (2020).&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>architecture</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Grafos</title>
      <dc:creator>Saúl Zalimben</dc:creator>
      <pubDate>Wed, 30 Mar 2022 17:58:10 +0000</pubDate>
      <link>https://dev.to/szalimben/grafos-4372</link>
      <guid>https://dev.to/szalimben/grafos-4372</guid>
      <description>&lt;p&gt;Si acabas de encontrar esta publicación, antes de continuar te recomiendo que le des un vistazo a los demás artículos de la serie.&lt;/p&gt;




&lt;p&gt;Los &lt;strong&gt;grafos&lt;/strong&gt; son estructuras de datos no lineales, utilizadas para representar datos adyacentes. Se representa como el conjunto de vértices o nodos y de aristas o arcos. Esta estructura de datos es el principal foco de estudio de la Teoría de Grafos.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Teoría de Grafos.&lt;/strong&gt; Rama de las matemáticas y las ciencias de la computación que estudia las propiedades de los grafos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Un grafo &lt;em&gt;G&lt;/em&gt; es un par ordenado &lt;em&gt;G=(V,E)&lt;/em&gt;, donde:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;V&lt;/em&gt; es un conjunto de vértices o nodos &lt;em&gt;V={v1, v2, ... , vn}&lt;/em&gt;, y &lt;/li&gt;
&lt;li&gt;
&lt;em&gt;E&lt;/em&gt; es un conjunto de aristas o arcos 
&lt;em&gt;E={ {v1, v2}, {v2, v4}, ... , {vm, vn} }&lt;/em&gt;, que relacionan los nodos.&lt;/li&gt;
&lt;/ul&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%2Fuploads%2Farticles%2F39yok926lsdplmll53mj.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%2Fuploads%2Farticles%2F39yok926lsdplmll53mj.png" alt="Ejemplo de Grado"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Un grafo no contempla las restricciones que existen para los árboles, es decir, no existe un máximo de nodos que pueden apuntar al mismo nodo, se los puede ver como una generalización de la estructura del tipo árbol.&lt;/p&gt;

&lt;p&gt;Existen muchas analogías en el mundo real, la red de rutas de un país, la red de enlaces aéreos, red eléctrica, etc. En una red de rutas, los nudos o intersecciones representan los &lt;strong&gt;vértices&lt;/strong&gt; del grafo y las rutas de unión los &lt;strong&gt;arcos&lt;/strong&gt;, de modo que cada arco puede ser asociado a un dato específico tal como la distancia, el consumo de combustible, etc.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Los árboles son una especialización de un grafo, en el cual no existen ciclos, es decir, un árbol es un grafo conexo acíclico.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Operaciones elementales sobre Grafos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Insertar &lt;/li&gt;
&lt;li&gt;Eliminar&lt;/li&gt;
&lt;li&gt;Buscar&lt;/li&gt;
&lt;li&gt;Recorrer&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Definiciones sobre Grafos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Se denomina &lt;strong&gt;grafo nulo o vacío&lt;/strong&gt; a aquel grafo que no tiene vértices ni arcos.&lt;/li&gt;
&lt;li&gt;El &lt;strong&gt;orden&lt;/strong&gt; del grafo &lt;em&gt;G&lt;/em&gt; es igual al número de vértices, &lt;em&gt;|V|&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Un &lt;strong&gt;grafo vacío&lt;/strong&gt; es de orden cero.&lt;/li&gt;
&lt;li&gt;El &lt;strong&gt;grado&lt;/strong&gt; de un vértice se define como el número de vértices adyacentes que tiene el vértice.&lt;/li&gt;
&lt;li&gt;En grafos dirigidos el &lt;strong&gt;grado de entrada&lt;/strong&gt; de un vértice o nodo &lt;em&gt;V&lt;/em&gt; es igual al número de arcos que lo tienen como extremo, es decir, igual al número de vértices adyacentes que tiene el vértice. Mientras que el &lt;strong&gt;grado de salida&lt;/strong&gt; es el número de vértices adyacentes a un vértice dado.&lt;/li&gt;
&lt;/ul&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%2Fuploads%2Farticles%2F0tivujszaue68muqw3mj.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%2Fuploads%2Farticles%2F0tivujszaue68muqw3mj.png" alt="Grafo No Dirigido con Grados"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ejemplo de Grados en un Grafo Dirigido&lt;/p&gt;
&lt;/blockquote&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%2Fuploads%2Farticles%2Fcwjiqjodipl2q06tda3w.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%2Fuploads%2Farticles%2Fcwjiqjodipl2q06tda3w.png" alt="Grafo Dirigido con Grados"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ejemplo de Grados en un Grafo No Dirigido&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Dos o más arcos son &lt;strong&gt;paralelas&lt;/strong&gt; si relacionan el mismo par de vértices.&lt;/li&gt;
&lt;li&gt;Se dice que dos vértices son &lt;strong&gt;adyacentes&lt;/strong&gt; si existe un arco entre ambos vértices. Si el arco es &lt;strong&gt;{K, L}&lt;/strong&gt;, entonces, K es adyacente a L, y L es adyacente a K.&lt;/li&gt;
&lt;li&gt;Un &lt;strong&gt;camino&lt;/strong&gt; es una secuencia ordenada de vértices &lt;em&gt;{v0, v1, v2, ..., vn}&lt;/em&gt;, también se conoce como el camino desde &lt;em&gt;v0&lt;/em&gt; hasta &lt;em&gt;vn&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Un &lt;strong&gt;camino simple&lt;/strong&gt; no tiene vértices repetidos excepto para el primer y último vértice.&lt;/li&gt;
&lt;li&gt;Si en un camino simple, el primer y último vértice son iguales se conoce como un &lt;strong&gt;ciclo o bucle&lt;/strong&gt;, es decir, un arco que relaciona al mismo nodo.&lt;/li&gt;
&lt;/ul&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%2Fuploads%2Farticles%2Fltg7cosm73o9hrsewgqp.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%2Fuploads%2Farticles%2Fltg7cosm73o9hrsewgqp.png" alt="Ejemplo de grafo con bucle"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ejemplo de Grafo con Bucle&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Clasificación de Grafos
&lt;/h2&gt;

&lt;p&gt;Los grafos pueden clasificarse acorde a sus propiedades, según su estructura, dirección y conectividad.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sencillo y Múltiple
&lt;/h3&gt;

&lt;p&gt;Un grafo &lt;em&gt;G&lt;/em&gt; se denomina &lt;strong&gt;sencillo&lt;/strong&gt; si se cumplen las siguientes condiciones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No tiene bucles, no existe un arco tal que &lt;em&gt;{vi, vi}&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;No existe más que un arco para unir dos nodos, es decir, no existe más que un arco {vi, vj} para cualquier par de vértices &lt;em&gt;vi&lt;/em&gt;, &lt;em&gt;vj&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un grafo que no es sencillo se denomina grafo &lt;strong&gt;múltiple&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dirigido y No Dirigido
&lt;/h3&gt;

&lt;p&gt;La teoría de grafos considera los siguientes tipos de grafos según su dirección:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dirigidos&lt;/strong&gt;, los vértices apuntan unos a otros; los arcos están dirigidos o tienen dirección, si existe un arco &lt;em&gt;{vi, vj}&lt;/em&gt;, entonces se dice que existe un camino de &lt;em&gt;vi&lt;/em&gt; a &lt;em&gt;vj&lt;/em&gt;, pero esto no implica que existe un camino de &lt;em&gt;vj&lt;/em&gt; a &lt;em&gt;vi&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&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%2Fuploads%2Farticles%2Flyerbugpo9130zbwc5j9.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%2Fuploads%2Farticles%2Flyerbugpo9130zbwc5j9.png" alt="Grafo Dirigido"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ejemplo de Grafo Dirigido&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No Dirigidos&lt;/strong&gt;, los vértices están relacionados, pero no se apuntan unos a otros, si existe un arco &lt;em&gt;{vi, vj}&lt;/em&gt;, entonces se dice que existe un camino de &lt;em&gt;vi&lt;/em&gt; a &lt;em&gt;vj&lt;/em&gt; y de &lt;em&gt;vj&lt;/em&gt; a &lt;em&gt;vi&lt;/em&gt; para cualquier par de vértices &lt;em&gt;vi&lt;/em&gt;, &lt;em&gt;vj&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&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%2Fuploads%2Farticles%2Fbahw62iv5f61484u2u80.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%2Fuploads%2Farticles%2Fbahw62iv5f61484u2u80.png" alt="Grafo No Dirigido"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ejemplo de Grafo No Dirigido&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Conexo y No Conexo
&lt;/h3&gt;

&lt;p&gt;Finalmente, según la conectividad de los grafos, estos pueden ser:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Conexo o conectado&lt;/strong&gt;, si existe siempre un camino que une cualquier par de vértices, todos sus vértices están conectados por un camino. Se dice que un grafo es &lt;strong&gt;fuertemente conexo&lt;/strong&gt; cuando es un grafo dirigido tal que para cualquier par de nodos existe un camino que los une.&lt;/li&gt;
&lt;/ul&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%2Fuploads%2Farticles%2F8bony9n5erakendgcsp2.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%2Fuploads%2Farticles%2F8bony9n5erakendgcsp2.png" alt="Grafo Conexo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ejemplo de Grafo Conexo&lt;/p&gt;
&lt;/blockquote&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%2Fuploads%2Farticles%2Fmza7acjimx9cbveouia9.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%2Fuploads%2Farticles%2Fmza7acjimx9cbveouia9.png" alt="Grafo Fuertemente Conexo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ejemplo de Grafo Fuertemente Conexo&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No Conexo o desconectado&lt;/strong&gt;, existen vértices que no están unidos por un camino.&lt;/li&gt;
&lt;/ul&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%2Fuploads%2Farticles%2Ffu2lqcypa71d9bwo7j45.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%2Fuploads%2Farticles%2Ffu2lqcypa71d9bwo7j45.png" alt="Grafo No Conexo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ejemplo de Grafo No Conexo&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Completos, Dispersos y Densos
&lt;/h3&gt;

&lt;p&gt;Según el número de arcos que contiene, un grafo es &lt;strong&gt;completo&lt;/strong&gt; si cuenta con todos los arcos posibles, es decir, todos los nodos están conectados con todos, es &lt;strong&gt;disperso&lt;/strong&gt; si tiene relativamente pocos arcos y &lt;strong&gt;denso&lt;/strong&gt; si le faltan pocos para ser completo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Grafos Ponderados
&lt;/h2&gt;

&lt;p&gt;Tanto las arcos como los vértices pueden tener asociada una etiqueta. Si la etiqueta que se asocia es un número se le llama &lt;strong&gt;peso, costo o longitud&lt;/strong&gt;. &lt;br&gt;
Un grafo cuyas arcos o vértices tienen pesos asociados recibe el nombre de grafo etiquetado o también conocido como &lt;strong&gt;grafo con pesos o  ponderado&lt;/strong&gt;.&lt;br&gt;
Un grafo donde las aristas no tienen costos o pesos asociados se conoce como grafo sin pesos. También podría considerarse a un grafo sin pesos&lt;br&gt;
como un grafo con pesos donde cada arista tiene un peso igual a 1.&lt;/p&gt;

&lt;p&gt;La longitud de un camino en un grafo con pesos es la suma de los pesos de todas las aristas que componen el camino.&lt;br&gt;
Por ejemplo, la siguiente figura ilustra la longitud del camino &lt;em&gt;(1, 4, 7)&lt;/em&gt; donde &lt;em&gt;(1-4)&lt;/em&gt; = 5,1 y &lt;em&gt;(4-7)&lt;/em&gt; = 3,7, por lo tanto &lt;em&gt;(1, 4, 7)&lt;/em&gt; = 8,8.&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%2Fuploads%2Farticles%2Fhqlgsxfan1kcjlgml0l0.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%2Fuploads%2Farticles%2Fhqlgsxfan1kcjlgml0l0.png" alt="Grafo Ponderado"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;¡Gracias por leer! &lt;/p&gt;

&lt;p&gt;Ponte en contacto en Twitter &lt;a href="https://twitter.com/sZalimben" rel="noopener noreferrer"&gt;@sZalimben&lt;/a&gt;, y si te gusta mi contenido puedes realizar una donación &lt;em&gt;&lt;a href="https://www.buymeacoffee.com/szalimben" rel="noopener noreferrer"&gt;invitándome un café&lt;/a&gt;&lt;/em&gt; que me será de mucha ayuda!&lt;/p&gt;

</description>
      <category>spanish</category>
      <category>tutorial</category>
      <category>computerscience</category>
      <category>español</category>
    </item>
    <item>
      <title>Árboles</title>
      <dc:creator>Saúl Zalimben</dc:creator>
      <pubDate>Wed, 23 Mar 2022 16:58:23 +0000</pubDate>
      <link>https://dev.to/szalimben/arboles-290f</link>
      <guid>https://dev.to/szalimben/arboles-290f</guid>
      <description>&lt;p&gt;Si acabas de encontrar esta publicación, antes de continuar te recomiendo que le des un vistazo a los demás artículos de la serie.&lt;/p&gt;




&lt;p&gt;Los árboles son estructuras de datos no lineales, donde cada elemento del árbol es una estructura del tipo &lt;strong&gt;nodo (&lt;em&gt;node&lt;/em&gt;)&lt;/strong&gt;, y hace referencia a otros nodos dentro del árbol, las conexiones entre nodos se denominan &lt;strong&gt;aristas o ramas o arcos (&lt;em&gt;edge&lt;/em&gt;)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Las estructuras del tipo árbol se usan principalmente para representar datos con una relación jerárquica entre sus elementos, como son árboles genealógicos, jerarquías y agrupaciones militares, dependencias de tareas, etc.&lt;/p&gt;

&lt;p&gt;Un árbol &lt;em&gt;A&lt;/em&gt; es un conjunto finito de uno o más nodos (&lt;em&gt;n&lt;/em&gt;), tales que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Existe un nodo especial denominado &lt;strong&gt;raíz&lt;/strong&gt; &lt;em&gt;(n0)&lt;/em&gt; del árbol.&lt;/li&gt;
&lt;li&gt;Los nodos restantes &lt;em&gt;(n1, n2, ..., nn)&lt;/em&gt; se dividen en &lt;em&gt;m &amp;gt;= 0&lt;/em&gt; conjuntos disjuntos denominado &lt;em&gt;A1, A2, ..., Am&lt;/em&gt;, cada uno de los cuales es, a su vez, &lt;strong&gt;un árbol&lt;/strong&gt;. Estos árboles se llaman &lt;strong&gt;subárboles&lt;/strong&gt; de la raíz.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;La definición de árbol implica una estructura recursiva, es decir, un árbol es el conjunto de subárboles.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Definiciones sobre Árboles
&lt;/h2&gt;

&lt;p&gt;Las definiciones a tener en cuenta son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Raíz del árbol&lt;/strong&gt;, todos los árboles que no están vacíos tienen un único nodo raíz. Todos los demás elementos o nodos se derivan o descienden de él. El nodo raíz no tiene padre, es decir, no es hijo de ningún otro nodo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nodo&lt;/strong&gt;, son los vértices o elementos del árbol. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nodo terminal o nodo hoja&lt;/strong&gt;, son los nodos que no contienen ningún subárbol.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nodo no terminal&lt;/strong&gt;, todo nodo que no es hoja se asocia a uno o varios subárboles llamados descendientes o hijos. De igual forma, cada nodo tiene asociado un antecesor o ascendiente llamado &lt;strong&gt;padre&lt;/strong&gt;. También se los conoce como nodos &lt;strong&gt;interiores o internos&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&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%2Fuploads%2Farticles%2Fhbqwp2x5pabdmt8qtwww.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%2Fuploads%2Farticles%2Fhbqwp2x5pabdmt8qtwww.png" alt="Árbol. Ancestros y Descendientes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un árbol con ningún nodo es un árbol &lt;strong&gt;nulo o vacío&lt;/strong&gt;; no tiene raíz.&lt;/li&gt;
&lt;li&gt;Todos los nodos tienen un solo &lt;strong&gt;padre&lt;/strong&gt;, excepto el nodo raíz, que no tiene padre.&lt;/li&gt;
&lt;li&gt;Los nodos de un mismo padre se llaman &lt;strong&gt;nodos hermanos&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&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%2Fuploads%2Farticles%2Fkyy8rx5gmfhrk1a3e5an.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%2Fuploads%2Farticles%2Fkyy8rx5gmfhrk1a3e5an.png" alt="Árbol. Padres &amp;amp; Hijos"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se denomina &lt;strong&gt;camino&lt;/strong&gt; a una secuencia de nodos.&lt;/li&gt;
&lt;li&gt;Existe un camino de longitud 0 de un nodo a sí mismo que se conoce como &lt;strong&gt;camino trivial&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Cada nodo tiene asociado un número de &lt;strong&gt;nivel&lt;/strong&gt; que determina la longitud del camino desde el nodo raíz al nodo específico.&lt;/li&gt;
&lt;li&gt;Por cada nodo en un árbol, existe un camino único de la raíz a dicho nodo. La longitud de este camino es conocida como la &lt;strong&gt;profundidad o altura&lt;/strong&gt; del nodo.&lt;/li&gt;
&lt;li&gt;La &lt;strong&gt;altura&lt;/strong&gt; de un árbol es definida como la máxima profundidad de cualquier nodo del árbol. La altura de un árbol con un solo nodo es 0 (solo la raíz), mientras que la altura de un árbol vacío es –1, por conveniencia.&lt;/li&gt;
&lt;/ul&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%2Fuploads%2Farticles%2Foa4c84z7kq72eegapf6j.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%2Fuploads%2Farticles%2Foa4c84z7kq72eegapf6j.png" alt="Árbol. Niveles &amp;amp; Profundidad"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El &lt;strong&gt;peso&lt;/strong&gt; de un árbol es el número de nodos terminales.&lt;/li&gt;
&lt;li&gt;El &lt;strong&gt;grado de un nodo&lt;/strong&gt; es definido como el número de sus hijos directos.&lt;/li&gt;
&lt;li&gt;Un nodo hoja tiene &lt;strong&gt;grado cero&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Una colección de dos o más árboles se llama &lt;strong&gt;bosque&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Operaciones elementales sobre Árboles
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Insertar &lt;/li&gt;
&lt;li&gt;Eliminar&lt;/li&gt;
&lt;li&gt;Buscar&lt;/li&gt;
&lt;li&gt;Recorrer&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Árbol Binario
&lt;/h2&gt;

&lt;p&gt;Un árbol binario es un conjunto finito de cero o más nodos, tales que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Existe un nodo denominado raíz del árbol.&lt;/li&gt;
&lt;li&gt;Cada nodo puede tener 0, 1 o 2 subárboles, conocidos como subárbol izquierdo y subárbol derecho. &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Un árbol binario es una especialización dentro de las estructuras del tipo árbol.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Árboles Binarios de Búsqueda
&lt;/h3&gt;

&lt;p&gt;Un árbol binario de búsqueda, es un árbol binario que cumple que el subárbol izquierdo de cualquier nodo (si no está vacío) contiene valores menores que el que contiene dicho nodo, y el subárbol derecho (si no está vacío) contiene valores mayores, donde existe una relación de orden establecida entre los elementos de los nodos.&lt;/p&gt;

&lt;p&gt;El árbol binario de búsqueda se construye teniendo en cuenta las siguientes premisas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El primer elemento se utiliza para crear el nodo raíz.&lt;/li&gt;
&lt;li&gt;Los elementos del árbol deben ser tales que pueda existir un orden dentro del mismo.&lt;/li&gt;
&lt;li&gt;Todos los elementos del subárbol izquierdo son menor o igual al valor del nodo padre.&lt;/li&gt;
&lt;li&gt;Todos los elementos del subárbol derecho son mayores que el valor del nodo padre.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Un árbol binario de búsqueda es una especialización de los árboles binarios.&lt;/p&gt;
&lt;/blockquote&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%2Fuploads%2Farticles%2F1u7d2vit11yj3z76ecxj.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%2Fuploads%2Farticles%2F1u7d2vit11yj3z76ecxj.png" alt="Árbol Binario"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ejemplo de árbol binario de búsqueda&lt;/p&gt;




&lt;p&gt;¡Gracias por leer! &lt;/p&gt;

&lt;p&gt;Ponte en contacto en Twitter &lt;a href="https://twitter.com/sZalimben" rel="noopener noreferrer"&gt;@sZalimben&lt;/a&gt;, y si te gusta mi contenido puedes realizar una donación &lt;em&gt;&lt;a href="https://www.buymeacoffee.com/szalimben" rel="noopener noreferrer"&gt;invitándome un café&lt;/a&gt;&lt;/em&gt; que me será de mucha ayuda!&lt;/p&gt;

</description>
      <category>spanish</category>
      <category>tutorial</category>
      <category>computerscience</category>
      <category>español</category>
    </item>
    <item>
      <title>Pilas y Colas</title>
      <dc:creator>Saúl Zalimben</dc:creator>
      <pubDate>Wed, 16 Mar 2022 12:38:25 +0000</pubDate>
      <link>https://dev.to/szalimben/pilas-y-colas-b3</link>
      <guid>https://dev.to/szalimben/pilas-y-colas-b3</guid>
      <description>&lt;p&gt;Si acabas de encontrar esta publicación, antes de continuar te recomiendo que le des un vistazo a los demás artículos de la serie.&lt;/p&gt;




&lt;p&gt;Las pilas y colas son estructuras de datos lineales, donde existen restricciones para insertar y eliminar elementos. Son casos particulares de la estructura lista, y se pueden implementar mediante vectores o listas enlazadas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Operaciones elementales sobre Pilas y Colas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Insertar: Push -&amp;gt; apilar (Pila), Queue -&amp;gt; encolar (Cola)&lt;/li&gt;
&lt;li&gt;Eliminar: Pop  -&amp;gt; desapilar (Pila),  Dequeue -&amp;gt; desencolar (Cola)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pilas
&lt;/h2&gt;

&lt;p&gt;Una Pila o Stack es un caso particular de la lista donde la inserción y eliminación de elementos se realizan solo por un extremo que se denomina cima o tope &lt;em&gt;(top)&lt;/em&gt;. Funciona exactamente como su nombre lo indica, y con numerosas analogías en la vida real: una pila de libros, una pila de monedas, pila de platos, etc.&lt;/p&gt;

&lt;p&gt;Este comportamiento está basado en el principio &lt;em&gt;"último en entrar, primero en salir"&lt;/em&gt;, también conocido como &lt;strong&gt;LIFO&lt;/strong&gt;, por su nombre en inglés &lt;em&gt;"last-in, first-out"&lt;/em&gt;, que dicta que el primer elemento que fue añadido a la pila será el último en ser removido de la misma.&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%2Fuploads%2Farticles%2F39h6f6hguqiecj2915dx.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%2Fuploads%2Farticles%2F39h6f6hguqiecj2915dx.png" alt="Pila"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Colas
&lt;/h2&gt;

&lt;p&gt;Una &lt;strong&gt;Cola o Queue&lt;/strong&gt; es un caso particular de la lista donde la inserción y eliminación de elementos se realizan por los extremos de la lista; las eliminaciones se realizan al principio de la lista, o el frente &lt;em&gt;(front)&lt;/em&gt; de la misma, y las inserciones se realizan en el otro extremo, el final &lt;em&gt;(rear)&lt;/em&gt;. Algunas analogías en la vida real:  cola de personas en el banco, cola de vehículos en el semáforo, etc.&lt;/p&gt;

&lt;p&gt;Este comportamiento está basado en el principio &lt;em&gt;"primero en entrar, primero en salir"&lt;/em&gt;, también conocido como &lt;strong&gt;FIFO&lt;/strong&gt;, por su nombre en inglés &lt;em&gt;"first-in, first-out"&lt;/em&gt;, que dicta que el primer elemento que fue añadido a la cola será el primero en ser removido.&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%2Fuploads%2Farticles%2Fj87zynigppdrtql0ymjh.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%2Fuploads%2Farticles%2Fj87zynigppdrtql0ymjh.png" alt="Cola"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;¡Gracias por leer!&lt;/p&gt;

&lt;p&gt;Ponte en contacto en Twitter &lt;a href="https://twitter.com/sZalimben" rel="noopener noreferrer"&gt;@sZalimben&lt;/a&gt;, y si te gusta mi contenido puedes realizar una donación &lt;em&gt;&lt;a href="https://www.buymeacoffee.com/szalimben" rel="noopener noreferrer"&gt;invitándome un café&lt;/a&gt;&lt;/em&gt; que me será de mucha ayuda!&lt;/p&gt;

</description>
      <category>spanish</category>
      <category>tutorial</category>
      <category>computerscience</category>
      <category>español</category>
    </item>
    <item>
      <title>Listas</title>
      <dc:creator>Saúl Zalimben</dc:creator>
      <pubDate>Wed, 09 Mar 2022 13:41:11 +0000</pubDate>
      <link>https://dev.to/szalimben/listas-add</link>
      <guid>https://dev.to/szalimben/listas-add</guid>
      <description>&lt;p&gt;Si acabas de encontrar esta publicación, antes de continuar te recomiendo que le des un vistazo a los artículos previos de esta serie, que brindan conceptos claves para comprender las Estructuras de Datos.&lt;/p&gt;




&lt;p&gt;Las &lt;strong&gt;listas&lt;/strong&gt; son estructuras de datos lineales ordenadas secuenciales de 0 o más elementos homogéneos almacenados en memoria. Donde cada elemento de la lista, excepto el primero, tiene un único predecesor y cada elemento de la lista, excepto el último, tiene un único sucesor.&lt;/p&gt;

&lt;p&gt;Se denomina &lt;strong&gt;lista vacía&lt;/strong&gt; a una lista con 0 elementos, mientras que la cantidad de elementos que posee la lista, es el &lt;strong&gt;tamaño&lt;/strong&gt; de ella. El inicio de la lista se denomina &lt;strong&gt;cabecera&lt;/strong&gt;, mientras que el final de la misma es el &lt;strong&gt;fin&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Existen dos enfoques para implementar las listas, la primera basada en vectores y la segunda basada en listas enlazadas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Listas: Estáticas y Dinámicas
&lt;/h2&gt;

&lt;p&gt;Una lista puede ser estática o dinámica dependiendo de cómo es implementada, si es implementada como un &lt;strong&gt;vector unidimensional&lt;/strong&gt;, la lista es estática.&lt;/p&gt;

&lt;p&gt;Sin embargo, si es implementada utilizando una &lt;strong&gt;lista enlazada&lt;/strong&gt;, la lista es dinámica. Esta implementación hace uso de la memoria de forma dinámica, es decir, utiliza memoria acorde a su necesidad.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operaciones elementales sobre Listas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Leer&lt;/li&gt;
&lt;li&gt;Recorrer&lt;/li&gt;
&lt;li&gt;Insertar &lt;/li&gt;
&lt;li&gt;Eliminar&lt;/li&gt;
&lt;li&gt;Ordenar&lt;/li&gt;
&lt;li&gt;Buscar&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tipos de Listas
&lt;/h2&gt;

&lt;p&gt;Acorde su implementación, pueden existir muchas variaciones, donde las operaciones son las mismas pero los detalles de implementación son diferentes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Listas No Enlazadas
&lt;/h3&gt;

&lt;p&gt;La listas no enlazadas se implementan utilizando un vector unidimensional. El primer paso para implementar este tipo de lista, es definir el tamaño del vector, que será el tamaño de la lista, una vez definido este no puede ser alterado. &lt;/p&gt;

&lt;p&gt;Los elementos se almacenan de forma contigua en posiciones consecutivas de la memoria y para acceder a ellos se utiliza el índice, como si fuese un vector.&lt;/p&gt;

&lt;p&gt;El principal problema de esta implementación es que se debe definir el tamaño del vector de forma &lt;em&gt;a priori&lt;/em&gt;, si el vector se llena, no será posible agregar más elementos, entonces es necesario crear un vector más grande y migrar todos los elementos del vector original, y finalmente liberar el espacio en la memoria.&lt;/p&gt;

&lt;p&gt;En general, los vectores no son buenos para implementar listas, considerando que las operaciones de actualización (insertar/eliminar) son costosas, además que la cantidad total de elementos a insertar suele ser desconocida.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uHmPLm4C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o7714v3vnyewyykea3hf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uHmPLm4C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o7714v3vnyewyykea3hf.png" alt="Lista utilizando un vector" width="401" height="62"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Listas Enlazadas
&lt;/h3&gt;

&lt;p&gt;Una lista enlazada es un conjunto de elementos donde cada elemento debe tener al menos dos campos: un campo que almacena el valor o dato del elemento y un campo (puntero) que contiene la posición del siguiente elemento de la lista, esta estructura recibe el nombre de &lt;strong&gt;nodo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UYDXCy7x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ch1hz7nej0r4o99cl8d7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UYDXCy7x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ch1hz7nej0r4o99cl8d7.png" alt="Nodo" width="162" height="82"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Las listas simplemente enlazadas nos permiten a partir de un elemento acceder directamente a cualquiera de los elementos que le preceden.&lt;/p&gt;

&lt;p&gt;Existe un puntero inicial denominado &lt;strong&gt;cabecera (o &lt;em&gt;head&lt;/em&gt;)&lt;/strong&gt;, que marca el comienzo de la lista, este almacena la posición del primer nodo de la lista, mientras que el puntero del último elemento no almacena ninguna dirección, es decir, es &lt;em&gt;nulo&lt;/em&gt;, esto denota el final de la lista, y que ya no existen más elementos por recorrer.&lt;/p&gt;

&lt;p&gt;Si se conoce la dirección al primer elemento de la lista, es posible realizar todas las operaciones sobre la misma, considerando que solo debemos navegar entre los diferentes nodos conectados por punteros.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2Ru1gD_h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ta9jima9inq3h5b3lz55.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2Ru1gD_h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ta9jima9inq3h5b3lz55.png" alt="Lista utilizando Nodos" width="432" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En la figura se ilustra una lista enlazada utilizando los nodos para enlazar cada elemento de la lista.&lt;/p&gt;

&lt;h3&gt;
  
  
  Listas Doblemente Enlazadas
&lt;/h3&gt;

&lt;p&gt;Las listas doblemente enlazadas son listas que pueden recorrerse en ambas direcciones, donde cada nodo contiene el campo de dato y a la vez dos campos punteros; uno apunta al nodo anterior, y el otro al nodo siguiente.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Nnn6xpAE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0sd0wxuiuqfwxs458is9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Nnn6xpAE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0sd0wxuiuqfwxs458is9.png" alt="Nodo con doble enlace" width="242" height="82"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como cada elemento tiene dos punteros, en consecuencia una lista doblemente enlazada ocupa más espacio en memoria que una lista simplemente enlazada para una misma cantidad de información.&lt;/p&gt;

&lt;p&gt;Además, la lista necesita dos punteros &lt;em&gt;cabecera y fin&lt;/em&gt;, que apuntan al primer y último nodo, respectivamente.&lt;br&gt;
La variable &lt;em&gt;cabecera&lt;/em&gt; y el puntero &lt;em&gt;sig&lt;/em&gt; permiten recorrer la lista en el sentido normal y la variable &lt;em&gt;fin&lt;/em&gt; y el puntero &lt;em&gt;ant&lt;/em&gt; permiten recorrerla en sentido inverso.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2fvGMYM2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bs9u0vs8hvtd1nhfvpsm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2fvGMYM2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bs9u0vs8hvtd1nhfvpsm.png" alt="Lista doblemente enlazada" width="762" height="73"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Listas Circulares
&lt;/h3&gt;

&lt;p&gt;Las listas circulares o listas en anillo, a diferencia de las listas enlazadas donde el último elemento apunta a &lt;em&gt;nulo&lt;/em&gt;, en estas estructuras el último puntero del último elemento apunta al primer elemento de la lista, de forma que es posible iterar sobre la lista, sin necesidad de volver acceder desde la cabecera.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gydarDJ4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c72x6iwg4p1kun1u4vng.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gydarDJ4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c72x6iwg4p1kun1u4vng.png" alt="Lista Circular" width="471" height="112"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;¡Gracias por leer! &lt;/p&gt;

&lt;p&gt;Ponte en contacto en Twitter &lt;a href="https://twitter.com/sZalimben"&gt;@sZalimben&lt;/a&gt;, y si te gusta mi contenido puedes realizar una donación &lt;em&gt;&lt;a href="https://www.buymeacoffee.com/szalimben"&gt;invitándome un café&lt;/a&gt;&lt;/em&gt;  que me será de mucha ayuda!&lt;/p&gt;

</description>
      <category>spanish</category>
      <category>tutorial</category>
      <category>computerscience</category>
      <category>español</category>
    </item>
    <item>
      <title>Vectores (Array o Arreglos)</title>
      <dc:creator>Saúl Zalimben</dc:creator>
      <pubDate>Fri, 04 Mar 2022 17:58:12 +0000</pubDate>
      <link>https://dev.to/szalimben/vectores-array-o-arreglos-3l49</link>
      <guid>https://dev.to/szalimben/vectores-array-o-arreglos-3l49</guid>
      <description>&lt;p&gt;Si acabas de encontrar esta publicación, antes de continuar te recomiendo que le des un vistazo a los artículos previos de esta serie, que brindan conceptos claves para comprender las Estructuras de Datos.&lt;/p&gt;




&lt;p&gt;Los &lt;strong&gt;Vectores (Arrays o Arreglos)&lt;/strong&gt; son estructuras estáticas lineales finitas ordenadas secuencialmente, y de datos homogéneos, es decir, del mismo tipo de dato y se puede acceder directamente a cada elemento del mismo mediante el uso de índices, donde el índice de un elemento (1, 2, ..., n) designa su posición dentro del vector. Es una secuencia de posiciones de la memoria a las que se puede acceder directamente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JzeXubQy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3b6wb31s37yk8xsg771o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JzeXubQy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3b6wb31s37yk8xsg771o.png" alt="Vector" width="645" height="91"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;En general, los índices de un vector comienzan en 0, pero este puede diferir acorde al lenguaje de programación utilizado.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Operaciones elementales sobre Vectores
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Asignar&lt;/li&gt;
&lt;li&gt;Leer&lt;/li&gt;
&lt;li&gt;Recorrer (Acceso secuencial)&lt;/li&gt;
&lt;li&gt;Insertar&lt;/li&gt;
&lt;li&gt;Eliminar&lt;/li&gt;
&lt;li&gt;Ordenar&lt;/li&gt;
&lt;li&gt;Buscar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cabe resaltar que otras operaciones pueden ser definidas sobre esta estructura como mezclar, filtrar, copiar, etc., acorde a las necesidades del problema por resolver.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vector Multidimensional
&lt;/h2&gt;

&lt;p&gt;Un vector multidimensional puede tener &lt;em&gt;n&lt;/em&gt; cantidad de dimensiones, en consecuencia se dice que es &lt;em&gt;n&lt;/em&gt;-dimensional. También se lo puede ver como un vector de vectores de vectores, cuyos elementos pueden ser referenciados por dos o más índices.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vector Bidimensional
&lt;/h3&gt;

&lt;p&gt;Un vector multidimensional de 2 dimensiones, es decir, un vector bidimensional recibe el nombre de matriz o tabla, es un caso especial del vector multidimensional,&lt;/p&gt;

&lt;p&gt;El mismo puede ser considerado como un vector de vectores. Por consiguiente, es un conjunto de elementos homogéneos, en el cual existe un orden y en el que se necesita especificar dos índices para poder identificar cada elemento, es decir, es necesario definir la fila y la columna en la matriz para poder acceder a cada elemento, &lt;strong&gt;Matriz[fila][columna]&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tx94O9vw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/au86re81q6cxhtwjuk0c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tx94O9vw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/au86re81q6cxhtwjuk0c.png" alt="Matriz" width="239" height="178"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Vector &lt;em&gt;n&lt;/em&gt;-dimensional
&lt;/h3&gt;

&lt;p&gt;Los conceptos de rango de índices y número de elementos se pueden ampliar directamente desde vectores de una y dos dimensiones a vectores de orden más alto. Un vector puede ser definido de tres, cuatro hasta de &lt;em&gt;n&lt;/em&gt;-dimensiones. &lt;br&gt;
En general, un vector &lt;em&gt;n&lt;/em&gt;-dimensional requiere que los valores de los &lt;em&gt;n&lt;/em&gt; índices sean especificados a fin de identificar unívocamente un elemento. Si cada componente tiene &lt;em&gt;n&lt;/em&gt; índices, se dice que el vector es de &lt;em&gt;n&lt;/em&gt; dimensiones. En la figura se observa un vector de 3 dimensiones, un Cubo. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cubo[0][0][0]&lt;/strong&gt; representa el elemento del cubo resaltado en azul; mientras que el elemento &lt;strong&gt;Cubo[2][2][0]&lt;/strong&gt; esta resaltado en verde.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7BYee88x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fe9vd6w5b90f0gzkwk55.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7BYee88x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fe9vd6w5b90f0gzkwk55.png" alt="Cubo" width="132" height="105"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;¡Gracias por leer! &lt;/p&gt;

&lt;p&gt;Ponte en contacto en Twitter &lt;a href="https://twitter.com/sZalimben"&gt;@sZalimben&lt;/a&gt;, y si te gusta mi contenido puedes realizar una donación &lt;em&gt;&lt;a href="https://www.buymeacoffee.com/szalimben"&gt;invitándome un café&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

</description>
      <category>spanish</category>
      <category>tutorial</category>
      <category>computerscience</category>
      <category>español</category>
    </item>
    <item>
      <title>Estructura Datos. Conceptos</title>
      <dc:creator>Saúl Zalimben</dc:creator>
      <pubDate>Wed, 23 Feb 2022 19:54:09 +0000</pubDate>
      <link>https://dev.to/szalimben/estructura-datos-conceptos-1h0e</link>
      <guid>https://dev.to/szalimben/estructura-datos-conceptos-1h0e</guid>
      <description>&lt;p&gt;Si acabas de encontrar esta publicación, antes de continuar te recomiendo que le des un vistazo a &lt;a href="https://dev.to/szalimben/introduccion-a-la-estructura-de-datos-1ak2"&gt;Introducción a Estructuras de Datos&lt;/a&gt; el cual brinda una introducción a los conceptos preliminares para comprender las Estructuras de Datos.&lt;/p&gt;




&lt;p&gt;Una &lt;strong&gt;Estructura de Dato&lt;/strong&gt; es una colección de datos que pueden ser caracterizados por su organización y las operaciones que se definen en ella, es la implementación de un TDA en algún lenguaje de programación, es decir, la representación de algún tipo de dato y de sus operaciones asociadas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Simples y Compuestos
&lt;/h3&gt;

&lt;p&gt;Se dice que son tipos simples o primitivos cuando se definen sobre sí mismos, es decir, no están compuestos de otras estructuras de datos, &lt;em&gt;e.g.&lt;/em&gt; números enteros, reales y carácter (char). Mientras que aquellas estructuras que se definen en función a otros se denominan compuestos o agregados, es decir, están construidos basados en tipos de datos primitivos, &lt;em&gt;e.g&lt;/em&gt;. el tipo cadena (string) basado en el conjunto de caracteres.&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%2Fuploads%2Farticles%2Fnyn2k69amqf6yro4lehd.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%2Fuploads%2Farticles%2Fnyn2k69amqf6yro4lehd.JPG" alt="Datos Simples y Compuestos"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Cada lenguaje de programación dispone de su propio conjunto de tipos primitivos y compuestos&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Estáticos y Dinámicos
&lt;/h3&gt;

&lt;p&gt;Las estructuras de datos estáticas son aquellas en las que el tamaño ocupado en memoria es fijo, este se define antes de que el programa se ejecute y el tamaño reservado de memoria no puede ser modificado durante la ejecución del programa.&lt;/p&gt;

&lt;p&gt;Mientras que las estructuras de datos dinámicas se pueden ampliar y comprimir a medida que se requieran durante la ejecución del programa, es decir, pueden reservar y liberar espacios de memoria de forma dinámica.&lt;/p&gt;

&lt;p&gt;En la siguiente figura se observa que la estructura &lt;em&gt;Vector&lt;/em&gt;, tiene un tamaño igual a la cantidad de letras del abecedario, por lo tanto ya no se pueden agregar más elementos, esta estructura es estática. Por otro lado, la estructura &lt;em&gt;Grafo&lt;/em&gt; está compuesta por otras estructuras de datos dinámicas denominadas &lt;em&gt;Nodos&lt;/em&gt;, que pueden ser instanciadas en cualquier momento, es decir, se pueden agregar más elementos en tiempo de ejecución del programa, esta estructura es dinámica.&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%2Fuploads%2Farticles%2Fvupgz56sg45p8yzvdj3x.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%2Fuploads%2Farticles%2Fvupgz56sg45p8yzvdj3x.png" alt="Estáticos y Dinámicos"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Lineales y No lineales
&lt;/h3&gt;

&lt;p&gt;Las estructuras de datos lineales son aquellas donde los elementos ocupan lugares sucesivos en la estructura y cada uno de ellos tiene un único sucesor y un único predecesor.&lt;br&gt;
Sin embargo las estructuras de datos no lineales no cumplen con esta restricción.&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%2Fuploads%2Farticles%2Fshe4ceq3n0chvux1c9st.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%2Fuploads%2Farticles%2Fshe4ceq3n0chvux1c9st.png" alt="Lineales y No Lineales"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;¡Gracias por leer! &lt;/p&gt;

&lt;p&gt;Ponte en contacto en Twitter &lt;a href="https://twitter.com/sZalimben" rel="noopener noreferrer"&gt;@sZalimben&lt;/a&gt;, y si te gusta mi contenido, puedes &lt;em&gt;&lt;a href="https://www.buymeacoffee.com/szalimben" rel="noopener noreferrer"&gt;invitarme un café&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

</description>
      <category>spanish</category>
      <category>tutorial</category>
      <category>computerscience</category>
      <category>español</category>
    </item>
    <item>
      <title>Introducción a la Estructura de Datos</title>
      <dc:creator>Saúl Zalimben</dc:creator>
      <pubDate>Wed, 16 Feb 2022 15:14:44 +0000</pubDate>
      <link>https://dev.to/szalimben/introduccion-a-la-estructura-de-datos-1ak2</link>
      <guid>https://dev.to/szalimben/introduccion-a-la-estructura-de-datos-1ak2</guid>
      <description>&lt;p&gt;Uno de los aspectos más importantes de la ciencia de la computación es la creación de nuevos tipos de datos que sean apropiados para resolver problemas específicos del mundo real.&lt;/p&gt;

&lt;p&gt;Las estructuras de datos son el elemento fundamental de la computación, son construcciones utilizadas para almacenar colecciones de datos y manipularlos. Todos los algoritmos manipulan datos, y éstos deben estar diseñados y estructurados adecuadamente para que puedan conectarse entre ellos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preliminares
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tipo
&lt;/h3&gt;

&lt;p&gt;Un tipo es un conjunto de valores que puede poseer una variable, por ejemplo una variable del tipo booleano puede contener dos posibles valores, falso o verdadero, o bien una variable del tipo entero, que puede tomar el valor de todos los números enteros.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tipo de Dato
&lt;/h3&gt;

&lt;p&gt;Un Tipo de Dato es un tipo junto a todas las operaciones elementales que manipulan dicho tipo, un conjunto de funciones básicas que uno puede aplicar a estos valores, &lt;em&gt;e.g.&lt;/em&gt; para los números enteros se pueden aplicar las operaciones básicas de la aritmética (suma, resta, multiplicación y división).&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Abstracción
&lt;/h4&gt;

&lt;p&gt;Es el conocimiento que se tiene de una cosa prescindiendo de los detalles que están ligados a ella. Conocemos un objeto viéndolo, sabemos qué es sin necesidad de ver su interior, su implementación o la forma de construcción.&lt;br&gt;
La abstracción de datos consiste en ocultar las características de un objeto, de manera a que solamente utilizamos el nombre del objeto para hacer referencia a él. Es la capacidad para encapsular y aislar la información del diseño y ejecución.&lt;/p&gt;
&lt;h4&gt;
  
  
  Encapsulación
&lt;/h4&gt;

&lt;p&gt;Proceso de almacenar en un mismo compartimento los elementos de una abstracción, que constituyen su estructura y comportamiento.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Tipo de Dato Abstracto (TDA)
&lt;/h3&gt;

&lt;p&gt;Un TDA es la definición de un tipo de dato como un componente que está definido en términos de su tipo y el conjunto de operaciones sobre ese tipo, en donde las operaciones no se encuentran implementadas, solo su comportamiento, es decir, se define qué debe hacer y no el cómo. Los detalles de implementación están ocultos y encapsulados para el usuario del TDA.&lt;/p&gt;

&lt;p&gt;Generalmente, los TDA son conceptos matemáticos o lógicos que pueden ser implementados en diferentes máquinas usando diferentes lenguajes. Son muy flexibles y no dependen de ningún lenguaje ni máquina.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gE5e3aeq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/4c02moocan9xt9tk0zei.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gE5e3aeq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/4c02moocan9xt9tk0zei.png" alt="TDA" width="302" height="302"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En cada lenguaje de programación, se implementan los TDA utilizando diferentes métodos y lógicas, es posible realizar todas las operaciones asociadas que están definidas para un TDA independientemente del lenguaje utilizado. Por ejemplo, en el Lenguaje C, los TDA se implementan principalmente con estructuras &lt;em&gt;(structure)&lt;/em&gt;. Mientras que en los Lenguajes C++ o Java, se implementan mediante clases &lt;em&gt;(class)&lt;/em&gt;. Sin embargo, &lt;strong&gt;las operaciones son comunes en todos los lenguajes de programación&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6_wpywMG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2iqrbc67x6hmzqs59ua6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6_wpywMG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2iqrbc67x6hmzqs59ua6.png" alt="Estructura de Datos" width="405" height="172"&gt;&lt;/a&gt;&lt;br&gt;
Ejemplos de Estructuras de Datos&lt;/p&gt;

</description>
      <category>spanish</category>
      <category>español</category>
      <category>principiante</category>
      <category>fundamentos</category>
    </item>
    <item>
      <title>Write Git Commit Messages</title>
      <dc:creator>Saúl Zalimben</dc:creator>
      <pubDate>Thu, 10 Feb 2022 15:05:33 +0000</pubDate>
      <link>https://dev.to/szalimben/write-git-commit-messages-3b5e</link>
      <guid>https://dev.to/szalimben/write-git-commit-messages-3b5e</guid>
      <description>&lt;p&gt;This article assumes you already understand basic Git Workflow. If not, I suggest reading previous articles on this series.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why should you write good commit messages?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"When a programmer first creates his code, only he and God know how it works, a few months down the line and only God knows."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not sure who said this phrase, but it is so accurate. The same thing happens when we write &lt;strong&gt;Commit Messages&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;We're often pressed for time when it comes to Git commits, and so we write something random or without meaning in our commit message like "Fixes" or "WIP", even memes, memes!&lt;/p&gt;

&lt;p&gt;I challenge you to figure out the following commit message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Minor fixes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perhaps the most common commit message, but what does it mean exactly? We can ask ourselves so many questions about it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Minor fixes on what? &lt;/li&gt;
&lt;li&gt;What were the fixes? &lt;/li&gt;
&lt;li&gt;Why fixes were needed?&lt;/li&gt;
&lt;li&gt;... and many more.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Writing commit messages that are not telling the whole story is a bad practice. Commit messages should be helpful and make sense so people working on the project understand the changes from the message itself.&lt;/p&gt;

&lt;p&gt;Using the right commit message helps make it more meaningful and it provides clarity on your updated piece of code, for everyone.&lt;/p&gt;

&lt;p&gt;It seems like writing good commit messages is easy and everyone understands the benefits of doing it. Yet, you can find messages like the above.&lt;/p&gt;

&lt;p&gt;Commit messages can communicate why a change was made, they help the narrative of the project. Poetically, commit messages are telling the story of the project, and you can read it using the &lt;code&gt;git log&lt;/code&gt; command.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Don't destroy a good story, build one.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How to write good commit messages?
&lt;/h2&gt;

&lt;p&gt;There are several conventions used by different teams, projects, and developers. I'll just give you some general guidelines and pointers, but it's up to you to decide which convention you want to follow.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you work for a company or contribute to open source, you have to adapt to their convention.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Check out &lt;a href="https://hashnode.com/post/which-commit-message-convention-do-you-use-at-work-ck3e4jbdd00zyo4s1h7mc7e0g"&gt;this thread&lt;/a&gt; for some commit message conventions, discussion proposed by &lt;a href="https://hashnode.com/@bolajiayodeji"&gt;@bolajiayodeji&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  6 General Rules
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Capitalization and Punctuation&lt;/strong&gt;: Capitalize the first word and do not end in punctuation. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mood&lt;/strong&gt;: Use the imperative mood in the subject line. Example: Add fix for dark mode toggle state. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type of Commit&lt;/strong&gt;: Specify the type of commit. It is recommended and can be even more beneficial to have a consistent set of words to describe your changes. Example: Bugfix, Update, Refactor, Bump, and so on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Length&lt;/strong&gt;: The first line should be no longer than 50 characters, and the body should be restricted to 72 characters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content&lt;/strong&gt;: Be direct, try to cut filler words and phrases in these sentences. Examples: though, maybe, I think, kind of.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Issue Tracker&lt;/strong&gt;:  If you use an issue tracker, add a reference(s). &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Journalism Questions
&lt;/h3&gt;

&lt;p&gt;When a journalist is writing an article they look to answer who, what, where, when, why, and how. It is similar when we are writing commit messages, we need to answer some questions about the changes. &lt;/p&gt;

&lt;p&gt;Sometimes it is not easy to put in words the changes that we made. To simplify that process and come up with thoughtful commits, consider the following "journalism" questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why are the changes necessary?&lt;/li&gt;
&lt;li&gt;How do changes address the issue?&lt;/li&gt;
&lt;li&gt;Why have I made these changes?&lt;/li&gt;
&lt;li&gt;What effect have my changes made?&lt;/li&gt;
&lt;li&gt;What side effects do the changes have?&lt;/li&gt;
&lt;li&gt;What are the changes in reference to?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Answering these questions will help you to write a better commit message.&lt;/p&gt;

&lt;h3&gt;
  
  
  Commit Message Template
&lt;/h3&gt;

&lt;p&gt;I merged the &lt;em&gt;6 General Rules&lt;/em&gt; with &lt;em&gt;Journalism Questions&lt;/em&gt;, to have a well-format compact template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#                Header (up to 50)              #  
&amp;lt;issue|type&amp;gt;: &amp;lt;title&amp;gt;

#                Body (up to 72)                           #   
&amp;lt;description&amp;gt;

# Description of changes. Answer the following questions:
# Why are the changes necessary?
# How do changes address the issue?
# Why have I made these changes?
# What effect have my changes made? 
# What side effects do the changes have?
# What are the changes in reference to?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;issue|type:&lt;/strong&gt; If you are using an issue tracker, set the reference(s), otherwise, set the commit type.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;title: "&lt;/strong&gt; Issue name or a short summary of changes."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;description: "&lt;/strong&gt; More detailed explanatory text, if necessary. It should answer the template's questions."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JIRA-921: Remove the X

X was removed because it is obsolete

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Git Configuration
&lt;/h4&gt;

&lt;p&gt;Templates can be added to your &lt;strong&gt;&lt;a href="https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration"&gt;Git Configuration&lt;/a&gt;&lt;/strong&gt;, so every time you make a commit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the commit message editor will display the template, and you only have to update it. To tell Git to use the template file (globally), you can use the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; commit.template git-message-template.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By default, Git uses whatever you’ve set as your default text editor to create and edit your commit and tag messages. To change that default to something else, you can use the &lt;code&gt;core.editor&lt;/code&gt; setting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; git config &lt;span class="nt"&gt;--global&lt;/span&gt; core.editor vim
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The most important part of a commit message is that it should be clear and meaningful. It helps you communicate and collaborate with your team. &lt;/p&gt;

&lt;p&gt;There is an existing set of agreed-upon standards you can follow. But, you can tweak the convention to get a more appropriate convention for your team or project.&lt;/p&gt;




&lt;p&gt;Thanks for reading! Let me know what you think in the comment section, don't forget to leave a ❤️ and share it within your network!&lt;/p&gt;

&lt;p&gt;Connect with me on Twitter &lt;a href="https://twitter.com/sZalimben"&gt;@sZalimben&lt;/a&gt;, and if you like my content you can &lt;em&gt;&lt;a href="https://www.buymeacoffee.com/szalimben"&gt;Buy Me a Coffe&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.conventionalcommits.org/en/v1.0.0/"&gt;Conventional Commits&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.freecodecamp.org/news/how-to-write-better-git-commit-messages/"&gt;How to Write Better Git Commit Messages – A Step-By-Step Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.freecodecamp.org/news/how-to-use-commitlint-to-write-good-commit-messages/"&gt;How to Write Good Commit Messages with Commitlint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.freecodecamp.org/news/writing-good-commit-messages-a-practical-guide/"&gt;How to Write Good Commit Messages: A Practical Git Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration"&gt;Customizing Git - Git Configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>git</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Git Branching Strategy</title>
      <dc:creator>Saúl Zalimben</dc:creator>
      <pubDate>Mon, 17 Jan 2022 14:56:33 +0000</pubDate>
      <link>https://dev.to/szalimben/git-branching-models-2ohp</link>
      <guid>https://dev.to/szalimben/git-branching-models-2ohp</guid>
      <description>&lt;p&gt;In this post, we will go over Git Branching Strategy and Git Workflows, it will not focus on comparing Git Branching Models, nor explain one by one since that story has been told more than once, but you will be able to find the links and examples in this post.&lt;/p&gt;

&lt;p&gt;If you're looking for a &lt;em&gt;Git Tutorial&lt;/em&gt;, I recommend my previous post on it, &lt;a href="https://dev.to/szalimben/git-explained-by-dev-community-2b84"&gt;Git Explained by DEV Community&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://git-scm.com/doc"&gt;Git&lt;/a&gt; has become the &lt;em&gt;de-facto&lt;/em&gt; standard for source control management. Branching is an essential feature of a &lt;a href="https://git-scm.com/book/en/v2/Getting-Started-About-Version-Control"&gt;VCS&lt;/a&gt; (version control system), that allows developers to diverge from the main branch and continue their work on multiple feature branches in parallel, without affecting the main branch. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Git does NOT enforce any particular branching strategy.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Git allows teams to tweak Git Workflows, as it fits the team’s culture. As a result, teams and organizations are often required to choose a particular branching strategy that matches their release cadence, while optimizing productivity depending on their team size, strengths and weaknesses.&lt;/p&gt;

&lt;p&gt;Some Git Branching Models are the best in certain situations, but none can be considered the &lt;em&gt;"best"&lt;/em&gt;, therefore, it is important to mention that there is no such thing as "Best Git Branching Model" or "Best Git Workflow" or "Best Gitflow" or any of its variations, but what you may find is &lt;em&gt;"A successful Git branching model for X situation"&lt;/em&gt; which is true as Git Workflows are flexible and change as needed, so in certain situations, one Git Workflow is better than others, simple as that.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;There is no such thing as &lt;em&gt;"Best Git Branching Model"&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Git Workflows
&lt;/h2&gt;

&lt;p&gt;A Git Workflow is a recipe or recommendation for how to use Git to accomplish work in a consistent and productive manner, and deal with the branching problem.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Gitflow is not Git Workflow&lt;/strong&gt;&lt;br&gt;
In some cases, the term Gitfow is used to refer to the actual Git Workflow used by a team or organization, but this is incorrect. A Git Workflow could be any of the Git Branching Strategies that the team or organization is using and a Gitflow is a type of Git Workflow.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Git Branching Models
&lt;/h3&gt;

&lt;p&gt;Here a list of some well-defined models: &lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://commonflow.org/"&gt;Git Commonflow&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--t9sEiKco--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uz3yevyu7g6akubo6gna.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t9sEiKco--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uz3yevyu7g6akubo6gna.png" alt="Commonflow" width="800" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://nvie.com/posts/a-successful-git-branching-model/"&gt;Gitflow&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Rs7Mkd3_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v2ojn0uyvx96vuqa65j3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Rs7Mkd3_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v2ojn0uyvx96vuqa65j3.jpg" alt="Gitflow" width="800" height="1132"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://about.gitlab.com/solutions/gitlab-flow/"&gt;GitLab Flow&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kF8Bygel--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/39585l2n34br7xo3wd8q.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kF8Bygel--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/39585l2n34br7xo3wd8q.jpg" alt="GitLab Flow" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://docs.github.com/en/get-started/quickstart/github-flow"&gt;GitHub Flow&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rzb5xBhH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ecy82dtuqv34li88lrd6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rzb5xBhH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ecy82dtuqv34li88lrd6.png" alt="GitHub Flow" width="800" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://trunkbaseddevelopment.com/"&gt;Trunk Based Development&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NOEBrUzO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/doaeef4dqbpm729w0vyi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NOEBrUzO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/doaeef4dqbpm729w0vyi.png" alt="Trunk Based Development" width="726" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This post performs a &lt;a href="https://dev.to/arbitrarybytes/comparing-git-branching-strategies-dl4"&gt;comparative analysis&lt;/a&gt; of the three most popular branching strategies, namely, Git Flow, Trunk Based Development and GitHub Flow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Custom Git Branching Models
&lt;/h3&gt;

&lt;p&gt;There are also several custom Git Branching Models; In some cases, teams take a well-defined git workflow and modify it based on the needs of the project. Therefore, it is very common to find mutations of the git branching models mentioned above.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example: &lt;a href="https://dev.to/preethamsathyamurthy/git-branching-and-branching-strategy-4mci"&gt;Git Environment Branching Flow&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;This strategy focuses on branches per environment (development, staging and production), where each branch is restricted by rules.&lt;/p&gt;

&lt;p&gt;Initially, three branches are required: staging, develop and master (or main).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Branch&lt;/th&gt;
&lt;th&gt;Environment&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;develop&lt;/td&gt;
&lt;td&gt;Development&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;staging&lt;/td&gt;
&lt;td&gt;Staging&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;master&lt;/td&gt;
&lt;td&gt;Production&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lz5uj19b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w96pg7r5kaeabhboeutz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lz5uj19b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w96pg7r5kaeabhboeutz.jpg" alt="Git Environment Branching Flow" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;There is &lt;a href="https://www.researchgate.net/publication/220477127_No_Silver_Bullet_Essence_and_Accidents_of_Software_Engineering"&gt;No Silver Bullet&lt;/a&gt; for Git Branching, each strategy has a list of pros and cons. Choosing the "best" requires researching the well-defined models and the needs of the project, and checking if the model covers all you need or maybe a custom model based on a well-defined one.&lt;/p&gt;

&lt;p&gt;Also, it is okay to make mistakes when selecting the correct model, if that happens remember you can always modify the current strategy or move to another one, Git allows that.&lt;/p&gt;




&lt;p&gt;Let me know what you think in the comment section, please comment with your suggestions and feedback. If you like this article, don't forget to leave a ❤️ and share it within your network, and if you want to share your own recommended Git Workflow, please do so!&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/doc"&gt;Git Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/book/en/v2/Getting-Started-About-Version-Control"&gt;Version Control System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.researchgate.net/publication/220477127_No_Silver_Bullet_Essence_and_Accidents_of_Software_Engineering"&gt;No Silver Bullet&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/arbitrarybytes/comparing-git-branching-strategies-dl4"&gt;Comparing Git Branching Strategies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/preethamsathyamurthy/git-branching-and-branching-strategy-4mci"&gt;Git Branching and Branching Strategy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://build5nines.com/introduction-to-git-version-control-workflow/"&gt;Introduction to Git Version Control Workflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/andou/yagbw-yet-another-git-branching-workflow-hf4"&gt;YAGBW - Yet Another Git Branching Workflow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>git</category>
      <category>versioncontrol</category>
      <category>branching</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
