Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.
Conectarse

Recuperar mi contraseña

Temas importantes
----------------------------------------
Páginas con recursos RPG Maker
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
Afiliados
Estadísticas
Tenemos 4064 miembros registrados.
El último usuario registrado es cesarseb233.

Nuestros miembros han publicado un total de 84115 mensajes en 11982 argumentos.

Resolución de Problemas

Ver el tema anterior Ver el tema siguiente Ir abajo

Resolución de Problemas

Mensaje por Metalero el 2013-02-27, 04:33

Resolución de problemas



    Antes de empezar, les aviso, el post es largo y me tomo alrededor de una semana terminarlo. Intenté escribirlo de tal forma que se su lectura se haga amena. Espero lo disfruten leyendo tanto como yo lo hice escribiendolo.

       Prólogo

    ¿Cuántas veces han visto posts de gente preguntando cosas super obvias, o tan generales que es casi imposible contestar algo conciso? Gente que ante la mas mínima traba pierde los estribos y sale a pedir ayuda a quienes (según ellos) son "expertos" y "grandes conocedores"... usuarios de una poderosa magia negra llamada "razonamiento"
    En pocas palabras, hablo de aquellos que se ahogan en un vaso de agua.
    Siempre que me topo con estas cosas, mi primer impulso es comenzar a escribir una réplica sobredosificada de sarcasmo y frases afiladas, pero luego me doy cuenta de que ni vale la pena, y termino reprimiendo mi ira. Pero no termina acá, pues estas situaciones también se me dan en la vida real, y con cosas mucho mas "mundanas" (con familiares y amigos).
    La cuestión es que me doy cuenta que muchas personas no saben resolver problemas, y dado que (mas que nada en aspectos técnicos) tenga cierta experiencia en esto (trabajo como desarrollador y project manager en una empresa de desarrollo de software de todo tipo... o sea, enfrento problemas constantemente... necesito vacaciones XD), escribo este ensayo (?) sobre resolución de problemas.
    
    El "tutorial" (por llamarlo de alguna forma) esta principalmente orientado a los mas nuevos, o a quienes no tengan tanta experiencia llevando a cabo proyectos, pero posiblemente exponga varias cosas que incluso los mas viejitos pueden hallar interesante.


         ¿Que es un problema? (formalización)

    Se pueden encontrar muchas definiciones de la palabra PROBLEMA, pero orientado a un ambiente "técnico" a mi me gusta definirlo como un "Contrato".
Básicamente:

   "Si la entrada es aceptable, la salida debe cumplir la propiedad especificada" (Edsger Dijkstra, Richard Hoare, 1970s)

    Es decir, se imponen condiciones iniciales o de entrada (pre-condiciones) y condiciones de salida (post-condiciones), y se asegura que si las pre-condiciones se cumplen al inicio del problema, las post-condiciones se cumplirán al final de éste.
    Es el Qué y no el Cómo lo que importa a la hora de definir un problema. Es muy fácil confundir el Qué y el Cómo, pero es importante acostumbrarse a diferenciarlos.

    Ejemplo:  problema "Cocinar una porción de Arroz"

Pre-condiciones:

  • contar con 200g de arroz crudo en buen estado
  • contar con una cacerola mediana
  • contar con 1 litro de agua potable
  • contar con una fuente de calor capaz de proporcionar 1000W de energía durante 20 minutos


Post-condiciones:

  • el arroz quedará listo para ser consumido
  • la cacerola quedará sucia


