¿Qué debe saber todo programador?

245

Independientemente de los lenguajes de programación o los sistemas operativos utilizados o el entorno para el que se desarrollan, ¿qué debe saber todo programador?

Algunos antecedentes:

Estoy interesado en convertirme en el mejor programador que pueda. Como parte de este proceso, estoy tratando de entender lo que no sé y me beneficiaría mucho si lo supiera. Si bien hay un montón de listas en torno a "n cosas que todo desarrollador de [insertar lenguaje de programación] debería saber", todavía tengo que encontrar algo similar que no se limite a un lenguaje específico.

También espero que esta información sea de interés y beneficio para otros.

Matt Lacey
fuente

Respuestas:

636

Cómo tragar orgullo y admitir errores sin tomarlos personalmente.

Gilligan
fuente
6060
Eso es algo que todo ser humano debe hacer independientemente de su trabajo (... sexo, religión, cultura, estatus social ...), ¿no le parece? ;)
3
Oh si. Pero nosotros, los programadores (al menos yo), tenemos una tendencia a tener más orgullo abierto que la mayoría :-)
17
Desearía poder votarte dos veces.
44
Creo que esto es una cosa que aprendí en la universidad. En la secundaria siempre fui uno de los niños inteligentes. Si no hubiera ido a la universidad, habría pensado que era bastante inteligente y que tenía un gran ego. Ir a la universidad e interactuar con personas que eran realmente más hábiles que yo me ayudaron a ver cuán tonto era
Kibbee
44
Si bien esto es muy cierto, el problema no siempre es la negación o un gran ego, sino las posibles consecuencias de admitir abiertamente que comete errores, al menos no sin algún tipo de autodefensa / control de daños primero. A veces es una cosa cultural. :)
309

Cómo pensar como un usuario, y no como un programador experto en tecnología.

Nick B
fuente
2
Siempre me parece irónico que lo que parece que la mayoría de nosotros en la industria carecemos sea una de las habilidades más importantes que tenemos: habilidades de comunicación.
No podría estar más de acuerdo con esto. Esto debería ser el # 1.
23
En realidad no estoy de acuerdo. Para eso contratas personas. Nunca podrá pensar como un usuario, pero sin duda puede hacer que la gente le diga lo que piensan los usuarios y actúe de acuerdo con ese consejo. ¡Simplemente no pregunte a los usuarios cómo piensan! Esa es la peor opción de todas.
1
Puede contratar a otras personas para hacer eso, pero si su equipo de desarrollo puede comprender cómo piensa un usuario, entonces tendrá muchos menos argumentos e iteraciones antes de que las cosas salgan bien. Además, si un desarrollador puede pensar como un usuario, quién sabe qué nuevas características se le ocurrirán
3
El usuario puede muy bien ser un programador techie geek, pero es menos probable que sea un programador techie geek que también implementó el código . Si la aplicación tiene una semántica / comportamiento muy sutil y compleja, la persona que escribió el código podría ser la única persona que puede entender cómo usar la aplicación ...
Reuben
244

Cuándo pedir ayuda y cuándo NO pedir ayuda.

