Programación de computadoras: Como ingeniero de software, ¿qué cosas crees que son “innecesariamente complicadas”?

No estoy seguro de si esto es innecesariamente complicado, pero configurar algo.

  • Conseguir que funcionen muchos de los IDE más nuevos.
  • Conseguir que casi cualquier servidor funcione.
  • Hacer que ODBC funcione con una conexión en una máquina de 64 bits.
  • Hacer que las aplicaciones móviles se ejecuten por primera vez en cualquier dispositivo.
  • Hacer que Maven trabaje con bibliotecas externas.
  • Conseguir que las librerías externas funcionen en general.
  • Y muchos más..

Esto tiende a ser la parte más difícil de cualquier proyecto. Simplemente obteniendo el punto donde puedes comenzar a codificar.

Sospecho que este es un problema generalizable; las personas que desarrollan estos sistemas se preocupan mucho más por “la cosa” que por los usuarios que pueden hacer que la cosa funcione en primer lugar.

Los tutoriales y las guías a menudo son incompletos y solo funcionan para ciertos sistemas, la documentación sobre este tipo de cosas tiende a ser escasa y las configuraciones en general a menudo son innecesariamente difíciles y desordenadas.

Entiendo por qué este es el caso, por qué querrían centrarse en la tecnología en lugar de facilitar lo más posible la puesta en marcha, pero en muchos casos solo llegar allí puede ocupar el 75% de la línea de tiempo de un proyecto, y un gran porcentaje de personas ni siquiera llegan o se rinden temprano, por lo que el producto nunca recibe el mayor uso posible.

Algunos sistemas (Microsoft) hacen esto bien. Al igual que la instalación de software en Windows es muy fácil, ya que se encuentran automáticamente los controladores. Es impresionante lo lejos que ha llegado. De hecho, diría que cosas básicas como esa son un gran diferenciador entre Windows y Linux en el espacio del consumidor. Simplemente poner las cosas en marcha por primera vez. Lo mismo ocurre con Visual Studio. Es un sueño configurar y entrar. Eclipse y Eclipse de Scala a menudo tienen errores y son difíciles de poner en marcha por primera vez en contraste.

Deseo que más desarrolladores cambien de marcha y dediquen más tiempo y atención a hacer que este proceso sea lo más fluido posible.

El uso generalizado de enteros de máquina y tipos de coma flotante hace que escribir código de cálculo correcto sea innecesariamente complicado, ya que cada operación aritmética tiene el potencial de un sutil desbordamiento o error de redondeo. Lisps lleva 50 años promocionando silenciosamente números enteros y racionales de precisión ilimitada. Eso elimina clases enteras de errores y es razonablemente eficiente, excepto quizás en bucles críticos vinculados a la aritmética, que son raros fuera de la informática de alto rendimiento. Si yo fuera el rey, todos los idiomas modernos usarían “bignums” de forma predeterminada para que podamos dejar de preocuparnos por el desbordamiento y los errores de redondeo.

El concepto de una función de orden superior se reinventa y cambia de nombre de manera complicada. Las API de OOP tienden a saturarse con una gran cantidad de interfaces de método único o clases abstractas. Python tiene generadores, C # tiene delegados y Go tiene corutinas. En esencia, todas estas son variaciones elegantes de “una función” y, a menudo, desearía que solo usáramos funciones simples.

La licencia de software es innecesariamente complicada. Casi todos los casos de uso se ajustan a tres categorías, 1) copyleft (GPL), 2) código abierto no copyleft (MIT / BSD) y Todos los derechos reservados. En principio, deberíamos poder estandarizar tal vez 5 licencias. Pero en cambio tenemos docenas con reglas complicadas sobre qué combinaciones se pueden mezclar entre sí.

Hacer que las cosas se ejecuten en un teléfono móvil es terriblemente complicado. No puede simplemente hacer clic en un botón, cargar una imagen y se implementa. Tienes que subir un montón de imágenes, firmar tu aplicación, lidiar con múltiples pantallas llenas de preguntas, etc.

De acuerdo, la gente quiere que los teléfonos móviles sean seguros, pero debe haber una manera más fácil.

