Iniciando en C++: Nuestro Primer Proyecto

Quiero dejar claro algo, aun no estamos aprendiendo C++ propiamente dicho, inclusive pudiese decirse que estamos haciendo un preámbulo para conocer mejor el entorno que utilizaremos para realizar los ejercicios de codificación. Es por esto que quisiera pedirte que en este post no prestes tanta atención al código que utilizaremos, sino que mas bien te enfoques en entender el proceso que utilizamos para generar el proyecto.

Dicho esto arranquemos.

Localización de Proyectos

Como primer punto aclaremos donde vamos a crear nuestros proyectos. Asumiendo que estas utilizando Microsoft Visual Studio como IDE de desarrollo, y que seguiste los pasos de instalación de nuestro post anterior, puedes ver que la instalación ha creado un directorio dentro de “Documentos” llamado “Visual Studio 2013” (los usuarios de otras versiones de Visual Studio encontraran directorios con un nombre similar). Dentro del mismo encontraremos el directorio “Projects“, es allí donde el IDE colocara nuestros proyectos por defecto.

Directorio Visual Studio 2013

Directorio Visual Studio 2013

Nuestro Primer Proyecto

Siguiendo la superstición del mundo de la informática que dice

  • Si quieres triunfar en un lenguaje de programación, debes arrancar aprendiendo a hacer un Hola Mundo (Hello World)

Nuestro primer proyecto consistirá en hacer este sencillo ejercicio, pero mas que utilizarlo para conocer el lenguaje en cuestión, lo aprovecharemos para familiarizarnos con el IDE.

Así que arranquemos

  • En Visual Studio, seleccionamos el menu “FILE” y en el submenu “New” escogeremos la opción “Project“. De ahora en adelante para referirnos a este tipo de relacion de menus usaremos el simbolo “>“, es decir: FILE>New>Project
File>New>Project

File>New>Project

  • Esto nos mostrara un cuadro de dialogo, donde podemos seleccionar que tipo de proyecto vamos a crear. Para este caso escogeremos la categoria Visual C++ y crearemos un Empty Project (Proyecto Vacio). Hay algunos puntos que debemos aclarar aquí:
    • Visual Studio nos pide indicar el nombre de nuestro proyecto para poder identificarlo. Escribiremos “HolaMundo” como nombre de nuestro proyecto.
    • Es aqui donde indicamos el directorio donde queremos que resida nuestro proyecto, por defecto sera una carpeta con el nombre del proyecto en el directorio que ya especificamos.
    • Si marcamos la opcion “Create Directory For Solution“, el IDE nos permitiría crear una solución (agrupación de proyectos). Esto resultaría en una estructura de directorios un poco diferente (“Projects\Directorio con Nombre de la Solución\Directorio con Nombre del Proyecto“); por lo que desmarcaremos esta opción tal como se ve en la imagen.
Proyecto Vacio

Proyecto Vacio

  • Esto generara un proyecto sin ningún archivo o dependencia en el cual podemos codificar lo que queramos a nuestro gusto (es una exageración pero por ahora es una buena explicación).
Proyecto recién creado

Proyecto recién creado

  • Ahora procederemos a agregar un archivo fuente a nuestro proyecto; hagamos click derecho sobre el nombre del proyecto para ver el menú contextual y seleccionamos Add>New Item.
Add>New Item

Add>New Item

  • Esto mostrara el cuadro de dialogo para agregar archivos a nuestro proyecto; existen dos tipos de archivos que podemos agregar al mismo:
    • Archivos de codigo fuente .cpp, es esta la opción que escogeremos.
    • Archivos de cabecera .h, que por ahora no utilizaremos pero vale la pena tenerlos presentes
  • Llamaremos a nuestro archivo Main.cpp, este es un buen recordatorio que este es el archivo principal de nuestro programa (primera practica de Programación Limpia: todas las cosas deben identificarse fácilmente por su nombre).
Agregando un archivo

Agregando un archivo

  • Una vez se haya creado este archivo procederemos a agregar el siguiente código dentro del mismo
    • En esta oportunidad no voy a explicar nada del código, y te recomiendo que no le prestes mucha atención tampoco; por esta vez, simplemente limítate a incluir este código tal cual aquí se presenta, respetando mayúsculas, minúsculas y símbolos.

#include <stdio.h>
void main()
{
printf("Hello World");
}

  • Una vez hayamos añadido el código al archivo, procedamos a compilarlo utilizando el menú BUILD>Compile.
BUILD>Compile

BUILD>Compile

  • Con esto generamos los archivos de objeto de nuestro programa y generamos el primer paso para la ejecución correcta de nuestro programa. En caso de encontrar un error con el código fuente, normalmente en este paso lo detectaremos.
  • Si revisamos la carpeta de nuestro proyecto veremos lo que se conoce como una carpeta de objetivo, es allí donde encontraremos los archivos correspondientes a la compilación de nuestro proyecto.
    • El objetivo por defecto de nuestro proyecto debería ser Debug, por lo que es con este nombre que encontraremos el directorio.
    • Mas adelante explicaremos las diferencias entre los diferentes objetivos de Visual Studio.
Carpeta DEBUG luego de compilar

Carpeta Debug luego de compilar

  • Luego que la compilación este lista procedemos a construir (build) el proyecto utilizando el menú BUILD>Build Solution, esto realiza el proceso de vinculación y genera el archivo ejecutable. Los errores de vinculación (linker) se detectan en este paso.
BUILD>Build Solution

BUILD>Build Solution

  • Ya podemos ejecutar el proyecto utilizando el menú DEBUG>Start Debugging.
DEBUG>Start Debugging

DEBUG>Start Debugging

  • El proceso de ejecución del proyecto debería ser tan rápido que solo deberíamos ser capaces de ver la ventana de CMD abrir y cerrar
Ejecución Inicio

Ejecución Inicio

Ejecución Fin

Ejecución Fin

  • Si volvemos a ver el directorio “Debug“, podemos ver que ahora hay mas archivos, incluyendo el archivo HolaMundo.exe que se genero al hacer la build (de ahora en adelante nos referiremos al proceso de construcción de un proyecto como “hacer la build“)
Carpeta Debug post build

Carpeta Debug post build

