Category Archives: Tecnología

Publicaciones sobre Redes de datos, Computadores o Desarrollo de software.

El mundo desde el punto de vista de las redes

Hay un libro que expone de forma resumida los conceptos fundamentales sobre el concepto general de redes (como se estudian en teoría de la complejidad): “NETWORKS, A very Short Introduction” de Caldarelli G. y Catanzaro M. de Oxford University Press. 2012.  A continuación presento una traducción del primer capítulo como una invitación a leerlo completo.

Las redes están presentes en la vida diaria de muchas personas. En un día típico, revisamos el correo electrónico, actualizamos los perfiles de las redes sociales, realizamos llamadas mediante teléfonos móviles, usamos el transporte público, viajamos en avión, hacemos transferencias financieras o iniciamos nuevas relaciones profesionales y personales… En todos estos casos –de forma consciente o no- estamos utilizando redes y sus propiedades. De igual forma, las redes aparecen en importantes fenómenos globales. Las crisis financieras generan efectos dominó en la red de conexiones entre la banca y las empresas. Pandemias –como la gripe aviar, SARS o la gripe porcina- se esparcen en la red aeroportuaria. El cambio climático puede alterar la red de relaciones entre las especies en los ecosistemas. El terrorismo y la guerra eligen como blanco la red de infraestructura de un país. Los apagones a gran escala ocurren en redes de distribución de potencia eléctrica. Los virus de computador se esparcen en Internet. Los gobiernos y las compañías pueden hacer seguimiento de la identidad de las personas a través de sus redes sociales y otras herramientas de comunicación digital. Finalmente, las diversas aplicaciones genéticas dependen del conocimiento de las redes que regulan la genética dentro de la célula.

En todas estas situaciones trabajamos con un conjunto grande de diferentes elementos (individuos, compañías, aeropuertos, especies, estaciones eléctricas, computadores, genes…), conectados mediante un patrón desordenado de muchas, y diferentes, interacciones: es decir, todas tienen una estructura de red subyacente. A menudo, esta red oculta es la clave para entender dichas situaciones.

cod_sealUn ejemplo interesante es la reducción de la población de bacalaos en el atlántico noroccidental en la década de 1980. En aquel momento, la escasez de bacalao generó una crisis económica masiva en la industria pesquera de Canadá. Los afectados reclamaban más expediciones para cazar focas, argumentando que al controlar la especie depredadora del bacalao podía detenerse el colapso. Una gran cantidad de focas fueron exterminadas en la década de 1990 pero la población de bacalaos no se pudo recuperar. Durante ese periodo, los ecologistas estudiaron las diferentes cadenas alimenticias que interconectaban las focas y los bacalaos. Al final de la década bosquejaron un mapa completo donde se habían identificado un buen número de diferentes cadenas alimenticias que conectaban las dos especies. A la luz de este complejo dibujo, la caza de las especies predadoras no ayudaba a la recuperación de la población de bacalaos. En el grafo se alcanza a observar que las focas se alimentan de aproximadamente 150 especies diferentes y, además, algunas de ellas son predadoras del bacalao: de esta forma, al reducir la población de focas se  incrementó la cantidad de otros predadores del bacalao.

cod_seal_web222
Grafo parcial representando las cadenas alimenticias en el atlántico noroccidental (Imagen original de David Lavigne).

Los ecosistemas son redes complejas de especies: es crucial tener en cuenta la estructura de red subyacente si deseamos entenderlos y administrarlos. Precauciones similares deben ser tenidas en cuenta con otros tipos de sistemas  basados en arquitecturas en red. Por ejemplo, el contagio de una enfermedad como el SIDA está fuertemente influenciado por el patrón de relaciones sexuales sin protección dentro de una población. De igual forma, las crisis de liquidez financiera dependen del tejido de la red de intercambio de dinero entre los bancos.

Todos los ejemplos presentados antes son casos de fenómenos emergentes. Es decir, algún comportamiento colectivo que no puede ser predicho al observar los elementos individuales que conforman el sistema. Normalmente, los sistemas que despliegan este comportamiento se les da el apelativo de sistemas complejos. Por ejemplo, una hormiga sola es un animal relativamente torpe, pero muchas hormigas juntas son capaces de actividades tan complejas como construir grandes hormigueros o almacenar grandes cantidades de comida. En las sociedades humanas, el orden social surge a partir de la combinación de sujetos autónomos, en ocasiones con conflictos de intereses, donde se termina realizando tareas que ninguno podría hacer de forma individual. De igual forma, un organismo vivo depende de la interacción de sus partes. La extraordinaria capacidad de adaptación que tiene Internet a los errores, los ataques y los picos de tráfico es un comportamiento de la red como un todo antes que el resultado de la acción de máquinas individuales.

