¿Qué habilidades son esenciales para la programación profesional que no se enseñan comúnmente en las escuelas? [cerrado]

14

Soy estudiante de primer año de ciencias de la computación. Fui a una feria de trabajo, entregué hojas de vida, para mi sorpresa, obtuve una entrevista y, finalmente, una pasantía como desarrollador.

Le expliqué al entrevistador (que será mi jefe) que solo tengo un primer año y no tengo mucha experiencia en programación. Simplemente me dijo que debido a que tengo una sólida formación en matemáticas (casi he terminado mi licenciatura en matemáticas, además tengo algunos cursos de posgrado en mi haber), confía en que lo haré bien.

Me va bien en todos los cursos de programación, pero todavía siento que estoy en desventaja. En este momento, realmente solo quiero hacer el bien en este trabajo cuando comience. El trabajo utilizará principalmente C #, pero además de obviamente aprender algo de C #, ¿cuál es la habilidad que desearía haber aprendido antes de convertirse en un verdadero programador?

Cualquier consejo es muy apreciado, pero si tiene algún libro en mente, dígalo. ¡Gracias!

Eric
fuente
8
Esta pregunta se ha hecho muchas veces en este sitio de diferentes maneras. busque primero y luego pregunte. echa un vistazo a las preguntas frecuentes; programmers.stackexchange.com/questions/149970/… ; programmers.stackexchange.com/questions/46716/…
tgkprog
3
Hice una búsqueda y vi ambas preguntas. Pero no estoy preocupado por aprender diseño o desarrollo web. Me preocupa aprender lo que muchos programadores sienten que realmente deberían haber aprendido en la escuela. Sin embargo, esas preguntas tienen buenos consejos, pero no son exactamente lo que estoy buscando. Gracias
Eric
La habilidad que desearía poder dominar antes de convertirme en un programador a tiempo completo son las habilidades matemáticas fuertes porque las habilidades matemáticas son discutibles, la habilidad más importante que tiene porque entrena la mente para resolver problemas y aprender nuevos conceptos y como programador, eso es sobre todo lo que haré todos los días.
Anthony
3
Flujo de trabajo Y darse cuenta de que el código no es un copo de nieve único de unicornio. Aplique el principio de mínimo asombro al diseñar. Piensa antes de hacerlo. La gestión de la complejidad se convierte en un aspecto muy importante.
sleeplessnerd
1
En realidad no me gusta mucho trabajar con personas con fuertes habilidades matemáticas. Convierten todo en una fórmula matemática en lugar de aplicar los principios de la ingeniería de software. El software NO es matemático. Es esencial que escriba su código para que sea fácil de entender.
Rob K

Respuestas:

21

En la escuela, aprendes sobre cómo escribir código. Lo que no aprende es el resto del desarrollo de software. Las cosas principales de las que nunca aprendí nada en la escuela son:

  • trabajando como parte de un equipo de desarrollo
  • utilizando el control de versiones
  • usando un rastreador de errores

Estas son habilidades muy importantes para cualquier desarrollador y, desafortunadamente, no es probable que las obtenga en el aula.

Mason Wheeler
fuente
44
Trabajar como parte de un equipo de desarrollo es un arte sutil y complejo con seguridad. Sin embargo, no entiendo por qué el control de versiones y el seguimiento de errores siempre se enmarcan como un obstáculo importante para los nuevos desarrolladores. Sin duda, son herramientas importantes, pero usted señala a la nueva persona a las páginas de manual, un libro de O'Reilly o un tutorial en línea y puede retomar el uso del pan y la mantequilla en cuestión de horas. ¿Por qué perderías el tiempo de clase en algo así?
Charles E. Grant
1
@ CharlesE.Grant El control de versiones es similar a la programación, ya que puede obtener los conceptos básicos en un tiempo relativamente corto, pero requiere experiencia para usarlos de manera efectiva. Y DVCS como git y Mercurial requieren más comprensión que CVCS como svn.
Izkata
8
Nunca tuve clases sobre el mantenimiento del código establecido (que es una parte importante del trabajo como parte de un equipo de desarrollo) y mi experiencia en el aula sobre cómo probar el código fue mínima.
Velociraptors
1
@ CharlesE.Grant: He impartido cursos de posgrado en programación y temas relacionados durante varios años. Incluso a los estudiantes de posgrado les cuesta entender por qué deberían usar un sistema de control de revisión de cualquier tipo. Y cuando de mala gana comienzan a usarlo, parecen confundirse muy rápidamente. +1 a Mason por plantearlo como un tema importante no aprendido.
Peter K.
1
+1 +1 +1, uno para cada punto. Es tan estúpido que no te enseñan estas cosas ... o al menos INTENTAN enseñarte.
Radu Murzea
20