Correr nuestro proyecto con un script BAT

Existe un truco que podemos utilizar para visualizar de mejor manera la ejecución nuestro archivo ejecutable, y esto es utilizando un archivo de script BAT

NOTA: Si no conoces la estructura de los BATs, es un buen tema para investigar.

  • Procedamos a crear un archivo de texto en la carpeta “Debug
Crear archivo de Texto

Crear archivo de Texto

  • A este archivo lo llamaremos “HolaMundo.bat“, aunque realmente no importa mucho el nombre siempre y cuando la extensión del mismo sea .bat.
HolaMundo.bat

HolaMundo.bat

  • Agreguemos a este archivo el siguiente código utilizando bloc de notas o cualquier editor de texto (que no sea Microsoft Word).

@ECHO OFF
HolaMundo.exe
pause

  • Al hacer doble click y ejecutar el archivo BAT veremos el resultado de la ejecución de nuestro programa mas el mensaje estándar del comando pause “Presione una tecla para continuar…“.
    •  Este comando pone a la consola en espera de que presionemos una tecla antes de cerrar la ejecución de consola, es decir, hace una pausa como su nombre lo indica.
Ejecución script BAT

Ejecución script BAT

Este truco es bastante útil cuando queremos ver la ejecución programas de consola puntuales o hacer una prueba rápida de alguna función o librería.


Con esto culminamos este post, en la siguiente parte del tutorial, empezaremos a estudiar la sintaxis de C++. Espero haya sido de tu agrado.

Hasta la próxima.

Publicado en C++ | Etiquetado , , | Deja un comentario

Iniciando en C++: Instalando Microsoft Visual Studio Community Edition

El día de hoy vamos a realizar una instalación del IDE Microsoft Visual Studio Community Edition 2013; en el post anterior he mencionado brevemente el porque de este IDE en particular para nuestro tutorial, pero para repasar rápidamente, hablemos un poco de sus bondades.

  • Es el entorno oficial de Microsoft para el desarrollo en su plataforma Windows, es decir, hay un amplio soporte en esta plataforma.
  • Es un entorno versátil con soporte no solo a C++ sino tambien a C#, F#, Asp.NET entre otros lenguajes y plataformas.
  • El compilador C++ sigue muy de cerca el Estándar C++
  • De los diferentes IDEs que podemos utilizar es uno de los mas sencillos de instalar y arrancar a programar sin necesidad de configurar mayor cosa.

Requisitos Previos

Primero que nada debemos tener un sistema operativo Microsoft, ya sea como sistema operativo principal o virtualizado. La lista oficial de sistemas operativos soportados es la siguiente.

  • Windows 8,1 (x86 y x64)
  • Windows 8 (x86 y x64)
  • Windows 7 SP1 (x86 y x64)
  • Windows Server 2012 R2 (x64)
  • Windows Server 2012 (x64)
  • Windows Server 2008 R2 SP1 (x64)

Requisitos adicionales Esta versión de Visual Studio funciona mejor con Internet Explorer 10 o posterior. Si Internet Explorer 10 no está instalado en su equipo, es posible que algunas características no funcionen como se espera. Igualmente, nuestro hardware debe cumplir con los siguiente requerimientos mínimos:

  • Procesador de 1,6 GHz o superior.
  • 1 GB de RAM (1,5 GB si se ejecuta en una máquina virtual).
  • 20 GB de espacio disponible en disco duro (aunque el instalador solo menciona 7 GB).
  • Disco duro de 5400 RPM.
  • Tarjeta de vídeo compatible con DirectX 9 que funcione con una resolución de pantalla de 1024 x 768 o superior.

Para el desarrollo de aplicaciones que corran en Windows Phone:

  • El desarrollo en Windows Phone 8.0 requiere Windows 8.1 (x64) o superior
  • El desarrollo en Windows Phone 8.1 requiere Windows 8.1 (x86) o superior
  • Para los emuladores de Windows Phone, Windows 8.1 (x64) edición Professional o superior, y un procesador que sea compatible con Client Hyper-V y con traducción de direcciones de segundo nivel (SLAT)
  • Si el equipo cumple con los requisitos del sistema operativo, pero no cumple con los requisitos de hardware para los emuladores de Windows Phone, las herramientas de desarrollo de Windows Phone se instalarán y se ejecutarán. Sin embargo, los emuladores de Windows Phone 8.0 y 8.1 no funcionarán y deberá usar un dispositivo para implementar o probar las aplicaciones de Windows Phone.

Por ultimo pero no menos importante, debemos contar con una excelente conexión a Internet, ya que el instalador funciona en linea, descargando los archivos que requiera conforme vaya pasando el proceso.

Instalación de Microsoft Visual Studio Community Edition

  • Primero que nada, accedamos a este enlace para proceder con la descarga del instalador.
Sitio de descarga MS Visual Studio CE

Sitio de descarga MS Visual Studio CE

  • Una vez hayamos descargado el instalador podemos conseguirlo con el nombre de vs_community.exe

instalador

  • Al ejecutar el instalador nos proveerá con una pantalla en la cual debemos aceptar el acuerdo de licencia proporcionado por Microsoft; asi mismo, podemos escoger el directorio de instalación del IDE. En mi caso he aceptado y escogido el sitio de instalación por defecto (C:\Archivo de Programas\Microsoft Visual Studio 12.0) pero utilizando el botón con los puntos suspensivos() puedes cambiar el directorio por cualquiera que sea de tu elección.
Acuerdo de Licencia y Directorio de Instalación

Acuerdo de Licencia y Directorio de Instalación

Nota: Si manejamos diversas unidades de disco y decidimos instalar en una unidad secundaria; Visual Studio igualmente almacenara información en la unidad principal dentro del directorio Windows (necesita alrededor de 5 GB)

  • En la siguiente pantalla, hay una cantidad de componentes opcionales que podemos instalar, particularmente es de mi preferencia instalar Visual Studio con todos sus componentes, aunque si la conexión y el tiempo en Internet es un problema podemos quitar Blend de la selección de componentes adicionales.
Componentes adicionales del Visual Studio

