¿Qué distingue a un programador profesional de un aficionado? ¿Hay algo que enseñan en la universidad que alguien descuidaría si hubiera aprendido por su cuenta?

Supongo que la pregunta compara el autoestudio con la forma en que se enseña la programación en las universidades, en relación con una carrera profesional posterior en el desarrollo de software.

Tenga en cuenta que los lenguajes de programación son solo idiomas: si puede leer francés o hablar francés con fluidez, eso no lo califica para criticar la literatura o cinematografía francesa, y probablemente no podrá producir obras maestras de manera regular 🙂 Para Con este fin, los cursos avanzados de informática se centran en lo que puede y no puede hacer con el software en lugar de en los detalles de programación. Permítanme enfatizar la parte de “no puedo”: un aficionado puede golpearse la cabeza contra la pared donde un graduado universitario puede darse cuenta de que se enfrenta a un problema insoluble (o muy difícil). Para algunos problemas difíciles, hay formas estándar de abordarlos en la práctica que estarían más allá de la imaginación de la mayoría de los aficionados.

La analogía del idioma va más allá: si aprende francés solo, nadie corregirá su pronunciación y no tendrá mucha práctica conversacional. La programación profesional también es una actividad social: debe ser articulado sobre sus planes y su trabajo continuo, y debe comprender lo que están haciendo sus colegas.

No todas las universidades enseñan la programación de la misma manera, pero las mejores escuelas definitivamente enfatizan grandes ideas, conceptos básicos y formas especiales de pensar desde el principio. Sin esto, un programador aficionado probablemente producirá sistemas frágiles que no serán claros para otros, y puede ser difícil de depurar, revisar y ampliar. Por otro lado, algunas de estas “grandes ideas” más tarde deben ser enseñadas en cursos posteriores y más prácticos porque los estudiantes con comprensión superficial tienden a abusar de ellos (la recursión es un buen ejemplo).

La amplitud de la cobertura y la cantidad de práctica de programación que obtienen los estudiantes varía dramáticamente (incluso en Michigan, varió entre semestres hasta hace poco). Tenga en cuenta que es difícil formular buenas preguntas de examen y buenas asignaciones de proyectos: se necesita un profesor experimentado y un equipo de TA brillantes para obtener todos los detalles correctos, llegar a objetivos realistas pero desafiantes, verificar cuidadosamente y evaluar soluciones, proporcionar apoyo razonable en horario de oficina y en línea, y proporcionar comentarios articulados a los estudiantes. Por otro lado, es útil hablar con otros estudiantes que están trabajando en la misma tarea para tener una idea de qué aspectos son difíciles y qué aspectos son fáciles. Si está atrapado en algo que otros estudiantes encuentran fácil, puede hablar con el profesor o TA. Pero en el autoestudio, es posible que no te des cuenta de que estás atrapado por un tiempo.

En cualquier caso, su redacción parece sugerir que las universidades producen programadores profesionales. Esto está lejos de la verdad por varias razones. Las más obvias son que la cantidad de práctica y experiencia en proyectos universitarios es demasiado pequeña para convertirse en profesional. Los estudiantes que trabajan en grupos demasiado temprano corren el riesgo de no aprender a ser desarrolladores individuales fuertes, y los estudiantes que trabajan individualmente no entienden cómo ser eficientes en un equipo.

Otra diferencia muy importante entre los cursos universitarios (y el autoestudio) versus la programación profesional es que “en el mundo real”, a menudo uno tiene que lidiar con bases de código que son 2-3 órdenes de magnitud más grandes de lo que una persona puede desarrollar en su vida. El código escrito por diferentes personas debe interactuar, debe mantenerse, revisarse y ampliarse. Esto requiere habilidades muy diferentes que desarrollar rápidamente un proyecto desde cero.

La programación industrial a menudo tiene que lidiar con requisitos vagos, acomodar cambios en las especificaciones y cumplir con varias restricciones inusuales.

Por lo que entiendo: saberlo todo .

Los programadores aficionados solo sienten la necesidad de conocer lenguajes y semánticas de alto nivel. Usan jQuery y Node.js sin siquiera tomarse el tiempo de leer el código fuente. No conocen todos los detalles técnicos de bajo nivel detrás de las redes, bases de datos, navegadores, marcos e idiomas.

Los profesionales lo saben todo. Al tener tanto amplitud como profundidad en la semántica de todo el campo, un programador puede producir exactamente lo que necesita ser producido para cumplir con los objetivos del producto. Un aficionado podría quedarse corto en algunos aspectos del producto porque una API no se mantuvo y no sabía cómo extenderlo para solucionar el problema.

Obtuve todo esto de una pregunta similar sobre Quora, pero por mi vida no puedo recordar quién.

Un aficionado es alguien que hace algo porque lo disfruta. Un profesional es alguien en quien puede confiar.

Una opinión común en estos días y tiempos es que cualquier buen profesional debe ser un aficionado primero. Esto se debe a que la programación requiere práctica, y también porque la práctica cambia constantemente. Se requiere una verdadera pasión para seguir creciendo. En estas condiciones, es difícil encontrar un conjunto estándar de criterios que puedan diferenciar a las grandes ligas de las pequeñas. Puede ser que los programadores estén participando en un vasto experimento que intenta unir las cosas y ver si se mantienen. Los que definen las tendencias … hasta que sean reemplazados por otra cosa.

