Teoría sobre Desenvolvemento de software

De MediaWiki
Ir a la navegación Ir a la búsqueda


Sumario

Obxectivos

  • Comprender os principios básicos do desenvolvemento de software
  • Coñecer as linguaxes de programación e as súas características
  • Coñecer as fases de desenvolvemento das aplicacións e as filosofías áxiles
  • Comprender a diferencia entre compiladores, intérpretes e máquinas virtuais

Concepto de programa informático

Un programa é unha serie de órdenes ou instruccións secuenciadas u ordenadas cunha finalidade concreta e que realizan unha función determinada.

Un exemplo sería o típico programa Hola mundo que amosará esas palabras na pantalla desarrollado na linguaxe C:

 /* Programa holamundo.c */
 #include <stdio.h>
 main(){
    printf(“Hola Mundo”);
 }

Concepto de aplicación informática

Existen no mercado infinidade de aplicacións informáticas cada unha coa súa utilidade e finalidade concreta.

As aplicacións adoitan estar formadas por varios programas coas súas librerías correspondentes (aínda que tamén poderían constar únicamente dun programa).

Unha suite ou paquete integrado é cando son varios programas que poden executarse independientemente uns dos outros, coma por exemplo a suite ofimática LibreOffice. Estes programas teñen un nexo de unión en común, comparten librerías, almacén e incluso datos; e a compatibilidad entre eles é completa.

Unha aplicación informática está en contacto co usuario e non co hardware. Será o sistema operativo o que faga de nexo de unión entre ambos (aplicación informática e hardware).

Existen multitude de aplicacións informáticas que automatizan o axudan na realización de certas tareas. Por ejempxo:

  • Programas de contabilidade.
  • Bases de datos.
  • Programas de deseño gráfico.
  • Procesadores de texto.
  • Programas de facturación.
  • Aplicacións multimedia.
  • Follas de cálculo.
  • Presentacions.
  • Ferramentas de correo electrónico.
  • ...

Software a medida e software estándar

Un software a medida é unha ou varias aplicacións realizadas segundo os requerimientos e instruccións dunha empresa ou organismo. Amoldanse á a actividad desarrollada e son deseñados á medida do organismo, a súa forma de traballar e as súas necesidades.

Algunas características do software a medida son:

  1. Necesita un teempo de planificación, análise,desarrollo, probas e posta en producción.
  2. Adáptase as necesidades específicas da empresa.
    Esto implica que en ocasións ese software non sexa trasladable a outras empresas diferentes (incluso dentro do mesmo sector).
  3. Adoita conter erros e precisar dunha etapa de mantemento na que se subsanan e se melloran ou engaden funcionalidades.
  4. É máis costoso que o software estándar debido a que o seu custe soportao un só cliente.
    No software enlatado ou estándar ese precio abarátase pola sua producción para distintos compradores.

O software estándar ou enlatado é un software xenérico (válido para calquier cliente potencial) que resolve múltiples necesidades.

Normalmente, para facelo máis adaptable conta con ferramentas de configuración que o parametrizan e o adaptan as necesidades do cliente. Non é o software ideal, xa que lle faltarán posiblemente algunhas opcións, procedemientos e procesos que a empresa realiza e lle sobrarán outros. Isto pode requerir adaptar o código (se e software libre) ou complementar o seu uso con otura ferramientas.

As súas principais características son:

  1. Cómprase xa feito. Póde requerir adaptalo as necesidades da empresa parametrizandoo ou configuralo axeitadamente para o seu entorno tecnolóxico.
  2. Adoita ter menos erros que o software a medida dado que foi probado por múltiples empresas.
  3. Adoita ser máis económico que o software a medida, posto que os custes de desenvolvemento amortízanse entre moitas licencias.
  4. Adoita ter funcións que a empresa non usará e también carecerá doutras opcións; non se adapta completamente as necesidades dunha empresa (e é esta a que se ten que adaptar as posibilidades do software).

Fases do desenvolvemento dunha aplicación: análise, deseño, codificación, probas, documentación, explotación e mantemento

Linguaxes de programación. Xercións e tendencias

Definición