FIN


    Como ven, este ejemplo ilustra un problema, y su formalización. Podrán apreciar también que en ningún lugar estoy teniendo en cuenta Cómo, a partir de la Pre-condición, llego a la Post-condición, sino Qué es lo que debe suceder si se cumple la Pre-condición



          Investigación

    Bien, ya tenemos identificado el problema, ahora falta lo importante, encontrar un modo de resolverlo. Y es en este punto donde muchos sosobran, sobretodo a la hora de resolver problemas complejos.
    Lo primero que debemos preguntarnos es: ¿alguien se topo ya con este problema alguna vez? La realidad es que dependiendo del nivel de complejidad y que tan específico es el problema, puede que esto sea asi, o que no lo sea.
    Para esto siempre esta nuestro fiel amigo Mr. Google Googlobsky. Como norma estandard, tómense al menos 20 minutos buscando, y no se queden solo con los primero 3 resultados.

          Divide y triunfarás

    Si lo que estamos intentando realizar es muy específico, una estrategia que NUNCA falla es dividir el problema en otros mas pequeños y luego, repetir el proceso de investigación para cada uno de estos problemas pequeños.


    Ejemplo: a partir de un conjunto de números naturales, obtener todos los números perfectos ordenados de menos a mayor.

    Dado que mi imaginación me traiciona cuando mas la necesito, lo único que se me ocurrió fue este ejemplo, que, aunque es bastante obvio, servirá para explicar este punto.

    Si por alguna razón tuvieran que resolver este problema, y fueran de cabeza a buscar una solución para el problema "completo"... tal vez lo encuentren y caso cerrado. Pero lo mas probable, es que no encuentren algo tan específico, o haya muy pocas opciones disponibles (y tal vez, por ciertas razones, algunas no nos sirven). En fin, como ya habrán imaginado, lo mejor en estos casos es separar el problema:


  1. tomar un conjunto de números naturales, y ordenarlos de mayor a menor.
  2. decidir si un número es perfecto o no lo es.

    ¿Eso se ve mucho mas básico no? Seguramente sea mucho mas fácil encontrar soluciones para estos problemas separados. Aunque de ser por mi, yo dividiría el problema un poco mas:


  1. tomar un conjunto de números naturales, y ordenarlos de mayor a menor.

    1. obtener todos los divisores de un número entero (sin contar a ese mismo número)
    2. decidir si la suma de un conjunto de números es igual a determinado número


    Ahora si, eso es lo que yo llamo simpleza.
    Obviamente, aun nos queda la tarea de unir/intersecar (según corresponda) los resultados.


    Hay que tener cuidado (mas que nada en casos mas rebuscados, ya que es posible que al separar un problema de determinada manera, al volver a unir/interesecar todo, queden soluciones fuera, o se contemplen soluciones erróneas.



         Problemas análogos

    Muchas veces sucede que si bien lo que estamos haciendo es algo tan específico, que no podremos encontrar en ningún lado una solución que se ajuste a lo que buscamos. Sin embargo, también es posible que el problema, en sus "capas inferiores" se asemeje a algún problema bien conocido (y con muchas soluciones disponibles). De esta forma podemos dividir el problema de manera inteligente para llegar varios sub-problemas con soluciones conocidas

    Ejemplo: canicas en cajas (combinatoria)

    Quienes hayan estudiado álgebra, conocerán este concepto (combinatoria)
    Supongamos que tenemos 10 canicas (bolitas) indistinguibles entre si, y 6 cajas distintas, y queremos hallar la cantidad de distintas combinaciones de tal modo que no sobre ninguna canica (cada una este en alguna caja) y que ninguna caja quede vacía.

    Si buscan teoría sobre combinatoria, seguramente hallen el caso "común" donde uno tiene b iguales bolitas y c cajas distintas, y la cantidad de posibilidades es:

     / b + c - 1 \
     \       b       /

    Es decir:

    (b+c-1)!
    ---------------------
     b!( b +c-1- b )!



    Obviamente, esto así solo no nos sirve para nada. Pero pensando un poco se nos puede ocurrir algo para que nos quede lo mismo que el "caso común".
    ¿Que tal si "pongo" 1 canica en cada caja al principio y luego resuelvo el problema con lo que me queda? De esta forma me aseguro ninguna caja estará vacía, y el resto (chan chan chan!), es el caso "común"!

    Problema resuelto! La solución es:


     / (10 - 6) + 6 - 1 \
     \      (10 - 6)        /

    Es decir:

     9!
    ------ = 126
     4!5!


       Análisis

    Bien, dividimos nuestro problema todo lo que pudimos, encontramos varias soluciones conocidas a estos, pero resulta que algunas fueron lo suficientemente evasivas como para hallar "algo ya hecho", o tal vez unir/intersecar soluciones no era tan sencillo. Acá viene la parte buena, tenemos que hallar una solución nosotros mismos.
    Antes de ponernos a escribir nada, es una buena idea tomarse unos minutos para analizar el problema y pensar la mejor manera de resolverlo. En mi caso, cuando debo hallar soluciones a problemas, en poco tiempo se me ocurren decenas de opciones. Luego empiezo a analizar cada una por separado y rápidamente empiezo a descartar aquellas que a simple vista no son viables.
    A esta altura lo mas probable es que estemos con unas 2, 3 o 4 opciones (mas o menos según la complejidad del problema) perfectamente viables (o al menos, parecen serlo). Aquí lo mejor es tomarse un tiempo para analizar cada una de ellas mas en profundidad.

     ¿Es 'esta o aquella' una solución posible? Bueno de eso dependen varios factores. Lo ideal para analizar una posible solución, es pensar en todo lo que esta implica. El algoritmo, la complejidad, los recursos necesarios y la robustez de ésta.


        Casos

    Algo importante a la hora de analizar las soluciones, es tener en cuenta TODOS los casos "de entrada". Es decir, preguntarse como respondería la solución si se diera tal o cual situación.
    Pensar en esto de forma prematura es clave para no tomar el camino equivocado, pero muchas veces nos damos cuenta de esto a mitad del tramo.

        Ejemplo: Network Address Translator (NAT)

    En uno de los proyectos en los que estoy trabajando actualmente, necesitamos transmitir información multimedia a través de la red sin usar un servidor como intermediario total (proxi), o sea, implementar un sistema P2P. La cuestión es que desarrollamos todo un sistema de networking y las pruebas las hicimos siempre en la red local, y (por falta de experiencia) no tuvimos en cuenta los endemoniados NAT ( los Routers son un ejemplo de NAT), que con su magia negra ocultan los dispositivos que están detrás de él haciendo muy complicado la comunicación entre dispositivos detrás de NATs distintos, y bueno... tal vez tengamos que modificar gran parte de lo que ya hicimos por no haber considerado esto antes.

Nota: los puntos siguientes (Algoritmo, complejidad, recursos y robustez van mas orientado a programación, o sea, para los makeros, engines y scripts)


        Algoritmo

    Si, parece una palabra fea... al menos así recuerdo haberlo sentido cuando aun no estaba familiarizado con dicha palabra. Un algoritmo es nada mas y nada menos que:

    "Conjunto ordenado y finito de operaciones atómicas" (yo, hace un par de años)


    Tal vez lo único que no entiendan de ahí es la parte de "atómicas". Esto se refiere simplemente a que cada operación es una operación "lo suficientemente simple" como para que no sea necesario separarlo en mas operaciones para su entendimiento.

    El típico ejemplo de un algoritmo son las instrucciones de un shampoo:

[list type=1]
[*] Moje su cabello con agua tibia
[*] Aplique el shapoo sobre el cabello mojado
[*] Masaje suavemente
[*] Enjuague con abundante agua hasta remover todo el producto
[/list]

    Lo se, me faltó el "repita de ser necesario", pero ese punto iba a ser para problemas.

    Si no son capaces de encontrar un algoritmo, tal vez signifique que deban separar el problema en partes mas pequeñas... o tal vez no son lo suficientemente creativos. En fin, encontrar el algoritmo correcto es lo mas complicado (y lo mas divertido), y puede que cueste hallarlo.


        Complejidad

    Bueno... esto es difícil de definir con mis palabras, pero creo que todos sabemos que significa. Una vez tenemos un algoritmo pensado, es fácil (aunque muchas veces nos damos cuenta cuando lo intentamos llevar a la práctica) notar que tan complejo es, y esto es un factor importante a la hora de decidir que solución implementar. Nadie en su sano juicio construiría una casa empezando por el techo (aunque sea perfectamente posible), o iría al otro lado del mundo cavando un pozo y llegando a través de la tierra.
    Lamentablemente muchas veces las cosas no son tan obvias, y nos damos cuenta que algo es un poco mas complicado de lo que creíamos, pero bueno, ¿ así se aprende no?



         Recursos

    El concepto de recursos varía un poco dependiendo de la situación, pero en general son los "ingredientes" y "utensilios" con los cuales se "prepara" la solución.
    Creo que la mayoría de ustedes estarán familiarizados con el término, así que no me voy a explayar mucho en esto. Simplemente es algo que hay que tener en cuenta a la hora de desarrollar una solución a un problema.

         Robustez

    Algunos tal vez hayan escuchado sobre "tal algoritmo es muy robusto" o "este framework es mas robusto que aquel otro". Pero seguramente la mayoría no tengan idea de lo que estoy hablando.
    Una solución, algoritmo, programa, etc es robusto cuando logra "mantenerse en pie" aun cuando se lo saca del lugar para el cual fue preparado.

    ¿Y para que diablos me voy a esforzar yo en hacer que mi solución sea capaz de resolver problemas que están mas allá de lo que necesito? Pues nada mejor que otro de mis locos ejemplos para graficarlo.


    Ejemplo: RPG Maker 2K3 / RPG Maker XP / Unity

    Imaginen que en el 2K3 no estuvieran las variables punteros (¿ están verdad?). El programa cumpliría con todo lo necesario para hacer un juego RPG, y sin embargo seria imposible implementar un montón de cosas que se han hecho, y sin embargo el programa nunca se "pensó" para hacer tales cosas.

    Sin embargo, en el 2K3 muchas cosas no son posibles... al menos no por las buenas, como por ejemplo, cambiar la pantalla de título. Y acá entra en XP y sus benditos scripts. Obviamente cuando hay programación (clásica, o sea, con código) de por medio, las posibilidades aumentan.Con los scripts se pueden hacer muchísimas cosas que en su predecesor no era posible (o lo era, pero era muy costoso y complicado)

    Pero. Pero aun así hay cosas no son lo suficientemente robustas. Por ejemplo, supongamos que implementamos un sistema genial de armas que enseñan habilidades, y ademas las armas suben de nivel, y pueden armase equipos completos (y ademas las armas pueden prepararte un sándwich si se lo pedís). La cuestión es: vamos a tener que setear manualmente, por código cada propiedad de cada arma. Además de llevar mucho tiempo y ser super tedioso, es muy fácil equivocarse. (Si no entiende de lo que hablo, imaginen por ejemplo, tener que setear las tablas de parámetros por nivel y experiencia de cada personaje a mano, uno por uno, en un código)

    Acá es donde entra Unity y su genial sistema de "extensiones de editor". Básicamente, uno puede extender el editor (dentro de ciertos limites) a su gusto. Y por ejemplo, podría crear un menú personalizado dentro del editor donde puede setear gráficamente todo lo que desee.



    En definitiva. Una solución robusta, es aquella que cuenta con suficiente flexibilidad, como para poder resolver problemas fuera del alcance del problema original sin un esfuerzo excesivo.



          Prueba y error

    Cuando yo era chiquito (alrededor de los 5 años), estaba en un parque con mi familia y familias amigas, y mi viejo estaba haciendo un asado (barbacoa, por si no saben que es), y una brasa encendida cayo de la parrilla al piso. ¿Y que fue lo que hice yo? fui y la agarré con la mano. Nunca más volví a tocar una brasa encendida con la mano (ni ninguna otra parte del cuerpo).
    Moraleja: la experiencia es un gran (por no decir el mejor) maestro.

    Ahora que ya saben a que problema se enfrentan, y han analizado y definido una solución, no queda mas que intentar desarrollar esa solución. Y lo mas posible es que no funcione a la primera, y ni a la segunda ni a la décima vez. Pero algo es seguro. En cada intento, aprenderán algo, y obtendrán diferentes resultados (cada vez mejores en general), hasta dar con la formula mágica que soluciona el problema.


          ¡Estoy atascado!
    
    Claro que, muchas veces es común llegar a puntos muertos. Y (por fin llego a esta parte!!) recién en este momento es adecuado pedir ayuda (a menos que paguen, si pagan pueden pedir ayuda cuando quieran). A estas alturas del partido, tendrán los conocimientos adecuados como para saber que es lo que están pidiendo exactamente, contar que fue lo que intentaron (y no funcionó), que cosas ya tienen hechas, etc. Verán que no solo mas gente los ayudará sino que les será mas fácil hallar la solución.


         Ninguna solución funciona. Odio mi vida.

    Frustración. Cuando pasa esto (a mi me pasa constantemente ); ) nos dan ganas de hacer un salto de fe al pavimento desde un doceavo piso.
    Relájense, tómense un té y descansen la mente. En estos casos, lo mas probable (si realmente intentaron de todo y nada funciona) es que lo que están intentando hacer sea imposible... o al menos de la forma que lo están intentando hacer.
    
          Think out of the box!

     Problema: tenemos 9 puntos ordenados en 3 filas de 3 puntos cada una:


         O          O          O


         O          O          O


         O          O          O

     Y debemos, con solo 4 lineas rectas y sin levantar el lápiz/birome/pluma, tachar los 9 puntos.





    La primera vez que trate de resolver este problema (no recuerdo bien, pero creo que fue en la escuela primaria), simplemente probé todas posibilidades (excepto la correcta), y estaba convencido de que era imposible.
    Cuando me enseñaron la solución pensé: ¡era tan simple! ¿como no se me ocurrió antes?
    No voy a darles la solución. Y agradecería que nadie la publique. Quienes no la conocen, intenten resolverla (es un problema muy conocido, y pueden hallar la solución en Internet fácilmente, e incluso si me piden por PM yo se las paso) y cuando logren dar con la solución, ya sea que logren hacerlo ustedes o lo vean en algún lado, entenderán el concepto.


    Y es lo que pasa en general con todos los tipos de problema. Muchas veces, estamos tan enfocados en resolver algo de una determinada manera, usando un paradigma ciego, que nuestra mente crea paredes imaginarias que se le hacen tan naturales, que el simple hecho de cruzarlas, nos parece algo que no tiene sentido. Nos metemos dentro de una caja, y nos limitamos a utilizar solamente lo que está dentro de ella.

    ¡Destrocen la caja! ¡Tiren abajo las paredes! Observen el problema desde otro angulo, desde mas lejos, y usen la imaginación (total, ya no hay nada que perder). Así es como nacen las ideas y soluciones mas ingeniosas.


        Epílogo

    Y hasta aquí he llegado, felicitaciones y gracias para quienes leyeron todo este gigante masacote de texto. Espero hayan aprendido algo nuevo. Y más aun, espero empezar menos post "ayuda, quiero hacer un juego de escarabajos y rinocerontes, urgente!!", y ver mas nivel en las preguntas.
