11 minutos

11 minutos

Acabo de terminar un libro de esos que lee todo el mundo, el típico libro que está de moda. No suelo leer este tipo de libros, pero este de Paulo Coelho está bastante bien y os hará reflexionar sobre muchas cosas de vuestra vida cotidiana. Os pongo la que a mi parecer es una de las mejores páginas del libro:

Según Platón al principio de la creación, los hombres y las mujeres no eran como son hoy; había sólo un ser, que era bajo, con su cuerpo y un cuello, pero cuya cabeza tenía dos caras, cada una mirando en una dirección. Era como si dos criaturas estuviesen pegadas por la espalda, con dos sexos opuestos, cuatro piernas, cuatro brazos.

Los dioses griegos, sin embargo, eran celosos, y vieron que una criatura que tenía cuatro brazos trabajaba más, dos caras opuestas estaban siempre vigilantes y no podían ser atacadas a traición, cuatro piernas no exigían tanto esfuerzo para permanecer de pie o andar durante largos períodos. Y lo que era más peligroso: la criatura tenía dos sexos diferentes, no necesitaba a nadie más para seguir reproduciéndose en la tierra.

Entonces dijo Zeus, el supremo señor del Olimpo: «Tengo un plan para hacer que estos mortales pierdan su fuerza». Y, con un rayo, partió a la criatura en dos, y así creó al hombre y a la mujer. Eso aumentó mucho la población del mundo, y al mismo tiempo desorientó y debilitó a los que en él habitaban, porque ahora tenían que buscar su parte perdida, abrazarla de nuevo, y en ese abrazo recuperar la antigua fuerza, la capacidad de evitar la traición, la resistencia para andar largos períodos y soportar el trabajo agotador. A ese abrazo donde los dos cuerpos se confunden de nuevo en uno lo llamamos sexo.

Japonés, Chino y Koreano

Hay mucha gente que mete en el mismo saco a todos los asiáticos, cree que todos son iguales, todos tienen la misma lengua y que todos piensan igual. Teniendo en cuenta que en China hay tres veces más población que en toda Europa, la diversidad de gentes debe ser mayor que la que encontramos aquí. Voy a hablar en general de las diferencias básicas entre el Japonés, el Chino y el Koreano.

El japonés es una lengua constituida principalmente por tres alfabetos: Hiragana, Kanjis y Katakana. El hiragana se compone de 55 símbolos que representan en su mayoría sílabas y vocales, con hiragana podemos escribir cualquier sonido del japonés. Pero utilizan también el Katakana que se utiliza para escribir palabras de origen extranjero (del inglés, alemán, francés etc), por ejemplo, los nombres de empresas como Philips, Intel, Microsoft … se escriben usando este alfabeto. Hasta aquí no parece demasiado complicado, los Kanjis son los que nos amargan el tema. Los Kanjis son símbolos que representan objetos, conceptos, acciones y se pueden combinar entre ellos para formar miles de palabras diferentes. Una misma palabra la podemos escribir con Hiragana o con Kanjis, pero con Kanjis ocupará menos y tardaremos menos en escribirla y también en leerla (Si conocemos el Kanji).

Japonés

Como veis en la imagen los japoneses mezclan el Hiragana, los Kanjis y el Katakana en el mismo texto. Los símbolos más complicados son los Kanjis, los demás son Hiragana y Katakana. El Kanji de después del 3 (En la imagen) se lee «gatsu» y significa «mes», el problema que este kanji en otra situación significa «luna»; como está detrás del 3 el significado de todo es «marzo». Después del 14 viene el Kanji de «hon» que significa «día», pero en otra situación significaría «sol». Al final tenemos: 14 de marzo. Como veis es un jaleo, porque aunque te aprendas los kanjis según donde estén significan una cosa u otra, además se mezclan entre ellos para formar otros conceptos.

La escritura mediante Kanjis proviene del chino. Después de muchas guerras entre china y japón, el japonés fue adquiriendo kanjis de diferentes épocas del chino. Por lo que al final el japonés se ha convertido en una lengua muy complicada de dominar debido al pupurri de alfabetos, fórmulas de cortesía … que utilizan.

Del chino se bastante poco. El problema del chino es que todo son Kanjis, por lo tanto, para aprender tienes que ir memorizando Kanjis a punta pala. Si estáis pensando que los kanjis son iguales que los del japonés estáis equivocados, alguna similitud si que hay. Pero vamos, la misma similitud que del Castellano al Francés.

