Aprende programación






5 ene. 2013

Ranking 2012 de lenguajes más usados: El año en el que Java perdió su primer puesto a favor de C


El año 2012 no ha sido un año más para mucha gente y muchas empresas. Ha sido un año de fluctuación y cambio aunque, como dicen algunos economistas, cuando hay una crisis hay una oportunidad.

En el mundo de desarrollo de software, este año ha sido marcado por varias novedades. Por una parte, Oracle ha tomado las riendas del destino de Java que hasta ahora mantenía SUN. También la tendencia de los iPad, iPhone, etc ha quedado reflejado en personas interesadas en desarrollar para esos dispositivos.

Aquí tenéis el ranking TIOBE del uso de lenguajes en la actualidad. Como novedad, Java deja de ser el lenguaje más utilizado en beneficio de C. Pero no es un batacazo. En realidad esta bajada de posición se debe al mérito de C que ha subido un 2%.

Sin embargo, este año ha ido muy bién para Objective-C gracias a Apple que sube un 4% aproximadamente y la subida de puesto Visual Studio .NET (pero no de %). También suben Matlab, Lua, pero el porcentaje es bastante ínfimo.

Por otra parte, el batacazo de este año ha sido para C# que ha caído un 2%. Aquí tenéis el Ranking.


23 dic. 2012

Registrar que observa un programador experto y uno novato al rastrear un programa

Recientemente, he visto una noticia que me ha llamado mucho la atención. Consiste el registrar que observan dos programadores de diferente nivel al tener que averiguar que realizará un programa.

Aquí tenéis el vídeo del novato:
y aquí tenéis el vídeo del experto:
En líneas generales, el experto resuelve el problema un 37% más rápido que el novato. Analizando el contenido del vídeo se puede apreciar una cierta agilidad en la resolución de las condiciones. Por ejemplo, para las condiciones el usuario experto solo necesita unos segundos para entender que expresan las fórmulas matemáticas y deducir su significado. Sin embargo, el usuario novato precisa de más tiempo para entender el significado.

Esto ocurre en todas las profesiones. Por ejemplo, alguien que aprendido música y sabe interpretar una partitura, deducir que hace una nota en cierta línea del pentágrama le es inmediato, mientras que otros que no tengan tantos conocimientos necesitarán contar la línea es de la partitura y deducirla. Obviamente, al interpretar una melodía es necesario que exista un ritmo por lo que encontrar un pianista bueno de uno malo es bastante fácil. Sin embargo, en la programación, no hay un ritmo exacto ya que también depende el problema en concreto a programar. ¿Cómo sabes que un programador te realizaría algo más rápido que otro si no eres capaz de comparar el resultado?

Incluso dentro de un mismo equipo de trabajo, habrá programadores que harán rápidas ciertas cosas que otros no harían y viceversa ya que la programación es bastante multidisciplinar.

En todo caso me parece un experimento muy interesante a tener en cuenta para la evaluación del modo de trabajo de los programadores.

15 ene. 2012

Objetivos para el 2012

Aunque lo tengo un poco abandonado por escribir en GenbetaDev voy a plasmar aquí los objetivos que me he propuesto este año y hacer balance de lo realizado en el 2011. Hay que decir que la incorporación a GenbetaDev me ha absorbido muchisimo tiempo y muchas no se han cumplido. Pero creo que ha merecido la pena el cambio, al menos por ahora, ya que estoy aprendiendo mucho escribiendo post y escuchar (en medida de lo posible) a toda la masa crítica que tiene GenbetaDev y que es lo que más interesa a todo el mundo (saliendo un poco del entorno Java).

Objetivos expuestos a principio del 2011
  • Iniciar con clases particulares online. Es una idea que llevo últimamente en cabeza y que creo que puede ser interesante para descubrir la capacidad de internet. (No conseguido. Dí algunas pero al final no tuve tiempo).
  • Si se crease un fork de java (que seguramente se iniciará), participar en él. En el caso de que sea no, buscar alternativas cómodas para un programador java para recomendarlas. Es decir, alternativas que a partir de un código java antiguo puedas desplegarlo en un entorno NO Oracle. (Oracle se resiste. No ha habido fork. ¡Bien por Oracle!)
  • Aprender y quizá colaborar con OpenXava. Ultimamente hablando con Javier Paniza en las entrevistas, curiosamente, pensamos bastante igual. Yo también pienso que, para ser productivo, hay que centrarse en los casos generales (y no particulares) y para ello hay que definir más y programar menos. (Buf. Nada de nada. Lo siento Javier).
  • Aprender Android e incluso llegar a probar el Market. Ya va siendo hora de ver otras cosas diferentes a Java. (Semi-inicio. Al menos buscando info para escribir estoy encontrando Frameworks interesantes).
  • Ahorrar energía eléctrica. Este es un modo de protesta por el incremento del precio de la luz de manera desproporcionada a la vida. He iniciado desde el anuncio de la noticia con la idea de apagar todo lo que no utilizo. Y con apagar no es darle al off del aparato ya que estos también consumen. Es apagarlo prácticamente de la red. (¡Conseguido con creces! Chupate esa Endesa).
  • Finalmente, investigar más acerca del comercio justo. Ultimamente ví una conferencia de Joan Melé (que publiqué en este blog) que me hizo pensar. Me gustaría investigar más sobre esto. (Pse. Hay que fiarse de lo que te cuentan. Yo que estoy acostumbrado ya a no creerme nada...).
Objetivos para el 2012.

La verdad es que para este 2012, el cambio de rumbo al acceder a GenbetaDev ha sido bastante curioso. En realidad, el tiempo que se invierte en preparar y escribir no compensa desde el punto de vista económico, pero es apasionante ver la cantidad de gente que nos lee y eso me hace seguir adelante. Así que mis propuestas técnicas para este año irán relacionadas a GenbetaDev y al Podcast.
  • Conseguir crear una Inteligencia Artificial que sea capaz de escribirme noticias a partir de lecturas o comentarios. De momento, para cuando tengo falta de tiempo, tengo automatizada la creación de imagenes, poner negritas en los post y la búsqueda de las mejores noticias ... pero quiero ir más alla. Quiero conseguir que el ordenador piense por mí. Igual es un poco de ciencia ficción, pero por soñar...
  • Conseguir crear un generador de canciones de manera aleatoria. El código lo iría publicando en GenbetaDev. En todo caso, cuando lo tengamos acabado, estaría chulo crear canciones relacionadas con la programación y publicarlas en el podcast.
  • Conseguir crear un generador de juegos. También he pensado, si soy capaz de generar aleatoriamente noticias, puedo publicar en el Market juegos de por ejemplo plataformas que se generen aleatoriamente. La forma será parecida pero cada juego tendría fases diferentes ...
  • Mejorar en el Badminton. Todo trabajador de oficina debería hacer deporte. Creo que es esencial para no acabar quemado. Este año pondré mi empeño en mejorar ahora que tengo rivales de mucho nivel, pues sigo siendo malísimo.
  • Adelgazar más. A ver si me quito de algunos malos hábitos dietéticos.

Y en principio, estos son todos los propósitos del 2012. Son propósitos un tanto complejos, pero si no se marcan, no se intentarán.

16 dic. 2011

Nuevo feed de los podcast

Buenas,

Aunque llevo bastante tiempo sin escribir aquí por estár colaborando en Genbetadev. Me gustaría poner un post para indicar el nuevo feed de los podcast de javaHispano ya que como han cambiando de servidor, los links ya no funcionan.

El link es:
http://www.javahispano.org/podcast/ (El podcast)
http://www.javahispano.org/podcast/rss.xml (Feed de los últimos 30 números).
http://www.ivoox.com/javahispano_sb.html?sb=javahispano (Lista de todos los podcast)
http://itunes.apple.com/es/podcast/podcast/id482381850?l=en (En iTunes)

Saludos, Jorge

4 abr. 2011

Estreno de genbetadev




Después de 15 días realizando los preparativos, hoy mismo se ha estrenado un nuevo portal orientado al desarrollo de software llamado GenBetaDev. Este portal pertenece al grupo de blogs profesionales Weblogs S.L.

Comentar también que estaré colaborando realizando funciones de editor en dicho portal donde iré publicando post con noticias referentes al mundo de la programación. Así que tendré que incorporar una nueva tarea más a mi larga lista de tareas. Por ahora, estamos 8 editores en el que hemos publicado entre 30-40 posts de los cuales puse 11 hasta la fecha.

Espero que vaya bién esta nueva tarea y sea una larga colaboración. ¡Os invitamos a visitarlo!.

6 feb. 2011

El mimetismo en grupos de desarrollo - Opinión

En muchas ocasiones no conocemos la influencia que tenemos con individuos del mismo grupo. El mimetismo es una actuación en toda especie humana y animal en el que el individuo aprende e imita con el fin de adaptarse a un grupo. Todo esto ocurre en todo tipo de empresas y todo tipo de proyectos en los que hay un trabajo en grupo.

Lo curioso surge cuando el grupo se sincroniza con unas creencias, ideas o actitudes y un nuevo individuo llega con otras ideas diferentes. Pueden ocurrir que el grupo sea abierto y esas nuevas ideas sean incorporadas como parte del conocimiento del grupo o por el contrario puede ocurrir que esas ideas choquen con el objetivo del grupo. Más curioso es cuando las ideas del grupo son incorrectas y el individuo llega con ideas mejores. Como podreis ver en los próximos videos, el individuo que desea no sentirse incomodo toma una actitud de indiferencia y simplemente imita aun sabiendo que lo que hace no es correcto.

Por ello, mi conclusión es que cuanto más creencias tengas sobre algo más dificil será tu incorporación de acceder a un grupo con ideas incorrectas o diferentes a las tuyas. Las personas que toman una actitud de indiferencia se adaptarán mejor a ese grupo. Aunque también depende de lo abiertas que sean las personas del grupo y de uno mismo.


Via nagegapolis de Juan Palacio he encontrado estos videos de experimentos interesantes:

El experimento de Asch





El experimento del elevador



Saludos,

23 ene. 2011

100 números de javaHispano podcast


Hace poco llegamos al número 100 de javaHispano. Al igual que hice con los videotutoriales, he decidido hacer un post donde se recopile un link a todos los números. Para darle un valor añadido a este post respecto al feed, he organizado los podcast por temas:

Java EE y Desarrollo web:
Java ME y Android:
Java SE:
Videojuegos:
Desarrollo ágil:
Test y automatización de procesos
Spring, Grails y Groovy:
IDEs:
Legal:
Eventos y reuniones:
SUN y Oracle:
Software libre:
Personas y entrevistas personales:
Otros temas:
Noticias:
Dudas foro:

18 ene. 2011

Interés emocional vs interés económico

Un claro ejemplo de que el interés emocional, pasional o gusto por algo puede ser más alto que el económico. Para ejemplo, la comparativa de las versiones Sonic 4 creada por el equipo de SEGA y tirando de nostalgia y la versión de Sonic Fan Remix creada por unos fans de Sonic con la intención de crear un juego tan solo por su pasión por Sonic y sin ningún animo de lucro. Aquí los resultados:


Sonic 4




Sonic Fan Remix

16 ene. 2011

Primer prototipo para eficiencia en desarrollo de juegos Android con buscaminas de ejemplo

Buenas,

En el anterior post, comenté los perjuicios en el desarrollo que ví desarrollando directamente con el SDK. Para ello comenté la posibilidad de hacer la aplicación con frames y luego cambiando una clase poderla portar a Android. Pues bién, aquí hay un pequeño prototipo experimental con unos pequeños métodos que habrá que ir incrementado con el tiempo.

Lo he llamado adaptador de juegos android ya que en realidad se basa en que hay que extender una clase y no utilizar directamente lo que dispone Android, si no unos métodos que hacen de adaptador al SDK. Además viene de ejemplo el juego del buscaminas, que es bastante sencillo de desarrollar.

En el framework adaptador este hay que extender la clase JuegoAdaptador para poder pintar o extender eventos. Es muy importante el orden alfabético de los métodos ya que si inician por pintarXXXX es que se plasma algo sobre las ventanas. Si pone eventoXXXX es que es un evento del usuario.

Los eventos implementados son:
public void eventoInicializar(); //Al iniciar la aplicacion
public void eventoPausa(); //Al pulsar pausa (de momento no es posible).
public void eventoFinalizar(); //Al finalizar la aplicacion
public void eventoTick(); //Hilo que sirve para animar la aplicación. Por defecto se ejecuta cada 100ms.
public void eventoPintar(int orientacion); //Se está solicitando pintar en pantalla. La variable orientación indica si está en 0 vertical, 1 horizontal. Sin embargo, para que no esteis haciendo if hay una funcion getValor(orientacion,20,30) donde devuelve 20 si está vertical o 30 en horizontal. Así solo teneis que pintar todo 1 vez.
public void eventoTocarPantalla(int orientacion, int x, int y); //Se ejecuta cuando se hace click sobre la pantalla.
public Serializable eventoEstadoCapturar(); //Para persistencia y grabación en "video". Si se guardan los datos en una clase Serializable hacer snapshot de la partida e incluso grabarla y poderla rebobinar. Aquí se solicitan los datos serializables.
public void eventoEstadoReestablecer(Serializable s); //Para lo mismo. Aquí se solicita modificar los datos.



Monitor de grabación.
Una cosa muy interesante es estar jugando y si ves algún fallo poder ver que está pasando. Para ello hay una ventana adicional que permite visualizar los métodos get del modelo Serializable e incluso rebobinar a un estado anterior. También permite guardar el estado actual en disco duro para seguir otro día. Mi recomendación es ejecutarlo en modo depuración pero para comprobar las variables utilizar este frame de visualización ya que en un videojuego hay muchas iteraciones.

Ejemplo buscaminas.
Para que veais como funciona, he preparado un buscaminas ya que es relativamente fácil de hacer. Ya lo iremos complicando poco a poco. Para ello, he aplicado el JuegoAdaptador con JuegoAdaptadorTablero que permite la visualización de tableros NxM de manera que cada número va asociado a una imagen.

¿Donde conseguir el programa?.
Aún me falta hacer una lista de distribución y un portal para quien quiera participar. Si es que no tengo tiempo. Para que vayais probandolo lo teneis por SVN en google code y para quien quiera bajarlo sin SVN lo he subido a Mediafire.

https://code.google.com/p/adaptador-de-juegos-android/
http://www.mediafire.com/?xs35doxzo9lgw08

Vuestras sugerencias son bienvenidas.
Comentar que aún no está la clase que interaciona con Android. Este es un primer paso para recibir críticas. Hay cosas que están premeditadas como la utilización de español para hacer un API (ya lo explicaré en otro momento), pero ahora mismo se me habrán pasado miles de cosas y faltan muchas cosas por desarrollar. Vuestras ideas serán bienvenidas.

Poco a poco iré dando de alta a más sitios para que sea más colaborativo. De momento, las sugerencias podeis hacerlas en este post.

La licencia que le he puesto es Apache 2.0 para que sea lo más permisiva posible.

Resumen de todo este rollo.
La idea es crear métodos en la clase JuegoAdaptador que aislen donde se están volcando datos en un frame o en un screen de Android. Extendiendo esta clase se debería poderse utilizar tanto para Java Frames como para Android cambiando la implementación de la clase JuegoAdaptador. De momento, es algo básico pero se irán añadiendo funcionalidades poco a poco (sonido, eventos de arrastrar, etc).

Actualización 18-01-2011:
Subida una nueva versión con correcciones.


10 ene. 2011

Primeras impresiones de Android SDK

Buenas,

Este año he empezado con fuerza y he iniciado a aprender Android. El objetivo será desarrollar algunos juegos y subirlos al Market (algunos gratuitos y otros a unos 50 centimos). Ya anteriormente había intentado hacer algo y las herramientas las conocía, pero siempre se había quedado atrás por falta de tiempo. En esta ocasión va en serio, es un objetivo prioritario.

Para instalación tan solo hay que seguir los pasos que están explicados.
  • Descargas Eclipse
  • Descargas el SDK de Android y lo instalas
  • Instalas el plugin de Eclipse y lo configuras
Y con todo ello ya puedes hacer tu primer "hola mundo". También puedes probar alguna demo si quieres.

Hasta aquí todo normal hasta que empiezo a ver inconvenientes.

Inconvenientes:

Memoria.
Lo primero de todo, al ser emulado traga multitud de memoria. Está bién que el dispositivo emule bién el dispositivo pero ¿no puede haber una versión ligera con las opciones mínimas?. Es increible como cuando llevas 30 minutos programando (o más bién desplegando) deja de funcionar el emulador, eclipse, etc. Esto os comento en Windows. Lo he probado también en un Linux Ubuntu 10.10 y funciona un poco mejor, en vez de caer a los 30 minutos cae a los 60. Pero sigue utilizando mucha memoria.

Lentitud de despliegue.
El primer despliegue es bastante lento pero una vez arrancado el emulador, cada vez que despliegas genera el paquete y lo sube al emulador. Lo cual significa que si tengo una aplicación con muchos resources, cada despliegue será eterno. Esto habría que mejorarlo. El sistema se parece un poco a los Ant de JEE que generan el paquete entero. Está bién tener un paquete generado que sea la aplicación, pero cuando estás desarrollando lo primordial es la velocidad de despliegue subiendo unicamente los cambios.

Depuración.
Al menos se puede depurar, pensé. En efecto, se puede depurar siempre y cuando no quieras cambiar el código al ver el error. Algo que es tremendamente util es la posibilidad de cambiar el código mientras se está ejecutando y que funcionen los cambios sin tener que volver a rearrancar y/o redesplegar la aplicación.

No hay console.
O al menos aún no la he encontrado. No puedo decir que no haya pues quizá no haya buscado adecuadamente pero esperaba que cuando pusiese System.out.println("Algo"); se visualizase en la consola del eclipse.

Modo horizontal y modo vertical.
Una característica de los nuevos móviles es la posibilidad de girar el movil. Este es interesante aunque pone complejidad en el desarrollo ya que quizá la distribución de los componentes sean diferentes. Tienes la posibilidad de desarrollar unicamente para una orientación si quieres. La pega que veo es que si quieres desarrollar para las dos orientaciones el emulador solo visualiza una por lo que si quieres volver a testear si funciona para la otra orientacion debes volver a lanzar otro emulador y volver a probar todo.

Ventajas:

Aun así, me gustaría comentar alguna ventaja que le he visto:
Gestión de resources muy bueno.
Está automatizado para que cargue imagenes de manera sencilla a través de una constante de una clase que se autogenera. Además tienes un directorio para poner diferentes imagenes según la orientación vertical-horizontal. Esto estaba interesante.

Doble buffer.
Al pintar en pantalla ya se dispone de un doble buffer. Aun no tengo claro como puedo provocar el repaint(), pero poco a poco me iré haciendo. Comentar que todos los juegos consistiran en cargar imagenes y moverlas en un canvas. No hay componentes prediseñados.

-------------
Y hasta aquí mis primeras impresiones. Es normal que al principio se vean más pegas que beneficios porque los trucos se van aprendiendo poco a poco. Yo que soy un maniático del desarrollo y despliegue rápido he visto bastantes inconvenientes pues he estado más tiempo desplegando que desarrollando.

Creo que para avanzar más rápido con Android habrá que crear un framework o API que permita ver mis aplicaciones en un JFrame y luego que el traspaso a Android sea cambiar dos cosas y vale. De esa forma, conseguimos la velocidad de desarrollo sencillo en un JFrame y luego lo podremos portar a algo más pesado.

En cuanto consiga algo, veré publicarlo con licencia LGPL para ver si se anima más gente.

Ya os iré contando.