¿Por qué debemos aprender programación procesal antes de aprender programación orientada a objetos [cerrado]

10

Ahora estoy en el cuarto año en una universidad de TI, y cuando hablo con mi profesor sobre este tema, él rechaza mi opinión y me critica mucho (en mi universidad, nos estaban enseñando C (ANSI) (en Procedimiento) Clase de programación: en el 1er año en la universidad) antes de C ++ (en la clase OOP en el 2do año) y otros ...

Pero a los 13 años, a mi hermano le enseñaron Java primero y nada más. Ahora, él puede hacer casi todo lo que un estudiante normal de segundo año puede hacer con Java.

Para ustedes, profesionales, me gustaría saber por qué creen que primero se nos debe enseñar la programación de procedimientos.

Luke
fuente
8
Porque Assembler no tiene objetos.
99
Es como por qué deberíamos aprender a calcular correctamente antes de aprender a usar una calculadora.
22
Porque el diseño orientado a objetos es defectuoso. Los programas son una colección de comportamientos que operan con datos. Los objetos a menudo introducen una complejidad innecesaria. Lea "Cómo diseñar programas: una introducción a la programación y la informática".
8
Como lo dijo otra persona, "No distraigas a los nuevos programadores con OOP": prog21.dadgum.com/93.html , básicamente todo lo que OOP se está interponiendo en el camino de enseñar a los nuevos programadores los fundamentos. Les estás enseñando dos conceptos realmente difíciles al mismo tiempo.
John Ripley
77
@juxstapose: decir que la programación orientada a objetos introduce una complejidad innecesaria es como decir que deberíamos tallar vehículos de un solo bloque de acero. Solo es mi opinión.

Respuestas:

23

Sumario rápido:

  1. Porque en el mundo real, tarde o temprano, tienes que trabajar con código de procedimiento.

  2. Porque los lenguajes de procedimiento pueden funcionar como una extensión o una introducción a los lenguajes orientados a objetos, en lugar de ser simplemente una alternativa.

  3. Complemento a la respuesta 2. Debido a que la POO es más compleja que la Programación de procedimientos, por lo tanto, es mejor aprender la Programación de procedimientos, primero.

  4. Porque en el mundo real, los programadores trabajan y combinan varias formas de resolver problemas, también conocida como "programación multiparadigma", no solo un paradigma único.

  5. La mayoría de los lenguajes de programación son multiparadigm, en algún nivel, incluso, si sus diseñadores o desarrolladores comunes, dicen lo contrario.

  6. [NUEVO] Debido a que la programación modular, que comúnmente se mezcla y se confunde con la programación de procedimientos, se puede aplicar a OOP. Por lo tanto, la pregunta puede leerse como "¿Por qué debemos aprender programación modular antes de aprender programación orientada a objetos?"

Descripción aburrida extendida:

El punto 1 es muy claro, no hay más explicaciones.

Punto 2, Clases, Herencia, Polimorfismo, Interfaces, etc.

Punto 3, codifico Pascal de procedimiento antes de aprender Pascal orientado a objetos, cuando llegué allí dije: "mira, las clases son como pequeños programas de procedimiento ... ... y puedes hacer que hablen entre sí, ¡genial! ".

Escuché lo mismo de personas que pasaron de C simple a C plus plus.

Punto 4, la mayoría de las veces los programadores combinan varias técnicas de programación o paradigmas, o formas de resolver un problema. Funcional, de procedimiento, POO, lógico.

Incluso Java "Pure OO" no es una programación de objetos tan simple como dice.

+1 punto por decir "Programación procesal" en lugar de "Programación estructurada". O programación modular. Esto es importante

Sin embargo, muchas veces estos términos se enseñan juntos y se usan indistintamente, no lo son. Programación estructurada, incluye muchos conceptos, no solo el uso de procedimientos, y uno de ellos es hacer que el programa no se vea como "Código de espagueti".

Hoy leí varios programas OO "puros" que se parecen a "Código de espagueti orientado a objetos", lo que significa que el programador usó OOP, pero su código parece un desastre.

Muchas veces, puedo leer un código OO y decir que el programador aprendió la Programación Estructurada antes de OOP, porque el código es claro y está organizado.

Y para la programación modular, he visto varias aplicaciones. en C ++ y PHP que no usa módulos. *

umlcat
fuente
18

