Todos lo hemos escuchado; cada vez que hay una discusión sobre los graduados de CS que tienen malas habilidades de desarrollo, alguien finalmente dice:
La informática no es ingeniería de software.
El problema que veo es que la programación y el desarrollo de software se imparten en cursos de CS. Simplemente se les enseña mal. Si se está enseñando, ¿por qué no enseñarlo bien la primera vez? * *
Así que me gustaría ver cuáles son las opiniones sobre 2 preguntas:
¿Es el argumento CS! = SE una copia o una excusa para no enseñar adecuadamente las habilidades de programación.
Independientemente de su respuesta a la pregunta 1; si estuvieras en la posición todopoderosa de tomar tal decisión: ¿harías hincapié en la enseñanza adecuada de la programación en los cursos de CS?
*. Tengo la sospecha, según la evidencia anecdótica que obtuve a lo largo de mi educación, de que la mayoría de los académicos en el campo no han tenido que escribir código para mantenerse y no han mantenido el código, y como resultado no tienen el conocimiento / habilidades para enseñarlo de manera efectiva.
fuente
Respuestas:
No creo que sea una copia, sino una afirmación de que la informática no es ingeniería de software, no es programación; es, bueno, la ciencia de la computación formalizada. En esencia, es matemática (de hecho, muchos programas de CS comenzaron como programas de matemáticas aplicadas).
Creo que el problema radica más en la industria que en la academia. La industria ve un título de CS en un currículum vitae y piensa: "Genial, este tipo es bueno con las computadoras", y lo contrata para hacer cualquier cosa relacionada con una computadora: TI, programación, desarrollo de software, lo que sea. Esas cosas no necesariamente se encuentran en el ámbito de la experiencia de un graduado de CS. A su vez, muchas personas a las que les gusta construir computadoras o jugar videojuegos ingresan a un programa de CS que esperan hacer ese tipo de cosas y reciben una sorpresa grosera; es decir, muchos estudiantes que van a CS no pertenecen realmente allí, y estarían mejor en un programa de grado más específico.
En segundo lugar, hay un tiempo muy limitado para enseñar CS, una asignatura muy amplia, en un currículo típico de pregrado. Mi plan de estudios de pregrado tenía 8 cursos de CS (para un BA) o 12 cursos de CS (para un BS), además de todos los cursos de matemáticas requeridos. No es mucho tiempo para enseñar CS y matemáticas e ingeniería de programación y software, por lo que en algún momento debes decidir qué es importante y qué puede aprender un estudiante por su cuenta.
Ese último punto es crucial: creo que un buen estudiante, en cualquier materia, explorará ideas por su cuenta. Tengo un título de CS, pero creo que salí de la universidad como un desarrollador decente, porque estudié y escribí software por mi cuenta . La universidad no se trata solo de clases; también se trata de darles a los estudiantes tiempo para desarrollar sus habilidades de manera semiautónoma, mientras que al mismo tiempo brindan orientación valiosa.
Mantengo que la teoría de la enseñanza (CS, matemáticas, etc.) es tan importante, si no más importante, que enseñar habilidades específicas relacionadas con el trabajo. Si le enseñas a un estudiante el por qué detrás de los métodos y técnicas, y no solo el qué , terminarás con alguien que es mucho más adaptable al aplicar sus conocimientos. Por ejemplo, fui a una "escuela de Java" muy difamada y, por lo tanto, me enseñaron en Java, pero también tuve cursos de teoría del lenguaje de programación, lo que explicaba el por qué detrás de muchos idiomas; Como resultado, aprendí a escribir un software mucho mejor que si no tuviera esa experiencia. Claro, no escribo software en Haskell en mi trabajo diario, pero conocer mucha teoría del lenguaje de programación me ha permitido comprender queha sido aplicable a mi trabajo como programador.
También creo que la industria espera demasiado de los estudiantes universitarios. La industria quiere reducir sus propios costos, por lo que en lugar de capacitar a nuevos reclutas para sus trabajos, esperan que las universidades se conviertan en escuelas técnicas / comerciales; en efecto, quieren que las universidades hagan su entrenamiento por ellos. No se puede esperar que los graduados universitarios sepan todo recién salido de la universidad. Ser un buen desarrollador se trata tanto de la experiencia como del conocimiento (especialmente en un campo relativamente joven como el desarrollo de software).
fuente
Parte del problema aquí es el hecho de que 4 años no es tiempo suficiente para convertirse en un ingeniero de software pulido. Dado que queremos que el estudiante tenga exposición a más cosas que solo los cursos de matemática y CS y el hecho de que hay un montón de mecánica pura para aprender (algoritmos, estructuras de datos, sintaxis del lenguaje), no podemos esperar que una especialización de CS verde sea Un ingeniero de software.
Estoy de acuerdo en que CS! = SE y no estoy seguro de que puedas ir a la escuela y convertirte en un SE (incluso con un Máster)
fuente
CS de hecho no es SE. Y la gente parece combinar los dos todo el tiempo, incluso mientras lo admite. La informática realmente debería renombrarse como algo como Computología, o la ciencia de la informática. De hecho, la informática tiene muy poco que ver con las computadoras. Es teoría de grafos, análisis de algoritmos, estructuras de datos, etc.
La gente quiere asumir que un graduado de CS nuevo es en realidad un graduado de ITT; quieren a alguien que haya sido entrenado en una vocación. La informática es ciencia, la programación es un arte. Estos no son lo mismo.
Esto es como preguntar por qué un recién graduado de Física no es un buen ingeniero de automóviles. Es tonto
fuente
fuente
No. CS no es SE. Eso es un hecho, no una excusa.
No. Sería como obligar a los astrónomos a aprender los detalles de la construcción de telescopios. O forzar a los programadores a aprender los detalles de la construcción de computadoras. Cosas relacionadas, pero un hombre no necesita saberlo todo.
fuente
Sí, esto me parece una evasión y una señal de la inmadurez de CS como disciplina académica.
Un programa de BS acreditado por la American Chemical Society requiere que haya aprobado cursos específicos para demostrar habilidades particulares tanto en teoría (clases de lectura) como en práctica (clases de laboratorio). En la actualidad, CS no tiene nada de eso hasta donde yo sé.
Uno de mis profesores de posgrado era un teórico de torres de marfil cuya oficina nunca fue manchada con nada más químico que una pecera con Magic Rocks, pero cuando yo era su TA para química de primer año, también demostró ser un químico de banco bastante competente. .
Cuando trabajaba como químico de pintura industrial, se habrían reído de la idea de que tendría una licenciatura y sería incompetente en el laboratorio. Por supuesto, los detalles de lo que estaba haciendo en el laboratorio eran diferentes a los que había tenido en las clases de laboratorio en la escuela, pero los principios eran los mismos: solo usamos una mezcladora de pintura y una lata, en lugar de un vaso de precipitados y un agitador magnético. .
Si se aplicara el mismo enfoque a la CS, los detalles de lo que se podría enseñar como habilidades prácticas de desarrollo de software para un plan de estudios de CS / SE podrían variar de una escuela a otra y con el tiempo. Pero me parece una locura que sea aceptable que alguien pueda obtener un título en el campo y no ser competente para escribir, depurar y mantener algún tipo de código. (Por supuesto, así son las cosas en muchos programas de CS, pero sigue siendo una locura).
fuente
Estoy de acuerdo en que 4 años es suficiente tiempo para darles una buena base sobre la cual crecer. Sin embargo, creo que una cosa que realmente ayuda es cuando las personas de la industria se involucran en el desarrollo del plan de estudios e incluso en la enseñanza en el aula. El año pasado fui miembro de la industria en una clase de desarrollo de software en una universidad local. Fue una experiencia muy reveladora para mí. El profesor y yo trabajamos juntos en el contenido del curso y pusimos mucha más información sobre el proceso de desarrollo, las mejores prácticas de la industria y las situaciones del "mundo real" que habían estado haciendo antes. Lo que descubrimos fue que, debido a que la mayoría de los instructores no desarrollan código ampliamente utilizado y mantenido, traer a alguien de la industria ayudó a identificar y enseñar las habilidades necesarias para hacerlo.
fuente
Sí, es un copout 100%, deberían enseñar habilidades a largo plazo que serán útiles a lo largo de nuestra carrera. Independientemente de si su intención es ingresar a la academia o la industria, deberá poder programar de una manera que pueda mantenerse, incluso si es solo usted.
Sí, aunque solo se enfatizaría en los cursos adecuados. Personalmente, si tengo que hablar con usted para comprender mejor cómo trató de implementar un algoritmo, rebajaría su calificación.
Incluso si realiza una investigación de CS pura, probablemente tendrá que crear código para demostrar sus ideas. Las habilidades de programación adecuadas te serán útiles en algún momento, entonces ¿por qué no comenzar en la universidad?
fuente
Creo que nuestro problema es que somos mucho más como médicos de lo que estamos dispuestos a admitir ... Tenemos la idea de que un título de cuatro años debería preparar a los estudiantes para escribir software. Ni siquiera está cerca.
Nuestra profesión está en su infancia en comparación con otras disciplinas. Quizás la pregunta debería ser: ¿cómo podemos mejorar el CS para que los estudiantes que se gradúen con ese título estén mejor preparados para convertirse en miembros productivos de un equipo de desarrollo de software del mundo real en un lapso de tiempo mucho más corto?
Quizás deberíamos ser más como la medicina. Cuatro años de trabajo básico (grado CS) y luego residencia: práctica del oficio bajo la supervisión de un ingeniero de software con más experiencia. Tal vez eso es lo que ya tenemos, pero es menos formal ... Quiero decir, como residente, aprendemos nuestras habilidades más valiosas en el lugar de trabajo en nuestros primeros trabajos.
Tal vez como disciplina solo necesitamos formalizar esto mejor.
fuente
Tengo un título de CS, y durante todo un año de mi programa no hubo programación, solo teoría. Nos dijeron que no estamos obteniendo un título en programación sino en Ciencias de la Computación. Si quieres ser programador, ve a la universidad comunitaria.
Aprendimos sobre algoritmos, patrones de diseño y mucha teoría sobre la resolución de problemas sin un lenguaje específico. Los lenguajes de programación van y vienen, pero la teoría subyacente sigue siendo la misma.
Entonces, a su primera pregunta, no, no creo que CS! = SE sea una copia. Es un hecho.
A su segunda pregunta, no, no creo que lo haga. ¿Cómo enseña correctamente la programación? Más allá de loops, ifs, métodos, clases y OOP, ¿cuál sería la 'programación adecuada' y cómo lo haría relevante para cualquier lenguaje de programación? Necesitas experiencia escribiendo código, algo para lo que un título de 4 años no puede prepararte.
Sin embargo, una cosa que haría es proporcionar una clase sobre Desarrollo en el mundo real. El control de la fuente, el seguimiento de tickets / errores, el seguimiento de códigos y todo ese jazz sería un buen comienzo para preparar a los que pronto serán graduados para lo que enfrentarán en sus nuevos trabajos.
Creo que depende de nosotros cuando contratamos a un nuevo graduado para comprender que probablemente no escribirán un código galardonado. Necesitan orientación y dirección.
fuente
Es importante que la universidad logre un buen equilibrio entre el conocimiento teórico y las habilidades prácticas. Mientras asistía a diferentes cursos aprendí ambos. Durante los primeros años hubo muchas matemáticas y algoritmos / estructuras de datos. Lo que siguió fue una elección: o podría continuar aprendiendo ciencias de la computación (tipo de camino artístico, donde podría, por ejemplo, asistir a cursos con sofisticados algoritmos de coincidencia de cadenas) o concentrarse en la ingeniería de software. Todavía tenía que obtener un fondo sólido de programación durante este tiempo.
Elegí la ingeniería de software, porque nunca me interesaron mucho los problemas abstractos. Pero incluso aquellos a quienes les gustaba la informática pura tenían que:
linux
módulo de kernel y modificar el kernel en sí mismo, escribir un juego orientado a objetos puros enSmallTalk
,Java
en un equipo de cuatro,C
para programación paralela (las ideas eran abstractas, pero las revisiones fueron bastante duras, como perder puntos por no proporcionar una salida adecuada, cuando el programa falló, comoprogram
debería hacer un buen Unix ),django
, lo que me hizo amar este marco),LAMP
(todavía tengo pesadillasphp
, pero usé enpostgresql
lugar deMySQL
y estoy muy feliz de saber estoDBMS
ahora),python
programa de escritorio de 10k líneas usandoPyQt
.Tal vez hubo otros proyectos, pero ahora simplemente los olvidé.
Mi punto es: todo depende de la escuela. Me disgusta mucho el enfoque de ingeniería de software puro, donde
Java
es el idioma principal. Tuve que ayudar a un amigo una vez, que asiste a esa escuela y tuvo que escribir algún programa para programación paralela. Tenía que escribir para él, básicamente, porque no obstante, quesizeof(some_string)
en elC
da la longitud de la cadena.Seré honesto: odiaba las matemáticas, me dolía, cuando tenía que prepararme para tareas abstractas, que se servirían en exámenes de algoritmos / estructuras de datos. Pero me da cierta ventaja: puedo pensar de una manera muy abstracta. Es como cuando aprendes artes marciales y no guardas la guardia (al menos en esos, donde se supone que debes hacerlo). El entrenador sigue viniendo y golpeándote en la cabeza, cuando bajas las manos, porque olvidaste o porque estás demasiado cansado para mantenerlas. Pero después de un tiempo, simplemente sigues así. Y se vuelve realmente difícil golpearte en la cara. Lo mismo con los problemas algorítmicos abstractos. Comprenda el contenido de Introducción a los algoritmos y realmente pocas cosas sorprenderán en el trabajo.
fuente
Creo que la respuesta es sí (en cierto modo).
La cuestión es que no es posible enseñar a los niños en un corto período de tiempo la programación. Deberían pensarse en el pensamiento lógico de los programadores, cómo resolver (en menor escala) los problemas del programador.
Estoy seguro de que los programas de la escuela deberían revisarse, en mi pequeño país del "tercer mundo", afortunadamente, se está haciendo un esfuerzo para que esto suceda. Somos el primer país en implementar el programa OLPC; http://laptop.org/en/
fuente
Desde mi propia experiencia (soy estudiante en este momento), tengo que decir que sí, es una excusa. Todo el mundo se refiere a CS como una ciencia que nos enseña todos los conceptos básicos de las computadoras, y SE como una rama especial en CS que enseña explícitamente la programación. Imo, todos los que tienen BS en CS, deben saber cómo escribir código bueno y optimizado (incluso si la programación no es su área de especialidad). Entonces sí, si tuviera una posición poderosa de tomar tal decisión, obligaría a los estudiantes a adquirir buenas habilidades de programación.
fuente
Asumiendo que el objetivo es educar a buenos ingenieros de software (programadores) porque el mundo los necesita, ¿está bien responder diciendo lo que creo que debería enseñarse?
Primero, esto es importante porque actualmente la transferencia de conocimiento es muy ineficiente. Cuando los posibles programadores están en clases, sus mentes están abiertas y absorben lo que se les enseña. Al mismo tiempo, los profesores (yo era uno) con demasiada frecuencia están más interesados en llenar la tubería de la escuela de posgrado con estudiantes que pueden trabajar en materias esotéricas. Cuando se plantea la objeción de que los estudiantes no se están preparando para problemas del mundo real, he visto a los profesores afirmar que ese no es su trabajo . Ese es el trabajo del mundo real.
Entonces, cuando los estudiantes se convierten en programadores en el mundo real, ¿están ansiosos por aprender de sus nuevos colegas? No en mi experiencia. Más bien están ansiosos por difundir el evangelio que adquirieron en la escuela. Recuerdo que, como estudiante y joven practicante, pensé en lo difícil que sería fomentar nuevas ideas entre los viejos fanáticos del mundo. Ahora que soy un viejo loco, veo lo difícil que es abrir los ojos de los nuevos programadores a la diferencia entre teoría y práctica.
Yo era estudiante de ingeniería, en ingeniería mecánica y luego en ingeniería eléctrica. Una parte fundamental de eso fue a) fundamentos matemáticos, yb) solución práctica de problemas. La ingeniería de software debería ser así, no solo la programación.
Creo que la ingeniería de software (programación) debería enseñarse con suficiente ciencia informática para ser un conocimiento práctico : teoría básica de autómatas y teoría de la información. No es necesario hacer esto en gran profundidad. Después de enseñar las habilidades básicas de programación, debe haber proyectos cooperativos de tamaño no trivial. Una parte esencial de estos debe ser la propuesta y la consideración de soluciones alternativas de problemas específicos, con análisis de pros y contras, no solo la última religión o el "próximo gran acontecimiento" o una talla única para todos. Finalmente, debe haber cooperación y asociación entre la industria y la academia, para que las ideas y las mejoras se puedan comunicar en ambos sentidos, mejorando en gran medida el control de calidad.
fuente
Los que pueden, hacer; los que no pueden enseñar.
En mi universidad, la base de conocimiento de los maestros es lamentablemente deficiente. He visto a los maestros luchar por comprender cómo representar tablas semiestructuradas en XML mientras tienen un PHD en Diseño de bases de datos. He visto a mi profesor de ensamblaje preguntarme qué está haciendo mi código cuando copio y pegué su fragmento de código. He visto a mi maestro de diseño de software decirnos que el método Agile es el mismo que el método en cascada, pero más rápido, que el modelo de proceso de desarrollo iterativo tiene y solo puede tener 3 iteraciones porque eso es lo que la imagen que el libro usa como ejemplo representa. Uno de mis maestros ni siquiera sabía qué era otra declaración.
No creo que estén 'haciendo frente', o haciendo excusas, realmente creo que están haciendo lo mejor que pueden con sus experiencias, que tienen muy pocos.
Estoy de acuerdo con las otras personas que publican aquí que 4 años no son suficientes para convertirse en un programador experimentado, pero la experiencia que han tenido mis maestros tampoco es suficiente para hacerlos experimentados. Es muy parecido a Ender's Shadow, donde Bean se da cuenta de que las métricas utilizadas por los maestros en la escuela de batalla se quedan cortas porque la última guerra, que es la regla guía, fue demasiado corta para mostrar realmente lo que realmente se necesita. En otras palabras, los maestros estaban haciendo lo mejor que podían, pero no tenían la experiencia para saber lo que realmente se necesita para ser un buen comandante (o un buen programador en este caso).
fuente
Those that can, do; those that cannot, teach.
Tampoco estoy de acuerdo con esto en absoluto: las carreras académicas e industriales conducen a estilos de vida completamente diferentes. Gran parte de la investigación mundial proviene de académicos. Y no veo ninguna manera en que hayas respondido la pregunta original.Los informáticos y los ingenieros de software son diferentes. Los científicos son los que realizan los experimentos locos y elaboran los algoritmos que nosotros, los ingenieros de software, aprovechamos para ser mejores.
Piense en los químicos que realizan experimentos para una empresa farmacéutica. No les importa cómo producir el químico en masa. Tampoco les importa el marketing, el empaquetado, la distribución o cualquier cosa que le pase al medicamento después de descubrirlo. Demonios, ni siquiera les importa el proceso de certificación. Lo único que les importa es encontrar una sustancia química que tenga efecto cuando se administra a los sujetos de prueba. La compañía es responsable de llevarlo más allá de eso.
Los informáticos son como esos químicos. Todo lo que hacen es probar las teorías con código. No les importa cuán sostenible sea el código. Demuestran una teoría y pasan a la siguiente. Alguien más empaqueta ese algoritmo y lo hace útil para las masas y tenemos MP3 o visión por computadora con Kinect o transmisión de video en su iPhone. Entonces CS! = SE es un argumento válido.
Escribe la segunda parte de tu pregunta. Si ofreciera un título en Teoría de la Música, podría haber un curso obligatorio de composición o algo así, pero no requeriría que nadie estudiara un instrumento. Depende del estudiante buscar el conocimiento que desea. La informática no es ingeniería de software ... si quieres aprender SE, toma una doble especialización.
fuente
Edsger Wybe Dijkstra era un informático holandés.
Recibió el Premio Turing de 1972 por sus contribuciones fundamentales al desarrollo de lenguajes de programación , una vez dijo:
"LA CIENCIA DE LA COMPUTADORA NO ES MÁS SOBRE COMPUTADORAS QUE LA ASTROMÍA ES SOBRE LOS TELESCOPIOS".
CS es REALMENTE DIFERENTE de un SE. (CS! = SE).
Un CS es un científico que ha adquirido conocimientos de CIENCIAS INFORMÁTICAS.
La CIENCIA DE LA COMPUTADORA o ciencia de la computación (a veces abreviada CS) es el estudio de los fundamentos teóricos de la información y la computación y de las técnicas prácticas para su implementación y aplicación en sistemas informáticos. Con frecuencia se describe como el estudio sistemático de procesos algorítmicos que crean, describen, y transformar la información.
La informática tiene muchos subcampos, por ejemplo:
Muchos de nosotros no necesitamos ninguna de estas habilidades en el trabajo diario o al menos un poco de ella.
INGENIERO DE SOFTWARE (SE) es una profesión dedicada al diseño, implementación y modificación de software para que sea de mayor calidad, más asequible, mantenible y más rápido de construir. Es un "enfoque sistemático para el análisis, diseño, evaluación, implementación, prueba, mantenimiento y reingeniería de un software mediante la aplicación de ingeniería al software"
Como un experto en CS, se supone que tiene el conocimiento para manejar problemas realmente complejos sin conocer ningún lenguaje de programación realmente bueno. En mi humilde opinión, aquí podemos abrir otro hilo, donde un GRADO para mí es SOLO un PUNTO DE PARTIDA y no un OBJETIVO FINAL.
Como SE sabe, se supone que tiene los conocimientos necesarios para gestionar la producción de este problema realmente complejo y gestionar el desarrollo de un equipo o un proyecto sobre este campo.
Juntos realizan la investigación en ciencias realizada por un CS en Ciencias aplicadas con la ayuda de un SE.
No me refiero a CS es mejor que SE, me refiero a CS! = SE.
Este tipo de pregunta es la misma pregunta que las personas que no son informáticas se preguntan por qué, como programadores, no pueden solucionar por teléfono el problema del programa X, Y, Z en el sistema operativo J, M, NORTE. ;)
En realidad , estoy realmente aburrido de la codificación después de 10 años de desarrollo de sistemas Unix en el campo de la seguridad y después de leer esta pregunta, entiendo, ¡necesito estudiar más ciencias de la computación y menos lenguaje y sistema o protocolo de computadora!
¡Nadie en mi trabajo puede manejar la diferencia sobre SE y CS! Es realmente una mala cosa.
Si crees que un CS puede ser una excusa para una mala habilidad de programación, realmente estás perdiendo el punto sobre qué es un CS y qué es SE.
Supongo que eres un SE, ¿sabes, por ejemplo, que todo el lenguaje, todo el paradigma y todas las cosas relacionadas con el lenguaje de la computadora se pueden expresar matemáticamente en un conjunto de funciones recursivas parciales y lo que sea que aprendas un nuevo idioma, CUALQUIER NUEVO IDIOMA, solo eres aprendiendo una nueva abstracción sobre la MISMA función parcial recursiva?
que te diviertas :)
fuente