Accesos directos en Visual Studio Code

Los accesos directos o shortcuts te permiten ser más productivo. Es por eso que te enlistamos algunos de los Accesos directos en Visual Studio Code, al menos algunos de los más útiles. si estás comenzando a desarrollar es bueno que te familiarices con ellos desde el inicio.

Ctrl + P – Muestra la barra de búsqueda para buscar archivos

En Mac es: Cmd + P

Con este acceso directo navegarás entre archivos todo el tiempo. Puedes escribir el nombre del archivo y abrirlo presionando Enter.

Ctrl + Shift + P – Muestra la paleta de comandos

En Mac es: Cmd + Mayús + P

Te muestra la paleta de comandos donde puedes buscar una acción.

Ctrl + B – Alternar la barra lateral

En Mac es: Cmd + B

Muestra u oculta la barra lateral donde puedes navegar por el explorador.

Ctrl + Shift + E – Ir a la ventana del Explorador

En Mac es: Cmd + Mayús + E

Va a la ventana del Explorador donde tiene su árbol de archivos y puede navegar usando las teclas de flecha.

Ctrl + Shift + M – Muestra rápidamente errores y advertencias

En Mac es: Cmd + Mayús + M

A todo el mundo le gusta el código libre de errores. Este comando muestra el panel de problemas donde puede ver los errores y advertencias identificados.

Ctrl + Shift + L – Selección multi cursor

En Mac es: Cmd + Mayús + L

Agregue cursores adicionales para editar todas las apariciones de la selección actual. Por lo general, es menos propenso a errores que buscar y reemplazar todo.

Ctrl + D – Selección uno por uno

En Mac es: Cmd + D

Similar al anterior, pero usa Ctrl + D si deseas agregar las ocurrencias de la selección actual una por una. Cada vez que presionas la combinación de teclas, agregas una nueva aparición a la selección.

Ctrl + / – alternar comentario de línea

En Mac es: Cmd + /

Alternar entre comportamiento de línea comentado y no comentado.

Ctrl + Shift + I – formatea todo el archivo

En Mac es: Mayús + Opt + F

En Windows: Mayús + Alt + F de Windows

Formatea todo el archivo activo o le solicita que instale una extensión de formateador. Puedes usar la extensión Prettier para formatear el código JS, por ejemplo.

Alt + Arriba o Alt + Abajo – Mover línea

En Mac es: Opt + Down u Opt + Up

Muy claro. Mueva la línea hacia arriba y hacia abajo.

Ctrl + Espacio – Mostrar sugerencias

Muestra sugerencias para completar rápidamente propiedades y otras cosas.

Y uno de mis favoritos:

Shift + Alt + Abajo o Shift + Alt + Arriba – Duplica la línea de código

En Mac es Mayus + Opt + Arriba o Mayus + Opt + Abajo

Este acceso directo te facilita duplicar el contenido de una línea de código hacia por debajo o arriba.

Accesos directos en Visual Studio Code

Estos son algunos de los accesos directos más útiles para Visual Studio Code, pero desde luego hay más y los puedes consultar en los siguientes enlaces:

Windows: https://code.visualstudio.com/shortcuts/keyboard-shortcuts-windows.pdf

Mac : https://code.visualstudio.com/shortcuts/keyboard-shortcuts-windows.pdf

Linux: https://code.visualstudio.com/shortcuts/keyboard-shortcuts-linux.pdf

El ciclo for en Java, Go y Python

Los tres lenguajes tienen for, pero cada uno lo entiende a su manera. Java tiene dos formas, Go usa una sola palabra para todos los bucles, y en Python el for siempre recorre algo. Los comparamos con ejemplos ejecutados en los tres.

Java: el for clásico y el de recorrido

public class CicloFor {
    public static void main(String[] args) {
        for (int i = 0; i < 3; i++) {
            System.out.println("valor de i: " + i);
        }

        String[] lenguajes = {"Java", "Go", "Python"};
        for (String l : lenguajes) {
            System.out.println(l);
        }

        for (int i = 0, j = 10; i < j; i += 3, j -= 3) {
            System.out.println(i + " " + j);
        }
    }
}
java CicloFor.javavalor de i: 0
valor de i: 1
valor de i: 2
Java
Go
Python
0 10
3 7

