¿Es imposible un buen código en el desarrollo de software moderno? [cerrado]


19

Parece que incluso las herramientas de desarrollador se han vuelto más sólidas y robustas, escribir un buen código se ha convertido en un desafío. Incluso si las herramientas son más potentes, la calidad del código no ha mejorado. Se me ocurren dos factores importantes, hay menos tiempo y los proyectos son más complejos. Debido a que las herramientas que utilizamos hoy en día son más potentes, es más fácil escribir código más complejo, pero no tener tiempo para planificar y sin mirar atrás disminuye la calidad del código y aumenta los errores y el mantenimiento. No es que no hayamos escrito código complejo antes. Es que escribimos código más complejo.

Mi pregunta es la siguiente: considerando que tenemos un lenguaje y herramientas más potentes.

  • ¿Por qué es más difícil escribir un buen código?
  • ¿Factores, tiempo y complejidad contribuyen a esto?
  • ¿Las metodologías no se practican correctamente?

El tipo de proyecto que considero es una aplicación empresarial con gran complejidad y lógica empresarial. La definición de "buen código" es individual, por favor no se quede atascado en la interpretación de "buen código".

Respuestas:


34

Como afirmaron DeMarco y Lister en Peopleware hace unos 20 años, la gran mayoría de los proyectos de software fallidos fracasan no debido a desafíos técnicos, sino a problemas sociológicos . Esto no ha cambiado en las últimas décadas, sin importar cuánto hayan mejorado nuestras herramientas.

Mala gestión, expectativas poco realistas, no conseguir a las personas adecuadas para el trabajo, y / o no dejarlos hacer su trabajo, por lo tanto, no mantenerlos; lugares de trabajo y herramientas que no son adecuados para el trabajo de desarrollo de SW; conflictos personales no manejados; la política ; Estos son solo algunos de los problemas típicos que pueden hacer que un proyecto esté condenado desde el principio.

¿Por qué escribir un buen código es más difícil?

No estoy muy convencido de que sea realmente más difícil escribir un buen código ahora que hace décadas. De hecho, en comparación con el código de máquina o el ensamblaje, todo lo que tenemos ahora en la corriente principal es mucho más fácil de manejar. Es posible que necesitemos producir más.

¿Es solo por los factores mencionados, el tiempo y la complejidad?

Sí, la complejidad alcanzable ciertamente ha aumentado (y continúa aumentando) a medida que aumenta el poder de nuestras herramientas. En otras palabras, seguimos empujando los límites. Lo que para mí se traduce de manera que es igualmente difícil resolver los mayores desafíos de hoy como lo fue hace 30 años para resolver los mayores desafíos de ese día.

