¿Elegiría un lenguaje de programación debido a sus sistemas de gestión de dependencias?

Voy a atrapar mucho por esto, pero no remotamente.

Elijo un idioma en base a un par de preguntas que hago al principio. La administración de paquetes nunca ha sido una de ellas, aunque las bibliotecas sí lo han sido.

  1. Cuáles son los problemas más difíciles en este proyecto y, por extensión, qué herramientas tienen la mejor manera de permitirles resolverlos.
  2. Cuán extensible, mantenible y estable debe ser esto. ¿Estoy escribiendo una herramienta temporal, una herramienta permanente, un mvp, una aplicación destinada a escalar a millones de usuarios simultáneos.
  3. ¿Dónde estoy usando esto? Este podría ser mi campo, pero aparte de los sandboxes, no he escrito software que he ejecutado en mi propio equipo en mucho tiempo. Siempre es un servidor, un contenedor, un navegador, una instancia, un teléfono.
  4. ¿Cuándo necesito esto? Algunos lenguajes son simplemente más rápidos que otros, y puede jurar manipular algo en Python en fracciones del tiempo que le tomaría hacer algo en Java. Scala es más rápido pero viene con sus propias peculiaridades, al igual que muchos otros idiomas.

A veces hay otras preocupaciones, pero no recuerdo la última vez que me importó la forma en que las bibliotecas llegaron a mi aplicación a largo plazo a menos que pudiera satisfacer TODO lo anterior con cada idioma.

Depende de dónde coloque el lenguaje de programación y el objetivo que desea alcanzar. Si está a punto de crear una plataforma de software cuya intención es poder comunicarse con otros sistemas, proporcionar un protocolo API estándar para ser utilizado por otro sistema y / o consolidar datos de varias fuentes, entonces sí. Debe elegir de forma selectiva un lenguaje de programación por sus pilas de tecnología que tiene, ya que reinventar la rueda es estrictamente preferible.

Pero cuando está destinado a construir un sistema aislado, un controlador de software que se comunique directamente con el hardware, incluso con el núcleo de su propio sistema operativo, o centrado en el método de proceso de negocio, puede ignorar esas dependencias porque va a crear algo muy propio. propio, porque estás a punto de escribir algo específico, o incluso necesitarías que inventes cosas nuevas. Esta es la razón por la cual el kernel de Linux está construido en C, por qué el controlador está construido en C o incluso el ensamblador, por qué SAP usa ABAP en lugar de Java.

Elige la herramienta adecuada para el trabajo. Seleccione el lenguaje correcto y el entorno de desarrollo para el tipo de sistema que está construyendo, tal como usaría el tipo correcto de martillo, destornillador o sierra. Más allá de eso, un precedente exitoso, una colección sólida de mejores prácticas bien probadas y documentación de alta calidad son consideraciones esenciales. Un buen IDE y un administrador de paquetes robusto son importantes, pero estos no deberían ser los impulsores principales del proceso de toma de decisiones.

El nodo no es un idioma. ¿Estás preguntando sobre idiomas o pilas de tecnología?

La mayoría de los idiomas no tienen sistemas de gestión de paquetes / dependencia integrados. Muchos idiomas tienen varias alternativas de uso común. Mira Java (frascos, guerras, orejas, Maven, Ant, Gradle …). Algunos tienen solo una cadena de herramientas de uso común (Ruby Gems, Perl CPAN …)

Al hacer una elección, veré tanto los sistemas de empaque disponibles como la forma en que la comunidad los usa en la práctica. Ambos pueden tener impactos muy significativos en lo que se puede lograr.

Mirando a Perl, CPAN es maduro, ofrece buenas maneras de instalar paquetes de sistema y permite a los desarrolladores crear entornos locales y la comunidad lo usa principalmente de manera responsable.

Mirando a Ruby, me preocuparía el hecho de que Gems se ha vuelto imposible de construir desde cero y ninguno de los principales equipos de desarrollo lo notó. También reflexionaría en la ocasión en que un marco principal de Ruby derribó a todo el mundo de Ruby golpeando una clase principal para satisfacer sus propias necesidades. Podría decidir que han superado ese comportamiento, por supuesto.

Mirando al nodo, bueno, supongo que estás cansado de los chistes de lpad, pero tengo que decir que aunque npm facilita el empaquetado, la comunidad de nodos no parece tener una historia coherente y disciplinada para hacerlo. Actualmente soy responsable de las canalizaciones de CI y CD de un proyecto importante; usamos Node para una parte de la arquitectura y esto ha requerido una gran cantidad de trabajo adicional porque gran parte de la comunidad de NodeJS claramente ni siquiera ha oído hablar de compilaciones reproducibles, demasiadas personas que escriben paquetes Node suponen que el mundo es como su portátil y que si no lo es, ese no es su problema.

Sí, tiene un impacto. No es una fantasía que tenga un gran impacto en la decisión.

Seguro. Hay muchas razones para elegir un lenguaje de programación, y la conveniencia es una de ellas.

Al final, todo depende de las necesidades del proyecto y, a menudo, la conveniencia, la familiaridad y la simplicidad son factores importantes. Si conoce bien un idioma o está motivado para usarlo, es probable que produzca más en menos tiempo que con un idioma que no le gusta o con el que no está familiarizado.

Pero los criterios del proyecto y los criterios personales varían constantemente, por lo que podría no ser siempre el caso.

Si está en un equipo donde nadie conoce el nodo excepto usted (por ejemplo, Python), entonces debería considerar usar el lenguaje común, de lo contrario, nadie tendría ganas de cambiar de contexto y editar su código, además de usted.

