de diseño de un sistema concurrente con cierta orientación a la Erlang, pero
que bien puede abstraerse lo suficiente como para pensarlas desligándose
de cualquier implementación, en principio.
- La primera pregunta es qué procesos estarán manteniendo en sí al sistema, en cuanto activos participantes del mismo bajo (presumiblemente) todas las circunstancias de desarrollo del mismo. Una identificación adecuada de los actores principales y de sus actividades o tareas asociadas hará que el sistema se encamine hacia el objetivo que pretende satisfacer (a propósito utilicé una terminología cercana a UML, pero sin demasiado apego: la idea es que un formalismo que permita el tratamiento concurrente de varios actores será de gran utilidad; en Erlang tales posibles actores serían "procesos").
- La siguiente parte bien puede llamarse una "coreografía": es un término común en el manejo del flujo de tareas (workflow), y en nuestro caso se traduce en determinar en qué momento los procesos entran en juego o dejan de tener preponderancia; es también un buen momento de pensar en la concurrencia entre procesos, para de esta manera armonizar en la medida de lo posible qué procesos harán una buena intervención para el logro del objetivo global. A diferencia del caso secuencial, no obstante, aquí la gran dificultad es que es complicado preveer todas las posibles formas en que el sistema podría desarrollarse, además de considerar (o no) las posibles trampas en que se podrían caer si se es demasiado optimista en el buen desarrollo del sistema sin mayores análisis.
- Lo siguiente sería el establecimiento de los "diálogos": a diferencia de lo que sería una puesta en escena (para seguir con la analogía teatral), aquí se espera que la comunicación entre los procesos no sea tan fija ni tan improvisada: no es tan fija en el sentido de que las mismas condiciones de desarrollo del sistema bien pueden necesitar "improvisaciones", que corresponde, aproximandamente, a una nula participación de los seres humanos y una confianza sana en que algunos obstáculos seran sorteados por las mismas capacidades de comunicación de los procesos; también, no puede ser tan improsivada ya que los diálogos deberían establecerse con los componentes de un conjunto bien definido de mensajes, cada mensaje manteniendo en su estructuración un protocolo, tema que sigue.
- Los protocolos de comunicación entre procesos deben seguirse en todo lo posible: reivindicando el punto 3, pensaríamos que existen realmente diálogos (y no monólogos) para que los procesos en comunicación tengan éxito en comunicarse, manteniendo la mismo tiempo una suerte de disciplina que se expresa en aquello que pueden comunicar y en aquello otro que pueden recibir como mensaje. Aún suponiendo que los mensajes se envíen y se reciban exitosamente (por al menos dos procesos) es necesario que haya filtros (guardias, guards, en inglés) para que solo aquellos mensajes filtrados sean procesados; en ocasiones los guardias son explícitos (con, por ejemplo, la condicional diferida when, como en el caso de probar que un número sea mayor que 0, o bien pueden ser implícitos, cuando el mecanismo de "pattern matching" (presente en algunos lenguajes de programación funcionales) permite que solo aquellos mensajes que casen con un patrón sean procesados.
- Aunque no es buena idea suponer que nuestra herramienta estará tratando todas las posibilidades sin más es, no obstante, una buena decisión de diseño pensar que algunos tópicos sí están resueltos (al menos en esta etapa); tal es el caso del manejo de los mailbox (buzones) que cada proceso en Erlang posee: los buzones siguen una política de agenda de tratamiento de mensajes de tipo cola; si tal esquema es suficiente está bien; si no, pues es posible programar otros esquemas (por ejemplo, de colas de prioridad) para satisfacer algunas necesidades específicas.
- La parte de sincronía o asincronía debe resolverse cuanto antes. Erlang toma un punto de vista natural asíncrono, pero en ocasiones una sincronía es necesaria. Notando el programa previo en este blog, se quiso realizar una asincronía entre los trabajadores limpiadores y el gestor, pero no fue prudente: los trabajadores que completen su tarea tienen que reportarlo al gestor, y éste haría mal (el sistema fallaría) si no hiciera caso del estado actual de sus trabajadores, tomando compromisos de clientes si ton ni son al no percatarse de qué pueden y no pueden hacer sus trabajadores.
- Es de notar que en épocas recientes el adjetivo de "inteligente" abunda: aún en una etapa de modelación, es necesario considerar qué tareas pueden realizarse con algunas medidas (métricas) de éxito, para de esa forma tomar aquella opción que o sea óptima o se acerque lo más posible a tal optimalidad. El gran obstáculo al momento para el caso de los sistemas concurrentes es que su desarrollo puede ser imprevisible y no estar preparado para tomar una buena decisión de optimalidad, pero aún así es obligatorio por parte del arquitecto o diseñador considerar que tópicos comunes en el campo de inteligencia artificial pueden ser válidos aquí: por ejemplo, la idea de dividir y vencer, o bien de otorgar una medida (heurística) a la manera en cómo se ejecuta una tarea concurrentemente.