Componentes adicionales del Visual Studio

  • Una vez que presionemos el botón Install el instalador comenzara el proceso de descarga e instalación de los archivos necesarios; la velocidad de este proceso dependerá de la calidad de tu conexión a Internet. Deberiamos ver el progreso de la siguiente manera

instalacion1 instalacion2 instalacion3

  • Al completarse el proceso de instalación el sistema solicitara reiniciarse para completar el registro de todos los componentes en el sistema operativo.
Pantalla final del instalador

Pantalla final del instalador

Primera Ejecución de Visual Studio

Con esto completamos el proceso de instalación del IDE, pero aun no hemos terminado, veamos un poco lo que ocurre la primera vez que ejecutamos Visual Studio.

  • Primero, ubiquemos el acceso directo a Visual Studio en nuestro menú de inicio; si estas utilizando Windows 7, lo podras conseguir en la siguiente ubicación

accesodirecto

  • Al iniciar el IDE, tenemos la opción de registrar nuestra instalación haciendo uso de una cuenta Microsoft, para mantener actualizadas las diferentes maquinas en las que utilicemos Visual Studio con los mismos plugins u opciones de preferencias. Particularmente, esta opción me parece muy util y no se toma mucho esfuerzo por lo que recomiendo hacer el registro.
Uso de cuenta Visual Studio

Uso de cuenta Visual Studio

  • Si escogemos la opción de Sign In, Visual Studio nos pide autenticarnos con la cuenta de nuestra preferencia. Cualquier cuenta Hotmail, MSN u Outlook puede utilizarse para esto.
Entrada con cuenta Microsoft

Entrada con cuenta Microsoft

  • Al autenticarnos, Visual Studio nos invita a hospedar nuestros proyectos en su sitio web; personalmente no he utilizado esta opción por lo que no puedo dar mayor comentarios al respecto, excepto que escojamos la opción “De momento no, quizas mas tarde
Hospedaje de Proyectos Online

Hospedaje de Proyectos Online

  • Ya con esto debemos ver el Visual Studio 2013 en ejecución y listo para utilizarse.
Visual Studio 2013 en ejecución

Visual Studio 2013 en ejecución


Con esto concluimos la instalación de Visual Studio Community Edition; en la siguiente parte del tutorial, crearemos nuestro primer programa en C++ y veremos la estructura de proyectos que se utiliza en Visual Studio.

Hasta la proxima

Publicado en C++ | Etiquetado , | Deja un comentario

Iniciando en C++: Historia del Lenguaje

Antes de continuar con los aspectos técnicos de nuestro tutorial quiero hacer un paréntesis para hablar sobre la historia de C++.

En mi opinión, es un punto interesante entender como la implementación actual de C, en su forma de C++ 14, viene de una evolución constante y que ha servido como un reflejo de la historia de las tecnologías de la información; si bien, C no fue creado hasta 1971, puede seguir sus orígenes a años y lenguajes anteriores.

Es mucho lo que pudiese escribir al respecto, pero creo que seria redundar sobre un excelente post que he conseguido en un compañero blogger y entusiasta de C++, por lo que en lugar de repetir practicamente todo lo que el ya ha explicado les dejo un enlace a su articulo:

Igualmente les recomiendo visitar el blog http://vitaminacpp.wordpress.com aunque quizás el contenido que allí consigan sea un poco mas adelantado que lo que aquí planteamos, sirve para ilustrar el punto que ya les había mencionado: C++ tiene una gran comunidad de desarrollo a nivel mundial.

Espero que la lectura sea de su agrado.

Hasta la próxima.

Publicado en C++ | Etiquetado , , , , , | Deja un comentario

Principios del Desarrollo Guiado por Pruebas

Antes de comenzar quiero decir que los fines de semana intentare hablar sobre tópicos que pueden resultar un poco mas avanzados que lo que se esta mostrando en los tutoriales que se publicaran entre semana ( esto es hasta que los tutoriales sean de nivel avanzado). Pero quiero dejar este espacio como un lugar en el que puedo ventilar un poco el material que he ido investigando y tener una charla de tu a tu contigo mi querido lector.

Ya que he aclarado esto vamos a hablar sobre TDD.

Tengo algo que confesar, soy un converso tardío al mundo del Desarrollo Guiado por Pruebas (Test Driven Development o TDD) pero debo decir que se ha convertido en uno de mis principales puntos de interés en el desarrollo técnico de mi carrera como programador y es uno de los puntos primordiales al desarrollarnos como profesionales del desarrollo de software.

Parafraseo a Robert C. Martin (el Tio Bob) en sus charlas sobre Clean Code y Clean Architecture cuando dijo que “la diferencia entre programadores e ingenieros de software es el profesionalismo … y es imposible hablar de profesionalismo sin pruebas automatizadas“.

Qué es el Desarrollo Guiado por Pruebas?

Primero que nada, algunos de ustedes se preguntaran que es este TDD del que estoy hablando (o del que he estado twitteando en los últimos meses), pues bien el proceso del Desarrollo Guiado por Pruebas consiste en entender que en todo proyecto de desarrollo de software profesional deben existir dos tipos de código a desarrollar:

  • Código de Producción. Es el código que estamos acostumbrados a desarrollar, es aquí donde implementamos la funcionalidad del programa, clase o método que se nos este solicitando.
  • Código de Prueba. Es donde desarrollamos las pruebas automatizadas del sistema; este es un principio que puede ser nuevo para algunos programadores que están acostumbrados a realizar pruebas manuales o dejar las pruebas automatizadas en manos de los Testers. Existen tres tipos de pruebas primordiales que se desarrollan en un proyecto de software de TDD:
    • Pruebas Unitarias (Unit Tests). Estas pruebas se encargan de evaluar un punto especifico del código, ya sea un método en especifico o una propiedad, esta prueba se realiza de forma aislada al resto de los programas o clases que conforman el sistema. La idea radica en que todas las dependencias externas deben ser capaces de simularse y probar es el comportamiento de lo que verdaderamente desarrollamos (no pruebes lo que no hiciste, dicen los gurus), esto garantiza que la velocidad de las pruebas sea significativa ya que todo debe correr en memoria.
    • Pruebas de Integración. Estas se encargar de validar el funcionamiento de nuestros programas con dependencias externas, como por ejemplo el sistema de archivos, el entorno de red, los manejadores de bases de datos, etc. Al interactuar con estos elementos y esperar por su respuesta los tiempos tienden a ser mayores que los que obtenemos directamente de las pruebas unitarias.
    • Pruebas de Aceptación. Son similares a las pruebas de integración en que simulan el entorno completo pero su propósito es simular escenarios reales de uso del código y determinar que el comportamiento sea el esperado en un caso real, el cual debe cumplir directamente los requerimientos de las características especificadas del sistema. Creo que la definición que mas me ha gustado es que las pruebas de aceptación prueban qué hace el sistema, mientras que las unitarias prueban cómo lo hace.