El primero es el for heredado de C: una inicialización, una condición que se comprueba antes de cada vuelta y un incremento que se ejecuta al final de cada una. El segundo, el «for mejorado», recorre un arreglo o cualquier colección sin índice. El tercero recuerda que cada una de las tres partes puede tener varias expresiones separadas por comas.

Go: una sola palabra para todos los bucles

package main

import "fmt"

func main() {
	for i := 0; i < 3; i++ {
		fmt.Println("valor de i: ", i)
	}

	for i := range 3 {
		fmt.Println("range:", i)
	}

	lenguajes := []string{"Java", "Go", "Python"}
	for i, l := range lenguajes {
		fmt.Println(i, l)
	}

	n := 1
	for n < 100 {
		n *= 3
	}
	fmt.Println("primera potencia de 3 mayor que 100:", n)

	for {
		fmt.Println("una vez y fuera")
		break
	}
}
go run .valor de i:  0
valor de i:  1
valor de i:  2
range: 0
range: 1
range: 2
0 Java
1 Go
2 Python
primera potencia de 3 mayor que 100: 243
una vez y fuera

Go no tiene while ni do: todo se escribe con for. Con tres partes es el clásico, sin paréntesis. Con solo la condición, hace de while. Sin nada es un bucle infinito, del que se sale con break. Y con range recorre colecciones devolviendo el índice y el valor. Desde Go 1.22, range también acepta un número: for i := range 3 da 0, 1 y 2.

Fíjate en los dos espacios de valor de i: 0. fmt.Println pone un espacio entre cada argumento, y el texto ya terminaba en espacio. En Go se escribe fmt.Println("valor de i:", i), sin el espacio final.

Python: siempre recorre algo

for i in range(3):
    print("valor de i: ", i)

for i in range(3):
    print("valor de i:", i)

lenguajes = ["Java", "Go", "Python"]
for i, l in enumerate(lenguajes):
    print(i, l)

for i in range(10, 0, -3):
    print(i, end=" ")
print()

for l in lenguajes:
    if l == "Rust":
        break
else:
    print("no había Rust")
python ciclo.pyvalor de i:  0
valor de i:  1
valor de i:  2
valor de i: 0
valor de i: 1
valor de i: 2
0 Java
1 Go
2 Python
10 7 4 1
no había Rust

En Python no hay for con contador: se recorre una secuencia, y range genera los números. range(10, 0, -3) cuenta hacia atrás de tres en tres, y enumerate da el índice junto a cada elemento. El primer print tiene el mismo doble espacio que Go, por el mismo motivo: print separa sus argumentos con un espacio.

Lo exclusivo de Python es el else del for: se ejecuta solo si el bucle terminó sin break. Sirve para búsquedas como esta, donde llegar al final significa que no se encontró nada.

Lado a lado

JavaGoPython
Contar de 0 a 9for (int i = 0; i < 10; i++)for i := 0; i < 10; i++ o for i := range 10for i in range(10):
Recorrer una colecciónfor (String l : lista)for _, l := range listafor l in lista:
Con índiceel for clásicofor i, l := range listafor i, l in enumerate(lista):
Mientras se cumpla algowhile (cond)for condwhile cond:
Infinitowhile (true)forwhile True:
Bloquellavesllaves, obligatoriassangría

Lo que cambia por debajo

La versión anterior de esta entrada decía que Java es un lenguaje interpretado, como Python. No es exacto, y la diferencia explica buena parte de la diferencia de velocidad. Java se compila a bytecode, y la máquina virtual compila a código máquina, mientras el programa se ejecuta, las partes que más se usan. Go se compila directamente a un ejecutable nativo. Python, en su implementación habitual, también compila a bytecode, pero lo interpreta instrucción a instrucción, y por eso un bucle con mucho cálculo suele ir bastante más despacio. Para medirlo bien, mira medir el rendimiento en Java.

Entrada publicada en 2020 y revisada en octubre de 2026. Cada ejemplo se ejecutó en un contenedor limpio con Java 25 LTS, Go 1.25 y Python 3.14; las salidas están copiadas de esa ejecución.

Librerías de Java para Reportes

Estas son algunas de las librerías para Java que puedes usar para generar reportes en diversos formatos, agregar gráficas y otros recursos útiles para mostrar datos al usuario final. Algunos proyectos disponen de una versión opensource, edición community y versiones comerciales.

JFreeChart

