He escuchado mucho sobre las ventajas de hacer menos trabajo de programación en aplicaciones GUI y usar más herramientas de línea de comandos (especialmente con respecto a hacer las cosas de manera más eficiente). Sin embargo, dado que no entiendo cómo mi flujo de trabajo sería diferente si dependiera más de las herramientas de línea de comandos, no puedo evaluar fácilmente si hay una recompensa suficiente para mí personalmente para invertir tiempo y esfuerzo aprendiendo un nuevo conjunto de herramientas y cambiando mi flujo de trabajo
Ahora mismo:
Codifico algunos proyectos paralelos en lenguajes como C / C ++ / D / C # / Java / Python usando Visual Studio, Eclipse, etc., y los ejecuto configurando la configuración de compilación y presionando F5 para compilar / ejecutar.
Estoy desarrollando un programa web en el trabajo, por lo que eso implica usar Django para configurar un servidor, conectarse a una base de datos, etc., casi todo dentro del editor de texto SciTE.
Para iniciar programas regulares, uso Launchy ... todavía no hay terminal. :)
Para copiar archivos y demás, utilizo una búsqueda / movimiento regular en el administrador de archivos gráfico (Windows Explorer, Nautilus).
Depuración: uso Visual Studio o herramientas de depuración para Windows (si estoy en Windows). No he hecho mucha depuración en Linux, pero para las cosas que he hecho, he usado Eclipse (también para Java en Windows).
En el trabajo: para conectarme al sistema de compilación y configurar un proyecto, solo utilizo herramientas que se han integrado en Eclipse para mi uso; no necesito un terminal ni nada (aunque ciertamente puedo usar un terminal si de hecho quiero)
¿Cómo es hacer estas cosas en CLI? ¿Qué partes se vuelven más / menos eficientes? ¿Qué aspectos de mi flujo de trabajo tendrían que modificarse para obtener la mayor ventaja de un cambio a trabajar principalmente en CLI? En otras palabras ... Si mágicamente me transformaras en un gurú de la línea de comandos, ¿cómo sería mi nuevo flujo de trabajo de codificación diferente de mi forma actual de hacer las cosas centrada en la GUI?
Respuestas:
Ya no creo que esto sea cierto. La CLI tiene una ventaja específica: si sabe de antemano lo que está buscando, puede escribirlo más rápido de lo que puede navegar en un menú. Esto significa que si desea emitir explícitamente comandos para el programa que tienen poco contexto, entonces es más rápido. Sin embargo, hay dos problemas.
En primer lugar, los programas GUI pueden inferir contexto para usted. Por ejemplo, la función Ir a definición de Visual Studio e Intellisense. ¿Cómo podría replicar esas características en una CLI?
En segundo lugar, los programas GUI pueden mostrarle mucho más. Por ejemplo, el Visual Studio Parallel Profiler, que es un gráfico del uso de la CPU en múltiples núcleos a lo largo del tiempo. ¿Cómo podría mostrar eso en una CLI? Simplemente no tendría sentido. Tan pronto como sus datos se expresen mejor como algo diferente al texto, la CLI se pierde instantáneamente. Otro ejemplo fácil son los puntos de interrupción. En Visual Studio, hace clic en el margen de la línea que desea dividir. ¿Qué vas a hacer en una CLI, tratar de encontrar el archivo y el número de línea e ingresar ese comando? Eso te llevará una década relativa. Eso ni siquiera cuenta algunas de las innovaciones de GUI más nuevas, como Debugger Canvas.
Una GUI puede ser más lenta si desea pasar su tiempo presionando Debug una y otra vez, pero tan pronto como los casos de uso se vuelven más complejos, no hay forma de que la CLI pueda mantenerse al día.
fuente
Creo que la mayor diferencia no radica en las tareas individuales sino en dos cosas:
Ante todo, la automatización. La CLI es inherentemente programable, lo que generalmente es más difícil en Windows. He escuchado cosas mejoradas con PowerShell pero no lo he usado.
En segundo lugar, la filosofía UNIX de "separación de preocupaciones". Puedo escribir una pequeña interfaz basada en línea de lectura en algo y usando emacs Mx shell lo uso dentro de emacs GUI. Esto simplifica el aprovechamiento de otras herramientas y funcionalidades existentes.
Para la depuración, gdb funciona bien, pero generalmente prefiero VS depurador. Es probablemente la mejor pieza de software que Microsoft haya hecho.
Para construir y ejecutar cosas: hacer. O bash. Donde quiera.
Para el desarrollo: emacs (conversión reciente de vi, ¡qué vergüenza!). Vi si está trabajando a través de ssh.
Realmente no puedo acostumbrarme a Eclipse. Creo que es un problema de "forma mental": no se ajusta al mío.
fuente
Para mí, cambiar a un flujo de trabajo de CLI desde Visual Studio implicaba memorizar muchos comandos * nix. También implicaba algunos dolores de cabeza cada vez que estropeaba un registro de SVN.
Pero la mayor diferencia en el flujo de trabajo para mí fue que obtuve una mejor comprensión de cómo funciona un sistema operativo . Con un flujo de trabajo de GUI, solo era hacer clic en los botones y esperar a que el programa respondiera. En el mundo de la línea de comandos, siento que le digo a la computadora directamente que haga algo.
En otras palabras, un flujo de trabajo de GUI era la computadora que se comunicaba con usted, mientras que un flujo de trabajo de CLI parecía más como si se estuviera comunicando directamente con la computadora.
Uno no es mejor que el otro, pero cambiar de un entorno totalmente basado en GUI a la terminal fue definitivamente un viaje.
fuente
Aquí hay más observaciones de un programador que ha vivido en ambos mundos. No repetiré los puntos ya hechos en otras respuestas:
El desarrollo basado en CLI tiende a utilizar una variedad de programas, cada uno de los cuales realiza 1 función. El desarrollo basado en GUI tiende a usar 1 gran programa (el IDE), que realiza docenas de funciones diferentes. Esta diferencia tiene varias consecuencias:
Debido a que un IDE está destinado a ser su único "hogar" donde trabaja todo el tiempo, pueden usar un formato propietario (quizás binario) para almacenar sus datos. La compatibilidad no es una gran preocupación, porque no esperan que trabajes en 2 IDE diferentes en el mismo proyecto. Las herramientas de CLI, por otro lado, generalmente solo funcionan con archivos de texto sin formato.
Con el desarrollo basado en CLI, puede cambiar gradualmente las herramientas o integrar nuevas herramientas en su flujo de trabajo, más fácilmente. Elegir un IDE es más o menos, y cambiar su IDE es más doloroso.
El uso de un script de compilación CLI, en lugar de un menú "Build" integrado de IDE, hace que sea más probable que pueda alejarse de su código durante unos años, volver a él y compilarlo sin complicaciones. Con el desarrollo basado en GUI, es probable que esté ejecutando un IDE completamente diferente para entonces. Quizás el que estaba usando cuando escribió el código ni siquiera se ejecuta en su sistema operativo actual.
En un IDE, crear sus propias herramientas significa aprender una API de complemento (probablemente grande) y tal vez usar un lenguaje específico. Al usar la CLI, no se necesita nada especial para crear herramientas personalizadas.
Por otro lado, la ventaja de un IDE es que está, bueno, "integrado". Entonces puede hacer clic en la ventana de su editor para establecer puntos de interrupción del depurador, y así sucesivamente.
Otro punto: su elección también dependerá de la plataforma de desarrollo, sistema operativo e idioma (s) que utilice. En ciertas plataformas, el desarrollo basado en IDE está profundamente arraigado en la cultura de desarrollo predominante. En otros, el desarrollo basado en CLI es frecuente. Si está utilizando una plataforma donde prevalece el desarrollo basado en IDE, es probable que las herramientas de CLI estén poco desarrolladas y tengan un soporte deficiente. Lo contrario también es cierto.
fuente
La mayor parte de mi infancia no la pasé en una computadora, ya que incluso teníamos internet en la granja. Comencé a programar tarde en la escuela secundaria y básicamente trabajé en GUI todo el tiempo. En la universidad conocí a un chico que creció en CLI e hizo todo de esa manera. Así que decidí configurar un servidor Linux en lugar de escuchar al profesor. Después de unos años, mi amigo me estaba mirando escribir un código incrustado y no podía creer cómo escribía.
Básicamente uso la mitad de la CLI y la mitad de la GUI. Hay algunas cosas que los entornos agrupados con GUI hacen mucho más rápido y más eficientemente. Y lo mismo es cierto para la CLI. La mayor parte de mi edición de texto se realiza en VIM, ya que los editores avanzados de CLI VIM / EMACS (sin guerras aquí, por favor) hacen que la manipulación de texto sea la más eficiente. Cosas como la depuración incrustada usando GDB, por otro lado, es tan dolorosa como editar texto sin un teclado. Claro que es potente y seguro, con suficiente tiempo encontrará la información que está buscando, pero tener una buena ventana GUI con acceso instantáneo a cualquier bloque de memoria es invaluable, especialmente cuando se trata de compararlo con otro bloque de memoria.
De todos modos, lo que realmente estoy tratando de decir es que no debería ser GUI vs CLI sino más bien en qué es mejor CLI y en qué es mejor GUI. Porque al final si su IO es más lenta que su proceso de pensamiento, hay un problema.
fuente
"convertido en un gurú de CLI de la noche a la mañana?" Sí, ahí está el problema. Las GUI bien diseñadas tienden a ser más reconocibles que las CLI y son más indulgentes para los novatos.
Mi flujo de trabajo, recientemente mejorado por un administrador de ventanas de mosaico (dwm), consiste en escribir mucho. Mi computadora portátil ahora se puede usar sin enchufar un mouse (el trackpad es adecuado para lo que queda de señalar). Mantengo muchas aplicaciones abiertas y cambio con alt-tab. No pierdo el tiempo moviendo y redimensionando ventanas.
La mayoría de las veces, uso un navegador, vim y un montón de terminales. SSH me da mucha flexibilidad en cuanto a dónde trabajo (físicamente). Los escritorios remotos pueden ofrecer una mejor experiencia cuando todos tenemos una tubería de 10 Gigabit a la red, pero no aguanto la respiración.
No he aprendido vim lo suficientemente bien como para aprovechar sus características complejas, pero me estoy inclinando en esa dirección: quiero que vim salte a la línea correcta # después de una marca fallida. (Técnicamente, vim es una interfaz visual, aunque se ejecuta en una terminal, pero la manejo con un teclado, no con un mouse).
El verdadero problema son las interfaces mal diseñadas . Las interfaces bien diseñadas son difíciles de crear, por lo que no ocurren muy a menudo en ninguno de los campos. Pero dado que más asistentes que no son ux están diseñando GUI hoy que CLI ...
(Mi otro motivo favorito es la hinchazón. Cuando se necesita un programa de 19 MB para ayudarme a realizar la misma tarea que un programa de 200 kb, algo está mal. XTree Gold para DOS mejoró mi productividad más que cualquier administrador de archivos moderno. Windows 2.11 solo se utilizó en mosaico Windows. Turbo C era un IDE increíble. ¿Por qué mi Nook parece funcionar más lento que un Mac clásico? ¿Por qué el núcleo solo ahora ocupa más espacio en disco que el sistema completo solía?
fuente
Con las interfaces gráficas de usuario, se ve obligado a interactuar con el programa repetidamente para realizar la misma operación una y otra vez. Con un shell, puede automatizar las cosas más fácilmente y hacer que los programas trabajen juntos a través de tuberías, lo que podría usarse, por ejemplo, para generar coincidencias con expresiones regulares en un conjunto de archivos o paquetes de red. Como se dijo, es más rápido para muchas operaciones.
La programación en el terminal quizás no sea mucho mejor que en un editor gráfico, a menos que use SSH.
Personalmente, encontré que el shell de Unix es mucho más accesible que la típica línea de comandos de Windows, y ahora estoy muy inmerso en él en un sistema Linux con un administrador de ventanas en mosaico y muchos terminales.
fuente
Todos sus ejemplos son más o menos un proceso de un paso. En la mayoría de los entornos GUI, si desea mover un archivo que no tiene nada que ver con la aplicación actual en la que se encuentra, puede hacerlo desde el menú de archivo sin salir de la aplicación. No tiene sentido ir a un símbolo del sistema. Si desea copiar el archivo y darle un nombre diferente, en una línea de comandos puede hacerlo todo de una vez. Para poner esto en un archivo por lotes, al menos necesita saber cómo hacerlo, pero luego puede ejecutar el archivo por lotes desde la GUI si lo desea.
He tenido un debate similar sobre los comandos del teclado v. El mouse.
fuente
La forma en que trabajo favorece la GUI con diferencia.
Uso típico:
En cuanto al beneficio principal de CLI, scripting, casi nunca hago eso. Las tareas repetidas que tenemos son solo aplicaciones de trabajo cron que hemos agrupado en C # y que no cambiamos con frecuencia. Tenemos formas de hacer que las cosas se ejecuten en Linux, pero principalmente es portado (impulso), por lo que jugar con los archivos y esas cosas se minimizan. Y si las cosas se ponen difíciles, también hay buenos IDE para Linux.
fuente