viernes, 15 de abril de 2011

Introducción a la ingeniería

La ingeniería es la actividad humana que se ocupa de la aplicación de la tecnología. Personalmente me gusta decir que la ingeniería es "ciencia inversa". Lo cual explicaré más adelante.

La ingeniería se trata de convertir, de diseñar, de crear. El eje central de la ingeniería es aplicar el conocimiento para convertir una situación en otra situación mejor. Por lo tanto la ingeniería se trata de ir desde el punto A hasta el punto B. Donde A es la situación actual y B es una situación futura donde cumplimos nuestros objetivos.

¿Que entendemos por una situación mejor?

Una situación mejor es aquella en la tenemos más comodidad, más calidad de vida, es decir donde debemos tomar menos esfuerzo para satisfacer nuestras necesidades. Por lo tanto la ingeniería le presta mucha atención a los objetivos que tienen que ver con satisfacer necesidades.

Los objetivos siguen un orden jerárquico. El proyecto debe tener un único objetivo raíz. Este suele ser llamado objetivo general. Este a su vez se subdivide en objetivos específicos, los cuales pueden estar asociados a una necesidad o no. Cuando un objetivo especifico esta asociado a una necesidad se subdivide en un tipo de objetivos a los cuales les llamaremos requerimientos.

Al ejecutar un proyecto de ingeniería, es muy importante distinguir que objetivos son requerimientos y cuales no. A partir de esta clasificación inicial se desencadena todo el proceso de la ingeniería.

Una vez tenemos los requerimientos identificados y asociados a una necesidad, debemos conocer tambien a que persona pertenece cada necesidad. Toda persona a la cual se le va a satisfacer una necesidad gracias al proyecto le llamaremos implicado.

Es recomendable considerar que de al mismo tiempo que el proyecto satisface necesidades también crea necesidades nuevas. Por ejemplo si el proyecto crea un producto, también crea la necesidad de dar soporte técnico sobre ese producto, capacitación para poder usar el producto, y posiblemente también se necesite gestión de cambios para crear nuevas versiones del producto. Estas necesidades también pueden incluirse dentro del proyecto de forma que este también pueda satisfacer dichas necesidades.

jueves, 14 de abril de 2011

Tipos de proyecto

La clasificación de proyectos que presento aquí tiene como propósito discriminar los proyectos según su alcance, de forma tal que sea practico y fácil de comprender enfocada a los estudiantes universitarios. No pretendo competir con los estándares, metodologías u organizaciones que tengan algo que decir sobre clasificación de proyectos, sino aportar un punto de vista muy natural que ha sido poco documentado en el pasado.

Tipos de proyecto según su alcance

Para esta clasificación se tendrá en cuanta el tipo de interacción con el entorno, y el propósito de realizar el proyecto. Muchas veces esto no es claro para el estudiante universitario al que se le ha asignado un proyecto, debido a que este estudiante puede sentir que el único propósito del proyecto es complacer a los tutores y docentes.

Sin embargo hay una serie de cosas que podemos decir del propósito de los proyectos:

  • Todos los proyectos permiten aprender algo.
  • Todos los proyectos satisfacen necesidades.
  • Todos los proyectos tienen un resultado, este resultado puede ser tangible o no serlo.

Es apropiado preguntarse por estos elementos cuando se inicia un proyecto: ¿Que puedo aprender de este proyecto?, ¿Cuales necesidades puedo suplir con este proyecto? y ¿Que resultado va a tener este proyecto?. Las respuestas a estas preguntas nos darán los objetivos del proyecto.

La clasificación que presento a continuación se debe realizar con base en la respuesta a la tercera pregunta mencionada anteriormente. Es decir que esta clasificación se debe realizar con base al resultado esperado del proyecto.

  • Proyecto de investigación: El resultado esperado del proyecto es: información y conocimiento. Lo que esperamos obtener es: un conjunto de datos organizados y con un significado para las personas involucradas en el proyecto.
  • Proyecto de desarrollo: El resultado esperado del proyecto es: un diseño. Lo que esperamos obtener es: un mapa, diagrama, estructura, o planos para poder ejecutar una tarea, por ejemplo para construir un activo (un proyecto de implementación).
  • Proyecto de implementación: El resultado esperado del proyecto es: valor. Lo que esperamos obtener es: un recurso, de forma directa o indirecta. Puede ser que el proyecto culmine con la fabricación de un activo, o que permita adquirir o ahorrar un recurso.

    Los siguientes son casos especificos del proyecto de implementación:

    • Proyecto de demostración: El resultado esperado del proyecto es: atención, motivación y reputación. Lo que esperamos obtener es: el interés de una o más personas en los servicios que podemos ofrecer. Es un proyecto de implementación a pequeña escala que permite demostrar las capacidades de quien lo ejecuta.
    • Proyecto de comercialización: El resultado esperado del proyecto es: dinero. Lo que esperamos obtener es: la venta de los servicios que podemos ofrecer. Es un proyecto de implementación de una estrategia de ventas.
    • Proyecto de puesta en marcha: El resultado esperado del proyecto es: equipo. Lo que esperamos obtener es un conjunto de herramientas funcionales y personal capacitado.