JFreeChart es una biblioteca de gráficos hecha 100% Java que facilita a los desarrolladores mostrar gráficos de calidad profesional en tus aplicaciones. El amplio conjunto de características de JFreeChart incluye:

  • Una API consistente y bien documentada, que admite una amplia gama de tipos de gráficos
  • Diseño flexible que es fácil de ampliar, dirigida tanto a aplicaciones de servidor como del cliente.
  • Compatibilidad con muchos tipos de salida, incluidos los componentes Swing y JavaFX, archivos de imagen (incluidos PNG y JPEG) y formatos de archivos de gráficos vectoriales (incluidos PDF, EPS y SVG)
  • JFreeChart es de código abierto o más específicamente, software libre. Se distribuye bajo los términos de la GNU Lesser General Public Licence (LGPL), que permite su uso en aplicaciones propietarias.

JasperReport

JasperReport es una de las herramientas para reportes de código abierto más populares y ampliamente utilizadas. Se usa en cientos de miles de entornos de producción y presenta versiones tanto community como comerciales.

  • Formateo y visualización de reportes interactivos
  • Repositorio central seguro
  • Informe de programación y distribución
  • Interfaz de usuario personalizable y personalizable

BIRT

BIRT consta de varios componentes. Los componentes principales incluyen un diseñador de reportes y en tiempo de ejecución de BIRT, pero BIRT también proporciona tres componentes adicionales: un motor de gráficos, un diseñador de gráficos y un visor. Con estos componentes, podrías desarrollar y publicar informes como una solución independiente.

  • Listas
  • Gráficas
  • Tablas cruzadas
  • Cartas y documentos
  • Informas compuestos

Pentaho

Pentaho es una suite empresarial completa, que abarca una amplia gama de casos de uso desde reportes hasta minería de datos. La suite de Pentaho BI abarca varios proyectos de código abierto, de los cuales Pentaho Reporting es uno de ellos. Al igual que las otras herramientas, Pentaho Reporting tiene un amplio conjunto de funciones, listas para su uso en organizaciones empresariales.

  • Permite crear reportes en PDF, Excel, HTML, texto, archivo de texto enriquecido, XML y CSV.

SpagoBI

SpagoBI es otra suite de inteligencia empresarial completa. Algunas herramientas que incluye son, por ejemplo: reportes, gráficos, cockpits, minería de datos, ETL y mucho más. La empresa que respalda este desarrollo ofrece servicios profesionales como asistencia al usuario, mantenimiento, consultoría y capacitación.

  • Reportes en formatos HTML, PDF, XLS, XML, TXT, CSV, RTF
  • Análisis multidimensional (OLAP)
  • Gráficas
  • KPIs
  • Coopits Interactivos
  • Reportes ad-hoc
  • Muchas otras características.

KNIME

KNIME es una plataforma de análisis de código abierto, con orígenes en la investigación farmacéutica. Su uso se ha expandido a industrias como bancos, editores, fabricantes de automóviles, compañías de telecomunicaciones y otros.

KNIME proporciona una gama de características, que incluyen extensiones de colaboración y un portal web. El aprendizaje automático también está integrado, incluido el soporte de Weka.

ReportServer

ReportServer es otra plataforma de inteligencia empresarial de código abierto, con una edición comercial disponible también. ReportServer permite crear reportes, análisis ad-hoc, informes de Excel y Word y análisis OLAP multidimensionales.

Pregunta Java: campos transient al serializar

Piensa la respuesta antes de abrirla. Todas las opciones parecen razonables, y casi siempre hay un detalle que lo cambia todo.

Pregunta Java · Serialización

¿Cuál es el resultado de compilar y ejecutar la clase Persona?

import java.io.*;
public class Persona implements Serializable {
    transient String nombre;
    transient int edad;
    String ocupacion;

    public Persona(String nombre, int edad, String ocupacion) {
        this.edad = edad;
        this.nombre = nombre;
        this.ocupacion = ocupacion;
    }
    public String toString() {
        return "Soy " + nombre + ", tengo " + edad + " años y soy " + ocupacion;
    }
    public static void main(String[] args) throws Exception {
        Persona antes = new Persona("Yo", 30, "programador");
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("/dir/ejemplo.txt"));
        out.writeObject(antes);

        ObjectInputStream input = new ObjectInputStream(new FileInputStream("/dir/ejemplo.txt"));
        Persona despues = (Persona) input.readObject();
        System.out.println(despues);
    }
}
  1. Soy Yo, tengo 30 años y soy programador
  2. Soy Yo, tengo 30 años y soy null
  3. Soy null, tengo 0 años y soy programador
  4. Error de ejecución
