¿El paradigma de programación orientada objetada está desactualizado ya que es antimodular y antiparalelo? [cerrado]

23

He leído el controvertido artículo Teaching FP to freshmen publicado por Robert Harper, profesor de CMU. Afirmó que CMU ya no enseñaría programación orientada a objetos en el curso introductorio, ya que es "inadecuado para un plan de estudios CS moderno".

Y afirmó que:

La programación orientada a objetos se elimina por completo del plan de estudios introductorio, porque es tanto antimodular como antiparalelo por su propia naturaleza.

¿Por qué considerar OOP como antimodular y antiparalelo?

xiao
fuente
14
Buhwaaaah ?! OO hace que la modularidad y el paralelismo sean más fáciles que en procedimientos y no es mutuamente exclusivo de FP. Coloreame confundido.
Matt Ellen
44
Han rediseñado su plan de estudios para que tenga que vender el nuevo programa y está haciendo afirmaciones audaces respaldadas sin absolutamente ningún dato. No hay evidencia de que los programas funcionales complejos sean más paralelos o modulares que sus contrapartes OOP.
davidk01
44
@ Matt Ellen: OOP es decididamente excluyente con FP. FP se basa en varios conceptos clave, uno de los cuales es la ausencia de estado mutable. OOP se basa en la existencia de un estado mutable cuyo acceso se controla envolviéndolo en "objetos". El estado mutable y el estado inmutable son mutuamente excluyentes prácticamente por definición. Sí, es cierto que puede programar en un estilo funcional con muchos lenguajes OOP, pero esto no es lo mismo que usar un lenguaje FP. Y sí, es cierto que no todos los lenguajes FP son puros. Sin embargo, esto no significa que FP sea compatible con OOP.
SOLO MI OPINIÓN correcta
2
@JUST: Tengo una idea diferente de exclusividad mutua para ti. Veo FP pura e impura como subconjuntos de FP, por lo que OOP no se excluye mutuamente de FP si se supone que la mutabilidad es esencial para OOP. Además, no estoy de acuerdo con que la mutabilidad sea esencial para la POO. Podrías lograr un sistema completamente OO usando el paso de mensajes y nunca mutar nada.
Matt Ellen

Respuestas:

30

Tenga en cuenta que las necesidades de Harper para enseñar una clase introductoria de currículo de CS son muy diferentes de las necesidades de un proyecto de la vida real . Su trabajo es enseñar conceptos fundamentales (por ejemplo, modularidad, paralelismo, inducción) a estudiantes de primer año. Como tal, es muy importante que el lenguaje (y paradigma) elegido pueda expresar estos conceptos con la menor ceremonia (sintáctica y conceptual) posible. La familiaridad, el soporte de herramientas, las bibliotecas disponibles, el rendimiento de ejecución, etc. son completamente irrelevantes en este contexto. Así que tenga esto en cuenta al considerar lo siguiente ...

La opinión de que OO es antimodular resulta de la gran cantidad de dependencias de otras clases, incluso los objetos de clases bien diseñadas tienden a terminar. Que esto es un problema, incluso a los ojos de los defensores de OO, se hace evidente cuando se observa la proliferación de marcos , artículos, libros y publicaciones de blog de Dependency Injection en los últimos años (también es interesante el aumento de simulacros y trozos).

Otra pista es la importancia de los Patrones de diseño y la complejidad de implementarlos, en comparación con otros paradigmas de programación, por ejemplo, Fábricas, Constructor, Adaptador, Puente, Decorador, Fachada, Comando, Iterador, Mediador, Observador, Estrategia y Método de plantilla y tal vez los compuestos están relacionados de alguna manera con la mejora de la modularidad del código OO.

La herencia también es problemática (por ejemplo , un problema de clase base frágil ) y el polimorfismo (subtipo) seduce a uno para que derrame la implementación de un algoritmo entre varias clases, donde los cambios pueden afectar toda la cadena de herencia (¡arriba y abajo!).

El cargo de ser antiparalelo está relacionado con el énfasis del estado en comparación con el cómputo (también conocido como mutabilidad vs. inmutabilidad). El primero hace que sea más complicado expresar dependencias de subcomputaciones (¡lo cual es la toma de paralelismo de Harper!), Ya que generalmente no se puede inferir desde la ubicación donde se administra el estado (también conocido como el archivo, donde se declara la variable de instancia) qué actores externos lo cambiará en qué punto del tiempo.