OTOH ya que el campo ha crecido enormemente, ahora hay muchos más problemas "pequeños" o "conocidos" que hace 30 años. Estos problemas son técnicamente (no deberían) (ser) un desafío más, pero ... aquí ingresa la máxima anterior :-(

También el número de programadores ha crecido enormemente desde entonces. Y al menos mi percepción personal es que el nivel promedio de experiencia y conocimiento ha disminuido, simplemente porque hay muchos más jóvenes que llegan continuamente al campo que personas mayores que podrían educarlos.

¿Es que las metodologías no se practican correctamente?

En mi humilde opinión, no. DeMarco y Lister tienen algunas palabras duras sobre las metodologías big-M. Dicen que ninguna Metodología puede hacer que un proyecto tenga éxito, solo las personas del equipo pueden hacerlo. OTOH, las pequeñas metodologías que elogian están bastante cerca de lo que ahora conocemos como "ágil", que se está extendiendo ampliamente (en mi humilde opinión, por una buena razón). Sin mencionar las buenas prácticas como las pruebas unitarias y la refactorización, que hace apenas 10 años no eran ampliamente conocidas, y hoy en día incluso muchos graduados lo saben.


2
No ser una gramática nazi ni nada más que "irrealista" (en el segundo párrafo) no es una palabra. Creo que te refieres a 'poco realista'.

Solo puedo apoyar el tema "Junior". Soy uno de ellos y ciertamente desearía haber tenido un mentor que me ayudara. Es agradecido que Internet esté allí hoy, y Amazon y SO ayuden, pero aún así ...
Matthieu M.

1
+1: También es de destacar, debido al rápido cambio y crecimiento en herramientas / tecnologías / metodologías, en cierta medida todos somos juniors al menos un par de veces al año. La experiencia solo permite que algunos veterinarios se aceleren más rápido que algunos jrs.
Steven Evers

Me niego a tomar esta pregunta en serio a menos que no tengamos reglas formales para separar el código hermoso del feo.
shabunc

17

Los problemas relacionados con la codificación en plazos poco realistas y el manejo de la deuda técnica se conocen desde Weinberg '71 y también Brooks '72. La literatura se vuelve difícil de desenterrar en línea antes de eso, pero estoy bastante seguro de que hay viejos informes de CDC, IBM y NASA que dicen lo mismo.


1
+ Para "deuda técnica" y referencias.
Amir Rezaei

10

Creo que todos tenemos nuestras propias ideas y umbrales para el "Buen Código". Sin embargo, hay una serie de problemas que contribuyen todos:

  • La aplicación incorrecta de "hacer que funcione y luego mejorarlo" significa que dejamos código muerto y 10 variantes diferentes del mismo método donde cada una se usa solo una vez en la base del código. Estas cosas nunca parecen ser limpiadas.
  • Falta de tiempo y presupuesto. El cliente quiere 100 funciones nuevas en 3 meses, algunas de ellas no triviales, y no quiere gastar dinero en cosas que no puede ver directamente.
  • Falta de cuidado Seamos realistas, algunos desarrolladores se preocupan por el aspecto y el comportamiento del código más que otros. Vea el primer punto de viñeta para ver un ejemplo.
  • Realmente no sabemos cómo crear un "buen código". Mi concepto de buen código evoluciona continuamente. Lo que pensé que era bueno hace una década ya no es tan bueno.
  • "Buen código" es un juicio de valor. Aparte de "funciona", y no hay errores conocidos, cualquier otro criterio para un buen código es esencialmente una cuestión de opinión.

Al final, creo que es mejor perseguir mejor que perseguir "bueno" o "mejor". Si viéramos el mejor código, ¿lo reconoceríamos como tal?


1
+1 Buen punto. Por "buen código" no me refería al código perfecto. El código perfecto no existe. "Buen código" es un código que no te da dolor de cabeza, por ejemplo, está bien pensado.
Amir Rezaei

1
Excelente punto sobre "buen código" como objetivo móvil. Sin embargo, no estoy de acuerdo con que sea solo un juicio de valor. Creo que el código limpio es más fácil de probar, extender y mantener que el código desordenado, por lo que es mucho más barato a largo plazo. Por supuesto, dado que normalmente no realizamos pruebas doble ciego con grupos de control en proyectos de SW reales ;-), solo hay evidencia anecdótica de esto, no hay pruebas científicas sólidas.
Péter Török

Parece que nuestras dos definiciones actuales de "buen código" están de acuerdo. Sin embargo, he visto algunos ejemplos bastante estelares de buen diseño de API que me hicieron la vida mucho más fácil, pero la biblioteca no tenía pruebas unitarias. Eso no significa que no se haya probado, simplemente no había nada para automatizar las pruebas. Estoy dejando espacio para eso.
Berin Loritsch

8

¿Por qué escribir un buen código es más difícil?

Porque el software se está construyendo cada vez más sobre capas de abstracción. Cada nueva tecnología que pretende hacer que el desarrollo sea más fácil y rápido solo agrega un nivel más de complejidad que un desarrollador necesita comprender. Ahora, esta abstracción puede tener un gran beneficio para la productividad, pero si no comprende lo que intentan ocultar, hace que el software sea más susceptible a errores y mala calidad.


+1 Muy buen punto, las nuevas herramientas aumentan la productividad, lo que puede conducir a una mayor complejidad.
Amir Rezaei

1
+1. También conocida como la "Ley de las abstracciones permeables". :)
Bobby Tables

