¿Implementación sin diseño?

Hola,

Soy Ingeniero en Informático y estoy trabajando como tal en una empresa de I+D de informática. Estoy trabajando desarrollando un servidor que monitoriza los datos que se toman de un conjunto de sensores. El problema es que sólo parto del análisis (que aun tiene algunas lagunas) y diseño a la vez que implemento, porque no tengo cojones de sacar un diseño sin picar código: siempre surgen cosas que sólo se ven mientras codificas. Por suerte tengo un jefe bastante bueno, comprensible y que me echa un cable cuando me atasco...

Pero mi pregunta es: ¿en las empresas de informática los programadores también se plantean cuestiones de diseño en la implementación? o simplemente le dan un diagrama de clases con la funcionalidad de cada clase, sus atributos, funciones, incluso plantillas del código que tiene que rellenar, etc... Es lo que me imaginaba desde un principio, pero por un lado lo veo muy difícil y por otro me extraña que un programador se dedique a tomar decisiones de diseño.

Saludos.
En España hay de todo, hasta las que omiten todos esos pasos y dicen "quiero esto". Y verte haciendo fases de diseño en lugar de picar código "porque sí" es pensar que pierdes el tiempo (conocí un par de personas en esas situaciones, lo que no se el nombre de la empresa... ni ganas xD).

Las consultorías sí que suelen tener sus propias plantillas, colección de programas "base" y demás, pero en otras que no se dediquen íntegramente a ello hay de todo.
especificacion -> diseño -> implementacio

Si es algo pequeño como que no hace falta, pero si tienes que hacer algo grande a la larga tendras problemas si no sigues bien los pasos y lo tienes todo bien documentado.
Leyendo por ahí se ve que en españa muchas personas trabajan así. Te dan un pliego de condiciones puestas a voleo y te pones a picar, luego te van cambiando las condiciones y ale, a comerte marrones.

En una empresa seria se supone que se seguiría el orden lógico: análisis-diseño-implementación
bueno... con decirte que he llegado a ver como un proyecto importante (casi un año de desarrollo) se aprobaron los requisitos una semana antes de que se pusiera en entorno productivo.....
Buenas...

Pues yo me terminé de sacar la carrera ayer Imagen después de sacarme la última asignatura (que se me había quedado colgada durante ya 3 años)...

Estoy de prácticas de máster en una empresa de desarrollo de juegos en Francia, y aunque sé que hay muchos entornos más "estáticos", lo cierto es que en muchos proyectos no sirve la planificación tradicional (que no el diseño). Los cambios constantes, los largos procesos en cascada e incluso el típico RUP que te enseñan en la facultad no sirve para mucho, bueno, servir sirve, pero para otras cosas. En cambio, las metodologías ágiles, sobre todo SCRUM, se suelen adaptar bastante bien a proyectos medianos.

Ahora bien, en lo que se refiere al diseño UML (típicamente de clases, aunque hay algunos otros que son necesarios para otras "tareas") sí son útiles... Lo que hay que tener en cuenta es que los diseños no son nunca definitivos (bueno, no deben serlo), sino más bien un "guión". Lo importante en muchos casos es plantear un método de desarrollo que sea lo más 'reactivo' posible, es decir, si por lo que fuese, hubiera algún cambio en las especificaciones, en el diseño, o en la implementación, un buen método será capaz de adaptarse a dicho cambio...

Lo cual no quita que simplemente puede que no se te dé bien hacer diseño, y lo tuyo sea más implementar, que no es ni mucho menos el "poner ladrillos" que se habla mucho por ahí... Un ingeniero no es necesariamente un "diseñador", y un "programador" no es necesariamente un "peón de obra", aunque así nos lo quieran hacer ver algunos...

Un saludo!
Depende.

Implementar sin diseñar es una locura. El problema es que diseñar, no tiene por qué significar saber con exactitud y al 100% cómo vas a desarrollar la app completa.