El énfasis en la inmutabilidad y la computación hace que la expresión de dependencias de subcomputaciones sea mucho más fácil, ya que no hay administración de estado, solo funciones / computaciones que se combinan en el lugar donde desea expresar las dependencias de subcomputaciones.

Alexander Battisti
fuente
10
Las afirmaciones de paralelismo del campo funcional a menudo son exageradas. Los compiladores para lenguajes funcionales funcionan con una teoría fundamental más limpia, por lo que los implementadores tienen más formas de reorganizar el código antes de que se convierta en código de máquina, pero esto no significa que si le da a los programadores de OO las abstracciones adecuadas para el paralelismo, no podrán para escribir código paralelo limpio. Hasta ahora, los programadores de procedimientos solo han obtenido bloqueos e hilos y creo que lo han hecho bastante bien con esas herramientas.
davidk01
2
Aunque generalmente estoy de acuerdo con todo lo que dices aquí, me gustaría señalar que los patrones de diseño vienen en todos los paradigmas de programación. Para la programación funcional, señalaría cosas como mónadas y map / reduce.
Anm
@ davidk01 Take Go, por ejemplo. Es compatible con la programación orientada a objetos y tiene grandes primitivas de concurrencia. Más importante aún, realmente está despegando para la programación concurrente sin ser puramente funcional.
weberc2
19

Probablemente sea una afirmación audaz, pero de alguna manera sospecho que este Robert Harper nunca escribió un software real en su vida. Todo lo que parece preocuparse es ML y sistemas de tipo estático. Tan grande como podría ser esa contribución, no veo cómo sus afirmaciones sobre la OOP tienen relevancia.

Este artículo no es controvertido. La controversia implica examen, discusión y discusión. Lo que tienes aquí es un académico ignorante que presenta dos acusaciones bastante fundamentales en una sola declaración, sin molestarse en proporcionar ningún argumento.

  1. La afirmación de que OOP es antimodular es una tontería. Ni siquiera sé cómo responder, no solo no se proporcionaron argumentos, sino que también el diseño orientado a objetos es un enfoque para establecer la modularidad con un acoplamiento muy bajo entre módulos individuales a través de encapsulación y abstracción.

  2. Afirmar que la POO es antiparalela solo demuestra una falta de comprensión. OOP no bloquea ninguna decisión sobre concurrencia. OOP solo dicta ocultarlos: si se construye correctamente, no se puede decir si la implementación de un objeto es paralela o no.
    Así, en última instancia, la programación orientada a objetos y la programación paralela son ortogonales. El modelo de actor es un modelo elegante de concurrencia que puede reflejarse directamente en un sistema de objetos (pero no necesariamente), produciendo una combinación formidable de ambos.

El problema con OOP es que pocas personas realmente lo entienden en el sentido en que Alan Kay lo definió.

  1. OOP es un enfoque. En algunos lenguajes se implementa usando patrones, en otros puedes usar directamente modismos de lenguaje integrados (por ejemplo, Ruby, Objective-C, Smalltalk, Io ).
  2. Contrariamente a la creencia común, OOP no se trata de clases. Se trata de objetos y los objetos son sobre el paso de mensajes o una forma de encapsulación y abstracción igualmente sin fugas.

Es por eso que Java es para OOP lo que los palos puntiagudos son para el combate naval. Esto también es cierto para muchos otros llamados "lenguajes OOP", pero lo que pasa con Java es que parece ser una creencia común en las universidades, que Java debería usarse para enseñar OOP.

Estoy de acuerdo con todos aquellos que piensan que las introducciones a OOP con Java deberían eliminarse de los currículos de CS. También creo que las personas que claramente carecen de una comprensión fundamental de la POO no deberían enseñarla. Por lo tanto, probablemente sea mejor si Bob se adhiere a ML para sus cursos y simplemente enseña lo que tiene una comprensión firme.
En este momento, OOP es más una etiqueta de moda, que a la gente le gusta adherirse a todo. Esto perjudica a OOP y dijo la gente. OOP no está desactualizado. Edad de oro de programación orientada a objetos está aún por venir, cuando la gente finalmente se entienden de qué se trata lo que es no sobre (por ejemplo, la solución de todos los problemas posibles mediante el uso de la palabra clave class500 veces).