Cómo implemento el TDD?

Pues una vez que tenemos clara esta separación en los diferentes tipos de código hay tres reglas que debemos seguir casi religiosamente al momento de desarrollar software:

  1. No se puede crear nada de código de producción a no ser que exista una prueba unitaria que verifique el mismo (la clave consiste en entender en que consiste una buena prueba unitaria).
  2. Se escribirá una prueba unitaria que falle (la falla de compilación cuenta como falla de la prueba), para luego elaborar el mínimo de código de producción necesario para que la prueba pase (en mi opinión esta es la regla mas difícil de adherirse luego de muchos años de desarrollo en forma tradicional).
  3. Una vez la prueba tenga una resolución satisfactoria se puede proceder a optimizar el código, siempre y cuando no se incluya mas funcionalidad que aquella requerida por la prueba (al entrelazar las diferentes pruebas vemos como esta parte se convierte en algo vital para descubrir la forma en la que nuestra código puede optimizarse).

Podemos ver el proceso ilustrado en el siguiente diagrama

Ciclo TDD

Ciclo TDD

Obviamente el proceso no es la respuesta a todos los problemas de programación y hay algunos casos de excepción; por ejemplo, aquellas casos en los cuales no hay mayor ganancia con la implementación de pruebas unitarias (clases con solo getters y setters pueden obviarse) o en algunos casos puntuales en los cuales las pruebas unitarias deben sustituirse por pruebas de integración (que en realidad son casos mínimos), pero en la mayoría de los casos el manejar lo que se conoce como “Probar Primero (Test First)“a través de pruebas unitarias es la mejor practica.

Es quizás complicado presentar la idea de escribir la prueba antes de desarrollar el código, se bien que suena totalmente extraño, impractico y una perdida de tiempo (yo de hecho lo consideraba así) para aquellos que están acostumbrados a la manera tradicional de desarrollar software ya que la practica común es cubrir alguno escenarios con pruebas automatizadas y manuales luego de generar el código.

He descubierto que este efecto de percepción de lentitud tiene dos causantes primordiales:

  1. Como programadores estamos acostumbrados a escribir mucho código de producción, pero no tenemos la habilidad de crear pruebas (y mas aún las unitarias que son algo restrictivas) con la misma agilidad; es necesario considerar un poco la situación antes de hacer el código de la prueba e imaginar los diferentes usos posible de ese código que estamos probando. Como todas las habilidades de un desarrollador, esta no se adquiere de la noche a la mañana y el tiempo que tardamos en aprenderla y reestructurar las pruebas que venimos haciendo o cambiar de tecnologías de prueba puede hacerse engorroso pero te puedo asegurar que no es tiempo perdido.
  2. Por otra parte, hay un factor de dispersión de atención ya que estamos constantemente intercambiando nuestra vista entre las pruebas y el código de producción que puede hacer que se sienta algo pesado al principio; igualmente te digo, es algo de pura percepción y a lo que solo toma un poco de tiempo acostumbrarse.

En qué me beneficio como programador al utilizar TDD?

Creo que el mayor beneficio es un cambio total en la actitud y la manera en la que interactuas con el código.

Para ilustrar lo que quiero decir, mira las siguientes imágenes

I have no idea why my code works

“No tengo ni idea porque funciona mi código”

Los estados del programador

Los estados del programador

Aunque parezca un chiste contra los informáticos (ja ja bro), la verdad es que es una gran realidad a la que mas de una vez nos enfrentamos los programadores, o por lo menos puedo asegurar que a mi me paso; al ver como nuestro código evoluciona sin control, y no hay indicadores que nos permitan descifrar que hace nuestro código con precisión en cada uno de los diferentes métodos; esto genera miedo al cambio, y conforme es necesario agregar funcionalidades al sistema, sentimos cada vez mas temor ya que no sabemos que podemos dañar con cada cambio que introducimos en nuestros sistemas, esto sin hablar siquiera de la idea de modificar código que ya existe y que sabemos puede ser optimizado o la idea de editar código desarrollado por alguien mas.

El tío Bob llama a esto “ser secuestrados por nuestro propio código“.

La idea es que el código que utilizas, sea o no de tu autoría, responda a tus ordenes, no que seas sumiso a lo que hace días, semanas o meses pareció una buena idea y ahora quizás ya no lo sea; que seamos capaces de atacar con certeza y decisión todo el código al que nos enfrentemos y que podamos responder sin mayor inconveniente a las consecuencias de nuestros actos.

En mi opinión esta es la mayor ganancia que obtenemos al adoptar la metodología de TDD.

Puedo dar testimonio de que en mi proyecto mas reciente(que ha sido la recreación con TDD de otro proyecto en el que ya trabaje) he sido capaz de alterar la manera en la que mis clases operan, optimizando y mejorando el diseño que había concebido de manera iterativa y sin preocupaciones; si tengo una idea, simplemente la introduzco en el código y valido que las pruebas se ejecuten de forma satisfactoria. Como por ejemplo

La tranquilidad de ver la barra verde

La tranquilidad de ver la barra verde

 


Creo que por ahora es suficiente, hay mucho mas de los que se puede hablar como por ejemplo el Desarrollo Guiado por Comportamiento (BDD) o Desarrollo Guiado por Pruebas de Aceptacion (ATDD), cómo desarrollar buenas pruebas unitarias (una habilidad escencial para el TDD) o los diferentes frameworks de pruebas disponibles para los diferentes lenguajes, y estoy seguro que hablaremos de todos ellos en su momento, pero por ahora espero por lo menos haberte dejado con la intriga para explorar mas sobre el tema del TDD.