james2 james1Las redes, debido a sus énfasis en las interacciones, son la clave para entender muchos de estos fenómenos. Imagine dos equipos de futbol cuyos jugadores tienen destrezas similares, sin embargo los dos equipos tienen desempeños diferentes: es probable que esta diferencia dependa de qué tan buenas o malas son las interacciones entre los jugadores en el campo. Igualmente, un jugador, de forma individual, puede ser bueno en el equipo de la liga local y ser deficiente en la selección de su país debido a la diferencia en las posiciones que tiene con respecto a los otros jugadores en cada equipo. El desempeño de un equipo de futbol es un tipo de fenómeno emergente, pues no depende únicamente de la calidad del juego de cada jugador ni de la suma lineal de las habilidades individuales, sino que también está supeditado a la red de interacciones entre los jugadores. Muchos fenómenos emergentes dependen de forma crucial de la estructura de las redes subyacentes.

El enfoque de redes concentra toda su atención sobre la estructura global de las interacciones dentro del sistema. Las propiedades detalladas de cada elemento por si mismas sencillamente son ignoradas. En consecuencia, sistemas tan diferentes como una red de computadores, un ecosistema o un grupo social, se describen utilizando la misma herramienta: un grafo, es decir una arquitectura de nodos ligados por conexiones donde se excluyen los detalles. Este enfoque fue originalmente desarrollado en matemáticas por Leonard Euler y luego se difunció a un amplio rango de disciplinas, incluyendo la sociología y más reciente en la física, la ingeniería, ciencias de la computación, biología y muchas otras áreas del conocimiento.

Representar de forma generalizada diferentes sistemas con la misma herramienta solo puede ser realizado mediante un nivel de abstracción alto.

noticia_apagonEsta línea de pensamiento proporciona muchas ideas. Por ejemplo, al representar un sistema como un grafo nos permite percibir estructuras a gran escala que abarcan elementos aparentemente no relacionados. En el año 2003, un accidente insignificante en la red eléctrica de Suiza desencadenó un apagón a gran escala que afectó Sicilia –a 1000 km de distancia-. Al concentrarse en la estructura de red se puede apreciar que existen elementos físicamente distantes que están fuertemente conectados mediante relaciones o comunicaciones con trayectorias increíblemente cortas. La observación actual que dos personas geográfica y socialmente distantes –como un habitante en un bosque tropical y un ejecutivo en la ciudad de Londres- están conectados solo por ‘seis grados de separación’ no está lejos de la realidad y puede ser explicado en términos de la estructura de red de las relaciones sociales.

El enfoque de redes también aclara otra característica importante: el hecho que ciertos sistemas que crecen sin control externo sean aún capaces de desarrollar espontáneamente un orden interno. Las células o los ecosistemas no son sistemas ‘diseñados’, sin embargo funcionan de forma robusta. De forma similar, los grupos sociales y las tendencias dependen de una inmensa variedad de diferentes presiones y motivaciones, no obstante exhiben formas claras y definidas. El auge de Internet y del servicio WWW (world wide web) se dio sin la presencia de una autoridad regulatoria y fue promovido por una gran variedad de agentes no relacionados: aún así, trabajaban de una forma coherente y eficiente. Todos estos son procesos auto-organizados, es decir, fenómenos en los cuales el orden y la organización no son el resultado de una intervención externa o de un plan de acción global sino el resultado de mecanismos o tendencias locales, iteradas a través de miles de interacciones. Los modelos de red son capaces de describir de manera clara y natural la forma como aparece la auto-organización  en muchos sistemas. Las redes permiten entender mejor los procesos dinámicos como, por ejemplo, la rapidez de contaminación de los virus de los computadores, la gran escala de la de las pandemias, el colapso repentino de las infraestructuras y el crecimiento abrupto de las fobias sociales o las tendencias musicales.

trafficEn el estudio de sistemas complejos emergentes auto-organizados (la moderna ciencia de la complejidad), las redes están convirtiéndose gradualmente en un importante marco de referencia matemático, especialmente cuando están involucrados grandes volúmenes de datos. Este es el caso típico de la acumulación de consultas individuales en motores de búsqueda, actualizaciones en sitios web de redes sociales, pagos en línea, datos de tarjetas de crédito, transacciones financieras, posicionamiento GPS desde teléfonos móviles, etcétera. En todas estas situaciones las redes son instrumentos cruciales para clasificar y organizar estos datos, conectar individuos, productos, noticias, etcétera. De igual forma, la biología molecular depende más y más de estrategias computacionales para encontrar orden en la gran cantidad de datos que produce. Lo mismo ocurre en muchos otros campos de la ciencia, tecnología, ciencias de la salud, ciencias del medio ambiente y la sociedad. En todos ellos, las redes se están convirtiendo en el paradigma para descubrir la arquitectura oculta de la complejidad.

Máxima número uno de Gary A. Donahue

A continuación presento una de las tres máximas de Gary A. Donahue, el autor de un libro llamado Network Warrior, que recomiendo a quien le guste hacer funcionar las cosas. Texto tomado de: “Network Warrior” de Gary A. Donahue. O’Reilly. 2007. Traducción de Oscar Agudelo R.

Durante los años que he estado en la industria [de las redes de datos], ha llegado a ser evidente para mí que hay ciertas fuerzas que rigen el universo IT (Information Technology). Son fuerzas que están presentes en todos los aspectos de la vida, pero su aplicación nunca ha sido más evidente que en IT.

