¿Los programadores de Unix (y todas sus variaciones) piensan que escriben código obtuso?

¿Por qué piensan eso? Porque los programadores * hacen * escriben código obtuso. Cuando aprendí C por primera vez, la compañía que aprendí usó cosas como una función llamada m () para asignar memoria. Eso, como algunas de sus otras cosas, era críptico y con errores. Fue enloquecedor tratar de analizar qué prácticas válidas y razonables y qué no tenía sentido. Venía de un fondo de PL / 1, Fortran, Pascal, Modula 2, variantes BASIC y 6502 y 8086 Assembler. C era algo extraño para mí, pero estaba claro para mí que su código tenía problemas.

Hay una variedad de razones por las cuales los desarrolladores escriben código difícil. Es algo terrible, pero la mayoría de ellos son malos.

El problema que intentan resolver puede ser inherentemente complejo. Existen modismos que, aunque son de aspecto extraño, no presentan dificultad para los expertos en el área.

En algunos casos, hay problemas de rendimiento o recursos que requieren un código bastante brutal para superarlos. Veo muchas travesuras y código de aspecto desagradable en las fuentes de C para cosas como la criptografía. En algunos casos en el pasado he investigado y, de hecho, el código feo superó a los equivalentes más bonitos.

A veces, si el lenguaje está en un nivel superior, el programador sabe que ciertas construcciones son recursos innecesarios y hace un poco de código feo para solucionarlo.

No ‘arreglas’ el código que no está roto. Gran parte del código mundial se escribió hace mucho tiempo cuando sabíamos menos sobre programación que ahora. Todo, desde la CPU hasta el compilador hasta el programador, no era lo que podía ser. Sin embargo, incluso si el código es feo, si funciona (incluso lo suficiente) se deja como está. Alguien tiene que gastar los recursos para escribir código y hacer que el código feo sea bonito es difícil de vender a las personas que pagan las cuentas.

A veces, la cantidad de ‘refactorización’ necesaria para hacer que el código sea más razonable es simplemente demasiado onerosa. Encontrará fragmentos de código que hacen cosas que pertenecen a otro lugar pero que requerirían demasiada alteración de otro código. Esto es particularmente cierto para el código que se encuentra en mantenimiento. Un programador de mantenimiento puede estar atascado escribiendo código tortuoso para evitar un error cuyo síntoma comprende pero cuya causa no comprende. Si un sistema de producción no funciona, no siempre tiene el tiempo para hacer que el código de lote se vea hermoso. Si tiene que hacer funcionar un sistema por la mañana, a veces tiene que poner un código feo en su lugar.

A menudo, a medida que desarrolla el código, hace una especie de ‘fuerza bruta’ para hacer lo que funcione con la intención de volver a refinar más tarde. Los programadores de Journeymen tienden a ser más jóvenes y su memoria de trabajo a corto plazo está en su apogeo. Cuando están inmersos en una tarea y codifican sobre la marcha, pueden hacer cosas como:

if (((a> 2) && (y <a)) || ((a y)) ||! z)

Para mí, eso es un poco desagradable para destruir el cerebro y un lugar donde buscaría insectos. Sin embargo, si ha pasado las pruebas y demasiado depende de ello, es posible que deba abandonarlo.

A veces, está codificando alrededor de un cuerpo de código de ‘caja negra’ que requiere encantamientos grotescos para funcionar correctamente.

La experiencia en la materia y la experiencia en programación no siempre residen en la misma persona. Una gran cantidad de código escrito por académicos no es una muy buena programación, pero realiza tareas complejas que son difíciles de seguir para un programador ordinario.

Una de las peores razones por las que el código es, digamos, ‘retorcido’ es para satisfacer la vanidad del programador. He visto un montón de código que el programador creía que era inteligente, lo cual es desagradable. Si quieres ver un código tan horrible que es hermoso, ve aquí: El Concurso Internacional de Código C Ofuscado

El efecto Dunning-Kruger (efecto Dunning-Kruger) significa que hay algunos codificadores bastante horribles que se imaginan mucho mejor de lo que son. Crean un código irremediablemente roto y simplemente son demasiado inexpertos para reconocerlo.

Podría seguir, pero espero que entiendas la idea.