En nuestro siguiente post sobre TDD creo que nos enfocaremos en como detectar y erradicar los olores en nuestras pruebas unitarias.

Lo se, a mi también me pareció raro al principio.

Hasta la próxima.

Publicado en Blogging | Etiquetado , , , , , , , , , | 1 Comentario

Iniciando en C++: Bases para el Desarrollo en C++

En este post vamos a estudiar el ciclo de vida de un programa – ya sea una aplicación convencional o un juego – en C++, vamos a explorar los diferentes elementos a considerar cuando escogemos desarrollar en C++ y algunas de las diferentes plataformas para desarrollar con el.

Entendiendo el Estándar C++

El Estándar ISO para C++ es LA definición de C++, esta describe exactamente como el lenguaje debería trabajar; también define un grupo de archivos que reciben el nombre de librería estándar; esta librería, contiene las piezas fundamentales para las tareas de programación comunes como por ejemplo obtener valores de entrada y mostrar valores de salida – a esto se le conoce como operaciones I/O. La librería estándar facilita la vida de los programadores ya que provee código fundamental que nos evita tener que volver a implementar las mismas funciones una y otra vez. En este tutorial utilizaremos la librería estándar extensivamente.

El estándar ISO es también llamado el estándar ANSI o ANSI/ISO. Estos nombres involucran las siglas de los diferentes comités que han realizado la revisión y establecieron el estándar La manera mas simple de referirse al código C++ que se adecua al estándar ISO es simplemente Estándar C++.

Programas en C++

Lo primero que debemos saber es que en C++ todos los programas que desarrollamos se corren (o ejecutan) utilizando un archivo ejecutable; existen diferentes pasos para llegar a la creación de un ejecutable desde el código fuente C++ (una colección de instrucciones en el lenguaje)

  1. Primero, el programador utiliza un editor para escribir el código fuente C++, este código se almacena en lo que se conoce como un archivo de fuente; comúnmente, estos archivos utilizan la extensión “.cpp” para ilustrar al sistema operativo y a otros programas que su contenido es código C++. El editor no es mas que un programa procesador de palabras que permite crear, editar y guardar código fuente (aunque en la mayoría de los casos cuenta con funciones mas avanzadas*).

  2. Luego que el programador crea un archivo de fuente, utiliza una aplicación que se conoce como compilador C++ para que lea el código fuente y lo traduzca en lo que se conoce como un archivo objeto; estos archivos objeto comúnmente se crean con la extensión “.obj”. Es aquí donde ocurre la interpretación del código que creamos al codigo que entiende el computador, es por esto que mas adelante haremos un estudio mas profundo sobre los diferentes compiladores y algunas de sus diferencias.

  3. Como siguiente paso se involucra un programa llamado vinculador, el cual asocia los archivos objeto con cualquier archivo externo que necesiten utilizar para la creación del archivo ejecutable. Como ultimo detalle debemos tomar en cuenta que si trabajamos en la plataforma Windows (o los descendientes de DOS) encontraremos que los archivos ejecutables tienen la extensión “.exe”.

*: Hay editores que realizan separación del código con colores o inclusive auto-completan las instrucciones conforme las vamos escribiendo, a esto se le conoce como Intellisense.

La siguiente figura ilustra mejor este proceso

Creacion Ejecutable C++

Creación Ejecutable C++


Nota: Normalmente, no se crean programas en solitario, existen diversos archivos cpp que crean una cantidad de archivos obj o hacen uso de otros archivos que ya fueron compilados y a la final se condensan en un ejecutable o librería (de las cuales hablaremos mas adelante).


Si bien es posible realizar todo este proceso por separado, e inclusive existen lugares donde se enseña C++ escribiendo el código en Notepad, Vim o cualquier otro editor de texto, para luego ejecutar los compiladores y vinculadores por separado, esta no es la practica común en ambientes profesionales. Para esto, existen entornos de desarrollo donde podemos utilizar las diferentes herramientas de forma entrelazada, estas se conocen como Entornos de Desarrollo Integrado o IDEs por sus siglas en ingles.

Sobre los Entornos de Desarrollo

Aunque existe una gran cantidad de IDEs y el estándar para la enseñanza del lenguaje C++ en los salones de clase (que yo he visto) es Turbo C++ de Borland, nosotros utilizaremos para este tutorial Microsoft’s Visual C++ el cual forma parte del entorno Microsoft Visual Studio y esta disponible en las versiones Express y Community Edition del mismo que están disponible de forma gratuita. Si tu computadora lo soporta recomiendo utilizar Microsoft Visual Studio Community Edition 2013, igualmente puedes utilizar Microsoft Visual Studio Express si tu computador no es tan potente.

Si eres un poco curioso te preguntaras cual es la diferencia entre los diferentes IDEs y porque solo garantizo al 100% que los códigos correrán en estos que te estoy recomendando? pues la diferencia radica principalmente en los compiladores. Microsoft implementa su propia versión del compilador C++ (que es bastante confiable) y que se rige de forma rigurosa por el estándar ISO.

Hay otros IDEs que utilizan otros compiladores como por ejemplo Codeblocks (también es muy bueno) que permite trabajar con diferentes compiladores como por ejemplo GCC, el cual es el compilador mas utilizado en el entorno GNU/Linux. Desafortunadamente, como el tiempo es limitado me limitare a utilizar solamente Visual C++ para ejecutar los ejercicios, pero si te entusiasma la idea puedes probar con otros compiladores o IDEs para probar el desempeño del código.


Nota: Mas adelante haré un post un poco mas avanzado hablando sobre las diferencias de bajo nivel entre compiladores y plataformas de desarrollo.


Con esto cerramos por ahora, en el próximo post empezaremos a estudiar la sintaxis de C++ y crearemos nuestros primeros programas en este lenguaje.

Espero que hayas disfrutado este contenido y cualquier comentario (positivo o negativo) es bienvenido.

Hasta la próxima.

Publicado en C++ | Etiquetado , , , , , | Deja un comentario

Iniciando en C++: Introducción

Iniciando en C++

Repito: Iniciando en C++