Y como se que esto no va a suceder, al menos voy a poder echarles en cara este post >:D.

PD: no posteen la &%$&# solución del problema!!


Última edición por Metalero el 2013-02-27, 18:05, editado 3 veces

_________________
avatar
Metalero
Administrador
Administrador



Créditos 1715

Gracias : 98

Volver arriba Ir abajo

Re: Resolución de Problemas

Mensaje por orochii el 2013-02-27, 06:18

Bueno, me lo leí todo, y me gustó xD. Y una aclaración para el problema de la caja, no deben levantar el bolígrafo =D (lo busqué porque el encontrar como 3 soluciones me indicaba que algo estaba olvidando x'D... pero no estaba seguro 8'D).

Una aclaración más, la diferencia, según mi profesor de diseño al menos, entre complejo y complicado. Un "problema complicado" es aquel que contiene miles de subproblemas. Lo complicado es difícil de manejar. El problema se vuelve complejo cuando logras organizar esos subproblemas en "categorías". El cerebro logra manejar mejor las cosas al categorizarlas.

Es una buena práctica entonces que, después de encontrar esos "subproblemas", los categorices o agrupes (es como partir un evento en varias páginas xD, o una clase de scripting en subclases y clases parientes, así como métodos y sdasdsadsad).

En fin, me gustó la lectura 8D,
Orochii Zouveleki
avatar
orochii
Caballero Shiro
Caballero Shiro

