Share via


Detalles sobre el desarrollo

El desarrollo de software implica la tarea clave de convertir la visión de un arquitecto de software en código de aplicación utilizable que genere el resultado requerido, funcione en las condiciones predefinidas, sea sólido y seguro, se ejecute dentro de los parámetros especificados, y logre todo esto con eficiencia óptima y uso de los recursos disponibles. Puede que parezca una tarea de enormes proporciones, pero las modernas técnicas de diseño de software, las herramientas, los entornos de desarrollo y las metodologías permiten a los equipos que crean software enfocar la tarea de una manera lógica y ordenada con el fin de maximizar la tasa de éxito y minimizar el esfuerzo en vano.

Las habilidades en el desarrollo

Aunque un diseño inicial deficiente por lo general no se traducirá en un buen software, existen muchas herramientas y técnicas disponibles para arquitectos, diseñadores y desarrolladores que pueden aumentar considerablemente la posibilidad de un diseño exitoso que produzca un excelente software. Los desarrolladores deben seguir las especificaciones de diseño, pero parte de la habilidad del trabajo consiste en poder visualizar cómo interactúan los sistemas y componentes de trabajo, comprender las limitaciones aplicadas por el hardware y la infraestructura sobre la cual se ejecutarán las aplicaciones, y realizar evaluaciones razonables sobre los intercambios que se requieren.  

Esto significa que no basta con simplemente saber usar un lenguaje de programación como C# o Visual Basic. Los modernos marcos y lenguajes de programación proporcionan interfaces virtualizadas que ocultan una gran parte de la complejidad subyacente del hardware en tiempo de ejecución. Sin embargo, los desarrolladores deben seguir entendiendo cómo se ejecuta el código, cómo distintas instrucciones de programación pueden interactuar con la infraestructura subyacente y cómo implementar comunicación entre componentes que deben trabajar entre sí, a menudo cuando se ubican remotamente y se accede a ellos a través de una red como Internet.

El buen diseño de software intenta maximizar una gama de factores importantes como seguridad, facilidad de uso, capacidad de prueba, mantenimiento, rendimiento y mucho más. Los desarrolladores deben comprender de qué manera sus implementaciones del diseño pueden producir un impacto sobre estos factores y estar preparados para trabajar con el arquitecto o diseñador de software cuando se trate de lograr los intercambios adecuados para cada uno de esos factores.

Lenguajes de programación

Existe una amplia gama de lenguajes para elegir al escribir software. Algunos son específicos de tipos especiales de aplicaciones, mientras que otros se usan en la mayoría de los tipos de aplicaciones. Al trabajar por cuenta propia, es posible que utilice con frecuencia el lenguaje con el que está más familiarizado para una serie de tipos de aplicaciones. Al trabajar en equipo, normalmente son los administradores de proyectos quienes especifican la elección de lenguaje.

No obstante, algunas aplicaciones pueden requerir el uso de más de un solo lenguaje o tecnología de programación. Un ejemplo de esto es el desarrollo web, donde el código que se ejecuta en el servidor web para crear las páginas puede emplear formularios web de ASP.NET o páginas web de WebMatrix, las páginas mismas pueden contener código JavaScript que se ejecuta en el explorador del usuario para proporcionar interactividad, y el código back-end que interactúa con la base de datos se puede escribir en un lenguaje de .NET Framework como C# o Visual Basic.

Esto significa que con frecuencia deberá tener dominio de varios lenguajes, lo cual por lo general no es difícil, ya que la mayoría de los lenguajes utilizan un enfoque similar para definir instrucciones de código fuente y varían principalmente en su sintaxis; aunque cada lenguaje tendrá matices específicos con los cuales debe familiarizarse. Sin embargo, habitualmente una vez que se comprenden los aspectos básicos de programación y se aprende un lenguaje, se vuelve mucho más fácil aprender otros.