Brian Knoblauch
fuente
2
Tan verdadero. Últimamente, la respuesta ha aparecido en mi cabeza cuando le preguntaba a alguien. :(
kevindaub
28
Pregúntale primero a tu patito de goma. Si no puede ayudarte, entonces pregúntale a alguien más ...
Dean Rather
3
voté porque cuando comencé no me di cuenta de cuánto estaba molestando a otros desarrolladores preguntándoles continuamente cosas simples que debería resolver hasta que algunos n00b me lo hicieran.
1
Siempre me hago una pregunta en la línea de "¿Qué diría mi colega si tuviera que preguntarles?". Por lo general, eso me ayuda a profundizar un poco más el problema antes de tener que preguntar.
184

Cómo leer el código de otras personas.

Bill el lagarto
fuente
102
Anexo: Cómo escribir código que otras personas puedan leer
42
Anexo # 2: Cómo leer su propio código 6 meses después
10
@Nathan Koop: Debería ser mejor "Cómo escribir código para que puedas leerlo tú mismo 6 meses después".
Doc Brown
44
Cuando han pasado 6 meses, ya se ha convertido en el código de otra persona. En el sentido de que desde entonces has evolucionado, mejorado, y bien podría ser otra persona que lo escribió en primer lugar, así que trátalo como tal.
MPelletier
77
Anexo # 3: Cómo leer su código 6 minutos después.
mpen
152

Familiaridad con los sistemas de control de versiones. No tiene que ser todos, pero se deben conocer los conceptos básicos que se pueden aplicar a todos ellos.

Thomas Owens
fuente
y ese control de revisión no es software
jrhicks
44
Agregaría que hay una diferencia lo suficientemente significativa entre los SCM centralizados (por ejemplo, subversión, CVS) y los SCM distribuidos (por ejemplo, git, mercurial, bazar) que es importante aprender uno de cada uno.
intuido
128

Aquí están mis 10 bits:

  • Cómo ser humilde Todos estamos aquí para aprender. Puede ser más inteligente que otros, pero hay muchas personas más inteligentes que usted.
  • Cómo estudiar / consumir información. ¡No sé tú, pero siempre estoy estudiando! ¡Libros, Internet, lo que sea!
  • Qué es un diccionario y cómo usar uno, y cómo encontrar siglas rápidamente.
  • Cuáles son las herramientas básicas del comercio y qué hacen (IDE, CVS et al).
  • Conozca la terminología común y lo que significan: patrones de diseño, usabilidad, pruebas (¡ja!), Pila, etc.
  • Comprender la POO.
  • Sea "capaz" en al menos un idioma, nada sorprendente, solo sepa cómo identificar variables y métodos, etc. Desde aquí puede aprender RÁPIDO.
  • Comprenda que las personas finalmente usan software y quieren hacer felices a esas personas.
Rob Cooper
fuente
38
Esto debe ser una publicación octal.
Incluso Mien
10
En cuanto a la primera parte ... "No seas tan humilde, no eres tan genial".
Magnus
@TheOtherScott, buena captura jajaja, pero en realidad estaba diciendo 2 bits: D;)
3
Con respecto al punto 3: www.acronymfinder.com
Jasper Bekkers
1
@ jasper / intuited: simplemente escriba el acrónimo en google y aparecerá uno u otro ... la respuesta generalmente está en uno de los primeros 10 resultados de todos modos. ¡Se puede obtener más información haciendo clic!
mpen
104

Tal vez sea demasiado sutil, pero lo considero como "saber qué problema resolver". Muchos programadores (y personas normales) desperdician un tremendo esfuerzo resolviendo cosas que simplemente no son muy importantes; o crean una solución, con una gran cantidad de trabajo extra, que no es exactamente lo que se necesita.

comida de gato
fuente
44
De acuerdo, preocuparse por los escenarios de caso marginal de uso que solo unos pocos usuarios encontrarán en lugar de una funcionalidad más básica es una trampa muy común. Todavía aprendo esto de la manera difícil ...
Ian Robinson
Debería poner un enlace a su respuesta como la página de inicio de mi antiguo líder de equipo. tienes mucha razón
44
Me encanta que hayas dicho "muchos programadores (y personas normales)" :-)
95

Cómo relajarse. Es el secreto de la productividad.

Finalmente, la fuerza de voluntad y la cafeína no son suficientes. Esta constante contracción que hacemos es muy perjudicial.

Este es un gran problema.

Brian MacKay
fuente
1
¿Qué quieres decir con contracción?
44
@Egg: A veces, cuando trabajo, puedo estar completamente relajado y muy productivo. En mis días malos, uso adrenalina y cafeína, y siento una tremenda tensión en mi cuerpo. Si presto mucha atención, en realidad estoy contrayendo algunos músculos. Noto esta tensión en otros todo el tiempo. Desafortunadamente, puede conducir a todo tipo de problemas, como agotamiento y enfermedad cardíaca, y probablemente también conduzca a una pérdida neta de productividad, ya que solo es posible correr por una cantidad limitada de tiempo. Esa es la contracción de la que estoy hablando.
Brian MacKay el
@Egg, se refiere a la contracción de los músculos no utilizados.
2
Hablando de café y contracción, ¿sabías que el café encoge la arteria que suministra sangre al cerebro? Eso hace que el cerebro se despierte. El café no es tan bueno después de todo. tl; dr beber agua
Reno
83