6

¿Es imposible un buen código en el desarrollo de software moderno?

De hecho, no es posible. Pero no por ninguna de las razones que ya has escuchado.

El alcance de la gran mayoría de los proyectos va mucho más allá de la capacidad de un cerebro humano. Es por eso que a las personas se les ocurrió la idea de la abstracción , es decir, seguir ocultando detalles y subir más alto el árbol de abstracción hasta que la densidad de las ramas (cantidad de información a manejar) disminuya a un ritmo aceptable.

Hemos hecho eso, hemos resuelto el problema de complejidad, pero eso no ha eliminado el problema más grande que teníamos antes.

Todavía es demasiado complejo para nosotros manejarlo.

Para crear una solución de alta calidad, necesitamos poder ver y comprender simultáneamente todo, al mismo tiempo, es decir, todos los módulos con detalles de implementación grandes y pequeños. De una vez para ver las discrepancias, vea cada parte del código en el contexto de todos los escenarios posibles y optimice toda la base del código al mismo tiempo.

Nunca podremos hacer eso.

Y si no podemos, nunca produciremos código de calidad.

Los gerentes verán la combinación de módulos, pero no conocerán los problemas internos y las limitaciones por módulo.

Los programadores de módulos conocerán las limitaciones locales, pero no podrán optimizarlo en el contexto de una imagen más amplia.

No hay forma de comunicar el entendimiento entre gerentes y programadores (e incluso entre programadores). E incluso si existiera, la capacidad del cerebro humano no podría manejar eso.

Hay poco que podamos hacer excepto seguir intentándolo (un ejercicio inútil). Simplemente mantengamos el código más o menos operativo y disfrutemos de la vida.


Me gusta esta respuesta, si no estuviera escrita en un tono tan pesimista y fatalista ...
Timwi

1
@Timwi: No pesimista realmente. Se suponía que debía traerte un alivio de la carga. :)

4

Niego la premisa de tu pregunta. Es más fácil que nunca escribir un buen código, y por eso estamos abordando problemas mucho más difíciles de lo que hemos abordado antes.

No quiero elegir ningún proveedor en particular, pero compare Windows 1.0 con Windows 7. Este último contiene miles de veces más código, pero el tiempo medio entre bloqueos se ha multiplicado por cien. Se supone que podemos incrustar una hoja de cálculo de Excel en un documento de Word desde Windows 3.1, pero en estos días realmente funciona más o menos.

Sin querer caer en el sentimentalismo de "Ustedes, niños hoy en día con su tipo de pato y VM", sugeriría que no tienen idea de lo difícil que fue escribir un buen código en los años 80: modelos de memoria TINY, SMALL y HUGE, superposiciones , llamadas de sistema operativo no rentista (estremecimiento). Buen viaje a todo eso.


Odio salir del tema, pero personalmente diría que Windows 1.0 a 3.11 en realidad eran muy estables, debido presumiblemente a su falta de complejidad. Las versiones más caídas de Windows fueron 95, 98 y ME. Por supuesto, qué versiones eran "buenas" de otras maneras es una cuestión diferente.
Timwi

¿Qué pasa con la codificación en minicomputadoras o mainframes en lugar de sistemas de baja potencia? Los problemas a los que hace referencia están relacionados con el modelo Intel 8086 ...
Paul Nathan

@Paul, los problemas de 8086 fueron los que más me involucraron, por lo que me parecen importantes. Sin embargo, las herramientas para escribir software incluso en mainframes eran increíblemente rudimentarias según los estándares modernos. Los editores generalmente estaban más cerca de edlin que de emacs. Ya en 1982 estaba usando NUROS (Nebraska University Remote Operating System) en el hardware de IBM. Los trabajos fueron programados y ejecutados usando tarjetas perforadas 'virtuales'. Y no olvidemos los errores Y2K, en su mayoría engendrados en hierro grande por las limitaciones percibidas en el almacenamiento.
Charles E. Grant

2

Las aplicaciones modernas son más complejas que hace 20-30 años, porque su entorno es más rico y versátil.