La gran mayoría de las aplicaciones se escriben hoy mediante lenguajes de programación orientados a objetos y activados por eventos. Estos tipos de lenguajes de programación usan instrucciones de código y constructos como bucles y declaraciones de decisiones para ejecutar una serie de tareas. Contienen procedimientos y funciones que se llaman desde el código principal, a menudo de forma repetida desde muchos lugares del código. Se definen objetos dentro del código para representar elementos del mundo real, como clientes, pedidos y cuentas que el código debe manipular.

Estos objetos tienen propiedades que exponen los datos que contienen y métodos que se pueden ejecutar para manipular los datos. Los objetos generan eventos cuando se produce alguna acción, y el código maneja esos eventos según lo requerido. Algunos lenguajes de programación comunes orientados a objetos y activados por eventos que se usan en la plataforma de Microsoft son C#, Visual Basic, C++, F# y JavaScript.

Marcos, bibliotecas de código y patrones

Uno de los factores clave en la simplificación de la tarea de desarrollar las aplicaciones cada vez más complejas que se requieren hoy, es el uso de marcos, bibliotecas de código y patrones. A la mayoría de los desarrolladores no les gusta volver a escribir el mismo código una y otra vez (es repetitivo y desperdicia tiempo y esfuerzo) y prefieren concentrarse en las partes del proceso de desarrollo que son directamente relevantes para los requisitos de la aplicación que están creando. Una manera de hacer esto, que puede minimizar el tiempo, costo y esfuerzo requeridos, consiste en reutilizar el código existente que realiza tareas predefinidas específicas.

El código reutilizable se encuentra en muchas formas. Los equipos de desarrollo suelen crear bibliotecas de funciones y procedimientos que utilizan en más de un componente y en más de una aplicación. Algunos ejemplos comunes son las características para implementar registro, manejar excepciones, almacenar datos en caché y obtener acceso a bases de datos. También es posible obtener o adquirir marcos y bibliotecas de código que realicen estas y una amplia gama de otras tareas. La reutilización de código que ya se probó y que se ha comprobado que funciona de manera confiable puede reducir considerablemente el esfuerzo necesario al crear software; la habilidad del desarrollador consiste en saber qué marcos son adecuados y cuándo y cómo aplicarlos correctamente.

Cuando no hay disponible un marco o biblioteca reutilizable o generado previamente, el equipo de desarrollo debe escribir el código requerido. También deben escribir el código de “pegado” que vincula los componentes y solicita las funciones de los marcos y bibliotecas de código. Aquí es donde se requiere un conocimiento profundo de los lenguajes de programación. Sin embargo, existe otra manera de poder sacar provecho del trabajo de los demás, incluso cuando no hay disponible un código físico. Esta es la aplicación de patrones de software.

El concepto de patrones se diseñó para formalizar el conocimiento y experiencia obtenidos con el transcurso del tiempo al resolver problemas comunes en el desarrollo de software. Los escenarios que requieren una solución de código a menudo han sido abordados muchas veces por otros, por lo que una solución óptima evolucionó según las revisiones y experiencia de expertos en el área. Estos escenarios se documentan como patrones de diseño de software e incluyen definiciones genéricas de la solución que no son específicas de ningún lenguaje de código. No obstante, ofrecen técnicas comprobadas para resolver el problema, y la tarea del desarrollador entonces es conocer los patrones relevantes y escribir código específico de su aplicación pero según la solución genérica descrita por el patrón. Esto puede ayudar a minimizar los errores y a evitar las equivocaciones comunes que se encuentran en cada escenario.

Técnicas y metodologías de programación

Incluso los que tienen mucha experiencia pueden cometer errores al escribir código. Las aplicaciones complejas contienen muchas variables, y un código que parece estar correcto puede ejecutarse de una forma inesperada bajo ciertas condiciones que no eran evidentes al escribir el código. Con el transcurso del tiempo, las técnicas y metodologías que ayudan a minimizar los errores han evolucionado y se han formalizado. Debería estar familiarizado con estas técnicas y metodologías, incluso al trabajar solo y no como parte de un equipo.