Un lenguaje de programación es un lenguaje formal que le proporciona a una persona, en este caso el programador, la capacidad de escribir (o programar) una serie de instrucciones o secuencias de órdenes en forma de algoritmos con el fin de controlar el comportamiento físico o lógico de un sistema informático, de manera que se puedan obtener diversas clases de datos o ejecutar determinadas tareas.

Características

Programar viene a ser el proceso de crear un software fiable mediante la escritura, prueba, depuración, compilación o interpretación, y mantenimiento del código fuente de dicho programa informático. Básicamente, este proceso se define aplicando lógicamente los siguientes pasos:

  • El desarrollo lógico del programa para resolver un problema en particular.
  • Escritura de la lógica del programa empleando un lenguaje de programación específico (codificación del programa).
  • Compilación o interpretación del programa hasta convertirlo en lenguaje de máquina.
  • Prueba y depuración del programa.
  • Desarrollo de la documentación.

Los lenguajes de programación están formados por un conjunto de símbolos (llamado alfabeto), de reglas gramaticales (léxico/morfológicas y sintácticas) y de reglas semánticas, que en conjunto definen las estructuras válidas del lenguaje y su significado

Generaciones

Pueden clasificarse en cinco generaciones.

Primera generación (1GL)

Formada por los lenguajes de programación utilizados en los primeros ordenadores: lenguaje máquina y ensamblador.

Segunda generación (2GL)

Formada por el lenguaje macroensamblador que es ensamblador combinado con instrucciones de control y de manejo de datos más complejas. Estos lenguajes son específicas para una familia de procesadores y el hardware relacionado con el. Aún se siguen utilizando para programar los núcleos (kernel) de los sistemas operativos y los controladores de algunos dispositivos (device drivers).

Tercera generación (3GL)

Formada por la mayor parte de los lenguajes de alto nivel actuales. El código es independiente de la máquina y el lenguaje de programación es parecido al lenguaje humano. Por ejemplo: Java, C, C++, PHP, JavaScript, e Visual Basic.

Cuarta generación (4GL)

Formada por lenguajes y entornos diseñados para una tarea o propósito muy específico como acceso a bases de datos, generación de informes, generación de interfaces de usuario, etcétera. Por ejemplo: SQL, Informix 4GL y Progress 4GL.

Quinta generación (5GL)

Formada por lenguajes en las que el programador establece el problema a resolver y las condiciones a cumplir. Se usan en inteligencia artificial, sistemas basados en el conocimiento, sistemas expertos, mecanismos de inferencia o procesamento del lenguaje natural. Por ejemplo: Prolog, Smalltalk y Lisp.

Los lenguajes de programación actuales y su tendencia

Para saber cuales son los lenguajes más difundidos poden consultarse los siguientes índices o clasificaciones:

  • Índice Tiobe: Se basa en el número de ingenieros cualificados en cada lenguaje en todo el mundo, cursos de lenguajes ofertados, provedores que trabajan sobre los lenguajes, búsquedas realizadas en Google, Bing, Yahoo, Wikipedia, Amazon, YouTube y Baidu; y una serie de premisas como por ejemplo que el lenguaj exista como lenguaxe de programación en Wikipedia y que tenga por lo menos 10000 visitas en Google.
  • Índice PYPL ou PopularitY of Programming Language index: se basa en el análisis de frecuencia de búsqueda de tutoriales o guías de lenguajes de programación en Google utilizando Google Trends.
  • clasificación Redmonk: no basa su clasificación en la información de los buscadores si no en los proyectos albergados en los repositorios en GitHub y en las preguntas de la web de StackOverflow orientada a programadores. Incluye lenguajes informáticos y no solo lenguajes de programación.
  • clasificación Trendyskills: Se basa en las ofertas de empleo para los lenguajes de programación en varios países europeos y Estados Unidos. Incluye lenguajes informáticos y no solo lenguajes de programación.
  • IEEE Spectrum: Se basa en la combinación de once métricas de 8 fuentes: CareerBuilder, GitHub, Google, Hacker News, the IEEE, Reddit, Stack Overflow y Twitter

Los lenguajes comunes a todos estos índices en el año 2021 en los 10 primeros puestos son: C, C++, Java, C#, PHP, Python y JavaScript.

