¿Qué debe saber todo programador sobre programación?

52

Por favor, manténgase en problemas técnicos , evite problemas de comportamiento, culturales, profesionales o políticos.

conocidos
fuente
77
Vea esto también stackoverflow.com/questions/132798/…
pramodc84
Este tipo de pregunta realmente me molesta. Solo puede surgir de la mente de alguien que ve el mundo en términos de blanco y negro. No todos los programadores tienen el mismo trabajo y si es el mínimo común denominador que estás buscando, las respuestas a continuación muestran que acabas con una lista de manías.
Capitán Sensible

Respuestas:

92
  1. El error está en su código, no en el compilador o en las bibliotecas de tiempo de ejecución.

  2. Si ve un error que no puede suceder, verifique que haya creado y desplegado correctamente su programa. (Especialmente si está utilizando un IDE complicado o un marco de compilación que intenta ocultarle los detalles desordenados ... o si su compilación implica muchos pasos manuales).

  3. Los programas concurrentes / multiproceso son difíciles de escribir y más difíciles de probar adecuadamente. Es mejor delegar todo lo que pueda a bibliotecas y marcos de simultaneidad.

  4. Escribir la documentación es parte de su trabajo como programador. No lo deje para que "alguien más" lo haga.

EDITAR

Sí, mi punto # 1 está exagerado. Incluso las plataformas de aplicaciones mejor diseñadas tienen su parte de errores, y algunas de las menos bien diseñadas están plagadas de ellas. Pero aun así, siempre debe sospechar su código primero , y solo comenzar a culpar a los errores del compilador / biblioteca cuando tenga evidencia clara de que su código no tiene la culpa.

En los días en que hice el desarrollo de C / C ++, recuerdo casos en los que supuestos "errores" del optimizador se debieron a que yo / algún otro programador había hecho cosas que las especificaciones del lenguaje dicen que tienen resultados indefinidos. Esto se aplica incluso para lenguajes supuestamente seguros como Java; Por ejemplo, eche un vistazo al modelo de memoria Java (JLS capítulo 17).

Stephen C
fuente
17
Prefiero decir "El error probablemente está en su código", ya que me he encontrado con errores en las bibliotecas de tiempo de ejecución varias veces. Sin embargo, todavía tengo que encontrarme con un error del compilador. +1 de todos modos.
Chinmay Kanchi
29
Si nunca ha encontrado un error de buena fe en el compilador, no es lo suficientemente aventurero con su codificación. ;)
Mason Wheeler
8
@Chinmay, @ spudd86, @Mason - sí ... y también he encontrado mi parte de errores de compilación y biblioteca en mis más de 30 años de programación. Pero en mi experiencia, el 99 +% de los errores resultan ser (al menos en parte) culpa de mi código. Mi respuesta exagera deliberadamente esto para llegar al punto de que siempre debe sospechar su código primero.
Stephen C
55
No tengo el miedo irracional que la gente tiene con la programación multiproceso. Sospecho que las personas que perpetúan esta vista, no programan mucho código multiproceso. Simplemente no es tan difícil. +1 para todo lo demás sin embargo.
Steven Evers
44
Si está trabajando en el compilador, entonces el error probablemente esté tanto en su código como en el compilador;)
Legooolas
84
  • Cómo leer el código de otras personas.
  • El código no existe si no está marcado en el Sistema de control de versiones.
pramodc84
fuente
8
+10000 si pudiera para el comentario de control de versión. El historial y el registro de cambios son absolutamente indispensables y son la razón por la que debe poner todo en el control de versiones desde el principio.
Legooolas
2
... y el repositorio se ha sincronizado con al menos otra ubicación. Importante con DVCS, pero también con VCS centralizado.
Por lo demás, el código no existe a menos que exista un elemento de trabajo que autorice al desarrollador a escribirlo.
Jesse C. Slicer
2
Tendré más uno para aprender a leer el código de otras personas. Es más difícil de lo que la mayoría de nosotros nos damos cuenta, pero es una parte esencial de una programación exitosa.
bogeymin
más uno para aprender a leer el código de otras personas.
itsaboutcode
76

Los cálculos de coma flotante no son precisos.

