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#.

domingo, 26 de septiembre de 2010

Es la programación similar a un juego?

He oído a gente decir que la programación puede ser divertida. Incluso, he dicho que disfruto programar. ¿Es posible decir que la programación es similar a una experiencia de juego desde la perspectiva de los desarrolladores?

En su naturaleza, la ingeniería es algo que funciona como los juegos, por ejemplo:

  • En ambos hay una meta.
  • En ambos hay una manera de perder, que se supone que deben evitarse.
  • En tanto hay un conjunto de posibles acciones que tiene que hacer en cada momento, y la correcta ejecución de estos conduce a la meta.
  • En tanto hay factores que tal vez al azar.

Pero eso es buscar en un punto de vista académico de los juegos, no hablan de cuánto puede disfrutar de la programación, sólo dice que es posible. La programación puede ser vista como un juego, pero bien podría ser sólo un mal partido.

ES ADICTIVA LA PROGRAMACIÓN?

Piense acerca de cómo los juegos más adictivos (o puede ser que deba decir juegos compulsivos). Aquellos juegos en donde no se trata de divertir, sino que son acerca de hacer volver a la gente, no importa si les gusta hacerlo.

La mecánica de estos juegos es simple: se trata de una ruleta. Funciona de la misma manera que la gente se vuelve adicto a los casinos, porque le dan premios al azar con el potencial de ser lo suficientemente grande como para pagar lo que has perdido. Usted simplemente no puede salir del casino porque el siguiente puede ser un ganador.

¿Odiarías que si dejas una máquina de casino sólo para ver que la siguiente persona que se sienta gana el gran premio? Bueno, es posible que lo odies si eso sucede. Es mejor que quedarse allí hasta que gane. Ese es el núcleo de la adicción.

¿Ejemplo de estos juegos? La industria ha aprendido a hacer esto de una manera muy sutil, que ponen monstruos en el juego, que puede o no matar, pero si los matan, entonces soltaran dinero y algunos artículos al azar. Esos artículos al azar tienen un valor (aunque sean virtuales), ya que tomó la decisión y el esfuerzo para vencer a todo un monstruo para conseguirlo! Si es difícil de conseguir, es algo que vas a apreciar.

¿Tiene la programación esta característica? Bueno, sí y no. No es programa pulsando "botón de espada", "botón de espada", "botón de la espada"... Pero hay algunas partes repetitivas de la programación ... que no se deberían repetir mucho.

Pero se puede luchar contra monstruos, que son opcionales en la mayoría de los casos. Estos monstruos son opcionales, ya que puede así descargar algo ya hecho. Ya sabes, no reinventar la rueda. Estos monstruos son los algoritmos y estructuras de datos. Si decide implementar una estructura de datos de una manera reutilizable entonces la aplicación tiene un valor. Tiene valor porque ha implementado todo un algoritmo! y lo que tiene que pagar tiene valor. Aunque a la programación le hace falta es la parte aleatoria, lo que hace que la programación sea menos adictiva que su contraparte del casino.

INMERSIÓN

Inmersión es una característica clave de los juegos de rol. Eso es convertirse en el jugador una parte de la historia. Esto le da al jugador el poder de cambiar el resultado del juego, y ver y disfrutar de los efectos de forma dinámica.

Para tener la inmersión en un juego, usted querría que el juego reaccione con el jugador. Un juego que se comportan como si estuviera vivo, y también que permite al jugador cambiarlo. Estos entornos hace que el jugador se sienta y sea parte de la narración.

Hay dos tipos de entornos de programación que presentan esta característica:

  • Aquellos con un REPL (Leer - Evaluar - Imprimir Loop), como Python, que tienen un insterface similar a una terminal que te permite ejecutar comandos sobre la marcha. Es como el software fueron creciendo a medida que la escribe.
  • Aquellos que, como Visual Basic, que le permiten construir software gráficamente, que aumentar la parte constructiva de nosotros, y suministros de la necesidad de dejar el legado para las generaciones venideras. Es como crear el software de bloques de construcción.