10 Lenguajes de programación más populares en 2021
Índice Tiobe Índice PYPL Clasificación Redmonk Clasificación Trendyskills Clasificación IEEE Spectrum
C Python Javascript Java Python
Java Java Python Python Java
Python Javascript Java JavaScript C
C++ C# PHP C++ C++
C# C/C++ C++ TypeScript JavaScript
Visual Basic PHP C# J R
JavaScript R Ruby C# Arduino
Assembly language Objective-C CSS PHP Go
PHP TypeScript TypeScript Go Swift
SQL Swift C HTML Matlab

Tipos

En función de se requiren compilación ou interpretación

Código fonte, código obxecto e código executable

Lenguajes interpretados

Lenguajes compilados

Máquinas virtuais e linguaxe intermedia

En función del nivel de abstracción

En función del nivel de abstracción podemos diferenciar de más bajo a más alto nivel entre:

  • Lenguaje máquina: Mantiene una dependencia total con la arquitectura física de la máquina; siguen una notación binaria.
  • Lenguaje ensamblador: Permite escribir instrucciones con una notación simbólica o nemotécnica.
  • Lenguaje de alto nivel: Aporta una mayor independencia de la máquina; esto lenguajes requieren ser compilados o interpretados

En función paradigma de programación

Un paradigma de programación es una metodología o filosofía de programación a seguir con un núcleo central incuestionable; es decir, los lenguajes que utilizan el mismo paradigma de programación utilizarán los mesmos conceptos básicos para programar.

Pueden clasificarse en dos grandes grupos: el grupo que sigue el paradigma imperativo e el que sigue el paradigma declarativo.

Lenguajes Declarativos

El código indica que es lo que se quiere obtener pero no cómo se tiene que obtener.

Es un conjunto de condiciones, proposiciones, afirmaciones, restricciones, ecuaciones o transformaciones que describen el problema y detallan se solución. El programador tiene que pensar en la lógica del algoritmo y no en la secuencia de ordenes para que se lleve a cabo.

Un lenguaje declarativo es un tipo de lenguaje de programación basado más en las matemáticas y en la lógica que los lenguajes imperativos, más cercanos estos al razonamiento humano. Los lenguajes declarativos no dicen cómo hacer una cosa, sino, más bien, qué cosa hacer. Hay dos subtipos:

  • Lenguajes Funcionales
  • Lenguajes Lógicos.

Lenguajes funcionales

Se trata de lenguajes de programación sin asignaciones, basados en el concepto matemático de función.

Consisten en combinar funciones para conseguir funciones más complejas hasta llegar a la función que es el programa.

Ejemplos de estos lenguajes son LISP y SCHEME

Lenguajes lógicos

Son lenguajes en los que se especifican un conjunto de hechos y una serie de reglas que permiten la deducción de otros hechos. El sistema utiliza esa información para encontrar la solución.

La programación lógica desde la perspectiva del programador consiste en establecer correctamente todos los hechos y reglas, ya que el cálculo está implícito.

El lenguaje lógico más representativo es PROLOG, basado en la lógica de predicados.

Lenguajes Imperativos

El código está formado por una serie de pasos o instrucciones para realizar una tarea organizando o cambiando valores en memoria. Las instruciones se ejecutan de forma secuencial, es decir, hasta que no se ejecuta una no se pasa a ejecutar la siguiente. Entre muchos otros, Java, C, C++, PHP, JavaScript y Visual Basic son ejemplos de lenguajes imperativos.

Dentro de los lenguajes imperativos se van produciendo evoluciones de la metodología estructurada a nuevos enfoques como son la programación orientada a objetos, la programación orientada a aspectos, la programación concurrente u la programación multiparadigma.

A finales de los años 60 nace la metodología estructurada que permitía tres tipos de estructuras en el código:

  • la secuencial
  • la alternativa (basada en una decisión)
  • la repetitiva (bucles).

Los programas están formados por datos y esas estructuras. Un ejemplo sería el lenguaje Basic.

La primera evolución supuso añadir al módulo como componente básico dando lugar a la programación estructurada y modular. Los programas estaban formados por módulos o procesos por un lado y datos por otro. Los módulos necesitaban unos datos de entrada y obtenían otros de salida que a su vez podían ser utilizados por otros módulos. Por ejemplo, C es un lenguaje estructurado y modular.