Era típico que un programa DOS se sentara en un bucle cerrado esperando la siguiente pulsación de tecla del usuario, y luego invoque el código correspondiente, y vuelva a esperar la próxima pulsación de tecla.

Cualquier aplicación moderna en la que no pueda usar el mouse para nada, tiene un serio problema de explicación. Y las cosas pueden suceder en cualquier orden, ya que es perfectamente posible que el usuario escriba, haga clic con el mouse y continúe escribiendo mientras se actualizan las fuentes RSS en la aplicación que muestra las entradas más recientes para el usuario mientras escribe.

Todas estas cosas multitarea son intrínsecamente mucho más complejas que cuando todo lo que tenía que pensar eran las claves del usuario. Eso hace que sea más difícil escribir un código realmente bueno.

Con suerte, cuando los investigadores hayan descubierto cómo podemos hacer que los programas multitarea sean más utilizables desde el punto de vista de los desarrolladores, esto puede facilitarse, pero por ahora estamos atrapados con todos tratando de hacerlo bien, pero sin saber exactamente cómo hacerlo. eso.


+1 "Las aplicaciones modernas son más complejas de lo que eran hace 20-30 años"
Amir Rezaei

2

Me parece que el software se ha expandido para llenar la velocidad del procesador disponible, la memoria, el disco y el tiempo del programador. Se podría afirmar que eso se debe a que el software logra mucho más. Bueno, estoy seguro de que logra mucho más, pero no lo suficiente como para justificar la hinchazón.

Creo que hay una antigua ley de la ciencia que vale la pena recordar:

La naturaleza aborrece el vacío.

Francois Rabelas (monje y satírico francés 1494-1553)


1

De hecho, creo que se ha vuelto más fácil escribir un buen código, es decir, programas que funcionan según lo esperado y que se pueden mantener durante la última década. Las herramientas disponibles son mejores ahora, las bibliotecas son más maduras y completas, el hardware se ha vuelto mucho más rápido, por lo que no tenemos que usar trucos de optimización.

Entonces, ¿por qué no lo hacemos?

En mi opinión, la razón principal es que constantemente buscamos formas y excusas para abusar de las cosas. En lugar de seguir el camino antiguo, fácil y probablemente aburrido, como crear un ejecutable de Windows, empujamos los límites de lo posible y buscamos formas de, por ejemplo, recrear algo como PhotoShop como una aplicación web. ¿Por qué? Porque podemos. O al menos eso creemos.


1
No estoy de acuerdo con la implicación de que se debe evitar la innovación y que las tecnologías o métodos anticuados nunca deben quedar obsoletos. También podría dejar de escribir cualquier programa y usar lo que tenemos ...
Timwi

Timwi: No estoy argumentando en contra de la innovación. Es solo la razón por la que parece tan difícil escribir un buen código.
user281377

1

¿Cuándo fue la última vez que ALGUIEN no escribió una hazaña o no estudió para hacerlo? ¿Cuántos errores se han descubierto en las bibliotecas principales de C? Casi ninguno y unos pocos. Todo lo que digo es que las personas son capaces de tener un código excelente. Las mejores herramientas e idiomas lo hacen menos 'requerido' y más 'opcional'. No es que piense que todos deberíamos escribir un código realmente horrible, pero cuando pienso en construcciones lógicas complicadas ... nadie habría soñado con escribir algo con matrices hash en ensamblado. Tenía que haber una 'mejor' forma de manejar la lógica en lugar de usar una construcción complicada. Incluso si el código es hermoso, a veces el enfoque no es tan elegante. Creo que resuelve el problema que mencionaste. Un buen código no siempre está organizado,


Los chicos del sistema embebido escriben una cantidad decente de ensamblaje.
Paul Nathan

@Paul Nathan True
RobotHumans

0

Creo que se debe a que mejores herramientas y computadoras más rápidas y con mayor capacidad de respuesta significan que esperamos obtener mucho más tiempo de complejidad de producto final por unidad de lo que obtuvimos hace unos años (o algunas décadas). Por lo tanto, la complejidad de las aplicaciones sigue aumentando y nuestras suposiciones sobre qué nivel de productividad razonable sigue creciendo.