En cualquier situación donde un ingeniero o ingeniera no consigue hacer lo que desea hacer –o aún peor, no consigue hacer lo que en su opinión profesional considera es lo correcto- estas fuerzas entran en juego. Creo que si más personas entienden estas fuerzas, se tendrían menos conflictos entre los ingenieros y sus superiores.

Las fuerzas que gobiernan el diseño de las redes de datos son:

  • Política
  • Dinero
  • La forma correcta de hacer las cosas
Máxima #1 de GAD: Los diseños de redes de datos están basados en política, dinero y “la forma correcta de hacer las cosas”, en ese orden.

Relación Política - Dinero - Forma correcta de hacer las cosas

La idea es muy simple. Los ingenieros desean hacer las cosas de la forma correcta, que normalmente es considerada la mejor práctica. Para hacer las cosas de manera correcta se requiere dinero. Para conseguir dinero alguien tendrá que ser experto en política. Para decirlo de otra forma: si usted desea hacer las cosas de forma correcta, necesita dinero, y la única forma de conseguir dinero es a través de la política. Puedo escuchar sus voces en mi mente mientras leen esto, refunfuñando: “Odio la política”. La verdad es que usted no odia la política, usted odia la política sucia. Y son dos cosas diferentes.

Miremos de cerca estos tres elementos y cómo ellos se interrelacionan.

Política: La política no solo tiene que ver con que el presidente haga campaña para juntar votos o que el vicepresidente contrate a su hermano antes que a la mejor persona para el trabajo. La política es, entre otras cosas, intrigar o manipular dentro de un grupo o unidad política para tener control o poder. Un grupo son dos o más personas. Cualquier conversación que usted tenga con otra persona es política de algún modo. Cuando saluda a alguien, su actitud y su comportamiento ayudan a que esa persona se forme una opinión de usted. Eso es Política. Si usted tiene la mejor idea del mundo que no ha sido imaginada antes y va donde su jefe para que le ayude a conseguir los fondos, cómo podría conseguirlo si el día anterior usted le dijo “retrasado mental”? ¿Actuaría políticamente su jefe si lo rechaza? Quizá usted esté siendo político cuando lo agrede con insultos. El punto es que en cualquier momento que dos personas estén en una habitación, la política entra en juego. Si usted tiene una reputación de ser una persona difícil, cuando usted solicite algo, eso será considerado (consciente o inconscientemente). Si por el contrario, tiene una reputación de ser una persona sensata y con quien es agradable trabajar, esto estará a su favor.

Ahora que usted entiende que la política no siempre es algo malo, revisemos como puede afectarlo. Ya se estableció que sin política no habrá dinero, pero ¿qué significa realmente esta frase? Un ejemplo. Una compañía de tamaño medio está considerando tener una nueva red de datos y el vicepresidente de IT, quien fue un desarrollador de software durante su vida laboral antes de conseguir estar en un cargo directivo, está a cargo del proyecto. Como líder técnico, usted propone un diseño completamente tolerante a fallas compuesto por equipo de redes cuyo valor asciende a US$2’000.000,oo que requerirá seis meses de trabajo para que sea instalado. El plan es perfecto. Usted conoce cada detalle del hardware y como funcionará impecablemente. Será una obra maestra.

El vicepresidente mira su propuesta y sencillamente dice: “es demasiado costoso y toma demasiado tiempo para instalarse y ponerse a punto, el presupuesto es sólo de 1 millón para equipo y consultoría.” Usted siente que el abdomen se le contrae y se queda sin aire. Su respuesta inmediata puede ser una frase como “pero eso es lo que necesitamos” o “pero no se puede hacer menos que eso.”
Esto es Política. El vicepresidente puede tener el poder de conseguir los fondos adicionales. De hecho, eso es lo que los vicepresidentes saben hacer mejor. Si usted puede explicar al vicepresidente todos los beneficios del diseño y por qué usted considera que los 2 millones en hardware serán bien invertidos, él/ella puede escuchar.

Mejor aún, si usted puede explicar cómo la compañía conseguirá el retorno de la inversión en sólo seis meses gracias a su diseño, usted tendrá la oportunidad de pelearlo. Si por el contrario usted se enfada y se queja sobre cómo la empresa está mal administrada y sólo cuida el dinero y cómo el vicepresidente no entiende de tecnología, el vicepresidente probablemente pensará que usted no entiende la realidad y que es incapaz de trabajar con restricciones reales. No importa quien esté equivocado, de cualquier modo usted no conseguirá el presupuesto que solicitó. Esto sucede cada día alrededor de todo el mundo.

Otra noticia importante: Si usted va a presentar sus ideas al vicepresidente y espera ganar su respeto y respaldo, necesita aprender a jugar en su campo. Gústele o no, ellos tienen el dinero, el poder y la influencia. Si usted no sabe que es un ROI o cómo hablar sobre la depreciación de los equipos no espere que el vicepresidente la dé más dinero.