Tipo de datos básicos y teoría de algoritmos. Cosas como la notación Big O, matrices, colas, etc.

Glenn Slaven
fuente
No te ayuda en absoluto si todo lo que haces es crear plantillas para sistemas de administración de contenido web.
3
Pues bien, hoy en día los algoritmos estándar se implementan en las bibliotecas / marcos pero coinciden en que pensar un poco difícil algoritmo similar es útil, pero no muy a menudo
77
El hecho de que ya estén implementados no significa que no tenga que entender qué usar cuando, la complejidad garantiza, etc. Esto es lo importante detrás de los algoritmos.
3
De acuerdo con Greg Rogers. Es posible que necesite implementar los algoritmos, pero comprende mejor sus complejidades y compensaciones. P.ej. Algunos algoritmos toman más memoria pero son más rápidos.
66
No sabrá cuál usar si no los comprende. Los algoritmos son muy importantes.
60

Cómo elegir la herramienta adecuada para la tarea correcta, y no participar en guerras tontas sobre sus herramientas de programación favoritas.

Término
fuente
+1 para que este no se quede en 42 :)
CharlesB
54

Bueno, aquí está mi .02 $:

  • El aprendizaje nunca se detiene. No importa lo bueno que creas que eres, siempre hay alguien mejor que tú, y siempre hay algo que puedes mejorar sobre ti. Si deja de aprender, inevitablemente se degradará como programador. Leer libros. Leer blogs Habla con otros programadores.
  • Intenta aprender varios idiomas. Al menos uno de ellos orientado a objetos. Además, debe saber algo sobre diversas tecnologías relacionadas con el lenguaje que aprende (por ejemplo, si aprende Java, sería bueno que supiera algo sobre Spring, etc.).
  • Refactorización Tarde o temprano necesitarás ese conocimiento.
  • Aprenda a lidiar con el código heredado.
  • Escribir pruebas unitarias. Aprenda sobre TDD.
  • Aprende a trabajar en equipo.
  • Escribe código elegante y legible. Como dice el viejo dicho: "Escribe tu código como si la persona que lo va a mantener es un asesino en serie psicótico que sabe dónde vives".
  • Aprende a ser flojo y disciplinado al mismo tiempo. Los buenos programadores poseen ambas cualidades. Por extraño que parezca, no son contradictorios entre sí, sino complementarios.
Sandman
fuente
¿Son esos 0,02 dólares o 0,02 centavos? Jajaja :-D
"Escriba su código como si la persona que lo va a mantener sea un asesino en serie psicótico que sepa dónde vive". +1
Ben
50

No se puede probar la calidad en un producto.

Jeff alto
fuente
2
Por lo tanto, los profesionales de "Garantía de calidad" tienen el nombre equivocado.
1
Técnicamente hablando, QA y Test no es lo mismo, aunque hasta su punto no estoy seguro de que la mayoría de las organizaciones realmente practiquen la diferencia.
Alto Jeff
55
Recientemente encontrado, y atascado: "El resultado de las pruebas no es la calidad, sino el conocimiento".
peterchen
richdiet: el experto en SQA James Bach cree que la "A" en SQA / QA debería significar "Asistencia". Estoy totalmente de acuerdo con su opinión y su declaración.
44

Todo programador debe comprender los patrones de diseño .

pelusa
fuente
13
Yo agregaría que también necesitan entender que no todo puede combinarse en un patrón de diseño dado.
tloach
10
También agregaría que no todos los programadores deberían comprender los patrones de diseño. Hay idiomas en tierras lejanas que tienen otras características tan poderosas que el pensamiento fluye directamente del programador hacia los programas de trabajo. En esos idiomas, los patrones deliberados son una mala dirección.
Ali
2
los patrones de diseño son para diseñadores y no "programadores" - un programador necesitará saber eso cuando él / ella se convierta en un "diseñador"
10
Hay dos tipos de personas ... personas que disfrutan de la codificación y personas que prefieren hablar sobre la codificación. Los patrones de diseño son imprescindibles para el segundo grupo ..
Bjorn Reppen
1
Tales patrones son una forma de superar las limitaciones de los idiomas. Un programador debe comprenderlos solo porque debe comprender y ser capaz de superar las debilidades de sus idiomas.
44