Creo que la analogía sería similar a las matemáticas. Primero debe aprender algunos conceptos básicos (suma / resta / ...) y luego pasar a temas más complejos (álgebra / cálculo). El programa de procedimientos es muy lineal y es más fácil comprender el flujo de control mientras aprende la sintaxis. Quizás se piensa que OOP es más complejo, se basa en las construcciones más simples utilizadas en los lenguajes de procedimiento, pero es más abstracto y más difícil de entender. Comenzar con lenguajes como C también te acerca al hardware y te hace lidiar con problemas de asignación de memoria y punteros, que debes entender pero que realmente no puedes usar en lenguajes como Java / C #. Hay un valor real en estar expuesto a esto en la escuela, independientemente de si es primero o segundo.

FWIW, está obligado a cambiar eventualmente. Cuando comencé la escuela aprendimos en Pascal y PL / 1. No llegamos a C hasta la clase de idiomas avanzados (que data de mí). No aprendí Java hasta la escuela de posgrado, ¡todavía no se había inventado!

tvanfosson
fuente
+1 - una especie de paradoja de intenciones allí ... "más abstracto y más difícil de entender" :)
10
@Spacemoses: en realidad no, cuanto más abstracto es algo, más fácil es la discusión, pero más difícil es comprender la realidad de lo que se está discutiendo.
De acuerdo, veo tu punto ahora.
ses011
12

La programación orientada a objetos es una colección de fragmentos de procedimientos de manera organizada. Creo que la lección que está aprendiendo es que la metodología orientada a objetos ayuda a mantener la organización y la mantenibilidad. Hay muchos programadores que no pueden hacer esta distinción y afirman que sus programas están orientados a objetos cuando son más procesales.

ses011
fuente
3
pero funciones + estado = objetos
Dan D.
44
La orientación a objetos a menudo dificulta mucho el mantenimiento porque infla la base del código. Los sistemas basados ​​en Java son una pesadilla para mantener debido al nivel de pureza de OO y la patrón de diseño que se encuentra en esa comunidad.
bit-twiddler el
1
"Patrones de diseño encontrados en esa comunidad" - suena como un problema personal en la "comunidad Java" si esa es su postura.
ses011
1
@Dan D: la orientación a objetos es mucho más que combinar funciones y estados en un objeto ...
Marjan Venema
44
@Spacemoses: Tengo un problema con cualquier comunidad de desarrollo que no abraza el principio KISS. La mejor solución a un problema es a menudo la solución más simple.
bit-twiddler
11

Usted no

Aprendimos programación funcional primero, con Scheme. Luego pasamos a procedimientos, luego a POO y luego a programación declarativa. Y lo creas o no, aunque ya conocía la programación, creo que en realidad también fue más fácil para otras personas: ¡porque FP es como las matemáticas! Entonces ya sabes lo básico.

He debatido esto conmigo mismo muchas veces, y finalmente he llegado a la conclusión de que realmente depende de qué tan bien tu maestro te enseñe los conceptos.

No hay una respuesta única porque:

  • Comenzar con algo de procedimiento como C (o incluso ensamblaje) podría ser una buena opción, porque aprende cómo funcionan realmente las computadoras

  • Comenzar con algo orientado a objetos Java podría ser una buena opción, porque es relativamente fácil de aprender y aplicar OOP a la vida real, y porque te enseña sobre ** la formación

  • Comenzar con una programación funcional como Scheme podría ser una buena opción porque le enseña a pensar de manera más abstracta (en términos de funciones en lugar de variables), lo que finalmente lo convierte en un mejor programador

Si tu maestro no lo enseña bien, entonces realmente no importa con qué comiences; prácticamente resultarán lo mismo.

usuario541686
fuente
44
¡+1 golpe y no puedo creer que tuve que desplazarme por tantas respuestas pobres para encontrarlo!
jk.
De hecho, tuve problemas para asimilar las funciones matemáticas por un tiempo porque primero aprendí algo de codificación, y el concepto de una función que 'es' en lugar de 'hacer cosas' me desconcertó. : 3
StarWeaver
6

Un lenguaje puede estar orientado a objetos como C ++, Java o C #. Y puedes comenzar con estos idiomas. Pero el punto es que, incluso con estos lenguajes OO, primero debe aprender la programación de procedimientos, luego OOP. Creo que tú hiciste lo mismo con tu hermano.