Una de las principales metodologías que se usa actualmente es Test Driven Design (TDD). Esta metodología tiene como objetivo lograr que el desarrollador piense en los requisitos del código y formule los resultados requeridos antes de escribir el código real. El proceso implica la creación de una serie de pruebas unitarias, cada una de las cuales ejercerá una función específica del diseño para la sección de código que se crea. Por ejemplo, si el código aplicará un depósito a la cuenta de un cliente, la prueba toma el monto del depósito y el saldo actual de la cuenta, los pasa a la función del código que se crea y luego afirma que el resultado es correcto al seleccionar el saldo de la cuenta.

Primero se escriben las pruebas unitarias y después se crea el código que implementará las funciones requeridas en la aplicación. Luego se puede verificar este código usando un marco de prueba (o agente de prueba) para ejecutar todas las pruebas unitarias y mostrar los resultados de todas las aserciones. A medida que escribe el código y lo modifica y mejora continuamente, las pruebas se pueden volver a ejecutar para garantizar que los resultados sigan siendo válidos.

Desde luego, las pruebas unitarias no pueden operar en los datos reales y es posible que no tengan acceso a otras partes de la aplicación que aún están en construcción. En lugar de eso, el desarrollador crea componentes simulados que representan lo verdadero, pero que se ejecutan localmente en la máquina de desarrollo. Con esto se garantiza que las pruebas ponen en práctica sólo el código que se crea y que los resultados no se ven afectados por otros factores externos.

TDD suele combinarse con otras metodologías de programación. Por ejemplo, generalmente se usa Pair Programming para validar códigos y minimizar errores. Dos desarrolladores trabajan junto a un equipo, sentándose frente a él por turnos para escribir código y ejecutar las pruebas unitarias. Los desarrolladores trabajan en conjunto compartiendo y combinando experiencia y conocimiento, y criticando el código que está escribiendo el otro desarrollador. El aporte y la competencia adicionales entre los desarrolladores puede dar como resultado un mejor código.

Pruebas, almacenamiento provisional e implementación

El código creado durante el desarrollo suele ser sólo una sección de la aplicación o sistema en general y debe estar integrado con la aplicación o sistema completo en intervalos regulares para garantizar que no haya problemas de interacción entre cada componente o cada sección de código. Un enfoque típico consiste en comprobar el código en intervalos regulares, en ese preciso momento se inicia una compilación completa de la aplicación o sistema. Esto revelará cualquier conflicto durante la compilación y las pruebas, los cuales deben resolverse antes de la siguiente compilación integrada.

Una vez que la aplicación completa se compila y pasa el ciclo de pruebas, puede trasladarse a un servidor o equipo de almacenamiento provisional para realizar las pruebas finales de aceptación. A diferencia del equipo de desarrollo y de los servidores de compilación, el servidor de almacenamiento provisional es una réplica del entorno en tiempo de ejecución final, lo cual permite que el software sea probado en las condiciones que encontrará al estar en producción. Una vez más, el equipo de desarrollo debe resolver cualquier problema que surja durante el ciclo de pruebas de aceptación por etapas.

Por lo general, las aplicaciones requerirán algún tipo de programa de instalación o configuración que les permita ser implementadas tanto en el sistema de almacenamiento provisional como en el sistema de producción final. El equipo de desarrollo debe crear los programas de configuración necesarios que instalen los componentes de la aplicación, los configuren junto con el entorno en tiempo de ejecución y preparen el sistema como se requiere. Esto suele ser un problema complejo, en especial para el software de paquete que se puede instalar en diversas plataformas de tiempo de ejecución con una amplia gama de hardware subyacente que presentan otras aplicaciones.

Trabajar en un equipo de proyecto

Trabajar en un equipo de proyecto puede ser muy gratificante, pero exige habilidades adicionales para obtener los mejores resultados. Al trabajar en un equipo, los desarrolladores deben ser capaces de comunicarse e interactuar bien con diversas personas. Esto incluye administración, arquitectos y diseñadores, equipos de prueba, equipos de documentación y muchos otros.

Diferentes estilos de administración de proyectos exigen que los desarrolladores apliquen distintas capacidades. Algunos proyectos se ejecutan en líneas tradicionales de “cascada”, donde cada tarea se compartimenta y completa antes de que se inicie la siguiente tarea. Cada vez más, sin embargo, los proyectos se ejecutan sobre una base más interactiva. Esto ha demostrado ofrecer ventajas en muchos escenarios de desarrollo de aplicaciones.

Por ejemplo, un proyecto puede funcionar mediante la metodología Agile, donde se usan iteraciones breves de desarrollo, reuniones diarias con el equipo y reuniones semanales de planificación de revisión e iteración para mantener el proyecto según lo planeado. El desarrollo ágil enfatiza el aporte de los clientes y de otras partes interesadas externas a través de versiones regulares del software durante el desarrollo y la retroalimentación continua. Normalmente se usa un repositorio que contiene elementos de trabajo para llevar un registro del proyecto, pero no hay un diseño importante por adelantado distinto al exigido para que el proyecto se realice según lo planeado.       

Otro enfoque común es Extreme Programming (XP), en el cual el desarrollo de software se lleva a cabo mediante la implementación de los requisitos más importantes primero, la comunicación y las pruebas continuas, y la entrega regular del software durante el desarrollo. Tanto Agile como XP enfatizan la creación de software de trabajo por sobre el diseño por adelantado y se centran en lograr resultados que coincidan con las expectativas en lugar de desarrollar características innecesarias. Esto significa que los miembros del equipo deben ser productivos y trabajar de manera eficiente, administrada y controlada para completar las tareas semanales, además de comunicarse bien con todas las otras partes involucradas en el proceso.

La comunicación interpersonal es clave en los equipos modernos de desarrollo de software, y es más sencilla y generalmente más productiva cuando el equipo trabaja conjuntamente en el mismo edificio, incluso en la misma sala de reuniones. Sin embargo, se ha demostrado que los equipos separados geográficamente trabajan bien siempre y cuando los individuos manejen bien la comunicación con otros miembros del equipo. Las reuniones se celebran mediante un software para teléfono y videoconferencia, el repositorio de información está disponible a través de Internet y los miembros del equipo siguen estrictas programaciones de reuniones diarias y semanales. Esto exige que los individuos se ajusten a las restricciones de zona horaria e interactúen de manera eficaz con miembros del equipo de distintas nacionalidades, además de usar los sistemas de comunicación de una forma que facilite la contribución total de todos los miembros del equipo.

Aprendizaje y experiencia

Existen pocas industrias donde las tecnologías, prácticas y entornos de trabajo cambien tan rápido como lo hacen en el mundo de la TI. Los proyectos importantes de construcción e ingeniería mecánica suelen ejecutarse durante años, mientras que aplicaciones de software incluso muy grandes pueden tener una duración total entre diseño, desarrollo e implementación que abarque menos de un año y, a menudo, considerablemente menos tiempo. Al mismo tiempo, las herramientas, los marcos, la infraestructura y las tecnologías disponibles cambian muy rápidamente, a veces en el mismo año.

Esto significa que el desarrollador debe estar preparado para dedicar tiempo a mantenerse al día con los cambios mediante el conocimiento de nuevas técnicas, lenguajes de programación y otros avances tecnológicos. También significa comprender las tendencias en el cambiante mundo de la TI, considerar cómo éstas afectarán el software que se desarrolla actualmente y poder adaptar las propias habilidades de programación para maximizar el uso de estas nuevas capacidades.

De todas las habilidades del desarrollador, la que tiene más impacto sobre el éxito es la experiencia y esta sólo se puede obtener con el tiempo. Trabajar como parte de un equipo, interactuar con otros desarrolladores y mantener sus habilidades actualizadas son requisitos fundamentales. La combinación de esto con un toque de razonamiento lógico, habilidad creativa y pasión por la perfección constituyen el conjunto ideal de habilidades para un desarrollador de software.