Chino

Como se ve en la imagen en el chino todo son símbolos complicados (Kanjis). Finalmente me llamó mucho la atención el caso del Koreano que es totalmente diferente al chino y al japonés. No tiene Kanjis, tan solo tiene un alfabeto al estilo del Hiragana pero totalmente diferente. Según dicen es mucho más fácil de aprender que el chino y el japonés porque solo te tienes que aprender un alfabeto.

Koreano

Espero que con este artículo como mínimo diferencieis una página web china, koreana o japonesa. Si aún así queréis aprender japonés Nipoweb . Yo lo estoy intentando con cursillos, libros, páginas web; es duro pero gratificante.

El futuro de la programación

En los comentarios de hace unos días Amnio comentaba los problemas a los que se tiene que enfrentar cuando programa. Cuando tarda horas en detectar un pequeño fallo absurdo que afecta paralelamente a todo el sistema haciendo que no funcione. Este ha sido uno de los grandes problemas de la programación y creación de software desde sus inicios que nunca hemos logrado solucionar. Todo lo que se ha conseguido han sido parches que no han conseguido solucionar realmente este problema endémico.

Los gurús de Sun Microsystems trabajan a día de hoy pensando en como solucionar el problema de los bugs incontrolables cuando estamos trabajando con grandes proyectos. Dos de los mejores artículos que he encontrado por la red son el de Jaron Lanier, critica que no somos capaces de crear software potente sin bugs:

I think the whole way we write and think about software is wrong. If you look at how things work right now, it’s strange — nobody — and I mean nobody — can really create big programs in a reliable way. If we don’t find a different way of thinking about and creating software, we will not be writing programs bigger than about 10 million lines of code, no matter how fast our processors become. [After publication of this interview, Jaron Lanier realized that his sentence should read: «bigger than about 20 to 30 million lines of code…».]

Pero luego se remonta a los orígenes haciéndonos pensar sobre la verdadera naturaleza de la programación actual. Argumenta que la forma de programar de hoy en día está muy influenciada por los orígenes electrónicos de la informática.

If you look at the way we write software, the metaphor of the telegraph wire sending pulses like Morse code has profoundly influenced everything we do. For instance, a variable passed to a function is a simulation of a wire. If you send a message to an object, that’s a simulation of a wire. And it’s not that there’s anything wrong with this, but I can make an empirical observation: If you have a time-based protocol to send codes on a wire, it’s inefficient to make that kind of coding error-tolerant. It’s much more efficient to make it error-intolerant. So errors tend to be catastrophic. You tend to create a situation where, if you get one bit wrong in passing a variable to a function, the function does something that’s not just wrong, but chaotically wrong, arbitrarily wrong, terribly wrong

Finalmente nos propone librarnos de cualquier influencia anterior que tengamos sobre la informática para poder crear cosas realmente nuevas en este campo.

So, now, when you learn about computer science, you learn about the file as if it were an element of nature, like a photon. That’s a dangerous mentality. Even if you really can’t do anything about it, and you really can’t practically write software without files right now, it’s still important not to let your brain be bamboozled. You have to remember what’s a human invention and what isn’t. And you have to think about files in the same way you think about grocery carts. They are a particular invention with positive and negative elements. It’s very important to keep that sense of skepticism alive. If you do that, it will really have an influence on the quality of code that you create today.

Leeros el artículo entero que vale la pena. En él nos explica como será la programación el futuro, y como cree él que se podrán solucionar los problemas del software. Para continuar si os ha gustado este primero, leed el de Victoria Livschitz que continua hablando sobre el mismo tema. Sobre los problemas de la naturaleza del software, y como sería posible solucionarlo creando un modelo de programación más cercano a la realidad (Más aún que la programación orientada a objetos)

Software is a product of our imagination, like a book, a painting or a movie, designed to synthesize a particular representation of the real world. But unlike all other forms of pure art, software is constructed for utilitarian purposes to do more then merely reflect the real world; software interacts with the world and in many cases even controls it. And what is truly amazing — software is replicable: instantaneously, in arbitrary numbers, at zero cost!

