¿La programación de bajo nivel te hace un mejor programador de alto nivel?

No creo que tenga sentido distinguir entre un programador de alto nivel y un programador de bajo nivel.

Cuando trabajas con un lenguaje de alto nivel, trabajas en un conjunto de abstracciones. Por eso es un lenguaje de alto nivel. Sin embargo, las abstracciones “gotean”. Siempre hay casos extremos donde la realidad que trataste de abstraer brilla. Por ejemplo, en Java todo es una referencia. Una de las abstracciones de Java es que la memoria es igual y su única preocupación es tener suficiente.

Como resultado, puede escribir código que no se vea mal, pero que resulte en un rendimiento horrible porque la memoria no es igual. La memoria en los registros es más rápida que la memoria en las memorias caché, que es más rápida que la memoria principal, y la localidad de los datos, la forma de sus estructuras y muchos otros detalles que Java le ciega pueden tener un impacto serio en su rendimiento. Y cuando necesita corregir su rendimiento, necesita saber por qué su código aparentemente correcto funciona lentamente, lo que significa que debe mirar más allá de sus abstracciones y comprender lo que realmente está sucediendo.

Y en un nivel más fundamental, ser un buen programador de alto nivel requiere que comprenda su idioma de elección, y eso significa comprender las abstracciones que proporciona. Y para saber cuáles son esas abstracciones, debe saber qué está haciendo realmente la computadora subyacente y qué se está abstrayendo.

El conocimiento de la arquitectura y las consecuencias de nivel inferior de sus elecciones de alto nivel lo harán un mejor programador. Comprender la asignación de memoria, la latencia, la invalidación de caché y otros aspectos de bajo nivel que tratan con el hecho de que escribe código en una máquina que toma tiempo ejecutar su código y tiene recursos limitados lo ayudará en algún momento a tomar mejores decisiones en el nivel superior. También le permitirá sumergirse e implementar partes de su programa en C y / o ensamblaje.

Creo que todos los programadores serios deberían leer el CÓDIGO de Charles Petzold y aprender C. Tampoco es una prioridad, la prioridad desde mi punto de vista es comprender las estructuras de datos y los algoritmos. Puede obtener una buena implementación de aplicaciones web con solo HTML + CSS + JS, aún puede llamarse a sí mismo un programador pero … seguirá siendo un mejor programador de JS que haya entendido C.

Sí, y hay muchas razones para este “sí”.

En primer lugar, el lenguaje ensamblador es un paradigma de lenguaje. Por paradigma, me refiero a “Programación Orientada a Objetos”, “Programación Funcional” y “Programación Declarativa”. Se crearon diferentes idiomas para resolver diferentes problemas, cada paradigma que aprenda lo hará un mejor pensador, no solo un programador.

El ensamblaje es una primera abstracción del código de máquina para la sintaxis legible por humanos. Los lenguajes de alto nivel simplemente se reducen al ensamblaje. Y esto tiene consecuencias en el mundo real: el ensamblaje conduce al estudio del diseño del compilador, y el hecho de que los compiladores puedan reescribir su código de manera inesperada conduce a uno de mis CWE favoritos. (Enumeración de debilidad común)

CWE-14: Eliminación del compilador de código para borrar buffers

¿Cómo dirías si el compilador borró el código que escribiste si al menos no conoces suficiente ensamblaje para resolver esto?

Si.

Como desarrollador senior, he tenido mi parte de rastrear a través de código ineficiente escrito por desarrolladores junior que no entendían los detalles de la arquitectura de la máquina y, por lo tanto, no tenía idea de lo que significa la eficiencia.

No puede ser un programador de alto nivel realmente excelente sin saber exactamente qué sucede detrás de cada declaración que escribe.

El siguiente recurso puede ayudar:

Escriba un código excelente: Volumen 1: Comprensión de la máquina: Randall Hyde: 0689145700381: Amazon.com: Libros

Como programador de kernel / BSP / bajo nivel desde hace mucho tiempo, y trabajando ahora en frameworks de espacio de usuario / desarrollo de aplicaciones, definitivamente puedo ver el valor de tener experiencia en desarrollo de bajo nivel. Las siguientes son las ventajas de tener experiencia en programación de bajo nivel.
– Escritura de código eficiente (rendimiento / velocidad, memoria y potencia), optimizado y con menos errores: al escribir código de aplicación, las optimizaciones y la eficiencia son tan psíquicas (de la experiencia pasada de escribir controladores con errores y fallar el núcleo) en las que pensará intuitivamente escribiendo un mejor código la primera vez.
– Diseño a largo plazo: dado que puede pensar desde el nivel de la máquina / arquitectura, mientras diseña cualquier marco de aplicación, las preocupaciones de diseño a largo plazo, los problemas de mantenimiento, la portabilidad, naturalmente, se presentarán primero ante alguien sin experiencia de bajo nivel. Esto también puede ayudar en el avance profesional y asumir roles principales en los que tiene que diseñar cosas y pensar en los problemas con mucha anticipación
– Facilidad de depuración: no dudaría en depurar ningún código (también conocido como puede profundizar en la pila completa de arriba a abajo o de otra manera). También tiene más herramientas de depuración (conocimiento de, quiero decir) en su arsenal
– Una perspectiva diferente: tiene la posibilidad de destacar con ciertas preocupaciones / ideas que se le presentan primero cuando se encuentra en medio de programadores de alto nivel