Creo que la web es innecesariamente complicada. He escrito sobre esto antes, pero la premisa básica es esta:

Si escribe un navegador web, es una gran cantidad de trabajo, lo que no es realmente viable para un equipo individual o pequeño. Una vez hecho esto, puedes mostrar páginas web.

Si escribe un cliente RDP, es mucho menos trabajo, lo que puede hacer un individuo. Una vez hecho esto, puede mostrar lo que quiera, incluidas las páginas web.

Básicamente, la web parece ser mucho trabajo por no mucho resultado. Tiene que usar un lenguaje particular, con un lenguaje de marcado particular, con una plantilla de estilo particular. Con RDP, puedo usar cualquier pila de tecnología que me guste.

La web es demasiado complicada para los resultados que sacamos de ella.

Creo que la web básica hecha por Tim Berners Lee fue una buena idea, y funcionó bien, pero seguimos agregando bits hasta que dejó de ser una buena idea.

Creo que JAXB (Java API for XML Binding) es innecesariamente complicado.
“La clase de bla bla, ni ninguna de sus superclases es conocida en este contexto”.
¡Maldito seas JAXB! ¡Inicialice y guarde en caché las propiedades de la clase en el maldito contexto! ¿Qué tan difícil puede ser?

La mayoría de las bibliotecas de clientes de Google con las que he trabajado también son innecesariamente complicadas. En serio, ¿por qué diablos necesito saber que estás usando algo de fábrica de Jackson y material de transporte HTTP? ¡Dios ten piedad!

La mayoría de los “marcos” y “pilas”.

Scala

Una tecnología puede parecer innecesariamente complicada para un desarrollador porque

  1. el desarrollador no necesita toda la potencia de la tecnología, es decir, esta tecnología no es la herramienta adecuada para el problema que va a resolver. O
  2. el desarrollador no comprende la tecnología, ni cómo usarla ni cómo funciona. O
  3. el desarrollador ya conocía una mejor herramienta para el problema, pero esa herramienta ocultó ingeniosamente su complejidad del desarrollador. En general, la tecnología innecesariamente complicada no está bien diseñada.

¡Certificados, perfiles de aprovisionamiento, una ola de varita mágica, solo para distribuir una aplicación!

En los viejos tiempos, lo guardaba en un disquete y lo publicaba en el cliente, eso era todo.

More Interesting

¿Cuáles son los algoritmos más eficientes que resuelven de manera óptima un cubo de Rubik?

¿Recomendaría usar HackerRank para mejorar las habilidades del algoritmo? ¿Por qué?

¿Qué son los proyectos de código abierto? Soy muy bueno en C ++, estructuras de datos y algoritmos. ¿Puedo contribuir a algunos proyectos de código abierto? Si es así, ¿cómo? ¿Tendré que aprender algún idioma nuevo?

¿Por qué prácticamente todos los algoritmos de ascensor son tan ineficientes y cuáles son las razones por las que aún no se han optimizado?

Cómo representar un número binario, como 110110011, en exceso de código 511

Cómo escribir algoritmos de mapas de ruta como Google Maps

¿Cómo se debe aprender la codificación, haciendo algoritmos, desde el nivel básico, dado que no tiene experiencia en codificación? (especialmente desde el punto de vista de la colocación y también dado el hecho de que me queda un año para que comience mi temporada de colocación).

¿Cuál es la diferencia entre recursividad e iteraciones brevemente?

¿Cómo mantiene Google en secreto su algoritmo de sus empleados cuando son sus empleados quienes lo prueban?

¿En cuánto tiempo puedo ser un profesional en la resolución de problemas en algoritmos y estructuras de datos si empiezo hoy sin ningún conocimiento previo?

¿Qué es una explicación intuitiva de bosques aleatorios?

¿Cuál es la diferencia entre algoritmos y programación?

¿Cómo se implementa std :: make_heap de STL?

¿Existe un algoritmo para salir de laberintos bidimensionales?

¿Qué algoritmos se pueden usar para determinar si dos preguntas (como las de Quora) son de alguna manera similares?