Llego un poco tarde a este, pero iré con el conocimiento establecido por Edsger Dijkstra:

Además de una inclinación matemática, un dominio excepcionalmente bueno de la lengua materna es el activo más vital de un programador competente.

Si no puede escribir un buen párrafo, es probable que tampoco pueda escribir un buen código.

KevDog
fuente
8
Sin embargo, estoy sorprendido por la terrible ortografía, gramática y puntuación utilizada en la escritura en lenguaje natural por algunos programadores. Se podría pensar que trabajar todos los días con los sistemas que tienen tolerancia cero para los errores de ortografía y sintaxis no válida tendría un efecto beneficioso ...
1
@cheduardo, eso es porque una vez que compila o ejecuta un programa, en la mayoría de los idiomas, se le informará sobre cualquier error de ortografía, gramática o puntuación, que luego se puede corregir fácilmente. No es así para los errores lógicos.
Inshallah el
@Inshallah: a menos que hagas algo como eso if (BlowUpTheSystem = 1). Por supuesto, dadas las pruebas unitarias adecuadas, es probable que solo ahorre tiempo. Pero entonces el tiempo es bastante importante.
intuido
2
De acuerdo ... hmm ... menos la parte de "lengua nativa", algunos de nosotros [¿desafortunadamente?] Nos comunicamos mejor / más claro en nuestras lenguas no nativas.
39

No se entusiasme demasiado, se apegue o sea religioso con respecto a una tecnología, sistema operativo o idioma dado, ninguno es perfecto, a la larga es probable que termine deseando poder crear su propia carta a partir de lo que gusta de cada uno diferente.

Piénselo como si fuera un automóvil; es posible que no haya conducido un automóvil en particular antes, pero todos tienen llaves, volantes, aceleradores y frenos: debería poder subirse a uno y conducir rápidamente una vez que sepa dónde está. Trate los sistemas operativos y los lenguajes de manera similar y concéntrese en aprender los conceptos esenciales que los subyacen, incluso si está en medio de los detalles de una instancia determinada.

Y con el tiempo intente comprender y apreciar la ascendencia, el patrimonio y los puntos en común de las diversas tecnologías que lo ayudarán a mantener la perspectiva. Tenga en cuenta, por ejemplo, que, si bien el árbol evolutivo se ramifica activamente y está lleno de callejones sin salida, con el tiempo la tecnología tiende a converger repetidamente en torno a las "mejores prácticas" y las "economías de escala" ( por ejemplo, observe que una Mac no es tan diferente a un PC bajo el capó en estos días ...).

Por último, recuerde que no importa cuánto se divierta con todo esto, la tecnología representa esencialmente una lente imperfecta entre lo que su mente puede imaginar y lo que realmente produce. Haz tu mejor esfuerzo, aprende a aprender y mantente adaptable ...

J Healy
fuente
35

Cómo programar en C.

David Basarab
fuente
Jaja. ¿Dónde está Jeff cuando lo necesitas? ;)
Kevin Fairchild
12
Sin mencionar el lenguaje ensamblador.
Ferruccio
12
Sin mencionar X.
Ali
77
Atornillarlo ... Binario
Jeff !!!! La gente habla mierda en tu sitio: P
Andrei Rinea
35

Que el día que dejes de aprender debería ser el día en que ya no seas programador.

Nick Sergeant
fuente
Si tuviera un deseo, sería que Santa fuera mi padre.
¿Porque Santa ...?
1
El día que dejes de aprender debería ser el día de tu muerte. :) +1 de todos modos
ShdNx
Entonces, ¿para vivir para siempre debes seguir aprendiendo? ¡Ahora hay una idea que puedo respaldar!
canadiancreed
34

Pruebas unitarias y depuración.

Jon
fuente
El primero elimina la necesidad del segundo. ;-)
44
No, cuando la prueba unitaria falla, eso necesita depuración. Los dos van juntos.
Zan Lynx
No puedo enfatizar esto lo suficiente.
fastcodejava
33

Se mencionó antes, pero creo que merece su propia respuesta.