Permítanme mencionar, que cualquier lenguaje puede ser de ese tipo, porque la magia se hace a nivel del compilador, de hecho, actualmente C # es a la vez de los dos tipos que menciono arriba ... en Mono C # tienen un REPL, y en Visual Studio tiene la forma y los diseñadores de diagrama de clase. (En Mono no es un diseñador de formularios también).

COOPERACIÓN Y COMPETENCIA

La mayoría de juegos tienen uno o el otro, para ser justos, los juegos con ambos suelen ser mejores. Cuando se esta en competencia hay aprender a defendernos a nosotros mismos, mientras que se alcanza una meta, este es uno de los objetivo de jugar en la naturaleza, para enseñar a los jóvenes cómo defenderse. Cuando se esta en cooperación también hay que aprender a sobrevivir, sino de un ambiente duro o alguna otra amenaza que se requiere para trabajar en equipo.

Más allá del nivel de los instintos, la Cooperación y el Compettion nos permiten compartir emociones con nuestros compañeros jugadores, que hacen más fuertes los vínculos con ellos, y crean sinergia. Combinado con Inmersión, esto se convierte en una poderosa herramienta para las relaciones humanas.

En la programación se puede tener tanto la cooperación y competencia. A pesar de cooperación es lo que más se promueve en la industria, la competencia nunca desaparecerá. También la competencia en la programación así como la competencia en los entornos físicos se está convirtiendo en una especie de deporte. Por ejemplo, hay competiciones regulares y sitios de Internet dedicado exclusivamente a esta cuestión. Por ejemplo TopCoder y Google Code Jam.

APRENDIZAJE

Lo creas o no, el aprendizaje es una parte crucial del juego. Pero no en el sentido del salón de clases. Tener cosas para descubrir y explorar nos permite desarrollar nuestras capacidades de investigación, y también dar satisfacción a nuestra interminable curiosidad.

Como se mencionó antes, el proposito de jugar es aprender a hacer las cosas. Es habitual que los niños jueguen con versiones de juguete de las cosas que van a utilizar cuando los adultos, tales como automóviles, por ejemplo. Hay algunos juguetes que los padres dan a sus hijos para moldear su comportamiento (incluso si no saben lo que están haciendo, los nuevos juguetes moldean su comportamiento), por ejemplo, hay juguetes para las niñas, que se asemejan a lo que la sociedad espera de las niñas cuando crecen hacia arriba (como la cocina? ... y la elección de un novio que tenga carro?).

Más allá de las imposiciones, los juguetes tienen el poder de enseñar en dos formas:

  • Constructivo: que permite explorar las interacciones y pruposes de las cosas
  • Desctructive: permite explorar la mecánica interna mediante la adopción de ese juguete de distancia.

La programación también tienen ese componente de aprendizaje, usted puede aprender en una forma construtiva, por ensayo y error. O de una manera desctructive haciendo incisiones en el software de código abierto, sólo para ver qué sucede. O de manera más pasiva, con la simple lectura del código.

REPUTACIÓN

Es difícil encontrar algo más atractivo que el de status. La gente tiene una necesidad de encontrar amigos, pareja y el apoyo de terceros, esto es una garantía para seguir con vida en la antigua selva. Hoy se trata de conseguir más premios, y un carro mejor. El status es también atractivo para conseguir citas, pero eso es harina de otro costal.

El punto es que todo el mundo quiere un cierto nivel de status, y que es el status? status es la visibilidad de los monstruos que has matado, por lo que todo el mundo sabe que eres alguien. Es decir que tienes un nombre.

Construir una reputación en el software suele ser muy difícil, el usuario final no le importa, porque para ellos eres poco más que el nombre detrás de la función. Pero entre los desarrolladores la cosa es un poco más fácil. Pero pensemos en esto ... si quiero reputación debo mostrar lo que he hecho, y eso significa que otros puedan aprender de él, e incluso tomstlo para su beneficio.

Es un decisión difícil para muchos. ¿Quieres compartir tu código fuente?

Si lo haces ... ¿te dará dinero?

Puedo asegurar que te dará fama y que lo disfrutarás. Acerca de dinero que no puede estar tan seguro, pero no le hará daño revelar sólo algunas cosas y mantener otras cerrados del público.

CONCLUTION