Ya paso el shock? Muy bien, permiteme decirte que estamos a punto de tomar un giro inesperado con mi blog y es que he decidido crear una serie de posts tutoriales en los que hablare sobre como programar en este lenguaje que tanta mala fama genera en los estudiantes de informática y el cual muchos consideran como algo del pasado, ya que el 90% de las personas que alguna vez han visto C++ en un salón de clase no han visto ni el 10% de sus capacidades. Con esto lo que quiero ilustrar es que normalmente cuando escuchamos hablar de C++, lo que se dice es que no deberíamos perder mucho tiempo con este lenguaje de bajo nivel y que en su lugar deberíamos esforzarnos por dar el salto a lenguajes de mas alto nivel donde encontraremos mas oportunidades de desarrollo profesional; y quizás esto no este del todo errado, es posible que hasta sea lo “correcto” en algunos casos para personas con  intereses específicos, pero hay un punto que siempre me gusta hacer a favor de C++, y es que un programador que logra maestría de cierto nivel sobre este lenguaje puede abordar la mayoría de los lenguajes modernos y dominarles con mas facilidad que alguien que haya decidido ignorar C++.

Si alguien te pregunta que tienen en común el Kernel de Linux y Call Of Duty: Advanced Warfare? la respuesta clara es que ambos fueron desarrollados utilizando C++, y es que aunque en todos los videojuegos se involucran mas elementos que solo el lenguaje base, , y es que al ser un lenguaje tan puro y prácticamente carente de un paradigma propio (no es 100% así pero lo veremos a futuro), es posible explorar  conceptos de mayor o menor envergadura en un mismo lenguaje sin alterar mucho nuestra percepción de como funciona el mismo. Es decir, podemos crear programas bajo el paradigma procedural o ir de lleno hacia una desarrollo orientado a objetos o explorar el desarrollo de software funcional, todo esto utilizando la misma sintaxis de lenguaje y las mismas herramientas de desarrollo.  Ahora bien, si tu, querido lector, solo estas empezando en el mundo de la programación, esta capacidad no te dirá nada, ya que los diferentes paradigmas de desarrollo son un tópico un poco mas profundo, pero lo que quiero darte a entender es que C++ es extremadamente flexible y considerablemente mas veloz que la mayoría de los otros lenguajes de desarrollo, y este es un punto muy importante, aquí te pido que me tengas un poco de fe y confíes en que en un futuro no muy lejano entenderás porque esto es tan importante.

Igualmente es importante decir que el nivel de soporte y la comunidad que existe alrededor del desarrollo en C++ no es para tomarse a la ligera; si tomamos en cuenta que en cada versión de Microsoft Visual Studio existe una implementación importante de C++ o que dentro de las comunidades OpenSource existe un interés palpable sobre el desarrollo de los estándares del lenguaje y las herramientas no comerciales de desarrollo con el mismo. Podemos entonces decir que el viaje de aprendizaje en C++ no es algo que harás solo, y que C++ es un lenguaje con un alto nivel de soporte por diferentes entidades, por lo cual la idea de que es obsoleto es solo un mito que principalmente he visto impulsado por estudiantes frustrados.

Ahora bien, explico porque decidí entrar en el mundo de los tutoriales; hace poco comencé a tratar de transmitir un poco de mi conocimiento de programación a un familiar que esta empezando sus estudios en informática y luego de comenzar a instruirlo un poco en el mundo de algoritmos básicos y estructuras de control, pensé que era un buen momento para introducirlo en el mundo de la programación básica utilizando C++,  entonces me di cuenta de algo, el material que conseguí en mi idioma no era nada que pudiese presentarle a alguien sin nada de conocimiento del lenguaje o programación en general y esperar que se entusiasmara por la idea de utilizarlo; fue allí que recordé un muy buen libro que tuve la oportunidad de leer en el 2014 llamado Beginning C++ Through Game Programming de Michael Dawson, recuerdo haber pensado que era un gran libro para principiantes, desde la manera en la que se estructura el contenido del libro, hasta los ejemplos técnicos que allí se presentan.

Luego de pensar y buscar algo similar me di cuenta de que no había mucho que le pudiera ofrecer a mi pupilo que se equivaliera al contenido de este libro, fue entonces cuando decidí empezar un proyecto de “traducción no oficial” del libro, en el cual aunque voy a prestar mucho del contenido del libro, también complementare con ideas propias y mi manera de explicar ideas y ejemplos (aunque aun no estoy 100% claro de algunas cosas). Igualmente, pienso hablar un poco sobre mis propias practicas de Clean Code (Código Limpio), algo que pienso  es muy importante que todo programador aprenda desde el momento cero, mas aun en este lenguaje donde vemos como algo tan normal la ruptura de la legibilidad del código (de esto hablaremos con mas detalle mas adelante).

Creo que es el momento ideal para mostrar un poco del esquema (que no es un conteo exacto de posts) que tengo planeado para estos tutoriales:

  1. Bases Técnicas del Desarrollo en C++
  2. Entornos de Desarrollo Integrados
  3. Manejo de Tipos y Variables con Entrada y Salida Estandar
  4. Estructuras de Decisión
  5. Estructuras de Iteración
  6. Manejo de Strings y Arrays
  7. STL: Standard Template Library
  8. Manejo de Funciones y Archivos de Cabeceras
  9. Referencias
  10. Punteros
  11. Programación Orientada a Objetos
  12. Clases Avanzadas y Memoria Dinámica
  13. Herencia y Poliformismo

Espero disfrutes el contenido del curso y cualquier comentario (positivo o negativo) es bienvenido.

Publicado en C++ | Etiquetado , , , , | Deja un comentario

Ludum Dare 30

Para mis seguidores que creían que había olvidado mis proyectos de juegos, sencillamente no es así; he dedicado estos meses a trabajar poco a poco en Onirismo y a la vez desarrollar mis habilidades de programación(adicionalmente me he comprometido de matrimonio lo cual es una locura) en C++ y C#.

Lo que me lleva a escribirles hoy, este fin de semana es el Ludum Dare 30, en el cual he decidido participar con la nueva versión de Unity (4.6 beta). El tema oficial es “connected worlds”  así que estoy pensando en hacer algo con mecánica de shooter espacial utilizando un sistema de física que afecte la gravedad de los disparos.

Los mantendré informados de como progresa el Jam pero tengo 48 horas para lograrlo así que mejor me pongo a trabajar.