Ojalá supiera al principio de mi carrera que, como desarrollador, tengo un papel muy importante en el negocio . No soy solo un mono código.

Como desarrollador, tiene una mano importante en las partes del negocio relacionadas con el software en el que está trabajando.

Si su empresa no escribe pruebas para su código, comience a escribir pruebas ahora.

Si no rastrean errores, encuentre un rastreador de errores apropiado ahora.

Si su jefe quiere que comience a trabajar de inmediato en una animación elegante para la pantalla de inicio de su aplicación de hoja de cálculo, pero aún tiene docenas de errores que corregir y varias características críticas sin terminar antes de la próxima fecha límite de lanzamiento del cliente, tenga una conversación sobre priorizar correctamente el trabajo .

Incluso si usted es "un empleado normal", actuar como un consultor es una excelente manera de diferenciarse de otros desarrolladores que simplemente escriben código y no actúan como si tuvieran un interés personal en el negocio.

Mark Rushakoff
fuente
9

Mi escuela nunca me enseñó a resolver problemas. Me enseñaron la mecánica de la codificación, pero poder estudiar un problema, comprenderlo y encontrar una solución es algo que no enseñaron. Requiere paciencia, rigor e intuición, además de la comprensión de un lenguaje de programación.

Tampoco enseñaron sobre el trabajo en equipo, sobre el control de versiones y sobre la importancia de escribir código que sea fácil de mantener. Tampoco enseñaron mucho sobre cómo probar el software. Es posible que hayan tocado las pruebas unitarias, pero no profundizaron demasiado en los conceptos de pruebas de aceptación, pruebas de regresión, etc.

Descargo de responsabilidad: fui a la universidad en los años 80. Sin embargo, veo evidencia de esto con las personas que contrato hoy: recién graduados que tienen muy poco conocimiento sobre el mundo real de la programación: control de versiones, pruebas, codificación limpia, habilidades de depuración, etc.

Bryan Oakley
fuente
+1 para la parte de prueba. En mi universidad tampoco lo enseñan. Tuve 1 clase (sí: una) donde el maestro mencionó las pruebas unitarias ... durante aproximadamente 3 minutos. Eso es.
Radu Murzea
Sé que esta es una respuesta tardía, pero esa fue una de las cosas que hizo que mi título de matemática fuera atractivo para mis empleadores. Esta opinión es definitivamente compartida entre los empleadores también.
Eric
De acuerdo, en muchas escuelas, los algoritmos (también conocidos como "resolución de problemas") no se enseñan adecuadamente, o no se enseñan en absoluto, o no se les enseña cómo aplicarlo con un lenguaje de programación, incluso si tengo que ser pl "agnóstico".
umlcat
Hmmmm ... tu respuesta no podría ser más opuesta a lo que he experimentado. El objetivo de la escuela es proporcionar un trasfondo para que pueda estudiar un problema de manera efectiva, comprenderlo y encontrar soluciones. Puede que un nuevo graduado no sea "bueno" recién salido de la escuela, pero ciertamente debe estar capacitado y ser capaz de hacerlo. En mi escuela no enseñaban programación en absoluto. Se esperaba que aprendieras a programar (por tu cuenta) mientras aprendías la información que el curso intentaba enseñarte. Entonces, ¿dónde se obtiene sólo enseñan el "mecanismo de codificación" de más allá de mí ...
Dunk
... En las escuelas decentes, no obtienes crédito simplemente por aprender a codificar. Si le resulta difícil usar el control de versiones, entonces tiene problemas mucho más serios que ninguna cantidad de educación podrá ayudar. Cuando encuentre la forma definitiva de escribir código que sea fácil de mantener, escriba un libro y hágase rico. Nadie ha resuelto ese problema todavía. Debe haber perdido las partes en la escuela donde tuvo que entregar sus programas para ser evaluado. Las pruebas de aceptación / regresión son específicas de la industria y se enseñan mejor en el trabajo haciéndolo a la manera de la compañía en lugar de en la escuela.
Dunk
7

