<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>La Naturaleza Del Software &#187; Desarrollo</title>
	<atom:link href="http://www.lnds.net/blog/category/desarrollo/feed" rel="self" type="application/rss+xml" />
	<link>http://www.lnds.net/blog</link>
	<description>Nullius Addictus Jurare in Verba Magistris</description>
	<lastBuildDate>Mon, 16 Jan 2012 01:18:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Simplejizando&#8230;</title>
		<link>http://www.lnds.net/blog/2011/12/simplejizando.html</link>
		<comments>http://www.lnds.net/blog/2011/12/simplejizando.html#comments</comments>
		<pubDate>Tue, 20 Dec 2011 03:02:48 +0000</pubDate>
		<dc:creator>Eduardo Díaz</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[La Naturaleza del Software]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[lenguajes de programación]]></category>
		<category><![CDATA[Ogu]]></category>

		<guid isPermaLink="false">http://www.lnds.net/blog/?p=2481</guid>
		<description><![CDATA[Una de las ventajas de publicar Ogu en esta etapa es que me permite confrontar mi diseño con los lectores y potenciales usuarios. He recibido comentarios en el blog y en privado que me han permitido enriquecer y determinar algunos problemas en la sintáxis. El principal problema reside en la ambigüedad de las declaraciones, la gramática hasta ahora permitía el uso opcional de las palabras reservadas &#8216;def&#8217;, &#8216;var&#8217; y &#8216;val&#8217;. De este modo la siguiente declaración x := 1 era equivalente a esta otra: val x := 1 y obligaba al uso de var para las variables mutables: var x:= 1 Por otra parte la declaración de funciones era de la siguiente manera factorial : Int -&#62; Int factorial 0 = 1 factorial n = n * factorial (n-1) El problema es que una de las características de Ogu es que las funciones son first class, de este modo la siguiente declaración f : Int -&#62; Int es ambigua, puede ser la variable inmutable f de tipo función Int-&#62;Int, o la función f. La gramática actual exige que inmediatamente después de esta declaración debe venir una expresión que corresponde a la definición del cuerpo de la función, esto obliga al [...]]]></description>
			<content:encoded><![CDATA[<p>Una de las ventajas de publicar Ogu en esta etapa es que me permite confrontar mi diseño con los lectores y potenciales usuarios. He recibido comentarios en el blog y en privado que me han permitido enriquecer y determinar algunos problemas en la sintáxis.</p>
<p>El principal problema reside en la ambigüedad de las declaraciones, la gramática hasta ahora permitía el uso opcional de las palabras reservadas &#8216;def&#8217;, &#8216;var&#8217; y &#8216;val&#8217;.</p>
<p>De este modo la siguiente declaración</p>
<blockquote><p>x := 1</p></blockquote>
<p>era equivalente a esta otra:</p>
<blockquote><p>val x := 1</p></blockquote>
<p>y obligaba al uso de var para las variables mutables:</p>
<blockquote><p>var x:= 1</p></blockquote>
<p>Por otra parte la declaración de funciones era de la siguiente manera</p>
<blockquote><p>factorial : Int -&gt; Int</p>
<p>factorial 0 = 1</p>
<p>factorial n = n * factorial (n-1)</p></blockquote>
<p>El problema es que una de las características de Ogu es que las funciones son <em>first class</em>, de este modo la siguiente declaración</p>
<blockquote><p>f : Int -&gt; Int</p></blockquote>
<p>es ambigua, puede ser la variable inmutable f de tipo función Int-&gt;Int, o la función f. La gramática actual exige que inmediatamente después de esta declaración debe venir una expresión que corresponde a la definición del cuerpo de la función, esto obliga al uso de var o val si queremos que f sea una variable que almacenará una función.</p>
<p>Ante esto he decidido hacer los siguientes cambios:</p>
<ul>
<li>var, val y def son obligatorios al declarar variables o funciones.</li>
<li>al inferir tipos los dos puntos son opcionales.</li>
<li>También las palabras class y trait que eran opcionales ahora son obligatorias, y la definición de una clase debe ir precedida con la palabra reservada def</li>
<li>La consecuencia de esto es que ahora las clases pueden empezar con minúsculas (lo que me simplifica un problema con el runtime de java y los packages)</li>
</ul>
<p>Con estas consideraciones los ejemplos del primer artículo de esta serie quedan así:</p>
<blockquote><p><strong>val</strong> blog = “La naturaleza del software” // blog es de tipo String</p>
<p><strong>val</strong> ogú = Cavernícola(nombre: “ogú”) // ogú es de tipo Cavernícola</p>
<p><strong>val</strong> x, y := 1, 2 // x e y son de tipo Int, notar que el &#8216;:&#8217; es opcional</p></blockquote>
<p>Las funciones se definen de esta forma:</p>
<blockquote><p><strong>def</strong> factorial : Int –&gt; Int</p>
<p><strong>def</strong> factorial 0 = 1</p>
<p><strong>def</strong> factorial n = n * factorial (n-1)</p></blockquote>
<p>La forma abreviada es:</p>
<blockquote><p><strong>def</strong> factorial : (n:Int)–&gt; Int  =<strong>if  </strong>(n == 0) 1 <strong>else </strong> n * factorial(n-1)</p></blockquote>
<p>Lo interesante es que con este cambio también  se puede escribir de la siguiente manera:</p>
<blockquote><p><strong>def</strong> factorial 0 = 1</p>
<p><strong>def</strong> factorial n = n * factorial (n-1)</p></blockquote>
<p>Potenciando más la inferencia de tipos.</p>
<p>Este cambio permite desambiguar la siguiente declaración</p>
<blockquote><p><strong>val</strong> f : Int -&gt; Int</p></blockquote>
<p>Permitiendo lo siguiente:</p>
<blockquote><p>f = factorial</p></blockquote>
<p>Las clases se declaran de este modo ahora:</p>
<blockquote><p><strong>def</strong> Persona : <strong>class</strong> (nombre: String, edadInicial: Int) ={</p>
<p><strong>       var</strong> _edad = edadInicial</p>
<p><strong>      def</strong> saludar : () = println “hola “ + nombre</p>
<p><strong>       def</strong> celebrarCumpleaños : () = {<br />
_edad = _edad + 1<br />
println “¡¡ feliz cumpleaños “ + nombre + “!!”<br />
}<br />
}</p></blockquote>
<p>Los ejemplos del artículo anterior también deben ser re escritos:</p>
<blockquote><p><strong>def</strong> Stack{T}  : <strong>class</strong> () = {</p>
<p><strong>      var</strong> _data : [T] = []</p>
<p><strong>     def</strong> push : (x:T) = _data = x :: _data</p>
<p><strong>     def</strong> pop : ()-&gt;(r:T) = {<br />
r = head _data<br />
_data = tail _data<br />
}<br />
}</p></blockquote>
<p>Las interfaces en Ogu se llaman traits (rasgos), siguiendo la tradición de Scala:</p>
<blockquote><p><strong>def</strong> Figura : <strong>trait</strong> = {</p>
<p><strong>      def</strong> area : ()-&gt;Int<br />
<strong>       def</strong> perimetro : () –&gt; Int<br />
}</p>
<p><strong>def</strong> Circulo : <strong>class</strong> (radio:Int) ~ Figura = {</p>
<p><strong>         def</strong> area = pi * radio ^ 2</p>
<p><strong>         def</strong> perimetro = 2 * pi * radio</p>
<p>}</p>
<p><strong>def</strong> Cuadrado : <strong>class</strong> (lado:Int) ~ Figura ={</p>
<p><strong>         def</strong> area = lado*lado</p>
<p><strong>         def</strong> perimetro = lado*4</p>
<p>}</p></blockquote>
<p>Además con esto queda más claro que area y perimetro son funciones y no variables.</p>
<p>Este ejercicio me hizo darme cuenta de que estaba cayendo en el vicio que pretendía evitar, el vicio de la <em>simplejización</em>.  En el afán de ahorrarme algunas palabras reservadas estaba haciendo de Ogu un lenguaje con una sintáxis que terminaría siendo oscura e intimidante, que obligaría a pensar mucho para analizar una expresión. Estos cambios van en la linea de la simplicidad, sin perder el minimalismo sintáctico que espero que tenga Ogu.</p>
<p>&nbsp;<br />
<h3 class='related_post_title'>Artículos relacionados</h3>
<ul class='related_post'>
<li><a href='http://www.lnds.net/blog/2011/12/el-sistema-de-tipos-de-ogu-1.html' title='El sistema de tipos de Ogu (1)'>El sistema de tipos de Ogu (1)</a></li>
<li><a href='http://www.lnds.net/blog/2011/12/compiladores.html' title='Compiladores'>Compiladores</a></li>
<li><a href='http://www.lnds.net/blog/2011/12/java-debe-morir.html' title='Java debe morir'>Java debe morir</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.lnds.net/blog/2011/12/simplejizando.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Java debe morir</title>
		<link>http://www.lnds.net/blog/2011/12/java-debe-morir.html</link>
		<comments>http://www.lnds.net/blog/2011/12/java-debe-morir.html#comments</comments>
		<pubDate>Thu, 08 Dec 2011 13:56:23 +0000</pubDate>
		<dc:creator>Eduardo Díaz</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[La Naturaleza del Software]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[cambio]]></category>
		<category><![CDATA[Ceylon]]></category>
		<category><![CDATA[evolución]]></category>
		<category><![CDATA[Gosu]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[JRuby]]></category>
		<category><![CDATA[jvm]]></category>
		<category><![CDATA[Kotlin]]></category>
		<category><![CDATA[lenguajes]]></category>
		<category><![CDATA[lenguajes de programación]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[Xtend]]></category>

		<guid isPermaLink="false">http://www.lnds.net/blog/2011/12/java-debe-morir.html</guid>
		<description><![CDATA[“De todas las formas de adquirir libros se considera la más gloriosa el escribirlos uno mismo” – Walter Benjamin “’Ta muy malo el corralero, y allá en el potrero como viejo está. Hay que ayudarlo a que muera para que no sufra más.” – Sergio Sauvalle Esa pareces ser la consigna desde hace unos dos o tres años, java, como lenguaje de programación, debe dar el paso a lenguajes más modernos. Cuando uno ocupa durante mucho tiempo una herramienta empieza a descubrir sus limitaciones, y trata de hacer cambios para mejorarla, adaptaciones, o derechamente vas a adquirir otra. Es natural, somos seres tecnológicos, y uno de los elementos que nos diferencia es nuestro uso de las herramientas. Somos expertos en la mejora continua de nuestras herramientas, nuestra historia es, en cierto sentido, la historia de nuestras herramientas. De todas las herramientas disponibles para un programador el lenguaje es la más importante. Y vaya que ha evolucionado, aunque no siempre para mejor En 1973 el lenguaje C ya estaba establecido, en 1983 C++ aparece en escena. Para&#160; 1995 la introducción de Java supuso un hito importante en la historia de la programación. Ya en ese tiempo C++, tenía unos 12 años [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>“De todas las formas de adquirir libros se considera la más gloriosa el escribirlos uno mismo” – Walter Benjamin</p>
<p>“’Ta muy malo el corralero, y allá en el potrero como viejo está. Hay que ayudarlo a que muera para que no sufra más.” – Sergio Sauvalle</p>
</blockquote>
<p>Esa pareces ser la consigna desde hace unos dos o tres años, java, como lenguaje de programación, debe dar el paso a lenguajes más modernos.</p>
<p>Cuando uno ocupa durante mucho tiempo una herramienta empieza a descubrir sus limitaciones, y trata de hacer cambios para mejorarla, adaptaciones, o derechamente vas a adquirir otra.</p>
<p>Es natural, somos seres tecnológicos, y uno de los elementos que nos diferencia es nuestro uso de las herramientas. Somos expertos en la mejora continua de nuestras herramientas, nuestra historia es, en cierto sentido, la historia de nuestras herramientas.</p>
<p><a href="http://www.lnds.net/blog/wp-content/uploads/2011/12/tool-evolution.gif"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="tool-evolution" border="0" alt="tool-evolution" src="http://www.lnds.net/blog/wp-content/uploads/2011/12/tool-evolution_thumb.gif" width="339" height="484" /></a></p>
<p>De todas las herramientas disponibles para un programador el lenguaje es la más importante. Y vaya que ha evolucionado, aunque no siempre para mejor <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-winkingsmile" alt="Guiño" src="http://www.lnds.net/blog/wp-content/uploads/2011/12/wlEmoticon-winkingsmile.png" /></p>
<p><a href="http://www.lnds.net/blog/wp-content/uploads/2011/12/evolution-of-languages.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="evolution-of-languages" border="0" alt="evolution-of-languages" src="http://www.lnds.net/blog/wp-content/uploads/2011/12/evolution-of-languages_thumb.jpg" width="644" height="404" /></a></p>
<p>En 1973 el lenguaje C ya estaba establecido, en 1983 C++ aparece en escena. Para&#160; 1995 la introducción de Java supuso un hito importante en la historia de la programación. Ya en ese tiempo C++, tenía unos 12 años y era tiempo de cambiarlo, parece que tenemos este ciclo de 10 a 12 años para empezar a cambiar lenguajes. ¿Por qué Java sigue con nosotros? (C# es una copia, como dijo Gosling[1], así que no vale[2].&#160; ¿Y Scala?, bueno, hablemos de eso más adelante).</p>
<p>La verdad es que Gosling tampoco lo entendió muy bien. Puede ser que C# sea una copia, y es porque los negocios lo forzaron a ir en esa dirección. El diseñador principal de C# es Anders Helsjberg, famoso por turbo Pascal, y por Delphi (Object Pascal). Puede que Hejlsberg nunca haya creado un lenguaje desde cero, pero ha tenido siempre la habilidad de llevar un lenguaje existente en direcciones muy interesantes e innovadoras.</p>
<p>Una cosa que hay que entender de la evolución es que no significa necesariamente progreso. Evolución es adaptación al cambio. En la evolución se prueban diversas alternativas ante condiciones nuevas, si funcionan se mantienen, si fracasan se desechan. </p>
<p>La figura de arriba es errada, porque la evolución no es lineal. La evolución se mueve a través de un árbol, de una estructura mucho más intrincada, con entrecruzamientos, atavismos, mutaciones, etc.</p>
<p>Cuando algo funciona bien en un nicho puede permanecer sin cambiar por mucho tiempo. Piensen en el cocodrilo, ¡básicamente es la misma especie desde hace 84 millones de años!</p>
<p>Entonces hay cosas de Java que han funcionado muy bien, es lo que llamamos la plataforma Java. Una plataforma que ha permitido crear un rico ecosistema. En este nicho Java, el lenguaje, se desplaza como un pesado saurópodo.</p>
<p>Quizás la mayor fuente de las críticas a Java tienen su origen en el concepto de “<strong>simplejidad</strong>”, que identificó muy bien Andres Hejlsberg, en <a href="http://www.artima.com/intv/simplexity.html">esta entrevista</a> que le hizo hace años Bill Venners:</p>
<blockquote><p><b>Bill Venners</b>: Una manera en que C# difiere de Java es en como propaga eventos a los objetos interesados. Java usa clases, a menod clases internas, que implementan interfaces listeners. C# usa delegates, que son un poco más como punteros a funciones. ¿Por qué delegates?</p>
<p><b>Anders Hejlsberg</b>: Déjame hablar primero un poco sobre como veo la simplicidad en general. Nadie aragumenta que la simplicidad no sea buena, pero la gente define simplicidad de muchas maneras. Hay un tipo de simplicidad que me gusta llamar <em><strong>simplejidad. </strong></em>Cuando tomas algo increiblemente complejo y tratas de envolverlo en algo más simple, a menudo terminas ocultando con un velo la complejidad. No diseñas realmente un sistema más simple. En cierto modo lo haces aún más complejo, porque ahora el usuario tiene que entender por qué fue omitido aquello que ellos necesitarán a veces. Eso es simplejidad. Así que para mi, la simplicidad debe ser verdadera, en el sentido de que cuando más abajo te internas más simple se vuelve. No debe volverse más complicado en la medida que&#160; profundizas.      <br />Los delegates agregan un grado de expresividad que no obtienes con clases o interfaces, por lo cual pienso que son importantes. Los lenguajes de programación que han estado antes que nosotros han reconocido su importancia. Tienen muchos nombres: punteros a funciones, punteros a funciones miembras. En LISP tienes closures (clausuras). Eso es de lo que se trata la programación funcional cuando se hace bien. Son tremendamente útiles.</p>
</blockquote>
<p><a href="http://www.lnds.net/blog/wp-content/uploads/2011/12/complicado.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="complicado" border="0" alt="complicado" align="right" src="http://www.lnds.net/blog/wp-content/uploads/2011/12/complicado_thumb.jpg" width="131" height="141" /></a>La simplejidad es otra forma de rascarse la oreja mal. Veamos un ejemplo, supongamos que queremos enseñar a programar, lo natural sería partir con el clásico programa hola mundo.</p>
<p>Consideren la primera clase de Python:</p>
<blockquote><p>Para crear un programa muy simple que imprima en pantalla la frase “hola mundo”, ustedes deben escribir la siguiente sentencia:</p>
</blockquote>
<blockquote><p align="center">print(“hola mundo”)</p>
<p align="left">print es una sentencia que toma este texto entre comillas y lo despliega en la consola (pantalla), etc.</p>
</blockquote>
<p align="left">Ahora piensen el esfuerzo del entrenador de Java:</p>
<blockquote><p align="left">Para crear un programa muy simple que imprima en pantalla la frase “hola mundo”, ustedes deben escribir el siguiente código:</p>
<p align="left">class HolaMundo {</p>
<p align="left">public static void main(String args[]) {</p>
<p align="left">&#160;&#160;&#160; System.out.println(“hola mundo”);</p>
<p align="left">}</p>
<p align="left">Por favor ignoren la sentencia class, ya lo vamos a explicar cuando veamos los conceptos de orientacíón a objetos.</p>
<p align="left">Por ahora ignoren que significa public static.</p>
<p align="left">void significa que esta es una función que no retorna ningún valor (wait, todavía no les enseño que es una función verdad?) </p>
<p align="left">System.out.println es una llamada a la clase System (ya vamos a aprender que es una clase, no se apuren), que tiene una variable pública llamada out que ha sido inicializada con la salida estandar (la consola, o pantalla).</p>
<p align="left">etc, etc.</p>
</blockquote>
<p align="left">Puedo imaginar la confusión de los alumnos, por eso que Java no debe ser enseñado en los primeros años!</p>
<p align="left">Y que hay de cosas más interesantes, ¿como delegates, o clausuras? ¿funciones de primer orden? Java 7 recién empieza a explorar estos temas, pero con sintaxis horribles.</p>
<p align="left">OK, pero hay que reconocer que esas cosas vienen de un paradigma distinto, el paradigma funcional es distinto al paradigma orientado al objeto sobre el que se basa Java, así que hay que ser justos.</p>
<p align="left">Lo que pasa es que necesitamos incorporar el paradigma funcional, porque, entre otras razones, porque debemos desarrollar más la computación paralela. Los procesadores multicore son cada vez más comunes, y los conceptos de la programación funcional son muy útiles en este nuevo mundo.</p>
<p align="left">Los nuevos lenguajes serán un híbrido entre los paradigmas funcionales y orientados al objeto, porque ambos paradigmas tienen características que deben sobrevivir en las nuevas condiciones y en los nuevos nichos ecológicos que se abren.</p>
<p align="left">La tendencia actual en el ecosistema de Java (la plataforma) es crear nuevos lenguajes (Scala, Groovy, Clojure), o adaptar otros (Jython, JRuby) para la JVM. </p>
<p align="left">Es curioso, cuando .Net nació se decidió diseñarla para que aceptara una gran variedad de lenguajes. El mismo Microsoft decidió iniciar la CLI con tres lenguajes: Visual Basic, C# y un dialecto de C++. La idea era crear una gran cantidad de lenguajes que se adaptaran a esta plataforma. A pesar&#160; de esto C# es el lenguaje más usado, y probablemente termine siendo el que se coma la mayor parte del pastel .Net.</p>
<p align="left">Pero sobre la JVM en el último tiempo ha empezado una verdadera carrera por crear el sucesor de Java.</p>
<p align="left"><a href="http://www.scala-lang.org/">Scala</a> es el asalto a los cielos más rimbombante hasta ahora, seguido por un modesto y más efectivo <a href="http://groovy.codehaus.org/">Groovy</a>. Otro candidato notablemente es <a href="http://jruby.org/">JRuby</a>, impulsado por la popularidad de <a href="http://www.ruby-lang.org/">Ruby</a>. Pero no hay un ganador claro. </p>
<p align="left">Aún así el empeño persiste, tenemos <a href="http://clojure.org/">Clojure</a>, y <a href="http://confluence.jetbrains.net/display/Kotlin/Welcome">Kotlin</a>, y <a href="http://gosu-lang.org/">Gosu</a>!</p>
<p align="left">Pero hay dos adiciones interesantes del último tiempo: <a href="http://www.eclipse.org/Xtext/xtend/">Xtend</a>, que tiene el respaldo de <a href="http://www.eclipse.org/">Eclipse</a> y <a href="http://ceylon-lang.org/">Ceylon</a> auspiciado por <a href="http://www.redhat.com/">RedHat</a>.</p>
<p align="left">¡Matemos a Java, para que Java viva! Yo creo que es interesante que se desarrollen estos lenguajes, veamos que pasa con esta <a href="http://es.wikipedia.org/wiki/Explosi%C3%B3n_c%C3%A1mbrica">explosión cámbrica</a>, exploremos estos lenguajes. </p>
<p align="left">Al menos yo voy a ir un paso más allá, y seguir los consejos de Walter Benjamin, aplicados a los lenguajes de programación, voy a escribir uno, y espero que ustedes me ayuden, así que atentos.</p>
<p>NOTAS:<br/>[1] La frase de Gosling, el creador de Java, es: &quot;The trite answer is, &#8216;imitation is the sincerest form of flattery&#8211;thank you very much, but the other answer is, &#8216;You guys (at Microsoft) still don&#8217;t get it,&#8217; because it&#8217;s sort of Java with reliability, productivity and security deleted.&quot; (La respuesta trillada es ‘la imitación es la forma más sincera de adulación’, muchas gracias, pero la otra respuesta es &#8216;ustedes chicos (en Microsoft) todavía no lo entienden’, porque es una especie de Java sin confiabilidad, productividad y la seguridad eliminada” (fuente: <a href="http://news.cnet.com/2008-1082-817522.html">http://news.cnet.com/2008-1082-817522.html</a>)</p>
<p>[2] Aunque a partir de&#160; C# 2.0 las cosas empezaron a cambiar, y C# 2.0 salió en 2005!, quizás deberían haberle cambiado el nombre.</p>
<h3 class='related_post_title'>Artículos relacionados</h3>
<ul class='related_post'>
<li><a href='http://www.lnds.net/blog/2010/10/barbaros-y-caballeros.html' title='Bárbaros y Caballeros'>Bárbaros y Caballeros</a></li>
<li><a href='http://www.lnds.net/blog/2011/12/compiladores.html' title='Compiladores'>Compiladores</a></li>
<li><a href='http://www.lnds.net/blog/2011/12/simplejizando.html' title='Simplejizando&#8230;'>Simplejizando&#8230;</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.lnds.net/blog/2011/12/java-debe-morir.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Sobre c&#243;mo rascarse una oreja</title>
		<link>http://www.lnds.net/blog/2011/11/sobre-cmo-rascarse-una-oreja.html</link>
		<comments>http://www.lnds.net/blog/2011/11/sobre-cmo-rascarse-una-oreja.html#comments</comments>
		<pubDate>Thu, 03 Nov 2011 14:36:43 +0000</pubDate>
		<dc:creator>Eduardo Díaz</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Paradigmas]]></category>
		<category><![CDATA[Tecnología]]></category>
		<category><![CDATA[bases de datos no relacionales]]></category>
		<category><![CDATA[bases de datos relacionales]]></category>
		<category><![CDATA[modelamiento]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[paradigmas]]></category>
		<category><![CDATA[programación]]></category>

		<guid isPermaLink="false">http://www.lnds.net/blog/2011/11/sobre-cmo-rascarse-una-oreja.html</guid>
		<description><![CDATA[Hay veces que nos&#160; encanta rascarnos la oreja izquierda con la mano derecha, por puro complicar las cosas Eso se da mucho en las etapas de diseño y modelamiento de datos. Un problema simple después de pasar por la etapa de análisis y diseño puede quedar así: ¡Ah!, que hermosos son estos modelos genéricos, con trazabilidad, controles de accesos, y perfiles, una orgía de tablas y relaciones (¿será que eso de las “relaciones foráneas” despierta alguna inconfesable fantasía en los analistas de sistemas?) A veces esto se convierte en puro onanismo, originado por un axioma que fue imbuido en nuestros cerebros por un grupo de investigadores de IBM en 1969[1], la idea de que todo debe ser modelado en una base de datos relacional hasta la “vigésima quinta forma normal” [2]. No hay que desconocer que el modelo relacional tiene sus ventajas, después de todo es el corazón de la mayoría de los sistemas transaccionales en la actualidad. A saber las bases de datos relacionales, cuando se usan adecuadamente, tienen muchas ventajas. 1. La teoría que las sustenta está basada en la lógica de primer orden y la teoría de conjuntos, por lo que es fácil de entender y explicar [...]]]></description>
			<content:encoded><![CDATA[<p>Hay veces que nos&#160; encanta rascarnos la oreja izquierda con la mano derecha, por puro complicar las cosas</p>
<p><a href="http://www.lnds.net/blog/wp-content/uploads/2011/11/complicado.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="complicado" border="0" alt="complicado" src="http://www.lnds.net/blog/wp-content/uploads/2011/11/complicado_thumb.jpg" width="226" height="244" /></a></p>
<p>Eso se da mucho en las etapas de diseño y modelamiento de datos. Un problema simple después de pasar por la etapa de análisis y diseño puede quedar así:</p>
<p><a href="http://www.lnds.net/blog/wp-content/uploads/2011/11/dbSchema.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="dbSchema" border="0" alt="dbSchema" src="http://www.lnds.net/blog/wp-content/uploads/2011/11/dbSchema_thumb.jpg" width="562" height="484" /></a></p>
<p>¡Ah!, que hermosos son estos modelos genéricos, con trazabilidad, controles de accesos, y perfiles, una orgía de tablas y relaciones (¿será que eso de las “relaciones foráneas” despierta alguna inconfesable fantasía en los analistas de sistemas?)</p>
<p>A veces esto se convierte en puro onanismo, originado por un axioma que fue imbuido en nuestros cerebros por un grupo de investigadores de IBM en 1969[1], la idea de que todo debe ser modelado en una base de datos relacional hasta la “vigésima quinta forma normal” [2].</p>
<p>No hay que desconocer que el modelo relacional tiene sus ventajas, después de todo es el corazón de la mayoría de los sistemas transaccionales en la actualidad. A saber las bases de datos relacionales, cuando se usan adecuadamente, tienen muchas ventajas.</p>
<p>1. La teoría que las sustenta está basada en la lógica de primer orden y la teoría de conjuntos, por lo que es fácil de entender y explicar desde un punto de vista teórico.</p>
<p>2. Como las bases de datos relacionales permiten operar con conjuntos se pueden definir operaciones muy eficientes que permiten “cruzar” los datos, esto es conocido como “algebra relacional”. Un lenguaje equivalente es el “cálculo relacional” [3], ambos lenguajes teóricos permitieron crear el lenguaje de consulta estructurado SQL, un lenguaje sencillo y muy poderoso que permite extraer información desde el modelo relacional.</p>
<p>3. Cuando las bases de datos relacionales están bien modeladas usan eficientemente el espacio.</p>
<p>4. Un buen modelo permite realizar consultas que no estaban previstas, hacer nuevos cruces de información, claro que a un costo. Si los índices no existen las consultas pueden tomar tiempos cuadráticos, o peores.</p>
<p>Todo estos beneficios vienen de que las bases de datos relacionales promueven una estructura, sólida, tolerante a fallas, que permite validar errores semánticos o de estructura dento del mismo motor. Dadas estas ventajas posteriormente los sistemas administradores de bases de datos incorporaron otros conceptos, como la transaccionalidad, el famoso <a href="http://en.wikipedia.org/wiki/ACID">ACID</a> (Atomicity, Consistency, Isolation, Durability), que permiten que estas bases sean tan usadas en aplicaciones empresariales (contabilidad, bancos, retail, etc.).</p>
<p>El otro día escuché a un importante ejecutivo decir que todo el mundo usa Oracle, o SQL Server porque sirven para resolver problemas grandes a nivel empresarial. Le comenté que <a href="http://highscalability.com/blog/2010/11/16/facebooks-new-real-time-messaging-system-hbase-to-store-135.html">Facebook almacena 135 mil millones de mensajes al mes en una base de datos no relacional</a>, pero ni aún así entendió. Es el típico caso de <a href="http://www.lnds.net/blog/2011/07/decisiones-irracionales.html">razonamiento motivado</a>. </p>
<p>Si bien casi todo problema se puede modelar con una base de datos relacional, no siempre conviene resolver un problema con una base de relacional. Ya <a href="http://www.lnds.net/blog/2011/10/datos-datos-datos.html">les mostré un ejemplo</a> en que un programa en C puede ser más eficiente que procesar una simple sentencia SQL, claro requiere más trabajo de desarrollo, pero ahí viene el arte y la ciencia, conocer y usar la herramienta adecuada para cada tipo de problema.</p>
<p>Consideren este modelo:</p>
<blockquote><p><code><strong>class</strong> Book {         <br />&#160;&#160;&#160; </code><code>String title        <br />&#160;&#160;&#160; </code><code>String author        <br />&#160;&#160;&#160; Integer year         <br />&#160;&#160;&#160; Integer pages         <br />&#160;&#160;&#160; Set keywords         <br />&#160;&#160;&#160; Set ratings         <br /></code><code>} </code></p>
</blockquote>
<p>Versus este otro</p>
<blockquote><p><code><strong>class</strong> Book {         <br />&#160;&#160;&#160; Integer id         <br />&#160;&#160;&#160; String title         <br />&#160;&#160;&#160; String author         <br />&#160;&#160;&#160; Integer year         <br />&#160;&#160;&#160; Integer pages         <br /></code><code>} </code></p>
<p><code><strong>class</strong> Keyword {         <br />&#160;&#160; Integer id         <br />&#160;&#160; String keyword         <br />&#160;&#160; Integer bookId         <br />} </code></p>
<p><code><strong>class</strong> Ratings {         <br />&#160;&#160; Integer id         <br />&#160;&#160; String rating         <br />&#160;&#160; Integer bookId         <br /></code><code>} </code></p>
</blockquote>
<p>&#160;</p>
<p>Si tienes un sistema de ventas de libros por internet es mucho más conveniente desde un punto de vista semántico usar el primer modelo, con una sola clase Book, que contiene toda la información relevante en un sólo lugar. Como normalmente el usuario va a interactuar con un libro a la vez este modelo es más simple y directo.</p>
<p>Si vas a hacer estadísticas u operaciones agrupadas sobre los libros, el segundo modelo te conviene más. Pero considera que esas operaciones también las puedes ejecutar mediante algún mecanismos tipo <a href="http://www.lnds.net/blog/2011/10/ensaladas-y-algoritmos.html">Map Reduce</a> en otro horario, o en una base offline.</p>
<p>Las bases de datos no relacionales permiten abordar el mismo problema, pero a veces desde una perspectiva más simple, y muchas veces más ágil. Pronto veremos algunos ejemplos. Lo importante es tener una mente abierta y considerar que hay formas más simples de rascarse una oreja.</p>
<p><a href="http://www.lnds.net/blog/wp-content/uploads/2011/11/simple.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="simple" border="0" alt="simple" src="http://www.lnds.net/blog/wp-content/uploads/2011/11/simple_thumb.jpg" width="244" height="165" /></a></p>
<p>Notas:</p>
<p>[1] Edgar F. Codd, investigador británico trabajando en IBM en 1969 propuso la teoría de las bases de datos relacionales en una serie de papers a comienzos de la década de 1979, recibió el premio Turing en 1981.</p>
<p>[2] Hasta la fecha se conocen <a href="http://en.wikipedia.org/wiki/Database_normalization#Normal_forms">6 formas normales</a>, pero la imaginación de un académico no tiene límites.</p>
<p>[3] El teorema de Codd, que en realidad es un resultado de la lógica de primer orden, garantiza que una expresión en álgebra relacional puede ser expresada en cálculo relacional.</p>
<h3 class='related_post_title'>Artículos relacionados</h3>
<ul class='related_post'>
<li><a href='http://www.lnds.net/blog/2011/10/dmr.html' title='DMR'>DMR</a></li>
<li><a href='http://www.lnds.net/blog/2011/10/creadores-de-universos.html' title='Creadores de Universos'>Creadores de Universos</a></li>
<li><a href='http://www.lnds.net/blog/2011/10/datos-datos-datos.html' title='Datos, datos, datos&hellip;'>Datos, datos, datos&hellip;</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.lnds.net/blog/2011/11/sobre-cmo-rascarse-una-oreja.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>El Plan CEIBAL</title>
		<link>http://www.lnds.net/blog/2011/06/el-plan-ceibal.html</link>
		<comments>http://www.lnds.net/blog/2011/06/el-plan-ceibal.html#comments</comments>
		<pubDate>Sat, 04 Jun 2011 15:11:35 +0000</pubDate>
		<dc:creator>Eduardo Díaz</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Educación]]></category>
		<category><![CDATA[La Naturaleza del Software]]></category>
		<category><![CDATA[CEIBAL]]></category>
		<category><![CDATA[educación]]></category>
		<category><![CDATA[OLPC]]></category>
		<category><![CDATA[política]]></category>
		<category><![CDATA[Uruguay]]></category>

		<guid isPermaLink="false">http://www.lnds.net/blog/?p=1897</guid>
		<description><![CDATA[via Artículos relacionados Educación libre Transformando un País con un Pequeño Laptop Protección y Empoderamiento]]></description>
			<content:encoded><![CDATA[<p><iframe width="425" height="349" src="http://www.youtube.com/embed/AWOpCDBuhgs" frameborder="0" allowfullscreen></iframe></p>
<p><a href="http://ideaschile.wordpress.com/2011/05/17/p2p-education/">via</a><br />
<h3 class='related_post_title'>Artículos relacionados</h3>
<ul class='related_post'>
<li><a href='http://www.lnds.net/blog/2010/08/educacion-libre.html' title='Educación libre'>Educación libre</a></li>
<li><a href='http://www.lnds.net/blog/2008/07/transformando-un-pais-con-un-pequeno-laptop-2.html' title='Transformando un País con un Pequeño Laptop'>Transformando un País con un Pequeño Laptop</a></li>
<li><a href='http://www.lnds.net/blog/2011/08/proteccion-y-empoderamiento.html' title='Protección y Empoderamiento'>Protección y Empoderamiento</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.lnds.net/blog/2011/06/el-plan-ceibal.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Otra forma de verlo</title>
		<link>http://www.lnds.net/blog/2011/05/otra-forma-de-verlo.html</link>
		<comments>http://www.lnds.net/blog/2011/05/otra-forma-de-verlo.html#comments</comments>
		<pubDate>Sat, 28 May 2011 00:08:32 +0000</pubDate>
		<dc:creator>Eduardo Díaz</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[La Brecha Intelectual]]></category>
		<category><![CDATA[derechos]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[energía]]></category>
		<category><![CDATA[entendimiento]]></category>
		<category><![CDATA[progreso]]></category>
		<category><![CDATA[sociedad]]></category>

		<guid isPermaLink="false">http://www.lnds.net/blog/?p=1883</guid>
		<description><![CDATA[Les propongo esta reflexión de Hans Rosling, otra perspectiva al problema energético: (En este enlace pueden ver el video con subtítulos) Progreso creo que le llamaban&#8230; Artículos relacionados Lo legítimo Responsable La hora como un parámetro]]></description>
			<content:encoded><![CDATA[<p>Les propongo esta reflexión de Hans Rosling, otra perspectiva al problema energético:</p>
<p><object width="446" height="326"><param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"></param><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always"/><param name="wmode" value="transparent"></param><param name="bgColor" value="#ffffff"></param><param name="flashvars" value="vu=http://video.ted.com/talk/stream/2010W/Blank/HansRosling_2010W-320k.mp4&#038;su=http://images.ted.com/images/ted/tedindex/embed-posters/HansRosling-2010W.embed_thumbnail.jpg&#038;vw=432&#038;vh=240&#038;ap=0&#038;ti=1101&#038;lang=spa&#038;introDuration=15330&#038;adDuration=4000&#038;postAdDuration=830&#038;adKeys=talk=hans_rosling_and_the_magic_washing_machine;year=2010;theme=celebrating_tedwomen;theme=new_on_ted_com;theme=numbers_at_play;theme=unconventional_explanations;event=TEDWomen;tag=Culture;tag=TEDWomen;tag=data;tag=economics;tag=women;&#038;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /><embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="446" height="326" allowFullScreen="true" allowScriptAccess="always" flashvars="vu=http://video.ted.com/talk/stream/2010W/Blank/HansRosling_2010W-320k.mp4&#038;su=http://images.ted.com/images/ted/tedindex/embed-posters/HansRosling-2010W.embed_thumbnail.jpg&#038;vw=432&#038;vh=240&#038;ap=0&#038;ti=1101&#038;lang=spa&#038;introDuration=15330&#038;adDuration=4000&#038;postAdDuration=830&#038;adKeys=talk=hans_rosling_and_the_magic_washing_machine;year=2010;theme=celebrating_tedwomen;theme=new_on_ted_com;theme=numbers_at_play;theme=unconventional_explanations;event=TEDWomen;tag=Culture;tag=TEDWomen;tag=data;tag=economics;tag=women;"></embed></object></p>
<p>(En <a href="http://www.ted.com/talks/lang/spa/hans_rosling_and_the_magic_washing_machine.html">este enlace</a> pueden ver el video con subtítulos)</p>
<p>Progreso creo que le llamaban&#8230;<br />
<h3 class='related_post_title'>Artículos relacionados</h3>
<ul class='related_post'>
<li><a href='http://www.lnds.net/blog/2011/06/lo-legitimo.html' title='Lo legítimo'>Lo legítimo</a></li>
<li><a href='http://www.lnds.net/blog/2011/06/responsable.html' title='Responsable'>Responsable</a></li>
<li><a href='http://www.lnds.net/blog/2011/03/la-hora-como-un-parametro.html' title='La hora como un parámetro'>La hora como un parámetro</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.lnds.net/blog/2011/05/otra-forma-de-verlo.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Buggy nights</title>
		<link>http://www.lnds.net/blog/2011/04/buggy-nights.html</link>
		<comments>http://www.lnds.net/blog/2011/04/buggy-nights.html#comments</comments>
		<pubDate>Wed, 13 Apr 2011 00:35:45 +0000</pubDate>
		<dc:creator>Eduardo Díaz</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[La Naturaleza del Software]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[automatización]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[programación]]></category>

		<guid isPermaLink="false">http://www.lnds.net/blog/?p=1679</guid>
		<description><![CDATA[Un pequeño error de tipeo y se puede perder mucho tiempo, e incluso dinero, o quien sabe, vidas. Sucede que decidí optimizar cierto programita que estaba tomando unos 10 minutos para cargar un archivo de unos 50.000 registros, eso es bastante para el tipo de operación que se realizaba (solo había que ingresar los datos a dos tablas). Decidí modificar el código para usar un patrón típico de procesamiento de archivos en modo batch, pero como estaba apurado fui poco cuidadoso y el proceso terminó con un tiempo horrible (iba por la hora cuando lo detuve). Y aunque miraba el código no podía percibir el problema. Así que lo dejé para después y en la noche recién lo pude  revisar. La solución era tan simple como correr una inserción a una lista al interior de un if, y con esto el tiempo del proceso se redujo a 26 segundos (!). No es el primer error de este tipo que un programador ha enfrentado. En enero de 1990 los sistemas de telefónicos en Nueva York  de AT&#38;T tuvieron un fallo que provocó que la red telefónica completa de Estados Unidos colapsara. El error tiene un cierto parecido al bug en mi código. do [...]]]></description>
			<content:encoded><![CDATA[<p>Un pequeño error de tipeo y se puede perder mucho tiempo, e incluso dinero, o quien sabe, vidas.</p>
<p>Sucede que decidí optimizar cierto programita que estaba tomando unos 10 minutos para cargar un archivo de unos 50.000 registros, eso es bastante para el tipo de operación que se realizaba (solo había que ingresar los datos a dos tablas). Decidí modificar el código para usar un patrón típico de procesamiento de archivos en modo batch, pero como estaba apurado fui poco cuidadoso y el proceso terminó con un tiempo horrible (iba por la hora cuando lo detuve). Y aunque miraba el código no podía percibir el problema. Así que lo dejé para después y en la noche recién lo pude  revisar. La solución era tan simple como correr una inserción a una lista al interior de un if, y con esto el tiempo del proceso se redujo a 26 segundos (!).</p>
<p>No es el primer error de este tipo que un programador ha enfrentado. En enero de 1990 los sistemas de telefónicos en Nueva York  de AT&amp;T tuvieron un fallo que provocó que la red telefónica completa de Estados Unidos colapsara.</p>
<p>El error tiene un cierto parecido al bug en mi código.</p>
<pre>     do {
	switch expression {
          	...
                case (value):

                    if (logical) {
                       sequence of statements
                       <span style="color: #ff0000;"><strong>break</strong></span>
                   }
                  else  {
                     another sequence of statements
                  }

                 statements after if...else statement

        }
        statements after case statement
   } while (expression)</pre>
<p>El código está tomado de <a href="http://www.soft.com/AppNotes/attcrash.html">acá</a>.</p>
<p>El programador tenía poca experiencia programando en C, asumió que la instrucción break (que puse en rojo)  aplicaba a la sentencia if y esperaba que la secuencia de instrucciones después del if..else se ejecutara, lo que nunca sucedió.</p>
<p>En mi caso es un programa que por ahora sólo estoy ocupando yo, pero en el caso de AT&amp;T el costo fue millonario, y el problema de imagen bastante grave.</p>
<p>Hay que tomarse el tiempo para leer el código, y estar en un estado de concentración para evitar errores de este tipo, y por supuesto desarrollar un buen hábito de probar el código antes de pasar a producción.</p>
<p>El error de AT&amp;T pudo haberse evitado con el uso de herramientas automatizadas de análisis de código. Si les interesa el tema los dejo con este video con una charla de Ira Baxter, de Semantics Design sobre herramientas de este tipo:</p>
<p><iframe title="YouTube video player" width="480" height="390" src="http://www.youtube.com/embed/C-_dw9iEzhA" frameborder="0" allowfullscreen></iframe><br />
<h3 class='related_post_title'>Artículos relacionados</h3>
<ul class='related_post'>
<li><a href='http://www.lnds.net/blog/2011/03/hazlo.html' title='Hazlo'>Hazlo</a></li>
<li><a href='http://www.lnds.net/blog/2011/01/zig-zag.html' title='Zig Zag'>Zig Zag</a></li>
<li><a href='http://www.lnds.net/blog/2011/01/un-test-mas-dificil.html' title='Un Test Más Dificil'>Un Test Más Dificil</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.lnds.net/blog/2011/04/buggy-nights.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Confianza y Anarquía</title>
		<link>http://www.lnds.net/blog/2011/03/confianza-y-anarquia.html</link>
		<comments>http://www.lnds.net/blog/2011/03/confianza-y-anarquia.html#comments</comments>
		<pubDate>Sat, 26 Mar 2011 17:37:08 +0000</pubDate>
		<dc:creator>Eduardo Díaz</dc:creator>
				<category><![CDATA[Arte]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[La Naturaleza del Software]]></category>
		<category><![CDATA[Paradigmas]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[agilidad]]></category>
		<category><![CDATA[confianza]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[metodología]]></category>
		<category><![CDATA[paradigmas]]></category>
		<category><![CDATA[peor es mejor]]></category>
		<category><![CDATA[proceso]]></category>

		<guid isPermaLink="false">http://www.lnds.net/blog/?p=1630</guid>
		<description><![CDATA[Interacción directa con el usuario, generación de confianza, anarquía, las claves de esta charla de Fred George en infoq, que les recomiendo: http://www.infoq.com/presentations/Leaner-Programmer-Anarchy Por razones totalmente accidentales, estoy en medio de un proceso de anarquía con uno de mis equipos. No hay un &#8220;jefe de proyectos&#8221; a cargo de este equipo de 4 desarrolladores. En estos momentos dependen directamente de mí, pero están trabajando literalmente sin un administrador. Cometemos muchas de las herejías que propone Fred George, y no porque seamos super modernos y estemos experimentando con lean o metodologías post ágiles, simplemente tenemos que sacar las tareas adelante. Y lo interesante, que he observado que la confianza en la capacidad de este equipo ha aumentado, principalmente de nuestros clientes internos. La siguiente es una descripción resumida de lo que estamos haciendo: No hay sprints, ni kanban board, pero  usamos Jira para registrar lo que debemos hacer y saber quien está en qué. No hay standup meetings, ni historias de usuario, ni estimaciones, ni siquiera reuniones de coordinación. Ellos toman sus decisiones, son autónomos, me mantienen informado, pero no hay barreras burocráticas. Acuden a mi para que destrabe alguna situación que impide realizar el trabajo. Mi rol es de facilitar y comprometer [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.lnds.net/blog/wp-content/uploads/2011/03/FredGeorge.jpg"><img class="alignright size-full wp-image-1634" title="FredGeorge" src="http://www.lnds.net/blog/wp-content/uploads/2011/03/FredGeorge.jpg" alt="" width="120" height="179" /></a>Interacción directa con el usuario, generación de confianza, anarquía, las claves de esta charla de <a href="http://www.infoq.com/author/Fred-George">Fred George</a> en infoq, que les recomiendo: <a href="http://www.infoq.com/presentations/Leaner-Programmer-Anarchy">http://www.infoq.com/presentations/Leaner-Programmer-Anarchy</a></p>
<p>Por razones totalmente accidentales, estoy en medio de un proceso de anarquía con uno de mis equipos. No hay un &#8220;jefe de proyectos&#8221; a cargo de este equipo de 4 desarrolladores. En estos momentos dependen directamente de mí, pero están trabajando literalmente sin un administrador.</p>
<p>Cometemos muchas de las herejías que propone Fred George, y no porque seamos super modernos y estemos experimentando con lean o metodologías post ágiles, simplemente tenemos que sacar las tareas adelante. Y lo interesante, que he observado que la confianza en la capacidad de este equipo ha aumentado, principalmente de nuestros clientes internos.</p>
<p><a href="http://www.lnds.net/blog/wp-content/uploads/2011/03/TrustEquation.jpg"><img class="aligncenter size-medium wp-image-1632" title="TrustEquation" src="http://www.lnds.net/blog/wp-content/uploads/2011/03/TrustEquation-300x214.jpg" alt="" width="300" height="214" /></a></p>
<p>La siguiente es una descripción resumida de lo que estamos haciendo:</p>
<ul>
<li>No hay sprints, ni kanban board, pero  usamos Jira para registrar lo que debemos hacer y saber quien está en qué. No hay standup meetings, ni historias de usuario, ni estimaciones, ni siquiera reuniones de coordinación.</li>
<li>Ellos toman sus decisiones, son autónomos, me mantienen informado, pero no hay barreras burocráticas. Acuden a mi para que destrabe alguna situación que impide realizar el trabajo. Mi rol es de facilitar y comprometer a las otras áreas para cumplir con las entregas.</li>
<li>La única barrera burocrática importante está con los pasos a producción.</li>
<li>El concepto de QA es difuso, no hay un equipo de QA, el usuario final está probando sobre el ambiente de desarrollo las nuevas características y entrega un feed back inmediato. El paso por el ambiente de QA es casi un trámite formal, un paso para homologar ambiente  (lo que cuestiona mucho de los procedimientos internos, pero esa pelea he decidido postergarla).</li>
<li>Aumentamos la interacción usuario final con el desarrollador, los desarrolladores pasan mucho tiempo sentado con el usuario estudiando el problema, y proponiendo soluciones que incluso el mismo usuario no visualizaba.</li>
<li>El desarrollador es:  analista funcional, arquitecto, diseñador y programador.</li>
<li>Compromisos de fechas, entregamos cuando nos comprometemos.</li>
<li><a href="http://www.lnds.net/blog/2010/05/peor-es-mejor.html">Peor es mejor</a>, lo entregado normalmente es menos del 100% pero es usable.</li>
</ul>
<p>Hemos logrado aumentar la confianza, eso es lo que más me ha sorprendido. Los usuarios sienten que están obteniendo por fin aplicaciones que se ajustan más a lo que necesitaban.</p>
<p>Un ejemplo, una aplicación tenía especificado que se debía &#8220;cargar archivos mediante un botón&#8221;, la implementación que llevaba más de un año en producción, hacía eso, pero sólo permitía cargar un archivo a la vez, y mientras se cargaba el archivo el usuario quedaba imposibilitado de hacer otras cosas. En realidad lo que los usuarios necesitaban era programar una serie de múltiples cargas, el desarrollador al sentarse con el usuario y ver lo que hacían comprendió el grave problema de usabilidad de la aplicación tal como estaba, el resultado fue que en el siguiente release, le llevaron, como sorpresa, una interfaz mejorada, que dejaba libre al usuario para poder realizar otras cosas con su computador (el usuario nunca pidió esa mejora, fue ofrecida &#8220;gratuitamente&#8221; por el desarrollador).</p>
<p>El gran problema de las metodologías más pesadas es que entre usuario y desarrollador hay muchas barreras: Usuario Final -&gt; Jefe -&gt; StakeHolder -&gt; Sponser -&gt; Jefe de Proyecto -&gt; Analista Funcional -&gt; Diseñador -&gt; Arquitecto -&gt; Programador.</p>
<div id="attachment_1631" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.lnds.net/blog/wp-content/uploads/2011/03/BusinessDecisionShift.png"><img class="size-medium wp-image-1631" title="BusinessDecisionShift" src="http://www.lnds.net/blog/wp-content/uploads/2011/03/BusinessDecisionShift-300x227.png" alt="" width="300" height="227" /></a><p class="wp-caption-text">Cambio en las decisiones de negocios según Fred George (click para agrandar)</p></div>
<p>La interacción debe ser Usuario Final &lt;-&gt; Desarrollador, eso aumenta el entendimiento, la comunicación del problema y la confianza. Finalmente, emerge esta interacción: Usuario Final &lt;- Desarrollador, es el desarrollador quien termina ofreciendo nuevas características al usuario final.</p>
<p>Cosas que me gustan de la presentación de Fred George, y que en cierto modo he transmitido en este blog:</p>
<p>1. Se necesitan resultados, no explicaciones, ni buscar culpables. Este pensamiento elimina las estimaciones, retrospectivas, iteraciones, y todo ese &#8220;waste&#8221; que terminan generando las metodologías ágiles.</p>
<p>2. Los standups meeting y las historias se pueden reemplazar con una mayor interacción con el usuario.</p>
<p>3. Menos roles, colapsar todas esas funciones en una sola: desarrollador, hasta el administrador desaparece. Finalmente lo que necesitamos es contratar buenos programadores.</p>
<div id="attachment_1633" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.lnds.net/blog/wp-content/uploads/2011/03/practicas.png"><img class="size-medium wp-image-1633" title="practicas" src="http://www.lnds.net/blog/wp-content/uploads/2011/03/practicas-300x222.png" alt="" width="300" height="222" /></a><p class="wp-caption-text">Buenas Prácticas Agiles no usadas (click para agrandar)</p></div>
<p style="text-align: left;">El valor de generar confianza entre el desarrollador y el usuario es, finalmente, la gran enseñanza de esta experiencia, y lo que transmite Fred George en su charla. Les reitero la invitación a verla, y ha estudiar sus herejías, y ponerlas en práctica.</p>
<p style="text-align: left;">Un lector cínico podrá criticarme y decir que en realidad no estoy haciendo gestión y esta anarquía terminará pasándome la cuenta, la verdad es que nunca he planeado seguir esta estrategia, siempre he trabajado así <img src='http://www.lnds.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , soy un anarquista convencido, y mi experiencia me ha mostrado que se pueden sacar adelante muchos proyectos de este modo. Lo que pasa es que la gente se pone nerviosa cuando no hay  estructura, planificación y todo eso, sobretodo los ingenieros, que son los más nerviosos. No se preocupen tanto y confíen.</p>
<p style="text-align: center;"><a href="http://www.lnds.net/blog/wp-content/uploads/2010/11/gato.jpg"><img class="aligncenter size-full wp-image-994" title="gato" src="http://www.lnds.net/blog/wp-content/uploads/2010/11/gato.jpg" alt="" width="420" height="256" /></a></p>
<h3 class='related_post_title'>Artículos relacionados</h3>
<ul class='related_post'>
<li><a href='http://www.lnds.net/blog/2011/03/hazlo.html' title='Hazlo'>Hazlo</a></li>
<li><a href='http://www.lnds.net/blog/2010/08/lo-que-sabemos.html' title='Lo que sabemos'>Lo que sabemos</a></li>
<li><a href='http://www.lnds.net/blog/2011/11/comprensin-de-lectura.html' title='Comprensi&oacute;n de lectura'>Comprensi&oacute;n de lectura</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.lnds.net/blog/2011/03/confianza-y-anarquia.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La fuente de energía perfecta</title>
		<link>http://www.lnds.net/blog/2011/03/la-fuente-de-energia-perfecta.html</link>
		<comments>http://www.lnds.net/blog/2011/03/la-fuente-de-energia-perfecta.html#comments</comments>
		<pubDate>Thu, 03 Mar 2011 11:05:26 +0000</pubDate>
		<dc:creator>Eduardo Díaz</dc:creator>
				<category><![CDATA[Ciencia]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Evolución]]></category>
		<category><![CDATA[ciencia]]></category>
		<category><![CDATA[ecología]]></category>
		<category><![CDATA[energía]]></category>
		<category><![CDATA[fusión]]></category>
		<category><![CDATA[paradigmas]]></category>
		<category><![CDATA[tecnología]]></category>

		<guid isPermaLink="false">http://www.lnds.net/blog/?p=1573</guid>
		<description><![CDATA[La Fusión nuclear es probablemente la forma de energía ideal, no tiene residuos tóxicos, sin emisión de CO2, sin radiación ni residuos radiactivos, es el mecanismo a través del cual funcionan las estrellas, probablemente se requieran muy pocas plantas de fusión para toda la energía mundial, quién sabe, pero ¿cuándo? hemos tratado de generar energía de fusión por más de 50 años, cuando tendremos esta fuente perfecta de energía de eso se trata este video de TED: &#160; Artículos relacionados ¿Qué es la Energía? Que cosas suceden con el apagón Qué es Cloud Computing]]></description>
			<content:encoded><![CDATA[<p>La Fusión nuclear es probablemente la forma de energía ideal, no tiene residuos tóxicos, sin emisión de CO2, sin radiación ni residuos radiactivos, es el mecanismo a través del cual funcionan las estrellas, probablemente se requieran muy pocas plantas de fusión para toda la energía mundial, quién sabe, pero ¿cuándo? hemos tratado de generar energía de fusión por más de 50 años, cuando tendremos esta fuente perfecta de energía de eso se trata este video de TED:</p>
<p>&nbsp;<br />
<!--copy and paste--><object width="446" height="326"><param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"></param><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always"/><param name="wmode" value="transparent"></param><param name="bgColor" value="#ffffff"></param><param name="flashvars" value="vu=http://video.ted.com/talks/dynamic/StevenCowley_2009G-medium.flv&#038;su=http://images.ted.com/images/ted/tedindex/embed-posters/StevenCowley-2009G.embed_thumbnail.jpg&#038;vw=432&#038;vh=240&#038;ap=0&#038;ti=718&#038;introDuration=15330&#038;adDuration=4000&#038;postAdDuration=830&#038;adKeys=talk=steven_cowley_fusion_is_energy_s_future;year=2009;theme=speaking_at_tedglobal2009;theme=bold_predictions_stern_warnings;theme=unconventional_explanations;theme=a_greener_future;event=TEDGlobal+2009;&#038;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /><embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="446" height="326" allowFullScreen="true" allowScriptAccess="always" flashvars="vu=http://video.ted.com/talks/dynamic/StevenCowley_2009G-medium.flv&#038;su=http://images.ted.com/images/ted/tedindex/embed-posters/StevenCowley-2009G.embed_thumbnail.jpg&#038;vw=432&#038;vh=240&#038;ap=0&#038;ti=718&#038;introDuration=15330&#038;adDuration=4000&#038;postAdDuration=830&#038;adKeys=talk=steven_cowley_fusion_is_energy_s_future;year=2009;theme=speaking_at_tedglobal2009;theme=bold_predictions_stern_warnings;theme=unconventional_explanations;theme=a_greener_future;event=TEDGlobal+2009;"></embed></object><br />
<h3 class='related_post_title'>Artículos relacionados</h3>
<ul class='related_post'>
<li><a href='http://www.lnds.net/blog/2011/01/%c2%bfque-es-la-energia.html' title='¿Qué es la Energía?'>¿Qué es la Energía?</a></li>
<li><a href='http://www.lnds.net/blog/2010/08/que-cosas-suceden-con-el-apagon.html' title='Que cosas suceden con el apagón'>Que cosas suceden con el apagón</a></li>
<li><a href='http://www.lnds.net/blog/2010/07/que-es-cloud-computing.html' title='Qué es Cloud Computing'>Qué es Cloud Computing</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.lnds.net/blog/2011/03/la-fuente-de-energia-perfecta.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Hazlo</title>
		<link>http://www.lnds.net/blog/2011/03/hazlo.html</link>
		<comments>http://www.lnds.net/blog/2011/03/hazlo.html#comments</comments>
		<pubDate>Tue, 01 Mar 2011 00:49:40 +0000</pubDate>
		<dc:creator>Eduardo Díaz</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[La Naturaleza del Software]]></category>
		<category><![CDATA[Paradigmas]]></category>
		<category><![CDATA[Usabilidad]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[gestión]]></category>
		<category><![CDATA[hazlo]]></category>
		<category><![CDATA[ingeniería de software]]></category>
		<category><![CDATA[mejor]]></category>
		<category><![CDATA[paradigmas]]></category>
		<category><![CDATA[peor]]></category>
		<category><![CDATA[peor es mejor]]></category>
		<category><![CDATA[perfección]]></category>
		<category><![CDATA[proyectos]]></category>

		<guid isPermaLink="false">http://www.lnds.net/blog/?p=1556</guid>
		<description><![CDATA[El otro día vi la charla de Ricardo Baeza en Chile Va, y en un momento él da algunos consejos que le han servido en su carrera, como por ejemplo, &#8220;no hagan planes, no se proyecten &#8230;. si yo hubiera imaginado que iba hacer en mi vida no estaría aquí en este momento&#8230; porque cuando uno se proyecta lo hace en algo más pequeño, porque cree que así lo va a lograr. Porque uno no se atreve a ponerse una meta muy grande, porque ¿qué pasa si no llego a esa meta, me voy a frustrar? No&#8221;. También aconseja a ser flexibles, a reinventarse. Aceptar que los errores muchas veces no lo son, simplemente es falta de información, o decisiones que se toman con la información que se cuenta en ese momento. Pero el consejo que Ricardo Baeza considera más importante es: &#8220;no piensen en lo que tienen que hacer, ¡háganlo!&#8221;. ¿Cuánto tiempo hemos perdido en pensar lo que tenemos que hacer, en cómo hacerlo, cuando todo ese tiempo lo podríamos haber aprovechado en hacer lo que debíamos? Hazlo. Cuando uno desarrolla software el &#8220;hazlo&#8221; corresponde a entregar el producto, o servicio, en la fecha comprometida. En inglés dicen Ship [...]]]></description>
			<content:encoded><![CDATA[<p>El otro día vi <a href="http://www.youtube.com/watch?v=6LsmPjKXsvM">la charla de Ricardo Baeza</a> en <a href="http://www.chileva.cl/">Chile Va</a>, y en un momento él da algunos consejos que le han servido en su carrera, como por ejemplo,  &#8220;no hagan planes, no se proyecten &#8230;. si yo hubiera imaginado que iba hacer en mi vida no estaría aquí en este momento&#8230; porque cuando uno se proyecta lo hace en algo más pequeño, porque cree que así lo va a lograr. Porque uno no se atreve a ponerse una meta muy grande, porque ¿qué pasa si no llego a esa meta, me voy a frustrar? No&#8221;. También aconseja a ser flexibles, a reinventarse. Aceptar que los errores muchas veces no lo son, simplemente es falta de información, o decisiones que se toman con la información que se cuenta en ese momento.</p>
<p>Pero el consejo que Ricardo Baeza considera más importante es: &#8220;no piensen en lo que tienen que hacer, ¡háganlo!&#8221;. ¿Cuánto tiempo hemos perdido en pensar lo que tenemos que hacer, en cómo hacerlo, cuando todo ese tiempo lo podríamos haber aprovechado en hacer lo que debíamos? Hazlo.</p>
<p>Cuando uno desarrolla software el &#8220;hazlo&#8221; corresponde a entregar el producto, o servicio, en la fecha comprometida. En inglés dicen <em>Ship It</em>, ¡entrega la maldita aplicación!</p>
<p>En palabras de Jeff Attwood: &#8220;<a href="http://www.codinghorror.com/blog/2009/12/version-1-sucks-but-ship-it-anyway.html">Version 1 Sucks, But Ship It Anyway</a>&#8221; (&#8220;La versión 1 apesta, pero entrégala de todas maneras&#8221;).</p>
<p>Todo proyecto está plagado de dificultades:</p>
<ul>
<li>La planificación era muy agresiva y demasiado corta. ¡Necesitamos más tiempo!</li>
<li>Encontramos problemas técnicos no previstos que nos forzaron a hacer compromisos con los que no estamos conformes.</li>
<li>Teníamos un diseño erróneo, y necesitamos cambiarlo en medio del desarrollo.</li>
<li>Nuestro equipo experimento fricciones internas entre sus miembros que no anticipamos.</li>
<li>Los mejores programadores abandonan el equipo porque encontraron una mejor oferta económica</li>
<li>Los clientes no respondían a nuestras solicitudes de información a tiempo.</li>
<li>La gente de infraestructura y de desarrollo no se comunicaban adecuadamente.</li>
<li>El tiempo de respuesta de los proveedores no era el que ofrecieron inicialmente.</li>
<li> Usamos una tecnología que fue descontinuada en la mitad del proyecto.</li>
</ul>
<p>Los problemas son miles. Los registros en correo electrónico dejan una traza de cientos de mensajes diarios, y varios gigabytes de discusiones, aclaraciones, documentos, pantallas, informes, cientos de revisiones a la carta gantt, una larga lista de bugs y correcciones.</p>
<blockquote><p>&#8220;Al final del ciclo de desarrollo finalizas con un software que es una pálida sombra del brillante, glorioso monumento a la ingeniería de software que visualizaste al empezar.&#8221;</p></blockquote>
<p>Y la tentación de tirar la toalla, como dice Attwood, es grande, y pedir más tiempo para poder completar lo que falta es el mayor error que se podría cometer, ¡porque los verdaderos desarrolladores entregan!</p>
<p>Hay <a href="http://www.lnds.net/blog/2010/08/lo-que-sabemos.html">muchos errores de los que todavía no sabes nada</a>, pero ¿cómo vas a enfrentarlos si aún no entregas el software? No es el mejor producto, puede que consideres que es el peor servicio que has entregado,  pero a veces <a href="http://www.lnds.net/blog/2010/05/peor-es-mejor.html">peor es mejor</a>.</p>
<p>Un software, un servicio que se usa, que es entregado, que ha sido liberado a sus usuarios es mejor que aquel que sufre la enésima reprogramación para entregar un <em>&#8220;producto de calidad&#8221;</em>.</p>
<p>Todo esto a propósito de un hito que cumplimos con mi equipo, precisamente hoy. Porque se trata de un servicio que entró en operaciones en la fecha comprometida, lo entregamos, lo hicimos. Aún faltan cosas, tenemos nuestra lista de bugs y pendientes, seguiremos trabajando por meses, pero lo esencial está allí.</p>
<p>We shiped it! Los usuarios ya lo están usando, el servicio está en el aire. Entregamos, ¡lo hicimos!, un sistema funcionando, lo logramos  y se siente bien <img src='http://www.lnds.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<h3 class='related_post_title'>Artículos relacionados</h3>
<ul class='related_post'>
<li><a href='http://www.lnds.net/blog/2010/08/lo-que-sabemos.html' title='Lo que sabemos'>Lo que sabemos</a></li>
<li><a href='http://www.lnds.net/blog/2010/05/peor-es-mejor.html' title='Peor es mejor'>Peor es mejor</a></li>
<li><a href='http://www.lnds.net/blog/2011/03/confianza-y-anarquia.html' title='Confianza y Anarquía'>Confianza y Anarquía</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.lnds.net/blog/2011/03/hazlo.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Knuth responde a todas las preguntas</title>
		<link>http://www.lnds.net/blog/2011/01/knuth-responde-a-todas-las-preguntas-2.html</link>
		<comments>http://www.lnds.net/blog/2011/01/knuth-responde-a-todas-las-preguntas-2.html#comments</comments>
		<pubDate>Fri, 21 Jan 2011 15:12:21 +0000</pubDate>
		<dc:creator>Eduardo Díaz</dc:creator>
				<category><![CDATA[Arte]]></category>
		<category><![CDATA[Ciencia]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Educación]]></category>
		<category><![CDATA[La Naturaleza del Software]]></category>
		<category><![CDATA[Personajes]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[arte]]></category>
		<category><![CDATA[ciencia]]></category>
		<category><![CDATA[Donald Knuth]]></category>
		<category><![CDATA[entendimiento]]></category>
		<category><![CDATA[Knuth]]></category>
		<category><![CDATA[preguntas]]></category>
		<category><![CDATA[programación]]></category>

		<guid isPermaLink="false">http://www.lnds.net/blog/?p=1269</guid>
		<description><![CDATA[Otro artículo, esta vez es una traducción de una charla de Knuth publicada en 2006, por cierto, Knuth fue premiado recientemente en España, de acuerdo a esta noticia en El Pais. Knuth responde a todas las preguntas Todos tenemos nuestros heroes personales, hombres representativos, sobretodo del campo en que nos desarrollamos. Uno de mis más antiguos héroes personales es el profesor y programador Donald Knuth. Autor del famoso Art of Computer Programming, y un gran programador. Creador de Metafont y TeX, usados por miles de científicos hoy en día para publicar sus artículos. Donald Knuth es profesor emérito en la Universidad de Stanford, y probablemente el geek más antiguo que existe. Por ejemplo, las versiones de Tex se aproximan al número trascendente Pi, por ejemplo, la primera versión era la 3, la segunda 3.1, la tercera 3.14, y así sucesivamente. Además tiene la costumbre de pagar 2.56 dólares por cada error encontrado en sus libros (porque &#8220;256 centavos es un dolar hexadecimal&#8221;). Imitando al famoso físico Richard Feynman tiene la costumbre de que la última clase en cada curso que dicta está abierta para contestar cualquier pregunta sobre cualquier tema, excepto las relacionadas con política, religión, o el examen final. Una [...]]]></description>
			<content:encoded><![CDATA[<p>Otro artículo, esta vez es una traducción de una charla de Knuth publicada en 2006, por cierto, Knuth fue premiado recientemente en España, de acuerdo a <a href="http://www.elpais.com/articulo/sociedad/hombre/habla/maquinas/elpepusoc/20110118elpepusoc_2/Tes">esta noticia en El Pais</a>.</p>
<h2>Knuth responde a todas las preguntas</h2>
<p><img class="alignright size-full wp-image-1265" title="knuth0" src="http://www.lnds.net/blog/wp-content/uploads/2011/01/knuth0.jpg" alt="" width="278" height="189" /></p>
<p>Todos tenemos nuestros heroes personales, hombres representativos, sobretodo del campo en que nos desarrollamos.</p>
<p>Uno de mis más antiguos héroes personales es el profesor y programador <a href="http://web.archive.org/web/20070513053932/http://www-cs-faculty.stanford.edu/~uno/">Donald Knuth</a>.</p>
<p>Autor del famoso <a href="http://web.archive.org/web/20070513053932/http://en.wikipedia.org/wiki/The_Art_of_Computer_Programming">Art of Computer Programming</a>, y un gran programador. Creador de <a href="http://web.archive.org/web/20070513053932/http://en.wikipedia.org/wiki/METAFONT">Metafont</a> y <a href="http://web.archive.org/web/20070513053932/http://en.wikipedia.org/wiki/TeX">TeX</a>, usados por miles de científicos hoy en día para publicar sus artículos.</p>
<p>Donald Knuth es profesor emérito en la Universidad de Stanford, y probablemente el geek más antiguo que existe. Por ejemplo, las versiones de Tex se aproximan al número trascendente Pi, por ejemplo, la primera versión era la 3, la segunda 3.1, la tercera 3.14, y así sucesivamente. Además tiene la costumbre de pagar 2.56 dólares por cada error encontrado en sus libros (porque &#8220;256 centavos es un dolar hexadecimal&#8221;).</p>
<p>Imitando al famoso físico <a href="http://web.archive.org/web/20070513053932/http://en.wikipedia.org/wiki/Richard_Feynman">Richard Feynman</a> tiene la costumbre de que la última clase en cada curso que dicta está abierta para contestar cualquier pregunta sobre cualquier tema, excepto las relacionadas con política, religión, o el examen final.</p>
<p>Una de estas sesiones de preguntas y respuestas se realizó como una conferencia el 5 de octubre de 2001 en la Technische Universität. Esta sesión fue transcrita en en <a href="http://web.archive.org/web/20070513053932/http://www.ams.org/notices/">Notices  of AMS</a> (<a href="http://web.archive.org/web/20070513053932/http://www.ams.org/">American  Mathematical Society</a>). Ustedes pueden <a href="http://web.archive.org/web/20070513053932/http://www.ams.org/notices/200203/fea-knuth.pdf">descargarla </a>desde ese sitio, pero quiero compartir con ustedes una traducción de algunas  de las preguntas que me parecieron más interesantes, los invito a conocer a uno  de los grandes pensadores de las ciencias de la computación (los títulos son mi  culpa).</p>
<h2>Las ciencias de la computación</h2>
<blockquote><p><strong>Knuth</strong>: En todos los cursos que doy en Stanford, el  último día se dedica a una sesión de &#8220;todas las preguntas son contestadas&#8221;. Los  estudiantes no están obligados a vernir a esta clase, pero si vienen puede  preguntar sobre cualquier asunto excepto religión o política o sobre el examen  final. Yo copié la idea de Richard Feynman, quien hacía lo mismo en sus clases  en Caltech, y siempre era interesante ver que querían saber realmente los  estudiantes. Hoy día contestaré cualquier pregunta sobre cualquier asunto.  ¿Permitiremos religión o política? No lo sé. Pero no hay un examen final de que  preocuparse. Trataré de contestar sin tomar mucho tiempo de modo que tengamos  muchas preguntas. Así que ¿quién quiere preguntar primero? &#8230; Bueno, si no hay  preguntas [Knuth hace el gesto de retirarse]</p></blockquote>
<blockquote>
<blockquote><p><strong>Pregunta</strong>: Había un reporte especial para el presidente norteamericano, el reporte PITAC, conteniendo algunas recomendaciones. Me preguntaba si usted quiere comentar sobre las prioridades delineadas en esas recomendaciones: mejor ingeniería de software, construir un computador teraflop, mejoras en la Internet incluyendo una mayor seguridad y más ancho de banda, y los impactos socio económicos de manejar información disponible a través de las redes de computadores.</p></blockquote>
<blockquote><p><strong>Knuth</strong>: Pienso que esa es una solución brillante del problema de que presentarle a un presidente. Pero de hecho lo que me gustaría ver es que a miles de cientificos en computadoras se les permita hacer lo que ellos quieran. Eso lo que realmente permite avances en el campo. De mi experiencia escribiendo The Art of Computer Programming, si me preguntabas en ese tiempo de qué era lo más importante que pasaba en ciencias de la computacion en ese año probablemente no tendría respuesta para la pregunta, pero en cinco años todo el campo cambió. Las ciencias de la computación son el producto de una tremenda colaboración de gente de todo el mundo añadiendo pequeños ladrillos a una enorme pared. Los ladrillos individuales son los que la hacen funcionar, y no los hitos individuales (milestones).</p></blockquote>
<blockquote><p><strong><a href="http://www.lnds.net/blog/wp-content/uploads/2011/01/knuth1.jpg"><img class="alignleft size-full wp-image-1266" title="knuth1" src="http://www.lnds.net/blog/wp-content/uploads/2011/01/knuth1.jpg" alt="" width="178" height="187" /></a>Pregunta</strong>: ¿Qué piensa de la investigación en algoritmos criptográficos? Y que piensa de los esfuerzos de los políticos de hoy para poner límites a la investigación en criptografía?</p></blockquote>
<blockquote><p><strong>Knuth</strong>: Ciertamente toda el área de algoritmos criptográficos es una de las más activa y excitantes áreas en ciencias de la computación en los últimos diez años, y muchos de sus resultado son espectaculares y hermosos. No puedo decir que soy particularmente buen en este tema, debido a que no puedo pensar en buenos ataques por mi mismo. Pero el problema clave es ¿qué pasa con el abuso de los métodos seguros de comunicación? No quiero que los criminales usen esos métodos para ser mejores criminales. Soy un hombre religioso, y pienso que Dios sabe todos mis secretos, así que siempre siento que cualquier cosa que pienso es conocimiento público en cierta forma. Vengo con este bagaje. No siento que tenga que encriptar todo lo que hago. Por otra parte, me sentiría bastante diferente si alguien comenzara a usar tal apertura en contra mía, robando mi cuenta bancaria o cualquier cosa. Así que yo apoyo un alto nivel de secretismo. Pero sobre si debería ser imposible para las autoridades decodificar cosas aún en investigaciones criminales, en casos extremos, allí yo tiendo a irme al lado que quiere que se disponga de alguna manera de quebrar algunas claves a veces.</p></blockquote>
<h2>Dios y la computación</h2>
<blockquote><p><strong>Pregunta</strong>: Los matemáticos dicen que Dios tiene el &#8220;Libro de las Demostraciones&#8221;, donde todas las demostraciones más bellas están escritas. Puede recomendar algunos algoritmos del &#8220;Libro de los Algoritmos&#8221;.</p></blockquote>
<blockquote><p><strong>Knuth</strong>: Esa es una buena pregunta. Fue Paul Erdo˝s quien promulgó la ide de que Dios tiene un libro conteniendo las mejores demostraciones matemáticas, y creo que mi amigo Günter Ziegler en Berlin ha recientemente escrito sobre esto. Recuerdo que los matemáticos me decían en los años 1960&#8242;s que considerarían las ciencas de la computación una disciplina madura cuando esta tuviera 1.000 algoritmos profundos. Pienso que probablemente hemos alcanzado los 500. Ciertamente hay muchos algoritmos que pienso deben ser considerados absolutamente hermosos e inmortales, en algún sentido. Dos ejemplos son el algoritmo de Euclides y el correspondiente que trabaja en notación binaria y que puede haber sido desarrollado en forma independiente en China, casi tan tempanamente como el algoritmo de Euclides fue inventado en Grecia. En mis libros me preocupo con los algoritmos clásicos y que han estado con nosotros por un largo tiempo. Pero todos los años encontramos nuevas ideas brillantes que pienso van a permanecer para siempre.</p></blockquote>
</blockquote>
<blockquote>
<blockquote><p><strong>Pregunta</strong>: ¿Cuál es la relación entre Dios y los computadores?</p></blockquote>
<blockquote><p><strong>Knuth</strong>: En uno de mis libros, 3:16 Bible Texts Illuminated [BTI], uso muestras aleatorias para estudiar sesenta diferentes versículos de la Biblia y lo que la gente diversas percepciones y de diferentes siglos and dicho sobre estos versículos. Hice el estudio primero por mi mismo, y entonces encontré que era los suficientemente interesante como para hacer un libro sobre esto. Obtuve a sesenta de los mejores artistas en el mundo para ilustrar mi libro, muchos de ellos en Alemania. El trabajo artístico fue exhibido dos veces en Alemania, y en otros paises alrededor del mundo. Fue mostrado también en la Catedral Nacional en Washington,<br />
DC. En ese libro usé metodologías que los cientificos de la computación usan a menudo para entender un asunto complicado, para ver si este método podría dar alguna luz en la Biblia, la que es en si misma un asunto complicado.<br />
En el libro no doy respuestas. Sólo digo que pienso que es bueno que la vida sea una búsqueda constante. El viaje es más importante que el destino</p></blockquote>
</blockquote>
<h2>El futuro de la computación</h2>
<blockquote><p><strong>Pregunta</strong>: ¿Cuáles son los cinco problemas más importantes en las ciencias de la computación?</p></blockquote>
<blockquote><p><strong>Knuth</strong>: No me gusta este negocio de los &#8220;primeros diez&#8221; . So los úItimos diez lo que me gustan. Pienso que usted debe ir por las cosas pequeñas, las piedras que construyen la pared.</p></blockquote>
<div><img class="alignright" src="http://web.archive.org/web/20070513053932/http://www.lnds.net/images/knuth2.JPG" alt="knuth2.JPG" width="104" height="126" /></div>
<blockquote><p><strong>Pregunta</strong>: ¿Tiene algunas ideas sobre la computación cuántica?</p></blockquote>
<blockquote><p><strong>Knuth</strong>: Si, pero no sé mucho al respecto. Es un paradigma muy diferente del que estoy acostumbrado. Tiene en común un montón de cosas con el tipo de computación que conozco, pero tambien es bastante misteriosa en que tienes todas las preguntas al final; no puedes hacer un test y entonces determinar que hacer a continuación. Muchos de ustedes han visto la película &#8220;Lola rennt&#8221; (llamada &#8220;Run Lola Run&#8221; en Estados Unidos), en la cual el argumente ocurre en tres tiempos diferentes, con el resultado de tres diferentes ramas. La computación cuántica es algo como eso: el mundo va por muchas ramas, y estamos interesados en la única en donde el resultado es el más aceptable. Soy bueno en computación no cuántica, peroo es muy posible que si la computación cuántica prende, yo no sea capaz de hacer nada nuevo. El trabajo de mi vida en con computadores no porque esté interesado tanto en computación, sino porque suced que yo soy bueno en este tipo de computación. Afortunadamente para mí, encontré que lo que puede hacer bien era interesante para otra gente. No desarrollé una habilidad para pensar sobre algoritmos porque quisiera ayudar a la gente a resolver problemas. De algún modo en ese tiempo cuando era adolescente, tenía una manera peculiar de pensar que me hizo buen programando. Pero puede que no sea bueno en programación cuántica. Parece un mundo diferente del mío.</p></blockquote>
<blockquote><p><strong>Pregunta:</strong> ¿Tendremos máquinas inteligentes alguna vez? ¿Deberíamos tenerlas?</p></blockquote>
<blockquote><p><strong>Knuth</strong>: Han habido siempre estimaciones exageradas sobre cuan pronto tendremos una máquina que sea inteligente. Yo todavía no veo señales de acercarnos al problema centra de entender lo que es la cognición, lo que significa pensar. Los neurologistas están haciendo mejores medidas que antes, pero están lejos de encontrar la respuesta de modo que no puedo clasificar a la neurociencia como uno de los campos más activos del trabajo actual. La biología ha estado obteniendo respuestas, con el ADN y las células madres, y todo eso. Pero con la cognición todabía están buscando el secreto.Algunos libros muy provocadores para el pensamiento han salido hace uno o dos años atrás, uno escrito por Hans Moravec [Mo], y otro por Ray Kurzweil [Ku]. Ambos están diciendo que en veinte o treinta años tendremos máquinas más inteligentes que os humanos. Algunos se preocupan por esto. Mi actitud es, si es es verdad, mas poder para ellos. Si son más inteligentes que nosotros ¿cual es el problema? Entonces podremos aprender de ellas. Pero no veo señales de ningún adelanto a la vuelta de la esquina.</p>
<p>Dos semanas atrás estaba en Grecia en el lanzamiento de un nuevo libro de Christos Papadimitriou, quien es presideente (chairman) de ciencias de la computación en Berkeley. El publicó una novela en griego llamada &#8220;La Sonrisa de Turing&#8221; [Pa]. No quiero contar la histora, pero cuando se publique en alemán o inglés encontrarán una buena discusión de la inteligencia artificial y el test de Turing para la inteligencia.</p>
<p>El modelo más prometedos de como trabaja el cerebro que he visto ve al cerebro como un algoritmo genético dinámico que opera todo el tiempo. Mientras les hablo, sus cerebros tienen un monto de teorías compitiendo sobre lo que voy a decir. Es la sobrevivencia de la más adaptada, una batalla continua entre teorías compitiendo. Algunas llegan a la superficie y realmente entran en la conciencia, pero las otras están todas allí. Algún tipo de apareamiento de conceptos debe estar ocurriendo en nuestras cabezas todo el tiempo. Este modelo parece tener las propiedades correctas para contar sobre como hacemos lo que hacemos con el relativamente bajo tiempo de respuesta que tienen las neuronas. Pero no soy un experto en esto.</p></blockquote>
<h2>Sobre las patentes de software</h2>
<blockquote><p><strong>Pregunta</strong>: ¿Cual es su pensamiento sobre las patentes de software? Hay una gran discusión en Europa sobre si el software debería ser patentable.</p></blockquote>
<blockquote><p><strong>Knuth</strong>: Estoy en contra de patentar cosas que cualquier estudiante se esperaría que descubriera. Han habido muchas desagradables patentes de software en Estados Unidos por ideas que son completamente triviales, y eso me preocupa mucho. Hay una organización que ha trabajado por muchos años para patentar todas las ideas triviales remanentes y hacerlas disponibles a todo el mundo. La manera en que el patentamiento ha avanzado está amenazando con la paralización de la industria del software<br />
Los algoritmos son cosas inherentementes matemáticas que deberías ser tan inpatenteables como el valor de π (pi). Pero para algo no trivial, algo como el metodo del punto interior de la programación lineal, hay mas justificacón por que alguien pida un derecho a licenciar el método por un corto tiempo, en vez de mantenerlo como un secreto comercial. Esa es la idea original de las patentes; la palabra patente significa &#8220;hacer público&#8221;.Fui entrenado en el cultura de las matemáticas, así que no acostumbro cobrarle un centavo cada vez que una persona us un teorema que he demostrado. Pero le cobro a alguien por el tiempo que paso explicándoles cual teorema aplicar. Está bien cobrar por servicios, personalización y mejoras, pero no hagan a los algoritmos en si mismo algo propietario.</p>
<p>Hay un asunto interesante de todas maneras. ¿Podría usted tener la patente sobre un número entero positivo? No es concebible que si tomamos un millón de los más grandes supercomputadores de hoy día y las dejamos correr, ellos puedan calcular una cierta constante de 300 dígitos que pueda resolver un problema NP completo tomando el mcd de la constante como un número de entrad, o por otra combinación entretenida. Este número entero requeriría na cantidad masiva de tiempo de computación para ser encontrado, y si usted conoce ese entero, entonces usted podría hacer todo tipo de cosas útiles. Ahora, ¿es ese número entero realmente descubierto por el ser humano?<br />
¿O es algo que está dado por Dios? Cuando empezamos a pensar en asuntos de complejidad, debemos cambiar nuestro punto de vista sobre lo que es natural y lo que es inventado.</p></blockquote>
<h2>El arte de programar</h2>
<div><img class="alignleft" src="http://web.archive.org/web/20070513053932/http://www.lnds.net/images/knuth3.JPG" alt="knuth3.JPG" width="104" height="126" /></div>
<blockquote><p><strong>Pregunta</strong>: ¿Cuál es la conexión entre matemáticas y la programación de computadores vistos como arte?</p></blockquote>
<blockquote><p><strong>Knuth</strong> Arte es Kunst. La película &#8220;Inteligencia Artificial&#8221; se llama &#8220;Kunstlicher Intelligenz&#8221; en Alemania, esto es artificial también como artítica. Yo pienso en programar con la belleza en mente, como algo que sea elegante, algo de los que puedas estar orgulloso por la manera en que las cosas encajan juntas. Las matemáticas del mismo modo tienen elegancia. Ambos campos, la computación y las matemáticas, son diferentes de otras ciencias porque son artificiales; no están en la naturaleza. Están totalmente bajo nuestro control. Nosotros creamos los axiomas y cuando resolvemos un problema, podemos probar que lo hemos resuelto. Ningún astrónomo sabrá nunca si sus teorías en astronomía son correctas. No puedes ir al sol a medirlo. ASí que estos son mis primeros pensamientos sobre esa conexión. Pero hay una diferencia entre matemáticas y la programación de computadores, y a veces puedo sentir cuando me pongo un sombrero o el otro. Algunas partes de mi le gustan las matemáticas, y a algunas partes de mi le gusta hackear emacs. Pueden ir juntas okay, pero no las veo en el mismo paradigma</p></blockquote>
<blockquote><p><strong>Pregunta: </strong>Usted ha estado emitiendo cheques a la gente que le informa sobre errores en sus libros. Nunca he escuchado de alguien cobrando esos cheques. Sabe cuanto dinero tendría que depositar, si repentitnamente se cobraran todos los cheques?</p></blockquote>
<blockquote><p><strong>Knuth</strong>: Hay un hombre que vive cerca de Frankfurt quien probablemente tiene más de $1,000 (mil dolares) si ha cobrado todos los cheques que le he enviado. Hay un hombre en Los Gatos, California, a quien nunca he conocido que cobra un cheque por $2.56 una vez al mes, y lo ha estado haciendo por varios años. Con todo he girado más de 2.000 cheques en estos años, y el monto promedio excede los $8 dolares por cheque. Aun si todos cobraran su cheque sería más que valioso para mi saber que mis libros van siendo cada vez mejores.</p></blockquote>
<h3 class='related_post_title'>Artículos relacionados</h3>
<ul class='related_post'>
<li><a href='http://www.lnds.net/blog/2009/12/la-programacion-como-un-arte-parte-v-y-final.html' title='La programación como un Arte (Parte V y final)'>La programación como un Arte (Parte V y final)</a></li>
<li><a href='http://www.lnds.net/blog/2009/12/la-programacion-como-un-arte-parte-iv.html' title='La programación como un Arte (Parte IV)'>La programación como un Arte (Parte IV)</a></li>
<li><a href='http://www.lnds.net/blog/2009/12/la-programacion-como-un-arte-parte-iii.html' title='La programación como un Arte (Parte III)'>La programación como un Arte (Parte III)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.lnds.net/blog/2011/01/knuth-responde-a-todas-las-preguntas-2.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