back2dos
fuente
1
+1 para pasar mensajes y +1 para 'con Java'. Desafortunadamente, si eliminaron Java, simplemente lo reemplazarían con C # y continuarían con su legado.
gbjbaanb
@ back2dos +1 para los críticos, -1 para Java. Seguramente, Smalltalk es "mucho más OO" que Java, pero ¿quién lo usa? Objective-C es difícil para principiantes como lo es C.
maaartinus
@maaartinus: encontrará que Squeak es ampliamente utilizado en el área educativa y académica, si eso responde a su pregunta. También en cuanto a Java: puede que te guste, a mí no. Al igual que el café, es una cuestión de preferencia personal y no tiene sentido discutir eso. Sin embargo, Java no es adecuado para una introducción a OOP es, en mi humilde opinión, una implicación innegable de la naturaleza de Java y el concepto de OOP y eso es exactamente lo que dije. La popularidad de Java no hará que eso desaparezca. En cuanto a C, le sugiero que lea joelonsoftware.com/articles/ThePerilsofJavaSchools.html .
back2dos
@ back2dos Squeak puede usarse en estas áreas, pero en la universidad he aprendido ML. Ambos son igualmente inutilizables en la industria y ambos valen la pena aprender, debido a sus conceptos. El artículo puntiagudo es el peor artículo de Joel que he leído, es demasiado largo y, a primera vista, el mensaje parece ser la importancia de lidiar con segfaults. : D Realmente sugeriría Java para enseñar OOP.
maaartinus
@maaartinus: Lo que aprendiste en la universidad importa poco en la pregunta de qué se debe enseñar . Todavía no diste razones por las que uno debería usar Java para enseñar POO, mientras que yo di lo que considero una razón bastante sólida por la que no hacerlo. También, obviamente, no entendiste la esencia del artículo: las personas que no pueden hacer frente a problemas tan difíciles como C no deberían estudiar CS en primer lugar. Creo que CS no debería ser simplificado a lo que cada niño al que le gustan las computadoras puede entender. Si no podemos estar de acuerdo en eso, entonces una discusión adicional es una pérdida de su tiempo y el mío.
back2dos
12

Tienes fanáticos de cada raya.

La programación orientada a objetos no es una bala de plata. Nunca fue Lo que es, es una víctima de la exageración. Inevitablemente, las personas se cansan de la exageración y comienza a desarrollarse una reacción violenta (independientemente de la utilidad real del paradigma).

Dentro de veinte años, sin duda, tendremos alguna otra reacción contra la programación funcional.

Frank Shearar
fuente
1
Ya lo hay!
quant_dev
1
++ "Obtienes fanáticos de cada raya". Yo era un académico, y mi experiencia fue esta . A los académicos les encanta decir opiniones provocativas, impresionando quizás a sus estudiantes.
Mike Dunlavey
5

No puedo responder a esta pregunta en su totalidad porque uno solo puede adivinar los vagos pensamientos de su autor. Sospecho firmemente que este artículo está a punto de causar cierta vergüenza a su autor. No hay nada sobre OOP que sugiera que no sea modular ni paralelo:

Modularidad : una faceta importante de OOP es que es modular (pero modularidad significa cosas diferentes en diferentes contextos). Entonces, independientemente de si el autor está hablando de generalización o programación estática, él es incorrecto.

Paralelismo : en cuanto a la programación paralela, la mayoría de los frameworks han admitido interrupciones y luego subprocesos y ahora una paralelización adecuada, como lo que vemos en .Net framework 4.0 y los lenguajes OOP que se atornillan.

Sospecho que el autor se ha convertido en una víctima de la moda, ya que existe una idea errónea de que la programación funcional y la OOP son mutuamente excluyentes en el uso. Hay estilos funcionales en los lenguajes OOP que están bien documentados, por ejemplo, Oliver Sturm ha publicado en esta área.

CarneyCode
fuente
4

El autor sostiene que OOP es demasiado difícil de entender para los programadores de primer año, lo cual puede ser cierto, aunque lo dudo, dados los requisitos de entrada para CMU. Las declaraciones antimodulares y antiparalelas pueden ser ciertas en un contexto limitado en comparación con los lenguajes puramente funcionales, pero no son una condena de todo el paradigma (que parece funcionar bien para aquellos que saben cómo usarlo).

El plan de estudios propuesto enseñaría programación funcional en una clase, programación imperativa (de procedimiento) en otra clase y estructuras de datos en otra clase. Una vez que un estudiante de primer año ha dominado estas 3 cosas, él / ella debe estar listo para aprender OOP.

Personalmente, creo que es exagerado, pero a los académicos les gusta probar cosas nuevas y extremas. Como contrapeso, el MIT solía (y aún podría) enseñar todos los principales paradigmas de programación en una clase de primer año.

Por extraño que parezca, ambas escuelas han producido algunos programadores realmente buenos. Imagínate.

Steven A. Lowe
fuente