alexp206
fuente
Me encuentro cada vez más en usos, y recojo piezas aquí y allá, pero aún no soy ni siquiera un aficionado.
Estoy completamente de acuerdo. Parece extraño y difícil cuando no lo entiendes, pero cuando lo entiendes, es mucho más fácil que una tonelada de llamadas de función de subcadena / índice de funciones que de lo contrario sería necesario hacer lo mismo. Solo me aseguraría de que tus patrones estén bien comentados.
Kibbee
99
Algunas personas, cuando se enfrentan a un problema, piensan "Lo sé, usaré expresiones regulares". Ahora ellos tienen dos problemas. - "Jamie Zawinski": jwz.livejournal.com , en comp.lang.emacs
Bjorn Reppen
Usar un editor básicamente construido alrededor de ellos es una buena manera de aprender lo desagradable. Mi experiencia es con vim, que utiliza un equivalente en su mayoría comparable a los PCRE estándar de facto, pero tengo la impresión de que las mismas reglas se aplican en el mundo de emacs.
intuido
1
Algunas personas, cuando se enfrentan a una expresión regular, piensan: "Lo sé, citaré a Jamie Zawinski". Ahora tienen dos problemas (uno de los cuales es que probablemente no saben lo que están haciendo en primer lugar) .
Donal Fellows
29

Nadie quiere usar software. Quieren problemas resueltos.

Andrés
fuente
77
Exactamente. Cuando escucho que los desarrolladores intentan explicar la base de datos a un usuario final como respuesta a su pregunta de por qué no se puede hacer algo, me estremezco. No necesitan saber cómo hacemos las cosas. Solo quieren que funcione. Y así es como debe ser.
Kevin Fairchild
Me gusta creer que uno podría escribir software que la gente encuentre un placer usar.
No podría estar más de acuerdo. Sin embargo, esto también se aplica a las API. Nadie quiere aprender nuevas API porque es muy divertido. Queremos la funcionalidad de la API, no el código que representa.
Blub
Kevin, desearía que nuestro "programador de implementación" (palabra elegante para el tipo de prueba) lo lea y lo entienda. Yo también me siento detrás de mi escritorio con la esperanza de que el mundo se lo trague mientras comienza a hablar sobre los bucles y las declaraciones a los usuarios finales.
27

Coffee e IntelliSense son tus mejores amigos.

Rulas
fuente
¡Ojalá pudiera dar más de 1 voto a favor!
Dinah
¡Espero tomar más café! ñ_ñ
Creo que estoy de acuerdo con esto más que cualquier otra cosa en SO.
Unkwntech
Prácticamente nunca tomo café a menos que sea absolutamente necesario terminar un proyecto en X horas, cuando: Número de horas agotadas + X> 8 por día.
Blub
El café no te da energía. Simplemente exprime algo de tus reservas internas. Eso es malo / poco saludable.
Andrei Rinea el
18

Cómo observar un gran objeto complicado y descomponerlo en pequeños objetos simples que aún logran la misma tarea cuando se vuelven a armar.

Manrico Corazzi
fuente
18

Nunca confíes en un usuario ( especialmente si la aplicación es pública!), A menudo harán todo lo que esté en su poder para romper tu aplicación de una forma u otra.

Hazlo a prueba de futuro y ampliable: nunca sabes cuándo quieres expandirlo en unos pocos años y te das cuenta de cuánto esfuerzo se necesitaría para volver a codificar el código mal creado.

Robinb
fuente
1
Esto es demasiado generalizado. Un poco de pragmatismo también es bueno.
mafu
18

Que el programador no lo sabe todo y siempre debe tratar de aprender nuevos lenguajes / tecnologías, etc.

Dror Helper
fuente
16

Los fundamentos del buen diseño de interfaz de usuario y diseño de comunicación (también conocido como gráfico) .

Veo muchas aplicaciones y proyectos arruinados por un mal diseño o una mala usabilidad. Solo aprender los conceptos básicos puede marcar una gran diferencia. Además, las técnicas de resolución de problemas visuales (es decir, cómo comunicar un concepto visualmente) son un desafío estimulante que debería abrir los ojos a nuevas formas de ver, lo que a su vez debería tener un impacto en su código.

Un libro recomendado es The Non-Designer's Design Book de Robin Williams

Esto es lo que dice Joel Spolsky :