Cuando se está produciendo un intangible es común encontrar que el proyecto de implementación incluye el proyecto de diseño. Sin embargo para la mayoría de productos tangibles estos dos proyectos son separados. Esto se debe a la necesidad de crear más de un producto tangible para cubrir su demanda, por lo que los muchos productos tangibles se realizan a partir del resultado del mismo proyecto de diseño.

Esta posibilidad de que los proyectos de pertenecer a más de un tipo puede llevar a pensar que todos los proyectos pertenecen a todos los tipos. En realidad hay que decir que para crear un producto debemos realizar proyectos de todos los tipos: Investigación, Desarrollo, Implementación. Pero eso no significa que siempre sea necesario realizarlos todos.

Como se mencionó antes, muchos proyectos de implementación se realizan a partir del resultado de un unico proyecto de diseño. De forma similar para realizar el diseño es necesaria una investigación previa. Pero puede no ser necesario repetir el proyecto de investigación para obtenerla cada vez.

A su vez un proyecto de investigación puede requerir uno o más proyecto de implementación para crear modelos, herramientas o situaciones experimentales. Eso no significa que sean necesarios cada vez.

Esta confusión es evidente cuando un docente requiere las características de los tres tipos de proyecto en los proyectos que asigna a sus alumnos. Por ejemplo, el docente asigna a los alumnos un un proyecto para realizar la maqueta de un edificio. Esto parece ser un proyecto de implementación solamente. Pero el docente tambien exige utilizar una metodología de investigación, tal como encuesta, entrevista u observación. Ante esta situación el alumno puede no entender porque realizar una encuesta para realizar una maqueta de un edificio. Esta situación es maximizada por las plantillas para proyectos que se encuentran en Internet, las cuales hacen enfasis en los proyectos de investigación.

Niveles de programación

Como mencionaba en el articulo Introducción a la programación, los lenguajes de programación se deben traducir a lenguaje maquina para que el computador pueda interpretarlos y ejecutarlos. Sin embargo existen variantes entre los lenguajes maquina, y estas variantes debían tenerse en cuenta en los primeros lenguajes de programación que fueron desarrollaron. A este conjunto de lenguajes de programación que implican que el programador (la persona que escribe el programa) conozca ciertas características del computador para el cual se escribe el programa. Estos lenguages se llaman de bajo nivel, ya que tienen una equivalencia estricta con el lenguaje maquina.

Por otro lado existen los lenguajes de alto nivel, los cuales nos permiten escribir programas de forma independiente a la maquina en se van a ejecutar. Por ultimo los lenguajes mixtos son aquellos que nos permiten ignorar los detalles como en los lenguajes de alto nivel, pero si queremos podemos tomar el control de estos detalles como en los lenguajes de bajo nivel.

Un ejemplo de un lenguaje de bajo nivel es el lenguaje Ensamblador (Assembler en inglés), un ejemplo de un lenguaje de alto nivel es C#, y por ultimo C++ es un típico lenguaje mixto.

Forma de interpretación

Existen dos formas en las que un computador puede entender un lenguaje de programación:

  1. la primera es mediante una traducción total del lenguaje de programación al lenguaje maquina especifico de la maquina, a esta técnica le llamaremos código nativo. Cuando se utiliza código nativo no hay garantía de que el programa al copiarse a otro computador siga funcionando. Sin embargo conseguimos el mejor desempeño en las maquinas donde funciona.
  2. Luego del código nativo, la siguiente opción es mediante un programa auxiliar que traduce del lenguaje de programación u otro lenguaje intermedio al lenguaje maquina en tiempo real mientras se ejecuta, esto tiene la desventaja de que es más lento que el código nativo. Pero esta tecnica permite transportar al programa a otras plataformas sin mayores complicaciones (se dice que el programa es portable a otras plataformas, o simplemente portable).

    En esta segunda técnica hay dos variantes:

    1. En la primera variante el programa se encuentra en el lenguaje original en que fue escrito y no se verifica si es correcto hasta que debe ejecutarse, a esto se le llama código interpretado, el cual como es evidente es poco seguro, ya que no hay garantía de la integridad del programa (garantía de que no se ha dañado).
    2. La segunda alternativa es traducir el lenguaje de programación a un lenguaje intermedio que es más fácil de traducir a lenguaje de máquina, se trata también de comprobar si el programa es correcto antes de empezar a correr. De esta manera el programa se ejecuta más rápido y más seguro que el código interpretado, ello exigirá el código manejado. El código manejado asegura la integridad del programa, sin embargo es posible que el lenguaje intermedio aun sea de alto nivel y por tanto necesite otra iteración de traducción. Esta segunda traducción suele ser interpretada debido a que la integridad del programa ya ha sido verificada, cuando se realiza esta combinación de técnicas sigue siendo código manejado, pero si dice es compilado "justo a tiempo" (Just In time en inglés).

