Crea una cuenta o inicia sesión

¡Continúa aprendiendo sin ningún costo! Únete y comienza a potenciar tu carrera

Dificultades en el desarrollo de software

3/24
Recursos

En la etapa de diseño y desarrollo estamos concentrados en encontrar cuáles son los problemas que queremos resolver. Estos problemas los podemos dividir en dos grandes tipos de problemas.

Esenciales: Los podemos dividir en 4.

  1. La complejidad, cuándo lo que tenemos que resolver es complejo en si mismo, por ejemplo calcular la mejor ruta entre ciudades.
  2. La conformidad.
  3. Tolerancia al cambio.
  4. Invisibilidad.

**Accidentales:**Está relacionado con la plataforma que vamos a implementar, tecnología, lenguajes, frameworks, integraciones, etc.

Aportes 131

Preguntas 11

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Problemas en el desarrollo tenemos dos:
•** Esenciales** que tienen que ver con el problema que vamos a solucionar diseño y comprobación del concepto. Los dividimis en 4 partes:
      • Complejidad
      • conformidad
      • tolerancia al cambio
      • invisibilidad
•** Accidentales**: detalles de implementacion y produccion, lengiajes, integraciones, servers, frameworks etc. Los dividimos en tres partes:
      • Lenguaje de alto nivel
      • Multi-procesamiento
      • entornos de programacion

Los problemas accidentales nos traen ganancias cuando los resolvemos, incluso algunos son solucionables con al alguna libreria, api, etc. Lo verdaderamente importante es resolver los problemas esenciales.

Como solucionar dificultades esenciales:
Lo complejo de un desarrollo es lo esencial y no lo accidental. No hay ninguna bala de plata que solucione el problema esencial del desarrollo de software. Para ello nos dan 4 formas de resolver las dificultades esenciales:

No desarrollar: siempre que podamos primero ver si el problema se puede solucionar con un software ya existente, con algo de open source, servicios, integraciones y soluciones pequeñas que solucionen parte del probela etc.
Proptotypado rapido: son la evolución de las metodologías agiles, la idea es obtener e fedback lo mas rapido posible de si estamos resolviendo el problema correcto. Para eso hay que ir evolucionando en pasos muy pequeños y siempre obteniendo feedback. EL FEEBACK ES LA HERRAMIENTA DE DESARROLLO MAS IMPORTANTE DENTRO DEL DESARROLLO DE SOFTWARE MODERNO.
Desarrollo evolutivo: esta relacionado al tipiado rapido, consta de ir desarrollando en pasos pequeños e ir evolucionando en ese sentido.
Grandes diseñadores: personas que tengan la capacidad de diseñar una solucion simple y que resuleva el problema de la mejor forma y con la mejor calidad.

Excelente lo que decía Brooks… " Necesitamos grandes diseñadores, los grandes diseñadores, no son programadores que simplemente saben utilizar una tecnología sino que son ingenieros que saben abstraerse de ese problema puntual y entender un problema mas general que sepan diseñar una solución que es elegante y que sea simple también, que sepan diseñar un sistema que resuelva de la mejor forma el problema y que a la vez tenga los mejores atributos de calidad"…

Dificultades en el desarrollo del Software

Se dividen en 2 tipos de problemas:

  • Esenciales: Especificación, diseño y comprobación del concepto
  • Accidentales: Detalles de la implementación y producción actual

Esenciales

  1. Complejidad: Cuando el problema a resolver es complejo en sí mismo.
  2. Conformidad: Entender en que contexto se usará el producto y como se adecuada al contexto imperfecto (Ejemplo: ¿Requiere internet, que disponibilidad existe de Internet?, ¿Requiere actualizaciones mayores?)
  3. Tolerancia al cambio: La medición de cuanto podemos adaptarnos a los cambios.
  4. Invisibilidad: Dificultad de entender su forma, ya que es intangible, solo existen en código o documentación

Accidentales

  1. Lenguajes de alto nivel: Dificultad de dominar el stack tecnológico.
  2. Entornos de desarrollo: Las dificultades expuestas por software de desarrollos, editores de textos, IDE’s, herramientas de terceros.

En relación al Prototipado Rápido, se menciona el desarrollo con metodología Agile. Ésta es la nueva forma de desarrollo que dejó atrás a la metodología tradicional en cascada, o lineal, mencionada en el video anterior.
En la metodología Agile, se van desarrollando partes del sistema (o solución al problema) en pequeños ciclos completos o iteraciones (en inglés, Sprints), en general de 1 a 3 semanas cada uno, teniendo en cuenta las historias de usuario donde se encuentran los criterios de aceptación para cada componente del sistema. Al finalizar cada Sprint, el equipo de desarrollo recibe feedback por parte del cliente para ver si se debe volver a realizar cambios o se avanza con la siguiente Sprint, y esto se repite hasta completar los requerimientos totales del proyecto. Es importante la comunicación constante entre todas las partes involucradas, tanto para los desarrolladores para detectar errores o cambios a tiempo, como para la satisfacción del cliente.