0/3

Créditos 6359

Gracias : 325

http://ragnarokrproject.com/

Volver arriba Ir abajo

Re: Resolución de Problemas

Mensaje por WakkoWarner el 2013-02-27, 17:45

La verdad que si estaba largo este post! y en realidad vaya que si he aprendido muchas cosas debido a que... pues que soy novato tengo escasos 3 meses en el mundo del rpg maker... siempre se presentan problemas... incluso desde un... ¿Que quiero hacer para mi juego? ¿De que tratará? ¿Como lo haré? ¿Que sistema de batalla usare? etc, etc...

Todos somos humanos y cometemos errores al menos eso es para las preguntas tontas que en ocasiones hacemos los muy muy nuevos pues no conocemos bien el maker, aunque es verdad lo que dices metalero!! las formas de resolver un problema al menos hasta llegar al paso de desesperacion y ya haber intentado todo(aseguro que yo no he posteado preguntas hasta no haberlo intentado). Si he aprendido del tema de hecho el problema de los 9 puntos me parece el mas indicado para todo primero intentarlo una y otra y otra vez, quisa preguntarle a alguien mas si puede hacerlo (asi lo ves desde otra prespectiva el problema) despues cuando ya no puedes mas buscas una solucion en santo google y si no encontraras la solucion (imposible) le preguntas al autor como se hacia ese problema que no me dejaba dermir por las noches...