Huh Soy principalmente un chico * nix. Solo siento que quiero decir algo. En mi humilde opinión, creo que nosotros, incluida casi toda la comunidad de software de código abierto, especialmente la comunidad de Linux, parece que lo hacemos desde la perspectiva de las personas que no son unix. Es porque muchos de nosotros admiramos a este tipo https://en.wikipedia.org/wiki/Li … que escribió Linux y Git y dijo

Soy un bastardo egoísta, y nombro todos mis proyectos por mí mismo. Primero ‘Linux’, ahora ‘git’. La página del manual describe a Git como “el rastreador de contenido estúpido”. En el archivo Léame del código fuente, elabora un poco más. – de https://en.wikipedia.org/wiki/Git_(software)

Entonces, como puede ver, * nix world sigue a los líderes como Linus y generalmente no les importa cómo piensan los laicos del mundo exterior sobre ellos y su trabajo. Los extraños tienden a creer que los programadores de * nix usan lenguajes extraños como C / C ++, awk y yacc para escribir código, mientras que los de * nix piensan que su código es la cosa más hermosa.


Bueno, la parte anterior de mi respuesta fue abordar directamente la pregunta original en lugar de tratar de persuadir a la audiencia no técnica * los programadores nix no escriben código “obtuso”.

Los buenos programadores en Unix (y todas sus variantes) y todos los sistemas operativos similares a Unix (como Linux) no escriben código obtuso ilegible la mayor parte del tiempo, aunque a veces lo hacen por una buena razón. Los lenguajes de programación como C / C ++ y otras utilidades de Unix como awk, yacc y muchos otros, no son raros ni extraños en absoluto; son muy potentes, manejables y agradables de usar. Después de que los principiantes ingresen al mundo * nix, disfrutarán de la codificación y amarán el código escrito por otros buenos programadores * nix. Una vez que se vuelven muy eficientes, y cuando ven algún código “obtuso”, incluso intentarán mejorar su legibilidad. Allí, la pregunta original no se convierte en un problema.

Algunos comentarios también lo aclararon. Aquí están para compartir.

[Paul Ryan]

C es el lenguaje más hermoso debido a su simplicidad y poder. Linux es como una pintura de Picasso. Si tienes la oportunidad de ir al museo Picasso (creo que en Barcelona) verás la progresión de su arte. Los primeros trabajos te sorprenderán, ¡porque el tipo era un pintor realmente bueno! Hay retratos de reyes y reinas, y cosas así. A medida que avanzas por el museo, ves que su arte cambia a medida que acepta más influencias y descarta ideas antiguas. Entra en períodos de fijación, como su “Período Azul”, donde todas sus pinturas están en tonos de azul. Finalmente, pinta los tipos de imágenes que conocemos como “A Picasso”; damas con 7 dedos, etc. Así que eso es Linux.

Los programadores son súper inteligentes y divertidos, muchas cosas son graciosas, como yacc, que significa Yet Another Compiler-Compiler. Provenía de una era en la que los idiomas eran nuevos y emocionantes y cambiaban todo el tiempo (¿suena familiar?) Y las personas “rodaban sus propios” idiomas y creaban analizadores para tareas personalizadas. El vernáculo “Otro más” se lleva a cabo a través de varias herramientas.

Nombrar un programa que “gits” (como dirían los antiguos westerns) y que es una broma autodespreciativa es típico de las personas inteligentes. Las personas inteligentes rara vez se preocupan por cómo les suenan a “laicos”

Y

[Ben Kelly]

C, C ++ y yacc son herramientas estándar y convencionales, apenas extrañas y ampliamente utilizadas en todas las plataformas, aunque yacc es bastante especializado.

Edición 1: se agregó la segunda parte de la respuesta. Gracias por esos excelentes comentarios.

Edición 2: se actualizó la respuesta porque la pregunta original se cambió para mejorar.

Los lenguajes de programación modernos (no solo Unix) son concisos. Los programadores no quieren que sus mentes se distraigan de lo que intentan lograr con su programa. Eso significa que no quieren tomarse un tiempo para aclaraciones adicionales. Aunque la mayoría de nosotros usamos variables bien nombradas y sangría para aclarar el anidamiento, hay muy pocos comentarios en nuestro código.

Esto tiende a hacer que el código resultante sea ilegible. Recuerdo un editor de líneas de pedido (creo que era EMACS) donde podía escribir su nombre como un comando, solo para ver qué hacía.