Publicado en Blogging | Etiquetado , , | Deja un comentario

Componentes De Un Juego

Ya que en el post pasado nos dedicamos a definir claramente que es un juego (ver aquí) es hora de tocar un tema sobre el cual quería escribir desde hacia un tiempo y es ¿Cuales son los componentes que definen un juego?.

De las diferentes teorías que he leído, es Jesse Schell quien lo define de forma mas clara en mi opinión en lo que el llama la “Tetralogía del Juego” y el “Tema Unificador”, su teoría puede resumirse en el siguiente diagrama:

Diagrama Tematica - Quadrologia de Elementos

Los 5 componentes clave de un juego: Temática, Estética, Historia, Tecnología, Mecánicas

Desarrollemos esto un poco, para no perder la costumbre:

Todo juego busca generar una o varias experiencias en los jugadores, para esto utiliza un concepto o temática y todo los componentes que desarrollan el juego se basan en esta temática; ya sea la historia que experimentamos, los recursos tecnológicos que se involucran en el juego, las reglas o mecánicas que rigen la actividad o la estética que se utiliza para representar el juego si algunos de estos elementos no están acordes con la temática el nivel con el que los jugadores se involucran en el juego disminuye.

Este es un resumen(muy a grosso modo) de la teoría de Jesse Schell, pero para entender mejor estas afirmaciones examinemos estos elementos por separado:

  • Temática: Es la hipótesis base de todo juego, es la pregunta que define como alcanzar la experiencia que se quiere obtener de un jugador, teóricamente hablando esta debería servir como la premisa inicial sobre la cual basamos el resto de los componentes del juego aunque no siempre es de esta manera; es importante que si se inicia el proceso de diseño desde algún otro elemento la temática debe definirse tan rápidamente como sea posible. Todo juego tiene un concepto base, este puede ser tan simple como “¿soy mas veloz que mis compañeros de grupo?” en un sencillo juego de carreras hasta “¿cuál es el proceso de crecimiento en el que superamos la timidez y la introversión de la adolescencia?” que es la base de Final Fantasy VIII, siendo estos la base que permite desarrollar la experiencia del jugador. Quizás no percibamos a simple vista la temática de un juego a no ser que el diseñador nos la explique directamente, por ejemplo la temática primordial de uno de los mejores juegos de todos los tiempos, Castlevania: Symphony Of The Night, es el retorno de un hijo prodigo a un hogar disfuncional, pero muchos solo pudimos exteriorizar este concepto una vez que fue explicado por Koji Igarashi explícitamente, pero en retrospectiva si analizamos el resto de los elementos del juego, todos sirven para reforzar este concepto.
  • Estética: Es la consistencia sensorial del juego, quizás eso suene complicado, pero imaginen un juego con un estilo gráfico como Resident Evil 4 en el cual súbitamente enfrentes un enemigo con el aspecto visual de Gyarados, instintivamente la inconsistencia entre un estilo visual y el otro crea un rompimiento de la experiencia  que el jugador percibe (o rompe El Circulo Mágico, algo de lo que hablare otro día), o imagina la introducción a Shadow of the Colossus pero en lugar de la música instrumental minimalista del juego escuches Carmen de la Sonora Dinamita, la inmersión del jugador se rompe inmediatamente por la disonancia que se crea entre el sentido visual y el auditivo. No quiero ser despectivo ni a Pokemon ni a la Sonora Dinamita, solo quiero ilustrar que en el contexto anterior no funcionan, aunque quizas con otra experiencia y temática, serian las opciones ideales(para muestra el soundtrack de mis juegos PanoramaBoy y Licorun donde utilice “Musica de Matrimonio” para reforzar la temática); igualmente no hay que confundir la fidelidad o nivel de realismo que se pueda obtener en un sentido con una buena estética, si comparamos el nivel de fidelidad de Call Of Juarez: El Cartel contra Hotline Miami, obviamente Call of Juarez tiene un nivel gráfico mas avanzado pero el resto de la experiencia es tan disonante que pierde el sentido de la estética rápidamente, mientras que Hotline Miami es consistente en tono, gráficos y audio lo que brinda una mejor experiencia de juego en comparación.
  • Historia: El sentido narrativo del juego, de hecho algunos autores no lo llaman Historia sino Narrativa(y me gusta mas este termino), pero para propósitos de traducción usare el termino Historia para este punto. Este componente define la trama del juego, pero también los diálogos, la ambientación, el trasfondo, la mitología, entre otros de ser necesarios. No todos los juegos tienen o necesitan una historia compleja que haga uso de todos estos elementos, pero todo juego tiene una historia, ya sea implícita o explicita; por ejemplo en un juego de escondite, la historia es la resolución del juego, es decir el orden en el que las personas sean descubiertas o si alguien consigue que el que busca se rinda; esta historia es de carácter minimalista y es desarrollada 100% por los jugadores sin necesidad de un componente externo. Ahora comparemos el caso contrario, un juego como The Elder Scrolls V: Skyrim no solo la trama del juego es de carácter extremadamente complejo, existen decenas de libros dentro del juego que narran el trasfondo histórico y la mitología del continente de Tamriel, adicionalmente la ambientación y geografía del juego cuentan mucho de la historia y tienen consistencia con los diálogos y las personalidades de los personajes que se encuentran en el juego. Para volver al ejemplo de Call Of Juarez, el juego comete muchas fallas en el sentido narrativo, malinterpretando la situación de la guerra contra las drogas y presentando sus personajes de forma unidimensional, totalmente perdiendo el sentido de la historia que trata de contar, o simplemente tratando de representar sucesos de la vida real con poca semblanza de la realidad. Una vez mas no es nivel de profundidad o complejidad lo que determina una buena implementación sino la consistencia de la historia con la temática y como impulsa la experiencia que se busca lo que ayuda a obtener un mejor resultado.
  • Tecnología: Cualquier elemento que ayude a realizar la actividad, puede ir desde una silla, un libro, un grupo de cartas o un dado de 6 caras hasta software y hardware especializado que nos permita realizar la actividad de juego. Existen juegos que utilizan tecnologías muy cerradas, como por ejemplo un set de Monopoly donde hay un grupo finito de piezas a repartirse o maquinas de árcade que reproducían un solo juego, igualmente existen juegos expansibles como por ejemplo Magic: The Gathering en el que los grupos de cartas pueden ampliarse y renovarse en el tiempo, o juegos como Civilization que incluyen herramientas de software que le permiten a los jugadores ampliar y modificar sus juegos (mods). Es importante definir la experiencia y temática que se quiere explorar y escoger la tecnología que permita desarrollar los mismos de mejor manera; por ejemplo si voy a diseñar una variante de Twister con enfoque en la interacción personal entre personas de diferentes edades puedo explorar utilizar cartas, alfombras, tableros u hojas, mientras que desarrollar una aplicación de iPad poco beneficiaría este propósito (esto es una media verdad pero sirve de ejemplo). Una vez mas la importancia esta en la consistencia entre temática-experiencia-componente.
  • Mecánicas: Las reglas, parámetros y contexto de la actividad; un juego debe ser consistente con sus mecánicas y utilizarlas de forma clara y regulada para poder resaltar la experiencia que quiere brindar. Acá no usare como ejemplo un juego en especifico sino un genero completo, los juegos de aventura gráfica decayeron fuertemente en popularidad por que muchos juegos de este genero malinterpretaron  la experiencia primordial del jugador, los juegos de Aventura principalmente se basan en la exploración de una historia, y se enfocaron en aplicar mecánicas de bloqueo de la historia a través de puzzles que perdían consistencia con la temática que exploraban(ver aquí); el gran problema radica en malinterpretar la experiencia que se quiere desarrollar y las expectativas del jugador para con el juego, esto lleva al jugador a realizar actividades en un contexto que no tienen nada que ver con el propósito del juego o su temática (termina pareciendo un partido de Blernsball). Por el contrario la gran mayoría de los juegos de la serie The Legend Of Zelda se rigen en un de forma consistente con la temática que quieren explorar, brindando exploración, armas, herramientas, contexto y reglas de funcionamiento que se adhieren a la experiencia principal del juego y de la serie en general.

