¿Qué programa debe tener cada programador en su conjunto de habilidades?

Me gustaría apoyar a Grep de Scott Danzig. Pero en aras de proporcionar una segunda alternativa, pelusa. A menudo se pasa por alto, pero está disponible de alguna forma para casi todos los lenguajes de programación, lint está diseñado para mostrarle dónde está cometiendo posibles errores en su programa por una insistencia draconiana en hacer las cosas “de la manera correcta”. Puede ser una herramienta de análisis estático muy poderosa. Si tiene un programa que compila limpio, pero se comporta de manera extraña, puede valer la pena incluirlo.

Y si pudiera escabullirme en un segundo, git. Honestamente, mercurial, subversión, git, cualquier sistema de control de versiones que prefiera, ¡aprenda uno! Los hábitos adquiridos al aprender un VCS se pueden adaptar rápidamente a otros. Recomiendo git en particular por su ubicuidad. En particular, su uso en el proyecto de kernel de Linux, para el cual fue desarrollado originalmente, asegura que no irá a ningún lado pronto.

Si puedo tomar la libertad extrema para sugerir un tercero, hacer. Si no está programando estrictamente para Windows, eventualmente encontrará make. Qué tan bien se haya preparado para ese evento determinará si tiene un día muy bueno o muy malo. Make y sus herramientas asociadas forman la piedra angular de la distribución de software ‘nix.

  1. Vi / Vim editor. (Como mi amigo @sanjeev ha dicho en este hilo) puede escribir código en cualquier idioma usando vim.
  2. El control de versiones es muy importante cuando varias personas van a trabajar en el mismo código. Entonces, un programador debe saber svn o git.
  3. Lenguaje C. Casi todos los lenguajes tienen conceptos similares a C. Casi todos los idiomas fueron creados usando C.
  4. Scripting de shell . Al menos debes conocer algunos comandos básicos como cat, grep, cp, mv, awk, etc.
  5. OOP Al menos un lenguaje de programación orientado a objetos.
  6. Base de datos . Comience con MySQL para una base de datos relacional.

Después de veinte años de desarrollo de software, creo que el algoritmo “Bresenham” es el programa más versátil y potente.

Cosas como estructuras de datos, listas enlazadas, etc., a menudo se discuten en estudios de CS y se entienden fácilmente. Pero es el Bresenham el que rara vez se discute en los estudios de pregrado y posgrado de CS , pero es inmensamente poderoso y útil a lo largo de la carrera de un ingeniero de software.

El algoritmo de Bresenham proporciona un mecanismo de reloj simple y variable que se puede utilizar en miles de problemas informáticos diferentes desde espacios 1 a n-dimensionales. Por ejemplo, Bresenham se puede usar para dibujar líneas gráficas en una pantalla de visualización 2D desde cualquier punto a cualquier punto (como en las bibliotecas de gráficos), calcular la aceleración, la velocidad y la posición de los objetos en el espacio 2D y 3D (como en las bibliotecas de física), cree mapeo de texturas 2D y 3D para visualización, genere un caudal variable, cambio o ciclo de trabajo, como imitar una salida de modulación de ancho de pulso variable, etc.

Se lee el algoritmo de Bresenham en su forma más simple, que cito de memoria:

Xdelta = p2_xpos – p1_xpos;
Ydelta = p2_ypos – p1_ypos;
Xdelta_abs = (Xdelta> 0)? Xdelta: -Xdelta;
Ydelta_abs = (Ydelta> 0)? Ydelta: -Ydelta;
MaxDelta = (Xdelta_abs> Ydelta_abs)? Xdelta_abs: Ydelta_abs;
Xinc = (Xdelta> 0)? 1: -1;
Yinc = (Ydelta> = 0)? 1: -1;
Xclock = 0
yClock = 0

Xpos = p1_xpos;
Ypos = p1_ypos;

// Dibujar linea…
while ((Xpos! = p2_xpos) || (Ypos! = p2_ypos))
{
Xclock + = Xdelta_abs;
if (Xclock> = MaxDelta)
{
Xpos + = Xinc;
Xclock- = MaxDelta;
}

Yclock + = Ydelta_abs;
if (reloj> = MaxDelta)
{
Ypos + = Yinc;
Yclock- = MaxDelta;
}

// traza un píxel en línea
establecer píxeles de pantalla (Xpos, Ypos) = BLANCO;
}

// trazar el último píxel
establecer píxeles de pantalla (Xpos, Ypos) = BLANCO;

Si es sabio, programe y pruebe el algoritmo de Bresenham, aprenda su comportamiento y guarde el algoritmo en la memoria de su mente. No te arrepentiras.

grep