La programación no puede tener todos los componentes de un juego, pero tiene las necesarias para permitir que la gente lo disfrute. Todavía faltan algunos aspectos importantes, como puntuaciones. Pero está comprobado que todo es comunidad y la magia entorno de desarrollo. No es sobre el hardware o el idioma que elijas, pero las herramientas y la gente que va a hacer La diferencia entre disfrutar o odiar programación.

domingo, 12 de septiembre de 2010

¿Que hay de malo en Mono?

De acuerdo con un articulo (en inglés) escrito por Richard Matthew Stallman, hay algo peligroso en "depender" en C#.

Puede resultar curioso que Stallman se preocupe por la dependencia en un lenguaje de programación en particular, pues el lenguaje de programación se puede cambiar a otro y obtener el mismo software (incluso idéntico a nivel binario, con algo de ayuda del compilador). Muy a pesar de esto, según dice Stallman en el citado articulo, "El riesgo" es que Microsoft quiera someter las implementaciones de C# bajo una patente.

En mi opinión si algo de esto llegara a ocurrir, el menor de los problemas seria cambiar el lenguaje a otro equivalente. Sin embargo la verdad es que esto no va a llegar a ocurrir.

¿por que Microsoft no patentará C#?

Si hacemos algo de memoria, recordaremos que .NET es un estándar, sin embargo, algo menos sabido es que C# esta registrado ante ISO, tal como una pequeña busqueda en Internet lo puede demostrar.

Microsoft no puede hacer esa patente porque:

  1. Microsoft ha registrado C# ante ISO.
  2. Ya existen implementaciones de terceros.
  3. Pueden demandar a Microsoft por monopolio.
  4. A Microsoft le conviene que existan otras implementaciones de C#, para atraer desarrolladores a Visual Studio.

Tal vez lo que le preocupa a Stallman es que no digan "estándar libre" sino "estándar abierto". Pero Stallman como la comunidad de software libre deben entender que no hay tal cosa como un "estándar libre" porque si todos tienen derecho a modificar y adaptar el estándar a su gusto entonces ya no es estándar. En el mejor de los casos podemos decir que es una recomendación técnica, una sugerencia o una guía.

Puede ser que lo que molesta a Stallman sea que Debian este utilizando Mono, que Mono sea de Novell y que nadie utilice DotGNU. Mono no esta en contra de la política y filosofía GNU, y Stallman lo sabe.

domingo, 15 de agosto de 2010

.NET como estándar

.NET framework es un estándar abierto desarrollado por Microsoft, su implementación consta de un conjunto de librerías que contienen funciones  para realizar tareas comunes, de forma que los programadores no tengamos que volver a escribir las partes repetitivas del programa. Además de esto, .NET define una forma estándar para la comunicación entre programas y dos lenguajes de programación llamados IL y C#.

Entre las implementaciónes de .NET encontramos Dot/GNU del proyecto GNU, Mono Framework de Novell (Dueños de la distribución SUSE de Linux) y .NET Framework de Microsoft. Las tres comparten la misma estructura básica, librerías equivalentes y los mismos lenguajes. De forma que la mayoría de programas que escribamos para una de estas implementaciónes .NET funcionará en las demás.

A pesar de ser un estándar abierto registrado ante ECMA e ISO, existen diferencias en las implementaciónes principalmente porque Microsoft lleva el liderazgo en desarrollo y las implementaciónes Mono y Dot/GNU se encuentran rezagadas. Por otra parte por que la implementación de Microsoft solo funciona en sistemas Windows, mientras que Dot/GNU se enfoca en sistemas derivados de UNIX y Mono pretende funcionar en múltiples plataformas.

Cabe resaltar la similitud a nivel de arquitectura que tiene .NET con Java de Sun Mycrosistems, con la diferencia que esta ultima no es un estándar abierto. Ademas hay que anotar que Microsoft y Mono han desarrollado una herramienta para aplicaciones interactivas, la cual compite con Flash de Adobe. Esta herramienta se conoce como SilverLight desde el mundo Microsoft y MoonLight en Mono.

Por ultimo, .NET es la base de la plataforma de desarrollo Web ASP.NET, competencia directa de PHP y JSP. Así mismo .NET es el marco de trabajo para sistemas XBOX y XBOX 360 de Microsoft.