Donde trabajo, los desarrolladores siempre tienen prisa (porque siempre hay más cosas que los clientes desearían de las que tienen tiempo). Por lo tanto, se copian muchos bloques de código con una edición mínima y sin el esfuerzo realizado para comprenderlos realmente. Y, por supuesto, se cometen errores. Acabo de ver que se solucionó un error, en el que un desarrollador había copiado un código que había optimizado, sin darme cuenta de que las suposiciones que hacían válida la optimización no eran ciertas en el lugar donde lo estaba colocando.

Todo esto se reduce a las expectativas, tanto internas (nuestras propias expectativas) como de nuestras organizaciones. Intentamos hacer todo lo posible en el menor tiempo posible. Y los errores inevitablemente resultan.

Además, la capacidad de respuesta de la computadora fomenta una edición rápida y rápida, luego una ejecución de compilación y prueba. En los viejos tiempos (como hace 35 años), el tiempo de respuesta era tan lento que imprimía el código (la fuente era las tarjetas perforadas en ese momento) y hacía un paso manual del código antes de enviar mi mazo. Ahora, simplemente editamos compilar y ejecutar. Entonces, muchos errores que habríamos detectado, a través de un recorrido de código metódico, ahora contamos con el compilador y / o el conjunto de pruebas unitarias para detectar.


Suena como una empresa joven que aún no se ha enterado de que lo más barato lo está haciendo bien la primera vez ...

Thorbjorn: Sorprendentemente, ha existido durante casi tres décadas. Y en realidad lo está haciendo bastante bien. Por supuesto, hay modelos de negocio que responden muy bien a las solicitudes de los clientes (nosotros), y algunos que están muy orientados a la calidad. Es realmente difícil ser ambos.
Omega Centauri

0

¿Cómo han empeorado las personas para producir un buen código?

Si se toma .NET y un lenguaje como C #, por ejemplo (y me doy cuenta que no es la única plataforma / idioma), yo diría que la codificación también se ha convertido en mucho, mucho más fácil debido a la automatización de muchas cosas dentro del Visual Studio ambiente.

En todo caso, el simple hecho de que ahora tenemos IDE muy sofisticados capaces de guiarnos a través del proceso de codificación y desarrollo hace que sea más fácil lograr un "buen código".

Los programadores ahora pueden enfocarse en producir una buena estructura en lugar de pasar tanto tiempo simplemente escribiendo corchetes y llaves y nuevas líneas y recordando llamadas a métodos y nombres de clases.

Mis dos centavos.



-2

la calidad del código no ha mejorado

por favor no te quedes atascado en la interpretación de "buen código"

Gran tautología lógica.

El código no mejora porque la gente sigue moviendo la definición de "bueno".

Si puede "discutir un buen código", entonces no puede comparar y realmente no puede decidir si es "un desafío" o no.


Para mí, "buen código" es tal que disminuye el número de errores. Ahora eso se puede lograr de muchas maneras.
Amir Rezaei

@Amir Rezaei: "La definición de" buen código "es individual". "'buen código' es tal que disminuye el número de errores". Elija solo una definición y actualice su pregunta para incluir solo una definición.
S.Lott

Bueno, "buen código" es tal que disminuye el número de errores "es mi idea personal de" buen código ". Creo que todos saben cuándo el proyecto necesita limpieza o no .
Amir Rezaei

@Amir Rezaei: Este es mi punto. Si no puede (o no quiere) definir "bueno" en la pregunta, entonces no podemos comparar. Puede reclamar que la cantidad de errores es la misma. Alguien más puede afirmar que el costo de los errores disminuye. Otro puede afirmar que aumenta el riesgo comercial debido a la planificación de errores. Sin una sola definición de "bueno", todos podemos hablar de cosas diferentes. Por favor actualice la pregunta.
S.Lott

Buen Código: compiló, pasó las pruebas, recibió la aprobación del usuario y se puso en producción. Solo espero que nadie quiera cambiarlo.
JeffO
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.