¿Cuáles * son * los conceptos de programación que debo dominar para tener una comprensión profunda de mi oficio (programación)? [cerrado]

13

En orden de importancia, si es posible hacerlo y puede no serlo, ¿cuáles son los fundamentos más importantes para saber programar? Algoritmos, iteración, recursividad, etc.

Tenga en cuenta que donde pongo, etc., es donde radica mi pregunta. ¡Recientemente leí una publicación en Internet que decía que 9 de cada 10 programadores no pueden quedarse sin aliento !

http://www.codinghorror.com/blog/2007/02/why-cant-programmers-program.html

Quiero tener un conocimiento profundo de lo que realmente estoy tratando de lograr al programar y una comprensión exhaustiva de las herramientas básicas a mi disposición. Básicamente quiero poder pintar con todos los colores del viento.

Kewigro
fuente
3
La publicación de Jeff Atwood no se trata realmente de un profundo conocimiento de programación ... Se trata de la realidad de que muchas personas carecen de algunas ideas básicas y fundamentales sobre la programación, y de cómo la falta de esas ideas fundamentales les impide desarrollar habilidades de programación significativas.
Robert Harvey
2
No entiendo por qué se cerró esta pregunta. Es una pregunta que ha sido destacada 5 veces y tiene muchas respuestas útiles. Este es el tipo de información que quiero encontrar, solo porque no haya una respuesta simple no significa que la información no sea de buen valor, quizás programmers.stackexchange.com necesita reevaluar sus criterios para cerrar las preguntas.
Rocklan
@LachlanB Voté para reabrir ... necesita 4 votos más para tener éxito
Michael Brown
Creo que esta es una buena pregunta, pero cualquier respuesta razonable será demasiado larga para el formato de este sitio. Cualquier buen currículum universitario cubrirá estos conceptos, y el hecho de que dicho currículum requiera algunos años de estudio y práctica dedicados, seguidos de años adicionales trabajando en proyectos reales, debería dejar en claro por qué la respuesta no puede encajar aquí.
Giorgio

Respuestas:

18

Esta lista es un comienzo ... ¡estás haciendo una gran pregunta!

  • Cómo aclarar y escribir lo que quieren los clientes ("requisitos"). Este es un arte en sí mismo. Si puede hacer esto, su trabajo de programación será mucho mejor.
  • Cómo estimar y planificar el proyecto. La gente le pedirá un presupuesto, esté preparado.
  • Cómo revisar constructivamente el código de otras personas.
  • Patrones de diseño. Este es un grande. Pero no los use con demasiado entusiasmo por el simple hecho de hacerlo.
  • Conozca la diferencia entre una solicitud de error, problema y función
  • Manténgase actualizado con frameworks / bibliotecas. No tiene que usarlos, pero necesita saber qué hacen y sus ventajas y desventajas. Si algo parece demasiado difícil, entonces probablemente haya una forma mucho más fácil de hacer las cosas.
  • Cómo documentar algoritmos complicados en un diagrama de flujo o simplemente escribirlo en inglés. No espere que alguien pase 2 días tratando de aplicar ingeniería inversa a su código.
  • Cómo organizar su estructura de código para que cualquier otra persona pueda entenderlo
  • Cómo comentar tu código
  • Cómo escribir pruebas unitarias
  • Sepa lo que sucede debajo del capó. Por ejemplo, llamar a un servicio web: ¿qué está haciendo realmente?
  • Cómo abstraer la lógica en clases.
  • Cómo refactorizar el código
  • Aprenda la esencia de bastantes lenguajes de programación. Te sorprendería lo que puedes aprender de otras áreas.
  • Cómo decirle a otros programadores qué escribir.
  • Cómo explicar a la gerencia lo que está haciendo y por qué.
  • Como Peter dijo, cómo depurar. Estoy de acuerdo con todo lo que dice, los programadores reales depuran, no solo adivinan.
  • Cómo trabajar con maníacos. Hay muchos de ellos por ahí.
  • Cómo hacer las cosas. Toda la teoría del mundo no te ayudará si no puedes hacer las cosas.

Respondí otra pregunta a lo largo de líneas similares (con contenido similar) aquí:

consejos, pautas, puntos a recordar para representar código profesional?