En mi opinión, algunas de las cosas más importantes que no se aprenden (o se aprenden adecuadamente) en la escuela son:

  • Cómo usar correctamente e IDE; El uso de todo el poder de un IDE moderno proporciona un gran aumento en la productividad: refactorización automática, navegación de código, integración de VCS, análisis de código, finalización de código, etc.
  • Cómo usar correctamente un depurador: depuración remota, depuración de aplicaciones multiproceso, evaluación rápida, etc.
  • Corrección de errores y mantenimiento; en la universidad no te enseñan casi nada sobre esto, sin embargo, en la industria es bastante común corregir errores.
  • Cómo trabajar en un equipo grande y en un proyecto grande; Básicamente, en la universidad, los proyectos son algo pequeños, en comparación con los grandes proyectos industriales.
  • Cómo escribir un buen código y cómo poner énfasis en la legibilidad; Esto viene con experiencia, pero hay algunos libros que le enseñan lo básico (Código completo, Código limpio, etc.).
  • Cómo usar un framework a su máxima potencia, usando su personalización; en la universidad tal vez aprendiste a usar algunos marcos en algunos escenarios muy básicos; en la industria llegarás a las esquinas.
  • Cómo entender y escribir código después de la especificación; probablemente aprenderá cómo escribir especificaciones pero ahora cómo leerlas y cómo interpretarlas

VCS, sistemas de seguimiento de errores, herramientas de compilación, etc. son herramientas que está obligado a aprender para poder trabajar con un equipo; no requieren mucho tiempo para aprender en un nivel básico, y son bastante sencillos después de eso (al menos al principio); La lista anterior contiene sutilezas que, si se conocen, aumentan su productividad.

m3th0dman
fuente
aka "Programación" no es solo conocer un lenguaje de programación, hay un "ambiente", "ecosistema", "marco" ...
umlcat
4

Lo que más me falta de los recién graduados es una buena comprensión del control de versiones.

Si tiene experiencia en el desarrollo de software de código abierto utilizando repositorios de código fuente (como GitHub ), está un paso por delante mostde sus compañeros de clase.

Lo segundo es una comprensión de la complejidad ( big O). La mayoría de las personas que no asisten a la universidad lo han escuchado, pero aún no han desarrollado un software real donde entra en juego y, por lo tanto, no entienden su importancia real.

Cuando sus conjuntos de datos son tan grandes que la fuerza bruta nunca lo va a cortar y la comprensión de otras técnicas es útil y poder adivinar cuándo la fuerza bruta estará bien para la situación, es algo que desarrolla con experiencia y comete los errores.

Martin York
fuente
1
Creo que la falta de educación sobre el control de versiones está empezando a cambiar. El control de versiones fue muy estresado en mi escuela.
Southpaw Hare
@SouthpawHare: No estoy diciendo que no exista, incluso lo enseñaron en mi día. Solo que las personas que salen de la universidad con esta experiencia todavía son minoría. Y como tales, las personas que lo tienen son más valiosas. No estoy de acuerdo con que haya cambiado mucho en los últimos 20 años.
Martin York
3

Cómo depurar bien, especialmente usando un depurador y tomando un enfoque adecuado para abordar un error, es decir, averiguar qué está causando, averiguar por qué lo está causando y comprender por qué su solución lo soluciona en lugar de simplemente intentar cosas y esperar.

La mayoría de los graduados en ciencias de la computación son sorprendentemente pobres en depuración y, como resultado, tardan mucho más en arreglar las cosas de lo necesario y crean más errores al hacerlo.

Vale la pena mencionar otras cosas, como el control de versiones, el seguimiento de errores, etc., pero en mi opinión, la falta de enfoques razonables para la depuración es un problema mucho mayor y requiere más aprendizaje.

Jack Aidley
fuente
2

¿Cuál es la habilidad que desearías haber aprendido antes de convertirte en un verdadero programador?

En mi experiencia, mi escuela nunca me enseñó cómo resolver problemas.

En mi experiencia, la programación se trata de resolver problemas. En mi escuela solo estaban verificando si puedes escribir un programa sin error de sintaxis. Lo que realmente se requiere no se proporciona como entrada. La sintaxis es algo que puede buscar en cualquier libro si es necesario. Pero la capacidad de resolver un problema no se puede lograr desde ningún lado, excepto que practiques bien y te entrenes para ello.

Deje que sea de cualquier tipo, intente completar tantas preguntas como sea posible para que pueda generar cierta confianza en usted mismo. Intenta hacerlo con un poco de pasión en tu mente, y seguramente lo superarás.

