Conoce tus herramientas

Este post se centrará sobre una de las formas que considero más importantes para lograr ser productivo, especialmente, como colaborador individual: Conocer nuestras herramientas de trabajo en profundidad.

Los seres humanos contamos con un único recurso universal e inmutable. Nacemos con él y morimos cuando finalmente se nos acaba. A diferencia de otras aptitudes que también podríamos considerar recursos como la fuerza o la inteligencia, las cuales pueden entrenarse para mejorar en el transcurso de nuestras vidas, este recurso en particular no es renovable ni podemos aumentarlo: nuestro tiempo.
Nuestro tiempo es limitado y valioso, por lo que es normal querer asegurarnos de aprovecharlo al máximo. Pero aunque no exista manera de contar con más de 24 horas en un día, sí tenemos el poder de utilizar ese tiempo de manera más eficiente, generando un mayor valor agregado o impacto con el tiempo que dedicamos a ciertos objetivos.

A diferencia de otras áreas o rubros donde una mayor destreza física (por ejemplo, fuerza o velocidad) pueden derivar en una mayor productividad, en IT este no suele ser el caso. Es verdad que, por ejemplo, practicando mecanografía, un programador puede aumentar la cantidad de líneas de código que escribe por minuto, pero estrategias de este estilo suelen ser mucho menos efectivas que buscar formas de escribir menos código, en lugar de escribir más rápido.
En mi opinión, debemos aspirar más a ser artesanos experimentados que trabajan con precisión y meticulosidad sin dar una sola cincelada de más; en lugar de buscar convertirnos en fábricas de producción masiva.

Es aquí donde entran en juego nuestras herramientas, y el conocerlas para saber cuál se adecúa mejor a cada una de nuestras necesidades y como utilizarlas para aprovecharlas al máximo.

¿Cuales son nuestras herramientas?

Todo el software que utilizamos es parte de nuestra caja de herramientas. Desde el sistema operativo que ejecuta nuestra máquina, hasta el editor de texto o IDE en el que escribimos nuestro código e incluso los propios compiladores o interpretes de los distintos lenguajes de programación que utilizamos.

También los frameworks y bibliotecas que utilizamos son parte de nuestra caja de herramientas, y aunque el resto de este post no se centra en ellos, vale la pena mencionar su importancia ya que, conocerlos y entender las posibilidades y facilidades que nos brindan así como sus limitaciones es otra excelente manera de aumentar nuestra productividad a la hora de programar.

Aspectos esenciales

A mi entender, hay algunos aspectos transversales a casi todas las herramientas informáticas que resultan claves para aumentar nuestra eficiencia. Estos son:

Configuraciones

La mayoría del software dispone de distintas opciones y configuraciones que, dependiendo de nuestras tareas diarias, experiencia y preferencias personales, pueden simplificar nuestro trabajo.

Siempre es recomendable al utilizar una nueva herramienta, dedicar un tiempo a leer su documentación y explorar sus distintas opciones y configuraciones. Esto nos permitirá tener, por lo menos, una idea general sobre las posibilidades que ofrece para poder, a medida que la utilicemos, realizar los ajustes necesarios para poder trabajar de la manera que nos resulte más cómoda, práctica y productiva.

Atajos de teclado

Es muy común que los sistemas operativos y programas que utilizamos cuenten con múltiples atajos de teclado para realizar distintas acciones. La cantidad de teclas que podemos combinar para conseguir distintos resultados es realmente inmensa y no tiene ningún sentido intentar memorizar absolutamente todos los atajos de teclado de los que disponemos, pero sí, puede ahorrarnos bastante tiempo el aprender los atajos correspondientes a las acciones que realizamos con más frecuencia.

Respaldos y sincronización

La mayoría del software incluye alguna opción para crear backups, puntos de restauración o por lo menos realizar exportación de sus configuraciones. Es importante conocer estas opciones y utilizarlas.

Inevitablemente, en algún momento, vamos a romper nuestro ordenador. Pueden ser hoy, mañana o dentro de tres años. Puede ser intentando ajustar configuraciones para que la computadora funcione de manera más fluida, puede ser intentando crackear un juego o puede ser que nuestro gato camine arriba del teclado. Ni el momento ni la razón importan. Lo importante es que va a pasar. Y por eso debemos estar preparados para restaurar nuestro equipo a un estado en el que sea utilizable con la mayor rapidez, posible.

Mejor aún si además de crear estos respaldos tenemos alguna herramienta que nos permita almacenarlos en la nube o incluso sincronizar nuestras configuraciones entre dispositivos.

Menciones de honor

A continuación voy a dejar un repaso rápido sobre los aspectos que acabamos de discutir sobre algunas de las herramientas que más utilizo (y, por lo tanto, en las que valor me aporta el aumentar la eficiencia)

Sistema Operativo

No creo que nadie se sorprenda de ver el sistema operativo primero en la lista. ¿Es una obviedad que es importante saber usar una computadora? Sí. ¿Me va a volver más productivo por ser un Power User y conocer cada posible configuración de mi sistema operativo? No.

