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 130

Preguntas 8

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.

Existen dos tipos de problemas: Los problemas esenciales y los problemas accidentales.

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.
Manejo del problema de complejidad: No desarrollar: Comprar - OSS
‚ÄĘ Conformidad: en qu√© contexto se usa el software y c√≥mo debe adecuarse al mismo. Se incluyen todo lo que le compete. Ej: Ambiente, conectividad, impuestos, etc.
Manejo del problema: Prototipado r√°pido, feedback y ciclos r√°pidos para soluciones peque√Īas.
‚ÄĘ Tolerancia al Cambio: Posibilidad del cambio en el mismo y que sea responsivo a diferentes contextos.
Manejo del problema: Desarrollo Evolutivo, desarrollos peque√Īos. Paso a paso pero de manera firme e ir haciendo crecer el software.
‚ÄĘ Invisibilidad: Problemas de tangibilidad nula.
Manejo del problema: Grandes dise√Īadores, Arquitectos que saben abtraer el problema y que realiza soluciones elegantes, de manera simple, con la mejor calidad posible en los componentes que lo necesitan.

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 **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)

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.

Si quieren profundizar mas sobre esto aqu√≠ esta el libro del se√Īor Brooks, http://worrydream.com/refs/Brooks-NoSilverBullet.pdf Igual no dice mucho que Guido no diga ya.

Links de No silver bullet en espa√Īol

https://gist.github.com/esparta/582e43af7b803e0aaf69
https://edoc.site/queue/no-silver-bullet-espaol-pdf-free.html

**Es corto. ¬°Y vale muchisimo la pena leerlo! **

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"‚Ķ

El feedback es la herramienta mas importante del desarrollo Moderno.

En la etapa de dise√Īo y desarrollo estamos concentrados en encontrar cu√°les son los problemas que queremos resolver, estos problemas se dividen en:

1.- Esenciales: Tratan de c√≥mo entender el concepto de lo que vamos a solucionar, entender el dise√Īo que vamos hacer.

Los problemas esenciales se dividen en cuatro:

‚ÄĘ Complejidad: Es cuando lo que tenemos que resolver es complejo en s√≠ mismo.
‚ÄĘ Conformidad: Es en qu√© contexto se va a usar el software y como tiene que adecuarse a ese contexto que quiz√°s no es perfecto.
‚ÄĘ Tolerancia al cambio: Una vez que se termine un software va a poder cambiar o es algo que va a ser muy dif√≠cil de cambiar, esos problemas de la tolerancia al cambio tienen que ver con cuanto cambia el problema que se est√° resolviendo y cuanto podemos adaptarnos a esos cambios.
‚ÄĘ Invisiblidad: Problemas de tangibilidad nula.

2.- Accidentales: Tienen que ver con las plataformas, tecnología a usar, lenguajes, frameworks, integraciones, etc. Estos son los problemas que son más comunes encontrar.

‚ÄĘ Lenguajes de alto nivel: Lenguaje de programaci√≥n de alto nivel es un tipo de lenguaje de programaci√≥n que permite al programador escribir programas (algoritmos) que son m√°s o menos independientes de un tipo particular de computadora (del hardware). Estos lenguajes son considerados de alto nivel porque son m√°s parecidos al lenguaje natural humano y m√°s lejanos al lenguaje de las m√°quinas.
‚ÄĘ Multi-procesamiento: Resuelve el problema del feedback al momento de programar.
‚ÄĘ Entornos de programaci√≥n: Un entorno de programaci√≥n es un programa o conjunto de programas que engloban todas las tareas necesarias para el desarrollo de un programa o aplicaci√≥n.

**Nota: **

‚ÄúConsidero a la especificaci√≥n, dise√Īo y comprobaci√≥n del concepto la parte dif√≠cil de hacer software.
(‚Ķ) Si esto es cierto, hacer software siempre ser√° dif√≠cil. No existe la bala de plata.‚ÄĚ
No Silver Bullet (Frederick P. Brooks Jr., 1986).

Cómo resolvemos las dificultades esenciales:

1.- No desarrollar: Si el problema es muy complejo lo mejor es usar un software existente y no desarrollar nuevamente ya que quizás otra persona paso por todos esos problemas y ya lo pudo haber solucionado, de igual forma otra solución es aprovechar el open source y utilizar librerías o utilizar programas dsiponibles.
2.- Prototipado r√°pido: Tiene que ver con las metodolog√≠as agiles, la idea es obtener feedback lo antes posible para saber si estamos resolviendo el problema de forma correcta, es por eso que se evoluciona el software por pasos muy peque√Īos teniendo feedback del usuario.
3.- Desarrollo evolutivo: Esta más alineado a la creación y acumulación de sistemas, es decir, plantea obtener resultados más chiquitos y luego cada uno de ellos se vayan evolucionando.
4.- Grandes dise√Īadores: Los grandes dise√Īadores son ingenieros que saben abstraerse de ese problema puntual y entienden un problema m√°s general, saben dise√Īar una soluci√≥n elegante y simple, como tambi√©n saben dise√Īar un sistema que resuelve de la mejor forma un problema y que el mismo tiene 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.

¬Ņ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)

Lo esencia para iniciar es partir en que no se tiene conocimiento sobre el proyecto a desarrollar, por lo que se debe tener mente abierta, se debe tener una fuente de información que permita comprender muy bien los requerimientos del cliente o del proyecto, en muchas oportunidades se cometen errores al asumir que tu conocimiento es suficiente para un desarrollo, se requiere mas que los conocimientos técnicos en desarrollo, son los conocimientos de la Unidad de negocio para la que se desea desarrollar.

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.

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

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.

Invito a cualquier usuario a revisar y editar libremente mis apuntes de este curso.
Aquí.

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.

‚ÄúLa retroalimentaci√≥n es la herramienta m√°s importante del desarrollo de software moderno‚ÄĚ

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)

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.

¬Ņ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
                      **dificultades en el desarrollo de software** 

esenciales
Los problemas esenciales implican entender el concepto de la soluci√≥n y el dise√Īo que se har√°. Estos a su vez se subdividen en 4.

  • Complejidad: es el nivel de dificultad del dominio del proyecto
  • Conformidad: son las posibles dificultades devenidas del contexto en el que se desarrolla el proyecto
  • Tolerancia al cambio: es que tan adaptable debe llegar a ser el software a los cambios que puedan surgir en el problema al que este le da soluci√≥n.
  • Invisibilidad: como lo dice su nombre este problema radica en que la soluci√≥n que estamos implementando es ‚Äúinvisible‚ÄĚ o m√°s bien abstracta hasta el momento de su implementaci√≥n, y requiere de un nivel de comprensi√≥n para poder visualizar el desarrollo e implementaci√≥n de las soluciones
    accidentales
    tratan los problemas que se encuentran en el desarrollo, como escoger los frameworks a utilizar y las limitantes que se pueden encontrar con las tecnologías que se utilizan.
    -problemas de lenguajes: son las complicaciones que surgen al lidiar con los lenguajes que se escogieron para el desarrollo del proyecto.
    -multiprocesamiento: es la necesidad de resolver o atender a varios problemas en un mismo momento.
    -entornos de programación: son los problemas que devienen de las herramientas que hemos usado para resolver los problemas entiéndase frameworks compilados librarías etc.

Como diferenciar de Un Problema Accidental y Uno Esencial? Ejemplos?

Resolver dificultades esenciales:
No desarrollar: Comprar, utilizar uno ya existente, aprovechar open source.
Prototipado rápido. Métodologias ágiles, para obtener feedback lo más rápido posible.
Desarrollo evolutivo. Desarrollar iterativamente, resultados peque√Īos.
Grandes dise√Īadores. Ingenieros que saben dise√Īar soluciones elegantes y simples.

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.!

Que es Desarrollo Evolutivo? y cual es la diferencia entre Metodolog√≠as √Āgiles?

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.

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.

Solucionar las Dificultades Esenciales

  1. No desarrollar, Comparar - Open Source. Si es un problema complejo y ya alguien lo solucion, o existen algunos componentes que se puedan reutilizar, es una excelente opción.
  2. Protoripado rápido. Lo más cercano a esto son las metodologias ágiles, que entrega soluciones parciales, para irnos asegurando que se esté cumpliendo con lo deseado.
  3. Desarrollo evolutivo. M√°s alineado de creaci√≥n y acumulaci√≥n del sistema. Obtener resultados peque√Īos e ir evolucionando.
  4. Grandes Dise√Īadores. No son programadores que simplemente saben usar una tecnologia, si no que tiene la capacidad de abstraerse de es problema puntual y entender un problema m√°s general. Dise√Īar un sistema que resuelva de la mejor forma el problema y tenga los mejores atributos de calidad.

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.