En los años 80 apareció la programación orientada a objetos, y otros enfoques como la programación concurrente, la orientada a eventos, la orientada a aspectos, y la multiparadigma

Orientados a objetos

Esta metodología se popularizó a principios de los 90 siendo actualmente una de las más utilizadas. Cada objeto sigue el patrón especificado en una clase. Los programas contienen objetos que se relacionan o colaboran con otros objetos de su misma clase o de otras clases. La clase está compuesta de atributos (datos) y métodos (procesos) y puede tener las propiedades:

  • Herencia. Pueden declararse clases hijas que heredan las propiedades y métodos de la clase padre. Los métodos heredados pueden sobrecargarse; esto es, dentro de la misma clase puede aparecer definido con distinto comportamiento el mismo método con diferente firma (número de parámetros y tipo de los mismos)
  • Polimorfismo. Propiedad que permite que un método se comporte de diferente manera dependiendo del objeto sobre el que se aplica.
  • Encapsulamiento. Permite ocultar detalles internos de una clase.

C++, C# y Java son ejemplos de lenguajes orientadas a objetos.

Lenguajes concurrentes

Dijkstra instigó el estudio de la programación concurrente en su ahora clásico artículo "Procesos secuenciales de cooperación", publicado en 1967. En ese artículo vemos la introducción de algunos problemas ahora bien conocidos como "The Dining Philosophers","The Sleeping Barber " y "The Dutch Flag Problem"; y quizás lo más importante, el problema de la sección crítica y su solución utilizando semáforos. Este artículo fue, de hecho, el primero en tener una visión de alto nivel de la programación concurrente.

Su filosofía es la división de un problema en subproblemas que se solucionan de forma individual, para crear un programa o aplicación que no se vea afectada en tiempo real.

Un lenguaje de programación será concurrente si posee las estructuras necesarias para definir y manejar diferentes tareas (hilos de ejecución) dentro de un programa de forma simultánea gestionando los problemas de comunicación y sincronización entre esos hilos.

Ejemplos: Java, Ada

Lenguajes conducidos por eventos

La programación dirigida por eventos, es un paradigma de programación en el que tanto la estructura como la ejecución de los programas van determinados por los sucesos que ocurran en el sistema, definidos por el usuario (como un clic de ratón o pulsación de teclado) o que ellos mismos provoquen.

Este es el paradigma más habitual en el desarrollo de interfaces gráficas de usuario (GUI) o drivers de dispositivos.

Swift sería un lenguaje representativo de este paradigma.

Lenguajes orientados a aspectos

La idea central de la POA es permitir que un programa sea construido describiendo cada concepto (o incumbencia) separadamente. El soporte para este nuevo paradigma se logra a través de una nueva clase de lenguajes, llamados lenguajes orientados a aspectos (LOA), los cuales brindan mecanismos para capturar y declarar aquellos elementos que se diseminan por todo el sistema (aspectos).

Los LOA son aquellos lenguajes que permiten separar la definición de la funcionalidad “principal” de la definición de los diferentes aspectos.

Los LOA deben satisfacer varias propiedades deseables, entre las que se pueden mencionar:

  • Cada aspecto debe ser claramente identificable.
  • Cada aspecto debe auto contenerse.
  • Los aspectos deben ser fácilmente modificables.
  • Los aspectos no deben interferir entre ellos.
  • Los aspectos no deben interferir con los mecanismos usados para definir y evolucionar la funcionalidad principal, como la herencia.

Se distinguen dos enfoques diferentes en el diseño de los lenguajes orientados a aspectos:

  • los lenguajes orientados a aspectos de dominio específico. Por ejemplo:
    • COOL (COOrdination Language) es un lenguaje de dominio específico, desarrollado por Xerox, cuya finalidad es tratar los aspectos de sincronismo entre hilos concurrentes.
    • RIDL (Remote Interaction and Data transfers aspect Language) es un LOA de dominio específico que maneja la transferencia de datos entre diferentes espacios de ejecución.
    • MALAJ (Multi Aspect LAnguage for Java) [13] es un LOA de dominio especifico, focalizado en la sincronización y reubicación.
  • los lenguajes orientados a aspectos de propósito general. Algunos ejemplos
    • AspectC: LOA que extiende C.
    • AspectC++: LOA que extiende de C++
    • AspectJ: LOA que extiende de Java

