Que es el Software?
El software es el conjunto de programas, aplicaciones, instrucciones y datos que permiten a un sistema informático realizar tareas concretas. A diferencia del hardware, el software no es físico, sino lógico, y es el encargado de indicar al hardware cómo debe funcionar.
Incluye desde sistemas operativos y aplicaciones hasta herramientas de desarrollo y servicios que hacen posible el uso y aprovechamiento de los dispositivos informáticos.
El software se puede clasificar en varios tipos según su función y el uso que se le da dentro de un sistema informático. Comprender esta clasificación es fundamental para entender cómo se estructura la informática y cómo se construyen las aplicaciones que utilizamos en el día a día.
Sabías que?
Tipos de Software
1. Software de Sistema
Este tipo de software tiene como objetivo principal permitir que el hardware del ordenador funcione correctamente y que otros programas puedan ejecutarse.
Es la capa intermedia entre el usuario, las aplicaciones y la máquina. Aquí encontramos los sistemas operativos (como Windows, Linux o macOS), los controladores de dispositivo que permiten usar impresoras, tarjetas gráficas o discos externos, y las herramientas del sistema (antivirus, compresores de archivos y programas de copia de seguridad). Sin el software de sistema, el resto de programas no podrían ejecutarse.
2. Software de Aplicación
El software de aplicación está diseñado para que el usuario realice tareas específicas.
Puede ir desde programas de ofimática (procesadores de texto y hojas de cálculo) hasta navegadores web, reproductores multimedia o videojuegos. Es el software más cercano al usuario, ya que responde directamente a sus necesidades. Un aspecto importante es que el software de aplicación depende del sistema operativo para funcionar, puesto que se apoya en él para acceder al hardware.
3. Software de Desarrollo
Este tipo de software está orientado a desarrolladores y programadores. Proporciona las herramientas necesarias para crear otros programas, desde el código fuente hasta su ejecución final.
Incluye editores de texto especializados, compiladores e intérpretes,entornos de desarrollo integrados (IDE) y depuradores. Gracias a este software, los programadores pueden escribir, probar y mantener el código de las aplicaciones y sistemas.
Best Practice
Relación Hardware-Software
El software es el conjunto de programas, instrucciones y datos que permiten a un ordenador realizar tareas. Estos programas se ejecutan sobre el hardware, que es la parte física del ordenador.
Para que el software funcione, intervienen varios componentes básicos del hardware:
CPU- ejecuta las instrucciones de los programas realizando operaciones simples (aritméticas y lógicas).Memoria RAM- almacena temporalmente los datos y programas que se están ejecutando en el sistema.Unidades de entrada y salida- permiten la comunicación entre el ordenador y el exterior mediante periféricos.Disco duro- guarda de forma permanente los programas y los datos.
| Componente | Función principal | Ejemplos |
|---|---|---|
| Software | Programas e instrucciones que indican al ordenador qué hacer | Sistema operativo, aplicaciones |
| CPU | Ejecuta las instrucciones de los programas | Realiza sumas, comparaciones, operaciones lógicas |
| RAM | Almacena temporalmente programas y datos en uso | Programas abiertos, datos en ejecución |
| Entrada | Introduce datos en el ordenador | Teclado, ratón |
| Salida | Muestra información al usuario | Pantalla, impresora |
| Entrada/Salida | Envía y recibe información | Tarjeta de red, módem |
| Disco duro | Almacena de forma permanente los programas y los datos | Archivos, programas instalados |
Lenguajes de Programación
Las instrucciones de los programas que ha de ejecutar el ordenador para resolver un problema deben estar escritas en el lenguaje que comprenda el ordenador: el lenguaje binario (ceros y unos). Sin embargo, sería muy complicado para un programador escribir programas únicamente en binario.
Para facilitar la creación de programas complejos, se utilizan los lenguajes de programación de alto nivel, más cercanos al lenguaje natural. Los lenguajes de programación se pueden clasificar según su cercanía al lenguaje máquina.
Definición
Elementos básicos de los lenguajes de programación
- Identificadores: nombres simbólicos para variables, tipos, módulos, etc.
- Constantes: datos que no cambian durante la ejecución del programa.
- Operadores: símbolos que representan operaciones entre variables y constantes.
- Instrucciones: símbolos que representan estructuras de procesamiento y definición.
- Comentarios: texto para documentar los programas.
Clasificación según cercanía al hardware
- Identificadores: nombres simbólicos para variables, tipos, módulos, etc.
- Constantes: datos que no cambian durante la ejecución del programa.
- Operadores: símbolos que representan operaciones entre variables y constantes.
- Instrucciones: símbolos que representan estructuras de procesamiento y definición.
- Comentarios: texto para documentar los programas.
Clasificación según cercanía al hardware
- Lenguajes de bajo nivel o lenguaje máquina: único lenguaje que entiende directamente la máquina. Utiliza
0y1. Cada instrucción se corresponde con una dirección de memoria y el programador debe asignar cada dato manualmente.machine-code1// Ejemplo simple en lenguaje máquina 210110000 01100001 // Instrucción que mueve un valor a un registro 311000011 // Salto a otra dirección - Lenguajes intermedios o ensambladores: sustituyen códigos numéricos por representaciones simbólicas. Cada instrucción del ensamblador corresponde a una del lenguaje máquina. Se traducen a lenguaje máquina mediante un ensamblador.assembly
1; Ejemplo en lenguaje ensamblador 2MOV AL, 61h ; Mueve el valor 0x61 al registro AL 3JMP 0x03 ; Salta a la dirección 0x03
- Lenguajes de alto nivel: liberan al programador de tareas complejas. Se parecen al lenguaje natural y ofrecen abstracción, facilidad de corrección, instrucciones potentes y estructuras de datos complejas.
- Instrucciones con caracteres alfanuméricos y especiales.
- Variables y estructuras de datos complejas.
- Líneas de comentarios.
- Instrucciones aritméticas, lógicas, y de tratamiento de caracteres.
- Menor tiempo de codificación y depuración.
- Curva de aprendizaje más corta.
HelloWorld.java1// Ejemplo en Java (alto nivel) 2public class HelloWorld { 3 public static void main(String[] args) { 4 System.out.println("Hola, mundo!"); 5 } 6}hello.py1# Ejemplo en Python (alto nivel) 2def main(): 3 print("Hola, mundo!") 4 5if __name__ == "__main__": 6 main()Inconvenientes de los lenguajes de alto nivel
No se ejecutan directamente, requieren traducción y ocupan más memoria debido al traductor y al programa resultante.
Mira este video introductorio que explica los diferentes tipos de lenguajes de programación, sus características y ejemplos prácticos.
Del código fuente al código máquina
Las instrucciones que ejecutan los ordenadores para resolver un problema deben estar escritas en el lenguaje que estos comprenden: el lenguaje binario. Sin embargo, programar directamente en binario es una tarea muy compleja y tediosa.
Por este motivo, actualmente se utilizan lenguajes de programación de alto nivel, que resultan mucho más fáciles de leer, escribir y mantener por parte de las personas que programan.
Como el ordenador no comprende estos lenguajes directamente, es necesario un proceso de traducción que transforme el programa escrito en un lenguaje de alto nivel en otro escrito en lenguaje máquina. En este proceso aparecen los conceptos de código fuente, código objeto y código ejecutable.
Idea clave
Tipos de código
1Código fuente
2- Escrito directamente por el programador
3- Utiliza un lenguaje de alto nivel (Java, C, Python...)
4
5Código objeto
6- Resultado del proceso de traducción
7- No es legible para las personas
8- Puede no ser ejecutable todavía
9
10Código ejecutable
11- Listo para ser ejecutado por el ordenador
12- Puede ejecutarse tantas veces como se deseeEl ordenador no puede ejecutar directamente el código fuente, por lo que este debe transformarse en código objeto y, finalmente, en código ejecutable.
Traductores de código
Según cómo se realice el proceso de traducción del código fuente a código objeto, existen dos tipos principales de traductores:
Compiladores
Los compiladores realizan la traducción de forma global, es decir, analizan todo el programa en un único proceso. Si el programa contiene errores, no se generará el código objeto y se mostrarán mensajes de error para facilitar su corrección.
- Analizan el programa completo
- Generan código objeto que se almacena
- El programa puede ejecutarse varias veces sin recompilar
Ventaja de la compilación
Intérpretes
Los intérpretes combinan el proceso de traducción y ejecución. Analizan el programa por partes, generan el código objeto correspondiente y lo ejecutan inmediatamente.
- Traducción y ejecución simultáneas
- No generan código objeto permanente
- Cada fragmento se almacena solo de forma temporal
Limitación de los intérpretes
El caso del lenguaje Java
En Java se combinan la compilación y la interpretación. En primer lugar, el programa se compila y se genera un formato intermedio llamado bytecode.
Este bytecode es interpretado posteriormente por la Máquina Virtual de Java (JVM), lo que permite ejecutar el mismo programa en distintos sistemas operativos.
1Código fuente Java (.java)
2 ↓ Compilación
3Bytecode (.class)
4 ↓ Interpretación
5Máquina Virtual de Java (JVM)
6 ↓
7Ejecución del programaPortabilidad de Java
Herramientas de desarrollo
Para realizar todo el proceso, desde la escritura del código fuente hasta la ejecución del programa, se necesitan diversas herramientas:
- Editores de texto o herramientas de programación
- Compiladores o intérpretes
- Enlazadores, cuando el código objeto no es ejecutable directamente
En la actualidad, en lugar de usar estas herramientas por separado, se suele trabajar con un Entorno de Desarrollo Integrado (IDE).
Ventaja de los IDE
Ciclo de vida del software
Para la obtención de un software es necesario completar una serie de fases, en cada una de las cuales se realizan tareas concretas. A este conjunto de fases se le denomina ciclo de vida del software.
1Análisis
2 ↓
3Diseño
4 ↓
5Programación
6 ↓
7Pruebas
8 ↓
9Explotación
10 ↓
11MantenimientoIdea clave
Fase de análisis
El objetivo de la fase de análisises estudiar las necesidades de los usuarios del software para determinar qué debe hacer la aplicación.
Durante esta fase se realiza una comunicación inicial con el cliente que ha encargado el desarrollo, con el fin de recopilar toda la información necesaria.
Preguntas clave del análisis
- ¿Qué información debe procesar el sistema?
- ¿Qué funciones debe realizar?
- ¿Qué nivel de rendimiento se espera?
- ¿Qué interfaces debe tener?
- ¿Qué restricciones de diseño existen?
- ¿Qué criterios permiten validar que el sistema es correcto?
Resultado del análisis
Fase de diseño
Una vez definido qué debe hacer el sistema, en la fase de diseño se decide cómo se va a resolver el problema.
En esta etapa se traducen los requisitos del análisis en componentes de software concretos.
- Diseño de bases de datos (tablas, relaciones, campos)
- Programas, funciones o procedimientos
- Clases con atributos y métodos
- Interfaz de usuario
También se toman decisiones técnicas importantes, como el sistema gestor de bases de datos a utilizar (MySQL, Oracle, SQL Server, etc.).
Relación con el análisis
Fase de programación
En la fase de programación se traducen los resultados del diseño a un lenguaje que la máquina pueda entender.
Se escribe el código fuente de cada componente del sistema utilizando un lenguaje de programación determinado.
Resultado de la programación
Fase de pruebas
La fase de pruebas permite comprobar que la aplicación funciona correctamente y cumple los requisitos del cliente.
- Pruebas unitarias: se prueba cada componente por separado
- Pruebas de integración: se combinan los componentes progresivamente
- Pruebas del sistema completo
Importancia de las pruebas
Explotación y mantenimiento
Explotación
En esta etapa se realiza la instalación y puesta en marcha del software en el entorno de trabajo del cliente.
Mantenimiento
Tras su entrega, el software suele sufrir modificaciones por corrección de errores, mejoras o cambios en las necesidades del cliente.
El mantenimiento consiste en aplicar nuevamente las fases del ciclo de vida sobre el software ya existente.
Dato importante
Mira este video que explica las fases del ciclo de vida del software.
Modelos de ciclo de vida del software
Un ciclo de vida del software determina el orden en el que se deben llevar a cabo las tareas en el proceso de desarrollo de software, así como los criterios que deben cumplirse para poder pasar de una tarea a la siguiente.
Estos criterios consisten, por un lado, en la obtención de una serie de productos intermedios y, por otro, en indicar las características que deben cumplir dichos productos para poder avanzar a la fase posterior.
Por ejemplo, como resultado de la tarea de análisis se debe obtener una ERS (Especificación de Requisitos del Software), y se pueden establecer las condiciones que debe cumplir dicha especificación para permitir el paso a la fase de diseño.
Importancia del ciclo de vida
Modelo en cascada
El modelo en cascada, también denominado ciclo de vida clásico, fue el primer modelo que surgió y ha resultado fundamental para el desarrollo posterior de otros modelos.
En este modelo se identifican prácticamente todas las clases de actividades que intervienen en el desarrollo y explotación del software.
Se propone un enfoque sistemático y secuencial para el desarrollo de software, comenzando con el análisis y continuando con el diseño, la programación y las pruebas, hasta llegar al software terminado, sobre el cual también se pueden aplicar operaciones de mantenimiento.
1Análisis
2↓
3Diseño
4↓
5Programación
6↓
7Pruebas
8↓
9Explotación
10↓
11MantenimientoEl modelo plantea un flujo secuencial de actividades, y para pasar de una fase a la siguiente es necesario cumplir ciertos objetivos. Al finalizar cada fase se realiza un análisis de la documentación generada con el fin de comprobar que está exenta de errores.
No obstante, si en una fase se detecta un error cometido en una etapa anterior, será necesario volver atrás para corregirlo antes de poder continuar con el desarrollo.
Ejemplo de retroceso
El modelo en cascada es fácil de entender, planificar y seguir, y cuenta con herramientas que lo apoyan. Sin embargo, en la práctica rara vez se cumple estrictamente su flujo secuencial.
Detectar errores en fases tardías resulta muy costoso, ya que obliga a rehacer etapas anteriores. Además, el cliente debe esperar hasta el final del proceso para disponer de una versión funcional del software, con el riesgo de descubrir errores graves demasiado tarde.
Limitación principal
Modelos de proceso incremental
Uno de los principales inconvenientes del modelo en cascada es que el cliente no dispone de una versión funcional del sistema hasta una fase muy avanzada del desarrollo.
Los modelos de proceso incrementalproponen proporcionar al cliente funcionalidades parciales del software mediante una serie de entregas sucesivas, denominadas incrementos.
Para la elaboración de cada incremento se siguen las actividades propias del modelo en cascada: análisis, diseño, programación y pruebas.
1Incremento 1 → Funcionalidad básica
2Incremento 2 → Nuevas funciones
3Incremento 3 → Ampliaciones
4Incremento n → Sistema completoEste enfoque permite reducir riesgos asociados a retrasos, cambios y problemas de aceptación del sistema, ya que el cliente puede evaluar el software de forma progresiva.
Cuándo es recomendable
Modelos de proceso evolutivo
Los modelos de proceso evolutivo parten de la idea de que el software cambia con el tiempo, ya que los requisitos evolucionan durante el propio desarrollo.
No resulta realista seguir una trayectoria lineal hacia el producto final, por lo que estos modelos son iterativos y generan versiones cada vez más completas del software.
Construcción de prototipos
La construcción de prototipos consiste en desarrollar sistemas auxiliares que permiten probar experimentalmente soluciones parciales a los requerimientos del usuario.
Los prototipos pueden centrarse en la interacción hombre-máquina, en subconjuntos de la funcionalidad o en aspectos técnicos concretos, como la eficiencia de un algoritmo o la compatibilidad con un sistema.
El proceso de prototipado es iterativo e incluye comunicación con el cliente, diseño rápido, construcción del prototipo y evaluación, repitiéndose el ciclo hasta obtener una versión adecuada.
1Comunicación
2↓
3Diseño rápido
4↓
5Construcción
6↓
7Evaluación
8↓
9RefinamientoModelo en espiral
El modelo en espiral es un modelo evolutivo que combina las mejores características del modelo en cascada y del prototipado, incorporando el análisis de riesgos.
El desarrollo se organiza en ciclos iterativos o vueltas alrededor de una espiral. En las primeras iteraciones se pueden generar prototipos, mientras que en las posteriores se obtienen versiones más completas del sistema.
1Planificación
2↓
3Análisis de riesgos
4↓
5Ingeniería
6↓
7Evaluación
8↓
9Nueva iteraciónLa principal ventaja de este modelo es que permite identificar y gestionar riesgos de forma temprana. Sin embargo, requiere una gran experiencia en análisis de riesgos.
Riesgo del modelo
Metodologías Ágiles de Producción
Una metodología ágil es una forma de organizar y trabajar en proyectos de software (y también en otros ámbitos) que busca ser rápida, flexible y cercana al cliente. Su principal ventaja es la facilidad para incorporar cambios durante el desarrollo con menor coste, especialmente si se detectan pronto.
En lugar de planificar todo al detalle durante meses, se trabaja en pequeñas partes del proyecto llamadas iteraciones o sprints. Cada iteración entrega una versión funcional del software, aunque simple, que se mejora progresivamente con la retroalimentación del cliente.
- Las personas y la comunicación son más importantes que los procesos rígidos.
- Lo más valioso es tener software funcionando, no documentos largos.
- El cliente participa y colabora constantemente.
- Los planes pueden cambiar, y el equipo debe adaptarse rápido.
12 Principios de Agilidad
- La máxima prioridad es satisfacer al cliente mediante la entrega rápida y continua de software valioso.
- Los requisitos cambiantes son bienvenidos incluso en etapas avanzadas del desarrollo.
- Entregas frecuentes de software funcional, preferiblemente cada 2 semanas a 2 meses.
- Responsables del negocio y del desarrollo trabajan conjuntamente a diario durante todo el proyecto.
- Los proyectos son desarrollados por individuos motivados con el entorno y apoyo adecuados.
- La comunicación cara a cara es el método más eficaz y eficiente.
- El software que funciona es la principal medida del progreso.
- Los procesos ágiles fomentan un desarrollo sostenible a ritmo constante.
- La atención continua a la excelencia técnica y al buen diseño mejora la agilidad.
- La simplicidad es esencial: maximizar la cantidad de trabajo no realizado.
- Las mejores arquitecturas, requisitos y diseños surgen de equipos autoorganizados.
- El equipo reflexiona regularmente para mejorar eficacia y ajustar su comportamiento.
XP (Programación Extrema)
Los cinco valores originales de la programación extrema son Simplicidad, Comunicación, Retroalimentación, Valentía y Respeto:
- Simplicidad: Diseñar solo lo necesario y refactorizar posteriormente para mejorar diseño o mantenimiento.
- Comunicación: Mantener comunicación cercana e informal con el cliente y evitar documentos voluminosos.
- Retroalimentación: Incrementos de software frecuentes, pruebas constantes y retroalimentación continua del cliente.
- Valentía: Seguir las prácticas XP sin temer al cambio ni diseñar para requisitos futuros innecesarios.
- Respeto: Cumplir los cuatro principios anteriores fomentando respeto entre miembros del equipo y demás participantes.
XP utiliza la orientación a objetos como paradigma preferido y organiza el desarrollo en cuatro actividades principales:
- Planificación: Se crean historias de usuario escritas por el cliente, se asignan prioridades y estimaciones de tiempo. Historias más largas de tres semanas se dividen en otras más pequeñas. El equipo y el cliente deciden qué historias se incluirán en el siguiente incremento.
- Diseño: Diseño sencillo, creación de prototipos si hay dificultades, y refactorización para mejorar legibilidad y mantenimiento sin cambiar el comportamiento.
- Codificación: Programación por parejas, desarrollo guiado por pruebas unitarias, integración continua y revisión constante del código.
- Pruebas: Unitarias, integración y validación continua, más pruebas de aceptación especificadas por el cliente.
Ejemplo Práctico de XP
Imagina que el cliente quiere una aplicación para gestionar pedidos de un restaurante.
- Planificación: Se crean historias como "Registrar un nuevo pedido" y "Ver pedidos pendientes".
- Diseño: Se dibuja un prototipo simple de la interfaz y se decide el diseño mínimo.
- Codificación: Un par de programadores implementa la funcionalidad de "Registrar pedido" mientras el otro verifica pruebas unitarias.
- Pruebas: Se ejecutan pruebas automáticas y el cliente revisa el resultado, dando retroalimentación para mejorar la siguiente iteración.
Scrum
Scrum es un modelo ágil nacido en los años 90, cuyo objetivo es entregar valor al cliente en cortos periodos de tiempo. Se basa en tres pilares:
- Transparencia: Todos conocen el estado del proyecto en todo momento.
- Inspección: Evaluación constante del progreso por el equipo.
- Adaptación: Ajustes rápidos ante cambios para alcanzar objetivos.
Actividades estructurales: requerimientos, análisis, diseño, evolución y entrega. Cada actividad se divide en sprints, periodos de tiempo que permiten entregar valor al cliente (máx. 1 mes, recomendable 2 semanas).
Eventos clave dentro de cada sprint:
- Sprint Planning: Planificación de tareas y objetivos del sprint.
- Daily Scrum: Reunión diaria de máximo 15 minutos para revisar progreso y problemas.
- Sprint Review: Entrega y demostración del producto al cliente, con retroalimentación.
- Retrospectiva: Evaluación del sprint y propuestas de mejora para el siguiente.
Ejemplo Práctico de Scrum
Siguiendo con el ejemplo del restaurante: - El equipo define un sprint de dos semanas para implementar "Registrar pedidos" y "Ver pedidos pendientes".
- Sprint Planning: Se acuerdan las tareas y prioridades.
- Daily Scrum: Cada día el equipo indica qué hizo, qué hará y posibles problemas.
- Sprint Review: Se entrega al cliente un prototipo funcional para recibir feedback.
- Retrospectiva: El equipo analiza qué funcionó y qué se puede mejorar para el siguiente sprint.
Ejercicios Prácticos
Clasifica el software
Indica si cada uno de estos programas es software de sistema, de programación o de aplicación: 1. Windows 11 2. IntelliJ IDEA 3. Microsoft Excel 4. El compilador javac 5. El driver de una tarjeta gráfica 6. Spotify
Compilado, interpretado o ambos
Explica cómo se traduce a código máquina un programa escrito en cada lenguaje y qué ventaja principal tiene cada enfoque: 1. C 2. Python 3. Java Pista: piensa en qué ocurre antes de ejecutar el programa y qué ocurre durante la ejecución.
Fases del ciclo de vida
Un instituto encarga una aplicación para gestionar las faltas de asistencia. Indica en qué fase del ciclo de vida se realiza cada tarea: 1. Reunirse con jefatura de estudios para saber qué datos se deben registrar 2. Escribir las clases Java que guardan las faltas en la base de datos 3. Dibujar el diagrama de clases y el modelo de la base de datos 4. Comprobar que al registrar 3 faltas se envía un aviso a la familia 5. Añadir, un año después, la opción de justificar faltas desde el móvil 6. Instalar la aplicación en el servidor del centro y formar al profesorado
Elige el modelo de ciclo de vida
Justifica qué modelo o metodología (cascada, incremental, prototipos, espiral o Scrum) usarías en cada caso: 1. Software de control de un marcapasos, con requisitos cerrados y normativa muy estricta 2. Una startup que quiere lanzar su app cuanto antes y cambiarla según la opinión de los usuarios 3. Un cliente que no sabe explicar bien cómo quiere la interfaz de su tienda online 4. Un sistema bancario grande y con muchos riesgos técnicos que hay que analizar en cada etapa