Ver la respuesta

Respuesta: c.

java PersonaSoy null, tengo 0 años y soy programador

transient marca un campo para que no se guarde al serializar. Al leer el objeto, esos campos reciben su valor por omisión: null para nombre y 0 para edad. Solo ocupacion viaja en el archivo. Tampoco se ejecuta el constructor de Persona, que podría haberles dado otro valor.

Se usa para lo que no tiene sentido o no debe guardarse: contraseñas, cachés, conexiones abiertas. El enunciado original pedía «la clase Test», pero el código solo tiene la clase Persona. Para ejecutarlo creamos antes la carpeta /dir.

Pregunta publicada en 2014 y revisada en octubre de 2026. La respuesta se comprobó compilando y ejecutando el código con Java 25 LTS en un contenedor limpio; las salidas están copiadas de esa ejecución.

10 consejos para programadores que empiezan, explicados uno a uno

En 2013 publicamos aquí diez consejos para quien empieza a programar, en una lista de una línea cada uno. Más de diez años después siguen valiendo, pero merecen una explicación: qué quieren decir en la práctica y qué ha cambiado ahora que un asistente de IA puede escribir buena parte del código.

Los diez consejos

1. Recuerda siempre lo que te enseñaron tus maestros. Los fundamentos envejecen mucho más despacio que las herramientas. Estructuras de datos, complejidad de los algoritmos, cómo funciona la memoria, qué es una transacción en una base de datos: todo eso servía hace treinta años y seguirá sirviendo dentro de otros treinta. Un framework de moda dura unos pocos años; saber por qué una búsqueda en una lista es más lenta que en un diccionario vale para siempre.

2. No emplees nuevas tecnologías solo porque son nuevas. Cada herramienta nueva trae su curva de aprendizaje, sus errores aún sin descubrir y el riesgo de que deje de mantenerse. En un proyecto real, elige lo que el equipo conoce y lo que tiene una comunidad grande detrás, salvo que la novedad resuelva un problema que de verdad tienes.

3. Pero sí debes probar nuevas técnicas y tecnologías. No es una contradicción con el anterior: el sitio para probar es un proyecto personal o una prueba aparte, no la aplicación de producción. Aprender un lenguaje con otra forma de pensar, como Rust si vienes de Python o Go si vienes de Java, te hace mejor programador también en tu lenguaje de siempre.

4. Lee mucho. Libros, documentación oficial y, sobre todo, código de otros. Leer el código de un proyecto de código abierto bien mantenido enseña más sobre cómo se organiza un programa grande que cualquier tutorial. Y la documentación oficial suele ser mejor y estar más al día que la primera respuesta que aparece en un buscador.

5. No acumules errores ni malas prácticas. Cada atajo que dejas «para luego» es una deuda que se paga con intereses: un nombre de variable confuso, una función de doscientas líneas, un error que se ignora en lugar de tratarse. Arreglarlo cuando lo ves cuesta minutos; arreglarlo meses después, cuando hay código que depende de ello, cuesta días.

6. Comparte tu conocimiento. Explicar algo a otra persona es la mejor forma de descubrir si lo entiendes. Escribir un artículo, responder una pregunta en un foro, documentar bien tu proyecto o contribuir a uno de código abierto te obliga a ordenar lo que sabes, y de paso te da visibilidad.

7. Ten en cuenta la concurrencia. Casi todos los programas actuales hacen varias cosas a la vez: atienden a varios usuarios, esperan a la red o reparten el trabajo entre los núcleos del procesador. Los errores de concurrencia son de los más difíciles de encontrar, porque aparecen solo a veces. Aprende pronto qué es una condición de carrera y cómo se evitan. Tenemos ejemplos en Python, Go y Rust, y uno muy claro en String, StringBuffer y StringBuilder, donde dos hilos pierden datos al escribir a la vez.

8. Prueba tu código. No basta con que funcione la vez que lo ejecutas a mano. Las pruebas automáticas te avisan cuando un cambio rompe algo que antes funcionaba, y te dan confianza para mejorar el código sin miedo. Empieza por lo sencillo: una prueba por cada función importante y otra por cada error que corrijas, para que no vuelva.

9. Cuídate. Programar es un trabajo mental y se hace mal cansado. Dormir, moverse, descansar la vista y desconectar de vez en cuando no es tiempo perdido: muchos problemas que parecían imposibles a medianoche se resuelven en diez minutos a la mañana siguiente.