En el apartado de configuraciones lo que considero más relevante es conocer:

  1. La estructura de directorios (carpetas, si son usuarios de Windows).
  2. Cómo visualizar archivos y directorios ocultos.
  3. Sistema de permisos.
  4. PATH (Si van a programar esto es mucho muy importante).

Sobre esta base se pueden seguir incorporando otros elementos que ayuden a organizarse mejor como, por ejemplo, el uso de múltiples escritorios o workspaces.

¿Atajos de teclado? Muchísimos. Solo voy a dejar las listas de atajos de algunos de los sistemas operativos más comunes. Queda a criterio de cada uno decidir cuales les resultaran más útiles.

En cuanto a los respaldos, los sistemas operativos suelen incluir alguna solución nativa para realizar respaldos.

Adicionalmente, a mí me gusta utilizar git para versionar las configuraciones y documentos más importantes. Es algo bastante simple de realizar en GNU Linux, pero desconozco que tan efectivo sería esto en Windows.

Y para mantener backups en la nube yo utilizo el servicio de Mega.

Terminal (Consola)

En mi día a día yo suelo utilizar KDE Neon, una distribución de GNU Linux y, probablemente por costumbre más que por otra razón, mi terminal preferida es Bash, pero los puntos que voy a mencionar aplican a cualquier otra shell (Z shell, Fish shell, etc) o (al menos la mayoría) incluso a consolas de Windows como Powershell o el inmortal “cmd” .

Las terminales son herramientas de los más versátiles y sus opciones de configuración son prácticamente infinitas, pero entre todo lo que se puede configurar, personalmente, destaco:

Alias
s posible asignar un alias a una comando largo y complicado (incluso con flags o argumentos predefinidos) para simplificar su uso.
Funciones
Si un alias se queda corto para simplificar la ejecución de una tarea, siempre podemos definir funciones personalizadas (pequeños programas) que realicen una serie de comandos específicos.
Autocompletado
Muchas aplicaciones de CLI cuentan automáticamente con autocompletado de argumentos, pero para las que no, es posible definir un script o configuración que permita el autocompletado de forma personalizada.
# git checkout remote
# For usage, execute `gcr` without any argument
function gcr() {
    local REMOTE='origin'

    if [ -z "${1}" ]
    then
        echo "gcr creates a new branch based on an ${REMOTE} branch.
If the branch already exists it is overwritten.

Usage:
    gcr <${REMOTE} base branch> <name-for-new-branch>
Example:
        gcr development new-feature
    will result in the creation of the branch development_new-feature
    tracking ${REMOTE}/development
"
        return
    fi

    git fetch -t -P "${REMOTE}" &&

    local BRANCH_NAME='' &&

    if [ -z "$2" ]
    then
        BRANCH_NAME="${1}"
    else
        BRANCH_NAME="${1}_${2}"
    fi &&

    git checkout -t "${REMOTE}/${1}" -B "${BRANCH_NAME}"
}
# gcr bash completion
function __remote_branch_completion() {
    local REMOTE_BRANCHES="$(__git_remote_heads)"
    COMPREPLY=($(compgen -W "${REMOTE_BRANCHES//'origin/'/}" "${COMP_WORDS[1]}"))
}
complete -F __remote_branch_completion gcr

Ejemplo de función bash que simplifica el comando git checkout para crear y cambiar a una nueva rama basada en una rama remota específica y la configuración de su autocompletado.

Las terminales también cuentan con atajos de teclado que pueden resultarnos de los más útiles.

Visual Studio Code

Otra herramienta con una cantidad enorme de configuraciones y atajos, además de la posibilidad de sincronizar estas entre dispositivos.

En cuanto a sus configuraciones sugiero revisarlas minuciosamente, la manera de hacer esto que a mí me resulta más práctica es:

  1. Presionamos la combinación de teclas Ctrl+Shift+p para abrir la barra de comandos.
  2. Escribimos Preferences: Open User Settings (JSON) y pulsamos Enter. Esto nos abrirá un archivo JSON donde podemos definir nuestras configuraciones personalizadas.
  3. Comenzaremos agregando: "workbench.settings.useSplitJSON": true. Esto nos permitirá ver, a la vez, las configuraciones que nosotros hayamos definido y todas las configuraciones disponibles (incluidas las correspondientes a extensiones) con sus valores por defecto.

De este modo, podemos explorar todas las opciones y ajustarlas según nuestras necesidades.

De manera similar con Preferences: Open Keyboard Shortcuts podemos revisar todos los atajos de los que el Visual Studio Code dispone, asi como configurar nuestros propios atajos personalizados.

Git

Lean la documentación de git. Sus configuraciones son muchas y de los mas variadas, permite la creación de aliases y personalizar muchos de sus comportamientos con herramientas de terceros como delta

Próximamente

Hasta aquí llega el post de hoy. Próximamente espero poder compartir algunas de las configuraciones que mas aprovecho en mi día a día.

¡Hasta pronto!