Una conclusión que he sacado yo después de la lectura es que cuando tenemos por ejemplo un programa de 5.000 clases, con montones de relaciones entre ellas es imposible saber los efectos que tendrá un simple cambio, porque se propagará por todo el programa creando efectos secundarios. La orientación a objetos está mal diseñada en este aspecto y sería mejor crear un nuevo modelo donde las clases tenga entre ellas otro tipo de relaciones diferentes a las clásicas «Is a» y «Has a». Pero ¿Como hacerlo? ¿Como eliminar el problema de los bugs y la manutención del software?, si encuentras la solución serás uno de los informáticos más importantes de la historia. ¿No sería mejor crear un nuevo método de programación más cercano al pensamiento humano y adecuado a la potencia de las máquinas actuales?

Chicas linux

Después de unos cuantos posts «durillos» y técnicos aquí tenéis un par de chicas Linux para relajarse. Una de ellas está anticuada y usa el Kernel 2.0 (Haced click en la segunda foto para ver el detalle), si alguien la encuentra por la calle que se lo actualice 😉 A mi me están entrando ganas de meterle mano al código del kernel.

Por cierto, buscando «debian girl» en google imagenes me he encontrado esto Debian girl. La risa.

Colossus

Ya hablé de Enigma y su poder para encriptar datos del ejército alemán. Pero los ingleses con Alan Turing a la cabeza se las ingeniaron para poder decodificar la clave de cada día usando bombas y a partir de ella poder desencriptar cualquier mensaje alemán. Pero en 1943 los Alemanes crearon una nueva máquina que utilizaba la cifra de Lorenz.

La cifra de Lorenz se utilizaba para codificar las comunicaciones entre Hitler y sus generales, era muy importante para los Ingleses poder conocer esta información. Pero la nueva codificación era mucho más complicada que la que usaban las máquinas Enigma corrientes y el diseño de las bombas inglesas no era el adecuado para poder descifrarla.

Pero Max Newman, un matemático que trabajaba con Alan Turing creó una nueva máquina capaz de adaptarse a diferentes problemas basándose en el concepto de máquina universal de Turing. Este fue posiblemente el primer ordenador programable de la historia. Su nombre era Colossus y constaba de 1.500 válvulas electrónicas y lo más importante de todo es que era programable. Con Colossus los aliados fueron capaces de descifrar todos los mensajes de los enemigos predeciendo los ataques alemanes, sabiendo las posiciones de las tropas, movimientos de submarinos etc. y de esta forma poder ganar la guerra con más rapidez y efectividad.

Colossus fue destruido después de la guerra, y a todo el mundo que lo conocía se le prohibió hablar de él. Incluso los papeles del diseño del primer ordenador de la historia se quemaron. Esto significó que en 1945 J. Prespert Eckert y John W. Mauchly, crearan el ENIAC con 18.000 válvulas considerándose el padre de todos los ordenadores. Estados Unidos tomaba una ventaja crucial en el mundo de la computación y la tecnología que se ha mantenido hasta la época presente.

Java y C#

La verdad es que no estoy en contra de ninguno de los dos lenguajes. Pero voy a criticar ciertas cosas de ambos. C# ha copiado inteligentemente muchos de los conceptos que se idearon con Java en cuanto a una programación orientada a clases elegante pero también es verdad que han introducido nuevas cosas para hacer más agradable el trabajo del programador. Una de las cosas que más me han tocado las narices de Java son los casts (supongo que otros compartiran este sentimiento y se habrán facilitado las cosas con Java 1.5). Me refiero a cosas como esta (El código funciona compilando con Java y C#, que casualidad 😉 :

   String cadena=»22″;
    int numero=Integer.parseInt(cadena);

¿Para qué usar un método estático? No sería mejor algo más intuitivo que lo siguiente:

   String cadena=»22″;
    int numero=cadena.toInt();

Supongo que en Java 1.5 esto ya estará solucionado de la forma que comento. ¿Pero no sería incluso mejor poder hacer esto?:

   String cadena=»22″;
    int numero=cadena;

Y que el compilador se encargue de hacer el cast automáticamente si es que se puede. Esto que comento es la eterna discusión entre los lenguajes que te permiten un control total tipo C, a lenguajes restrictivos como Java. Yo pienso que un lenguaje muy restrictivo crea programadores malos porque no saben realmente lo que están haciendo. Por otra parte si el compilador «se lo traga todo» sin avisar haciendo casts a lo bestia puede dar lugar a bugs difíciles de detectar. Lo ideal creo que es poder el escoger el nivel de restricción. ¿Qué pensais que es mejor, que el compilador haga lo que tu quieras (C,C++ …) o hacer lo que te mande el compilador (Java, C# …)?