Compartir con la comunidad todo aquello que pueda resultar útil para las personas interesadas en software development, software craftsmanship, agile, leadership, etc
Friday, July 14, 2023
Tuesday, February 28, 2023
Eligiendo un camino: ¿Arquitecto de Software o Líder Técnico?
¿Cuál es la diferencia entre un Arquitecto de Software y un Líder Técnico?
La diferencia entre un arquitecto de software y un líder técnico puede variar según la organización, el proyecto y el contexto específico en el que se encuentren. Sin embargo, a grandes rasgos, se pueden identificar algunas diferencias clave:
- Enfoque: Un arquitecto de software se enfoca principalmente en la arquitectura y diseño de soluciones de software. Su objetivo es definir y garantizar la integridad, calidad y viabilidad técnica del sistema. Por otro lado, un líder técnico se enfoca en liderar y gestionar un equipo técnico, así como coordinar su trabajo con otros equipos y áreas de la organización.
- Responsabilidades: El arquitecto de software es responsable de diseñar y mantener la arquitectura de software, tomar decisiones técnicas clave, y garantizar la calidad y la escalabilidad del sistema. El líder técnico es responsable de liderar y motivar al equipo técnico, coordinar sus tareas, establecer metas y objetivos, y asegurarse de que se cumplan los plazos y presupuestos del proyecto.
- Conocimientos técnicos: Ambos roles requieren un conocimiento sólido de la tecnología y las herramientas utilizadas en el proyecto, pero un arquitecto de software se centra más en la comprensión de las necesidades técnicas del sistema, mientras que un líder técnico se enfoca en la gestión y liderazgo del equipo.
- Nivel de experiencia: En general, un arquitecto de software se considera un rol más especializado y senior, con experiencia en la arquitectura y diseño de sistemas complejos y en la toma de decisiones técnicas críticas. El líder técnico, aunque también es un rol senior, puede requerir menos experiencia técnica y enfocarse más en la gestión de equipos y proyectos.
En resumen, mientras que un arquitecto de software se enfoca en la arquitectura y diseño de soluciones de software, un líder técnico se enfoca en liderar y gestionar un equipo técnico, coordinando su trabajo y asegurándose de que se cumplan los objetivos del proyecto. Ambos roles son importantes para el éxito de un proyecto de software y a menudo trabajan juntos para lograr los objetivos técnicos y empresariales.
¿Puedo pasar de Desarrollador de Software a Líder Técnico o necesito pasar antes por el rol de Arquitecto de Software?
Es posible pasar de desarrollador de software a líder técnico sin necesidad de haber desempeñado previamente el rol de arquitecto de software. Sin embargo, hay algunas habilidades y conocimientos que son importantes para ser un buen líder técnico y que pueden ser desarrollados a través de la experiencia previa en el diseño y la arquitectura de software.
Algunas habilidades que son importantes para un líder técnico incluyen la capacidad de comunicarse eficazmente con el equipo de desarrollo y otros stakeholders, la capacidad de liderar y motivar a un equipo, la capacidad de tomar decisiones técnicas y la capacidad de resolver conflictos. También es importante tener una comprensión sólida de los principios y prácticas de la ingeniería de software, incluyendo la metodología de desarrollo de software, los patrones de diseño y las mejores prácticas de codificación.
Si bien la experiencia previa en arquitectura de software puede ser útil para desarrollar estas habilidades, no es un requisito previo para convertirse en líder técnico. En su lugar, puede ser útil buscar oportunidades para liderar pequeños equipos o proyectos dentro de su función de desarrollador de software actual, y buscar capacitación y orientación en habilidades de liderazgo y gestión de proyectos. También puede ser útil buscar mentores en su empresa o en la comunidad de desarrollo de software para obtener asesoramiento y orientación sobre cómo desarrollar sus habilidades de liderazgo técnico.
Material de lectura
Monday, January 23, 2023
Software Engineering Design
Software design is an indispensable phase of the software engineering process for creating and evaluating software models that guide the construction effort for developing high-quality software systems on time and within budget.
Conceptually, design is the process of transforming functional and nonfunctional requirements into models that describe the technical solution before construction begins. To achieve this, the concept of software design, its activities, and tasks must be well understood so that a problem-solving framework for designing quality into software products can be established.
In today’s modern software systems, there are numerous design principles, processes, strategies, and other factors affecting how designers execute the software design phase. When equipped with the proper design foundation knowledge, an understanding of the designer’s roles and responsibilities can be acquired, allowing designers to become effective in designing large-scale software systems under a wide variety of challenging conditions.
Friday, April 29, 2022
Aplicando TDD a la arquitectura
¿Qué es la arquitectura?
La arquitectura implica la toma de decisiones relevantes de diseño.
Ahora la pregunta clave es ¿cómo nos ayuda TDD a tomar estas decisiones relevantes? Básicamente tenemos que plantear pruebas que nos ayuden en la definición de la arquitectura.
El proceso de construcción
- Premisas:
- El resultado es consecuencia del proceso
- El desarrollo es guiado por pruebas
- El proceso es iterativo y los incrementos son pequeños
- Al trabajar de forma iterativa hay desperdicios
- Integración, verificación y entrega continua
- Mantenerlo estúpidamente simple (KISS)
- Técnicas:
- BDD/TDD
- Integración continua / Despliegue continuo
- Walking Skeleton
- Arquitectura Hexagonal
- Arrancamos con una funcionalidad desde la perspectiva del usuario.
- Para esta funcionalidad escribimos pruebas de aceptación (los tradicionales casos de prueba). Esto es una prueba a nivel de requerimiento.
- Para satisfacer estas pruebas de aceptación voy a tener que crear un conjunto de objetos y es aquí donde entramos en el ciclo de TDD. Escribo pequeñas pruebas para cada uno de los objetos que van a intervenir en resolver esa transacción de negocio.
Monday, November 30, 2020
Claves del pensamiento arquitectónico
A diferencia de un desarrollador, un arquitecto debe cultivar un punto de vista arquitectural que le permita tener una visión amplia del sistema que se está construyendo. Según el libro Fundamentals of Software Architecture (by Mark Richards, Neal Ford) existen cuatro aspectos clave para desarrollar el pensamiento arquitectónico:
- Entender cuál es el límite entre la arquitectura y el diseño
- Tener amplitud técnica
- Analizar trade-offs
- Entender los requerimientos de negocio
1. Entender cuál es el límite entre la arquitectura y el diseño
Sin embargo, no existe un límite entre la arquitectura y el diseño, sino que están integrados y sincronizados. Para que la arquitectura funcione, los arquitectos y desarrolladores deben trabajar juntos. El papel principal del arquitecto es de liderar y capacitar a los desarrolladores del equipo.
Haciendo que la arquitectura funcione a través de la colaboración
2. Tener amplitud técnica
3. Analizar trade-offs
4. Entender los requerimientos de negocio
La modularidad en la arquitectura
La modularidad es un principio organizador. Si un arquitecto diseña un sistema sin prestar atención a cómo se conectan piezas, termina creando un sistema que presenta innumerables dificultades, pues los sistemas de software modelan sistemas que tienden al desorden. Por esto último es indispensable que los arquitectos inviertan energía en asegurar una buena solidez estructural (algo que no se puede dar por accidente).
Utilizamos la modularidad para describir una agrupación lógica de código relacionado, que podría ser un grupo de clases en un lenguaje orientado a objetos o funciones en un lenguaje estructurado o funcional. La mayoría de lenguajes proporcionan mecanismos de modularidad (paquete en Java, espacio de nombre en .NET, etc.)
Medición de la modularidad
- Cohesión
- Acoplamiento
- Connascence
De módulos a componentes
Saturday, November 28, 2020
Identificar características arquitectónicas
Para crear una arquitectura o determinar la validez de una arquitectura existente se empieza por identificar las características arquitectónicas ("-ilities"). Para lograr esto el arquitecto debe:
- Comprender el dominio del problema.
- Trabajar con los stakeholders para establecer lo que es verdaderamente importante desde la perspectiva del negocio.
- Requerimientos de negocio
- Requerimientos funcionales y restricciones
- Del conocimiento implícito del dominio
Extraer las características arquitectónicas desde los requerimientos de negocio
Recuerda que normalmente un objetivo de negocio implica satisfacer la combinación varias características arquitectónicas y hay que tener cuidado de no caer en la trampa de concentrarnos en uno sólo de ellos.
Particionamiento de la arquitectura
Una de las principales decisiones que un arquitecto debe tomar se refiere a la división de alto nivel de la arquitectura. Para esto, los arquitectos suelen pensar en términos de componentes, la manifestación física de un módulo. Los componentes representan la unidades de construcción básica en la arquitectura, lo que los convierte en una consideración crítica para los arquitectos.
Los componentes se pueden manifestar de diferentes formas:
- Library
- Layer
- Event Processor
- Distributed service
Tipos de particionamiento
- Particionamiento técnico
- Particionamiento por dominio
- Monolithic: Layered architecture, Pipeline architecture, Microkernel architecture
- Distributed: Service-based architecture, Event-driven architecture, Space-based architecture, Service-oriented architecture, Microservices architecture
Particionamiento técnico
Particionamiento por dominio
Flujo de identificación de componentes
- Identifying Initial Components: Basándose en un tipo de particionamiento de alto nivel, determinar con qué componentes comenzar. Es difícil empezar con algo concreto cuando un arquitecto diseña un sistema desde cero. Para lograr un buen diseño no queda otra opción que iterar.
- Assign Requirements to Components: Mapear los requisitos funcionales con los componentes. Esto puede implicar la creación de nuevos componentes, la consolidación de los existentes o la separación de los mismos porque tienen demasiada responsabilidad.
- Analyze Roles and Responsibilities: Pensar tanto en los roles y responsabilidades que la aplicación debe soportar para descubrir la granularidad correcta de los componentes.
- Analyze Architecture Characteristics: Mientras se asignan los requisitos funcionales a los componentes también se debe observar las características arquitectónicas descubiertas anteriormente. La idea es pensar en cómo las características arquitectónicas podrían afectar a la división y granularidad de los componentes. Por ejemplo, mientras que una parte del sistema pueden ocuparse de la entrada del usuario, la parte que trata con ciento de usuarios concurrentes necesitará diferentes caraterísticas arquitectónicas a diferencia de la otra parte.
- Restructure Components: Los arquitectos deben iterar continuamente en su diseño de componentes con ayuda de los desarrolladores. A medida que los desarrolladores profundizan en la construcción de la aplicación, se adquiere una comprensión más matizada de dónde deben estar el comportamiento y los roles.
- Fundamentals of Software Architecture - Neal Ford, Mark Richards
- Arquitectura de software. Conceptos y ciclo de desarrollo - Humberto Cervantes Maceda