Programación multiparadigma

La Programación Multiparadigma es una práctica que emerge como resultado de la coeexistencia de los paradigmas orientado a objetos, procedural, declarativo y funcional buscando mejorar la producción en el desarrollo de proyectos.

Rust quizás sea su mejor exponente: es un lenguaje de programación compilado, de propósito general y multiparadigma que está siendo desarrollado por Mozilla.​ Ha sido diseñado para ser "un lenguaje seguro, concurrente y práctico".

Python también encajaría: es orientado a objetos, reflexivo, imperativo y funcional.

En función del dominio de aplicación

Podemos tener la siguiente clasificación en función de los dominios de aplicación siguientes:

  • Aplicaciones científico-técnicas: Como ejemplo tenemos MATLAB o R.
  • Aplicaciones de gestión de información: Como ejemplo tenemos Java, o SQL.
  • Aplicaciones de programación de sistemas: Como ejemplo tenemos C, o C++.
  • Aplicaciones Web: Como ejemplo tenemos PHP, o Javascript.
  • Aplicaciones para movilidad: Como ejemplos tenemos Swift, o Kotlim.

Otros lenguajes y su clasificación

Existen otros lenguajes informáticos, que sin ser estrictamente de programación, si son de gran importancia en la informática y en la web. Una posible clasificación de esos lenguajes sería: lenguajes de marcas, especificación, consulta y transformación

Lenguajes de marcas

Permiten colocar distintivos o señales en el texto que serán interpretadas por aplicaciones o procesos. Algunos ejemplos de lenguajes de marcas:

  • XML (eXtensible Markup Language): metalenguaje extensible pensada para la transmisión de información estructurada y que pueda ser validada.
<?xml version="1.0" encoding="UTF-8"?>
<alumnos>
  <alumno>
     <nome>Xurxo</nome>
     <apelidos>Losada Blanco</apelidos>
  </alumno>
  <alumno>
     <nome>Antía</nome>
     <apelidos>Pérez López</apelidos>
  </alumno>   
</alumnos>
  • HTML (Hiper Text Markup Language) o XHTML (eXtensible Hiper Text Markup Language): sirven ambas para publicar hipertexto en la Word Wide Web.
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
 <!-- Ejemplo muy básico de XHTML con estilo externo -->
 <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Ejemplo básico de xhtml</title>
        <meta   content="text/html; charset=utf-8" 
                http-equiv="Content-Type" />
        <link   rel="stylesheet" href="ejemplo_css.css" 
                type="text/css" />
    </head>
    <body>
        <h1>Cabeceira principal</h1>
        <p class="principal">Este párrafo contiene texto y un enlace a 
            <a href="http://www.realacademiagalega.org/">Real Academia Galega </a>.
        </p>
    </body>
 </html>

Lenguajes de especificación

Describen algo de forma precisa. Por exemplo CSS (Cascading Style Sheets) é unha linguaxe formal que especifica a presentación ou estilo dun documento HTML, XML ou XHTML. Exemplo de código CSS que se podería aplicar ao exemplo XHTML anterior e editado en Notepad++:

body{
   font-family: "MS Sans Serif", Geneva, sans-serif;
   font-size: 15px;
   color: Black;
   border:black 2px double;
   padding: 40px;
   margin: 20px;}
h1 {
   font: 40px "Times New Roman", Times, serif;
   font-weight: bolder;
   word-spacing: 25px;}
p.principal{
   text-align: center;
   font: 10px "MS Serif", "New York", serif;}

Lenguajes de consultas

Permiten extraer o manipular información de un grupo de información. Por ejemplo:

  • el lenguaje de consultas SQL (Standard Query Language) permite buscar y manipular información en bases de datos relacionales
-- Ejemplo de script SQL:
select *
from empleados;
  • el lenguaxe XQuery permite buscar y manipular información en bases de datos XML nativas
