0% encontró este documento útil (0 votos)
24 vistas45 páginas

Que Es SOFTWARE (123

El documento aborda la evolución y la importancia de la ingeniería de software, destacando su surgimiento como respuesta a los problemas en el desarrollo de software a gran escala. Se enfatiza la ubicuidad del software en la vida cotidiana y su impacto en diversos sectores, así como las consecuencias de las fallas en su funcionamiento. Además, se discuten las diferencias entre el desarrollo de software y la fabricación de productos tradicionales, subrayando la necesidad de profesionalización y estandarización en este campo.

Cargado por

Tokio com
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
24 vistas45 páginas

Que Es SOFTWARE (123

El documento aborda la evolución y la importancia de la ingeniería de software, destacando su surgimiento como respuesta a los problemas en el desarrollo de software a gran escala. Se enfatiza la ubicuidad del software en la vida cotidiana y su impacto en diversos sectores, así como las consecuencias de las fallas en su funcionamiento. Además, se discuten las diferencias entre el desarrollo de software y la fabricación de productos tradicionales, subrayando la necesidad de profesionalización y estandarización en este campo.

Cargado por

Tokio com
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

UNIVERSIDAD PUBLICA DE EL ALTO

AREA CIENCIAS ECONOMICAS FINANCIERAS Y


ADMINISTRATIVAS
CARRERA CONTADURIA PUBLICA

PRACTICAS

NOMBRE: BERTHA JHESSICA QUISPE MAMANI

DOCENTE: LIC.

MATERIA: CONTABILIDAD DE SERVICIOS

PARALELO: 3ro “A”

GESTIÓN: 2024

EL ALTO - BOLIVIA
INTRODUCCION
INDICE
LA NATURALEZA DEL SOFTWARE
1. HISTORIA
Según el Blog del Museo de Informática de la Universidad Politécnica
de Valencia se encuentra la siguiente referencia sobre el origen de la
Ingeniería de Software: “El concepto de ingeniería del software surgió
en 1968, tras una conferencia en Garmisch (Alemania) que tuvo como
objetivo resolver los problemas de la crisis del software. El término
crisis del software se usó desde finales de 1960 hasta mediados de
1980 para describir los frecuentes problemas que aparecían durante
el proceso de desarrollo de nuevo software. Tras la aparición de
nuevo hardware basado en circuitos integrados, comenzaron a
desarrollarse sistemas y aplicaciones mucho más complejos, que
hasta entonces no era posible construir puesto que el hardware
disponible no lo permitía. Estos nuevos proyectos de desarrollo de
software, en la mayoría de las ocasiones, no se terminaban a tiempo,
lo cual también provocaba que el presupuesto final del software
excediera de aquel que se había pactado. Algunos de estos proyectos
eran tan críticos (sistemas de control de aeropuertos, equipos para
medicina, etc.) que sus implicaciones iban más allá de las pérdidas
millonarias que causaban. Además, en muchos casos el software no
daba respuesta a las verdaderas necesidades del cliente o había que
ser un usuario experto para poder utilizarlo, todo ello sumado a que
el mantenimiento de los productos era complejo y muy costoso.” En
resumen, se reconoció que los métodos informales de desarrollo de
software, que habían sido efectivos para proyectos pequeños, no eran
adecuados para enfrentar los desafíos de mayor envergadura. Los
proyectos, que solían ser llevados a cabo por grupos de
programadores entusiastas y autodidactas, que experimentaban y
aprendían informalmente, requerían ahora estandarización y
profesionalización. La necesidad de formalizar el desarrollo de
software se hizo evidente ante la complejidad y la importancia que
adquirieron los sistemas en diversos ámbitos Era evidente no podían
depender de resultados aleatorios o de la habilidad de un
programador excepcional, cuyo código resultaba no podía ser
mantenido por otros colegas. La improvisación y la dependencia de
habilidades individuales ya no eran suficientes para garantizar la
calidad y la eficiencia de los sistemas. Se requería un enfoque
disciplinado y estructurado, respaldado por procesos estandarizados
y mejores prácticas. Era imprescindible formar profesionales
especializados capaces de enfrentar la creciente complejidad de los
sistemas modernos. Como respuesta a estas demandas, era el
momento de “crear” la Ingeniería de Software. Esta nueva disciplina
se enfocaría en aplicar principios y técnicas de ingeniería para el
desarrollo de software, abordando aspectos como el diseño, la
implementación, la prueba y el mantenimiento de sistemas. La
Ingeniería de Software busca establecer estándares, metodologías y
herramientas que permitan gestionar la complejidad y asegurar la
calidad de los sistemas desarrollados. La profesionalización del
desarrollo de software implicaba reconocer la importancia de la
formación académica y la adquisición de conocimientos
especializados en el campo de la ingeniería de software. Se requería
contar con profesionales capacitados que comprendieran los
fundamentos teóricos y prácticos de la disciplina, y que pudieran
aplicarlos de manera sistemática en los proyectos.
En conclusión, el surgimiento de la necesidad de estandarizar y
profesionalizar el desarrollo de software fue una respuesta a los desafíos
cada vez mayores de los proyectos de mayor envergadura. La disciplina
de la ingeniería de software surgió como un enfoque más estructurado y
profesional para garantizar el éxito en el desarrollo de software a gran
escala.
El software: Un producto ubicuo, indispensable y vital
Durante mucho tiempo, la mención del software estaba
estrechamente ligada a las computadoras. Sin embargo, en la
actualidad, esta asociación ha evolucionado considerablemente.
Ahora, cuando escuchamos términos como Android o WhatsApp,
inmediatamente los relacionamos con nuestros teléfonos móviles. El
software se ha vuelto ubicuo
No solo controla computadoras y teléfonos, sino también robots,
automóviles, aviones, equipos médicos, juguetes, relojes, televisores,
electrodomésticos, entre otros. Ya no nos sorprende encontrar versiones
“smart”, “inteligentes” o “conectadas” de los productos que utilizamos a
diario, ya que incorporan tanto hardware como software para potenciar
sus funcionalidades. El software forma parte, para bien o para mal, en
nuestra vida cotidiana y ha cambiado el mundo tal y como lo
conocíamos:
• Ha impulsado la creación de nuevos modelos de negocio
revolucionarios, como Uber y las ventas por internet, que han
cambiado la forma en que interactuamos y consumimos bienes y
servicios.
• Ha permitido el desarrollo de nuevas tecnologías innovadoras, como
la ingeniería genética, que han abierto nuevas posibilidades en
campos como la medicina y la biotecnología.
• El software ha permitido la expansión de las tecnologías existentes
de múltiples formas. Un ejemplo claro es la posibilidad de envío de
mensajes en las redes de comunicación celular, lo cual sentó las
bases para una gran cantidad de nuevos servicios y aplicaciones,
como, por ejemplo, los mensajes instantáneos, las redes sociales, las
aplicaciones de servicios al cliente y el marketing y la promoción.
• El software también ha contribuido a la obsolescencia de ciertas
tecnologías, como las impresiones y los CDs de música, al ofrecer
opciones digitales más convenientes y sostenibles. Por ejemplo, la
distribución gratuita de este libro sería inviable si se requiriera su
publicación en papel. En contraposición, el avance del software ha
permitido la creación de plataformas digitales y servicios en línea que
facilitan la distribución de contenido de forma instantánea y global.
Esto ha llevado a un cambio significativo en la forma en que
accedemos a la información y consumimos productos culturales,
como libros, música y películas.
• La inteligencia artificial potencia la investigación y amplía la capacidad
humana en
diversos campos, como el desarrollo de tratamientos médicos y vacunas
para
enfermedades como el COVID-19.
• El análisis eficiente de grandes volúmenes de datos proporciona un
nivel de
conocimiento superior, volviendo obsoletos ciertos paradigmas
laborales, como las
auditorías, que ya no requieren muestras debido a la capacidad de
procesar fácilmente
el lote completo de datos.
• Ha dejado de ser exclusivamente un producto empresarial y se ha
convertido en un
producto comercial de amplia disponibilidad, con la posibilidad de
adquirirse tanto en
supermercados, tiendas físicas y, actualmente, disponible para
descargas en línea.
• Las empresas dedicadas al desarrollo de software han adquirido una
influencia
significativa y dominan la economía mundial. De hecho, de las 10
empresas más grandes
del mundo2, 6 de ellas desarrollan o basan su negocio principal en
software y 2 más
producen hardware que, obviamente, será operado por software.
• El software posee un valor dual: como producto en sí mismo y como
herramienta
fundamental para gestionar uno de los recursos más valiosos en la
actualidad, que es la
información.
• Internet, una red de hardware, ha transformado permanentemente
nuestra vida gracias
al software que la sustenta y potencia, brindándonos acceso instantáneo
a información,
comunicación global y nuevas formas de interacción social y comercial.

Los beneficios del software son innegables, pero es importante


reconocer que las fallas en
el software puede tener consecuencias graves que comprometen la vida
y el funcionamiento de diversas entidades y servicios. A continuación,
presento algunos pocos ejemplos de las posibles consecuencias de las
fallas en el software:
• En el ámbito empresarial, las fallas en el software pueden llevar a la
pérdida de datos
importantes, interrupción de servicios, problemas de seguridad y daño a
la reputación
de la empresa.
• En el sector bancario, las fallas en el software pueden resultar en
errores en
transacciones financieras, pérdida de dinero, exposición de información
confidencial y
vulnerabilidades en la seguridad financiera.
• En el gobierno, las fallas en el software pueden afectar la prestación de
servicios
esenciales a los ciudadanos, como la emisión de documentos, la gestión
de registros y el
funcionamiento de sistemas críticos.
• En las ciudades, las fallas en el software pueden tener impacto en el
funcionamiento de
la infraestructura urbana, como el suministro de agua, la gestión del
tráfico y la seguridad
pública.
• En la industria aeronáutica, las fallas en el software de los aviones
pueden poner en
peligro la seguridad de los pasajeros y la tripulación, lo que resalta la
importancia de la
calidad y fiabilidad del software utilizado en este ámbito.
• En los servicios de emergencia, las fallas en el software pueden afectar
la capacidad de
respuesta y coordinación en situaciones críticas, poniendo en riesgo la
vida de las
personas que necesitan ayuda urgente.

Y en este punto cabe entonces afirmar que el desarrollo de software es


una actividad crítica. Entregar software con fallas puede poner en riesgo
y de modo directo, la salud, la seguridad, los derechos o los bienes de
las personas. Los profesionales que desarrollan software tienen una
responsabilidad fundamental en asegurar que el software que crean
cumpla con las mejores prácticas de desarrollo, siga estándares de
calidad y sea seguro y confiable. Esto implica utilizar métodos y técnicas
de desarrollo adecuadas, realizar pruebas exhaustivas, implementar
medidas de seguridad y seguir principios éticos en su trabajo
1 La naturaleza del software
Vale citar en este punto, las consideraciones que Roger Pressman hace
respecto de la naturaleza del software en su libro “Ingeniería de
Software, un enfoque práctico”. En dicha obra destaca interesantes
diferencias del desarrollo de software con respecto a la fabricación de
productos tradicionales. Estas diferencias explican, en cierto modo, el
motivo por el cual los modos de producción tradicional no siempre
pueden adaptarse al desarrollo de software:
1. El software se desarrolla o modifica con el intelecto; no se
manufactura en el sentido clásico. Aunque existen algunas
similitudes entre el desarrollo de software y la fabricación tradicional,
como por ejemplo en el caso del hardware, es fundamental reconocer
que estas dos actividades son fundamentalmente diferentes. Mientras
que en la industria tradicional se adquieren materias primas y se utilizan
procesos industriales para ensamblar y transformarlos en un producto
final, el desarrollo de software no sigue este mismo proceso. Tanto en el
desarrollo de software como en la fabricación tradicional, la búsqueda de
alta calidad se logra a través de un buen diseño. Sin embargo, es
importante destacar que la fase de manufactura del hardware introduce
desafíos de calidad que no están presentes en el desarrollo de software.
Por ejemplo, si un componente defectuoso o de baja calidad se utiliza en
la fabricación de un producto físico, es probable que el producto final
tenga que ser descartado. En cambio, en el desarrollo de software, los
defectos o errores descubiertos durante la etapa de producción pueden
ser corregidos sin que el producto final se vea afectado. Ambas
actividades dependen de personas, máquinas y herramientas, pero la
relación entre los individuos dedicados y el trabajo desarrollado es muy
diferente. Las dos actividades requieren la construcción de un
“producto”, pero los enfoques son distintos. Mientras los productos
tradicionales se construyen en fábricas, procesando insumos para
convertirlos en el producto final, el software, casi en su totalidad, es una
producción intelectual.
2. El cálculo de costos es distinto y no siguen un esquema
tradicional.
Por lo dicho anteriormente, la ecuación básica de costos (costo =
materia prima + mano de obra + costos de fabricación) no es aplicable
al desarrollo de software. En este caso, los costos principales se
concentran, básicamente, en el costo de los recursos que se emplean
para desarrollarlo y el tiempo durante el cual son utilizados esos
recursos. Los principales recursos que utiliza la industria del software
son recursos humanos. Además, en un esquema productivo tradicional,
los gastos de fabricación se prorratean entre todas las unidades
producidas. Cada unidad del producto tiene como costo el de las
materias primas que lo componen, la mano de obra directa y el
proporcional de gastos operativos.
En contraste, en el desarrollo de software, el costo principal recae en la
creación de la primera unidad. Producir otras copias, ya sea una o cien
mil, prácticamente no generan costos adicionales o son marginales. Por
supuesto, cuando se trata de desarrollos comerciales, el costo de crear
la primera unidad se distribuye entre todas las unidades que se
planifican vender. Sin embargo, en el caso de sistemas construidos para
un cliente específico, este último debe asumir todos los costos. En el
caso de que el desarrollador decida vender nuevamente ese software en
el futuro (suponiendo que no haya restricciones contractuales que lo
impidan), esto sería en su mayoría ganancia, ya que generalmente
existen algunos costos asociados a la personalización o comercialización
de esa segunda unidad. Para ejemplificar lo dicho: Desarrollar una
versión de Windows sale varios de millones de dólares. Por supuesto
Microsoft también espera vender millones de copias de ese sistema
operativo. El costo total de se proporcionará para obtener el costo de
cada copia. Si después se venden más copias de las estimadas, será
todo ganancia. Si se venden menos, tendrán pérdidas. Por supuesto
otras industrias tienen esquemas parecidos, como por ejemplo la
farmacéutica donde no cargan a la primera vacuna todos los costos que
tuvo desarrollarla.
3.La mayor parte del software se construye para un uso
individualizado, aunque la industria se mueve hacia la
construcción basada en componentes.
A medida que una disciplina evoluciona, surgen conjuntos de
componentes estandarizados que simplifican la creación de productos.
Los tornillos estándar y los circuitos integrados preconstruidos son solo
dos ejemplos de los numerosos componentes estándar que los
ingenieros mecánicos y eléctricos utilizan al diseñar nuevos productos.
Estos componentes reutilizables permiten que los ingenieros se
enfoquen en los aspectos verdaderamente innovadores de un diseño, es
decir, en las partes que representan novedades. Ya no es necesario
invertir tiempo en diseñar un tornillo, simplemente se especifica el uso
de una pieza como el tornillo Philips M5 de 25 mm de largo y 2 mm de
diámetro. Aunque en el ámbito del software existen facilidades para
reutilizar componentes en diferentes desarrollos mediante la copia y
pegado de código, es común que se construya cada nuevo sistema
desde cero. Esto se debe, en parte, a la rápida evolución de la industria,
lo cual hace que los programas queden obsoletos con gran frecuencia.
Sin embargo, existen numerosas ventajas al diseñar e implementar
código que pueda ser reutilizado en múltiples programas. Los modernos
componentes reutilizables integran tanto los datos como el
procesamiento que se les aplica, lo que permite a los ingenieros de
software crear nuevas aplicaciones a partir de partes que pueden ser
reutilizables. Por ejemplo, las interfaces interactivas de usuario actuales
se construyen utilizando objetos y código previamente desarrollados, lo
que permite la rápida creación de ventanas gráficas, menús
desplegables y una amplia variedad de mecanismos de interacción. Las
estructuras de datos y los detalles de procesamiento necesarios para
construir la interfaz están contenidos en una biblioteca de componentes
reutilizables específicamente diseñada para este propósito
Es importante destacar, conforme lo analizado en el punto anterior, que
los mayores costos que deben asumirse al construir componentes
reutilizables, se ven recuperados con creces cuando estos componentes
se incorporan en un segundo desarrollo.
También hay que mencionar que no estamos ante un proceso de
reciclado o de reutilización de componentes usados. Por las
características propias del software los componentes siempre funcionan
a nuevo y hasta con la ventaja de tener pruebas o mejoras previas que
hacen que sea quizá mejor que un desarrollo nuevo.
4. El software no se “desgasta”. En la siguiente figura se ilustra la
tasa de falla del hardware como función del tiempo. La relación, que por
su forma se la suele conocer como “curva de la bañadera”, indica que el
hardware presenta una tasa de fallas relativamente elevada en una
etapa temprana de su vida (fallas que con frecuencia son atribuibles a
defectos de diseño o manufactura). Luego defectos se corrigen y la tasa
de fallas se mantiene en un nivel estable (muy bajo, generalmente)
durante cierto tiempo. No obstante, conforme pasa el tiempo, la tasa de
fallas aumenta de nuevo a medida que los componentes del hardware
comienzan a sentir los efectos acumulativos de suciedad, vibración,
abuso, temperaturas extremas y muchos otros inconvenientes
ambientales. En pocas palabras, es el hardware comienza a desgastarse
y a fallar. Sin embargo, no es el software el que se desgasta y suma
problemas. A tal punto que, si reemplazamos el hardware por uno
nuevo, el software seguirá funcionando igual que antes (o incluso
mejor).

La curva de la siguiente figura muestra como los errores de


programación, no detectados en la etapa de prueba, ocasionarán tasas
elevadas de fallas al comienzo de la vida de un programa. Sin embargo,
éstas se corrigen y la curva se aplana de modo permanente. El software
continúa funcionando de este modo hasta que, finalmente deja de
operar.
Claro que tampoco es cierto que el software no tenga cambios y
agregados durante su vida útil. Con cada nueva versión, las tasa de
“error inicial” vuelve a hacerse presente. La curva de la tasa de fallas
adopta entonces la forma de la “curva idealizada” que se aprecia en la
siguiente figura

La curva idealizada es una gran simplificación de los modelos reales de


las fallas del software. Aun así, La implicación es clara: el software no
experimenta desgaste, ¡pero sí se degrada! Cuando el software se
somete a cambios y agregados constantes debido a circunstancias
específicas, la curva de estabilidad no logra mantenerse. Cada nuevo
cambio provoca que la curva se dispare nuevamente. Con el tiempo, el
nivel mínimo de la tasa de fallas comienza a aumentar, lo que indica que
el software se está deteriorando como resultado de los constantes
cambios. En este punto, es importante considerar la conveniencia de
reemplazar el software con otro que no requiera modificaciones
permanentes.

Los problemas al desarrollar software


Hemos destacado previamente la importancia del software en la
actualidad. Esta industria masiva se ha convertido en un factor
dominante en las economías de los países industrializados. Siete de las
diez empresas más grandes del mundo en términos de capitalización
bursátil tienen al software como su producto principal. Los equipos de
especialistas en software, cada uno enfocado en una parte específica de
la tecnología requerida para desarrollar aplicaciones complejas, han
reemplazado al programador solitario de antaño, quien a menudo
trabajaba en su garaje con algún amigo. A pesar de la evolución del
desarrollo de software, los desafíos que enfrentan los programadores
individuales en la actualidad, son similares a los que surgían al construir
sistemas en el pasado:
1) Se demora mucho tiempo en desarrollar software. Habitualmente,
más de lo previsto. No es una tarea mecánica con tiempos
preestablecidos, y la complejidad del trabajo puede llevar a demoras
significativas en la entrega de proyectos.
2) Estimar los costos y plazos de entrega del software no es una tarea
sencilla. A menudo, surgen cambios y nuevas necesidades que no fueron
contempladas inicialmente en el presupuesto y planificación original.
3) Es difícil medir el avance del proyecto mientras se desarrolla o
mantiene el software. La naturaleza intangible del software y la
interdependencia de sus componentes pueden dificultar la evaluación
precisa del avance realizado.
4) Los costos de desarrollo son altos, frecuentemente mucho mayores a
los estimados inicialmente. n ocasiones, es necesario presentar un
presupuesto antes de contar con todos los datos necesarios para
calcular los costos de manera completa y precisa (más adelante se
profundizará este tema).
5) A pesar de realizar pruebas exhaustivas, es imposible garantizar que
el software entregado estará libre de errores. Siempre existe la
posibilidad de que se escapen algunos defectos o fallas en el producto
final.
6) Se gasta mucho tiempo y esfuerzo en mantenimiento. Según
los datos de la industria, entre el 60% y el 80% del esfuerzo dedicado al
software ocurre después de entregarlo al cliente por primera vez.
7) Los clientes tienen expectativas de tiempos cada vez más cortos.
Quieren que el software esté operativo en un plazo casi inmediato y no
pueden esperar meses o años para obtener una solución informática
completa.
Es sorprendente que uno de los productos más destacados de nuestro
siglo todavía enfrente numerosos desafíos sin resolver por completo.
Surge entonces las preguntas: ¿Es posible desarrollar software de alta
calidad y sin errores? ¿Existe la posibilidad de construir software seguro
y evitar fallos catastróficos? La respuesta es afirmativa, y la clave se
encuentra en la aplicación de la disciplina de "Ingeniería de Software
El software como ventaja competitiva.
Un sistema informático está compuesto por tres componentes básicos
que interactúan entre sí (cuatro si consideramos al usuario). Es evidente
que un software no puede funcionar sin estar respaldado por un
hardware específico, al mismo tiempo que este hardware es inútil sin un
software que lo administre. Las redes de comunicación se han
convertido en el último componente esencial en integrarse, ya que en la
actualidad resulta imposible concebir un software que funcione de
manera aislada. En resumen, el hardware, el software y las redes de
comunicación son los tres componentes principales de un sistema
informático