Dinero: Dinero es lo que todos deseamos [nota: recordemos que el autor es como gringo]. Como ya se dijo, usted necesita entender de política para conseguir el dinero que usted desea o necesita. No hay forma de esquivarlo. Si usted está consiguiendo dinero y no está involucrado en lo político, alguien debe estar apoyándolo detrás de escena. Si no hay suficiente dinero, no tendrá oportunidad de hacer lo que usted desea (es decir, hacer las cosas de la forma correcta).

La forma correcta de hacer las cosas: Esta es la meta que el ingeniero/a busca alcanzar. “las cosas” es cualquier evento que ocurra y con el que se debe trabajar durante cierto tiempo. Los ingenieros saben cuál es “la forma correcta de hacerlas” y frecuentemente se ven frustrados/as porque no se les permite hacer “las cosas” en “la forma correcta”. Si no desea jugar el juego, mi consejo en este caso es: “supérelo”. Simplemente no podrá hacer las cosas de la forma correcta sin dinero y no conseguirá el dinero que necesita sin política.

Si su empresa está corta de dinero, usted está sin suerte. Si su empresa está en mitad de una confusión política que no permite que se consiga el dinero o la aprobación, usted está sin suerte. Si usted desea cambiar las cosas, aprenda política. Es así de simple.

La ciudad de Königsberg y el estudio de las redes

En 1736, el matemático Leonhard Euler (1707–1783) se interesó por un problema que hacía referencia a los siete puentes que permitían visitar los distritos de la ciudad de Königsberg (‘Montaña del Rey’, en alemán). En aquella época la ciudad de Königsberg aún existía. Estaba construida a orillas del río Pregel sobre dos islas que se encontraban en el centro de la corriente del río. Por muchos siglos Königsberg perteneció a Prusia, corazón de la Alemania imperial; sin embargo, al finalizar la II Guerra Mundial, Prusia fue literalmente destrozada y arrasada por los soviéticos;  los soviéticos construyeron una ciudad nueva sobre las ruinas de Königsberg llamada Kaliningrado.

El problema de los siete puentes de Königsberg

puentes
Figura 1. Los puentes de la ciudad de Könisberg

En la Figura 1. se muestran los distritos de la ciudad de Königsberg como A, B, C y D y los puentes como a, b, c, d, e, f y g. La pregunta que se hacían en aquella época los ciudadanos de Königsberg era ¿es posible hacer una caminata que inicie en cualquier punto de la ciudad, cruzando cada puente exactamente una vez y regresando al punto de partida? (Si no había visto éste problema antes, considere dedicarle un momento para buscar la respuesta por su cuenta. Informalmente no es difícil llegar a la conclusión que el camino propuesto en el planteamiento del problema no existe, sin embargo, probar esto formalmente es más difícil.)

Intentemos encontrar el recorrido circular solicitado, comenzando -por ejemplo- en A. La primera vez, cuando regresemos a A,  hemos utilizado dos de los cinco puentes conectados con A. La siguiente vez que regresemos a A hemos utilizado cuatro puentes. En este momento debemos abandonar A utilizando el quinto puente, pero ya no existe posibilidad de regresar al punto A sin utilizar uno de los cinco puentes por segunda vez. Esto permite ver que el problema planteado para los puentes de la ciudad de Königsberg no tiene solución. Utilizando un análisis similar, se puede ver que también es imposible encontrar algún recorrido, no necesariamente circular (un recorrido que puede terminar en un punto diferente al que se inició), que utilice cada puente sólo una vez.

Leonhard Euler y el nacimiento de la teoría de grafos

Lo que Euler hizo con base en el problema de los siete puentes de Königsberg iba más allá de solucionar el popular problema. Su artículo, titulado Solutio problematis ad geometriam situs pertinentis (Sobre la solución de un problema relacionado con la geometría de posición) de algún modo marcó el nacimiento de lo que hoy llamamos teoría de grafos, una rama de las matemáticas discretas que en los últimos tres siglos se ha convertido en el principal lenguaje matemático para describir las propiedades de las redes en general.

Después de describir el popular problema de los puentes, Euler presentó su trabajo con las siguientes palabras (aproximadamente): Con base en el planteamiento expuesto, formulo el siguiente problema general: dada cualquier configuración del río y las ramificaciones en las que pueda dividirse y cualquier cantidad de puentes, determinar si es o no posible cruzar cada puente exactamente una vez. Euler se dió cuenta que la forma exacta de las orillas o de las islas no era importante, la solución al problema dependía sólo de las propiedades de la conexión entre los distritos.

La solución que se presenta en la actualidad, que quizá ahora pueda parecer sencilla, no era obvia en el siglo XVIII pues utiliza un grafo. Un grafo es un objeto matemático que consta de un conjunto de nodos (llamados también puntos o vértices) y un conjunto de arcos que muestran la relación entre los nodos (los arcos también reciben el nombre de líneas, enlaces o aristas). La Figura 2. muestra un grafo que representa el problema de los puentes de Königsberg. Utiliza cuatro nodos representando los distritos y siete arcos que representan los puentes que los interconectan (este tipo de gráfico nunca lo utilizó Euler).

puentes2
Figura 2. Grafo de Könisberg

Grado, camino, sendero, trayecto, ciclo y otros conceptos