Gulshan
fuente
3
+1 Precisamente. Cada método OOP es un breve programa de procedimiento. Si usted no sabe cómo combinar las piezas pequeñas (tipos, valores literales, variables, operadores, =asignación, if, for, etc) en trozos grandes (métodos), ¿cómo se puede tener la esperanza de entender programación orientada a objetos. Al igual que con la mayoría de las habilidades, ser muy inteligente, motivado y / o tener acceso a la instrucción individual puede permitirle aprender múltiples temas relacionados simultáneamente.
David Harkness
3

La programación de procedimientos, al menos en un lenguaje como C, elimina la programación a una práctica muy básica: algoritmos y estructuras de datos, y en un nivel de abstracción que es un medio feliz entre el código fuente entendible humano y el código de ensamblaje.

De esta manera, los estudiantes pueden aprender un poco de ciencia (algoritmos, estructuras de datos) y un poco de ingeniería (fuente-> objeto-> compilación de máquinas, arquitectura von-neuman (probable)) al mismo tiempo.

OOP, a través de C ++ / obj-C, presenta un patrón de organización de código, que es solo una cosa más para aprender. Esto podría dificultar el aprendizaje de los conceptos anteriores.

OOP a través de Java (entre otros) va más allá al abstraer el hardware y el entorno. Ahora el producto subyacente no es código de máquina, sino algún tipo de intermediario que no revela cómo funciona el hardware subyacente, pero el efecto es que le permite al estudiante concentrarse en los patrones de organización del código.

Al final, creo que es una compensación entre aprender cómo funciona el hardware o aprender un patrón de organización de código. En cuanto a lo que es más importante, realmente no lo sé. El mundo real requiere conocimiento de ambos, al menos hasta cierto punto.

Voy a adivinar que un programa de pregrado que comienza con una programación de procedimientos de bajo nivel probablemente produce científicos / ingenieros informáticos, y un programa que comienza con conceptos de nivel superior produce ingenieros / desarrolladores / programadores de software.

Curtis Batt
fuente
3

Las entrañas de los objetos OOP están formadas por programación de procedimientos.

Si no puede hacer un bucle for, use los punteros correctamente, declare sus tipos y funciones, no podrá escribir interfaces para sus clases y mucho menos hacer que el interior haga algo que valga la pena hacer.

De todos modos, realmente no estarías aprendiendo OOP en una clase introductoria, solo sería sintaxis: saltar directamente a OOP haría que las cosas sean más complicadas de entender (al principio) de lo que ya es.

OOP no se trata de declarar sintaxis para formar clases, se trata de estructuras de datos, patrones de diseño, polimorfismo, herencia y composición.

Para hacer todas esas cosas, necesita saber la programación de procedimientos, algo que se hace fácilmente en C. Puede llevar casi todo lo que aprende con C a Java o C ++ de todos modos, es posible que deba repensar algunas cosas que dio por sentado en C, PERO ... Debe conocer la gramática (dónde se encuentra en la introducción C) para escribir oraciones (debe escribir procedimientos para definir interfaces), luego párrafos (debe conocer las estructuras de datos) y luego conocer algunos patrones de diseño (tragedia, comedia, imperfecto héroe, cómo interactúan; y cuándo no usarlos) antes de que puedas escribir novelas completas (sistema OOP completo).

Si fuera usted, elegiría algunos de los siguientes libros: El lenguaje de programación C , el lenguaje de programación Java , los patrones de diseño , la pandilla de cuatro y la eclosión de patrones . Definitivamente elegiría una copia de The C Programming Language si hablara en serio sobre C / C ++.

Si solo quiere ir hasta Java (y hacerlo por la identificación de $), recoja algunos libros sobre patrones de diseño de Java y cómo usar Java con los servidores web Apache y Tomcat y algunos libros sobre programación de bases de datos SQL. Java patea tanto el culo en la web, lo siento, pero PHP ha tenido un historial de toneladas de agujeros de seguridad, lo que hace que sea tan difícil como Windows evitar que su servidor se arraigue o se inyecten sus bases de datos SQL.

También debe tomarse el tiempo para aprender SQL, Oracle MySQL Postgresql y MSSQL tienen mucho en común con respecto a la sintaxis, pero si tuviera que elegir aprender uno solo, elija Postgresql solo porque tiene licencia BSD en lugar de GPL (debe buscar una comparación y contraste en las licencias GPL / BSD también)

Hategrin
fuente
2

