Parte de una serie sobre |
Desarrollo de software |
---|
La programación o codificación informática es la composición de secuencias de instrucciones, llamadas programas , que las computadoras pueden seguir para realizar tareas. [1] [2] Implica el diseño e implementación de algoritmos , especificaciones paso a paso de procedimientos, mediante la escritura de código en uno o más lenguajes de programación . Los programadores suelen utilizar lenguajes de programación de alto nivel que son más fácilmente inteligibles para los humanos que el código de máquina , que es ejecutado directamente por la unidad central de procesamiento . La programación competente generalmente requiere experiencia en varias materias diferentes, incluido el conocimiento del dominio de la aplicación , detalles de los lenguajes de programación y bibliotecas de códigos genéricos , algoritmos especializados y lógica formal .
Las tareas auxiliares que acompañan y están relacionadas con la programación incluyen el análisis de requisitos , las pruebas , la depuración (investigar y solucionar problemas), la implementación de sistemas de compilación y la gestión de artefactos derivados , como el código de máquina de los programas . Si bien a veces se las considera programación, a menudo se utiliza el término desarrollo de software para este proceso general más amplio, y los términos programación , implementación y codificación se reservan para la escritura y edición del código en sí. A veces, el desarrollo de software se conoce como ingeniería de software , especialmente cuando emplea métodos formales o sigue un proceso de diseño de ingeniería .
Los dispositivos programables existen desde hace siglos. Ya en el siglo IX, los hermanos persas Banu Musa inventaron un secuenciador musical programable , que describió un flautista mecánico automatizado en el Libro de los ingeniosos dispositivos . [3] [4] En 1206, el ingeniero árabe Al-Jazari inventó una caja de ritmos programable en la que se podía hacer que un autómata mecánico musical tocara diferentes ritmos y patrones de batería, mediante clavijas y levas . [5] [6] En 1801, el telar Jacquard podía producir tejidos completamente diferentes cambiando el "programa" (una serie de tarjetas de cartón con agujeros perforados en ellas).
Los algoritmos de descifrado de códigos también existen desde hace siglos. En el siglo IX, el matemático árabe Al-Kindi describió un algoritmo criptográfico para descifrar códigos cifrados en Un manuscrito sobre el descifrado de mensajes criptográficos . Dio la primera descripción del criptoanálisis por análisis de frecuencia , el algoritmo de descifrado de códigos más antiguo. [7]
El primer programa de ordenador se remonta generalmente a 1843, cuando la matemática Ada Lovelace publicó un algoritmo para calcular una secuencia de números de Bernoulli , que debía ser ejecutado por la máquina analítica de Charles Babbage . [8] Sin embargo, el propio Charles Babbage había escrito un programa para la máquina analítica en 1837. [9] [10]
En la década de 1880, Herman Hollerith inventó el concepto de almacenar datos en forma legible por máquina. [11] Más tarde, un panel de control (placa de conexión) añadido a su Tabulador Tipo I de 1906 permitió programarlo para diferentes trabajos y, a fines de la década de 1940, los equipos de registro unitario como el IBM 602 y el IBM 604 , se programaban mediante paneles de control de manera similar, al igual que las primeras computadoras electrónicas . Sin embargo, con el concepto de computadora de programa almacenado introducido en 1949, tanto los programas como los datos se almacenaban y manipulaban de la misma manera en la memoria de la computadora . [12]
El código de máquina era el lenguaje de los primeros programas, escrito en el conjunto de instrucciones de la máquina en cuestión, a menudo en notación binaria . Pronto se desarrollaron lenguajes ensambladores que permitían al programador especificar instrucciones en formato de texto (por ejemplo, ADD X, TOTAL), con abreviaturas para cada código de operación y nombres significativos para especificar direcciones. Sin embargo, debido a que un lenguaje ensamblador es poco más que una notación diferente para un lenguaje de máquina, dos máquinas con conjuntos de instrucciones diferentes también tienen lenguajes ensambladores diferentes.
Los lenguajes de alto nivel hicieron que el proceso de desarrollo de un programa fuera más simple y comprensible, y menos ligado al hardware subyacente . La primera herramienta relacionada con el compilador, el Sistema A-0 , fue desarrollada en 1952 [13] por Grace Hopper , quien también acuñó el término "compilador". [14] [15] FORTRAN , el primer lenguaje de alto nivel ampliamente utilizado en tener una implementación funcional, salió en 1957, [16] y pronto se desarrollaron muchos otros lenguajes, en particular, COBOL destinado al procesamiento de datos comerciales, y Lisp para la investigación informática.
Estos lenguajes compilados permiten al programador escribir programas en términos sintácticamente más ricos y con mayor capacidad de abstraer el código, lo que facilita la selección de conjuntos de instrucciones de máquina variables mediante declaraciones de compilación y heurísticas . Los compiladores aprovecharon el poder de las computadoras para facilitar la programación [16] al permitir a los programadores especificar cálculos ingresando una fórmula utilizando notación infija .
Los programas se introducían principalmente mediante tarjetas perforadas o cintas de papel . A finales de los años 60, los dispositivos de almacenamiento de datos y las terminales de ordenador se volvieron lo suficientemente económicos como para que los programas se pudieran crear escribiendo directamente en los ordenadores. También se desarrollaron editores de texto que permitían realizar cambios y correcciones con mucha más facilidad que con tarjetas perforadas .
Cualquiera que sea el enfoque de desarrollo, el programa final debe satisfacer algunas propiedades fundamentales. Entre las más importantes se encuentran las siguientes: [17] [18]
El uso de pruebas automatizadas y funciones de aptitud puede ayudar a mantener algunos de los atributos mencionados anteriormente. [20]
En programación informática, la legibilidad se refiere a la facilidad con la que un lector humano puede comprender el propósito, el flujo de control y el funcionamiento del código fuente . Afecta los aspectos de calidad antes mencionados, incluida la portabilidad, la facilidad de uso y, lo más importante, la facilidad de mantenimiento.
La legibilidad es importante porque los programadores pasan la mayor parte de su tiempo leyendo, intentando comprender, reutilizando y modificando el código fuente existente, en lugar de escribir código fuente nuevo. El código ilegible suele dar lugar a errores, ineficiencias y código duplicado . Un estudio descubrió que unas pocas transformaciones sencillas de legibilidad acortaban el código y reducían drásticamente el tiempo necesario para comprenderlo. [21]
Seguir un estilo de programación coherente suele mejorar la legibilidad. Sin embargo, la legibilidad es más que un simple estilo de programación. Muchos factores, que tienen poco o nada que ver con la capacidad del ordenador para compilar y ejecutar el código de forma eficiente, contribuyen a la legibilidad. [22] Algunos de estos factores son:
Los aspectos de presentación de esto (como sangrías, saltos de línea, resaltado de color, etc.) a menudo son manejados por el editor de código fuente , pero los aspectos de contenido reflejan el talento y las habilidades del programador.
También se han desarrollado varios lenguajes de programación visual con la intención de resolver problemas de legibilidad mediante la adopción de enfoques no tradicionales para la estructura y visualización del código. Los entornos de desarrollo integrados (IDE) tienen como objetivo integrar toda esa ayuda. Técnicas como la refactorización de código pueden mejorar la legibilidad.
El campo académico y la práctica de ingeniería de la programación informática se ocupan de descubrir e implementar los algoritmos más eficientes para una clase determinada de problemas. Para ello, los algoritmos se clasifican en órdenes utilizando la notación Big O , que expresa el uso de recursos (como el tiempo de ejecución o el consumo de memoria) en términos del tamaño de una entrada. Los programadores expertos están familiarizados con una variedad de algoritmos bien establecidos y sus respectivas complejidades y utilizan este conocimiento para elegir los algoritmos que mejor se adaptan a las circunstancias.
El primer paso en la mayoría de los procesos de desarrollo de software formales es el análisis de requisitos , seguido de las pruebas para determinar el valor, el modelado, la implementación y la eliminación de fallas (depuración). Existen muchos enfoques diferentes para cada una de esas tareas. Un enfoque popular para el análisis de requisitos es el análisis de casos de uso . Muchos programadores utilizan formas de desarrollo de software ágil donde las diversas etapas del desarrollo de software formal están más integradas en ciclos cortos que toman unas pocas semanas en lugar de años. Existen muchos enfoques para el proceso de desarrollo de software.
Las técnicas de modelado más populares incluyen el análisis y diseño orientado a objetos ( OOAD ) y la arquitectura basada en modelos ( MDA ). El lenguaje de modelado unificado ( UML ) es una notación utilizada tanto para OOAD como para MDA.
Una técnica similar utilizada para el diseño de bases de datos es el modelado entidad-relación ( modelado ER ).
Las técnicas de implementación incluyen lenguajes imperativos ( orientados a objetos o procedimentales ), lenguajes funcionales y lenguajes de programación lógica .
Es muy difícil determinar cuáles son los lenguajes de programación modernos más populares. Los métodos para medir la popularidad de un lenguaje de programación incluyen: contar la cantidad de anuncios de trabajo que mencionan el lenguaje, [23] la cantidad de libros vendidos y cursos que enseñan el lenguaje (esto sobreestima la importancia de los lenguajes más nuevos) y estimaciones de la cantidad de líneas de código existentes escritas en el lenguaje (esto subestima la cantidad de usuarios de lenguajes comerciales como COBOL).
Algunos lenguajes son muy populares para determinados tipos de aplicaciones, mientras que otros se utilizan habitualmente para escribir muchos tipos diferentes de aplicaciones. Por ejemplo, COBOL sigue siendo fuerte en los centros de datos corporativos [24] , a menudo en grandes ordenadores mainframe , Fortran en aplicaciones de ingeniería, lenguajes de programación en el desarrollo web y C en software integrado . Muchas aplicaciones utilizan una mezcla de varios lenguajes en su construcción y uso. Los nuevos lenguajes suelen diseñarse en torno a la sintaxis de un lenguaje anterior al que se le añade nueva funcionalidad (por ejemplo, C++ añade orientación a objetos a C, y Java añade gestión de memoria y bytecode a C++, pero como resultado, pierde eficiencia y la capacidad de manipulación de bajo nivel).
La depuración es una tarea muy importante en el proceso de desarrollo de software, ya que la presencia de defectos en un programa puede tener consecuencias significativas para sus usuarios. Algunos lenguajes son más propensos a ciertos tipos de fallos porque su especificación no requiere que los compiladores realicen tantas comprobaciones como otros lenguajes. El uso de una herramienta de análisis de código estático puede ayudar a detectar algunos posibles problemas. Normalmente, el primer paso en la depuración es intentar reproducir el problema. Esta puede ser una tarea no trivial, por ejemplo, con procesos paralelos o algunos errores de software inusuales. Además, el entorno de usuario específico y el historial de uso pueden dificultar la reproducción del problema.
Una vez que se reproduce el error, es posible que sea necesario simplificar la entrada del programa para facilitar su depuración. Por ejemplo, cuando un error en un compilador puede hacer que se bloquee al analizar un archivo fuente grande, una simplificación del caso de prueba que dé como resultado solo unas pocas líneas del archivo fuente original puede ser suficiente para reproducir el mismo error. Se necesita un método de prueba y error/divide y vencerás: el programador intentará eliminar algunas partes del caso de prueba original y verificará si el problema aún existe. Al depurar el problema en una GUI, el programador puede intentar omitir alguna interacción del usuario de la descripción del problema original y verificar si las acciones restantes son suficientes para que aparezcan los errores. La creación de scripts y puntos de interrupción también son parte de este proceso.
La depuración se realiza a menudo con IDE . También se utilizan depuradores independientes como GDB , que suelen proporcionar un entorno menos visual, normalmente utilizando una línea de comandos . Algunos editores de texto como Emacs permiten invocar GDB a través de ellos, para proporcionar un entorno visual.
Los distintos lenguajes de programación admiten distintos estilos de programación (denominados paradigmas de programación ). La elección del lenguaje utilizado está sujeta a muchas consideraciones, como la política de la empresa, la idoneidad para la tarea, la disponibilidad de paquetes de terceros o las preferencias individuales. Lo ideal es seleccionar el lenguaje de programación más adecuado para la tarea en cuestión. Las compensaciones de este ideal implican encontrar suficientes programadores que conozcan el lenguaje para formar un equipo, la disponibilidad de compiladores para ese lenguaje y la eficiencia con la que se ejecutan los programas escritos en un lenguaje determinado. Los lenguajes forman un espectro aproximado de "bajo nivel" a "alto nivel"; los lenguajes de "bajo nivel" suelen estar más orientados a la máquina y son más rápidos de ejecutar, mientras que los lenguajes de "alto nivel" son más abstractos y más fáciles de usar, pero se ejecutan con menor rapidez. Suele ser más fácil codificar en lenguajes de "alto nivel" que en los de "bajo nivel". Los lenguajes de programación son esenciales para el desarrollo de software. Son los componentes básicos de todo software, desde las aplicaciones más sencillas hasta las más sofisticadas.
Allen Downey , en su libro Cómo pensar como un científico informático , escribe:
Muchos lenguajes informáticos proporcionan un mecanismo para llamar a funciones proporcionadas por bibliotecas compartidas . Siempre que las funciones de una biblioteca sigan las convenciones de tiempo de ejecución adecuadas (por ejemplo, el método de paso de argumentos ), estas funciones pueden escribirse en cualquier otro lenguaje.
Los programadores informáticos son aquellos que escriben software informático. Sus trabajos suelen implicar:
Aunque la programación se ha presentado en los medios como un tema más bien matemático, algunas investigaciones muestran que los buenos programadores tienen fuertes habilidades en lenguajes humanos naturales, y que aprender a codificar es similar a aprender un idioma extranjero . [26] [27]
La iniciativa informática busca eliminar las barreras a la adopción de la nube en materia de seguridad, interoperabilidad, portabilidad y confiabilidad.
¿Se basa en...? Fiabilidad Portabilidad Compatibilidad