[La terminología de la teoría de grafos aún no es universal, por esto los nombres presentados a continuación pueden ser diferentes a los que usted ya conoce para el mismo concepto.]

El número de arcos que “tocan” un nodo es llamado el grado del nodo. Por ejemplo, en el grafo de Königsberg, el nodo A tiene grado cinco, pues cinco arcos -cinco puentes- tocan dicho nodo.

Dependiendo de la forma en que se recorra un grafo, la secuencia de arcos y nodos visitados recibe un nombre diferente. Puede ser un camino (walk), un camino cerrado (closed walk), un sendero (trail), un sendero cerrado (closed trail), un trayecto (path) o un ciclo (cycle).

  • Camino: Si se sigue una secuencia de arcos en un grafo que permiten visitar los nodos sin importar dónde se inició el paseo y donde terminó o si se dejó de visitar algún nodo o algún arco o si se pasó varias veces por el mismo nodo o arco, la secuencia recibe el nombre de camino (walk).
  • Camino cerrado: Si se sigue una secuencia de arcos en un grafo que permiten visitar los nodos garantizando que el paseo inicia y termina en el mismo nodo, pero sin importar si se dejó de visitar algún nodo o algún arco o si se pasó varias veces por el mismo nodo o arco, la secuencia recibe el nombre de camino cerrado (closed walk).
  • Sendero: Si se sigue una secuencia de arcos en un grafo que permiten visitar los nodos sin importar dónde se inició el paseo y donde terminó o si se dejó de visitar algún nodo o si se pasó varias veces por el mismo nodo, pero se garantiza que cada arco se visita una sola vez, la secuencia recibe el nombre de sendero (trail).
  • Sendero cerrado: Si se sigue una secuencia de arcos en un grafo que permiten visitar los nodos garantizando que el paseo inicia y termina en el mismo nodo y que cada arco se visita una sola vez, pero sin importar si se dejó de visitar algún nodo o si se pasó varias veces por el mismo nodo, la secuencia recibe el nombre de sendero cerrado (closed trail).
  • Trayecto: es un sendero (secuencia de arcos diferentes sin importar dónde se inició el paseo y donde terminó) que visita cada nodo solamente una vez.
  • Ciclo: En un grafo con tres o más nodos, un ciclo es un sendero cerrado (secuencia de arcos diferentes garantizando que el paseo inicia y termina en el mismo nodo) que visita cada nodo solamente una vez.
grafo3
Figura 3. Grafo para ejemplos de tipos de recorrido

Por ejemplo, en la figura 3, si se visitan los nodos (A, B, C, E, B, C) el recorrido es un camino (walk), pero no es un sendero (trail) ya que el arco que interconecta B con C se visita dos veces. Si se visitan los nodos (A, B, C, E, B, D) el recorrido hecho es un sendero (trail) pues cada arco del recorrido se visita sólo una vez pero no es un trayecto (path) ya que el nodo B se visita más de una vez.  Si se recorren los nodos (A,B,C,E,B,D,A) se tiene un sendero cerrado (closed trail) pues inicia y termina en el mismo nodo pero no se tiene un ciclo (cycle) ya que el nodo B se visita más de una vez. Finalmente, el recorrido (A, B, C, F, E, D, A) es un ciclo (cycle).

Un sendero de Euler pasa por todos los nodos visitando cada arco una sola vez y un tour de Euler es un sendero de Euler que además de pasar por todos los nodos visitando cada arco una sola vez, inicia y termina en el mismo nodo. Estos dos conceptos fueron estudiados por Euler al resolver el problema de los puentes de Königsberg (aunque él no utilizó esos nombres para los conceptos).

La solución de Euler

Ahora, el problema planteado podemos enunciarlo como:

Dado un grafo, ¿es posible determinar si tiene un sendero cerrado? Es decir, dado un grafo cualquiera ¿Es posible determinar si el grafo se puede recorrer iniciando y terminando en el mismo nodo visitando cada arco exactamente una vez?

Euler probó que una condición necesaria para la existencia del tour de Euler es que todos los nodos en el grafo sean de grado par, y estableció -sin prueba- que un grafo cuyos nodos sean de grado par tendrá un tour de Euler. La primera prueba completa de esta última afirmación -realizada por Carl Hierholzer- fue publicada hasta 1873.

Para garantizar la existencia de senderos de Euler, máximo dos nodos pueden tener grado impar (los demás deben ser de grado par). Si todos los nodos son de grado par y no hay nodos de grado impar, todos los senderos de Euler son tour de Euler. Si hay exactamente dos nodos de grado impar, los posibles senderos inician en uno de ellos y terminan en el otro. En ocasiones un grafo que tiene un sendero de Euler pero no tienen un tour de Euler es llamado semi-Euleriano.

El problema de la existencia de los senderos de Euler y de los tour de Euler en las redes -al igual que el problema relacionado de los trayectos Hamiltonianos y los ciclos Hamiltonianos (trayectos que visitan cada nodo exactamente una vez)- son aún de gran interés para los matemáticos.