Abijith Kp
fuente
2

Tómese un tiempo para aprender algunos patrones de diseño comunes: fábrica, singleton, adaptador, comando y observador (mi universidad no les enseñó).

Si la empresa utiliza la metodología Agile para el desarrollo de software, sería valioso tener alguna comprensión de ella.

usuario86834
fuente
2

Muchas de las habilidades que necesitará como programador profesional son casi imposibles para cada uno en un entorno universitario / académico.

Solo pueden provenir de la experiencia trabajando directamente en el campo.

  • Aprender a colaborar y comunicarse con personas ajenas a su "profesión", como diseñadores gráficos, diseñadores de productos, gerentes, etc.

  • Comprender que su trabajo no es escribir código, sino dar vida a un producto. Es más fácil decirlo que hacerlo.

  • Saber equilibrar las buenas prácticas de codificación con consideraciones prácticas. Adquirir la capacidad de juzgar cuando el código es "suficientemente bueno", "sobredimensionado" o "necesita refactorización".

  • Aprender a superar tus propias debilidades e inseguridades. Adquirir la capacidad de resistir las críticas. Dejando ir tu ego. Aprender lo que significa asumir la responsabilidad personal y luego asumirla.

Es fácil leer sobre todo esto. Es algo completamente diferente poner esto en práctica. La única forma es hacerlo. Serás mordido muchas veces, y probablemente te dolerá, pero saldrás más fuerte y mejor.

Lectura relevante: patrones de aprendizaje

Hasen
fuente
1

Todo depende de la escuela. En mi universidad, tenemos muchos proyectos prácticos. Muy a menudo en equipos y usando varios controles de fuente. Así que creo que algunas escuelas se centran en eso.

Pero una cosa que la escuela no enseña: detalles. Muy a menudo, cuando la escuela enseña algo de tecnología o práctica (como desarrollo web, desarrollo de interfaz de usuario JAVA, bases de datos avanzadas), solo rascarán la superficie y nunca entrarán en detalles, eso sería necesario para usar esta tecnología o práctica en negocios del mundo real. Obtendrá una visión general de las posibles formas de resolver sus problemas, pero deberá aprender los detalles necesarios.

Solo cuando la escuela enseña algo en detalles es cuando hay una sólida base matemática o teórica detrás de algo. Cosas como los lenguajes formales o las bases de datos SQL a menudo son parte central del plan de estudios de la escuela, porque se basan en una base matemática y se usan mucho en informática o ingeniería.

Eufórico
fuente
1
  • requisitos: equivocarse y descansar es un desperdicio
  • prioridades (qué función en qué lanzamiento)
  • hacer o usar fuera de la caja (compra / freeware)
  • trabajo en equipo
  • gestión de proyectos: requisitos, calidad (muestras de datos en prod, casos de prueba, cómo probar, cobertura antes de codificar, hay más como costo pero no relevante. lea un libro de PMI
  • herramientas de comunicación (correo, reuniones: planificador de calendario)
  • gestión del código fuente
tgkprog
fuente
0

Desearía haber decidido mucho antes en el juego si quería o no ser un programador general, aprender muchas cosas diferentes, idiomas, bases de datos y plataformas, y eventualmente convertirme en desarrollador web, o si debería especializarme en un CMS, o incluso especializarse en Photoshop, como especialista, sus habilidades serían tan valiosas y rentables como saber lo que un verdadero programador debería saber. En otras palabras, si solo necesita ganar un buen dinero, especialícese en UNA COSA. Si amas la computadora y te encanta resolver problemas, entonces sé un programador.

[reflexionando sobre y después de aprender como 4 o 5 'frameworks' javascript diferentes antes de que JQuery realmente saliera bien, obtener la certificación en JAVA y nunca obtener una posición de Java, y después de trabajar en múltiples plataformas; AS400- rpg,> .NET - c # y PHP, antes de desear que acabara de dominar Photoshop y ganar el mismo dinero sin tener que corregir errores o escribir software. ]

Quiero decir que hay una cierta satisfacción al conocer una amplia gama de temas, pero la satisfacción se ve obstaculizada cuando ves a alguien que solo conoce el efectivo de Photoshop con el mismo sueldo.

Eric
fuente
2
Sí, pero ese tipo de especialista nunca abrirá su propia tienda. Si su sueño es ser un CEO de su propia startup en algún momento en el futuro, necesitará una ENORME variedad de habilidades.
Davor Ždralo