10. Diviértete. La programación tiene mucho de oficio, y los oficios se aprenden con horas de práctica. Esas horas son mucho más llevaderas si disfrutas con lo que haces. Busca proyectos que te interesen de verdad, aunque sean pequeños: un juego, una herramienta para tu día a día o un programa que automatice algo aburrido.

¿Y con la IA? Los diez siguen en pie, y algunos pesan más que antes. Si un asistente escribe el código, tú tienes que entenderlo, revisarlo y probarlo: los fundamentos (1), las pruebas (8) y no acumular malas prácticas (5) son lo que te permite hacerlo. Escribimos sobre ello en aprender a programar cuando la IA ya escribe el código: diez consejos para quien empieza.

Por dónde empezar

Si estás dando tus primeros pasos, elige un lenguaje y quédate con él el tiempo suficiente para hacer algo útil. En decodigo.com tienes cursos completos y gratuitos de Python, Java, Go y Rust, y una guía de Git para guardar tu trabajo desde el primer día.

Los gurús y el trabajo en equipo

Sin duda, siempre existen personas brillantes que se distinguen por su buen sentido común, curiosidad y capacidad para resolver problemas difíciles. Pero siempre he sospechado que la imagen del gurú está sobrevalorada.

Algunas malas experiencias me dicen que esto podría ser así.  En cierta ocasión, durante el desarrollo de un proyecto mas o menos grande y en una demostración de capacidades, el líder del equipo, que se sabía muy bueno en el desarrollo de software (el gurú), comenzó a utilizar una serie de tecnologías y frameworks de moda para impresionar al cliente y al administrador de proyecto.  Como resultado, los que tenían menos experiencia comenzaron a sufrir con la curva de aprendizaje y se enfocaron mas a conocer las nuevas tecnologías que al modelo de negocio. El desarrollo se terminó con una aplicación robusta tecnológicamente, pero poco amigable para el cliente y por supuesto en mas tiempo del que se esperaba. Un pequeño desastre.

En otras ocasiones, me he topado con el típico personaje que es capaz de resolver problemas difíciles, pero que cuando tienes que dar mantenimiento a su código o simplemente necesitas usarlo, este te parece tan desordenado que te dan ganas de hacerlo de nuevo.

Otro de los riesgos de tener a una persona que tiene todo el dominio sobre cierta tecnología, herramienta o el conocimiento mas crítico de un proyecto, es que puede simplemente irse, con el todo su conocimiento.

Me agradan mas los equipos de trabajo donde los problemas difíciles o algunas decisiones tecnológicas se resuelven entre varios.

Los gurús se equivocan como cualquier otro.

Además, cuando te autoproclamas gurú, puedes quedarte solo a la hora de resolver problemas difíciles.  Creo que no hay necesidad de que esto sea así, porque el criterio para resolver un problema crítico se reduce al de una sola persona y no creo que esto sea muy conveniente.

Cuando alguien te hace una pregunta complicada sobre algún problema o error, es probable que ella misma tenga mas capacidad para responderla, ya que conoce mejor el contexto del problema.  Por lo que mas que tratar de dar una solución es mejor dar un punto de vista o pistas sobre como resolver el problema.

El protagonismo es algo que nos puede seducir a todos, pero yo me lo pensaría mucho antes de adoptar una postura de este tipo. Sobre todo cuando de lo que se trata es hacer mas agradable y profesional tu trabajo.  Desde luego no estoy diciendo que todos los gurús son malos, de hecho también he conocido a algunos muy buenos. Pero son los menos.

Un hábito que recomiendo a todos es que cuando encuentras la solución a un problema difícil, la comentes a tus demás compañeros. Esto permite tener una base de conocimiento colectiva y evita tener que investigar demasiado sobre un problema que ya se ha sido resuelto con anterioridad.

Tómate con calma eso de ser gurú, puedes serlo sin hacer alarde.  🙂

Talento

Texto sobre fondo oscuro: «Para ser un buen programador se requiere 3% de talento y 97% de esfuerzo para no distraerse con Internet».

«Para ser un buen programador, se requiere 3% de talento y 97% de esfuerzo para no distraerse con Internet»

El talento ayuda, pero lo que marca la diferencia es la constancia. Y la mayor amenaza para la constancia está a una pestaña de distancia.