El artículo de Euler de 1736 (que realmente fue publicado hasta 1741) sobre el problema de los puentes de Königsberg es visto como la primera gran contribución a la teoría de grafos -aunque la solución de Euler nunca menciona los grafos-. El artículo The Truth about Königsberg de Brian Hopkins y Robin J. Wilson presenta el contexto histórico de la solución de Euler, muestra el método de solución utilizado, describe la “geometría de posición” y hace un breve seguimiento hasta la actualidad.

La teoría de grafos y el estudio de las redes

En su forma más simple, una red no es más que un conjunto de elementos discretos (los nodos) y un conjunto de conexiones (los arcos) que enlazan los elementos. Los elementos y sus conexiones pueden ser cualquier cosa – personas y sus vínculos de amistad, computadores y sus enlaces de comunicaciones, páginas web y sus hiper-enlaces, compuestos químicos y sus reacciones, artículos científicos y sus citas por otros autores, etcétera.

La teoría de grafos es muy poderosa, pues al abstraer los detalles de un problema es capaz de describir importantes características topológicas con una claridad que sería imposible si se conservaran todos los detalles del problema. Esta teoría, nacida a partir del problema de los sietes puentes de la ciudad de Königsberg, es muy importante en el estudio de la redes y, en consecuencia, para todas las personas interesadas en este tema.

Referencias

Newman, Barabási, Watts. The Structure and Dynamics of Networks. 2006. Princeton University Press.

Jungnickel, D.  Graphs, Networks and Algorithms. 2007. Springer-Verlag.

Luccio, Pagli, Steel. Mathematical and Algorithmic Foundations of the Internet. 2011. CRC Press

Desarrollo [de software] gobernado por humanos

El siguiente texto es una traducción [un tanto libre] del capítulo Human Driven Development,  del libro Conscious Software Development de Jeff McKenna.

Lo relacionado con el software es hard

Si usted es un desarrollador joven, es probable que acostumbre trabajar solo en un computador. Tal vez disfrute resolviendo problemas por su cuenta. Muchos de nosotros en el negocio del software iniciamos nuestras carreras trabajando aislados y nos gusta.

Pero si vamos a resolver problemas en un contexto comercial, entonces tendremos que aprender a disfrutar trabajar con otros.

Los sistemas complejos como el software solo pueden ser diseñados y desarrollados por varias personas trabajando juntas para resolver problemas, obligándolas a comunicarse entre ellas – no solo con el computador. Este es un mensaje importante del desarrollo de software ágil que dice: “Podemos hacer más si trabajamos como un equipo.”

¿Pero qué significa esto para usted como individuo? ¿Significa que tiene que cambiar su forma de ser? ¿Que ahora usted debe actuar diferente? ¡Es probable que así sea!

¿Significa que usted tiene que aprender de una forma diferente? Nuevamente la respuesta es: ¡Es probable que así sea!

¿Cómo puede lograr esto? Siendo consciente sobre la forma en que usted trabaja, pensando acerca de sus procesos y los procesos de su equipo de trabajo – y no solo sobre los procesos del computador.

Muy temprano en mi carrera profesional, el computador era la pieza central. Nada mejor que ir solamente por el problema y resolverlo.

Como desarrolladores, estamos inclinados de forma natural a hacer cualquier cosa por nuestra cuenta. Sentados frente a la máquina, encendemos nuestro sistema, tecleamos el trabajo y lo enviamos. Las primeras manifestaciones de problemas aparecen cuando alguien lee la documentación o el código y encuentra errores simples, cosas como palabras que hacen falta o excepciones ausentes.

Si los errores tipográficos y los fallos en la codificación fueran el único efecto dañino de trabajar en solitario, no sería un gran problema. Pero trabajando junto a otras personas es algo que está más allá de simples errores de omisión. El punto más crítico es que cuando trabajamos solos perdemos la oportunidad de ayudarnos unos a otros y de mejorar en lo que hacemos.

Buscando un contrato de consultoría, envié una de mis primeras propuestas a un gerente de proyectos de software quien le dio una ojeada y me hizo tres preguntas. Respondí las dos primeras sin problemas, pero fallé en la tercera – había pasado por alto un defecto de diseño muy simple y, en un abrir y cerrar de ojos, se terminó. No conseguí el contrato.

Ese momento fue un despertar para mí. Aprendí que el hecho de trabajar en algo y creer que se hizo bien no significa que esté bien hecho. Aprendí que necesitaba ayuda, y no solo cuando aparece un problema, sino durante todo el camino. Cuando usted va solo, puede cometer los errores más tontos.

Fue el primer indicio que tuve al respecto. “Un momento, esto de ser Llanero Solitario no va a funcionar.”

elefante2Aprendiendo a aprender

Así que ahora aparecen las preguntas, ¿Cómo aprendo cómo aprender en este nuevo mundo? Para resolverlo, tengo que entender cómo aprendo yo. Esto aplica para usted – usted tiene que entender cómo aprende.

¿Lee libros?

¿Habla con otras personas?

¿Primero debe intentarlo en la práctica y luego lee sobre el tema?

¿Qué funciona para usted? ¿Qué se le dificulta?

Lo difícil está bien, si esto es efectivo. Lo fácil también está bien.