Si está luchando por armar un prototipo, use lo que le permita trabajar más rápido. Por lo tanto, un lenguaje que conozca que tenga muchas bibliotecas fácilmente disponibles podría ser el camino a seguir.

A veces el rendimiento es importante, a veces la simplicidad de implementación es importante. A veces, su crecimiento personal es importante … Si surge un proyecto en el que finalmente puede usar el idioma que desea, y parece ser una buena opción, hágalo. Esa es una buena manera de aprender y crecer, y cobrar al mismo tiempo.

La verdad es que probablemente puedas hacer que la mayoría de las cosas funcionen en casi cualquier idioma. Son las necesidades competitivas del proyecto, el cliente, el equipo y sus propias motivaciones más el conjunto de habilidades que hacen que algunas elecciones sean mejores que otras.

Un poco

Ciertamente uso Java para muchas cosas debido al ecosistema de la biblioteca.

No es tanto que Gradle, etc. sea fácil, estoy feliz de lanzar un JAR también. Es más que toda la experiencia de la biblioteca es muy buena.

Las bibliotecas son abundantes, también tienden a ser de muy alta calidad y también son fáciles de instalar. Tienden a ser muy multiplataforma, una biblioteca Java tenderá a ejecutarse en cualquier cosa con una JVM, lo mismo no puede decirse de otros sistemas. Incluso .NET, puede obtener bibliotecas que funcionarán bien con .NET en el escritorio, pero no con .NET como aplicación universal.

Entonces, sí, elijo Java muchas veces porque el ecosistema de la biblioteca es muy bueno, pero no se trata realmente de la gestión de dependencias, estoy feliz de descargar e incluir lo que necesito.

No creo que alguna vez elegiría un idioma debido al sistema de gestión de dependencias, pero ciertamente consideraría la facilidad de gestión de dependencias como un factor decisivo después de que se hayan producido consideraciones más importantes.

En particular, creo firmemente que debería poder verificar el código fuente de un proyecto y ejecutar un solo comando para construirlo. Si mi computadora se apaga, quiero volver a ejecutarla en minutos, no en horas.

Si reviso una base de código y luego tengo que leer un archivo LÉAME y ejecutar una serie de instrucciones para instalar dependencias y preparar mi entorno, especialmente si esas dependencias se instalan en mi espacio de usuario global, considero que es un problema.

Dicho esto, muchos idiomas principales tienen esto:

  • Java’s Maven – pom.xml
  • SBT de Scala – build.sbt
  • Groovy’s Gradle – build.gradle
  • NuGet de C # – packages.config o project.json
  • NPM de NodeJS – package.json

Entonces, si está eligiendo su idioma en función de la herramienta de administración de dependencias, ¿está seguro de que en realidad no solo está eligiendo en función de la familiaridad?

Aprender nuevos idiomas y herramientas es una parte importante de ser un buen desarrollador.

No. Pero, si hubiera un lenguaje que manejara esto realmente bien, entonces podría ser interesante explorar.

Los idiomas usan importaciones e incluyen para obtener definiciones de símbolos de algún lugar y bibliotecas de algún lugar. Pero, se supone que estos están bastante bien definidos. Y se espera que realice algún proceso para obtener las bibliotecas y definiciones de soporte en su proyecto. A los compiladores generalmente se les asigna el trabajo de leer las definiciones de ubicación de recursos. La información sobre dónde están los recursos no se incluye en el código. Pero, se pasa al compilador o al intérprete a través de directivas de líneas de comando o archivos de configuración.

En cierto sentido, esta es una carga que es demasiado grande para la cadena de herramientas de lenguaje. El control de versiones también es independiente de la información utilizada por el compilador. Al compilador generalmente se le dice dónde están ciertos productos terminados, no de dónde se pueden derivar.

Pero tal vez el futuro diga que el lenguaje puede decir algo más sobre la fuente y la posibilidad de construir cosas. Y, tal vez la cadena de herramientas se convierta en un aspecto más amplio del control de versiones.

Entonces, por ejemplo, el lenguaje podría decir que quiere una definición para un funX, que puede acomodar ciertos parámetros y producir un cierto resultado. Luego, se puede solicitar funx al mundo en general como un símbolo semánticamente motivado particularmente deseable. Quizás se pueda describir un patrón de comunicación con él. Si existiera esta nube de control de versiones que pudiera cumplir el requisito con algo que se pueda encontrar que tiene un repositorio, una forma de construir y una forma de entregar o comunicarse, entonces el trabajo de compilación podría continuar. Pero, si el requisito no puede satisfacerse, entonces el compilador puede solicitar que el programador lo construya o puede ayudarlo a crear el recurso. Entonces, este es un compilador que crea una lista de tareas mientras intenta convertir el código en lenguaje máquina.

Tal compilador podría decirle al programador que espere más investigación antes de intentar terminar la compilación del proyecto. El compilador podría mantener el programa como un elemento abierto en alguna gestión de proyectos colectivos.

Este lenguaje sería diferente al que existe. Entonces, si la parte del compilador real produce un código súper eficiente, sería difícil argumentar en contra de explorarlo.

Por lo tanto, dado que tanto la compilación como la vinculación son parte de una compilación con un lenguaje en particular, la creación de un programa no es muy diferente al ensamblaje de componentes, que uno podría tener que esperar.

No hay nada nuevo mencionado en este escenario. Pero, actualmente, la mayoría de los compiladores y enlazadores simplemente informan que no se pueden encontrar símbolos. Los informes son un poco oscuros y se necesita un programador experimentado para traducir el informe de error problemático en la necesidad de reunir ciertos recursos.