Pero, por desgracia, al igual que con la vida, no puedes esperar dominar todo (las herramientas y las tecnologías), por lo que los siguientes son los inconvenientes en los que puedo pensar (en pasar mucho tiempo en la programación de bajo nivel) …
– Trabajar en inmersiones de bajo nivel y profundidad en temas tenderá a hacerte perder de vista en una imagen más grande. En el espacio de la aplicación, creo que la amplitud es más importante que la profundidad del conocimiento dada la cantidad de nuevas tecnologías y herramientas que debe adoptar.
– Inicialmente, puede ser lento para aprender cosas nuevas a un ritmo rápido (debido a su pensamiento a largo plazo, escribir un código mejor la primera vez) y, por lo tanto, lento para adaptarse a los nuevos modelos de desarrollo de software (sprints de 2 semanas y desarrollo lean, que tiene sus propias ventajas), por lo que puede perder algo de ventaja inicialmente.

Entonces, en resumen, un buen ingeniero es un apasionado de aprender diferentes tecnologías, se adapta rápidamente a nuevos entornos y tiene una mente abierta (muy importante)

Es útil pero no esencial. Si quieres ser realmente excelente, vale la pena pasar un tiempo familiarizado con el funcionamiento de las CPU, la memoria y el IO; sin embargo, no sugeriría pasar horas y horas entendiendo los detalles sangrientos de las disciplinas o el almacenamiento en caché de captación previa.

La clave para convertirse en un mejor programador de alto nivel es: comprender realmente el problema que está tratando de resolver, mirar el código de otras personas, por ejemplo, proyectos de código abierto muy respetados, programar en varios idiomas diferentes, comprender las estructuras de datos y algoritmos de uso común , siga las mejores prácticas, por ejemplo, programación con interfaz, patrones de IoC, etc., aprenda constantemente, siempre pregunte “¿por qué?” y fallar rápido

Por cierto, las personas que hablan de “eficiencia” están un poco fuera de lugar. La mayoría de los compiladores y sistemas de tiempo de ejecución modernos pueden optimizar el código de la máquina mejor que la mayoría de las personas. Tiende a no medir cosas en las instrucciones de la CPU; hoy en día es mejor medirlas en horas hombre. Ahorrar 2 días del tiempo de un programador es más eficiente que guardar unos cientos de instrucciones de CPU.

Escribir una ordenación rápida en C ++ o simplemente saber qué biblioteca utilizar es mejor que implementar la clasificación de burbujas en el ensamblaje. Comprender los conceptos y algoritmos más matemáticos es generalmente mejor que comprender lo que sucede a un nivel bajo en la máquina. Vale la pena saber todas estas cosas si quieres ser un buen programador.

Claro que sí.

Comprender cómo funcionan las cosas a bajo nivel y la relación lenguaje-compilador / intérprete te hace escribir mejor código.
¿Por qué?
Porque lo que cree que es una buena solución matemática, no siempre es la más adecuada para el funcionamiento de la máquina. Entonces, saber esas cosas te hace evitar muchas “trampas” que son muy difíciles de describir.

En resumen, creo que comprender la programación de bajo nivel le permite comprender mejor cómo funciona la computadora en un nivel bajo (lo que para un desarrollador es una gran cosa para saber).

También le da una apreciación muy fuerte de lo que los idiomas de alto nivel hacen por usted o resumen por usted.

Para mí, tener experiencia con lenguajes de programación de bajo nivel (algunos tipos de ensamblaje, C y Lisp son excelentes), es lo que separa a un mono de código de un arquitecto.

No es una respuesta clara; puede convertirte en un mejor programador de alto nivel, no puede hacer una gran diferencia, o puede convertirte en un peor programador de alto nivel.

El salto del ensamblaje a la programación web es bastante grande. Puede ser excelente para escribir controladores de dispositivos, sistemas integrados, lo que sea, pero es posible que no obtenga las habilidades necesarias para escribir grandes aplicaciones web distribuidas al hacerlo (lo mismo es cierto a la inversa).

Pasar de un nivel bajo a quizás aplicaciones de escritorio podría estar un poco más cerca y necesitar conocer las opciones del compilador y lo que realmente hacen puede ayudarlo a ser un mejor programador allí.

Como la mayoría de las otras preguntas en la vida, la verdadera respuesta es “depende”.

Si.

Cuanto más entiendas lo que está sucediendo debajo del capó, mejor estarás.