Chinmay Kanchi
fuente
Si alguien no sabe de qué estoy hablando, lea el enlace de @ Adam. Es un excelente resumen de las trampas del cálculo de coma flotante.
Chinmay Kanchi
1
Y si no saben, pueden estar entre el conjunto de personas que preguntan diariamente en stackoverflow.
Brian R. Bondy
1
@Brian: Muy cierto. Desearía que hubiera una manera de identificar las preguntas explicadas por la aritmética de coma flotante. ¡Puede crear una aplicación de pila que muestre una pregunta diferente de coma flotante todos los días!
Adam Paynter
63

No dejes de aprender.

2 revoluciones
fuente
1
Relacionado: No dejes de creer.
Fishtoaster
3
Relacionado: No dejes de pensar en el mañana.
ocodo
77
Relacionado: No detengas la música.
adamk
1
Relacionado: ¡No dejes de moverte! Es tu vida, sigue moviéndote, hazlo bien, ¡tienes que hacerlo bien!
Ocodo
44

Que lo # 1 que puede hacer para aumentar la calidad y la facilidad de mantenimiento de su código es REDUCIR LA DUPLICACIÓN.

Chris Holmes
fuente
44
SECO, si! ¿Cómo puedo olvidarlo? ;-)
Maniero
Esto es tan importante que respondí de nuevo .
Prefiero decir: REDUCIR CONDICIONALES. Cada while / if / for es un error potencial.
zvrba
1
Ya sabes, lo curioso de DRY es que se repite en todas partes. :) +1
Billy ONeal
39

Habilidades de solución de problemas y depuración

Casi no dedican tiempo a este tema en ninguno de los cursos de programación que tomé, y en mi experiencia es uno de los principales determinantes de cuán productivo es un programador. Te guste o no, pasas mucho más tiempo en la fase de mantenimiento de tu aplicación que en la nueva fase de desarrollo.

He trabajado con tantos programadores que depuran cambiando aleatoriamente las cosas sin una estrategia para encontrar el problema. He tenido esta conversación docenas de veces.

Otro programador: Creo que deberíamos intentar ver si lo soluciona.
Yo: Bien, suponiendo que eso lo arregle. ¿Qué le dice eso sobre dónde está el origen del problema?
Otro programador: No lo sé, pero tenemos que intentar algo .

JohnFx
fuente
2
Estaba a punto de publicar esto. Gran parte del trabajo de un programador consiste en corregir errores, y muchas personas tienden a ser incapaces de hacerlo (especialmente en el código de otros).
Dov
+1 Pasé de javascript / php a C # y me enamoré de pasar por el código. Desearía que los idiomas escritos dinámicamente pudieran hacer un mejor trabajo de esto.
Evan Plaice
Otro comportamiento extraño es que el programador insiste en que cada parte de su programa es correcta mientras que el resultado es defectuoso. "-No necesita imprimir la matriz en la consola para verificar si está ordenada porque la línea de arriba es array.sort ()". "-Bueno ... ya sabes, no está funcionando. Debe haber algo mal en alguna parte. ¡No puedes defender tu código en este momento!"
gawi
2
Creo que el punto de depuración para validar sus suposiciones en todo su programa. A veces, necesitas ir a pescar algunas pistas. Esto tiene que hacerse sistemáticamente. Es perfectamente válido probar algo que pueda decirle algo nuevo. Lo hago a menudo
gawi
37
  1. No seas inteligente; Se claro.
  2. Usar antes de reutilizar.
  3. Los nombres importan.
  4. Una función hace 1 cosa y lo hace bien.
  5. Lo pequeño es mejor que lo grande.
KevBurnsJr
fuente
2
¿Puede aclarar "Usar antes de reutilizar". No he escuchado eso antes.
Tjaart
34

Los basicos. Actualmente los programadores aprenden tecnologías, no conceptos. Está incorrecto.

clrod
fuente
Si y no. Suenas como todos los profesores que he tenido en la universidad ... todos los cuales nunca hicieron un montón de software en toda su vida. El conocimiento, sin habilidades, es inútil en nuestra profesión.
Steven Evers
44
+1, muy cierto. Sí, esto es algo que a los tipos de torre de marfil les gusta decir, pero no lo hace menos cierto para el resto de nosotros en las trincheras.
MAK
2
Conceptos básicos como la ortografía? Its wrongdebería ser it's wrong, por ejemplo.
Konerak
2
No, los conceptos básicos como no se preocupan por un error tipográfico, pero se preocupan por problemas de programación.
clrod
55
Es fácil aprender los pasos para hacer algo y, a menudo, es difícil saber cuándo debe usarlo y, lo que es más importante, cuándo podría usarlo, pero no debería hacerlo. Los libros de texto son particularmente malos para mostrar el cómo pero no el por qué (y por qué no).
HLGEM
27