Por ejemplo, en tu caso concreto podrías empezar diciendo que vas a tener un subsistema que recoja los datos y se lo pase a otro que los procese. A partir de ahí, si por ejemplo tienes diferentes sensores podrías crear una abstracción común, y luego montar un sistema de mensajes si fuera necesario para enviar las señales, o simplemente redirigirlas a pelo, dependiendo si los sensores envían las señales o tú haces pooling de ellas. Luego te mueves al otro subsistema (recogida de datos)
Pero según implementas cada subsistema, tomaras decisiones de diseño de más bajo nivel, por ejemplo las señales que me envían son muy distintas entre si, pero hay sensores que comparten algunas, así que creo un objeto que interpreta esas señales y lo "acoplo" a cada sensor, y así reaprovecho....

Después de este "cuento de la lechera" que me montado yo sólo, vamos a algo más concreto: no te equivoques, un buen deasrrollador está diseñando constantemente: cumpliendo los principios SOLID buscando patrones que puedan abstraerse, identificando potenciales patrones de diseño conocidos y eligiendo la organización de la app por capas más adecuada (MVC, MVP, Passive View, Supervising Controller, etc), o incluso eligiendo cuando una solución buena y quizá poco elegante, es mejor que una solución perfecta y elegante que lleva el triple de tiempo desarrollar. Esto último te aseguro de primera mano que es tan complicado como todo lo demás.

Desafortunadamente los buenos desarrolladores no abundan tanto como deberían. Abundan los que creen que saben programar y que sólo eligen las soluciones sucias y rápidas :S


En mi opinión los diagramas UML sólo muy útiles para clarificar o mostrar lo que quieres hacer a más o menos alto nivel, pero diseñar una app medianamente grande sólo en base a ellos es una pérdida de recursos enorme, ya que te abstraes del problema, y requieren gran documentación (no valdría en este caso con sólo diagramas de clase, que son los que la mayoría conoce y usa)
Ya se que lo que digo es algo quizá atrevido, ya que en principio el UML es un lenguaje creado para diseñar aplicaciones.

Por último, siendo fan de los principios ágiles como soy, creo que un programa que funciona, bien programado, bien estructurado, con convenciones y consistente en la base de código, es mejor que documentos de diseño exhaustivos de 100 hojas que se abstraen demasiado.
todo eso que contais está muy bien, pero yo llevo 6 años en el mundillo y os puedo garantizar que muchas veces los propios analistas no quieren hacer las cosas de forma elegante, porque no hay ni tiempo, ni dinero, ni recursos y se conforman con la chapuza y el código sucio. Al final acabas aplicando parches sobre parches.

Cuando ni el cliente es serio con las especificaciones (ahora te pide una cosa y a los cinco minutos le pica un huevo y te pide lo contrario) es imposible ser serio. Cuando el cliente no cumple con los plazos pero a ti te los exigen acabas haciendo lo que buenamente puedes.

Y es bastante común los proyectos donde los requisitos se firman sin leerse siquiera, o directamente se aprueban DIAS DESPUES DE LA FECHA DE ENTREGA (no exagero). Y las broncas que te comes por estar dos días sin picar código y escribiendo en el cuarderno (básicamente analizando el problema y diseñando una solución) Proyectos planificados para 6 meses que a mitad del desarrollo se modifica el alcance y se alargan 4 años (o viceversa, que es peor)...

O cuando te reducen los plazos de entrega y no te da tiempo a hacer pruebas de integración (y luego la aplicación peta por todos lados), o cuando no hay documentación, o cuando nadie tiene ni idea de que narices hay que hacer...

Por muy buen programador que seas, en ninguna formación te preparan para el "metodo de trabajo" español. Lo mas importante es saber adaptarte a cada situación, hacer horas extras y saber mandar a tomar por culo a jefes y usuarios sin que se sientan ofendidos...
faco escribió:todo eso que contais está muy bien, pero yo llevo 6 años en el mundillo y os puedo garantizar que muchas veces los propios analistas no quieren hacer las cosas de forma elegante, porque no hay ni tiempo, ni dinero, ni recursos y se conforman con la chapuza y el código sucio. Al final acabas aplicando parches sobre parches.

Cuando ni el cliente es serio con las especificaciones (ahora te pide una cosa y a los cinco minutos le pica un huevo y te pide lo contrario) es imposible ser serio. Cuando el cliente no cumple con los plazos pero a ti te los exigen acabas haciendo lo que buenamente puedes.