¡Guauu! Todos tienen que hacer un diseño gráfico, y no todos los equipos de software tienen el lujo de los diseñadores profesionales. Este excelente y delgado libro le dará una idea de los principios detrás del diseño de la página, las fuentes, etc. La buena noticia es que puede leerlo en el baño antes de que el agua se enfríe, y al día siguiente, sus cuadros de diálogo y puntos de poder y Las páginas web comenzarán a verse mejor.

Charles Roper
fuente
1
Lo secundé con un guiño adicional al "diseño de las cosas cotidianas". amazon.com/Design-Everyday-Things-Donald-Norman/dp/0385267746
Stimul8d
14

Todo programador debe saber aprender rápidamente. Muchas veces entras en un trabajo y se te pedirá que desarrolles una tecnología que nunca has usado. Es posible que le den una semana más o menos para ponerse de pie (si tiene suerte) antes de que le pidan que escriba un código de calidad de producción.

Ryan Thames
fuente
Comencé mi primer trabajo de programación y en una semana estaba escribiendo un código que finalmente se publicaría. Afortunadamente, soy un principiante rápido y tenía experiencia previa en programación. En 6 meses, reestructuré la conexión cliente-servidor para mejorar el rendimiento tres veces. Esto estaba en un idioma que nunca había usado antes.
14

Control de versiones. Y para citar a mi novia: "¡No solo quiero que laves los platos, quiero que te guste !"

MattW.
fuente
10

Los requisitos cambian, su código tendrá que adaptarse y puede ser o no usted quien tenga que adaptarlo.

Ha habido varias preguntas aquí relacionadas con temas que se ven afectados por esto.

Adam Bellaire
fuente
10

La parte superior de mi cabeza:

  1. Muy pocos problemas de programación requieren matemáticas más allá de la suma, resta, multiplicación y división. Si está pensando en usar el cálculo para resolver un problema, investigue las alternativas exhaustivamente antes de hacerlo.

  2. Cada vez que te encuentras adivinando cómo debería funcionar algo, lo estás haciendo mal. No es tu trabajo ser telepático.

  3. La persona que te da la especificación rara vez sabe todo lo que quiere hasta que lo has descifrado.

  4. Más de la mitad de ser un gran programador proviene de tratar con seres humanos. Interactuar con su equipo, administrar su gerente y perfeccionar al usuario final son la mitad del trabajo.

  5. Un buen código está escrito para que la gente lo lea tanto como para que lo lea tu compilador.

  6. Las mejores prácticas y la realidad práctica estarán en conflicto más de lo que piensa el programador, pero menos de lo que lo hace el gerente. Cuando parecen estar en conflicto, depende de usted delinear y comprender el conflicto y luego ceder a lo práctico. La solución sutil e inteligente solo es mejor que la fea y brutal si es más rentable a largo plazo.

  7. Las grandes herramientas no pueden ser grandes programadores, pero las malas herramientas nos hacen igualmente horribles.

  8. Nunca menosprecies una tecnología, pero siempre busca la mejor alternativa.

  9. Cuantos más idiomas conozcas, mejor estarás en el que estás usando.

  10. No se preocupe por el lento arrastre de pensamientos orientados a la programación en su vida diaria. Incluso cuando no estamos en una computadora, todos sufrimos limitaciones de ancho de banda, tenemos penalizaciones de rendimiento por el cambio de tareas y necesitamos cargar cosas desde el almacenamiento de respaldo. Se supone que las computadoras imitan el pensamiento humano y los análogos están en todas partes.

Sí, ese Jake.
fuente
El número 10 me hizo reír. ¡Muchas veces estaré trabajando en un problema en el trabajo, pero es solo en la cama a las 10 p.m. que eventualmente encuentro la respuesta!
9

Leer el código de otras personas no va a estropear tu cerebro, sino más bien descubrir por qué no lo habrías hecho de esa manera (si es mejor o no, esa es otra pregunta).

¡Esto le proporciona programación de gedankenexperiment , y ocasionalmente encuentra a alguien implementando algo mucho mejor! Me gusta mucho mejor.

Esta respuesta se expande naturalmente a leer su propio código, por lo tanto, se expande para usar el control de versiones y DIFF, y por lo tanto a 42.

Martín
fuente