Es importante reconocer que si bien la temática es el elemento por el cual el resto de los componentes se unen, no hay un componente que sea mas importante que el otro, todos tienen un peso igual sobre la experiencia que se quiere explorar y es importante como diseñadores considerar activamente si se esta dedicando el suficiente tiempo y consideración a cada uno de estos rasgos. Quizás no sea necesario desarrollarlos en la misma manera(depende de la experiencia que queramos brindar) pero si es necesario dedicar el estudio apropiado para determinar si estos elementos están contribuyendo activamente a la experiencia final del juego o si por el contrario están substrayendo de la misma.

Existe mucho mas que se puede decir de cada uno de estos elementos estudiados de forma individual, y aunque es mi intención escribir mas sobre ellos, por ahora podemos dejarlo hasta aquí como nivel introductorio; un ejercicio interesante, que los diseñadores buscamos hacer lo mas posible, es que la próxima vez que juegues cualquier juego te preguntes si puedes definir la temática principal del mismo y que elementos puedes listar en estas 4 categorías de componentes, por ultimo considerar si están contribuyendo entre si para impulsar positivamente la temática o si hay disonancia entre ellos.

Como nota final les doy un ultimo consejo:

No jueguen Call Of Juarez: El Cartel.

Publicado en Teoria del Diseño | Etiquetado , , , , | Deja un comentario

Un Juego Por Semana: Semana 8 – Actualización

Pues la semana 8 vino y se fue y sigo trabajando en el juego; el concepto ha sido mas complicado que lo que originalmente esperaba, pero quiero hacer el juego completo y siguiendo la narrativa que originalmente me plantee, por lo que he decidido invertir un par de semanas adicionales para completar el juego. Si bien la idea es completar un juego por semana, esta vez siento que el resultado del juego valdrá la pena el tiempo que tome el desarrollo.

Para desarrollar este juego mis mecánicas son algo limitadas debido al estilo del juego y al motor que estoy usando pero gracias a la ayuda de material que he conseguido en linea (especialmente este articulo), el modelo que tengo para la ejecución del concepto y los consejos de algunas personas a las cuales les he hablado del juego, creo que puedo conseguir algo interesante.

En fin, seguiré actualizando conforme avance el desarrollo del juego, que ahora tiene un nuevo titulo: Onirismo

 

Publicado en Un Juego Por Semana | Etiquetado , , , , , , | Deja un comentario

Un Juego Por Semana: Semana 8 – Concepto

Este fin de semana fue el Ludum Dare, uno de los Game Jams mas famosos a nivel mundial; la manera en la que funciona es que a medianoche entre viernes y sábado se publica un tema y los participantes cuentan con 48 horas para elaborar el juego y publicarlo, luego es juzgado y un ganador se decide, el premio final: el reconocimiento de tus pares y un juego completo. Me parece que es una excelente actividad y aunque tuve intenciones de participar circunstancias fuera de mi control me impidieron elaborar el juego, pero el tema de esta edición, que fue “bajo tierra”, en combinación con otras cosas que me han venido pasando  me brindo una idea que decidí explorar esta semana:

  • Titulo Tentativo: Insomnia
  • Fecha de Inicio: 29/04/2014.
  • Fecha de Entrega: 03/05/2014.
  • Concepto: Aventura de Terror.
  • Sistema de Juego: Historia Interactiva.
  • Motor: Twine
  • Descripción: Insomnia es una Aventura Interactiva de Texto, inspirada en las historias de H. P. Lovecraft; quisiera elaborar mas aquí pero no creo que sea posible sin arruinar la experiencia de juego.
  • Factores Clave del Juego: 
    • Exploración:  El personaje principal de la historia explora unas catacumbas en búsqueda de respuestas.
    • Historias Divergentes: Las decisiones que el jugador tome afectará el resultado final de la historia, brindando un factor interesante de jugabilidad.
    • Inventario: El inventario del jugador determinara las opciones que puede explorar.

Siento que esta definición de concepto de juego esta un poco escueta, pero no quiero “spoilear” la historia que quiero contar ya que el factor sorpresa siento que brindara un elemento interesante.

Así que a por otro juego.

Publicado en Un Juego Por Semana | Etiquetado , , , , | Deja un comentario