Y es bastante común los proyectos donde los requisitos se firman sin leerse siquiera, o directamente se aprueban DIAS DESPUES DE LA FECHA DE ENTREGA (no exagero). Y las broncas que te comes por estar dos días sin picar código y escribiendo en el cuarderno (básicamente analizando el problema y diseñando una solución) Proyectos planificados para 6 meses que a mitad del desarrollo se modifica el alcance y se alargan 4 años (o viceversa, que es peor)...

O cuando te reducen los plazos de entrega y no te da tiempo a hacer pruebas de integración (y luego la aplicación peta por todos lados), o cuando no hay documentación, o cuando nadie tiene ni idea de que narices hay que hacer...

Por muy buen programador que seas, en ninguna formación te preparan para el "metodo de trabajo" español. Lo mas importante es saber adaptarte a cada situación, hacer horas extras y saber mandar a tomar por culo a jefes y usuarios sin que se sientan ofendidos...


Práctica común derivada de la poca idea empresarial que en general se tiene en españa, donde se quiere todo para ayer, pero no eres ni capáz de especificar el qué quieres, unida al desconocimiento del coste de un desarrollo informático.

Si a mi me ha pasado, tener apps que vas metiendo cosas según los diferentes clientes lo piden, y por supuesto todos lo piden para dentro de un mes.... pero luego cuando les quieres soltar 7000 euros por una modificación a medida en tiempo record se quedan flipando. ¿Planificación? ¿Idea de producto? ¿Para qué? No se llega a ninguna parte con una idea de producto verdad ¿37 signals? ¿twitter?
País.

Eso si, la mayoría de la gente que conozco tampoco hace nada por evitarlo, que no hace falta mandar a los jefes a tomar por culo, muchas veces basta con justificar un poco las cosas.

Por ejemplo tengo un colega en una empresa que desarrolla una intranet y todos trabajan contra una base de datos de pruebas remota para desarrollar, lo que es a todas luces la grandísima chapuza:
- si alguien jode la BD (bastante probable ya que estás desarrollando) se joden todos. No es la primera vez que pierden 7 horas mientras levantan otra vez el servidor y restauran la bd
- Estas trabajando sobre una red: hooola latencia
- Entre compañeros se pisan los datos

Dime tú cuánto pueden tardar en instalar una bd local y hacer copia de la bd de desarrollo. ¿Dos horas? Integras las BDs todas las semanas y vas a ser mucho más productivo hombre. Eso lo muestras en un informe con un par de datos: simplemente con medir cuanto tarda la gente de media en depurar en remoto y local, tomar nota de los tiempos de downtime o del tiempo que pasas arreglando lo del resto, y les presentas un informe de 3 páginas en un segundo.

Si luego se limpian el culo con el, al menos ya sabes que hay que ir buscando otro curro.

Y más cosas, que tardaron 2 semanas en montarles un servidor de subversion, para luego mal usarlo ya que todo el mundo trabaja contra la rama principal. Hace bien poco uno marchó de vacaciones subiendo las cosas, se olvidó de meter algunos ficheros y cambió otros, y rompió la build entera. Un día trabajando a ciegas hasta localizaron al chaval para hacer que su código compilara, porque por supuesto, cada uno programa lo suyo y de la manera que le sale de las pelotas, sin convenciones de código, de nombres ni de trabajo. Y que veas que tu te esfuerzas en hacerlo bien mientras otro lo único que hace es cortar y pegar trozos de código repitiéndolo en mil lugares en vez de parametrizar, ya cuando no modificas métodos comunes para tu propia convenciencia jodiendo a los demás (modificar un método de enviar mail para que dentro del cuerpo accedira a la bds, genial!)