Debo decir que la mayoría del código escrito en lenguajes orientados a objetos como Java no está realmente orientado a objetos. Comprender realmente las ideas detrás de OO es difícil, como resultado, el código supuestamente OO es en su mayoría de procedimiento.

Sin embargo, esto no tiene nada de malo en escribir código de procedimiento en Java. Sí, hay beneficios al hacer OO, pero no es algo con lo que me gustaría confundir a un programador principiante. Sobre esa base, no veo nada de malo en enseñar Java. No esperes OO real, pero funciona.

Sin embargo, Java oculta muchos de los detalles de bajo nivel sobre lo que sucede dentro de la computadora. C deja estos mucho más a la intemperie. Se puede argumentar que los estudiantes deben aprender cómo funcionan estos detalles de bajo nivel antes de usar un lenguaje que los cuide. Pero también puede argumentar que debe ignorar esos detalles y aprenderlos más tarde.

Winston Ewert
fuente
2

Varios otros ya han respondido a lo largo de este tema, pero creo que vale la pena declararlo más explícitamente.

Incluso si comienza a aprender programación con un lenguaje orientado a objetos como Java, comienza aprendiendo técnicas de programación de procedimientos antes de llegar a los conceptos de OO . Cuando se enseña un nuevo programador Java, no se les presentan objetos y clases primero, se les presentan declaraciones y variables. Cuando el alumno está en condiciones de aprender mucho sobre objetos y clases, ya tiene al menos los fundamentos de la programación de procedimientos.

Por lo menos, debe aprender la programación de procedimientos en Java y luego aprender la programación orientada a objetos en Java. Ya sea que pase todo un año en la programación de procedimientos o simplemente pase las primeras semanas del curso de programación, y si usa un lenguaje diferente para ello o no, solo está discutiendo sobre los detalles.

Ben
fuente
0

Para ser demasiado franco al respecto, creo que el impulso para esto proviene principalmente de viejos programadores que desean viejos tiempos.

Antes de decir cualquier otra cosa, absolutamente no mantengo ninguna contención para los programadores de edad avanzada, muchos muchos de ellos son simplemente asombroso de cualificados. Desafortunadamente, a veces, aquellos que no lo son, que se desvanecen y nunca fueron realmente buenos en la programación para empezar ... se convierten en profesores cuando no pueden piratearlo en el "mundo real". (No todos los profesores tampoco ... pero ... MUCHOS)

OOP no es el santo grial de la programación, ni la programación procesal es una reliquia. Es bueno saber al menos algunos de los dos, pero creo que la práctica general de lo que termina siendo enseñado como programación procesal tiende a ser una enorme pérdida de tiempo y esfuerzo. Necesitamos aprender programación en la academia, no solo un estilo u otro. Atribuyo bastante código terrible y conceptos erróneos a esto, incluido el mío.

Garet Claborn
fuente
2
Tuve un maestro usando C del '89, pero era para un microchip que esperaba c '99. Luego estaba ese otro maestro que usaba 'c ++' pero sin el STL o las plantillas. También podría haber sido estructuras con punteros de función en ellos.
Ape-inago
1
Para ser justos, el STL y las plantillas en general no son temas introductorios de C ++. El objetivo básico de cualquier curso de programación de 101 niveles es enseñar cómo crear una lógica secuencial, condicional e iterativa bien estructurada dentro de las restricciones de una sintaxis dada. Todas las demás características del lenguaje son simplemente azúcar sintáctica que permite agrupar las estructuras de control básicas y vincularlas a los datos.
bit-twiddler
Ay dos votos a favor. vi que se acercaba una P = extraña, ya que la opinión originalmente provenía de un programador mayor que me ayudó a recuperarme de una enseñanza deficiente. @Ape: El jefe de nuestro departamento de CS estaba tratando de enseñarnos COBOL durante un año en 2004 XD (la menor de mis preocupaciones por su estilo de "enseñanza", no me importa, ya que puedo trabajar en algún punto de ventas máquinas lol pero geeze ... ¿en serio?)
Garet Claborn
1
@ bit-twiddler - Sí señor, muy extraño. No confío mucho en esa experiencia en esta opinión, pero he buscado en otros lugares. Realmente amo ambos estilos de programación y me parece que deberían enseñarlos juntos. Me parece que los profesores, incluso un poco más jóvenes, no tienen el mismo porcentaje de fanatismo sobre el tema. OMI eso es algo bueno. Entiendo que algunos piensan que el procedimiento primero es importante.
Garet Claborn
1
@ bit-twiddler: sí, pero no fue un curso introductorio. Fue un curso avanzado de 4to año en diseño de bases de datos, y se suponía que estábamos usando c ++. Simplemente me sentí mal después de experimentar c ++ a un nivel tan alto con cursos anteriores.
Ape-inago
0