Todo programador debe saber que está poniendo suposiciones en el código todo el tiempo, por ejemplo, "este número será positivo y finito", "este código podrá conectarse al servidor todo el tiempo en un abrir y cerrar de ojos".

Y debe saber que debe prepararse para cuando se rompan esas suposiciones.

LennyProgrammers
fuente
66
Específicamente los que tienen assert()- en todas partes. assert()lo ayudará a documentar sus suposiciones y lo salvará cuando esté equivocado.
Dustin
@Dustin +1 No hay forma de que puedas recordar todas tus suposiciones: documentarlas mediante programación y se te informará exactamente cuándo resultan ser suposiciones incorrectas.
Skilldrick
1
... a menos que esté compilado con NDEBUG.
19

Todo programador debe saber sobre las pruebas.

Tom Duckering
fuente
66
No funciona a menos que lo hayas probado.
JD Frias
17

Aprender conceptos . Puedes buscar en Google la sintaxis.

pramodc84
fuente
Bueno en teoría, excepto que Google es terrible para encontrar una sintaxis específica : la búsqueda de términos como "referencia de objeto" o "esto" dado un gran número de resultados, y la búsqueda de expresiones idiomáticas como "$?" no dar resultados en absoluto.
l0b0
16

Pensamiento crítico y lógico. no puedes hacer nada bueno sin eso.

Mladen Prajdic
fuente
14

Examen de la unidad. Esta es una excelente manera de codificar sus suposiciones sobre cómo se va a utilizar el código.

btlog
fuente
13

Eso es más difícil de lo que piensas.

Si bien es fácil (ish) armar algo que funcione cuando se usa normalmente, hacer frente a entradas erróneas, todos los casos de borde y esquina, posibles modos de falla, etc. lleva mucho tiempo y probablemente será la parte más difícil del trabajo.

Entonces también debes hacer que la aplicación se vea bien.

ChrisF
fuente
3
Creo que esta es la fuente del viejo dicho: '90% del trabajo toma el 90% del tiempo. el último 10% toma el otro 90% del tiempo '
GSto
Creo que mucha gente tiende a subestimar constantemente la complejidad. "¿Qué tan difícil puede ser X?" - últimas palabras famosas: /
Roman Starkov
@GSto No quiero trabajar el 180% del tiempo, ¡el 100% está bien para mí!
adamk
13

Conocimiento del dominio. La especificación nunca es 100%; Conocer el dominio real con el que se está desarrollando SIEMPRE aumentará la calidad del producto.

Steven Evers
fuente
11

Punteros, obviamente. :)

Laurynas Biveinis
fuente
3
Los punteros solo son realmente necesarios en un subconjunto de idiomas para un pequeño subconjunto de tareas. Para la mayoría de las tareas, puede (y debería poder) programar como si el concepto de puntero no existiera.
Chinmay Kanchi
14
@Chinay Kanchi No. Los punteros deben ser entendidos por todos.
alternativa el
55
Eso realmente depende de lo que quieras decir con puntero. Si te refieres a punteros de estilo C que puedes manipular (que es lo que asumí), diría que un programador de Java / C # / Python no necesita saber nada sobre ellos. Si te refieres a un puntero como en las "referencias" de Java, es decir, un puntero que no se puede manipular, entonces sí, es necesario conocerlos, aunque solo sea para evitar que te resbales.
Chinmay Kanchi
@mathepic Te estremecerás hasta el fondo si supieras cuántos estudiantes de CS se gradúan cada año que no entienden lo primero sobre los punteros. Si no hubiera hecho todo lo posible para hacer colocaciones cada verano, ni siquiera me habrían enseñado sobre punteros en C o referencias en Java ...
Mike B
55
@Chinmay: se pierde un programador Python / Java / C # que no entiende el concepto de punteros. L = [[]] * 2; L[0].append(42) Diferentes idiomas usan diferentes nombres, pero la indirección es esencial en todas partes.
11