Pues yo ahí lo que haría sería proponer soluciones, no quejarse, además sería una manera cojonuda de ir destacando entre la mediocridad, y ni caso :(
Siempre puedes decir que tu no diseñas antes de picar código porque promueves las Metodologías Ágiles mientras pones cara de interesante. Suele funcionar.
kbks escribió:Siempre puedes decir que tu no diseñas antes de picar código porque promueves las Metodologías Ágiles mientras pones cara de interesante. Suele funcionar.

Suele funcionar por que la mitad de la gente no tiene ni idea de lo que hablas, pero con que encuentres a alguien que sepa un poco del tema, sabrá que ese comentario es una tontería y quedarás como un gilipollas
Después de tres años desarrollando aplicaciones para una empresa te puedo decir que en mi caso al menos la fase de diseño no existe. Simplemente se considera perder el tiempo. Parece que nadie ve la relación entre todo el tiempo posterior de soporte que se pierde resolviendo problemas y la omisión de la fase de diseño.

La fase de especificaciones se limita a las tecnologías y el esquema de la base de datos.

Espero que no todas las empresas de informática sean como la mía porque si no algo va mal en el sector.
Gracias a todos por vuestras respuestas. Yo ya estaba contento con mi trabajo y mi jefe pero con lo que me comentáis no me cabe la menor duda de que tengo mucha suerte con lo que tengo...

kbks escribió:Siempre puedes decir que tu no diseñas antes de picar código porque promueves las Metodologías Ágiles mientras pones cara de interesante. Suele funcionar.

No me piden diseñar, YO soy el que quiere un diseño para tener las cosas más claras e ir a tiro hecho.

Si como me contáis, un diseño es una idea general y no se entra en mucho detalle, yo ya tengo un diseño :). Lo que pasa es que claro... en el momento que me surje la necesidad de replicar cierto código en otra clase y cosas de esas... me planteo de inmediato que hay algo que no estoy haciendo bien, y me tiro 20 minutos modificando código cuando pienso que podría tirarme 1 minuto borrando bocetos en papel... Pero claro, esas contradiciones no se te presentan en el papel...

Saludos.
PrivateJerson escribió:Después de tres años desarrollando aplicaciones para una empresa te puedo decir que en mi caso al menos la fase de diseño no existe. Simplemente se considera perder el tiempo. Parece que nadie ve la relación entre todo el tiempo posterior de soporte que se pierde resolviendo problemas y la omisión de la fase de diseño.

La fase de especificaciones se limita a las tecnologías y el esquema de la base de datos.

Espero que no todas las empresas de informática sean como la mía porque si no algo va mal en el sector.


Pues a mi me da que eso es generalizado, pero bueno.

En mi opinion el problema esta en que en la fase de diseño se entiende mas el planificar y gastar tiempo en reuniones seguimiento y en poyadas que en diseñar exactamente.

JAPosti escribió:No me piden diseñar, YO soy el que quiere un diseño para tener las cosas más claras e ir a tiro hecho.

Si como me contáis, un diseño es una idea general y no se entra en mucho detalle, yo ya tengo un diseño :). Lo que pasa es que claro... en el momento que me surje la necesidad de replicar cierto código en otra clase y cosas de esas... me planteo de inmediato que hay algo que no estoy haciendo bien, y me tiro 20 minutos modificando código cuando pienso que podría tirarme 1 minuto borrando bocetos en papel... Pero claro, esas contradiciones no se te presentan en el papel...

Saludos.


En mi caso es que no puedes separar una cosa de la otra, es decir no es diseñar y luego implementar sino que mas bien es diseñar a un nivel conceptual muy basico para que te lo vayahn "aprobando" y luego ir haciando el diseño mas preciso a la vez que implementas. Pero bueno, solo mi opinion.
Adama escribió:En mi caso es que no puedes separar una cosa de la otra, es decir no es diseñar y luego implementar sino que mas bien es diseñar a un nivel conceptual muy basico para que te lo vayahn "aprobando" y luego ir haciando el diseño mas preciso a la vez que implementas. Pero bueno, solo mi opinion.

Claro, eso es lo que hago :).
JAPosti escribió:Si como me contáis, un diseño es una idea general y no se entra en mucho detalle, yo ya tengo un diseño :). Lo que pasa es que claro... en el momento que me surje la necesidad de replicar cierto código en otra clase y cosas de esas... me planteo de inmediato que hay algo que no estoy haciendo bien, y me tiro 20 minutos modificando código cuando pienso que podría tirarme 1 minuto borrando bocetos en papel... Pero claro, esas contradiciones no se te presentan en el papel...

No te preocupes por esto, que lo normal es estar modificando código. De hecho en papel seguro que tardas más.
Si haces un diseño TAN detallado para detectar duplicaciones en código (detectar duplicidad en código, no en funcionalidad), el coste de hacerlo sería más o menos el mismo que codificarlo en si :P
Genial. Gracias a todos por vuestras respuestas.

En la carrera te lo pintan todo como en los mundos de Yuppi y claro, después te llevas el chasco...

Saludos.
16 respuestas