"No Silver Bullet" - definición importante!

Prototipado r√°pido

Los problemas se pueden clasificar en 2: -Esenciales: Relacionadas al planteamiento del problema y el dise√Īo de la soluci√≥n -Accidentales: Relacionada con la parte t√©cnica (plataforma, tecnolog√≠a y lenguaje)

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

Seg√ļn ‚ÄúNote Silver Bullet‚ÄĚ de Frederick P. Brooks Jr., las dificultades en el desarrollo de software se pueden dividir en dos grupos: esenciales y accidentales. Las dificultades esenciales tratan sobre entender el concepto de lo que vamos a solucionar, el dise√Īo de lo que vamos a realizar. Las dificultades accidentales tienen que ver con la plataforma y la tecnolog√≠a que se va a utilizar (lenguajes, frameworks, integraciones‚Ķ); suelen ser las dificultades que m√°s a menudo nos encontramos.

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

De las 4 formas para trabajar las dificultades esenciales, los arquitectos se involucran en Grandes Dise√Īadores


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

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.

¬ŅA que se refiere con que se obtiene feedback mas rapido en el multiprocesamiento?

Muy buena clase.

con el feedback se puede optimizar mas r√°pido nuestro software.

Problemas Accidentales:

Problemas Esenciales:

Como resolver las Dificultades Esenciales:

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

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

Me gusto este fragmento del curso, deja en claro los problemas que se presentan en el desarrollo de un sistema. El hecho de hacernos referencia a profesionales(FB) que hablan o sugieren de las soluciones es un gran aporte. Buen día

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.

El problema m√°s com√ļn accidental es la limitaci√≥n de tecnolog√≠as.

Como resolver las dificultades Esenciales:

**- No desarrollar **Open source, productos que ya resuelvan parte del problema (auth, cloud services, ecommerce platforms).
**- Prototipado r√°pido ** GV Sprint, RAD frameworks, mockups.
- Desarrollo evolutivo (‚Äúhacer crecer un software‚ÄĚ vs ‚Äúconstruirlo‚ÄĚ): Metodolog√≠as √°giles.
**- Grandes dise√Īadores **patrones de dise√Īo, referentes / mentores: Kent Beck, Martin Fowler, Robert Martin, Eric Evans, etc.

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?

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:

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

No Silver Bullet (Frederick P. Brooks Jr., 1986)

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

La tolerancia al cambio

La conformidad

Invisibilidad

DIFICULTADES: accidentales

¬ŅC√≥mo resolver las dificultades esenciales? No desarrollar

Desarrollo evolutivo

Creo que a la hora de dise√Īar y desarrollar un proyecto, es muy importante tener habilidad de discernir en lo que se est√° haciendo, es decir, si estamos creando una soluci√≥n, preguntarnos constantemente, es esta una soluci√≥n viable?, es simple? habr√° una soluci√≥n distinta?.. etc
El poder del discernimiento es muy grande, y se que no viene al caso, pero me gustar√≠a compartir esto xd‚Ķ llega un momento, en el cual discernimos todo, nos preguntamos todo, y no damos nada por hecho, ¬Ņpor que estoy aqu√≠? ¬Ņdonde estoy? etc‚Ķ
y llegar√° el momento en el que estaremos durmiendo, en nuestros sue√Īos, y nos preguntaremos algo de eso, y quiz√°s‚Ķ quiz√°s al preguntarnos, al discernir nos daremos cuenta de que estamos so√Īando, y entonces, pues habremos despertado en un sue√Īo!
quiz√°s podr√≠amos hacer eso mismo ahora, y nos dar√≠amos cuenta de que en este momento estamos durmiendo, estamos so√Īando‚Ķ jajajajja saludosxd

La Calidad no es Utilizar herramientas que resuelvan problemas accidentales o utilizar las ultimas tecnologias de moda, es comprender y que nos confirmen los criterios de aceptacion de los interesados del proyecto.

¬ŅQui√©n es Frederick P Brooks Jr?