Por otro lado, hubo un experimento con un lenguaje que debía ser legible para todos. Se llamaba COBOL. La programación en ella fue un dolor. Era demasiado engorroso desperdiciar líneas y líneas de código en cosas como la “División de ID”, y parecía que estabas codificando en “baby talk”. Y cuando todo estuvo dicho y hecho, solo otro programador pudo leer un programa COBOL. El intento de hacerlo accesible para todos fracasó.

Los idiomas concisos modernos son mucho mejores. ¡Incluso si no puedo leer nada más que las expresiones regulares más básicas! 😉

¿Obtuso comparado con qué?

Seriamente; cuando los requisitos son complejos, también lo debe ser el código, no importa cuán elegante sea el lenguaje.

Los diferentes idiomas se adaptan a diferentes propósitos, y lo que es elegancia en Python puede ser ridículo en Perl y obtuso en C.

Escribir algo simple es fácil. Y también lo está rompiendo. Si no desea que se rompa si alguien respira de manera incorrecta cerca de él, debe tener en cuenta los casos de borde, los casos de esquina, los cisnes negros, los comodines y las galletas. Y eso agrega complejidad.

Si quieres un código no obtuso, prueba Scratch. Simplemente no esperes escribir tu controlador de gráficos en él. Y a aquellos que han escrito sus controladores de gráficos realmente no les importa si piensan que su código es obtuso, solo que funciona.

En términos generales, hay dos filosofías importantes que compiten en el desarrollo de software en términos de estilo, y cada una cree que los adherentes a la otra filosofía escriben tontamente código feo e insostenible. En realidad, ambos grupos están escribiendo una gran cantidad de código feo e imposible de mantener, porque ninguna ideología es universalmente apropiada. En aras de la discusión, categorizaré una filosofía como el estilo UNIX (aunque se aplica a personas decididamente no UNIX como los desarrolladores de DOOM y la comunidad Scheme) y la otra filosofía como el estilo Java (aunque se aplica a personas decididamente no Java como los diseñadores de ADA y la comunidad Common Lisp).

La tendencia central del estilo UNIX es el minimalismo. Son deseables pequeños fragmentos de código que sean totalmente independientes y poderosos dentro de estrictas restricciones. Si se pueden omitir características o caracteres, deberían serlo. Los programas deben redactarse teniendo en cuenta la eficiencia, incluso si nunca serán parte de la ruta crítica, y sus nombres siempre deben abreviarse. La suposición subyacente es que un programa probablemente se escribirá con vi clásico o se escribirá en la línea de comando, por lo que es importante mantener las cosas compactas para que quepan en un terminal 80 × 25. Bien hecho, esta filosofía conduce a algo así como el moderno entorno de shell Unix de zsh; en el extremo, esto lleva a un código pequeño pero incomprensible: archivos C de 4 kilobytes con nombres de variables de una sola letra, sin líneas nuevas y bloques solo delimitados por llaves cuando ANSI C. lo requiere

La tendencia central del estilo Java es el maximalismo. Los identificadores deben ser lo más descriptivos posible, incluso si esto hace que usarlos sea realmente incómodo. Cualquier línea que pueda ser confusa para un programador principiante que no esté familiarizado con la base de código debe comentarse, incluso si ese comentario no proporciona ninguna información útil. Los objetos son buenos y deben usarse; la herencia es buena, y el estilo apropiado es tener múltiples niveles de clases abstractas que se vuelven cada vez más específicas hasta que tenga una clase concreta cuyos objetos sean casi completamente inútiles fuera de las circunstancias específicas para las que fueron construidos. Si los objetos necesitan ser utilizados para otra cosa, haga una clase de contenedor. La suposición subyacente es que el código se editará usando un IDE moderno con todas las funciones en una computadora nueva con especificaciones maximizadas, por lo que podemos permitir que los identificadores sean arbitrariamente largos (nunca necesitará escribirlos debido a la autocompletación) y las definiciones de funciones pueden estar en lugares arbitrarios en la jerarquía de herencia o arbitrariamente profundas en el sistema de archivos (porque la mayoría de las personas simplemente hacen clic en un identificador para abrir una nueva pestaña que muestra el contexto de la definición). Bien hecho, terminas con los tipos de proyectos de juguetes limpios y limpios con los que tienes que jugar en tu currículum de pregrado de CS; mal hecho, terminas con toda la ridícula complejidad que caracteriza a las bases de código de Apache.