Yo se que aprendo mejor leyendo. Si necesito aprender un nuevo lenguaje, comienzo leyendo el manual completo y luego resuelvo algunos problemas usando el lenguaje. He aprendido que si solo me sumerjo en resolver problemas con una nueva tecnología sin un panorama; sin una imagen global, como la que se obtiene leyendo primero un manual, me costará mucho.

Esto lo aprendí probando los dos métodos. Identifiqué mi mejor modo de aprender a través de ensayo y error. El suyo es diferente al mio. ¿Cuál es?

Los académicos y los teóricos pueden decirle un montón de cosas sobre la forma en que las personas aprenden, y si usted está interesado en el estudio del aprendizaje, entonces no lo dude y estúdielo. Pero al final lo que importa es comprender cómo aprende usted y la única forma de hacerlo es ensayar métodos y después mirar de manera honesta los resultados.

Además de leer, me gusta aprender interactuando con otras personas, por esta razón programar en parejas es una práctica maravillosa para mi, no solo porque se elabora mejor código, sino porque se aprende muchísimo.

elefante3 elefante3

Analice como aprendió las cosas que conoce mejor

¿Cómo aprendió, por ejemplo, a juzgar si un diseño es bueno o malo? Si usted es precipitado, su repuesta podría ser, “¡Pues, hermanito, solo lo codifico y si funciona, entonces para mí es un buen diseño!

Bien, eso no será suficiente hoy en día. Usted necesita tener un proceso establecido que le permita explorar ideas alternativas antes de comenzar a codificar.

Yo necesito imágenes cuando hablo sobre diseño; las palabras no son suficientes. Sin imágenes, se que no puedo saber realmente cuál es el diseño. Me tomó mucho tiempo darme cuenta que esto me ocurría. Construí una de las primeras herramientas de modelamiento gráfico sin haber hecho algún modelamiento -pues yo no conocía algo mejor. Irónico ¿cierto?

Luego conseguí un trabajo en otro lugar utilizando esta misma herramienta de modelamiento para hablar sobre diseño. La compañía que me contrató deseaba explorar a profundidad el problema de diseño que estábamos enfrentando, y utilizamos la herramienta para hacerlo.

El bombillo se encendió para mi. Me di cuenta de la cantidad de formas en que se puede hablar de un problema usando algún tipo de lenguaje gráfico. Logré adquirir la habilidad de mirar las cosas de forma diferente y comunicarme con diferentes personas para hablar sobre el tema.

Así que tómese un tiempo, reflexione sobre sí mismo, busque las cosas que le ayudan a aprender mejor y, entonces, haga más de eso. Usted puede encontrar el tiempo, porque escribir código en la actualidad no consume tanto tiempo como antes. Si usted puede tener su base de conocimiento creciendo por delante de otros en su campo, usted se mantendrá haciendo las cosas mejor y mejor.

elefante4 elefante4 elefante4

El panorama general es  el detalle, el detalle es el panorama general

“¿En qué estoy interesado?”

Esa es la pregunta realmente importante.

El desarrollo de software con consciencia  implica mantenerse actualizado consigo mismo, con la tecnología y con su equipo de trabajo.  Esto implica mostrarse y estar disponible a todas las personas y actividades que están alrededor suyo. Por esta razón cuando hablo sobre “aprendizaje” en el contexto del desarrollo de software, no solo estoy hablando de las destrezas técnicas, hablo del aprendizaje que está ocurriendo a su alrededor en este momento, y del aprendizaje que viene y que debe apropiarse.

Uno de mis primeros trabajos en programación fue en Australia en la década de 1960, trabajando para una organización grande dedicada a la investigación. Su cultura exigía que toda persona en la compañía debía dedicar al menos cuatro horas a la semana para aprender cosas nuevas.

Ellos no querían que nosotros nos enfocáramos en aprendizaje incremental: aprender cómo hacer alguna cosa nueva con la tecnología que ya conocíamos y usábamos; ellos deseaban que miráramos más lejos. Así que dedicábamos ese tiempo a aprender y luego reportábamos sobre lo que habíamos aprendido.

Aprender no es sólo sobre mejorar las destrezas y el uso de las herramientas que usted está usando actualmente. No es solo sobre cosas como estas: ¿Cómo puedo ser un mejor programador en Java? Es importante que usted no dedique todo su tiempo a los detalles de su profesión, pues no tendrá tiempo para ver las cosas importantes que vienen hacia usted -y las cosas importantes vienen a usted todo el tiempo.

Las pequeñas cosas es mejor aprenderlas haciendo. Haciendo el trabajo de codificación real y hablando a otros desarrolladores sobre eso, es como aprendí lo pequeño, cosas de nivel muy bajo en lo que necesitaba ser muy bueno -pero también necesitaba ser muy bueno en la visión de alto nivel, y un montón de lo que leo es sobre el panorama general.

Usted necesita aprender a moverse rápidamente entre los detalles y el panorama general -debe estar moviéndose siempre, oscilando entre estos dos mundos.

