Alberto Castañeda
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Engagement control
    • Make a copy
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Make a copy Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    # Software Architecture in Practice - Resumen ## ¿De qué nos sirve la Arquitectura de Software? * Herramienta de comunicación con stakeholders * Forma iterativa de encontrar la mejor forma de diseñar un sistema en la fase de inicio de un proyecto. * Referencia para el diseño y limitaciones de un sistema ## Structure Elementos relacionados que componen a una arquitectura ## View Una forma de ver la arquitectura ## ¿Cómo elegir una arquitectura? Se debe tener varias arquitectura distintas, y dependiendo del contexto y las necesidades del sistema elegirse una considerando los atributos de calidad que son necesarias. ## Preguntas para considerar en fase de inicio para una arquitectura * Will the system run on one processor or be distributed across multiple processors? * Will the software be layered? If so, how many layers will there be? What will each one do? * Will components communicate synchronously or asynchronously? Will they interact by transferring control or data or both? * Will the system depend on specific features of the operating system or hardware? * Will the information that flows through the system be encrypted or not? * What operating system will we use? * What communication protocol will we choose? ## Manual de Arquitectura El manual de arquitectura debe ser reemplazar a Stack Overflow al momento de tener dudas y problemas con el sistema. Si no hay respuesta en el manual, se debe agregar a ella. ## Atributos de Calidad Componentes de un atributo de calidad * Source * Actor de donde proviene el stimulus. Puede ser una persona, una accion, u otro sistema. * Stimulus * Lo que ocasiona el artifact. * Environment * En qué estado o ambiente del sistema se provoca. * Artifact * El producto que es generado. * Response * La salida del artifact en un environment. * Response Measure * La forma de medir el atributo de calidad. ### Availability La disponibilidad que tiene el sistema. Incluye tiempos de mantenimiento, tiempo de recuperación en caso de falla o ataque, y otros factores que pueden hacer que el sistema no esté disponible. ![](https://i.imgur.com/YQfHqZg.png) ### Interoperability Capacidad de intercambiar información con otros sistemas por medio de abstracciones. ![](https://i.imgur.com/qxjuQM0.png) ### Modifiability Facilidad de hacer cambios sin tener que dedicar mucho tiempo ni esfuerzo y a la vez teniendo una probabilidad muy baja de que estos cambios provocan un defecto. ![](https://i.imgur.com/NOJTeDB.png) ### Performance La velocidad en la que el sistema puede procesar las actividades que debe de hacer. ![](https://i.imgur.com/zjAdMQ3.png) ### Security Prácticas para proteger la información sensible y prevenir ataques que pueden afectar la disponibilidad del sistema. ![](https://i.imgur.com/Y0PPhnv.png) ### Testability Testability se refiere a la facilidad de encontrar fallas en un sistema. Si existe una falla en el sistema entonces es importante que falle lo más pronto posible. La clave para testability es tener control y monitoreo. Para que un sistema sea testeable, debe ser posible controlar las entradas de cada componente y generar una salida sin tener que utilizar una interfaz gráfica o alguna dependencia. ![](https://i.imgur.com/qX9VMT2.png) ### Usability Facilidad del usuario para completar alguna tarea y el soporte que este mismo otorga. Es considerado de los cambios más fáciles de mejorar la calidad de un sistema (desde el punto de vista del usuario). La mejor forma de perfeccionar este atributo es facilitar la experimentacion con prototipos. Para esto, la mejor forma es diseñar el software para que la interfaz grafica pueda ser cambiada rapidamente. Por lo tanto, usability y modifiability van de la mano. La usabilidad en ocasiones puede costar Performance. Por ejemplo, en una forma que se valida lo ingresado desde servidor. Lo anterior indica mejor usabilidad, pero menor rendimiento. ![](https://i.imgur.com/lpprQ2I.png) ![](https://i.imgur.com/9MzNQcv.png) ### Atributos adicionales * Variability * Portability * Development Distributability * Scalability * Horizontal * Vertical (Elasticity en cloud environments) * Deployability * Monitorability * Safety ### Otras categorias de atributos de calidad Estas miden la calidad de otras cosas aparte del producto final. ##### Conceptual Integrity of Architecture Consistencia en el diseño de la arquitectura. Contribuye al entendimiento de la arquitectura y provoca que haya menos errores. "Less is More" Debe existir consistencia en toda la arquitectura. Es decir, que una cosa se haga de la misma forma en toda la arquitectura. ##### Quality in Use * Efectivness * Medida que indica si el sistema esta correcto (el sistema funciona en la manera que el usuario desea) * Eficiency * Tiempo y esfuerzo para desarollar el sistema. * Ejemplo: Que tan facil es compilar despues de un cambio. * Freedom from risk * El grado en el que el producto o el sistema afecta el estado economico, la vida humana, o el ambiente. ##### Marketability La percepcion que se tiene de una arquitectura independientemente de otros atributos de calidad. Ejemplo: La tendencia de sistemas basados en la nube. ## Architectural Tactics and Patterns Las tacticas o atributos de calidad mencionados anteriorment son los que componen un patron de arquitectura. Un patron de arquitectura establece: * Contexto: * Situacion comun que provoca el problema * Problema: * El problema que surge del contexto. Describe normalmente los atributos calidad que deben cumplirse. * Solucion: * Solucion apropiadamente abstracta. Define las estructuras de arquitectura que resuelven el problema. Describe las responsabilidades de los elementos y la relacion entre ellas (usando un Module Structure) o describe el comportamiento en runtime (utilizando Component-and-Connector Structure o Allocation Structure) ### Module Patterns #### Layered Pattern ##### Contexto Todos los sistemas complejos necesitan desarollar y evolucionar porciones del sistema independientemente. Por lo anterior, los desarolladores de un sistema necesitan una documentacion clara sobre la separacion del sistema para que los modulos del sistema puedan ser desarolladores y mantenidos independientemente. ##### Problema El software debe estar segmentado de cierta forma para que los modulos puedan ser desarollados de forma separada con la mas minima interaccion entre ellos soportando asi portabillity, modifiablity, y reuse. ##### Solucion Para lograr esto, el software es dividio en "capas". Cada capa agrupa un set de modulos relacionados. La relacion entre las capas debe ser unidireccional. Normalmente una capa solo puede interactuar con capas inferiores a su nivel. Cada capa debe ser expuesta utilizando una interfaz publica. ![](https://i.imgur.com/hiHIje3.png) ### Component-and-Connector Patterns #### Broker Pattern ##### Contexto Muchos sistemas estan hechos con una collecion de servicios distribuidos en muchos servidores. Implementar estos sistemas es complicado ya que se debe verificar como estos sistemas operan entre si. ##### Problema Como estructurar software distribuido para que usuarios de un servicio no tengan que conocer sobre la naturaleza y la ubicacion de los proveedores del servicio haciendo asi que sea mas facil cambiar dinamicamente la union entre usuarios y proveedores? ##### Solucion Broker pattern separa los usuarios de los servicios de los proveedores de los servicios al insertar un intermediario llamado "broker". Cuando el usuario necesita un servicio, esta peticion le llega al broker con una interfaz de servicio. Posteriormente, el broker envia la peticion de servicio del usuario a un servidor. La respuesta sigue el mismo proceso de una manera vice versa. De esta forma, el usuario o cliente desconoce la identidad, ubicacion, y caracteristicas del servidor. Si el servidor llegara a dejar de funcionar, el broker podria dinamicamente buscar otro servidor. La desventaja de los brokers es que agregan complejidad y aumenta la latencia. ![](https://i.imgur.com/F8zKhEZ.png) #### Model-View-Controller Pattern ##### Contexto La interfaz es la porcion mas modificada en una aplicacion interactiva. Por esta razon, es importante separar el codigo de la interfaz grafica del resto del sistema. Por otro lado, los usuarios normalmente desean ver informacion o datos de modelos en distintas formas o perpsectivas. ##### Problema Separar la funcionalidad de la interfaz grafica. Crear, mantener, y coordinar varias vistas distintas aun cuando los datos de la aplicacion cambien. ##### Solucion El patron model-view-controller (MVC) separa la funcionalidad de un software en tres distintos componentes * Model * Contiene los datos de la aplicacion * View * Despliega una porcion de los datos e interactua con el usuario * Controller * Intermediario entre el modelo y la vista que maneja las notificaciones (eventos o callbacks) de un cambio de estado. ![](https://i.imgur.com/RZnfCm5.png) #### Pipe-and-Filter Pattern ##### Contexto Muchos sistemas requieren transformar flujos de informaciones desde input hasta ouput. Muchos tipos de transformaciones se repiten en pracitca asi que es recomendable de crear partes independientes y reutilizables. ##### Problema Estos sistemas deben ser divididos en componentes reutilizables con mecanismos de interacciones genericas y simples. ##### Solucion El pipe-and-filter pattern se caracteriza por transformaciones exitosas de flujos de informacion. Los datos llegan a un puerto de un filtro, es transformado, y sale por un puerto del filtro hacia al siguiente. ![](https://i.imgur.com/6z5q846.png) #### Client-Server Pattern ##### Contexto Existen recursos compartidos y servicios que varios clientes distribuidos desean acceder. ##### Problema Al manejar un arreglo de recursos y servicios compartidos, podemos promover modifiability y reutilizacion con servicios comunes/genericos. Deseamos mejorar scalability y availability al centrealizar el control de estos recursos y sericios, mientras distribuimos estos serivcios a traves de varios servidores fisicos. ##### Solucion Los clientes interactuan haciendo peticiones a los servidores. El cliente debe saber la identidad del servidor para invocarlo, el es el que siempre inicia la interaccion al invocar los servicios de los servidores. ![](https://i.imgur.com/n8ekmYq.png) #### Peer-to-Peer Pattern ##### Contexto Dispositivos distribuidos con propiedades equitativas deben cooperar y colaborar para proveer un servicio a una comunidad distribuida de usuarios. ##### Problema Conectar dispositivos distribuidos que tienen las mismas caracteresticas con un protocolo comun para que puedan organizar y compartir sus servicios con alta disponiblidad y escalabilidad. ##### Solucion En P2P, componentes interactuan directamente y bidireccionalmente como peers. Todo los peers deben ser iguales. Es diferente a la asimetria del patron client-server. Los peers pueden ser agregados o eliminados de una red peer-to-peer sin un cambio drastico. La desventaja de P2P es el manejo de la seguridad, la consistencia de los datos, y la disponibilidad. ![](https://i.imgur.com/PNb9b3l.png) #### Service-Oriented Architecture Pattern ![](https://i.imgur.com/edMYjZk.png) #### Publish-Subscribe Pattern ![](https://i.imgur.com/XbAOmYv.png) #### Shared Data ![](https://i.imgur.com/kHSqvbg.png) ### Allocation Patterns #### Map-Reduce Pattern ##### Contexto Compañias tienen una necesidad de rapidamente analizar volumenes enormes de datos que generan. Ejemplos incluyen logs de interaciones en una red social, documento masivo de repositorios de datos, y pares de <source, target> web links para un motor de busqueda. Programas para el analisis de estos datos debe ser facil de escribir, correr rapido, y adaptarse a fallas de hardware. ##### Problema Para varias aplicaciones con muchos datos, organizar la informacion y despues analizar la informacion agrupada es suficiente. El problema que resuelve el map-reduce pattern es realizar un ordenamiento distribuido y paralelo de los datos y proveer una forma sencilla al programador de especificar que tipo de analisis realizar. ##### Solucion El map-reduce pattern requiere de tres partes: 1. Una infraestuctura especial se encarga de alocar el software a los nodos de hardware en un ambiente masivo paralelo de computacion que maneja el ordenamiento de la informacion necesaria. Puede ser un procesor independiente o un nucleo en un chip multi nucleo. 2. Funcion programada llamada map. Se encarga de filtrar y ordenra la informacion de entrada. 3. Funcion programada llamada reduce. Todo el analisis pesado ocurre aqui. ![](https://i.imgur.com/JjHhOzj.png) #### Multi-tier Pattern ![](https://i.imgur.com/tfTrxnw.png)

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully