Tips para programadores

Aprende un nuevo lenguaje

Es sabido que no debes enfocarte en una sola tecnología o lenguaje de programación.   Pero el sentido de este consejo no es sólo que escojas una tecnología que te permita ganar más dinero (que también es una buena idea), sino que además de eso te permita experimentar y hacer cosas diferentes. Por ejemplo, si siempre has estado enfocado a aplicaciones WEB, puedes comenzar a experimentar con el control de motores eléctricos o para obtener datos desde sensores o hardware que no hayas usado anteriormente, o probar también con aplicaciones para móviles, tendrás una perspectiva más amplia de lo que es el desarrollo de software.

Ten un  «Pet Project»

Todos tenemos ideas para una aplicación o desarrollo que nos gustaría programar.  Sin embargo pocas veces las materializamos.  Esto no sólo es malo porque pierdes la oportunidad de llevar a cabo una buena idea, sino que también es posible que nunca sepas si esa idea es mala o que en realidad no sea tan útil, o peor aún, que ya exista algo parecido porque no habías investigado demasiado y te enfoques mejor en otra cosa.  Adquiere el hábito de tener al menos un proyecto y ve agregando características poco a poco pero de forma constante.

Relaciónate con personas que hagan cosas diferentes

No sólo se trata de encontrar gente que use otras tecnologías, sino otras formas de hacer negocios y de ganar dinero.  Es posible que encuentres oportunidades donde otros no las han visto, tan sólo porque no ha llegado nadie para propornerlas.  No te enfoques sólo a entender los problemas de los clientes de la empresa donde trabajes.

Haz que tu trabajo se vea elegante

Son muchos los desarrolladores que descuidan el aspecto visual de su trabajo y sólo se preocupan porque funcione correctamente.  Sin embargo una apariencia visual o usabilidad deficientes, pueden hacer que el usuario tenga una impresión equivocada sobre como funcionan tus desarrollos y llegue a pensar que tiene errores aún cuando esto no sea verdad, recuerda que haces desarrollo para facilitarle la vida a personas que no siempre tienen un conocimiento técnico silimar al tuyo.

No inventes cosas que ya están bien hechas

Lenguajes como Java o C# no son los más ampliamente usados por su sintaxis o su facilidad de uso, sino por la inmensa variedad de librerías o herramientas que existen y que puedes usar libremente, con la seguridad de que van a funcionar correctamente. No gastes tu tiempo tratndo de hacer algo que ya existe si no lo vas a superar.

Comparte y acepta críticas a tu código

Es universal. Ocurre en todas las profesiones. A nadie le gusta que le digan como hacer cosas que uno supone hace bien.  Pero compartir ideas y tomar en cuenta las recomendaciones de otros es casi tan útil como Google para aprender cosas nuevas.  Además mejoras tu ambiente laboral.

Crea librerías de ejemplos o soluciones

No es que tengas que desarrollar librerías nuevas, se trata más bien de esos ejemplos, como conectarte a bases de datos, nombres de drivers, herramientas, comandos, funciones o técnicas de desarrollo que quizá aplicarás en tus proyectos más de una vez. En cualquier momento puedes usar el buscador y encontrar prácticamente todo lo que necesites, pero tener cosas ya probadas previamente por tí, es muy útil.

Descansa lejos de la computadora

Esto debes hacerlo por puro amor propio y no sólo es descansar, ejercítate.  Algunos problemas de espalda y ojos derivados de pasar horas sentados frente a la computadora pueden agravarse y son difíciles de tratar.  Cuida tu cuerpo.

 

La presentación de Google Duplex en la Google I/O

La gran novedad en uno de los eventos más importantes de Google, la 2018 I/O Developer Conference es Google Duplex, el asistente que hará las reservaciones por ti.

Durante la presentación, el asistente realiza dos reservaciones con establecimientos reales.  El asistente, la «persona no real» interactúa con una «persona real», que parece no percatarse nunca que está conversando con una inteligencia artificial.


Una de las cosas más sorprendentes es la velocidad de respuesta y la entonación bastante natural del asistente.  Es un poco gracioso el momento en que el asistente usa la expresión «Mm hmm», que no es que sea particularmente difícil de «decir», sino que ha escogido el momento preciso y hace la conversación más familiar, cosa que no ocurre regularmente con otras IAs.

Otro aspecto interesante (en la reservación al restaurante), es que aunque parece haber una confusión entre el número de personas que asistirán y la fecha en que debe realizarse la reservación, el dialogo y el arreglo terminan más o menos bien, lo cual no es cualquier cosa para una IA.

Google ha dicho que la función se lanzará como un experimento en las próximas semanas.

Linus Torvalds, la mente detrás de Linux: lo que contó en su charla TED

Linus Torvalds ha cambiado la informática dos veces: primero con el núcleo Linux, que hoy funciona en la mayoría de los servidores de Internet, en todos los móviles Android y en todos los superordenadores de la lista TOP500, y después con Git, el sistema de control de versiones que usa casi cualquier programador del mundo. En 2016 dio una de sus pocas entrevistas en público, en el escenario de TED, con Chris Anderson.

La charla está en inglés. Se pueden activar los subtítulos en español desde el menú del vídeo.

Dos proyectos que empezaron como un apaño

El 25 de agosto de 1991, Torvalds, entonces estudiante de 21 años en la Universidad de Helsinki, publicó un mensaje en el grupo de noticias de Minix en el que anunciaba que estaba escribiendo un sistema operativo gratuito: «solo un hobby, no será grande y profesional como GNU». Lo hacía para su propio PC, porque quería un Unix en casa y no podía pagarlo. Publicó el código, otros empezaron a mandarle mejoras y, en pocos años, aquel hobby se convirtió en el núcleo de sistemas operativos de todo el mundo. Hoy reciben contribuciones miles de desarrolladores de cientos de empresas, y Torvalds sigue siendo quien decide qué entra en cada versión.

Git nació igual, por necesidad. Hasta 2005, el desarrollo de Linux usaba BitKeeper, una herramienta comercial que su empresa dejaba usar gratis al proyecto. Cuando esa licencia se retiró, Torvalds no encontró ninguna alternativa que le sirviera y escribió la suya en unas pocas semanas. A los pocos meses le pasó el mantenimiento a Junio Hamano, que sigue dirigiéndolo. Si quieres aprender a usarlo, tenemos una guía de Git.

«No soy un visionario, soy un ingeniero»

Es la frase central de la charla. Torvalds explica que no trabaja pensando en grandes planes de futuro: le parece bien que haya gente que mira las estrellas y dice «quiero ir allí», pero él prefiere mirar al suelo, porque, en sus palabras, quiere «arreglar el bache que tengo justo delante antes de caerme en él». Linux no salió de una visión de cambiar el mundo, sino de resolver un problema concreto detrás de otro durante décadas.

También reconoce que no es una persona sociable. Dice, medio en broma, que no le gusta especialmente la gente, pero sí la que se implica en su proyecto, y que el código abierto permite justamente eso: que personas muy distintas trabajen juntas sin necesidad de llevarse bien. Admite, además, que a veces no tiene en cuenta cómo se sienten los demás. Su estilo directo, y a veces muy duro, en la lista de correo del núcleo fue polémico durante años, y en 2018 él mismo se tomó un descanso para cambiar su forma de tratar a los demás desarrolladores.

El «buen gusto» en el código

La parte más comentada de la charla, sobre todo entre programadores, es un ejemplo de código en C. Torvalds enseña dos formas de quitar un elemento de una lista enlazada y dice que la segunda tiene buen gusto. La primera es la que aparece en muchos libros: recorre la lista recordando el nodo anterior y, al final, necesita un if porque quitar el primer elemento es un caso especial. La segunda no recuerda el nodo anterior, sino la dirección del enlace que hay que cambiar, sea el puntero al inicio de la lista o el campo sig de otro nodo. Así, el primer elemento deja de ser especial y el if desaparece.

#include <stdio.h>

struct nodo {
    int valor;
    struct nodo *sig;
};

/* Versión habitual: el primer nodo es un caso especial. */
void quitar_v1(struct nodo **cabeza, struct nodo *objetivo) {
    struct nodo *prev = NULL, *act = *cabeza;
    while (act != objetivo) {
        prev = act;
        act = act->sig;
    }
    if (prev == NULL)
        *cabeza = act->sig;      /* era el primero */
    else
        prev->sig = act->sig;    /* estaba en medio o al final */
}

/* Versión «con buen gusto»: un puntero al enlace que hay que cambiar. */
void quitar_v2(struct nodo **cabeza, struct nodo *objetivo) {
    struct nodo **enlace = cabeza;
    while (*enlace != objetivo)
        enlace = &(*enlace)->sig;
    *enlace = objetivo->sig;     /* sin casos especiales */
}

static void imprimir(const char *t, struct nodo *n) {
    printf("%-24s", t);
    for (; n; n = n->sig) printf(" %d", n->valor);
    printf("\n");
}

int main(void) {
    for (int v = 1; v <= 2; v++) {
        struct nodo c = {3, NULL}, b = {2, &c}, a = {1, &b};
        struct nodo *lista = &a;
        void (*quitar)(struct nodo **, struct nodo *) = v == 1 ? quitar_v1 : quitar_v2;
        printf("-- versión %d\n", v);
        imprimir("lista:", lista);
        quitar(&lista, &a); imprimir("quitar el 1 (primero):", lista);
        quitar(&lista, &c); imprimir("quitar el 3 (final):", lista);
    }
    return 0;
}
gcc -std=c11 -Wall -Wextra -o lista lista.c && ./lista-- versión 1
lista:                   1 2 3
quitar el 1 (primero):   2 3
quitar el 3 (final):     2
-- versión 2
lista:                   1 2 3
quitar el 1 (primero):   2 3
quitar el 3 (final):     2

Las dos versiones dan el mismo resultado, pero la segunda tiene la mitad de líneas y ningún caso especial que probar por separado. Para Torvalds, el buen gusto consiste en «ver los patrones grandes» y saber casi por instinto cuál es la forma correcta de hacer las cosas: mirar el problema desde otro ángulo hasta que el caso especial deja de existir, en lugar de añadir más condiciones para cubrirlo. No es una cuestión de estética, sino de errores: cada if que desaparece es un camino menos donde puede haber un fallo.

El ejemplo, adaptado. En la charla Torvalds solo muestra las dos funciones en una diapositiva. Aquí están en un programa completo que se puede compilar, con nombres en español, y lo probamos con gcc 14.

Por qué sigue siendo relevante

Más de treinta años después de aquel mensaje, Linux sigue saliendo cada nueve o diez semanas con una versión nueva, y Torvalds sigue revisando lo que entra. Entretanto, el núcleo ha empezado a admitir código en Rust junto al C de siempre, y Git se ha convertido en la base de plataformas como GitHub o GitLab. Pocas personas han tenido tanta influencia en cómo se escribe y se comparte el software, y su receta, según él mismo, es poco espectacular: resolver bien el problema que tienes delante.

Fuente: «The mind behind Linux», Linus Torvalds en conversación con Chris Anderson, TED2016, y crónica de la charla en Linux.com. El ejemplo de la lista enlazada se compiló y ejecutó con gcc 14.2.

El mapa de la ciencia de la computación, explicado zona por zona

En 2017, el divulgador británico Dominic Walliman, autor del canal de YouTube Domain of Science, dibujó un mapa de toda la ciencia de la computación en un solo póster. Es una de las mejores formas de hacerse una idea de lo grande que es este campo y de cómo encajan sus partes, desde la máquina de Turing hasta la realidad virtual.

Póster «Map of Computer Science» de Dominic Walliman, con la informática dividida en teoría, ingeniería de computadores y aplicaciones
«Map of Computer Science», de Dominic Walliman (2017). Pulsa en la imagen para verla a tamaño completo en Flickr.

El mapa divide la informática en tres grandes territorios. Arriba a la izquierda, la teoría, que estudia lo que se puede calcular y cuánto cuesta. Arriba a la derecha, la ingeniería de computadores, que se ocupa de construir máquinas y programas que funcionen. Y abajo, las aplicaciones, donde todo lo anterior se usa para resolver problemas del mundo real.

La teoría de la computación

Es la parte más cercana a las matemáticas, y la que hace de la informática una ciencia y no solo una técnica. En el centro del mapa está Alan Turing y su máquina: un modelo abstracto, una cinta infinita y un cabezal que lee y escribe símbolos, que define qué significa «calcular». Alrededor aparecen:

  • La teoría de la computabilidad, que estudia qué problemas se pueden resolver con un programa y cuáles no, por mucho tiempo que se le dé.
  • La complejidad computacional, que clasifica los problemas según lo difícil que es resolverlos. Ahí está la pregunta abierta más famosa de la informática, si P es igual a NP: si todo problema cuya solución se puede comprobar rápido también se puede resolver rápido.
  • Los algoritmos y su análisis: por qué ordenar con el método de la burbuja crece con el cuadrado del número de elementos y con el de mezcla, mucho menos.
  • La teoría de la información, la base de la compresión y de los códigos que corrigen errores, y la criptografía, con sus claves públicas y privadas.
  • La lógica, la teoría de grafos, los autómatas, la geometría computacional y la computación cuántica, cada una con sus propias preguntas.

La ingeniería de computadores

Aquí está lo que hace falta para que un ordenador real funcione. Empieza por el hardware y la arquitectura de computadores: cómo se organizan la CPU, la memoria y los dispositivos de entrada y salida. Encima están los sistemas operativos, como Linux, Windows, macOS, Android o iOS, que reparten el procesador entre los programas, y los compiladores, que traducen un lenguaje de programación a código máquina.

El mapa coloca en esta zona los lenguajes de programación, la ingeniería del software, con sus métodos formales, pruebas y control de versiones, las redes y los sistemas distribuidos, las bases de datos y la medición del rendimiento. Es, con diferencia, la parte donde trabaja la mayoría de los programadores.

Las aplicaciones

La mitad inferior del mapa es la más visible para todo el mundo. Incluye la optimización para planificar rutas o almacenes, el aprendizaje automático y la inteligencia artificial, la visión por computador y el procesamiento de imágenes, el procesamiento del lenguaje natural, la robótica, los gráficos por computador, la realidad virtual y aumentada, la interacción persona-computador, la supercomputación, la simulación y la ciencia computacional, el big data, el internet de las cosas y la seguridad informática, que el póster llama hacking.

Lo que ha cambiado desde 2017. El mapa es de antes de la explosión de los grandes modelos de lenguaje. Hoy el aprendizaje automático, el procesamiento del lenguaje natural y la representación del conocimiento, que aparecen como islas separadas, se han juntado en buena medida en un mismo tipo de sistema: los modelos como los que usan los asistentes de IA. Aun así, el mapa sigue siendo una guía muy útil: esos modelos dependen de la teoría, del hardware de la otra mitad del póster y de la ingeniería del software para llegar a producción.

El vídeo

Walliman acompaña el póster con un vídeo de unos diez minutos en el que recorre cada zona. Está en inglés, pero se pueden activar los subtítulos en español desde el menú del vídeo.

Otros mapas

Walliman ha dibujado mapas parecidos de otras ciencias. Estos dos son especialmente buenos para ver dónde encaja la informática.

Física, en la versión en español de MolaSaber:

Mapa de la física, versión en español de MolaSaber

Matemáticas:

Póster «The Map of Mathematics» de Dominic Walliman

Si quieres tener el de la ciencia de la computación en la pared, el autor vende el póster en Redbubble.

Póster y vídeo: Dominic Walliman, «Map of Computer Science», Domain of Science (2017).

Pruebas

Arriba: «—Ingeniero, no pasamos ni las pruebas unitarias». Debajo, un niño pequeño con una galleta en la mano mira a la cámara con cara de sorpresa.

Las pruebas unitarias comprueban las piezas más pequeñas del programa por separado, así que suspenderlas es mala señal. La cara del niño lo dice todo.

Los 10 lenguajes de programación más populares en 2017

La revista IEEE Spectrum ha publicado un ranking de lenguajes de programación basándose en al menos 10 fuentes en línea (Google Search, Google Trends, Twitter, GitHub, Stack Overflow, Reddit, Hacker News, CareerBuilder, Dice, IEEE Xplore Digital Library).  La lista incluye 48 lenguajes y han usado una combinación de 12 métricas que fueron seleccionadas por su creador el periodista de datos Nick Diakopoulus.  La diferencia de este ranking con respecto a otros más populares, es que han generado una gráfica interactiva con la cual es posible personalizar como se ponderan esas métricas.  Más información de su método en el siguiente enlace:

http://spectrum.ieee.org/ns/IEEE_TPL_2017/methods.htm


De acuerdo a trabajos más solicitados dominan los lenguajes Java, C, Python,C++ y JavaScript, en ese orden.

Los lenguajes con mayor tendencia son casi los mismos pero ahora es Python el que se encuentra dominando.

 

Es posible crear filtros por plataforma (Web, Mobile, Enterprise, Embedded). Les dejamos el vínculo al artículo original para que prueben ustedes mismos.

http://spectrum.ieee.org/

Algunas de las librerías más usadas en Java

Estas son algunas de las librerías o bibliotecas más populares por su descarga en GitHub o por su uso en una amplia variedad de proyectos. Puede que se te haya ocurrido crear tus propias herramientas para resolver muchos de los problemas que vas encontrando cuando desarrollas tus propios proyectos, sin embargo, siempre vale la pena dar un vistazo en la Web antes de comenzar a programar algo que quizá ya ha sido desarrollado, basado en estándares y ampliamente probado y ahorrarte así tiempo valioso. Te mencionamos sólo algunos proyectos:

Permite realizar pruebas de código de forma controlada, ya sea generales o parciales. Es muy recomendada. Algunas IDEs como Netbeans o Eclipse vienen preparadas para realizar pruebas de forma integrada.

http://junit.org/junit4/

mockito-all, mockito-core

Mockito es una librería Java para la creación de Mock Objects ampliamente usados en pruebas unitarias de Test Driven Development y basado en EasyMock.

https://github.com/mockito/mockito

guava

Es un conjunto de librerías desarrolladas por Google, dividido en tres grupos:

  • Utilidades básicas para reducir labores menores para implementar métodos y comportamientos comunes.
  • Una extensión a Java collections framework (JCF) anteriormente llamada Google Collections Library.
  • Utilidades que proporcionan características convenientes y productivas tales como programación funcional, almacenamiento en caché, objetos de rango y hashing.

https://github.com/google/guava

Las Commons de Apache Software Foundation

commons-io

Es parte de un conjunto de proyectos desarrollado por Apache Software Foundation.  Está divido en varias categorías:

  • Utility classes – con métodos estáticos que realizan tareas comunes.
  • Input – Implementaciones bastante útiles de Stream y Reader.
  • Output – Implementaciones de Output Stream y Writer.
  • Filters – Diversas implementaciones de filtros de archivos.
  • Comparators – Diversas implementaciones de java.util.Comparator para archivos.
  • File Monitor – Componente para monitoreo de eventos de archivos de sistema.

https://commons.apache.org/proper/commons-io/

commons-lang, commons-lang3

Apache Commons Lang provee de un conjunto extra de métodos para la manipulación del core estándar de clases de Java, tales como:

  • Métodos para de cadenas.
  • Operaciones numéricas.
  • Concurrencia.
  • Creación y serialización de propiedades de sistema.
  • Ayudas para java.util.Date, utilidades para el manejo y uso de hashCode, toString, y equals.

Lang3 es la versión actualizada y ampliada de esta librería.

https://commons.apache.org/proper/commons-lang/

commons-codec

El software Apache Commons Codec proporciona implementaciones de codificadores y decodificadores comunes como Base64, Hex, Phonetic y URLs.

https://commons.apache.org/proper/commons-codec/

commons-logging

Una biblioteca que utiliza la API commons-logging y se puede utilizar con cualquier implementación de registro en tiempo de ejecución.

https://commons.apache.org/proper/commons-logging/

 

log4j

Log4j es una biblioteca open source desarrollada en Java por la Apache Software Foundation que permite a los desarrolladores de software escribir mensajes de registro, cuyo propósito es dejar constancia de una determinada transacción en tiempo de ejecución

https://logging.apache.org/log4j/2.x/

Logback Project

Este proyecto es un intento de sustituir a log4j, escrito por el mismo creador. Dividido en tres módulos:

  • logback-core.
  • logback-classic
  • logback-access.

https://logback.qos.ch/

slf4-api, slf4j-log4j12

Simple Logging Facade for Java (SLF4J). Te permite generar registros de la ejecución de tu código Java, ofrece métodos de registro que aceptan marcadores. SLF4J fue creado como una alternativa más confiable al Jakarta Commons Logging framework.

https://www.slf4j.org/

spring-context

Spring-contex es un contenedor de Inversión de Control (IoC), te permite instanciar, configurar y ensamblar beans leyendo metadatos de configuración de archivos XML, anotaciones Java y/o código Java en archivos de configuración.

https://projects.spring.io/spring-framework/

httpclient

HttpClient busca llenar el vacío del paquete java.net aumentando la funcionalidad y flexibilidad al acceder a recursos via HTTP, de forma eficiente, actualizada y rica en características para implementarse del lado cliente con los estándares y recomendaciones de HTTP más recientes.

https://hc.apache.org/httpcomponents-client-ga/

joda-time

Es básicamente un reemplazo de mayor calidad para las clases de fecha y hora que originalmente fueron creadas para Java. Muy recomendable.

http://www.joda.org/joda-time/

testng

Es un framework de pruebas inspirado en JUnit y NUnit, pero introduce algunas nuevas funcionalidades que lo hacen más potente y fácil de usar.

http://testng.org/doc/index.html

JDOM

Es una popular biblioteca de analizador de DOM que se utiliza ampliamente en muchas aplicaciones java para analizar XML.

http://www.jdom.org/

Xerces

Otro analizador de XML bastante popular.

http://xerces.apache.org/xerces-j/

Gson

Una estupenda librería para parseo de JSON creada por Google.

https://github.com/google/gson

JFreeChart

Es la biblioteca gráfica ampliamente utilizada para crear una gran variedad de gráficos de buena apariencia. Permite a los usuarios generar gráficos circulares de barras, diagrama de series de tiempos, diagrama de Gantt, histogramas, gráficos X-Y y varios gráficos específicos.

http://www.jfree.org/jfreechart/

JasperReports

Una completa biblioteca de funciones ricas para crear documentos PDF y gráficos. También disponible con soporte empresarial.

http://community.jaspersoft.com/

Commons Math

Aborda los problemas más comunes de matemáticas y estadísticas que no están disponibles en el lenguaje de programación Java.

http://commons.apache.org/proper/commons-math/

 

Estos son sólo algunos proyectos, desde luego hay muchos más que estamos omitiendo, estaremos actualizando esta entrada continuamente.

via:

http://www.javaworld.com/article/2924315/open-source-tools/javas-top-20-the-most-used-java-libraries-on-github.html

http://www.fromdev.com/2014/10/most-widely-used-java-libraries.html

Imágenes con algunos de los formatos de archivo más polulares

Ange Albertini ha creado algunos posters minimalistas bastante interesantes que muestran como están divididos y organizados los distintos bloques de información con los que se conforman algunos de los formatos de archivos más conocidos.  En algunos casos como el .class de Java muestra la descripción de un clásico «Hola Mundo«, en otros, muestra como sería una pequeña imagen representada como información hexadecimal y a que corresponde cada bloque en el archivo.



Su trabajo completo es interesante: https://github.com/corkami

  • Ejecutables
    • Portable Executable
    • Executable and Linkable Format
    • Mach-Object File Format
    • Java Class (class)
    • Small Web Format / Flash
    • Command File / PE Dos Stub
    • Dolphin Executable
    • Dalvik Executable
  • Imágenes
    • X Bit Map
    • Portable Gray Map
    • Portable Pix Map
    • BitMap / Device Independent Bitmap
    • Graphics Interchange Format (GIF)
    • Tagged Image File Format (TIFF)
    • Portable Network Graphics (PNG)
    • JPEG File Interchange Format

  • Archivos
    • Zip File
    • Tape ARchive
    • GNU GZip
    • Roshal ARchive
    • BZIP2
  • Otros
    • Portable Document Format (PDF)
    • X64 1-Byte Opcodes
    • X86 1-Byte Opcodes
    • Waveform Audio File Format (WAV)

Para ver más: https://github.com/corkami

No estoy seguro

Arriba: «Los días antes de entrega de proyecto». Debajo, Matt Damon en la película The Martian, envuelto en una manta: «Estoy vivo, pero no sé cuánto más podré aguantar».

Los días previos a una entrega se viven como el astronauta abandonado en Marte: sobreviviendo con lo que hay y contando las horas.