Por supuesto, en cada proyecto informático, estos componentes tendrán


un peso específico diferente. Algunos, por ejemplo, solo funcionarán con
un hardware particular, y este se llevará buena parte de la inversión. En
otros, el desarrollo será particularmente difícil, y el desafió mayor caerá
sobre la construcción del software. Y por supuesto, habrá proyectos
donde las redes de comunicaciones entre los dispositivos serán la parte
central del mismo.
En 1985, Michael Porter publicó su libro "Ventaja Competitiva: Creación y
sostenimiento de un desempeño superior", que introdujo un modelo
conceptual llamado Cadena de Valor y proporcionó a las empresas
nuevas herramientas de gestión. Este modelo plantea la idea
fundamental de que cada actividad realizada en una empresa debe
agregar más valor al producto final de lo que cuesta llevar a cabo dicha
actividad. Basándose en esta cadena de valor, las empresas pueden
obtener ventajas competitivas, lo que les permite adquirir una posición
favorable en el mercado en comparación con sus competidores. Sin
embargo, es importante tener en cuenta que esta ventaja competitiva
no es estática ni permanente, sino que debe ser mantenida a lo largo del
tiempo.
Las estrategias para crear y mantener una ventaja competitiva pueden
centrarse en dos enfoques principales: la reducción de costos o la
diferenciación del producto (o servicio). En el caso de la reducción de
costos, el objetivo es ofrecer un producto a un precio inferior al de los
competidores. Por otro lado, la diferenciación implica ofrecer un
producto, bien o servicio que sea más atractivo para los consumidores
que las alternativas de la competencia.
En ambos casos, los sistemas informáticos desempeñan un papel
fundamental. Estas herramientas tecnológicas permiten optimizar los
procesos, mejorar la eficiencia operativa y facilitar la toma de decisiones
estratégicas. Los sistemas informáticos ayudan a controlar los costos,
automatizar tareas, gestionar la cadena de suministro y analizar datos
relevantes para identificar oportunidades de diferenciación.
Pero… Cuál de los tres componentes es aquel que puede generar un
factor diferencial y una ventaja competitiva. ¿Es el software?... ¿Es el
hardware?... O ¿Es la red de comunicaciones?
¿Puede una empresa diferenciarse teniendo un hardware mejor o
diferente que el de sus competidores? Difícil. Hoy el equipamiento es
casi un “commodity”. Se consigue fácilmente en el mercado y está
disponible para cualquier empresa a un precio que puede pagar. Si bien
es posible, es difícil pensar que una organización pueda montar una
estructura de hardware que, por algún motivo, sea imposible de replicar
por sus competidores. Es más, hoy en día es cada vez más factible que
podamos reducir enormemente los costos de infraestructura
reemplazando hardware y servidores por los servicios en la nube de
Microsoft, Google o Amazon. Empresas más pequeñas, que antes no
podían competir con las grandes porque no podían montar un centro de
cómputos de envergadura, pueden hoy contratar enorme capacidad de
almacenamiento y procesamiento en la nube, simplemente pagando
cuotas mensuales por los servicios que consuman.
De igual modo es también poco probable que podamos montar una red
de comunicaciones propia. Y aunque la construyamos, difícilmente
logremos menores costos o servicios diferentes que los que nuestros
competidores consiguen contratando los servicios de Personal o
Telefónica.
¿Y qué pasa con el software? Ahí la cosa es distinta. En efecto puedo
construir un software a medida y que agregue valor diferencial. Ese
desarrollo es propio y no podrán tenerlo nuestros competidores. Y aun
cuando contratemos software ya desarrollado, SAP, por ejemplo, las
personalizaciones y diferentes implementaciones que hagamos nos
darán ventajas por sobre el resto.
Para poner un ejemplo, tanto una empresa como sus competidores
pueden acceder a los servicios de mapas y geolocalización de Google.
Pero mientras una empresa solo lo utilizan para mostrar la ubicación de
la sucursal más cercana al domicilio del cliente, otra puede mostrar en
mapa el trayecto que va realizando el delivery del producto, un servicio
de valor agregado que seguramente el comprador apreciará. Lo mismo
ocurre con los bancos, muchos de ellos utilizan en mismo software de
base, pero la implementación que hacen es diferente y el modo en el
que se opera en sucursal y on-line es diferente.
En definitiva, tener un mejor software que un competidor, permitirá dar
un mejor servicio, reducir costos y/o aportarle al producto un valor
agregado a la experiencia del cliente. No caben dudas que, hoy en día,
un buen software también permite generar ventajas
competitivas y alimenta la cadena de valor de la empresa.
Y claro, esto sirve por la positiva pero también por la negativa. Si el
software falla, si no se puede hacer una venta porque el sistema este
caído, si es difícil de utilizar, si no puede accederse desde dispositivos
móviles, si tiene una interfaz confusa, si tiene fallas de seguridad, si
queda obsoleto, si tiene menos funcionalidad que el de los
competidores, no solo no se obtendrán ventajas, sino que
adicionalmente habrá seguramente impacto muy malo para los
negocios. Es necesario construir software de calidad. Se necesita
ingeniería de software.
1.1.2 Dominios de aplicación del software
Actualmente, hay siete grandes categorías de software de
computadora que plantean retos continuos a los ingenieros de
software:
Software de sistemas: conjunto de programas escritos para dar
servicio a otros programas. Determinado software de sistemas (por
ejemplo, compiladores, editores y herramientas para administrar
archivos) procesa estructuras de información complejas pero
deterministas. Otras aplicaciones de sistemas (por ejemplo,
componentes de sistemas operativos, manejadores, software de
redes, procesadores de telecomunicaciones) procesan sobre todo
datos indeterminados. En cualquier caso, el área de software de
sistemas se caracteriza por: gran interacción con el hardware de la
computadora, uso intensivo por parte de usuarios múltiples,
operación concurrente que requiere la secuenciación, recursos
compartidos y administración de un proceso sofisticado, estructuras
complejas de datos e interfaces externas múltiples.
Software de aplicación: programas aislados que resuelven una
necesidad específica de negocios. Las aplicaciones en esta área
procesan datos comerciales o técnicos en una forma que facilita las
operaciones de negocios o la toma de decisiones administrativas o
técnicas. Además de las aplicaciones convencionales de
procesamiento de datos, el software de aplicación se usa para
controlar funciones de negocios en tiempo real (por ejemplo,
procesamiento de transacciones en punto de venta, control de
procesos de manufactura en tiempo real).
Software de ingeniería y ciencias: se ha caracterizado por
algoritmos “devoradores de números”. Las aplicaciones van de la
astronomía a la vulcanología, del análisis de tensiones en automóviles a
la dinámica orbital del transbordador espacial, y de la biología molecular
a la manufactura automatizada. Sin embargo, las aplicaciones modernas
dentro del área de la ingeniería y las ciencias están abandonando los
algoritmos numéricos convencionales. El diseño asistido por
computadora, la simulación de sistemas y otras aplicaciones
interactivas, han comenzado a hacerse en tiempo real e incluso han
tomado características del software de sistemas.
Software incrustado: reside dentro de un producto o sistema y se usa
para implementar y controlar características y funciones para el usuario
final y para el sistema en sí. El software incrustado ejecuta funciones
limitadas y particulares (por ejemplo, control del tablero de un horno de
microondas) o provee una capacidad significativa de funcionamiento y
control (funciones digitales en un automóvil, como el control del
combustible, del tablero de control y de los sistemas de frenado).
Software de línea de productos: es diseñado para proporcionar una
capacidad específica para uso de muchos consumidores diferentes. El
software de línea de productos se centra en algún mercado limitado y
particular (por ejemplo, control del inventario de productos) o se dirige a
mercados masivos de consumidores (procesamiento de textos, hojas de
cálculo, gráficas por computadora, multimedios, entretenimiento,
administración de base de datos y aplicaciones para finanzas personales
o de negocios).
Aplicaciones web: llamadas “webapps”, esta categoría de software
centrado en redes agrupa una amplia gama de aplicaciones. En su forma
más sencilla, las webapps son poco más que un conjunto de archivos de
hipertexto vinculados que presentan información con uso de texto y
gráficas limitadas. Sin embargo, desde que surgió Web 2.0, las webapps
están evolucionando hacia ambientes de cómputo sofisticados que no
sólo proveen características aisladas, funciones de cómputo y contenido
para el usuario final, sino que también están integradas con bases de
datos corporativas y aplicaciones de negocios.
Software de inteligencia artificial: hace uso de algoritmos no
numéricos para resolver problemas complejos que no son fáciles de
tratar computacionalmente o con el análisis directo. Las aplicaciones en
esta área incluyen robótica, sistemas expertos, reconocimiento de
patrones (imagen y voz), redes neurales artificiales, demostración de
teoremas y juegos.
Son millones de ingenieros de software en todo el mundo los que
trabajan duro en proyectos de software en una o más de estas
categorías. En ciertos casos se elaboran sistemas nuevos, pero en
muchos otros se corrigen, adaptan y mejoran aplicaciones ya existentes.
No es raro que una joven ingeniera de software trabaje en un programa
de mayor edad que la de ella… Las generaciones pasadas de los
trabajadores del software dejaron un legado en cada una de las
categorías mencionadas. Por fortuna, la herencia que dejará la actual
generación aligerará la carga de los futuros ingenieros de software. Aun
así, nuevos desafíos han aparecido en el horizonte.
Computación en un mundo abierto: el rápido crecimiento de las
redes inalámbricas quizá lleve pronto a la computación verdaderamente
ubicua y distribuida. El reto para los ingenieros de software será
desarrollar software de sistemas y aplicación que permita a dispositivos
móviles, computadoras personales y sistemas empresariales
comunicarse a través de redes enormes.
Construcción de redes: la red mundial (World Wide Web) se está
convirtiendo con rapidez tanto en un motor de computación como en un
proveedor de contenido. El desafío para los ingenieros de software es
hacer arquitecturas sencillas (por ejemplo, planeación financiera
personal y aplicaciones sofisticadas que proporcionen un beneficio a
mercados objetivo de usuarios finales en todo el mundo).
Fuente abierta: tendencia creciente que da como resultado la
distribución de código fuente para aplicaciones de sistemas (por
ejemplo, sistemas operativos, bases de datos y ambientes de desarrollo)
de modo que mucha gente pueda contribuir a su desarrollo. El desafío
para los ingenieros de software es elaborar código fuente que sea
autodescriptivo, y también, lo que es más importante, desarrollar
técnicas que permitirán tanto a los consumidores como a los
desarrolladores saber cuáles son los cambios hechos y cómo se
manifiestan dentro del software.
Es indudable que cada uno de estos nuevos retos obedecerá a la ley de
las consecuencias imprevistas y tendrá efectos (para hombres de
negocios, ingenieros de software y usuarios finales) que hoy no pueden
predecirse. Sin embargo, los ingenieros de software pueden prepararse
desarrollando un proceso que sea ágil y suficientemente adaptable para
que acepte los cambios profundos en la tecnología y las reglas de los
negocios que seguramente surgirán en la década siguiente.
1.1.3 Software heredado
Cientos de miles de programas de cómputo caen en uno de los siete
dominios amplios de aplicación que se estudiaron en la subsección
anterior. Algunos de ellos son software muy nuevo, disponible para
ciertos individuos, industria y gobierno. Pero otros programas son más
viejos, en ciertos casos muy viejos.
Estos programas antiguos —que es frecuente denominar software
heredado— han sido centro de atención y preocupación continuas desde
la década de 1960. Dayani-Fard y sus colegas [Day99] describen el
software heredado de la manera siguiente:
Los sistemas de software heredado […] fueron desarrollados hace varias
décadas y han sido modificados de manera continua para que satisfagan
los cambios en los requerimientos de los negocios y plataformas de
computación. La proliferación de tales sistemas es causa de dolores de
cabeza para las organizaciones grandes, a las que resulta costoso
mantenerlos y riesgoso hacerlos evolucionar.
Liu y sus colegas [Liu98] amplían esta descripción al hacer notar que
“muchos sistemas heredados continúan siendo un apoyo para las
funciones básicas del negocio y son ‘indispensables’ para éste”.
Además, el software heredado se caracteriza por su longevidad e
importancia crítica para el negocio.
Desafortunadamente, en ocasiones hay otra característica presente en
el software heredado: mala calidad. Hay veces en las que los sistemas
heredados tienen diseños que no son susceptibles de extenderse, código
confuso, documentación mala o inexistente, casos y resultados de
pruebas que nunca se archivaron, una historia de los cambios mal
administrada… la lista es muy larga. A pesar de esto, dichos sistemas
dan apoyo a las “funciones básicas del negocio y son indispensables
para éste”. ¿Qué hacer?
La única respuesta razonable es: hacer nada, al menos hasta que el
sistema heredado tenga un cambio significativo. Si el software heredado
satisface las necesidades de sus usuarios y corre de manera confiable,
entonces no falla ni necesita repararse. Sin embargo, conforme pase el
tiempo será frecuente que los sistemas de software evolucionen por una
o varias de las siguientes razones:
• El software debe adaptarse para que cumpla las necesidades de los
nuevos ambientes del cómputo y de la tecnología.
• El software debe ser mejorado para implementar nuevos
requerimientos del negocio.
• El software debe ampliarse para que sea operable con otros sistemas o
bases de datos modernos.
• La arquitectura del software debe rediseñarse para hacerla viable
dentro de un ambiente de redes.
Cuando ocurren estos modos de evolución, debe hacerse la reingeniería
del sistema heredado para que sea viable en el futuro. La meta de la
ingeniería de software moderna es “desarrollar metodologías que se
basen en el concepto de evolución; es decir, el concepto de que los
sistemas de software cambian continuamente, que los nuevos sistemas
de software se desarrollan a partir de los antiguos y […] que todo debe
operar entre sí y cooperar con cada uno de los demás” [Day99].
1.2 LA NATURALEZA ÚNICA DE LAS WEBAPPS
En los primeros días de la Red Mundial (entre 1990 y 1995), los sitios
web consistían en poco más que un conjunto de archivos de hipertexto
vinculados que presentaban la información con el empleo de texto y
gráficas limitadas. Al pasar el tiempo, el aumento de HTML por medio de
herramientas de desarrollo (XML, Java) permitió a los ingenieros de la
web brindar capacidad de cómputo junto con contenido de información.
Habían nacido los sistemas y aplicaciones basados en la web (denominó
a éstas en forma colectiva como webapps). En la actualidad, las
webapps se han convertido en herramientas sofisticadas de cómputo
que no sólo proporcionan funciones aisladas al usuario final, sino que
también se han integrado con bases de datos corporativas y
aplicaciones de negocios.
Como se dijo en la sección anterior las webapps son una de varias
categorías distintas de software. No obstante, podría argumentarse que
las webapps son diferentes. Powell [Pow98] sugiere que los sistemas y
aplicaciones basados en web “involucran una mezcla entre las
publicaciones impresas y el desarrollo de software, entre la
mercadotecnia y la computación, entre las comunicaciones internas y las
relaciones exteriores, y entre el arte y la tecnología”. La gran mayoría de
webapps presenta los siguientes atributos:
Uso intensivo de redes. Una webapp reside en una red y debe
atender las necesidades de una comunidad diversa de clientes. La red
permite acceso y comunicación mundiales (por ejemplo, internet) o tiene
acceso y comunicación limitados (por ejemplo, una intranet corporativa).
Concurrencia. A la webapp puede acceder un gran número de usuarios
a la vez. En muchos casos, los patrones de uso entre los usuarios finales
varían mucho.
Carga impredecible. El número de usuarios de la webapp cambia en
varios órdenes de magnitud de un día a otro. El lunes tal vez la utilicen
cien personas, el jueves quizá 10 000 usen el sistema
Rendimiento. Si un usuario de la webapp debe esperar demasiado
(para entrar, para el procesamiento por parte del servidor, para el
formado y despliegue del lado del cliente), él o ella quizá decidan irse a
otra parte.
Disponibilidad. Aunque no es razonable esperar una disponibilidad de
100%, es frecuente que los usuarios de webapps populares demanden
acceso las 24 horas de los 365 días del año. Los usuarios en Australia o
Asia quizá demanden acceso en horas en las que las aplicaciones
internas de software tradicionales en Norteamérica no estén en línea por
razones de mantenimiento.
Orientadas a los datos. La función principal de muchas webapp es el
uso de hipermedios para presentar al usuario final contenido en forma
de texto, gráficas, audio y video. Además, las webapps se utilizan en
forma común para acceder a información que existe en bases de datos
que no son parte integral del ambiente basado en web (por ejemplo,
comercio electrónico o aplicaciones financieras).
Contenido sensible. La calidad y naturaleza estética del contenido
constituye un rasgo importante de la calidad de una webapp.
Evolución continua. A diferencia del software de aplicación
convencional que evoluciona a lo largo de una serie de etapas planeadas
y separadas cronológicamente, las aplicaciones web evolucionan en
forma continua. No es raro que ciertas webapp (específicamente su
contenido) se actualicen minuto a minuto o que su contenido se calcule
en cada solicitud.
Inmediatez. Aunque la inmediatez —necesidad apremiante de que el
software llegue con rapidez al mercado— es una característica en
muchos dominios de aplicación, es frecuente que las webapps tengan
plazos de algunos días o semanas para llegar al mercado.
Seguridad. Debido a que las webapps se encuentran disponibles con el
acceso a una red, es difícil o imposible limitar la población de usuarios
finales que pueden acceder a la aplicación. Con el fin de proteger el
contenido sensible y brindar modos seguros de transmisión de los datos,
deben implementarse medidas estrictas de seguridad a través de la
infraestructura de apoyo de una webapp y dentro de la aplicación
misma.
Estética. Parte innegable del atractivo de una webapp es su apariencia
y percepción. Cuando se ha diseñado una aplicación para comercializar
o vender productos o ideas, la estética tiene tanto que ver con el éxito
como el diseño técnico.
Podría argumentarse que otras categorías de aplicaciones estudiadas
muestran algunos de los atributos mencionados. Sin embargo, las
webapps casi siempre poseen todos ellos.
1.1. INGENIERÍA DE SOFTWARE
Con objeto de elaborar software listo para enfrentar los retos del siglo
XXI, se debe aceptar algunas realidades sencillas:
• El software se ha incrustado profundamente en casi todos los aspectos
de nuestras vidas y, como consecuencia, el número de personas que
tienen interés en las características y
funciones que brinda una aplicación específica ha crecido en forma
notable. Cuando hade construirse una aplicación nueva o sistema
incrustado, deben escucharse muchas opiniones. Y en ocasiones parece
que cada una de ellas tiene una idea un poco distinta de cuáles
características y funciones debiera tener el software. Se concluye que
debe hacerse un esfuerzo concertado para entender el problema antes
de desarrollar una aplicación de software.
• Los requerimientos de la tecnología de la información que demandan
los individuos, negocios y gobiernos se hacen más complejos con cada
año que pasa. En la actualidad, grandes equipos de personas crean
programas de cómputo que antes eran elaborados por un solo individuo.
El software sofisticado, que alguna vez se implementó en un ambiente
de cómputo predecible y autocontenido, hoy en día se halla incrustado
en el interior de todo, desde la electrónica de consumo hasta
dispositivos médicos o sistemas de armamento. La complejidad de estos
nuevos sistemas y productos basados en computadora demanda
atención cuidadosa a las interacciones de todos los elementos del
sistema. Se concluye que el diseño se ha vuelto una actividad crucial.
•Los individuos, negocios y gobiernos dependen cada vez más del
software para tomar decisiones estratégicas y tácticas, así como para
sus operaciones y control cotidianos. Si el software falla, las personas y
empresas grandes pueden experimentar desde un inconveniente menor
hasta fallas catastróficas. Se concluye que el software debe tener alta
calidad.
• A medida que aumenta el valor percibido de una aplicación específica
se incrementa la probabilidad de que su base de usuarios y longevidad
también crezcan. Conforme se extienda su base de usuarios y el tiempo
de uso, las demandas para adaptarla y mejorarla también crecerán. Se
concluye que el software debe tener facilidad para recibir
mantenimiento.
Estas realidades simples llevan a una conclusión: debe hacerse
ingeniería con el software en todas sus formas y a través de todos sus
dominios de aplicación.
Las casas no se construyen simplemente apilando ladrillos con cemento.
Si un obrero quiere levantar un edificio simplemente levantando paredes
y pisos, está claro que, cuando llegue a cierta altura, hay altas chances
de que colapse por no aguantar su propio peso.
La construcción de casas requiere un enfoque meticuloso y planificado.
Antes de iniciar la construcción, es necesario realizar cálculos precisos,
elaborar planos detallados y establecer cimientos sólidos. La estructura,
compuesta por vigas y columnas adecuadas, debe ser construida
siguiendo procesos de ingeniería y utilizando materiales de resistencia
apropiada.
Además, existen procesos establecidos que ordenan las tareas de
construcción. Por ejemplo, los vidrios se instalan al final para evitar
daños durante la obra, mientras que los caños se colocan previamente a
revocar y pintar las paredes. Es importante entender que la construcción
de edificios no se limita a apilar ladrillos, sino que implica seguir
rigurosos procesos de ingeniería.
En resumen, la construcción de casas involucra una serie de
consideraciones técnicas y pasos organizados que garantizan la calidad
y seguridad de la obra. Desde los cálculos iniciales hasta la correcta
secuencia de tareas, se aplican principios de ingeniería para lograr una
construcción exitosa y duradera.
Lo mismo debería pasar con el software. No se puede construir tirando
líneas de código en una computadora. Para que el software no colapse
en su primer uso, debe utilizarse lo que genéricamente se denomina
Ingeniería de Software. ¿Qué es entonces la ingeniería de Software?
Estas son algunas de las definiciones más conocidas:
“Es el establecimiento y uso de principios solidos de la ingeniería
para obtener económicamente un software confiable y que
funcione de modo eficiente en máquinas reales”. [Bauer, 1972]
“Es el estudio de los principios y metodologías para desarrollo y
mantenimiento de sistemas de software”. [Zelkovitz, 1978]
“Es la aplicación de un enfoque sistemático, disciplinado y
cuantificable al desarrollo operación (funcionamiento) y
mantenimiento del software: es decir, la aplicación de ingeniería al
software”. [IEEE, 1993]
“Es una disciplina de la ingeniería que comprende todos los
aspectos de la producción de software desde las etapas iniciales
de la especificación del sistema hasta el mantenimiento de este
después que se utiliza”. [Sommerville, 2004]
“Es una disciplina que integra el proceso, los métodos, y las
herramientas para el desarrollo de software de computadora”.
[Pressman, 2005]
Vale también en este considerar algunos aspectos claves, destacados
por Ian Sommerville en su libro “Ingeniería de Software”:
 La ingeniería de software es una disciplina de ingeniería que
se interesa por todos los aspectos de la producción de
software, no solamente por la etapa de construcción.
 El proceso de software incluye todas las actividades que
intervienen en el desarrollo de software, incluso las
actividades de alto nivel de especificación, desarrollo,
validación y evolución.
 El software no es solo un programa o conjunto de
programas, sino que también incluye documentación.
Las ideas fundamentales de la ingeniería de software son aplicables a
todos los tipos de sistemas de software. Dichos fundamentos incluyen
procesos de administración de software, confiabilidad y seguridad del
software, ingeniería de requerimientos y reutilización de software.
Los ingenieros de software tienen responsabilidades con la profesión de
ingeniería y también con la sociedad. No deben preocuparse únicamente
por temas técnicos sino también contemplar los temas éticos vinculados
con el desarrollo. Las sociedades profesionales publican usualmente
códigos de conducta que establecen los estándares de comportamiento
esperados de sus miembros.
Aunque cientos de autores han desarrollado definiciones personales de
la ingeniería de software, la propuesta por Fritz Bauer [Nau69] en la
conferencia fundamental sobre el tema todavía sirve como base para el
análisis:
[La ingeniería de software es] el establecimiento y uso de principios
fundamentales de la ingeniería con objeto de desarrollar en forma
económica software que sea confiable y que trabaje con eficiencia en
máquinas reales.
Bauer proporciona una base. ¿Cuáles son los “principios fundamentales
de la ingeniería” que pueden aplicarse al desarrollo del software de
computadora? ¿Cómo se desarrolla software “en forma económica” y
que sea “confiable”? ¿Qué se requiere para crear programas de cómputo
que trabajen con “eficiencia”, no en una sino en muchas “máquinas
reales” diferentes? Éstas son las preguntas que siguen siendo un reto
para los ingenieros de software.
El IEEE [IEEE93a] ha desarrollado una definición más completa, como
sigue:
¿Cómo se define la ingeniería de software?
La ingeniería de software es:
1) La aplicación de un enfoque sistemático, disciplinado y
cuantificable al desarrollo, operación y mantenimiento de
software; es decir, la aplicación de la ingeniería al software. 2) El
estudio de enfoques según el punto 1.
Aun así, el enfoque “sistemático, disciplinado y cuantificable”
aplicado por un equipo de software podría ser algo burdo para otro.
Se necesita disciplina, pero también adaptabilidad y agilidad.
La ingeniería de software es una tecnología con varias capas. Como
se aprecia en la figura, cualquier enfoque de ingeniería (incluso la de
software) debe basarse en un compromiso organizacional con la
calidad. La administración total de la calidad, Six Sigma y otras
filosofías similares alimentan la cultura de mejora continua, y es esta
cultura la que lleva en última instancia al desarrollo de enfoques cada
vez más eficaces de la ingeniería de software. El fundamento en el
que se apoya la ingeniería de software es el compromiso con la
calidad.
El fundamento para la ingeniería de software es la capa proceso. El
proceso de ingeniería de software es el aglutinante que une las capas
de la tecnología y permite el desarrollo racional y
CAPAS DE LA INGENIERIA DEL SOFTWARE
oportuno del software de cómputo. El proceso define una estructura que
debe establecerse para la obtención eficaz de tecnología de ingeniería
de software. El proceso de software forma la base para el control de la
administración de proyectos de software, y establece el contexto en el
que se aplican métodos técnicos, se generan productos del trabajo
(modelos, documentos, datos, reportes, formatos, etc.), se establecen
puntos de referencia, se asegura la calidad y se administra el cambio de
manera apropiada.
Los métodos de la ingeniería de software proporcionan la experiencia
técnica para elaborar software. Incluyen un conjunto amplio de tareas,
como comunicación, análisis de los requerimientos, modelación del
diseño, construcción del programa, pruebas y apoyo. Los métodos de la
ingeniería de software se basan en un conjunto de principios
fundamentales que gobiernan cada área de la tecnología e incluyen
actividades de modelación y otras técnicas descriptivas.
Las herramientas de la ingeniería de software proporcionan un apoyo
automatizado o semiautomatizado para el proceso y los métodos.
Cuando se integran las herramientas de modo que la información creada
por una pueda ser utilizada por otra, queda establecido un sistema
llamado ingeniería de software asistido por computadora que apoya el
desarrollo de software.
1.1.1EL PROCESO DE DESARROLLO DEL SOFTWARE
El proceso de desarrollo de software “es aquel en que las necesidades
del usuario son traducidas en requerimientos de software, estos
requerimientos transformados en diseño y el diseño implementado en
código, el código es probado, documentado y certificado para su uso
operativo”. [Jacobson 1998].
Un proceso es un conjunto de actividades, acciones y tareas que se
ejecutan cuando va a crearse algún producto del trabajo. Una actividad
busca lograr un objetivo amplio (por ejemplo, comunicación con los
participantes) y se desarrolla sin importar el dominio de la aplicación,
tamaño del proyecto, complejidad del esfuerzo o grado de rigor con el
que se usará la ingeniería de software. Una acción (diseño de la
arquitectura) es un conjunto de tareas que producen un producto
importante del trabajo (por ejemplo, un modelo del diseño de la
arquitectura). Una tarea se centra en un objetivo pequeño pero bien
definido (por ejemplo, realizar una prueba unitaria)que produce un
resultado tangible. Roger Pressman
Inicialmente y de forma general (este esquema se profundizará y
mejorará más adelante), el desarrollo de software sigue una serie de
etapas interconectadas que abarcan desde el contacto inicial con el
cliente hasta la implementación del software. En algunos casos, pueden
surgir nuevas versiones del software, lo que implica repetir este proceso.
La siguiente representación gráfica ilustra las etapas y su interrelación

1. Definición Inicial: En esta etapa se define globalmente el


proyecto y los resultados esperados. Se hacen los acuerdos
básicos, incluso un primer presupuesto inicial, que permiten
comenzar con el proyecto.

2. Análisis de los requerimientos y su viabilidad: Iniciado el


proyecto, se procede a recopilar, examinar y obtener todos
requerimientos del cliente. También será importante detectar
restricciones. En esta etapa debo establecer si es proyecto es
viable de desarrollar.

3. Diseño general y detallado: A partir de los requerimientos


recopilados, se procede al diseño de la aplicación informática que
satisfaga las necesidades del cliente. Para ello, se plantean en
primer lugar los requisitos generales de la arquitectura de la
aplicación, seguidos por el detalle de cada uno de sus
componentes. Este proceso requiere una precisión tal que permita
su posterior construcción, siendo equivalente al plano que guía la
edificación de un edificio.

4. Codificación: En esta etapa los componentes diseñados a nivel


teórico se programan utilizando lenguaje de programación.

5. Pruebas: Una vez programado, será necesario verificar que el


software no contenga errores, y que cumple con los
requerimientos originalmente solicitados por el usuario.

6. Implementación: Finalmente, el software se instala en las


computadoras del usuario y el sistema comienza a funcionar. Debe
además asegurarse que quienes usarán el software reciban la
capacitación necesaria para utilizarlo correctamente.
7. Evolución: Una vez que el software comienza a prestar servicio,
seguramente requerirá cambios, ya sea para corregir
eventualmente algún error no detectado, o para incorporar nuevas
funcionalidades.

Pero… ¿Bastan estas etapas para asegurar un producto de calidad?


¿Bastan para mejorar los procesos futuros de desarrollo? La respuesta es
que no bastan. El responsable del proyecto de software tendrá que
realizar una serie de actividades que protejan la calidad del software.
Estas tareas se deben realizar en forma concomitante con las
mencionadas anteriormente.
En su libro de Roger Pressman
La estructura del proceso establece el fundamento para el proceso
completo de la ingeniería de software por medio de la identificación de
un número pequeño de actividades estructurales que sean aplicables a
todos los proyectos de software, sin importar su tamaño o complejidad.
Además, la estructura del proceso incluye un conjunto de actividades
sombrilla que son aplicables a través de todo el proceso del software.
Una estructura de proceso general para la ingeniería de software consta
de cinco actividades:
Comunicación. Antes de que comience cualquier trabajo técnico, tiene
importancia crítica comunicarse y colaborar con el cliente (y con otros
participantes). Se busca entender los objetivos de los participantes
respecto del proyecto, y reunir los requerimientos que ayuden a definir
las características y funciones del software.
Planeación. Cualquier viaje complicado se simplifica si existe un mapa.
Un proyecto de software es un viaje difícil, y la actividad de planeación
crea un “mapa” que guía al equipo mientras viaja. El mapa —llamado
plan del proyecto de software— define el trabajo de ingeniería de
software al describir las tareas técnicas por realizar, los riesgos
probables, los recursos que se requieren, los productos del trabajo que
se obtendrán y una programación de las actividades.
Modelado. Ya sea usted diseñador de paisaje, constructor de puentes,
ingeniero aeronáutico, carpintero o arquitecto, a diario trabaja con
modelos. Crea un “bosquejo” del objeto por hacer a fin de entender el
panorama general —cómo se verá arquitectónicamente, cómo ajustan
entre sí las partes constituyentes y muchas características más—. Si se
requiere, refina el bosquejo con más y más detalles en un esfuerzo por
comprender mejor el problema y cómo resolverlo. Un ingeniero de
software hace lo mismo al crear modelos a fin de entender mejor los
requerimientos del software y el diseño que los satisfará.
Construcción. Esta actividad combina la generación de código (ya sea
manual o automatizada) y las pruebas que se requieren para descubrir
errores en éste.
Despliegue. El software (como entidad completa o como un incremento
parcialmente terminado) se entrega al consumidor que lo evalúa y que
le da retroalimentación, misma que se basa en dicha evaluación.
Estas cinco actividades estructurales genéricas se usan durante el
desarrollo de programas pequeños y sencillos, en la creación de
aplicaciones web grandes y en la ingeniería de sistemas enormes y
complejos basados en computadoras. Los detalles del proceso de
software serán distintos en cada caso, pero las actividades estructurales
son las mismas.
Para muchos proyectos de software, las actividades estructurales se
aplican en forma iterativa a medida que avanza el proyecto. Es decir, la
comunicación, la planeación, el modelado, la construcción y el
despliegue se ejecutan a través de cierto número de repeticiones del
proyecto. Cada iteración produce un incremento del software que da a
los participantes un subconjunto de características y funcionalidad
generales del
Roger Pressman identifica una serie actividades que denomina
“Sombrilla” o “Protectoras de la calidad”. A diferencia de las etapas
del proceso, estas actividades no se realizan de modo secuencial, sino
que están presentes a lo largo de todo el desarrollo. Se inician al
comenzar el proceso y funcionan como una sobrilla que protege a las
etapas del proceso asegurando su calidad.
Las actividades sombrilla planteadas por Pressman son las
siguientes:
• Seguimiento y control del proyecto de software: permite
que el equipo de software evalúe el progreso, comparándolo con el
plan del proyecto, y que pueda tomar cualquier acción necesaria
corregir desvíos que se detecten.
• Gestión del riesgo: es necesaria una permanente evaluación
de los riesgos que puedan afectar el resultado del proyecto o la
calidad del producto; así como también establecer las acciones
que deben realizarse para minimizar su probabilidad de ocurrencia
o su impacto.
• Aseguramiento de la calidad del software: se establecen
normas, protocolos y estándares a cumplir a los fines de cumplir a
los fines de que el producto final sea un producto de aceptable
calidad.
• Revisiones técnicas: evalúa los productos del trabajo de la
ingeniería de software a fin de descubrir y eliminar errores antes
de que se propaguen a la siguiente actividad.
• Mediciones y Métricas: define y reúne mediciones para
ayudar al equipo a conocer el estado del proyecto, detectar
eventuales necesidades de aplicar alguna corrección, o servir al
proceso de mejora continua.
• Gestión de la configuración del software: administra los
efectos del cambio a lo largo del proceso del software.
• Administración de la reutilización: define criterios para
volver a usar el producto del trabajo (incluso los componentes del
software) y establece mecanismos para obtener, desde el inicio,
componentes reutilizables en futuros proyectos.
• Preparación y producción del producto del trabajo: agrupa
las actividades requeridas para crear productos del trabajo, tales
como modelos, documentos, registros, formatos y listas.
Cada una de estas actividades sombrilla se analiza en detalle más
adelante.
Ya se dijo en esta sección que el proceso de ingeniería de software no es
una prescripción rígida que deba seguir en forma dogmática el equipo
que lo crea. Al contrario, debe ser ágil y adaptable (al problema, al
proyecto, al equipo y a la cultura organizacional). Por tanto, un proceso
adoptado para un proyecto puede ser significativamente distinto de otro
adoptado para otro proyecto. Entre las diferencias se encuentran las
siguientes:
• Flujo general de las actividades, acciones y tareas, así como de las
interdependencias entre ellas
• Grado en el que las acciones y tareas están definidas dentro de cada
actividad estructural
• Grado en el que se identifican y requieren los productos del trabajo
• Forma en la que se aplican las actividades de aseguramiento de la
calidad
• Manera en la que se realizan las actividades de seguimiento y control
del proyecto
• Grado general de detalle y rigor con el que se describe el proceso
• Grado con el que el cliente y otros participantes se involucran con el
proyecto
• Nivel de autonomía que se da al equipo de software
• Grado con el que son prescritos la organización y los roles del equipo
En la siguiente imagen, puede verse de modo completo el proceso de
desarrollo de software, con las etapas de desarrollo propiamente dichas,
enmarcadas en un esquema de calidad, y con diversas actividades
protectoras que se realizan en forma concomitante para asegurar un
software de calidad.

Diseño de Software
El Diseño es aquella etapa del ciclo de vida del desarrollo de software,
en la cual se platea la solución informática a las necesidades que los
analistas relevaron y que describieron el “Documento de Requerimientos
de Software”. Se analizan dichos requerimientos para producir una
descripción detallada de la estructura y funcionamiento, de modo que
los programadores puedan construirlo. La salida es un conjunto de
modelos y artefactos que registran las principales decisiones adoptadas.
Con el paso del tiempo, a medida que los sistemas fueron evolucionando
y empezaron incluso a trascender los límites de la organización, las
necesidades de diseño fueron aumentando. Ya no solo basta “traducir”
el relevamiento a “instrucciones detalladas” que el programador pudiera
entender, sino que comienza a ser necesario definir muchas más cosas.
Por ejemplo, cuál será la arquitectura en la cual estará montado el
sistema, que servidores utilizará, donde estará alojada la base de datos
y como se accederá a ella, como será la seguridad; entre varios otros
temas. Los puntos vinculados a los diagramas y metodologías de diseño
y a bases de datos exceden el alcance de este apunte.
LA ETAPA DE DISEÑO
¡Qué es el diseño de software?
El diseño es el anhelo de todo ingeniero o arquitecto de software. Es el
punto en el que las reglas de la creatividad convergen para crear un
sistema que cumpla con los requisitos de los usuarios, las necesidades
del negocio y las consideraciones técnicas. A través del diseño, se
construye una representación o modelo del software. A diferencia del
documento de requerimientos, que se enfoca en describir los datos
necesarios, las funciones y el comportamiento, el modelo de diseño
ofrece detalles técnicos sobre cómo el software debe operar. Esto abarca
aspectos como la arquitectura, las estructuras de datos, las interfaces y
otros componentes necesarios para implementar el sistema.
El diseño puede compararse con el plano de una casa. Al igual que un
plano proporciona a los constructores toda la información necesaria para
edificar una casa, el diseño del software ofrece una guía detallada para
su implementación. Así como un plano indica dónde deben ubicarse los
caños, las ventanas y la dirección de apertura de las puertas, el diseño
del software establece la arquitectura, la disposición de los componentes
y las interacciones entre ellos. Proporciona una visión clara de cómo
debe construirse el software y cómo se integran las diferentes partes
para lograr un funcionamiento coherente y eficiente.
¿Cómo podemos definirlo formalmente?
Es el proceso de aplicar distintas técnicas y principios arquitectónicos,
con el propósito de definir un dispositivo, proceso o artefacto31, con los
suficientes detalles como para permitir su realización física.
El producto final del diseño es un documento (o varios) estandarizado y
con el detalle técnico necesario, para que un programador pueda
construir la solución informática, aunque no haya tenido participación en
las etapas previas
¿Quién lo hace?
Siguiendo con el ejemplo de las casas, para dibujar un plano se
requieren conocimientos técnicos específicos. Hay que respetar escalas
y convenciones para que los constructores lo puedan interpretar.
El diseño de software requiere el conocimiento de metodologías y
notaciones estándares. Esta etapa se considera fundamental y es la
primera actividad en la que se requiere tener conocimientos específicos
para definir la solución utilizando un lenguaje estándar, como el UML
(Lenguaje Unificado de Modelado), que permite especificar las
características sin ambigüedades y que puede ser comprendido por
cualquier programador. Utilizar un lenguaje estándar facilita la
comunicación y comprensión del diseño entre los miembros del equipo
de desarrollo, permitiendo establecer una base sólida para la
implementación del software.
Además, se requiere conocer las diversas arquitecturas que pueden
utilizarse para construir software. Por lo tanto, el diseño debe ser
realizado por quien tenga conocimientos de ingeniería de software y de
los estándares que se usan para modelar el sistema.
¿Cuáles son los pasos?
El diseño del software se representa de diversas maneras. En primer
lugar, se aborda la representación de la arquitectura general del sistema
o producto. Luego, se enfoca en modelar las interfaces que conectan el
software con los usuarios finales, otros sistemas, dispositivos y sus
propios componentes internos. Por último, se lleva a cabo el diseño de
cada uno de los componentes individuales que conformarán el software.
Esta aproximación permite un enfoque sistemático y estructurado para
crear un diseño completo y coherente del software.
¿Cuál es el producto final?
Durante la etapa de diseño del software, se genera principalmente un
modelo que engloba los diferentes artefactos y representaciones
arquitectónicas, las interfaces, los detalles de cada componente y las
instrucciones de despliegue (instalación y puesta en marcha del
software). Es fundamental seguir estándares técnicos específicos para
construir este modelo, de manera que pueda ser interpretado por
cualquier programador. Estos estándares aseguran la consistencia y
comprensión del diseño, permitiendo una implementación efectiva y
colaborativa del software. Al adherirse a estos estándares, se facilita la
comunicación y el intercambio de conocimientos entre los miembros del
equipo de desarrollo
¿Cómo se asegura la calidad del diseño?
Al finalizar esta etapa es necesario realizar una auditoria o revisión
técnica. Debe asegurarse que el diseño contempla acabadamente los
requerimientos del usuario, que no tiene errores o inconsistencias, que
no existen mejores alternativas, y que se respetan las restricciones.
También será necesario auditar que se han contemplado los patrones
que la organización aprobó como estándares y que se puede
implementar en los plazos y los costos comprometidos. Solo después
que esta auditoría aprueba el diseño estará listo para ser entregado a
los programadores.
El proceso del diseño
El diseño del software se enmarca en el ámbito técnico de la ingeniería
de software y se aplica independientemente del modelo de proceso
utilizado. Esta etapa comienza una vez que los requerimientos han sido
analizados y modelados. El diseño del software se centra en crear una
solución que cumpla con los requerimientos identificados, teniendo en
cuenta aspectos como la arquitectura, las interfaces, los componentes y
otros elementos relevantes para la implementación del sistema. Es en
esta fase donde se define la estructura y el funcionamiento del software,
sentando las bases para su posterior desarrollo y construcción.
El diseño es crucial para el éxito de la ingeniería de software. A
principios de la década de 1990, Mitch Kapor, creador de Lotus 1-2-3,
publicó en Dr. Dobbs Journal un “manifiesto del diseño de software”.
Decía lo siguiente:
“Vitruvio afirmaba que los edificios bien diseñados eran aquellos que
tenían resistencia, funcionalidad y belleza. Lo mismo se aplica al buen
software. Resistencia: un programa no debe tener ningún error que
impida su funcionamiento. Funcionalidad: un programa debe se
apropiado para los fines que persigue. Belleza: la experiencia de usar el
programa debe ser placentera. Éstos son los comienzos de una teoría
del diseño de software.”
Aun con todo el tiempo trascurrido, esta afirmación sigue hoy vigente y
esas son características que todos buscamos en cualquier software o
app:
En primer lugar, la resistencia del software se refiere a su capacidad de
funcionar sin errores que impidan su correcto desempeño. Un programa
confiable y sólido es fundamental para garantizar su utilidad y eficiencia
en el cumplimiento de sus fines.
La funcionalidad del software se relaciona con su capacidad de cumplir
los objetivos y requerimientos específicos para los que fue creado. Un
programa debe ser apropiado para los fines que persigue y ofrecer las
características y capacidades necesarias para satisfacer las necesidades
de los usuarios.
Por último, la belleza del software se refiere a la experiencia de uso y a
la interfaz de usuario. Un programa con una interfaz intuitiva, atractiva y
fácil de usar proporciona una experiencia placentera para los usuarios.
La estética visual, la usabilidad y la capacidad de respuesta son
aspectos importantes que contribuyen a la percepción de belleza en el
software.
Estas características siguen siendo relevantes y buscadas en el diseño
de software en la actualidad. La combinación de resistencia,
funcionalidad y belleza proporciona una base sólida para desarrollar
aplicaciones exitosas y satisfactorias para los usuarios.
El proceso del diseño puede comprenderse con el siguiente esquema:

Las salidas del diseño son entonces:


• Arquitectura del sistema: Es el “plano general” del software. Refleja
que módulos tendrá el sistema y cómo se relacionan entre sí. También
se definirán dónde estarán almacenados cada uno de los componentes,
teniendo en cuenta que, en sistemas muy grandes, es posible
distribuirlos, permitiendo que alguno de ellos cumpla funciones
específicas, mejorando la performance y la seguridad del sistema.

En la construcción de casas existen determinados patrones de diseño


arquitectónicos que se utilizan en determinados escenarios. En el polo
norte las casas se construyen de hielo, con un formato particular que
conocemos como Iglú; en los bosques, aparecen las cabañas de troncos
como arquitectura dominante y en las grandes ciudades apilamos una
casa arriba de otra en lo que llamamos edificio. De igual modo, también
existen determinados formatos estándares que los arquitectos pueden
elegir para desarrollar su software.
Estos formatos arquitectónicos estándares se denominan patrones y
resultan ser una solución rápida y efectiva a un problema común diseño.
Esta solución ya se ha probado como válida, resolviendo problemas
similares en ocasiones anteriores.
• Especificación de la base de datos: En base a que información
deberá procesar el software, deberá establecerse qué datos manejará,
donde se almacenarán y que atributos tiene cada uno de ellos (Por
ejemplo, APELLIDO será un campo de texto de 35 caracteres y no podrá
estar vacío; PRECIO será un campo numérico que solo acepte valores
positivos, y CUIT será un campo de texto con el formato NN-NNNNNNNN-
N)
También se definirán las relaciones entre ellos (cuando se ingrese un
país, este deberá previamente existir en la tabla de países). Incluso es
posible establecerse condiciones especiales para algún dato (por
ejemplo, el cálculo de dígito verificador), o condiciones especiales de
actualización o de eliminación (por ejemplo, no debe permitir eliminar
clientes que tengan saldos en las cuentas corrientes).
Con esta especificación el arquitecto de datos (o quien tenga a
su cargo esa función) podrá construir la base de datos con todas
sus tablas, campos, atributos y relaciones.
• Especificación de la interfaz: describe como se comunicará el
software consigo mismo, con los sistemas que operan con él y con
dispositivos especiales (lectores de huella digital, lector de cheques,
posnet, etc.). Y obviamente, también definen como serán las pantallas y
la interrelación con las personas que lo operen. Lo dicho anteriormente
respecto de patrones también es aplicable en este punto.

La interfaz gráfica requiere una especial atención. No solo será el modo


con el que los usuarios operan el sistema, sino que será la imagen que
moldee su primera percepción sobre nuestro software. Una interfaz mal
diseñada, confusa, con colores inadecuados dará una la idea, quizá
errónea, de que el software es complejo, viejo, o difícil de operar.
Seguramente predispondrá negativamente a los usuarios.
Debemos buscar diseños de interfaz que permitan la mejor experiencia
de uso, contemplando los diferentes tamaños y características de
pantalla de los dispositivos con los que se acceda. No es lo mismo
diseñar una pantalla de carga para un sistema que vaya a ser operado
con mouse, teclado y un monitor de 15 pulgadas, que otro que será
utilizado desde la pantalla chica y táctil de un celular.
Los desarrolladores de sistemas operativos (Microsoft, Google, Apple)
proveen patrones de diseño que permiten a los desarrolladores generar
interfases comunes con el ecosistema
• Especificación de componentes: Es el Plano “detallado”. Describe
qué tareas realizará cada uno de los componentes que forman parte del
software, cómo se organiza internamente, cómo se relaciona con la base
de datos, y cómo con los demás componentes del sistema y el contexto.
Por ejemplo, si estamos programando un listado de operaciones
mensuales para calcular el IVA, tendremos que especificar que columnas
tendrá, de que archivo se sacarán los datos de cada columna, que
operaciones habrá que hacer con esos datos, como se calcularán los
totales y e incluso, que módulo externo se ejecutará para comprobar
que la impresora esté en línea.
También hay que definir cuestiones externas como por ejemplo en que
menú estará colgado; que permisos se requerirán para su uso; si se
puede ejecutar en modo concurrente con otros módulos del sistema; si
por una cuestión de performance debe quedar en ejecutándose en
segundo plano, y si puede o no ser accedido por otros módulos que
precisen sus servicios. Hasta pensando en la reutilización, debe indicarse
que partes del componente deben ser programados como rutinas
separadas.
En resumen… el programador que reciba esta especificación deberá
contar con todo el detalle necesario (como ya se dijo reiteradamente,
expresado de un modo estandarizado) para poder desarrollar el
componente sin necesidad de requerir ninguna información adicional, sin
que existan ambigüedades ni cosas que queden a su criterio.
Tal como se ha dicho al comienzo del apunte, para cada una de estas
cosas hay que utilizar diagramas y una terminología estándar, de modo
que pueda ser comprendida por cualquier desarrollador,
independientemente de que hayan tenido o no contacto previo con los
usuarios o diseñadores. Nuevamente corresponde aclarar que el estudio
detallado de estos diagramas pertenece a las materias como
“Metodología de sistemas de Información” y “Sistema de datos”
El “arquitecto de software”
YA hemos comentado que o, a medida que los sistemas fueron
evolucionando y empezaron incluso a trascender los límites de la
organización, las necesidades de diseño fueron aumentando.
En desarrollos más grandes será necesario contar con una persona con
conocimientos mucho más amplio y específicos, que colabore con
equipo de desarrollo en la definición de la infraestructura sobre la que
funcionará el nuevo sistema.
Según la CESSI, la cámara de la industria argentina del software, el
arquitecto de software “es el responsable de definir la arquitectura de
los sistemas tomando las decisiones de diseño de alto nivel y
estableciendo los estándares técnicos, incluyendo plataformas,
herramientas y estándares de programación, teniendo en cuenta los
requisitos funcionales, no funcionales y las necesidades del negocio. En
cooperación con el Líder de Proyecto, participa en la toma de decisiones
adecuadas para lograr una arquitectura del sistema que garantice un
mejor desempeño, flexibilidad, mantenibilidad, robustez, reúso o las
cualidades que se pretendan de la aplicación”.
Entre las actividades que realiza un arquitecto de software:
• Negociar con el propietario de la aplicación y el líder de proyecto para
tomar las decisiones de diseño de alto nivel que correspondan.

• Seleccionar el software: Seleccionar la tecnología a utilizar en conjunto


con el líder de proyecto; y definir y revisar estándares y normas
aplicables al diseño y construcción, brindando coaching técnico al
equipo de desarrollo.

• Diseñar la arquitectura: Conducir la construcción del modelo de


arquitectura/diseño, subdividiendo aplicaciones complejas en partes o
componentes menores, más fáciles de manejar.

• Realizar un seguimiento del proceso de desarrollo para asegurarse que


sus instrucciones se implementen en forma adecuada; y registrar los
cambios de arquitectura que se produzcan.

• Asegurar la calidad: Medir la performance de la aplicación y conducir


pruebas en relación con la performance, seguridad, etc.

• Facilitador: Colabora con otras áreas como seguridad informática, base


de datos, operaciones, el equipo de mantenimiento, etc.

• Liderazgo Técnico: Capacidad para asumir la dirección técnica y


asegurar todos los aspectos de la arquitectura con responsabilidad y
autoridad. Poder realizar coaching y mentoring34 sobre problemas
técnicos, ayudando a la evolución profesional del equipo de
programadores.
• En conjunto con el líder de pruebas, definir las pruebas de los
requisitos no funcionales y de integración que se realizaran y efectuar
un seguimiento de estas.

Diseño de la Interfaz de usuario


La interfaz de usuario es un componente fundamental en los sistemas actuales. Durante el
proceso de diseño, es crucial presentar a los usuarios una interfaz clara, funcional y
especialmente cómoda de usar en diversos dispositivos y tamaños de pantalla. Un diseño
adecuado facilitará la operación del sistema y minimizará los errores de interacción. Además,
como se mencionó anteriormente, la interfaz de usuario ayudará a superar la resistencia
inicial hacia la nueva aplicación y dará forma a la percepción general de la facilidad o
complejidad del nuevo sistema que se utilizará.

La interfaz de usuario desempeña un papel fundamental en la experiencia


del usuario, ya que determina cómo se sentirá al utilizar el sistema. No
existe una solución única para todas las interfaces ni para todos los
usuarios. Es necesario estudiar el hardware utilizado, la tarea realizada e
incluso el entorno de trabajo. La experiencia de un sistema que se
ejecuta en una computadora de escritorio en una oficina será diferente a
la de un quiosco informativo en un centro comercial, una estación de
servicio o la caja de un banco. Además, los sistemas que se ejecutan en
un navegador web también presentan limitaciones y características
propias de los estándares de Internet.
Los diferentes tamaños de pantalla y la comodidad del usuario al utilizar
un teclado físico o un ratón también influyen en el diseño de interfaces.
Es necesario adaptarse a estas variables para garantizar una
experiencia de usuario óptima.
Incluso en ocasiones se suele emular entornos que el usuario ya conoce,
para poder de ese modo achicar la curva de aprendizaje y vencer la
resistencia al cambio. A continuación, dos pantallas muy similares, la
primera es una interfaz Windows, la segunda Linux.
Ben Shneiderman, en su libro “Designing the User Interface:
Strategies for Effective Human-Computer Interaction” describe
ocho reglas de oro que pueden seguirse a la hora de construir una
buena interfaz de usuario:
1. Luchar por la consistencia:
Utilizar los mismos patrones de diseño y las mismas secuencias de
acciones, para responder a situaciones similares: el uso de un mismo del
color, misma tipografía y misma la terminología en las diferentes
pantallas, comandos y menús. Por ejemplo, un botón con una “X” debe
cerrar una ventana en cualquiera de los lugares en ellos que se utilice.
Una tilde verde se utilizará siempre para mostrar confirmación o validez
y se usará siempre el mismo y para lo mismo. La combinación CTRL + P
permitirá siempre imprimir la pantalla.
2. Buscar la usabilidad universal:
Reconocer las necesidades de los diferentes tipos de usuarios. Agregar
funcionalidades para novatos (ayudas) y expertos (atajos, comandos
ocultos para saltar pasos, etc.)
3. Entregar información de feedback:

Es necesario mantener a los usuarios informados de lo que está


ocurriendo en cada etapa de su proceso. Esta retroalimentación debe ser
significativa, relevante, clara y adaptada al contexto. Si el proceso tiene
varias pantallas, en la segunda debe mostrarse cierta información, por
ejemplo, el nombre del cliente con el que se está operando. Esto permite
que si el usuario es interrumpido (por ejemplo, recibiendo un mensaje de
texto), cuando vuelva a prestar atención a la pantalla recuerde los datos
más importantes que cargo anteriormente.
4. Diseñar diálogos de cierre:
Agrupa las secuencias de acciones y proporciona información de cierre
antes de continuar con el siguiente paso, por ejemplo, muestra un
resumen de la operación de compra, antes de que el usuario la confirme.
5. Prevenir errores:
Una buena interfaz debe estar diseñada para evitar errores tanto como
sea posible. No se le debe permitir al usuario ingrese datos inválidos
(precios negativos o email sin “@”). Pero también se debe ser claro en el
mensaje que se muestre ante el error y como solucionarlo. Por ejemplo,
al no confirmar una operación no debería simplemente indicar que hay
“datos inválidos” sino indicar que “El mail no tiene un formato valido”,
que “El precio no puede ser negativo”, o que “la contraseña requiere
números y letras”.
6. Permitir la fácil reversión de acciones:
Posibilitar que, en la mediad de lo posible, las acciones puedan ser
canceladas, en forma parcial o completa antes de la confirmación final
(tecla ESC, por ejemplo).
7. Darle el control al usuario:
Proporcionar herramientas para que el usuario sienta que controla la
interfaz y no al revés. Minimizar acciones innecesarias. Permitir la
interacción flexible (mouse o teclado, según prefiera). Permitir que,
eventualmente, pueda cambiar el color de la pantalla; controlar el
tamaño del texto; la ubicación de ciertos los objetos de la interfaz, como
la barra de menú; o, incluso, ocultar botones que no utilice.
8. Reducir la memoria de corto plazo:
Mostrar información relevante de pantallas anteriores. Proporcionar
contenido preestablecido (mostrar la fecha del día, traer el nombre
cuando se ingresa el código de cliente, calcular las cosas que pueden
calcularse). Simular el mundo real (si se carga información de una
factura esta debe cargarse en el orden que se cargaría en una factura
manual). Presentar información en forma jerárquica y progresiva
(comenzar primero pidiendo el país, después las provincias y por ultimo
las localidades. Incluso las localidades podrán solo aparecer aquellas
que sean de la provincia indicada)

El valor económico del diseño


En la mayoría de los casos, dentro de un equipo de Fórmula 1, el piloto
suele ser la persona con el salario más alto, seguido por el diseñador.
Esto se debe a que se reconoce la importancia crucial del diseño del
automóvil en el rendimiento y los resultados obtenidos en la pista. Un
diseño de excelencia puede marcar la diferencia en términos de ganar
milésimas de segundo en cada curva, reducir el desgaste de los
neumáticos, aumentar la velocidad, mejorar la maniobrabilidad y
proporcionar mayor potencia en los momentos clave, como los
adelantamientos.
El diseñador juega un papel fundamental en el desarrollo del automóvil
de Fórmula 1, ya que su expertise y conocimientos técnicos permiten
crear un vehículo altamente competitivo. Cada aspecto del diseño,
desde la aerodinámica hasta los sistemas mecánicos y electrónicos, se
optimiza para lograr el mejor rendimiento posible en la pista.
Si bien el piloto es quien finalmente lleva el automóvil a la victoria, su
desempeño está estrechamente ligado a la calidad del diseño y la
ingeniería del vehículo. Por lo tanto, es comprensible que los
diseñadores sean valorados y remunerados en consecuencia dentro de
un equipo de Fórmula 1, ya que su labor influye directamente en el
rendimiento del automóvil y en la competitividad del equipo en general.
En el mundo de la moda, existe una similitud con el caso de la Fórmula 1
en cuanto a la valoración y reconocimiento que se otorga a los
diseñadores. Es común que cuando las actrices famosas desfilan por la
alfombra roja, se destaque en las fotos quién fue el diseñador del
vestido que llevan puesto. Los grandes diseñadores de renombre suelen
ser altamente valorados y se les paga grandes sumas de dinero por sus
creaciones.
Esto se debe a que el diseño de moda es considerado una forma de arte
y expresión creativa. Los diseñadores son los encargados de concebir y
materializar las ideas, creando prendas únicas y distintivas. Su visión
creativa, habilidades técnicas y capacidad para captar las tendencias de
la moda son altamente valoradas en la industria.
Aunque es cierto que quienes cosen los vestidos también desempeñan
un papel importante en el proceso de producción, son los diseñadores
quienes establecen la dirección creativa y el concepto detrás de cada
prenda. Su nombre y reputación están asociados con la calidad, la
innovación y el estilo de sus diseños.
Aunque no se destaque de la misma manera que en la moda o la
Fórmula 1, el diseño de software influye significativamente en la forma
en que un sistema se comporta, resuelve problemas, brinda una
experiencia de usuario satisfactoria y se destaca estéticamente.
En el mercado de las aplicaciones, es común encontrar numerosos
programas que realizan tareas similares. Sin embargo, la diferencia
radica en cómo están diseñados y desarrollados. Aquellos que presentan
un buen diseño suelen sobresalir y ofrecer una experiencia superior en
comparación con otros.
Un buen diseño de software implica considerar aspectos como la
usabilidad, la eficiencia, la estabilidad, la escalabilidad y la seguridad.
Esto implica tomar decisiones cuidadosas en cuanto a la arquitectura del
sistema, el diseño de la interfaz de usuario, la elección de tecnologías
adecuadas, entre otros aspectos.
Un software bien diseñado se caracteriza por ser intuitivo, fácil de usar,
tener un rendimiento eficiente, ser confiable y adaptarse a las
necesidades del usuario. Además, un buen diseño permite una mayor
flexibilidad y mantenibilidad del software a lo largo del tiempo, lo que
facilita su actualización y mejora continua.
En definitiva, el diseño de software es crucial para diferenciar productos
en el mercado y garantizar que cumplan con las expectativas de los
usuarios. Un buen diseño contribuye a un mejor rendimiento, una
experiencia de usuario satisfactoria y la resolución efectiva de
problemas, lo que puede marcar la diferencia entre un software exitoso y
uno menos destacado.
En el contexto del desarrollo de software, el diseño tiene un valor
económico y estratégico por sí mismo. Contratar a un diseñador experto
y pagar por su trabajo puede ser una inversión valiosa, ya que un buen
diseño puede influir positivamente en la aceptación y adopción del
software, así como en la experiencia de usuario y la satisfacción del
cliente. Ese diseño podrá ser entregado luego a un programador que
será el encargado de desarrollarlo físicamente.
Pero, además, es recién al final de esta etapa, cuando el plano general
está construido, que se tiene la real dimensión del proyecto y, por ende,
recién en este momento se podrá estimar, cuantos recursos se
necesitarán en las próximas etapas y cuánto tiempo llevará el desarrollo.
Al terminar el diseño sabré que tipo de base de datos voy a necesitar,
cuantos módulos de ABM (altas bajas y modificación de datos) existirán,
qué tan complejas serán las pantallas, qué procesos de cálculo habrá
que realizar, y cuántos listados tendrá el sistema. La real dimensión
del proyecto se conoce en este momento. Recién entonces se
podrá estimar cuantos recursos se necesitarán en las próximas
etapas y cuánto tiempo y dinero llevará el desarrollo

RESUMEN
El software es un elemento clave en la evolución de sistemas y
productos basados en computadoras, y una de las tecnologías más
importantes en todo el mundo. En los últimos 50 años, el software ha
pasado de ser la solución de un problema especializado y herramienta
de análisis de la información a una industria en sí misma. No obstante,
aún hay problemas para desarrollar software de alta calidad a tiempo y
dentro del presupuesto asignado.
El software —programas, datos e información descriptiva— se dirige a
una gama amplia de tecnología y campos de aplicación. El software
heredado sigue planteando retos especiales a quienes deben darle
mantenimiento.
Los sistemas y aplicaciones basados en web han evolucionado de
simples conjuntos de contenido de información a sistemas sofisticados
que presentan una funcionalidad compleja y contenido en multimedios.
Aunque dichas webapps tienen características y requerimientos únicos,
son software.
La ingeniería de software incluye procesos, métodos y herramientas que
permiten elaborar a tiempo y con calidad sistemas complejos basados
en computadoras. El proceso de software incorpora cinco actividades
estructurales: comunicación, planeación, modelado, construcción y
despliegue que son aplicables a todos los proyectos de software. La
práctica de la ingeniería de software es una actividad para resolver
problemas, que sigue un conjunto de principios fundamentales.
Muchos mitos del software todavía hacen que administradores y
trabajadores se equivoquen, aun cuando ha aumentado nuestro
conocimiento colectivo del software y las tecnologías requeridas para
elaborarlo. Conforme el lector aprenda más sobre ingeniería de software,
comenzará a entender por qué deben rebatirse estos mitos cada vez que
surjan.

BIBLIOGRAFIA

También podría gustarte