Trato de mantener mi aprendizaje sobre el panorama general de cosas menos programáticas. Lo hago siguiendo lo que es interesante para mi.  Demasiada información nos envuelve y es fácil perderse y es fácil sentir que se está perdiendo demasiado tiempo vagando entre cosas aparentemente fortuitas que están flotando en el éter, sencillamente porque hay demasiado.

¡Pero es importante perderse!

Es importante que usted haga algo disperso. Esta es la razón por la cual tomar consciencia es una disciplina difícil de dominar -usted podría necesitar perderse ahora para ver con claridad después. Exige que usted confíe mucho en usted mismo y en el universo que le rodea. Pero si los monjes mendicantes pueden hacerlo, ¡usted también puede!

elefante5 elefante5 elefante5 elefante5

¿Por qué es importante tener la mirada en el panorama general?

Una de las características del arte del desarrollo de software es que en la medida que usted sea un mejor desarrollador, más alto es el nivel de abstracción en el cual trabaja.

Esto no significa que usted no pueda enfocarse y ser muy bueno en algún área específica, pero en mi opinión esto no es suficiente para ser un experto en cómo hacer algo. Sin duda yo fui un experto de clase mundial en Smalltalk cuando trabajaba en ese lenguaje. Pero al mismo tiempo estaba interesado en otras cosas.

Cuando Smalltalk pasó de moda el panorama general que yo había construido, mi visión en grande, contribuyó a los principios y prácticas que ahora conocemos como desarrollo de software ágil. Cada etapa de mi carrera ha madurado en las etapas que le antecedieron.

Cuando los conceptos de desarrollo ágil se juntaron por primera vez, todo aquello de vistas de alto nivel y patrones tuvo sentido para mí porque, conociendo la implementación de patrones en Smalltalk, ya había estado estudiando y pensando las cosas en un nivel más alto de abstracción.

Si desea realmente estar consciente sobre lo que usted está haciendo y hacia dónde las cosas se están dirigiendo, sobre el panorama general, entonces dedicará una importante cantidad de tiempo a aprender.

El valor de visualizar el panorama general es que aun cuando usted tenga la mirada sobre el código de algún proyecto, será capaz de percibir la llegada del momento mágico. De repente se dará cuenta y dirá, “un momento, he estado haciendo cosas en las que soy realmente bueno, pero si hago las cosas de esta otra manera ¡puedo triplicar lo que hago! ¡Incluso puedo quintuplicarlo!

Ir a los detalles y conseguir lo mejor de estos detalles en el código, le permitirán mejorar varias decenas de puntos. Pero ¿es esto suficiente? ¿Qué pasa si lo que estamos buscando es mejorar varias centenas de puntos? Al final realmente deseamos mejorar al máximo lo que estamos haciendo, no solo un poco. Las decenas suman, pero las centenas son el verdadero resultado de logros reales.

elefante1 elefante1 elefante1 elefante1 elefante1

¿Cómo pensamos sobre algo de forma diferente?

¿Podemos tomar alguna cosa que alguien más descubrió en otra disciplina y aplicarlo a lo que estamos haciendo, de tal forma que conjuntos enteros de problemas se puedan resolver?  Esta clase de cambio y mejora  exponencial es a lo que nos referimos cuando hablamos sobre aprendizaje.

Para lograrlo, usted debe tener suficiente visión fuera de su pequeña área focal, debe ser capaz de ver estos grandes patrones cuando ellos están ahí, y aplicarlos.

Recuerdo cuando aprendí geometría en bachillerato. Aprendí los teoremas como los demás estudiantes. Podía, de algún modo, resolver problemas aplicando de memoria el “mejor” teorema. Era aburrido. Y tedioso.

También aprendí los principios y las abstracciones. Con esto a mi disposición podía resolver los problemas que me habían asignado aplicando los principios y las abstracciones. Era más difícil pero a la vez era más desafiante: ¿Cómo podía devolverme a las abstracciones fundamentales? Este aprendizaje me ha servido también para el desarrollo de software.

Posteriormente en la universidad volví a revisar problemas de física y seleccioné algunos interesantes para resolverlos con geometría básica, solo para ver como estos campos del conocimiento se relacionaban, atando los cabos sueltos, ejercitándome al alcanzar altos niveles de abstracción en dominios del conocimiento de los cuales no sabía demasiado.

Tuve la oportunidad de asistir a clases dictadas por Richard Feyman en Caltech donde pude mejorar algunas de estas habilidades. Como una muestra de lo que estoy diciendo puede revisar el libro “La conferencia perdida de Feynman” (Feynman’s Lost Lecture). En dicha conferencia él utiliza los conceptos más básicos de geometría y de física para mostrar por qué los planetas se mueven alrededor del sol describiendo trayectorias elípticas. obviamente yo nunca he alcanzado la habilidad de él, pero ayuda a mostrar lo que quiero decir.

En el desarrollo de software el uso de patrones es un ejemplo claro de la utilidad de la abstracción. Entendiendo las fuerzas y las restricciones involucradas permite tener soluciones bien conocidas.

Como desarrollador de software, los conceptos profundos y abstractos se me presentan todo el tiempo, y considero que el aprendizaje a este nivel es increíblemente importante para ser un desarrollador de software con consciencia.