Rocklan
fuente
1
+1: ¡HAZ LAS COSAS! Hace un par de años publiqué una queja que decía que esta era la característica definitoria de un ingeniero: hacen cosas. A veces no es bonito, y a veces tendrás que regresar y rehacerlo, ¡pero al final del día hacen las cosas!
Peter Rowell
@PeterRowell: puede que le resulte una lectura interesante: brandonsavage.net/when-to-write-bad-code
Marjan Venema el
Lamentablemente, la pregunta no es realmente una que se ajuste a la filosofía y el formato de preguntas y respuestas del sitio, pero eso no minimiza el valor de su respuesta. Si desea expandirlo y agregar un poco de explicación para cada punto, será una excelente publicación de blog para nuestro blog de la comunidad .
Yannis
@MarjanVenema: Sí, estoy completamente de acuerdo con él. En los años 80 tuve la tarea de escribir una especificación para un nuevo editor, para ser aprobado antes de comenzar a codificar. Observé esa maldita pantalla en blanco durante más de una semana tratando de descubrir cómo describir algo que no entendía. Mi gerente expresó su descontento con mi falta de progreso. Después de un fin de semana de 3 días, tenía un borrador en su escritorio. Me preguntó qué había pasado, y le dije que escribí al editor durante el fin de semana, y luego simplemente escribí una especificación de lo que estaba trabajando. Reescribí parte del código, pero fue principalmente refactor / limpieza.
Peter Rowell
1
@ YannisRizos: estaría interesado en escribir un blog sobre esto. ¿Le gustaría enviarme un correo electrónico con alguna guía o debería escribir algo?
Rocklan
22

Bajo el título de " etc. " viene algo que fácilmente puede tomar el 50% o más de su tiempo.

Aprende a depurar.

Esto significa aprender el Método Científico . Me refiero a realmente aprenderlo. Y luego aplicarlo con brutal honestidad . Aprende a decir con precisión lo que sabes que es verdad, lo que sabes que no es cierto y las cosas que no sabes. Cada vez que asigna descuidadamente un elemento a la categoría incorrecta, acaba de hacer su vida mucho más difícil.

Aprende a decir "pienso" en lugar de "sé". ¡Solo puedes decir "lo sé" cuando "piensas" que algo es verdadero (o falso), y luego lo pruebas!

Muchos errores son triviales, pero pueden ser difíciles de ver porque "sabe" cuál debería ser el código ... excepto que no lo es. Encuentra un amigo para explicárselo. Pídales que sean un "idiota experto": alguien que no conoce su código, pero que sabe que no puede dejar pasar a BS. No se sorprenda si en medio de una descripción para ellos, de repente se detiene y dice: "y así puede ... ver ... ver eso ... sh * t. Gracias".

Los errores no triviales requieren un arsenal de técnicas. Un clásico que puede destacar rápidamente la mayoría de los errores no relacionados con el tiempo es Wolf Fence en Alaska. Hay un lobo en algún lugar de Alaska; construir una cerca cortando el estado por la mitad. ¿De qué lado está el lobo? Corta ese lado por la mitad. Enjabonar, enjuagar, repetir. Hacer esto 20 veces en lugares bien elegidos en el código reduce el área donde el error (lobo) puede estar a 1/1048576. Mata a ese lobo.

Consejo: busque ondas manuales, físicas, mentales o de cualquier otro tipo. Tan pronto como usted (o su colega) retroceda / desvíe / minimice la atención prestada a una parte del código, se volverá totalmente rabioso . Debido a que el área donde se sabe que el error no puede ser, a pesar de que ha pasado horas / días buscando lo d * mn y todavía no puede encontrarlo ... esa es la ubicación de mayor probabilidad para el error. Nadie recibe un "adiós" , nadie (incluida la máquina, el sistema operativo, el compilador o usted ) recibe ningún tipo de "debido respeto". Hay un error Período. Fin de la oración. Ahora ve a matar a la maldita cosa.

No conozco ninguna escuela que enseñe la depuración como un tema en sí mismo. IMNSHO, esta puede ser la evidencia más evidente de que ellos (universidades / profesores) no te están enseñando a ser programador, sino que te están enseñando a ser ... ¿como ellos? ¿Duro? Quizás. ¿Cierto? Decídete de una vez. Ahora pruébalo.

Peter Rowell
fuente
Quizás te interese el Saff Squeeze , una técnica descrita por Kent Beck que utiliza pruebas y refactorización para la depuración: Hit 'em High, Hit' em Low : Pruebas de regresión y Saff Squeeze de Kent Beck, Three Rivers Institute (Resumen: Para aísle efectivamente un defecto, comience con una prueba a nivel de sistema y en línea y pode progresivamente hasta que tenga la prueba más pequeña posible que demuestre el defecto.) Se parece mucho a su Wolf Fence, utilizando las pruebas y las capacidades de refactorización de IDEs.
Jörg W Mittag
1
Gran respuesta: cualquiera puede escribir código, depurar programadores reales.
Rocklan
@ JörgWMittag: soy un gran admirador de las pruebas de regresión automatizadas. Lo utilicé por primera vez en un proyecto de motor de búsqueda a mediados de los 80, y me sorprendió (¡sorprendido!) Las cosas que se caerían después de lo que parecía ser un cambio "menor" a un código de aspecto inocente. (Nota: esto fue más de 200,000 SLOC de C, y los problemas de administración de memoria fueron la ruina de nuestra existencia.)
Peter Rowell
3