Code Complete 2 - de principio a fin

Kyle Ballard
fuente
Realmente debe saber esto antes de aceptar dinero para programar. Si encuentra algo que no sabía en él, considere un cambio de carrera o un intenso período de estudio autodirigido para que pueda entenderlo todo. Y luego discúlpese con sus compañeros de trabajo. Y solo cubre los conceptos básicos de programación.
Tim Williscroft
11

Los datos son más importantes que el código.

Si sus datos son inteligentes, el código puede ser tonto.

El código tonto es fácil de entender. También lo son los datos inteligentes.

Casi cada dolor algorítmico que he tenido se debe a que los datos están en el lugar equivocado o se abusa de su verdadero significado. Si sus datos tienen significado, ponga ese significado en el sistema de tipos .

Gonzales
fuente
2
Me tenías todo el camino hasta que dijiste "sistema de tipos".
10

Qué idioma y entorno es más adecuado para el trabajo. Y no siempre es tu favorito.

Dan Diplo
fuente
10

Divide y conquistaras. Por lo general, es la mejor manera de resolver cualquier tipo de problema práctico, desde la programación hasta la depuración.

Rick Minerich
fuente
8

La verdadera habilidad se refleja en la capacidad de ejecutar bien un diseño simple, no en la capacidad de hacer que un diseño complicado funcione en absoluto.

Esta habilidad proviene de un mayor dominio de los fundamentos, no del dominio de lo arcano. Un programador de alto calibre no se define por su capacidad para codificar lo que otros no pueden (utilizando funciones de nivel superior, programación funcional avanzada, lo que sea que tenga), sino más bien por su capacidad para refinar la codificación perfectamente mundana. Elegir la descomposición apropiada de la funcionalidad entre clases; construyendo en robustez; utilizando técnicas de programación defensiva; y usando patrones y nombres que conducen a una mayor autodocumentación, estos son el pan y la mantequilla de la programación de alto calibre.

Escribir un buen código al que usted u otra persona pueda volver en una semana, un mes o un año y comprender cómo usar, modificar, mejorar o extender ese código es crucial. Le ahorra tiempo y esfuerzo mental. Acelera las ruedas de la productividad al eliminar los obstáculos que habría tropezado antes (tal vez interrumpir su tren de pensamiento, o tal vez quitar horas o días de esfuerzo de otro trabajo, etc.). Hace que sea más fácil concentrarse en los problemas difíciles , y a veces hace que los problemas difíciles desaparezcan.

En una palabra: elegancia. Cada clase, cada método, cada condición, cada bloque, cada nombre de variable: lucha por la elegancia.

Cuña
fuente
8

Nunca culpe al usuario de lo que podría solucionarse con una experiencia de usuario más limpia o una mejor documentación. A menudo, los programadores asumen automáticamente que el usuario es un idiota que no puede hacer nada bien, cuando el problema es una mala experiencia general o falta de comunicación. Los programas están destinados a ser utilizados, y tratar al usuario con desprecio es perder el punto de programación en primer lugar.

usuario8
fuente
6

Todo programador debe saber cómo usar el depurador y saber cómo usarlo bien .

Brian R. Bondy
fuente
5

Estructuras de datos

Maniero
fuente
5

Cómo usar Google

bruno077
fuente
4

Evaluación de cortocircuito, aunque es una de las primeras cosas que le enseñan sobre los operadores booleanos.

Federico klez Culloca
fuente
4

Cómo calcular con precisión cuánto tiempo llevará implementar una característica. Más importante aún, cómo transmitir que no estás mintiendo cuando envías esa estimación.

Wheaties
fuente
2
o aprenda cómo animar bien y transmitir que no está invitando a invitados ...;)
Billy Coover
4

El estilo de codificación importa:

  • la sangría constante es importante,
  • el uso constante de espacios en blanco (por ejemplo, alrededor de operadores) es importante,
  • la colocación consistente de {} s importa,
  • los identificadores bien elegidos importan,
  • etc.

... y el buen diseño importa.

Idealmente, el programador aprende estas cosas antes (o durante) su primera revisión de código. En el peor de los casos, el programador los aprende cuando el jefe le dice que haga cambios no triviales a un código horrible a toda prisa.

Stephen C
fuente