Dos razones para mí: una programación OO vino a resolver problemas de programación de procedimientos. Entonces, al escribir algo de codificación de procedimiento y luego lo mismo en OO, es más fácil entender la diferencia.

También hay un elemento adicional aquí: los dos enfoques para educar sobre temas de programación. Uno puede comenzar con lo más bajo posible (ejemplo de ensamblaje, en muchos lugares de procedimiento, algunos otros comienzan con circuitos) y luego subir (hacia OO / Funcional / Administrado). El otro enfoque es comenzar desde el mundo físico (por ejemplo, navegador / Windows 7, etc.) y luego comenzar a profundizar. Hay ventajas y desventajas de cada enfoque. Su universidad eligió la primera y comenzar con procedimientos. Puede haber alguna razón o simplemente copiaron a alguien más :-).

Dimitrios Mistriotis
fuente
1
"La programación OO vino a resolver problemas de programación de procedimientos". Ese era el objetivo, pero OO creó tantos problemas como resolvió.
bit-twiddler
@ bit-twiddler: Muy gran historia. Centrándose (o reduciéndolo) en el aspecto pedagógico, presenta un caso: lo que teníamos, cómo lo mejoramos: eso (usted discute si es mejor o no)
Dimitrios Mistriotis
0

No hay otra razón que la inercia institucional. Mire CMU, tiraron todo su plan de estudios de OOP y lo reemplazaron con programación funcional. Entonces, una vez más, la respuesta a su pregunta es que es una elección arbitraria hecha por los administradores de cualquier escuela a la que asista. En caso de que alguien se pregunte acerca de las declaraciones de hechos que he hecho aquí, es la publicación sobre el cambio del plan de estudios en CMU por un profesor / administrador: Enseñar FP a estudiantes de primer año .

davidk01
fuente
1
-1 engañoso: si bien vi un hilo (a través de la búsqueda de Google) que afirmaba que CMU eliminó la POO de su plan de estudios CS de primer año y lo reemplazó con programación funcional, el plan de estudios oficial de CMU comienza con el lenguaje de programación Alice, que es objeto- orientado [ver enr-apps.as.cmu.edu/assets/SOC/CS_SPRING.htm]
Steven A. Lowe
1
@ davidk01: (1) afirmación objetivamente incorrecta en la respuesta. (2) "Alice es una herramienta de enseñanza de libre acceso diseñada para ser la primera exposición de un estudiante a la programación orientada a objetos " de alice.org
Steven A. Lowe
2
@Steven A. Lowe: Directamente de la boca del caballo: "La programación orientada a objetos se elimina por completo del plan de estudios introductorio, porque es antimodular y antiparalela por su propia naturaleza y, por lo tanto, no es adecuada para un plan de estudios moderno de CS. Se ofrecerá un nuevo curso propuesto sobre metodología de diseño orientado a objetos a nivel de segundo año para aquellos estudiantes que deseen estudiar este tema ". - Enseñanza de FP a estudiantes de primer año
davidk01
1
@ davidk01: excelente enlace, gracias. Del documento del comité citado en ese artículo "Aunque la programación orientada a objetos (en sus múltiples formas) sigue siendo un tema dominante en el desarrollo de software industrial, el uso de lenguajes orientados a objetos, como Java, en el nivel introductorio introduce una complejidad considerable y distrae desde los objetivos centrales en el nivel introductorio . Parece preferible dar una cobertura más completa del diseño OO y la metodología de implementación para más adelante en el plan de estudios para permitir una concentración más centrada en lo básico en el nivel introductorio ". [énfasis mío] ...
Steven A. Lowe
1
@ davidk01: estoy feliz de aceptar estar en desacuerdo. Llámame pedante si quieres, pero para mí hay una diferencia significativa entre cambiar el énfasis del nivel introductorio y "tirar todo su currículum de OOP". Difícilmente llamaría reducir el alcance de las clases introductorias un "cambio radical" ;-)
Steven A. Lowe