Me temo que esta es una pregunta bastante grande para que cualquiera pueda responder de manera concluyente o autorizada, especialmente dado que desea una lista priorizada. Hay muchos programadores por ahí, y trabajan en cosas muy diferentes: seguro, los fundamentos permanecen igual, pero lo que necesita para mantenerse activo en su memoria puede ser realmente diferente, y de hecho hay muchas tareas en las que puede permanecer bonito de alto nivel sin profundizar.

Sin embargo, parece que está realmente preocupado por cómo ser un mejor desarrollador, y no solo por un intercambio de divisas. Lo encuentro admirable y puedo compartir algunas de las cosas que me han ayudado a aprender a programar.

Casi toda la programación se reduce a algoritmos y estructuras de datos. Ellos, a su vez, son ejemplos de la gran pregunta: ¿cómo modelamos cosas y procesos del mundo real en una representación tal que una computadora pueda entender? Si recién está comenzando, puede ser útil usar un lenguaje de programación de nivel superior (como Java, Python, lo que sea) para familiarizarse con la implementación de estructuras de datos y algoritmos.

En cierto punto, después de haber jugado con estructuras de datos y algoritmos, puede comenzar a recibir esa pregunta persistente "pero ¿cómo pasamos de decirle a la computadora qué hacer, a la computadora que realmente lo hace?" Luego puede ver cómo una computadora realmente calcula: cómo la memoria y la CPU trabajan juntas para ejecutar instrucciones, cómo los sistemas operativos abstraen el hardware para que pueda escribir un programa que, por ejemplo, abre un archivo, sin codificar a un nivel bajo particular interfaz de disco duro

Este es probablemente un buen punto de partida: cómo los algoritmos y las estructuras de datos modelan los problemas del mundo real y cómo una computadora realmente realiza el cálculo. Conocer esto último es muy útil para dominar lenguajes de nivel inferior como C, que utilizan mucho menos humo y espejos que OO y lenguajes de script :)

RuslanD
fuente
2

YAGNI : "Siempre implemente las cosas cuando realmente las necesite, nunca cuando prevea que las necesita".

En mi experiencia, es común que los "programadores" prevean muchos casos en el futuro e intenten "mejorar" el código agregando códigos para anticiparlos. En la mayoría de los casos, el código que agregaron simplemente hinchará el código y agregará complejidad al código.

Louis Rhys
fuente
1

Lo más importante que debe saber acerca de ser un programador es que escribir código es una rutina, y una actitud profesional de "cuello azul" hacia la producción de lo que se le paga por producir lo llevará más lejos que cualquier aprendizaje esotérico.

Aprende a entrar en la zona. Con eso me refiero al estado mental cuando estás enfocado solo en tu tarea y puedes comenzar a mantener muchas cosas en tu cabeza y cómo interoperan todas a la vez. Una vez que tenga el hábito de ingresar a la zona a voluntad, comience a preocuparse por el resto. Hasta que pueda descifrar el código como una especie de código que explota, el resto es prácticamente inútil.

EDITAR:

Si no crees esto y me rechazaste, creo que no sabes si tienes la determinación de hacerlo durante 20 años. Sé que lo hago porque acepto esto. ;)

Nathan C. Tresch
fuente
0

Una pregunta reciente, relacionada de alguna manera con esta, y Answer tenía un enlace a este blog que analiza el mismo problema desde un ángulo diferente.

Probablemente el concepto más importante para cualquier desarrollador es la "humildad" ... Una vez que acepte que no lo sabe todo, está abierto a explorar soluciones. La mayoría de las personas que escriben blogs en programación están en el percentil superior, y el problema es que muchos aún no han controlado sus tendencias narcisistas ... por eso escriben en blogs ... Necesitas aprender a identificar a estos bloggers y ignorar allí despotricar

El blog vinculado no es más que una queja: en todas las industrias, las quejas de que los recién graduados son inútiles son comunes, que lleva años conseguir que sean útiles y productivas. Quizás el problema es que estos autoproclamados gurús realmente esperan demasiado y han olvidado que una vez no habrían podido resolver FizzBuzz. No todos pueden estar en el percentil 10 superior, por definición, la mitad de los programadores están por debajo del promedio ......

Mattnz
fuente
Estoy de acuerdo en que la gente habla mucho, pero creo que el punto de las publicaciones que vinculaste anteriormente es que las personas que no sabían cómo resolver FizzBuzz estaban solicitando trabajos de programación , lo que es diferente de ser un principiante y tener que terminar su cabeza alrededor de modismos de programación. Sin embargo, estoy de acuerdo con usted sobre el tema de la humildad, y muchas personas parecen no saber qué es eso.
RuslanD