Las opiniones sobre lo que hace que un buen profesional varíe según la persona con la que esté trabajando. Los informáticos pueden juzgar a los programadores por su capacidad para resolver problemas no triviales, que dependen de un profundo conocimiento de las matemáticas, los algoritmos y las estructuras de datos. En este contexto, un título universitario en CS, más probablemente uno de posgrado, puede marcar una verdadera diferencia. Otros argumentarán que ofrecer soluciones oportunas tiene poco que ver con la informática. En ese caso, una buena familiaridad con algunas herramientas y prácticas que no enseñan en la universidad debería ser esencial para realizar en este campo. Algunos insistirán en implementar procesos comerciales sólidos. Cuando fui a la escuela, hace aproximadamente dos décadas, mis maestros insistieron en el Modelo de Madurez de Capacidades, pero nunca encontré a nadie que pareciera importarle en la industria. Tampoco llegó a convertirse en un meme en Internet, a diferencia de esas palabras de moda de las que quizás haya oído hablar: TDD, BDD, patrones de diseño, Agile, Scrum, etc.

Tal vez me he vuelto cínico, pero si su deseo es convertirse en un profesional, le recomendaría sin rodeos que evite que la programación sea su enfoque principal.

A los profesionales se les paga un salario profesional, a los aficionados no se les paga ni reciben salarios bajos no profesionales por cualquier razón.

Esta distinción es independiente de la carrera, lo mismo ocurre con los actores / actrices, independientemente de su formación académica.

En realidad, su postulación de que la universidad enseña algo especial, es en realidad lo contrario, la universidad le enseña cómo no ser un programador empleable durante 4 años en el mejor de los casos y no ofrece absolutamente ninguna habilidad práctica que ninguna empresa realmente quiera pagar. ¡La experiencia laboral solo te da eso!

Ahora, si estás insinuando que lo que hace que un programador valga lo que le pagan, bueno, esa es una historia completamente diferente.

Sí, enseñan mucho en la universidad.
Puedes hacer un paralelo con el aprendizaje del arte (o digamos matemáticas). Puedes convertirte en un buen artista aprendiendo por ti mismo, siguiendo un ‘maestro’ o yendo a la academia.
Hay muchas cosas (fundamentales, básicas) aprendidas en la universidad antes de programar, y también aprendes a trabajar con un equipo.
Pero hay muchos ejemplos de buenos programadores ‘hechos a sí mismos’. En todos los casos, ser (y permanecer) un buen programador necesita mucho trabajo. Puedes aprender mucho leyendo / entendiendo un buen código fuente.

Un programador profesional debe ser serio con su código, mientras que un aficionado puede hacerlo por diversión.

Cuando miré esta pregunta, lo primero que me vino a la mente es: Prueba. Al reflexionar sobre esta idea, llego a la conclusión de que la demanda de calidad para los profesionales es significativamente mayor, que incluso si tenemos probadores profesionales, aún debemos centrarnos en la prueba. La gente comete errores y podría ser costoso. Cuanto antes detectemos el error, más fácil será arreglarlo y menos lío limpiar. Tengo un error en particular solucionado hace 3 años, pero hoy todavía me muerden clientes de vez en cuando y me acerco.

Centrarme en la calidad, creo, es una de las principales diferencias que aprendí.

Estándares

Un aficionado o aficionado no está obligado a cumplir con ninguna norma. Su trabajo es suyo. Él responde solo a un maestro: él mismo. Si su trabajo no se ajusta a las mejores prácticas o procesos conocidos, a nadie le importa.

Se espera que un profesional cumpla con los estándares siempre que sea posible. Se espera que pueda trabajar con un equipo y mantener correspondencia con los clientes y adherirse a un determinado código de conducta. Un profesional responde a sus pagadores.

Moraleja de la historia: nunca cabrear a un aficionado.

Hmmm, creo que la pregunta correcta es: ¿Cuál es la diferencia entre un informático y un programador? Hay muchas discusiones sobre esa pregunta en línea: ¿Cuál es la diferencia entre un informático y un programador? En resumen, la informática (que probablemente te especializarías en la universidad) es el estudio de lo que las computadoras pueden hacer (lado teórico) mientras que la programación es la práctica de hacer que las computadoras hagan cosas.

Enseñarse a sí mismo cómo programar y enseñándose a sí mismo todo el plan de estudios de CS son dos historias diferentes. Como científico de la computación, debe tener una base de conocimiento completa de algoritmos, estructuras de datos, matemática discreta, lógica, sistemas operativos, compiladores, conceptos básicos del hardware de la computadora, etc. Como programador, sabría cómo obtener computadora para hacer lo que quiera, pero tal vez no de la manera más eficiente o puede que no sepa qué está pasando bajo el capó. Esto podría dar como resultado un código no elegante y, por lo tanto, podría distinguir el código de un científico de la computación del de un programador aficionado.

Un profesional gana su código de escritura vivo.
A un aficionado no se le paga, pero codifica por diversión.
Si tienes suerte, puedes hacer ambas cosas.