Cada estilo viene unido a tecnologías y formatos que enfatizan y operan con el estilo. El estilo UNIX prefiere TSV donde el estilo Java prefiere XML. Donde UNIX usará Make, Java usa ANT. Donde UNIX usa awk, Java usa … más Java.

¿Qué es un programador de Unix ? No estoy muy seguro.

  • ¿La programación para Linux cuenta como programador Unix ?
  • ¿La programación de Java que se ejecuta en Unix o Linux cuenta como programador de Unix ?
  • ¿Cuenta Perl y Groovy que se ejecutan en Solaris y Linux?
  • ¿Ejecutar Eclipse en Linux, escribir Java o Groovy o HTML / CSS / Javascript / JQuery que se ejecuta no sabe dónde querían implementarlo, cuenta?
  • ¿Escribir scripts XWiki, donde XWiki se ejecuta en Solaris cuenta?
  • ¿Escribir SQL en una base de datos que se ejecuta en Solaris / Linux cuenta?
  • ¿Escribir SQL en Toad en Linux, contra una base de datos de SQL Server?
  • ¿Cuenta “programar” TIBCO que se ejecuta en Linux?

Si todo lo anterior cuenta, entonces no creo que sea posible escribir código obtuso.

Los malos programadores escriben código obtuso que incluso ellos no pueden entender 6 meses después. Los buenos programadores escriben el código más claro posible para el trabajo que intentan realizar. Los grandes programadores comentan muchísimo. Por lo tanto, no se trata de que los programadores piensen que escriben código obtuso; generalmente están tratando de escribir el mejor código que saben escribir. El problema es que algunos programadores no miran hacia el mantenimiento y soporte futuros.

Una de las razones para pensar que el código de Unix es “obtuso” puede ser simple. Es fácil obtener alguna fuente de Unix y mirar dentro. Sin embargo, es más difícil obtener un código fuente patentado que no sea Unix. Puedo apostar que la “obtusa” del código que no es Unix es comparable.

Además, lo que puede parecer obtuso en realidad puede ser el resultado de un trabajo a largo plazo relacionado con la optimización. Las compensaciones deben resolverse todo el tiempo. Las buenas ideas son buenas ideas. Sin embargo, la realidad a veces demuestra que la buena idea no es tan buena cuando se trata de eficiencia, confiabilidad, mantenibilidad, etc.

“Para cada pregunta existe una respuesta agradable, simple y comprensible … eso está mal”.

No sé si CUALQUIER programador cree que escribe código obtuso. Comienza como una hermosa sinfonía perfectamente organizada en nuestras cabezas que adquiere lesiones al salir.

More Interesting

¿Cuál es un buen sitio de recomendaciones para encontrar excelentes desarrolladores / codificadores de software en el Valle?

¿Cómo debería un gerente de software lidiar con una situación cuando un ingeniero que entendió el funcionamiento de un software crítico ha decidido abandonar la empresa?

¿Es necesario que el desarrollador de software sepa sobre la implementación de CMMI?

Cómo cambiar el trabajo de desarrollo de Java desde el desarrollo de salesforce.com (Apex y VF)

Para un principiante relativo, ¿cuál sería el área más útil y demandada de desarrollo de software para aprender?

Si uno ya tiene un empleo remunerado como desarrollador de software, ¿volver a la escuela para obtener un título de CompSci resultaría en una ganancia financiera neta?

¿Cómo les gustaría a los desarrolladores de software encontrar sus próximos trabajos?

¿Qué se puede decir de un jefe que escribe código y espera que lo sepas?

¿Cuáles son las ventajas y desventajas de ser ingeniero / desarrollador de software?

¿Qué hace que un desarrollador quiera utilizar la tecnología de Twilio y ser miembro de la comunidad de desarrolladores de la compañía?

¿Por qué los ingenieros, programadores de software y profesionales de hardware y TI piensan que tienen respuestas a preguntas sobre las que no saben nada?

¿Por qué los desarrolladores odian el sistema operativo Windows?

Cómo conseguir un trabajo en desarrollo de software

¿Cuál es la mejor computadora portátil para desarrolladores / programadores a un precio asequible?

¿Java está saturado?