¿Cómo resolver las dificultades esenciales?
4 formas de resolver las dificultades según la persona que comenta Guido.

No desarrollar sino comprar
Puede que ya alguien haya inventado una solución. ¿por qué inventar la rueda?

Prototipado rápido
Se evoluciona el sistema de pasos muy pequeños y siempre se busca obtener el feedback. ¿es lo qué necesitabas?, ¿quieres que evolucione a partir de esa funcionalidad o hago otra nueva?

Desarrollo evolutivo
Está alineado con el prototipado rápido, pero tiene más que ver con la creacion y acumulación de sistema. obtener resultados chiquitos pero esos mismos ir evolucionando.

Grandes diseñadores
Tienen capacidad para abstraerse del problema y crear una solucion simple, elegante, que resulva de la mejor forma y a la vez tenga los mejores atributos de calidad .

Por acá hay una traducción a español del artículo: (https://gist.github.com/esparta/582e43af7b803e0aaf69)

Aca les dejo el link del documento al que hace referencia:
http://worrydream.com/refs/Brooks-NoSilverBullet.pdf

Guido es un crack, dió una explicación magistral durante practicamente 10 minutos sin edición.

Problemas Esenciales
Tratan sobre entender el concepto y el diseño de lo que vamos solucionar.
Se dividen en 4:
Complejidad,
cuándo lo que tenemos que resolver es complejo en si mismo, por
ejemplo calcular la mejor ruta entre ciudades
conformidad,
¿en qué contesto se va a usar?, ¿se adecua a cada situación?, Ejemplo. ¿siempre tendra coenxión a internat? ¿qué pasa si no?
tolerancia al cambio
Imagnínate que hiciste un programa para facturar, ¿qué pasa si en el futuro cambían las leyes de ese pais? ¿se podrá ajustar el software?
invisibilidad.
Es difícil entender en todo momento su forma. Ya que su "forma"
está plasmada en código, infraestructura, diferentes momentos de
desiciones que quedaron palsmados en algun momento. Nada de
esto se ve.

Problemas Accidentales
Tienen que ver con la plataforma que lo vamos a instrumentar, los frameworks, cuestiones del lenguaje de programación, etc.

Un gran diseñador fue Steve Jobs, en el libro The Secrets of Steve Jobs de Carmine Gallo, él habla sobre cómo Jobs tomaba algo ya existente, lo refinaba quitando cosas innecesarias y haciendo un diseño limpio y elegante.

¿Como resolver las dificultades esenciales?

  1. Complejidad -> No desarrollar, comprar
  2. Conformidad -> Prototipado rápido.
  3. Tolerancia al cambio -> Desarrollo Evolutivo
  4. Invisibilidad -> Grandes Diseñadores / Arquitectos

Resumen:

En la etapa de diseño y desarrollo estamos concentrados en encontrar cuáles son los problemas que queremos resolver. Estos problemas los podemos dividir en dos grandes tipos de problemas.

Esenciales: Los podemos dividir en 4.

La complejidad, cuándo lo que tenemos que resolver es complejo en si mismo, por ejemplo calcular la mejor ruta entre ciudades.
La conformidad: Este soft ¿en qué contexto se va a utilizar? Como debe adecuarse (vamos a tener disponibilidad de internet?)
Tolerancia al cambio: Una vez terminado va a poder cambiarse? (en un soft que calcula impuesto, debido al cambio de las leyes en el tiempo=
Invisibilidad: La dificultad de comprender su forma, ya que es intangible

Accidentales: Está relacionado con la plataforma que vamos a implementar, tecnología, lenguajes, frameworks, integraciones, etc.
El lenguaje (lenguaje de alto nivel para poder trabajar mejor)
Multi-Procesamiento: Viene a resolver el feedback, nos enteramos mucho más rápido
Entornos de programación: Lenguajes, librerias, capacidad de ejecutar codigo compilado

“Considero a la especificación, diseño y comprobacion del concepto la parte dificil de hacer software.
(…) Si esto es cierto, hacer software siempre serà difícil. No existe la bala de plata” (brooks Jr. 1986)

Se comprende que lo que realmente importante es la parte Esencial y no la accidental.
Lo accidental va ir evolucionando por el contexto.

Ahora, ¿Como resuelvo los problemas esenciales?
No desarrollar: Utilizar un sistema ya existente, aprovechar el open source.
Prototipado rápido: Es obtener feedback lo antes posible, ir avanzando en pasos pequeños. Y valerme del usuario.
Desarrollo evolutivo: Plantea que vayas teniendo con resultados mas que pequeño e ir evolucionando esto
Grandes diseñadores: Saben abstraerse del problema puntual y entender un problema más general. Obteniendo una resolucion elegante.

Pregunta de examen: ¿Por qué no existe la bala de plata que resuelva las dificultades del desarrollo de software?

*DIFICULTADES EN EL DESARROLLO DE SOFTWARE

En la etapa de diseño y desarrollo estamos concentrados en encontrar cuáles son los problemas que queremos resolver. Estos problemas los podemos dividir en dos grandes tipos de problemas.

Esenciales: especificación, diseño y comprobación del concepto.

Accidentales: Detalles de la implementació y producción actual.

ESENCIALES:

  • complejidad (análisis detallado,tiempo de calculo)

conformidad (contexto a utlizar)

Tolerancia al cambio (cuanto cambia el problema a través del tiempo) adaptabilidad

Invisibilidad (entender su forma, plasmada en código, infraestructura)

ACCIDENTALES:
problemas con tecnologías, Software, hardware, etc.

  • lenguaje de programación

Multi-procesamiento

Entornos de programación

“Considero a la especificación, diseño y combrobación del concepto la parte difícil de hacer software. (…) Si esto es cierto, hacer software siempre será dificil. No existe la bala de plata”

**¿Como resolver las dificultades esenciales?
**

No desarrollar, aprovechar el Open Source

Prototipado rápido (metodologías ágiles)

Desarrollo evolutivo ( iterativamente, cada vez ir cambiando el sistema, evolucionandolo)

Grandes Diseñadores (Arquitectos)


En la etapa de diseño y desarrollo estamos concentrados en encontrar cuáles son los problemas que queremos resolver. Estos problemas los podemos dividir en dos grandes tipos de problemas.
Esenciales: Los podemos dividir en 4. los problemas esenciales en entender el concepto de lo que vamos hacer, entender el diseño y las especificaciones.
La complejidad, cuándo lo que tenemos que resolver es complejo en si mismo, por ejemplo calcular la mejor ruta entre ciudades.
La conformidad. al contexto imperfecto en el que el software
Tolerancia al cambio. por la constante incertidumbre del problema y de su especificación.
Invisibilidad. intrínseca del software como artefacto y la dificultad de representar visualmente para ayudar en su comprehension.

Accidentales: Está relacionado con la plataforma que vamos a implementar, tecnología, lenguajes, frameworks, integraciones, etc.
Los lenguajes de alto nivel resuelven el problema de la diferencia entre la especificación de una solución y su ejecución en una computadora.
El Multiprocesamiento resuelve un problema de recursos computacionales y velocidad de feedback.
Los entornos de programación resuelven la necesidad de conocer y retener detalles de implementación del contexto del desarrollo.

Esenciales : Se dividen en 4 tipos de problemas

  • Complejidad: cuando un dominio de un problema es complejo en sí mismo. En el caso de adiciones y todas las acciones que conlleven al sistema a ser más complejo.

Por ejemplo:
Calcular la ruta más corta entre dos ciudades, esto es un problema muy complejo debido a la cantidad de cálculos que conlleva.

  • Conformidad: en qué contexto se usa el software y cómo debe adecuarse al mismo.

Por ejemplo:
¿Vamos a tener conexión de Internet en todo momento? ¿Que calidad de conexión vamos a tener?, debemos modelar con respecto a las limitaciones que tengamos.

  • Tolerancia al Cambio:Posibilidad del cambio en el mismo y que sea responsivo a diferentes contextos.

Por ejemplo:
Las leyes de facturación y de impuestos se aplican de tal manera que no nos permiten realizar cálculos sencillos, como puede ser que entre una fecha determinado tengamos que aplicar leyes X y otras Y.

  • Invisibilidad: Problemas de tangibilidad nula.

Accidentales : Está relacionado con la plataforma que vamos a implementar, tecnología, lenguajes, frameworks, integraciones, entre otros, que tienen 3 Entornos:

  • Lenguajes de alto nivel.

  • Multi-procesamiento.

  • Entornos de programación.

“Concidero a la especificación, diseño y comprobación del concepto es la parte difícil de hacer software. (…) Si esto es cierto, hacer software siempre será difícil. No existe la bala de plata.” - Del libro No Silver Bullet (Frederick P. Brooks Jr., 1986)

Creo entonces que lo mas difícil siempre será encontrar soluciones que hagan su trabajo de forma rápida, económica y precisa.

Tipos de problemas:
Complejidad: el requerimiento de calculo de muchas variables y mucho tiempo para analizar su solución.
Conformidad: Definir las condiciones en las que se ejecutará el software.
Tolerancia al cambio: Cuanto cambia el problema al cual le diseñamos la solución.
Invisibilidad: Entender como funciona el software.

Dificultades esenciales: Concepto y metodología del software.
y dificultades accidentales: Problemas relacionados con IDE, lenguaje o dificultades tecnicas.

Soluciones a las dificultares esenciales:
Comprar OSS
Prototipado Rapido
Desarrollo evolutivo
Grandes diseñadores - arquitectos de software

Me encanto esta clase, lo que se indica es super importante entenderlo, en especial lo relacionado con las metodologias agiles. Buen abreboca, me dieron grandes expectativas de lo que se viene.!

Apuntes:
Dificultades en el desarrollo de software

Se puede dividir en dos tipos de problemas: ++Esenciales ++– Accidentales

Dificultades Esenciales
Especificación, diseño y comprobación del concepto.

Complejidad
Cuando un dominio del problema es complejo en sí mismo.
Conformidad
¿En qué contexto se va a utilizar el software? ¿Cómo tiene que adecuarse a ese contexto?
Tolerancia al cambio
Una vez terminado, podrá cambiarse o será difícil de cambiar. No tiene que ver tanto con la tecnología o implementación sino con cuánto cambia el problema que estamos resolviendo y cuánto podemos adaptarnos a esos cambios.
Invisibilidad
Trabajar con software es difícil al no ser tangible, lo que dificulta entender su forma.

Dificultades Accidentales
Detalles de la implementación y producción actual. Suelen ser lo que más a menudo nos encontramos.

Lenguajes de alto nivel
El crecimiento del lenguaje de alto nivel resuelve la dificultad de que la máquina entiende 0s y 1s.
Multiprocesamiento
Resuelve el problema del feedback.
Entornos de programación
Facilitan el desarrollo del software.

Si lo complejo del desarrollo del software es lo conceptual, lo esencial y no lo accidental, entonces esas ganancias de órdenes de magnitud en las que se hizo mucho más simple o mucho más productivo el desarrollo de software, no existen más.

¿Cómo resolvemos las dificultades esenciales?

No Desarrollar: Comprar – OSS
Si tenemos un problema que es esencialmente difícil quizás la solución es utilizar algún sistema ya existente y no tener que desarrollar uno a mano. Aprovechar Open Source. Utilizar programas ya disponibles y conectarlos con soluciones más pequeñas.
Prototipado rápido
La evolución de este pensamiento son las metodologías ágiles y por ende el prototipado rápido. La idea es obtener feedback lo antes posible de si estamos resolviendo el problema correcto. Vamos evolucionando nuestro sistema siempre obteniendo feedback del cliente final.
Desarrollo evolutivo
Alineado a la creación y acumulación de sistema. Ir cambiando el sistema. Tratar de obtener resultados más chiquitos y después ir evolucionando eso, muy alineado con metodologías ágiles.
Grandes diseñadores
No son programadores que simplemente sabe utilizar una tecnología, sino que son ingenieros que saben abstraerse de ese problema puntual y entender un problema más general, que sepan diseñar una solución que sea elegante y que a la vez sea simple.

Les comparto mi resumen de la parte en que se me hizo un poco complicado entender
en la frase de que no existe la bala de plata se refiere a que debemos
tener en cuanta que es lo que resuelve cada librería ya que no todas resolverán el problema esencial que se pide implementar en un sistema. Para ello nos dan 4 formas de resolver las dificultades esenciales:

  • **No desarrollar: ** Optar por comprar o utilizar un sistema ya existente o también apoyarnos con código ya existente (código open source) para desarrollar pequeñas partes.
  • Prototipado rapido la idea es obtener feetback con prototipos con el fin de tener todo bien en claro para la el desarrollo del sistema.
    -Desarrollo evolutivo la idea es tener un producto funcional y a partir de ello ir evolucionando.
    -Grandes Diseñadores ingenieros que saben abstraerse del problema y ver un problema mas general, que resuelvan de manera elegante lo que necesita el sistema de forma puntual sin perder calidad.

RESUMEN:
Dificultades en el desarrollo de software:

Las nuevas tecnologías resuelven problams accidentales o esenciales?

Hay que analizar el contexto del problema para diseñar la solución del momento.
Las dificultades esenciales son aquellas inherentes al nivel de abtracción de máquina, a la manipulación que tenemos de esas abstracciones, al grado de complejidad y libertad de las variables, a la conformidad y tolerancia al cambio del diseño.

Las dificultades esenciales se pueden solucionar:
No desarrollando, buscando solucioens previas e integrando subsistemas es mucho más eficiente.
Prototipado rápido, metodologías ágiles de trabajo. Feedback constante del usuario es crucial para metodologías modernas.

Desarrollo evolutivo, plantea que consigas resultados pequeños y de allí crezcas. Grandes diseñadores, son ingenieros que se abtraen dle problema puntual y entienden un marco más amplio para una solución simple y elegante. La mejor calidad con el más alto grado de refinamiento.

![](https://static.platzi.com/media/user_upload/image-13078b1f-6f6b-4dea-ac83-f4a9fc439cea.jpg)

Acá está el paper “No Silver Bullet” de Frederick Brooks
https://www.cs.unc.edu/techreports/86-020.pdf

no habrá una solución para los errores cometidos en lo escencial

Complejidad

  • De la complejidad de la función procede la dificultad de llamar a la función, lo que hace difícil de usar al programa.
  • De la complejidad de la estructura procede la dificultad en extender el programa para realizar nuevas funciones sin crear efectos laterales.
  • De la complejidad de la estructura proceden los estados no previstos que se convierten en agujeros en la seguridad.

Conceptos extraídos de:

Me llevo con grandes aprendizajes de esta clase sin embargo el punto mas importante es ser un gran diseñador , esto me lleva a lograr tener una mejor abstracción del problema para poder irlo creando parte a parte que al final tenga el producto desarrollado.

Pienso que el análisis de los problemas a través del método causa-raíz es una buena manera de encontrar lo que se debe resolver. Igualmente la regla 80/20 de Wilfredo Pareto.

El feedback es la herramienta más importante del desarrollo de software moderno.





DIFICULTADES
Se dividen en dos tipos de problemas
ESENCIALES

  • Complejidad: Dependiendo de la dificultad del problema
  • Conformidad: los contextos en los que se usa nuestro software
  • Tolerancia al cambio: Los cambios del problema que podemos ir resolviendo
  • Invisibilidad: La forma y infraestructura en la que está creado el software

¿Cómo resolver las dificultades?

  • Mirar la opción de no tener que desarrollar desde 0 el problema
  • Prototipado rápido: evaluar si se está resolviendo el problema lo más rápido posible (se necesita feedback)
  • Desarrollo Evolutivo: hacer un sistema que se puede adaptar según diferentes requerimientos
  • Grandes desarrolladores: crear un sistema que resuelva el problema de la mejor manera posible según lo requiera el problema

ACCIDENTALES

  • lenguaje: La dificultad del lenguaje que usemos
  • Multi-procesamiento: Problema de cantidad de procesos que puede llevar la máquina que actualmente se está resolviendo
  • Entorno programación: APIS y librerías

¿Quién es Frederick P Brooks Jr?

Dejo mis apuntes de esta clase por si a alguien le sirve.
En formato PDF
Y a continuación en imágenes:

Todavía se utiliza la metodología en cascada para algun proyecto en 2019 / 2020 ?

El problema accidental que más veo es cuando un software se ha construido usando cierto lenguaje de programación o base de datos y para optimizarse se tiene que migrar a sistemas más eficientes.

Prototipado rápido

El concepto de arquitectura de software se refiere a la estructuración del sistema que, idealmente, se crea en etapas tempranas del desarrollo.

el punto decisivo es la agilidad

Problemas Esenciales CCTI

  • Complejidad
  • Conformidad
  • Tolerancia al cambio
  • Invisibilidad

Para resolverlos se debe usar

  • No desarrollar
  • Prototipado rápido
  • Desarrollo evolutivo
  • Abstraerse del problema, ver el problema mas general

Problemas Accidentales PT

  • Plataforma
  • Tecnología
    Lo accidental se va ir solucionando por el contexto

Hace mucho que pase esta clase en la universidad y no me acuerdo de nada de esto

Problemas esenciales: necesarios para que el software sí solucione el problema que se quería
Problemas accidentales: el cómo solucionamos los problemas esenciales

Tipos de complejidad según Brooks, los términos "Esencial" y "Accidental" son basados en la clasificación aristotélica. ![](https://static.platzi.com/media/user_upload/1-e0c81294-6578-4138-ba50-58b42067130a.jpg) ![](https://static.platzi.com/media/user_upload/2-de4cc5e2-ff81-4978-b1a6-4f5b7a20f47b.jpg)
![](https://static.platzi.com/media/user_upload/image-b1db1c06-2be2-4534-9f5d-cc0b395fd611.jpg)
![](https://static.platzi.com/media/user_upload/image-e0a3c1e2-d3e3-4e2e-8b9f-3aadd1585c49.jpg)
Aquí les dejo un resumen del libro "The Mythical Man-Month" de Frederick P. Brooks Jr. <https://www.youtube.com/watch?v=cLkapi5ER8Q&list=PLPZnjk02_obnjGQA5pb9XIM-t4-mI80ID>
El autor es Frederick Phillips Brooks, escribió "The Mythical Man-Month: Essays on Software Engineering" (El Hombre-Mes Mítico: Ensayos sobre Ingeniería de Software). Este libro, publicado en 1975, es considerado un clásico en el campo de la ingeniería de software y ha tenido una gran influencia en la industria. Brooks argumenta que los problemas esenciales del software son aquellos inherentes a la naturaleza del software, mientras que los problemas accidentales son aquellos que surgen debido a las circunstancias específicas del desarrollo, como la falta de recursos, cambios en los requisitos, etc. Esta distinción es fundamental para comprender los desafíos únicos que enfrenta la ingeniería de software y cómo abordarlos de manera efectiva. Info tomada de google com
A partir de la reflexión de los problemas esenciales y accidentales, noto que con los avances de la AI cada vez estos problemas esenciales seran mas y mas pequeños, ya que en algunos sistemas va a hacer casí innecesario crear un diseño para el sistema, y el proceso de desarrollo se ve acelerado cada vez mas con sugerencias de código muy acertadas, estamos muy lejos de solucionar en su totalidad los problemas esenciales del desarrollo de software, pero muy cerca de volverlos muy pequeños.
El desarrollo de software puede presentar diversas dificultades que pueden afectar el éxito del proyecto. Algunas de las dificultades comunes son: 1. **Complejidad del sistema**: Los sistemas de software pueden ser extremadamente complejos, especialmente cuando se trata de aplicaciones empresariales o sistemas de gran escala. La gestión de la complejidad del sistema, incluyendo la interacción entre diferentes componentes y la coordinación de múltiples equipos de desarrollo, puede resultar desafiante. 2. **Cambios en los requisitos**: A medida que avanza el desarrollo de software, es común que los requisitos del sistema cambien. Estos cambios pueden ser causados por las necesidades del usuario, las demandas del mercado o las limitaciones técnicas. La capacidad de adaptarse y gestionar eficientemente los cambios en los requisitos puede ser un desafío para los equipos de desarrollo. 3. **Gestión del tiempo y los recursos**: El desarrollo de software requiere una planificación adecuada del tiempo y los recursos disponibles. La estimación precisa del esfuerzo requerido, la asignación adecuada de los recursos y la gestión eficiente del tiempo son aspectos críticos para el éxito del proyecto. Sin embargo, la gestión inadecuada de estos aspectos puede llevar a retrasos, sobrecostos y problemas de calidad. 4. **Comunicación y colaboración**: La comunicación efectiva y la colaboración entre los miembros del equipo de desarrollo son fundamentales para el éxito del proyecto. Sin embargo, la falta de comunicación clara, la falta de alineación en los objetivos y las dificultades en la colaboración pueden conducir a malentendidos, conflictos y a una disminución de la productividad. 5. **Calidad del software**: La garantía de la calidad del software es un desafío constante en el desarrollo de software. La detección y corrección de errores, la realización de pruebas exhaustivas y la adopción de buenas prácticas de desarrollo son aspectos esenciales para garantizar la calidad del software. Sin embargo, la falta de recursos, la presión por cumplir plazos o la falta de experiencia pueden dificultar la entrega de software de alta calidad. 6. **Tecnologías emergentes**: El desarrollo de software está en constante evolución, y la adopción de nuevas tecnologías puede presentar desafíos. La curva de aprendizaje de nuevas tecnologías, la compatibilidad con sistemas existentes y la elección correcta de las tecnologías más adecuadas para el proyecto pueden ser difíciles de manejar. Afrontar estas dificultades requiere una combinación de habilidades técnicas, gestión eficiente y un enfoque colaborativo. Los equipos de desarrollo de software deben estar preparados para enfrentar y superar estos desafíos a medida que avanzan en el desarrollo de proyectos exitosos.
No reinventar la rueda

no desarrollar, hacerlo simple

buena explicación

<h6>Problemas Esenciales y Accidentales</h6> <h6>ESENCIALES</h6>

Trata principalmente de entender el concepto o diseño de lo que vamos a hacer.

Se dividen en 4:

  • Complejidad
    Cuando el problema es complejo en si mismo, requiere cálculos y buena toma de decisiones.

  • Conformidad
    En que contexto se usara el software y como deberá adecuarse al mismo.

  • Invisibilidad
    Hacer Software es difícil porque no es tangible y esto causa que no podamos percibir o entender su forma.

  • Tolerancia al cambio
    Que tan difícil podría ser la implementación de cambios a futuro. Teniendo en cuenta que si el problema cambia, que tanto pueda adaptarse el software.

<h6>ACCIDENTALES</h6>

Este es el mas común ya que trata de seleccionar el conjunto de herramientas a usar para la solucion y hacer uso de ellas con las menos trabas posibles.

<h6>¿Como resolvemos las dificultades esenciales?</h6>
  • No desarrollar: Utilizar soluciones ya existentes.

  • Prototipado rapido: Obtener Feedback.

  • Desarrollo Evolutivo: Ir resolviendo el problema por partes, pquenos resultados de manera acumulativa.

  • Grandes diseñadores: Diseñar o modelar de manera mas general o abstracta y que sea simple de entender para obtener las mejores soluciones al problema.

por esta clase especificamente me atrevería a afirmar que la inteligencia artificial nunca va a reemplazarnos del todo.

“Si la máquina entendiera español o inglés no necesitariíamos lenguajes de alto nivel”

-2023: GPT4 & Copilot

les dejo un resumen:

Los problemas esenciales en el desarrollo de software son aquellos que son críticos para el éxito del proyecto y son necesarios para lograr un software de alta calidad, como el diseño, la implementación, la verificación y validación, y el mantenimiento.

Por otro lado, los problemas accidentales en el desarrollo de software son aquellos que surgen debido a errores o incertidumbres en el proceso de desarrollo, como errores de codificación, problemas de rendimiento, problemas de escalabilidad, problemas de seguridad, problemas de compatibilidad, problemas de documentación y problemas de calidad. Es importante tener en cuenta ambos tipos de problemas para lograr un software de calidad.

💡 Los detalles accidentales van y vienen, los problemas esenciales se aferran al problema que se trata de resolver en cuestión, si no se abarcan en el diseño, se quedaran en la solución propuesta por el arquitecto de software, como un parasito. ( Veasé la deuda técnica )

Que gran clase!

Debemos saber cuando es un problema accidental o esenciales, porque a veces las librerías solucionan un problema por un tiempo determinado, entonces hay que saber identificar.

Problemas esenciales

Complejidad : Complejidad a nivel técnico sobre la regla de negocio.
Conformidad : Contexto del software y adecuación, tener en cuenta limitantes en sitio y usuarios
Tolerancia al cambio : Cuando puede cambiar el problema al que se intenta apuntar con el Software, por ejemplo leyes fiscales.
Invisibilidad : Intangible, por eso importante documentar.

Problemas accidentales

Lenguajes de alto nivel : Lenguajes mas cercanos al lenguaje humano.

Multiprocesamiento : Desarrollar con mas feedback. Estado específico de la tecnología.

Entornos de programación : Si un entorno nos facilita el desarrollo tendremos ventajas sobre ingenieros del pasado.

No silver bullet trata sobre el verdadero desarrollo de Software, lo esencial de este se guarda todavía en su diseño, en la comprobación del concepto mas no en una solución técnica y temporal que puede solventar mediante una librería u otra.

¡¡Extraordinaria explicación!!

Al final el software es como la vida, tener dinero, herramientas, contactos te puede solucionar todas las dificultades accidentales. Pero de nada sirve si vos internamente no sos capaz de resolver tus dificultades escenciales, y además se le suma el tener que descubrir cual es o son tus propias dificultades escenciales a resolver.

¿Cómo resolver las dificultades?

No desarrollar: Comprar - OSS: Es el primer camino. Apoyarse en una herramienta ya existente para abordar el problema. Una herramienta privativa, open source, etc.

Prototipado evolutivo: Es el desarrollo de soluciones basados en metodologías ágiles. Se busca obtener un producto rápido para determinar rápidamente si se está abordando correctamente la necesidad o si no. El feedback es la herramienta más importante del desarrollo de software moderno.

++Desarrollo evolutivo: ++Tiene que ver con el anterior pero está más alineado a lo que es la creación y acumulación de sistema, es decir, desarrollar iterativamente pero no hacer una evolución sino ir cambiando el sistema. Se basa en obtener pequeños resultados y cada vez hacer que la solución evolucione

Grandes diseñadores: No son programadores que saben usar tecnología, sino que son ingenieros que saben abstraer el problema puntual y entender un problema más general. Son capaces de diseñar soluciones elegantes y que sean simples, que resuelvan el problema de la mejor forma y que a la vez tenga los mejores atributos de calidad en las partes en que el problema lo requiera.

el problema esencial como el accidental son desafios que se presentan en el desarrollo, aunque los problemas esenciales son mas de la capacidad inteleptual del equipo de analizar y proponer soluciones. en cambio, el accidental tiene que ver con el conocimiento de la herramientas existentes y sus actualizaciones para usarlas a conveniencia.

Abstracción!

Un gran diseñador será el que sepa como abstraer un gran problema y encontrar la mejor solución que sea elegante y simple con mucha calidad

Hacer software es de las cosas mas dificiles que existen, pero a su ves, es el arte más divertido y poderoso

Construir software tiene muchas implicaciones, es riguroso crear software de calidad.

Excelente clase! 😃

Para tener en cuenta respecto a la Tolerancia al cambio:

Todo el software que triunfa cambia, debido a dos procesos:

  • Primero, cuando un programa resulta útil, la gente intenta usarlos para nuevas aplicaciones en el límite o más allá del dominio original para el que se diseño. La presión para extender las funcionalidades proceden de usuarios a los que les encantan las funciones básicas e inventan nuevos usos para ellas.

  • Segundo, el software exitoso sobrevive más allá de la vida del hardware para el que fue diseñado. Si no son nuevos computadores, son nuevos discos, pantallas, impresoras…; y el software debe adaptarse para estas nuevas oportunidades.

Una nota interesante de No Silver Bullet respecto a la Tolerancia al cambio o Variabilidad es: “El software vive dentro de un entorno cultural de aplicaciones, usuarios, leyes y hardware. Todo este entorno cambia continuamente, y esos cambios inexorablemente fuerzan a que se produzcan cambios en el software”.

Ahora con la salida de GitHub copilot y el avance de la IA considero que cada vez se resolverá más rápido el problema de la complejidad.

Dificultades en desarrollo de software

Podemos dividir estos en dos tipos de problemas

Esenciales

Especificación, diseño y comprobación del concepto

  1. Complejidad: Es cuando el problema a resolver es complejo por si mismo.

  2. Conformidad: El contexto del uso del software, y la adecuación al mismo.

  3. Tolerancia al cambio: Una vez terminado el software, ¿Qué tan fácil se podrá modificarse?.

  4. Invisibilidad: El software no tiene forma física, si no que esta representado en código, infraestructura, etc.

Accidentales

Detalles de la implementación y producción actual, como: software, tecnología, framework, etc.

  1. Lenguaje de alto nivel: Las maquinas entiende solo lenguaje binario, los lenguajes de programación se abstraen de esto, construyendo lenguajes de “alto nivel” el cual es mas cercano al lenguaje humano, para una mayor facilidad de interacción y creación de este.

  2. Multiprocesamiento: Actualmente con la tecnología actual, nos permite tener varios proceso al unísono, esto no da la opción de tener mucho mejor feedback y sistemas muchos mas óptimos.

  3. Entornos de programación: Es el editor de código, que muchas veces traen herramientas que nos facilitan el trabajo a la hora de programar, ejemplo: visual studio code, atom, etc.


¿Cómo resolver las dificultades esenciales?

  1. No desarrollar: Si la solución a tu problema ya existe, consíguela! No es necesario reinventar la rueda si esta ya existe, toma esa solución mas pequeña y intégrala a tu solución grande.

  2. Prototipado rápido: Metodologías ágiles, obtener feedback lo antes posible de que si estamos resolviendo el problema correcto.

  3. Desarrollo evolutivo: Metodologías ágiles, obtener resultados pequeños e ir evolucionándolas.

  4. Grandes diseñadores: Son desarrolladores que sean capaces de abstraerse del problema puntual y entender un problema mas general, generando soluciones simples pero con calidad.

Si esto es cierto, hacer software siempre será difícil.

Muy buena clase.

En este curso se puede aprender a comprender documentación para la creación de software?

Las dificultades en el desarrollo de software se dividen en dos tipos:
• Esenciales: Se centran en las especificaciones, diseños y comprobación del concepto.
o Complejidad: Cuando el problema a resolver es muy complejo.
o Conformidad: En qué contexto se va a utilizar y como se adecua ya que el contexto no es perfecto.
o Tolerancia al cambio: Una vez concluido el software se puede implementar nuevos cambios, por ejemplo las leyes de facturación.
o Invisibilidad: El software no es tangible ya que está plasmado en condigo, infraestructura, diferentes momentos de decisiones.

• Accidentales: Detalles de la implementación y producción actual “Lenguaje, Server, base de datos”
o Una dificultad típica es el leguaje a utilizar
o Multiprocesamiento: Resuelve el problema del feedback, por ejemplo tiempo de pruebas.
o Entornos de programación: La evolución de las tecnologías las cuales podemos utilizar, por ejemplo el utilizar librerías.

¿Cómo podemos resolver las dificultades esenciales?
• No desarrollar: Si el problema a solucionar es esencialmente complejo, la solución podría ser no desarrollas y buscar alternativas como por ejemplo comprar software que ya resuelve el problema o aprovechar el Open Source.
• Prototipado rápido: Lo esencial es desarrollar partes pequeñas y obtener feedback del cliente para así determinar si lo que estamos realizando es lo que se necesita, esto permite la evolución.
• Desarrollo Evolutivo: Obtener resultados pequeños y posteriormente realizar nuevas implementaciones.
• Grandes diseñadores: Diseñar sistemas que resuelvan los problemas de forma óptima.

La complejidad

Con esto se me ocurre que JQuery como tal resolvía algo accidental, algo temporal y no algo esencial. Con esto no estoy diciendo que JS lo resuleva todo, pero si estoy diciendo que ahora JQuery ya no resuelve lo que resolvía en algún tiempo.

muy aclarados es muy real

el desarrollo evolutivo con prototipados ágiles son un pilar muy importante en nuestra época para la estructura y desarrollo de cualquier proyecto.

Buena Explicacion.!! 😃

Creo que este punto es la esencia de los problemas accidentales del desarrollo del software.

Siento que en este curso he encontrado el material que he estado buscando. Diseñar una solución elegante a un problema viendo me parece de lo más interesante y satisfactorio. Excelente curso. Muy entusiasmado por continuar!

No Silver Bullet. Por qué no existe la bala de plata?

reconocer cuales son las dificultades a las que te enfrentas y de que tipo te puede dar una idea de como sortearlas y obtener un mejor software

Es en resumen para mi el mejor momento de la clase, indica que los problemas fundamentales del desarrollo de software son complejos de solucionar, no es cuestion de una libreria o un framewok

en teoria deberiamos enfocarnos en resolver lo esencial que ya alguien resolvio lo accidental

prototipados rapido en si seria prueba, error y solucion

El desarrollo evolutivo es la mejor opción para solucionar dificultades esenciales

me hubiera gustado saber esto antes de empezar a programar solo me hubiera ahorrado tiempo

No entiendo por qué la forma que más le gusta a Guido de solucionar los problemas esenciales es no desarrollar. Es curioso

La división de los problemas esenciales y accidentales me permitió saber identificarlos mejor y poder atacar a cada uno de acuerdo a lo necesario

Dificultades de desarrollo de software La momento del de desarrollar la arquitectura debemos tener en cuenta cuáles son las dificultades a resolver  La dividimos en dos tipos las dificultades esenciales y las accidentales  Los esenciales los dividimos en 4 La complejidad: que en sí lo complejo de solucionar el problema a resolver  La conformidad: es tener en cuenta en contextos va a funcionar el software las limitaciones y condiciones en la cual va a funcionar  La tolerancia al cambio: es la tolerancia del software a las variaciones que pueda tener el problema a resolver . La invisibilidad :es que en si el software es invisible intangible no podemos verlas ni palparlas  Y la accidentales sin todas aquellas que están ligadas a la tecnología plataforma y las limitaciones de compatibilidad