Nada parece más relevante universalmente. Es un programa simple de aprender, y en realidad no es tan difícil de dominar (aprende las expresiones regulares y las tuberías en UNIX). Lo uso todos los días, para todo, desde las operaciones básicas en UNIX, hasta la resolución de problemas, la supervisión, la administración del sistema, el análisis de datos y el simple intento de encontrar ese archivo “en algún lugar de mi disco”.

Recuerdo una vez que estaba trabajando con esta monstruosidad de pseudo código abierto (solo defensa) llamada OneSAF, para la simulación de … lo que sea que encuentres en un campo de batalla, desde tanques hasta inodoros. Al intentar averiguar por qué algo no funcionaba (las torretas solo apuntaban en línea recta), tuve que averiguar dónde buscar primero en toneladas de directorios mal nombrados llenos de muchos archivos. No tengo idea de por dónde empezar a buscar. La herramienta utilizada para disparar un tanque tenía un texto que pude obtener. Lo encontré en una de esas bibliotecas y pude rastrear lenta pero seguramente el flujo de ejecución hasta donde se suponía que debían girar las torretas.

Yay grep!

Desensamblador (cualquiera que elija). Me parece que muchos ingenieros de software rara vez se han tomado el tiempo de mirar el código que escriben en su forma (casi) más cruda que existe: ensamblaje. Hay tanto que uno puede aprender mirando el ensamblaje producido por un compilador que no hay suficiente espacio aquí para todo. Pero solo por mencionar algunos:

  1. Traducción de abstracción de alto nivel a comandos de bajo nivel.
  2. Gestión de la memoria.
  3. Características específicas del lenguaje.
  4. Optimizaciones y su efecto en su código.
  5. Falta de optimizaciones y su efecto en su código.

Como ejemplo para (3): quería comprender completamente la herencia virtual en C ++. Para hacerlo, implementé varias clases en c ++ con herencia virtual y desarme el código. Fue solo después de mirar el resultado del ensamblaje (en GDB mientras lo comparaba con el código fuente real y lo revisé), que entendí completamente el concepto.

1. Herramienta de versiones: preferiblemente git. ¿Por qué? Para el flujo de trabajo de tenedor y tracción

2. Dominio de un editor (¿por qué emacs o vim? Puedes usarlo para todo tipo de código que vas a escribir en la vida).
Si usa un IDE, es probable que continúe cambiando el IDE dependiendo de su trabajo. Un IDE para Java, uno para desarrollo web, etc.

3. Herramientas de búsqueda y manipulación de texto: grep, awk (sed opcional)

También hay otros, pero personalmente considero que estos tres son imprescindibles.

¡El navegador! Si eres un programador: ¿cuántas pestañas tienes abiertas en este momento y cuántas son para referencia? Además, el navegador es un IDE cada vez más capaz.

Y también es la plataforma objetivo para un número cada vez mayor de programadores, por lo que es importante comprender las entrañas y dominar sus herramientas de depuración.

Estoy obligado a mencionar cosas que no fueron mencionadas por otros autores.

  • Emacs
  • https://github.com/ggreer/the_si … (búsqueda de texto sobre el código fuente)
  • Etiquetas exuberantes (navegación de texto a través de “etiquetas” predefinidas)
  • rsync (sincronización de datos)
  • Secure Shell (nuff. Dijo)
  • sshfs

Leyendo.

En particular, leer el código fuente. Esto y la capacidad de no aburrirse en medio de la lectura a través de un fragmento de código / módulo / clase / biblioteca particularmente difícil.

De esta manera, no escribe accidentalmente una tercera implementación de un verificador de dirección de correo electrónico (que está tan roto como los dos primeros). También puede toparse con un comentario que explica por qué el proyecto que ha heredado es tan malo como lo es. Dicho comentario podría haber permanecido sin descubrir, si no hubiera trabajado a través de resmas de código desagradable y, en su lugar, hubiera abofeteado en otra “solución rápida” que sobreviviera a su mandato.

Hágalo lo suficiente, y podría terminar aprendiendo a escribir código que no lo haría temblar cuando lo lea después de seis meses.

gdb

Me sorprende que nadie haya mencionado esto todavía. No puede confiar en su elegante IDE para siempre para depurar cosas. A veces tienes que ensuciarte y hacer una depuración hardcore.

Veo que la mayoría de las respuestas hasta ahora se basan en sistemas operativos de tipo Unix.
Pero si está utilizando Windows como un entorno en desarrollo, diría: Total Commander. Muchos lo consideran imprescindible.

Un editor de texto . ¿Con qué más vas a editar tu código fuente?

Un perfilador como gprof y un verificador de memoria como valgrind.

VI editor