Ejemplos de lenguajes de programación comúnmente compilados a código nativo son: Assembler y C++, por otro lado Java y C# son código manejado en la mayoría de los casos, un ejemplo de código interpretado (aunque es posible que no lo sea) es JavaScript. Una situación en la cual JavaScript no es interpretado es con la maquina virtual V8 que utiliza Google Chrome, gracias a esta maquina virtual JavaScript se ejecuta como código manejado. Además hay herramientas que permiten compilar lenguajes que comúnmente son manejados a código nativo.

Introducción a la programación

Los computadores son maquinas capaces de realizar muchas tareas, se dice que son multipropósito ya que pueden cumplir las funciones de otras maquinas, por ejemplo una calculadora o una maquina de escribir. Sin embargo cuando las computadores son creadas, son incapaces de realizar una tarea por si solas, necesitan de un programa que seguir para cumplir las tareas.

Los programas de los computadores son como las recetas de cocina, indican una serie de elementos necesarios para realizar el trabajo, seguido de un procedimiento "de preparación o cocción" y luego permiten conseguir el resultado esperado. Sin embargo desde un punto de vista más general, tanto recetas de cocina y programas de computador están basados en algoritmos.

Definición de algoritmo

Para desarrollar una definición intuitiva de algoritmo, se puede decir que un algoritmo es la descripción del proceso necesario para realizar una tarea, por lo cual es posible definir algoritmos para cualquier actividad o incluso para los proyectos que se realizan en las organizaciones. Una definición formal de algoritmo seria como sigue: Un algoritmo es un conjunto finito y ordenado de pasos sin ambigüedad que realizan una tarea en concreto.

Así pues, para lograr que el computador complete una tarea nueva, es necesario darle los algoritmos necesarios para que la computadora pueda realizarla. Ahora, el inconveniente que se presenta es ¿Cómo decirle al computador lo que debe hacer?. En los inicios de la computación era necesario decirle al computador lo que debía hacer cada vez que se necesitaba hacerlo, en la actualidad existe el concepto de programa almacenado, el cual se puede reutilizar tantas veces como sea necesario. De forma que lo que debemos hacer es escribir uno de estos programas almacenados para nuestro computador de forma que este lo pueda entender.

Estos programas almacenados hacen parte de aquello que conocemos como software, de hecho, muchas veces nosotros adquirimos software (descargándolo de Internet por ejemplo) para poder utilizar uno o varios programas almacenados que dicho software contiene. Además de estos programas el software contiene otras cosas como documentos o manuales de usuario.

¿Que entiende el computador?

El computador entiende un lenguaje que llamamos lenguaje maquina, aunque algunos computadores entienden "dialectos" o variantes distintas de lenguaje maquina, hay cierto nivel de coherencia entre el lenguaje maquina de un computador y otro. Ademas tenemos que resaltar que conforme avanza la tecnología el lenguaje maquina de los computases se vuelve más rico y extenso. Sin embargo el lenguaje maquina es un lenguaje codificado de forma que resulta difícil de comprended para los seres humanos, esta limitación hace ineficiente cualquier intento de crear un programa directamente en lenguaje maquina, a excepción - claro está - de programas muy cortos y aquellos escritos por alguien experto en el tema.

Por este motivo, los ingenieros de computadores han desarrollado varios lenguajes que sirven de intermediarios entre los humanos y los computadores, estos lenguajes resultan más fáciles de entender a los humanos, y luego, mediante un traductor especial llamado compilador, traducimos de estos lenguajes (también conocidos como lenguajes de programación) al lenguaje maquina para que el computador pueda entender y realizar las tareas que hemos programado.

Existen muchos lenguajes de programación, algunos han quedado obsoletos, otros se han modificado durante los años que han pasado. Sin embargo los principios sobre los que se basan los lenguajes de programación son los mismos. Uno de los lenguajes de programación más conocidos en el mundo es el lenguaje C++, sin embargo en este blog, nos enfocaremos en el lenguaje de programación C#.