saber - ¿Puede el conocimiento de C dañar realmente el código que usted escribe en idiomas de nivel superior?
niveles de ingles (19)
La pregunta parece resuelta, incluso golpeada hasta la muerte. Las personas inteligentes han dicho cosas inteligentes sobre el tema. Para ser un programador realmente bueno, necesitas saber C.
¿O usted?
Fui iluminado dos veces esta semana. El primero me hizo darme cuenta de que mis suposiciones no van más allá de mi conocimiento detrás de ellas, y dada la complejidad del software que se ejecuta en mi máquina, eso es casi inexistente. Pero lo que realmente lo llevó a casa fue este comentario de Slashdot :
El resultado final es que noto las muchas maneras ingenuas en que los programadores tradicionales de "metal desnudo" C suponen que se implementan lenguajes de nivel superior. Toman malas decisiones de "optimización" en los proyectos en los que influyen, porque no tienen idea de cómo funciona un compilador o de cuán diferente puede ser un buen sistema de ejecución del ingenuo modelo de macroensamblador que entienden.
Entonces me di cuenta: C es solo una abstracción más , como todas las demás. ¡Incluso la CPU en sí misma es solo una abstracción! Nunca lo he visto romperse, porque no tengo las herramientas para medirlo.
Estoy confundido. ¿Mi mente ha sido mutilada más allá de la recuperación, como dijo Dijkstra sobre BASIC? ¿Estoy viviendo en un estado constante de optimización prematura? ¿Hay esperanza para mí, ahora que me di cuenta de que no sé nada de nada? ¿Hay algo que saber, incluso? ¿Y por qué es tan fascinante que todo lo que he escrito en los últimos cinco años haya sido fundamentalmente erróneo?
Para resumir: ¿hay algún valor en saber más de lo que me dicen los documentos API?
EDITAR: Hecho CW. Por supuesto, esto también significa que ahora debe publicar ejemplos de la optimización del intérprete / tiempo de ejecución mejor que nosotros :)
Para ser un programador realmente bueno, necesitas saber C.
Estoy de acuerdo con ésto.
Pero también estoy de acuerdo en que para ser un programador realmente bueno, debes saber cómo escribir código en otro idioma ( no cómo escribir el código C en otro idioma).
Aprender C es algo bueno. Tratar de escribir el código C en un lenguaje de nivel superior es algo malo.
Comprender los múltiples lenguajes / marcos y paradigmas de programación nunca debería doler, debería ser beneficioso.
Lo importante es entender el lenguaje / marco / entorno en el que está trabajando actualmente en la medida en que conozca las implicaciones de tomar decisiones de implementación. Aquí, el conocimiento adquirido al trabajar con otros lenguajes puede abrir sus ojos a un rango más amplio de posibilidades, pero debe evaluar esas posibilidades en términos de su entorno actual.
Las personas que se meten en problemas reales son aquellas que aprendieron un idioma, C por ejemplo, y luego aprenden otro idioma en términos de C en lugar de aprenderlo por sus propios méritos, fortalezas y debilidades (algo así como el técnico con un martillo como su única herramienta, todos los problemas parecen clavos para él).
Conocer diferentes idiomas es un activo. Saber cómo se compilan los compiladores e intérpretes también es un activo. Finalmente, cada programador debería pasar un tiempo en lenguaje ensamblador para apreciar los idiomas superiores. :-)
En mi universidad, tomamos una clase, "Lenguajes de programación", en la cual aprendimos LISP, SNOBOL y ADA. Estos lenguajes le abren la mente a diferentes pensamientos conceptuales para resolver los problemas de programación. El resumen fue elegir el idioma que mejor se ajusta al problema.
Conocer un lenguaje de programación es solo la base. No estaría muy lejos en mi carrera si no conociera otros temas relacionados: estructuras de datos, algoritmos, álgebra lineal, álgebra de Boole, diseño de microprocesadores y comunicaciones (entre personas). Cualquiera puede recoger un libro, aprender un idioma y llamarse programador. Son las otras habilidades lo que diferencia a un desarrollador experto de uno sacado de la calle.
Aprende un lenguaje de programación. Aprende bien, para que puedas enfocar más poder mental en las otras tareas a mano. No debería hacer referencia a un manual de programación a menudo. La mayoría de mis concentraciones se basan en los requisitos de la tarea y los algoritmos y las estructuras de datos para que se implementen correctamente en el menor tiempo posible.
Corto y dulce:
Para ser un buen programador, debe ser capaz de pensar de una manera organizada. C o LUA o Java, lo que sea.
El verdadero problema aquí es la suposición. Esos otros desarrolladores asumen que saben cómo funciona. Las suposiciones son el demonio ya sea de un desarrollador experimentado que cree que lo tiene todo resuelto o de un novato que cree que lo tienen todo resuelto.
Al menos, eso es lo que estoy asumiendo aquí
La ingeniería de software se trata de entender la abstracción y cómo usar la abstracción para resolver un problema de manera eficiente (ya sea eficientemente significa menor costo, desempeño más rápido o el horario más corto para la entrega de la funcionalidad). Comprender C es solo otra visión de una capa de la abstracción que usamos día y la habilidad requerida para ''acercar'' a este nivel de detalle es valioso, siempre y cuando también desarrolle la habilidad para ''alejarse'' cuando sea necesario. Este conjunto de habilidades te servirá en todos los aspectos de la disciplina, ya sea diseñando un modelo de objetos, configurando composiciones funcionales limpias, o simplemente estructurando un método individual para mayor claridad y facilidad de mantenimiento.
La programación no se trata de lenguajes de programación. Se trata de resolver problemas. Las herramientas utilizadas para resolver los problemas simplemente son los lenguajes de programación. No escribe código para escribir código, escribe código para ejecutarlo y resolver el problema.
Cuanto mejor conozca sus herramientas, mejor y más rápido podrá resolver los problemas. Pero si bien tendrá serios problemas cuando físicamente intente clavar un tornillo en la madera con un martillo, el software tiene una buena propiedad: hay un sinnúmero de soluciones diferentes para un problema determinado.
Por lo tanto, es perfectamente posible escribir un martillo que golpee un tornillo en un ángulo tal que el tornillo le diga a la madera que haga un agujero en sí mismo para que encaje el tornillo. Luego puede esconderlo detrás de un botón, el usuario no lo hace Incluso necesito saber qué es realmente un martillo.
Si bien no es la solución más eficiente, sigue siendo una solución válida y funcional. Cuando mejore con la herramienta que ha utilizado, finalmente descubrirá cómo puede escribir un destornillador cuando la API no proporciona uno.
Cuantas más herramientas conozca y más formas sepa de resolver un problema, más opciones tendrá y mejores serán sus decisiones sobre qué solución usar. Elija la herramienta adecuada para el trabajo. Pero, ¿cómo podrías saberlo si no conoces las herramientas y las posibles soluciones?
Ni conocer a C ni conocer los detalles de nivel inferior de la implementación te duele, en sí mismos. Lo que puede lastimarte y lo hará es si constantemente piensas y trabajas en términos de los detalles de bajo nivel, incluso cuando es inapropiado.
El viejo dicho era que "los programadores reales pueden escribir FORTRAN en cualquier idioma". Si haces lo mismo con C, no es una mejora. Si estás escribiendo Lisp, escribe Lisp. Si está escribiendo Python, escriba Python. Lo que es apropiado y razonable para C no es para ninguno de ellos (ni ninguno de muchos otros).
Un gran programador necesita poder pensar en muchos niveles diferentes de abstracción, y (más importante aún) reconocer y aplicar el nivel de abstracción apropiado para la tarea en cuestión.
El conocimiento del nivel de abstracción de C no duele. Ignorancia de alternativas puede (y lo hará).
No, conocer múltiples implementaciones de un lenguaje de programación solo puede ayudarlo a comprender mejor esas abstracciones.
El problema es que aceptas que uno es la mejor abstracción que te hará no tener éxito usando a los demás que percibes como menores .
Cada abstracción está diseñada con un objetivo específico diferente, elija la que mejor se adapte a sus necesidades. ¿El hecho de conocer Linux hace que saber de Windows o Mac OS sea más difícil? Es la aceptación de que son diferentes .
Para ampliar los comentarios de los demás ... Aunque no estoy seguro de creer en la http://es.wikipedia.org/wiki/Whorfian_hypothesis"> Hipótesis de Horfana cuando se trata de lenguajes naturales, es bastante claro cuando se trata de a la programación. Los idiomas que conoce afectan la forma en que resuelve un problema. Dos ejemplos:
1) De un profesor que tuve hace muchos años: estaba tratando de averiguar si había duplicados en su conjunto de cadenas. Esto en los años 70, así que estaba escribiendo esto en FORTRAN. Su implementación de fuerza bruta n ^ 2 estaba llevando demasiado tiempo. Entonces él habló con un amigo. Su amigo sabía PL1 (creo que fue, tal vez fue APL) que tiene un operador de clasificación. Entonces, en ese idioma, aprendes a ordenar las cosas y lo útil que puede ser, porque es fácil. Al amigo se le ocurrió primero el tipo obvio, luego mira el algoritmo de elementos adyacentes. Mucho más rápido, y no se le habría ocurrido a mi profesor de escritura de FORTRAN, a pesar de que era perfectamente aplicable en FORTRAN.
2) Cuando estaba en la escuela de posgrado, tenía un estudiante de posgrado de Física para un compañero de cuarto. Fue al MIT, y solo tomó una clase de programación, que fue por supuesto en Scheme. Un día, pasé por su oficina, y me dijo: "Oye, Brian, ¿puedes echar un vistazo a este código y decirme si debería funcionar?" Fue una rutina de clasificación. Lo miré y dije que no podía funcionar, porque era claramente burbujeante y, sin embargo, solo tenía un ciclo (y no, no era el único ciclo funky con el que puedes escribir burbujas si estás enfermo y retorcido). Entonces, dije eso. Él respondió "¡Oh, pero tiene una llamada recursiva en la parte inferior!" Nunca se me habría ocurrido escribir un bubblesurs recursivo. Pero, lo que es más importante, nunca se le habría ocurrido a HIM escribir una función no recursiva.
El punto es que los idiomas que conoces determinan en gran medida el tipo de código que escribirás. Cuantos más idiomas conozca, más herramientas tendrá y más herramientas nunca serán malas, siempre que sepa cuándo usar cada una de ellas ...
Para un mal desarrollador, cualquier tipo de conocimiento puede ser peligroso.
Para un buen desarrollador, cualquier tipo de conocimiento es un activo.
Que aprender C (o cualquier otro idioma) podría perjudicarte en un programador parece depender de que no puedas aprender nada después de haber aprendido C. La lección aquí debería ser: no dejes de aprender. Además, no asuma que cualquier otro lenguaje o tecnología funciona necesariamente como C (o su compilador de C favorito).
Dicho esto, creo que aprender C puede ser una buena forma de aprender cómo funciona el hardware y qué está ocurriendo realmente en la máquina. No puedo ver cómo saber esto podría hacerte daño de alguna manera. No creo que ser ignorante tenga algún beneficio (a menos que sea accidental). Admito que aprender C no es la única forma de aprender sobre la máquina, pero es simplemente una forma de hacerlo.
Saber C no dañará la calidad de tu código, pero saber "solo C" seguro
Saber C, y luego trabajar en mi idioma favorito de muy alto nivel (Python), por ejemplo, es un ejemplo de por qué me resulta útil conocer C.
Conocer C, cuando uso Python es útil de varias maneras:
(a) Estoy agradecido por las listas de Python, los diccionarios y los tipos incorporados, porque hace que sea fácil hacer algo repetible en una línea de código, que me obligaría a seleccionar una biblioteca de códigos, aprenderla y vincularla. (tablas hash, estructuras de datos, etc.) y evitar dispararme en el pie con él.
(b) Python está escrito en C. Ser un programador de C también significa, que si Python consigue el 99% del camino hasta allí, pero puede ser útil una cierta abstracción adicional en Python, puedo escribir esa abstracción en Python. Puedo ver el código fuente del intérprete de CPython y entender qué está sucediendo internamente. Soy, en efecto, un programador de Python que todavía usa algo construido sobre el lenguaje C. Por lo tanto, saber que el lenguaje todavía es valioso.
Todo lo que dije antes también es cierto para las personas que usan Perl, Ruby y PHP.
Solo le dolerá si aplica ese conocimiento a idiomas de nivel superior cuando en realidad no es necesario. Claro, con un poco de experiencia en C de bajo nivel al escribir mis propias clases de colección, también podría hacerlo en, digamos, Java. ¿Pero sería una mejor alternativa a la biblioteca de Colecciones existente (tanto la API de Java como los extras de Colecciones de los Comunes)? Tal vez.
En la práctica, tendrías que calcular si el tiempo invertido vale la pena.
En verdad, simplemente debes investigar antes de piratear tu código. Vea si lo que está tratando de hacer puede hacerse utilizando herramientas integradas o de terceros. Si puede, vea si las herramientas incorporadas o de terceros hacen lo que desea y si funcionan bien. Si no lo hacen, descubra por qué no. Si ellos / realmente / no hacen, reescriban.
Como otros han declarado, todo el conocimiento vale la pena. Y con eso quiero decir / all / - tanto el código C optimizado de bajo nivel, como las llamadas de alto nivel a las bibliotecas bien desarrolladas. Si conoce ambos, sabrá cuál usar cuando y por qué.
Usar los lenguajes - natural (hablado) o artificial (programación) - requiere que la mente se adapte de cierta manera. Cada idioma tiene su propia gramática, su propio vocabulario (API), etc. Si eres en su mayoría un programador de Java y cambias a Ruby, al menos seguirás los patrones de pensamiento de un programador Java, si no escribes lo que básicamente es código Java en Rubí. Lleva un poco de esfuerzo y práctica hasta que comiences a sentirte cómodo en el nuevo entorno (Ruby grammar, Ruby APIs) y comiences a escribir el código de Ruby .
Entonces, el proceso es perfectamente normal y cualquier efecto adverso de patrones previos es muy efímero. Lo que es más importante, cada idioma que aprende amplía sus horizontes y facilita el aprendizaje del siguiente. Disfruta el viaje. :]
el conocimiento no daña nunca. Los que escribieron código incorrecto en un lenguaje de nivel superior se deben a que no dominaron correctamente el lenguaje de nivel superior, los malos desarrolladores.
no.
Si pierde su deseo de saber y mejorar aunque esté dañado.