Saludos!
Cada día que pasa aparecen cosas nuevas o, simplemente, conocemos cosas nuevas. En mi caso hace un tiempiecillo que me topé con opensocial. Opensocial define un estandar para crear aplicaciones y eso quiere decir que una aplicación que siga dicho estandar será compatible con cualquier página que respete el estandar.
Hasta aquí parece algo sin gran importancia, pero espera que te cuento más cosas.
En wixet se estaba desarrollando un sistema de widgets (miniaplicaciones). Estos widgets cuentan con su parte php y su parte javascript. Últimamente estaba trabajando en hacer que un widget pueda “acceder” al tronco de la página para hacerlos más potentes (ya no se limitarían a ser un cuadradito en el borde).
Resulta que opensocial ya define todo esto. En concreto la vista en la que estaba trabajando (la que ocupa toda la pantalla) la llaman canvas. Sí, opensocial es justo la idea que yo tenía de cómo tienen que ser lo widgets sólo que ya existe y ademas es un estándar libre. Este es el motivo por el que tengo pensado “pasarme” a los gadgets (así es como llaman a las aplicaciones).
Por supuesto, opensocial aporta mucho más. Solventaría de un plumazo el problemón de permitir hacer aplicaciones a los usuarios ya que opensocial “permite” hacer funcionar aplicaciones que estén en otros servidores (al estilo facebook) y se asegura la confidencialidad de la información gracias a oauth.
El sistema oauth es otra gran baza. Así como el estándar opensocial es el usado por igoogle, oauth es usado por otros muchos “de los grandes” como twitter o facebook. Esto nos permitiría interactuar con información de cualquiera de estos sitios y viceversa de manera coherente y segura.
Otra ventaja es que toda la gente que sepa programar opensocial también podrá hacerlo en wixet (incluso los mismos gadgets servirían). Esto es importante ya que no requiere apenas esfuerzo para quien sabe y quien no sabe es una motivación para aprenderlo (que no sólo sirva para wixet)
Y por último, otra gran ventaja que aporta opensocial frente a nuestro sistema actual de widgets es la portabilidad. Si bien una parte importante de nuestros widges está hecha en javascript (compatible con cualquier navegador) la parte lógica está en php. Esto obliga a usar php sí o sí. Opensocial utiliza javascript (como es evidente) y XML. Claro que XML no es quien realiza el trabajo, “sólo” es la manera de conectar la aplicación (gadget) con el contenedor (wixet, igoogle…). La parte lógica (la que curra) sigue estando en un servidor pero con la ventaja de que puede ser php, java o lo que te de la gana ya que será totalmente transparente.
Y por último, para no liarme más voy a terminar con mi conclusión. Opensocial es punto a punto justo el sistema que yo quería conseguir con los widgets y es libre. Después de mucho tiempo trabajando con este tipo de aplicaciones creo que lo ideal sería adoptar opensocial. Definir un estándar es algo muy complicado (además de la dificultad que tiene que luego se use) y nuestro sistema actual se puede considerar una versión primitiva de opensocial. Entonces, ¿Por qué reinventar la rueda?
Aquí os dejo unos enlaces de interés:
http://code.google.com/intl/es-ES/apis/opensocial/
http://www.opensocial.org/
http://oauth.net/
http://code.google.com/intl/es-ES/apis/gadgets/
2 comentarios en este tema
18. November - 6:18 pm
Me resulta muy interesante de cara a los desarrolladores.El problema es que la integración de este tipo de sistemas hace que, al surgir otra red social que pueda aprovechar los gadgets ya creados, se crea una competencia donde vale la base que ofrece la red social de por sí.
18. November - 10:26 pm
Tienes toda la razón pero solo para los widgets genéricos. Entendamos por widgets genéricos aquellos que no interactuen con el contenedor o que sólo lo hagan con datos básicos. Si tu extiendes la funcionalidad de tu contenedor (wixet en nuestro caso) los demás tendrían que hacer lo mismo si quieren usar tus widgets. O eso o que los demas usen tus servicios.
Un ejemplo sería un gadget para twitter. Eso sí se podría “copiar” porque hace uso de un servicio ajeno a nosotros. Sin embargo, si hacemos un gadget para un sistema de mensajes cortos propio lo que tendrían que hacer los otros es o implementar también ellos ese sistema o usar el nuestro.
Entonces lo que hay que hacer es ofrecer algo más para tener una ventaja competitiva. Pero tampoco es plan de “crearlo todo”. Hay que estar en el término medio, en este caso sería un gadget para twitter + algo.
Esa es mi idea, esté equivocada o no
21. November - 8:52 pm
Realmente cada vez que leía el devenir de tu proyecto, estaba leyendo las bases de OpenSocial:
Redes Sociales + php + javascript + aplicaciones sociales (widget, gadget) + reutilización de diversos estándares abiertos.
La Plataforma Social “OpenSocial”, es una gran evolución de los actuales Servicios Sociales que desarrollan y mantienen los grandes de Internet para dotar de conexión a sus aplicaciones… pero, recuerda, no es ninguna revolución, es más de lo mismo. Para hablar de revoluciones, hay que ir a su homóloga española: la Plataforma Social “TuEntidad.es”.
Creo que deberías adaptar (y no adoptar
) y luego te pusieras en contacto con los desarrolladores de OpenSocial para compartir vuestros avances.
Ah, y recuerda una cosa: que “OpenSocial” lo haga de una forma y “TuEntidad.es” lo haga por otra, no implica que no hagan lo mismo o que sean incompatibles. Al final, los datos relacionados en Redes Sociales no son otra cosa más que datos, por lo tanto, puedes ofrecer acceso a ellos usando una Plataforma u otra, siempre y cuando, sigas la especificación.
21. November - 10:38 pm
Agradezco tu interés, pero mi intención es trabajar en un marco común e integrar wixet en el resto del mundo (y no al revés).
El principal problema que le veo a tu proyecto es que te quieres independizar totalmente de lo ya existente. Está bien que confíes ciegamente en tu trabajo, pero no puedes pedirnos lo mismo a los demás, eso hay que demostrarlo. Es muy difícil (y más aun cuando está
en pañales) pero comprende que para todos lo mejor es lo que hace cada uno. Lo complicado es reconocer que lo que hace el vecino es mejor y adoptar sus ideas.
Creo que la magia del software libre es trabajar en común, coger miguitas del pan de los de alrededor para crear mi propio trozo de pan. En este apartado creo que es donde más discrepamos, tu eres más de la idea de crear tu propio pan (por seguir con la metáfora) desde el diseño de la semilla hasta el tostado del mismo, pasando por la fabricación del horno y toda la industria necesaria para su fabricación.
No estoy diciendo nada que no haya dicho ya así que aquí termino que me enrollo me enrollo…
22. November - 12:11 am
Bueno, intentando ser igual de breve que tú, te respondo:
El problema es “¿cuándo empiezas a confiar en algo?”. Que lo hagan grandes multinacionales no es un motivo consistente, que funcione como se espera no vale… hay bastantes cualidades que deben de ser estudiadas antes de emitir el juicio. Lo que se propone con este otro modelo es poner un punto de partida común, donde se pueda asegurar que todo es objetivamente correcto; la “desdicha” ha sido que ese punto tuvo que ponerse muy muy muy abajo, y, por lo tanto, para los menos escépticos, a partir de ahí todo ha sido “reinventar la rueda”.
Para continuar con la metáfora… lo que se hace desde el Proyecto eWa es no depender de multitud de migas, cada una de su padre y de su madre, sin tener plena garantía de que hacen lo que tienen que hacer, sólo hacen eso, y lo hacen de la mejor forma posible, además, acorde con lo que está ya hecho. Con esta premisa, como ves, es muy complicado encontrar “una miga” que se adapte plenamente al resto del pan; por lo tanto, es mejor implementar directamente esa miga (pudiéndose basar en cómo lo hacen otros) e incluirla dentro del pan. Digamos que una cosa es “el trabajo en equipo” que a ti gusta y otra “herramientas integradas” que es lo que a mí me gusta… o como ya se ha escrito: modelo catedral frente al modelo bazar.
Por lo tanto, yo soy de los que piensa que el pan tiene que ser homogéneo para ser el mejor. Aunque igualmente tiene que ser “libre y modular” para que, si alguien quiere añadirle algo de su cosecha, “pueda hacerlo y lo haga sin complicaciones”.
27. November - 11:04 pm
La respuesta a tu primera pregunta se sencilla. Confío en algo cuando después de mucho tiempo demuestra que merece esa confianza. Open social ya lleva bastante tiempo funcionando. De hecho, en sus comienzos tuvo graves problemas de seguridad que se subsanaron. Ese es otro motivo que genera confianza, que muchos problemas se han corregido. Otro motivo de confianza es mostrar los contras y en la documentación aparecen, como por ejemplo el problema de la escalabilidad. Un sistema basado 100% en ese tipo de gadgets sufirá problemas de escalabilidad a largo plazo y por eso hay que “mezclarlo” con otras cosas (algo que he tenido en cuenta por supuesto). Sin embargo, tu sistema parece ser perfecto.
Puedes pensar que un buen sistema no tiene fallos pero es una de las mayores falacias de la informática. Hay que partir de que todo sistema tiene fallos (nadie es perfecto) y si no los encuentras seguramente sea porque has hecho un proceso de pruebas deficiente y no que el software sea perfecto. Este proceso es extremadamente complejo y nunca tiene fin pero es obvio que un software no puede estar siempre en proceso de pruebas. De ahí que con el tiempo las aplicaciones se van depurando.
El ahorrarte todo ese trabajo (el proceso de pruebas) es motivo más que suficiente como para no “hacer un sistema desde cero” con sus miles de fallos ocultos que nunca sabes cuando se van a manifestar.
Además estamos hablado de un sistema (opensocial) al que miles de personas le buscan las cosquillas con todo tipo de baterías de pruebas tanto de caja blanca como de caja negra o mismamente el uso cotidiano, que ya es un proceso de pruebas (de caja negra concretamente).
Por eso confío en una herramienta, y no por qué lo usen grandes corporaciones. Windows también lo usan grandes corporaciones y sin embargo no es un software en el que confíe especialmente.
Has terminado diciendo “Por lo tanto, yo soy de los que piensa que el pan tiene que ser homogéneo para ser el mejor. Aunque igualmente tiene que ser “libre y modular” para que, si alguien quiere añadirle algo de su cosecha, “pueda hacerlo y lo haga sin complicaciones”
Por favor, eso va en contra de tu pensamiento. Quieres dar la opción de que la gente pueda extender tu sistema pero tu filosofía dice que si quieres hacer algo de calidad, tienes que hacerlo desde cero. Entonces ¿Por qué alguien va a querer añadir algo cuando lo que debería hacer es un sistema nuevo desde cero? Espero que te des cuenta del absurdo (http://es.wikipedia.org/wiki/Absurdo)
Tu forma de ver la informática me recuerda a aquellas grandes aplicaciones monolíticas que terminaron por desembocar en la “Crisis del software” (hecho al que ya he hecho referencia otras veces debido a la semejanza con tu forma de pensar). De ello se aprendió que hay que modularizar las cosas y delegar. Delegar todo lo que se pueda. Yo delego el mantenimiento del leguaje de programación a los desarrolladores de PHP. Es más, también delego la tarea de mantener el framework a symfony. También delego la labor de almacenar los datos a MySQL y así un largo etcétera. Delego en ellos porque confío que lo van a hacer mejor que yo (y de hecho es así) además de que mi vida (ni la de ningún humano) sería los suficientemente larga como para crear todo eso. “Divide y vencerás”, gran frase que todo el mundo conoce y que en informática cobra un significado especial ya que sin ello hoy en día todo aparato electrónico no serviría para más que una calculadora de hacer sumas y restas (http://es.wikipedia.org/wiki/Algoritmo_divide_y_vencer%C3%A1s). Podría detallar más aspecto pero ya es salirse de madre.
Otra frase tuya es “lo que se hace desde el Proyecto eWa es no depender de multitud de migas, cada una de su padre y de su madre, sin tener plena garantía de que hacen lo que tienen que hacer, sólo hacen eso, y lo hacen de la mejor forma posible, además, acorde con lo que está ya hecho.”
), quiero decir que prefiero centrarme en mi software y encargarme de mi pequeña parcelita donde si algo va mal soy capaz de detectarlo. Si me tocaría encargarme del todo, surgirían miles de problemas (inabordables en tiempo) y otros millones ni se detectarían correctamente (los sufrirías cuando la aplicación esté en producción). Este el motivo del por qué una empresa (o cualquier organización) está jerarquizada. Es como si una empresa de 200.000 trabajadores estuviera a cargo de una sóla persona. Imagínate que locura, el director de la empresa dirigiendo directamente a 199.999 trabajadores.
Volvemos a lo de antes. Nadie puede garantizar al 100% nada, nadie. Sin embargo un software puede ofrecer ciertas garantías. De momento ningún software sobre el que delego ha dado fallos (ni mysql, ni php, ni gnu/linux…). Es más, todos los fallos han salido de MI propio sofware lo que me incita a pensar en el desastre que sería si yo tuviera que crear todas esas herramientas. No quiero decir que yo sea un zoquete (aunque eso es relativo
Por supuesto, como dije unos párrafos antes, estoy seguro de que en quien delego lo va a hacer de la mejor manera posible (o por lo menos, mejor que yo) y precisamente ese es el motivo por el que delego. Claro está que si piensas que nadie es capaz de hacer nada mejor que tu (o simplemente hacerlo) sería mala idea delegar nada.
También has dicho “Con esta premisa, como ves, es muy complicado encontrar “una miga” que se adapte plenamente al resto del pan”
Amigo, para eso existen los estándares. Si yo hago un cliente siguiendo un estándar, se que cualquier servidor que respete ese estándar se adaptará al 100% con mi aplicación. Un ejemplo es LDAP. En principio usé open-ldap pero luego lo cambié a apacheds. Ese cambio no afectó en absoluto al funcionamiento de la aplicación y hay un montón de servidores LDAP que podría usar. Entonces ni es dificil encontrar “una miga” ni tampoco es dificil que se adapte plenamente al resto del pan. Existen muchos estándares, los suficientes como para encontrar uno que se adapte a tus necesidades pero es más fácil que cada uno cree el suyo. Eso es pan para hoy pero hambre para mañana.
Otra de tus frases ha sido “Lo que se propone con este otro modelo es poner un punto de partida común, donde se pueda asegurar que todo es objetivamente correcto; “
Seguro que eres el primero en hacer eso. Me imagino a los de opensocial haciendo las especificaciones a boleo y rapidito que llega la hora de comer.
Bueno, ya no me alargo más que bastante tocho he soltado ya. Perdón por la parrafa pero pensad que podría haber sido peor; podría haber escrito el doble (o más) XD
9. February - 12:39 pm
Sin problemas Álvaro. Sabes que no me disgustan las parrafadas. De todas formas, voy a contestarte de forma resumida, ya que todo eso, en general, me da la sensación de lo siguiente:
Hablas de delegar y dividir… pero el problema que yo he detectado es que no hay mucho en lo que delegar. Siempre se habla en general y tú en particular de la “inabarcable informática”, como si nadie pudiera re-implementar toda la informática en “una vida”. Sí es cierto que esta ciencia ha evolucionado mucho, pero siempre rondando la misma idea y bifurcando las posibilidades y expandiéndose… eso es innegable; pero el “problema” es a lo que nos ataña, que es crear una Plataforma Social.
Entonces, la pregunta es ¿existe algún módulo que ofrezca EXCLUSIVAMENTE y EFICIENTEMENTE los requisitos (o subrequisitos, si es que se ‘divide en partes menores’) necesarios para la implementación de la herramienta que se persigue? La respuesta es binaria, pero un poco más compleja:
- Sí, existe. Entonces ya hay que mirar el tema del estándar (no confundir con ‘los estándares’ ya que estándar sólo puede haber uno) y de la SEGURIDAD. Si cumple EL ESTÁNDAR, pues se reutiliza si es seguro.
- No, no existe. Entonces hay que barajar o una subdivisión (trocear en busca de un ‘caso base’ que cumpla la condición de búsqueda recursiva que expliqué antes) o convertirlo en ‘caso base’ e implementarlo desde cero con las características buscadas.
Estas dos cosas me han llevado (después de tres años muy interrumpidos, y no una eternidad) a reimplementar bajo EL ESTÁNDAR soluciones SEGURAS que resuelven problemas de forma EFICIENTE y EXCLUSIVA. Estas características, en especial la de seguir un único estándar, implican cosas como que sean MODULARES/EXTENSIBLES.
Yo ya sabes que admiro, entiendo y acepto que la mayoría de los desarrolladores sigan las normas de la Ingeniería del Software y hagan crecer y ramificar la informática delegando y confiando en otras soluciones menores sin preocuparse de lo que realmente están haciendo para evitar rehacer lo que se aproxima a ser “lo mismo”. Dos cosas sólo son iguales si son la misma. Recordarás que no soy partidario de decir que “reinvento la rueda”, creo que cada paso que doy queda más patente que lo que hago no es fácil de implementar uniendo fichas/migas de alto nivel.
Por lo tanto, mi reflexión se resumiría en…. Puede que luego aparezcan problemas, que probablemente serán solucionados (o no) por aquellos en los que delegues esa parte, pero ¿a qué coste?
23. February - 9:58 am
Disculpa que hay tardado en aprobar tu mensaje. El akismet detectó tu mensaje como spam y no me había dado cuenta.
No dudo de que tengas un control absoluto sobre toda la tecnología moderna. Sin embargo, yo no. Pese a lo que pueda saber, no soy más que un completo ignorante en la mayoría de los campos aunque sí intento conocer los rasgos generales de muchos de ellos. Precisamente esos rasgos generales me permiten, de manera muy abstracta, entender y comprenderlos lo suficiente como como para tener un mínimo de criterio a la hora de elegir. Pero de comprender algo a ser un gurú en la materia hay un gran trecho. Por ejemplo, se cómo funciona cada parte de un sistema operativo (como cualquier informático) pero de ahí a programarlo en su totalidad pues hay una gran diferencia. Es como tratar de hacer un rascacielos un sólo albañil.
Algo que me ha llamado la atención es que dices que “no hay mucho que delegar”. Opino que el primer paso para resolver un problema es identificar el problema y cuando algo complejo lo vemos muy sencillo es que algo hemos hecho mal (las cosas complejas son complejas, leñe!) o hemos pasado algo por alto. Todo sistema (entendiendo sistema como “cualquier cosa”) se divide en subsistemas. Siempre. Busca cualquier cosa y verás como puedes dividirlo. El problema es que es infinitamente recursivo y por eso hay que decidir cuándo hemos “detallado” lo suficiente.
Pongamos como ejemplo la fabricación de un coche, vale?
Pensemos en un coche terminado y listo para quemar la carretera. Un coche no es algo atómico, está formado por cosas (subsistemas) y a su vez forma parte de otro sistema más grande (es subsistema de un sistema). Sabemos que un coche (a rasgos generales) tiene un motor, caja de cambios, carrocería… Esto sería el siguiente nivel de recursividad. Pero resulta que… !Podemos seguir dividiéndolo en más subsistemas! Un motor está formado por pistones, árbol de lebas, válvulas… y todavía podemos seguir dividiendo más y más hasta llegar a partículas atómicas, cuyo nombre significa precisamente “indivisible” porque pensaban que no se podían dividir más hasta que descubrieron las partículas subatómicas (pues resulta que sí se podía dividir más…).
Claro que al fabricante de vehículos de antes le importa una mierda todo ese rollo de partículas. Él se encuentra en una cierta “franja” donde recibe algo de los subsistemas inferiores (alguien le proporciona piezas de motor, chapa…) y se lo envía a sistemas superiores (un concesionario por ejemplo). Se encarga sólo de esa tarea, construir el coche en sí mismo (y por supuesto, la fábrica está dividida en subsistemas). De conseguir los materiales o de venderlo se encargan otros.
Así somos capaces de realizar actividades realmente complejas que de otra manera sería imposible debido a la complejidad (valga la redundancia). El “maestro artesano” que puede hacerlo todo el solito es algo que desapareció hace bastante tiempo.
Todo lo que vemos a nuestro alrededor está formado por cosas más simples (no sólo hablo de cosas hechas por el hombre, sino a cualquier cosa). Nosotros somos personas, y tenemos cerebro, corazón, sistema nervioso… que están formados por células y esas células a su vez tienen mitocondrias, cromosomas y esto a su vez están formados por otras cosas. Depende de con lo que vayas a trabajar te sitúas en un nivel u otro. Si alguien me va a entablillar un brazo es de locos que se ponga a examinar mis células de la misma manera que es de locos rediseñar “la informática” (término bastante abstracto por cierto) para hacer una aplicación como es una red social (lo que coloquialmente se dice como matar moscas a cañonazos).
Seguro que puedes aportar más perfeccionando pequeñas partes de cosas concretas. Por ejemplo “el algoritmo de planificación de procesos de linux podría ser más eficiente si hago esto y esto” en vez de “el kernel de linux es una mierda y todos los que han trabajado en él además de ser idiotas por hacer esa basura, han perdido el tiempo miserablemente. Voy a hacer mi propio sistema operativo y a ver si me sobra tiempo para ver el partido esta noche” (http://www.youtube.com/watch?v=VBJZW6xRPsc)
Alguien puede pensar que cosas muy complejas sí pueden ser aparentemente sencillas: “Alvarito Alvarito, si algo tan complejo como la relación entre energía y masa Einstein lo redujo a una simple ecuacion: e = mc*c?” (http://www.mundoimg.com/imagenes/divertidas/268437_mundoimg_fuck-yeah-template.jpg). Sí, tienes razón, pero este hombre no se levantó un día y cuando desayunaba comiendo sus cereales lo pensó para hacer tiempo durante los anuncios que habían puesto mientras veía un capítulo de bob esponja en la tele. De la misma manera que hoy en día encendemos un ordenador y nos conectamos a internet sin ninguna dificultad y sin embargo es alto tremendamente complejo.
Tengo que decir que NO son cosas sencillas en absoluto. La mayoría no seríamos capaces de explicar completamente ninguna de las dos cosas. Quiero decir, razonar la teoría de la relatividad desde 0 y obviando toda la física (sólo con las cosas que uno deduzca por sí solo) o construir desde cero toda la infraestructura que permita ver un partido de baloncesto que se está jugando en EEUU mientras comento las jugadas con tío de australia. Todo esto sólo ha podido ser posible gracias a infinidad de “pequeñas” aportaciones que han ido construyendo un “todo”.
La especialización lo que nos permite hacer una cosa, pero esa cosa hacerla bien. Y si luego vamos juntando muchas cositas sencillas bien hechas obtenemos un sistemas complejo bien hecho y ese es nuestro objetivo. No hacer algo que “mas o menos” funcione sino hacer algo que funcione bien.
Todo eso que he tratao de explicar es lo que yo llamo delegar.
Por último, terminas diciendo que delegar tiene un coste. A que coste te refieres?
Tiempo? Al usar la tecnología existente he ganado toda una vida para seguir “con mis cosas”.
Rendimiento? Igual podría se capaz (o igual no) de conseguir algo más eficiente pero en ese caso, sería algo tan ridículo (la mejora de rendimiento) que si mi único objetivo fuera el rendimiento no habría hecho más que fracasar.
Seguridad? Exactamente lo mismo que el caso anterior, solo que hay que añadir mantenimiento constante (siempre surgen nuevas técnicas de ataque de las que hay que defenderse)
Soy consciente de que esto está pasando más a una discusión filosófica más que informática pero creo que igualmente es interesante
19. March - 4:29 pm
Gracias Álvaro por tu respuesta. Como supongo que quién lea esto querrá evitar leer mucha prosa, voy a hacer algo que no me gusta… que es resumir una idea en un ejemplo:
Supón que tienes una función que dado una lista de pares te dice cuál es el usuario que tiene menor edad. Supón también que tienes otra función que dada esa misma lista, te dice cuál es el usuario que tiene mayor edad. Ahora, imagínate que necesitas saber el usuario que más edad tiene y el usuario que menos edad tiene; teniendo en cuenta que es una función inexistente, porque obviamente, según la filosofía que explicas, si existiera, usarías esa… lo que tendrías que hacer para reutilizar “piezas pequeñas” sería llamar a la primera función, y luego llamar a la siguiente. De esa manera obtienes los dos datos.
Quizás aquí entra un poco la teoría de “complejidad temporal de las funciones”, pero creo que cae de cajón que no es lo mismo realizar dos búsquedas por una lista (que es lo que debería hacer las funciones reutilizadas -concurrente o secuencialmente-) que implementar “desde cero” una función que con una sola búsqueda por esa lista obtenga los dos valores.
Como digo, es un EJEMPLO, pero quizás es la mejor forma de explicar porqué veo que, en muchas ocasiones, es más efectivo desarrollar una herramienta que “hacer, hace lo mismo”, pero lo hace de “forma atómica” sin generalidades y centrándose más en el problema a resolver, que reutilizar soluciones ambiguas. Obviamente, yo con mi filosofía marco el límite a partir de dónde es intolerable y dónde las pérdidas de coste eficiencia-desarrollo absolutas se minimizan.
14. April - 4:32 pm
[...] Wixet todavía más “social” [...]