De verdad si recomendaria que todos leyeramos este tema... por que a mi me ayudo de paso ayuda a que los que seamos nuevos y no tan nuevos no nos dejemos intimidar por problemas que si bien no podemos resolver en un dia al siguiente se puede... Magnifico tema metalero de verdad...
avatar
WakkoWarner
Novato
Novato

0/3

Créditos 88

Gracias : 2

Volver arriba Ir abajo

Re: Resolución de Problemas

Mensaje por Metalero el 2013-02-28, 13:09


Y una aclaración para el problema de la caja, no deben levantar el bolígrafo =D

Si, importantísimo, ya lo agregué. Gracias


Una aclaración más, la diferencia, según mi profesor de diseño al menos, entre complejo y complicado. Un "problema complicado" es aquel que contiene miles de subproblemas. Lo complicado es difícil de manejar. El problema se vuelve complejo cuando logras organizar esos subproblemas en "categorías". El cerebro logra manejar mejor las cosas al categorizarlas.

Es una buena práctica entonces que, después de encontrar esos "subproblemas", los categorices o agrupes (es como partir un evento en varias páginas xD, o una clase de scripting en subclases y clases parientes, así como métodos y sdasdsadsad).

No tenia ese concepto en mente. Pero si, en general, esto se produce de forma natural, ya que uno no divide 1 problema en 1000 sub-problemas en una sola "pasada". Si no que se hace como un árbol.
Dividís un problema en varios subproblemas, y cada subproblema en otros subproblemas, y así. De esta forma ya de por si se arma una especie de "categoría natural".
De cualquier forma, muchas veces esta "categoría natural" no es la mas eficiente, y siempre se pueden reorganizar las cosas para que queden lo mejor posible.


De verdad si recomendaria que todos leyeramos este tema... por que a mi me ayudo de paso ayuda a que los que seamos nuevos y no tan nuevos no nos dejemos intimidar por problemas que si bien no podemos resolver en un dia al siguiente se puede... Magnifico tema metalero de verdad...

Ese es el espíritu! :)


Me alegro que les haya gustado el post, y hayan aprendido algo útil

_________________
avatar
Metalero
Administrador
Administrador



Créditos 1715

Gracias : 98

Volver arriba Ir abajo

Re: Resolución de Problemas

Mensaje por comgerde05 el 2013-11-28, 16:44

Excelente post, me ha ayudado mucho, ya que llevo unas 2 semanas con el RPG Maker y he tenido muchas frustraciones y este post me ayudado a organizar mis ideas. Gracias Metalero.
avatar
comgerde05
Principiante
Principiante

0/3

Créditos 653

Gracias : 31

http://vision-comgerde.blogspot.com/

Volver arriba Ir abajo

Re: Resolución de Problemas

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


Permisos de este foro:
No puedes responder a temas en este foro.