--Ejemplo de expresión FLOWR (for, let, order by, where, return) en XQuery:
for $libro in doc("libros.xml")/bib/libro
let $editorial := $libro/editorial
where $editorial="MCGRAW/HILL" or contains($editorial, "Toxosoutos")
return $libro

Lenguajes de transformación

Actúan sobre una información inicial par obtener otra nueva.

Por exemplo, el lenguaje XSLT (eXtensible Stylesheet Language Tranformations) permite describir las transformaciones que se van realizar sobre un documento XML para obtener otro archivo.

Un ejemplo de transformación XSL que cuando actúa sobre el exemplo XML anterior obtiene una páxina HTML con una lista del alumnado:

 <?xml version="1.0" encoding="UTF-8"?>
 <!-- Ejemplo sencillo de transformación XSL -->
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="html"/>
    <xsl:template match="alumnos">
        <html>
            <head>
                <title>fundamentos.xsl</title>
            </head>
            <body>
                <h1>Alumnos</h1>
                <ul>                
                    <xsl:for-each select="alumno">
                        <li>
                            <xsl:value-of select="apelidos"/>, 
                            <xsl:value-of select="nome"/>
                        </li>
                    </xsl:for-each>
                </ul>
            </body>
        </html>
    </xsl:template>
 </xsl:stylesheet>

Proceso de obtención de código executable a partir do código fonte: ferramentas implicadas

Resumo

  • O software é a parte intanxible e lóxica dun sistema informático. Ten estas características:
    • é lóxico, non físico
    • desenvólvese, non se fabrica
    • non se estropea e facer unha copia da lugar a un clon.
    • pode construirse a medida.
  • Un programa é unha serie de órdenes o instrucciones secuenciadas u ordenadas cunha finalidade concreta que realizan unha función determinada
  • Un software a medida é unha ou varias aplicacións realizadas segundo os requerimentos e instruccións dunha empresa ou organismo
  • O software estándar ou enlatado é aquel de tipo xenérico que resolve múltiples necesidade.
  • As linguaxes de programación son unha linguaxe artificial creada para que cada unha das instruccións da linguaxe den lugar ó traducirse a código máquina nunha ou varias instruccións máquina
  • A linguaxe máquina:
    • é inintelixible
    • componse de combinacións de uns e ceros
    • non necesita ser traducida
    • é a única linguaxe que entende directamente o ordenador
    • foi a primeira utilizada
    • debe ser diferente para cada procesador
  • A linguaxe de nivel medio ou ensamblador:
    • substituíu a linguaxe máquina para facilitar a labor de programación
    • segue estando cercano al hardware, pero en lugar de uns e ceros, se programa usando mnemotécnicos
    • traballa cos registros do procesador e enderezos físicos
    • é difícil de comprender e programar
  • As linguaxes de alto nivel:
    • teñen unha forma de programar más intuitiva e sinxela
    • son máis cercanos a linguaxe humana que a linguaxe máquina
  • As linnguaxes poden clasificarse en:
    • compiladas
    • interpretadas
    • virtuais
  • Los traductores son programas cuya finalidad es traducir lenguajes de alto nivel a len guajes de bajo nivel como ensamblador o código máquina.
  • Existen dos grandes grupos de tipos de traductores:
    • Compiladores: traducen el código fuente a código máquina.
    • Intérpretes: traducen el código fuente línea a línea.
  • Os estados dun programa son os seguintes:
  • Código fonte. Código escrito nunha linguaxe de programación.
  • Código obxecto. Resultado de compilar o código fonte.
  • Código executable. Resultado de compilar e enlazar o código coas librerías.
  • As fases clásicas do desenvovemento dunha aplicación son:
    • Fase inicial
    • Análise
    • Deseño
    • Codificación
    • Probas
    • Explotación
    • Mantemento
  • Como mínimo deberán xerarse en calquer aplicación os seguintes documentos:
    • manual de usuario
    • manual técnico
    • manual de instalación
  • Non hai unha clara definición de roles na programación, pero algúns poden ser
    • arquitecto de software
    • jefe de proxecto
    • analista de sistemas
    • analista programador
    • programador

Bibliografía

Referencias