Translate

lunes, 17 de diciembre de 2012

Ayuda para entrevistas laborales de desarrollo de software.


Roque Manuel Rueda Anastacio.
10/12/12


Tabla de versiones

Versiones
Versión
Fecha
Autor
Comentario
0.1
10/12/2012
Roque Rueda
Creado

Objetivo

Ser un apoyo fácil para incrementar acertar el mayor numero de preguntas durante el desarrollo de entrevistas técnicas de desarrollo de software.

Introducción

Este documento proporciona un conjunto de conceptos y mi punto de vista particular así como ejemplos para el apoyo durante las entrevistas laborales para vacantes relacionadas con desarrollo de software. Se realiza con la experiencia obtenida de entrevistas previas. En la mayoría de las entrevistas de las que yo he sido parte; usualmente se realizan las mismas cuestiones además, debido a que algunos de los entrevistadores usualmente son desarrolladores de software, tienen un conocimiento práctico en lenguajes sin embargo sorprendentemente algunos de ellos pueden tener nociones equivocadas de los conceptos más básicos.

1. Programación Orientada a Objetos

El termino programación Orientada a Objetos, este termino que debiera ser Análisis y Diseño Orientado a Objetos, se refiere a tener una perspectiva de objetos (cosas, conceptos o entidades) para el dominio del problema y su solución lógica. Ahora bien el dominio del problema es la problemática que pretende solucionar (el problema por el cual se debe desarrollar un producto de software) y la solución lógica sera la especificaciones que debe cumplir el sistema para solucionar la problemática. En un Análisis Orientado a Objetos, los “objetos” son descritos en el dominio del problema, mientras que en el Diseño esos “objetos” se convierten en objetos lógicos de software que finalmente serán implementados en un lenguaje orientado a objetos, por ejemplo Java o C#. La duda que surge entonces ¿Qué es un Objeto? Un objeto es una pieza de software que se ejecuta realizando operaciones de un programa. Un objeto se define como una instancia de una clase ya que la clase es la definición del los atributos y comportamiento del objeto. Mientras que el objeto es en tiempo de ejecución el elemento que realiza las acciones. Y eso no lleva a otra duda ¿Qué es una clase? Una clase es un documento (podemos decir código) que define como se menciona anteriormente los objetos, podemos decir que es una orientación a los datos ya que la clase define que datos contiene el objeto y que operaciones puede realizar el objeto con los datos sin embargo esto puede causar confusión. Una analogía es que la clase es el plano arquitectónico y el objeto es la casa construida. Los siguientes elementos son conceptos que intervienen en un diseño Orientado a Objetos.

Diagrama de un objeto
Figura 1. Diagrama de un objeto

1.1. Encapsulamiento

El encapsulamiento es la característica que un objeto tiene de ocultar su información a los otros objetos, cualquier otro objeto solo se puede acceder a los datos mediante la invocación de métodos. El encapsulamiento brinda que los cambios en los datos de los objetos se realicen de manera controlada y también dan la capacidad de ignorar la implementación de las operaciones que realiza el objeto centrándose solo en los valores resultado. Esto se podría ejemplificar con un automóvil el cual al pisar el acelerador se espera que incremente su velocidad el como sea llevada a cabo la operación (motor, combustible, ignición), para el cliente de la operación solo le interesa que se incremente la velocidad no como se lleve a cabo ahí es donde el encapsulamiento resulta de utilidad.

1.2. Abstracción

Es el proceso en el que los datos se definen para representar una imagen o forma que permita obtener un significado que existe en el dominio del problema, sin entrar a un nivel de implementación. La abstracción permite descomponer la problemática en partes mas pequeñas. Permitiéndonos dividir la implementación (como se llevara a cabo) de la definición (que hay que llevar a cabo).

En un lenguaje como Java una clase es la definición del comportamiento y los datos. Una clase no se puede utilizar directamente. Un objeto es la instancia de la clase y es el objeto el que realiza las operaciones.

1.3 Polimorfismo

Es la capacidad que tienen las variables de contener objetos de diferentes clases, usualmente se dice que los objetos adquieren diferentes formas sin embargo son las variables que los contienen las que pueden adquirir valores de diversas clases. Si una clase Hijo es una subclase de la clase Padre entonces un método que espere un parámetro un objeto de clase Padre también puede ser invocado con un parámetro de la clase Hijo. El polimorfismo se da en lenguajes como Java o C# de 4 maneras la clase padre, la interfaz que implementa, la clase Object y el mismo.

Ejemplo:
public interface Person{
void comer();
}

public class Padre implements Person
{
public void saludar(String nombre){
System.out.println(“Hola desde padre: ” + nombre);
}

public void comer(){
System.out.prinln(“Comiendo padre... c:”);
}
}

public class Hijo extends Padre{
public String toString(){
// Metodo de la clase Object
return “Hola soy un hijo”;
}
}

/* Ejemplo de codigo */

public static void main (String[] args){
// Digamos que queremos crear un objeto Padre
Padre p = new Padre();
// Al existir herencia se crea una relación es un (is a)
// por lo tanto se puede decir que un Hijo es un Padre
p = new Hijo(); // se asigna un hijo en una
// variable de tipo Padre

p.saludar(“Roque”); // p contiene un hijo
// ya que hereda los metodos se puede invocar el metodo
// saludar de la clase padre

Persona per = p; // Se asigna la variable per de tipo
// Persona el valor contenido en la varable p la cual
// apunta a un objeto de tipo Hijo el cual es un Padre
// debemos recordar que tambien al implementar la interfaz
// se obtiene la relacion es un por lo que se puede decir
// que un Hijo tambien es una Persona.

per.comer(); // Esto es legal!

System.out.println(per); // El metodo println espera un
// parametro de tipo Object y ya que todo es un objeto
// esta es aceptada

Hijo h = (Hijo) per; // Esto es riesgoso pero es legal
// la conversion hacia arriba en la jerarquia de clases
// no requiere el cast

}

1.4. Herencia

Permite que las clases sean basadas en otras. Si una clase “A” hereda de otra clase llamada “B” se dice que la clase “A extiende a B”. Por ejemplo se puede definir una clase base que almacene un archivo y posteriormente esa clase sea extendida por otra clase para que se notifique al usuario de un archivo almacenado (agregar nueva funcionalidad).

1.5 Delegación

Delegación es cuando cedes la responsabilidad de alguna tarea a otra clase o método. Si se requiere utilizar esa funcionalidad en otra clase pero no se quiere cambiar la funcionalidad se utiliza delegación en lugar de herencia (se prefiere la agregación/composición a la extensión/herencia).

1.6 Composición

La composición se refiere a la representación de una familia de comportamiento mediante un conjunto de objetos. Se programa utilizando una interfaz y cualquier clase que implemente esta interfaz podrá ser definida.
En la composición los objetos que componen el objeto compuesto dejan de existir tan pronto como el objeto compuesto lo haga.

1.7 Agregación

La agregación permite invocar el comportamiento de otra clase sin la limitacion de tiempo de vida de ese comportamiento. Se puede decir que la agregación es cuando el comportamiento es invocado desde un objeto pero este no deja de existir cuando el objeto es terminando. Ejemplo: Salida estandar.
public class Parte {
int sumar(int numero, int otroNumero) {
return numero + otroNumero; // Sumar
}
}
public class Composicion {
Parte parte;
Composicion() {
parte = new Parte();
}
void imprimirSum(int numero, int otroNumero) {
System.out.println(parte.sumar(numero, otroNumero));
}
}
/* Ejemplo de codigo */

public static void main (String[] args) {
Composicion c = new Composicion ();
c.imprimirSum();
// El objeto parte deja de existir en cuanto el objeto
// composición lo hace
}
// Agregación
public class Parte2 {
int sumar2(int numero, int otroNumero) {
return numero + otroNumero; // Sumar
}
}
public class Agregacion {
Parte2 parte;
void imprimirSum(int numero, int otroNumero) {
if(parte != null) {
System.out.println(parte.sumar(numero, otroNumero));
}
}
public void setParte(Parte2 parte) {
this.parte = parte;
}
}
/* Ejemplo de codigo */

public static void main (String[] args) {
Agregacion a = new Agregacion ();
Parte2 p = new Parte2 ();
a.setParte(p);
a.imprimirSum();
// El objeto parte puede continuar existiendo después de su uso
}

2. Interfaces y clases Abstractas

Una clase se compone de dos partes la interfaz y la implementación. Entendemos por interfaz la definición (firma de métodos) y la implementación como el código que realiza la ejecución de las acciones. ¿Qué beneficios se obtienen de las interfaces? Un diseño por contratos, se dice por contratos ya que se asume que ambas partes de la transacción comprenden que acciones generan que comportamiento y cumplen ese contrato.
Una interfaz permite generar un diseño por contratos, la diferencia entre una clase abstracta y una interfaz es que una clase abstracta puede contener implementación mientras que en una interfaz unicamente se cuenta con la definición de la firma de los métodos. Es por eso que en una clase abstracta existe herencia mientras que en una interfaz solo existe implementación.
  1. Cohesión y Acoplamiento

Un sistema debe contar con una alta cohesión, la cohesión es la medida en la que las clases están relacionadas y que tan centrada son las responsabilidades de las clases. Un elemento es cohesivo a medida que cambia el elemento entero cuando el sistema necesita cambiar. Un diseño orientado a objetos es beneficioso el asignar responsabilidades para obtener una cohesión alta. Por lo que se deben evitar clases que tienen diferentes responsabilidades.
Dos elemento están acoplados a medida en el que los cambios de una parte involucran cambios en el otro elemento. El acoplamiento entre los elemento es un conductor de los cambios.
Se debe hablar solo a los amigos inmediatos.
Las entidades de software como las clases, módulos y funciones deben ser abiertos a extensiones pero cerrados a modificaciones. Este principio nos indica que se debe crear código que pueda aceptar nuevas extensiones sin que se deba modificar el código con el que ya se cuenta.
Un ejemplo es cuando una clase llama internamente a una clase abstracta para obtener cierto comportamiento. En tiempo de ejecución se provee de la implementación de la clase abstracta los que nos permite posteriormente proporcionar una nueva implementación para obtener nuevo comportamiento del código ya existente.

martes, 18 de septiembre de 2012

Tutorial Protégé


Por: LSCA Roque Manuel Rueda Anastacio Estudiante de la maestría en sistemas computacionales del instituto tecnológico de orizaba

 
Basado en: El tutorial de Protégé
So: Linux Mint maya Cinnamon


Hola para este tutorial vamos a realizar el tutorial de Protégé, Protégé es una aplicación que nos permite la construcción de Ontologías OWL.



Para la realización de este tutorial necesitamos tener instalado Protégé 4, el cual lo vamos a encontrar desde el sitio web de Protégé (http://protege.stanford.edu/) así como algunos de los Plugins del mismo los cuales se encuentran en el sitio CO-ODE (http://www.co-ode.org) también se recomienda pero no es necesario el uso del plugin OWLZiz ademas este Tutorial se estructura de la siguiente manera:

  1. Instalando Protégé.
  2. ¿Que son las ontologías?
  3. Construcción de una Ontología

1.- Instalando Protégé.
Primero nos dirigimos al sitio web de Protégé como se muestra en la figura 1 y se selecciona el archivo a descargar.

Figura 1: Sitio web de Protégé

Entrar al apartado de descargas y seleccionar la opción dependiendo si se cuente con un registro o no se debe realizar el registro, posteriormente se selecciona la versión que se desea descargar la cual sera similar a la imagen de la figura 2.

Figura 2: Descargas del sitio de Protégé
 
En este caso se seleccionara la versión de Protégé 4.1 la cual vamos a descargar y se almacenara en el disco duro como se presenta en la figura 3.

Figura 3: Descargando a disco duro la versión de Protégé

Para el caso de el equipo en el que se realiza este tutorial se selecciona la versión Linux de 64bit pero se debe seleccionar de acuerdo al sistema operativo, el sitio selecciona por nosotros la mejor opción y unicamente permite seleccionar dependiendo de la arquitectura del sistema; la descarga se puede apreciar en la figura 4.

Figura 4: Descarga de archivo de instalación


Posterior a la descarga del archivo debemos navegar a la ruta donde se ha descargado para iniciar con la instalación y tendremos algo como la figura 5.

Figura 5: Navegando al archivo descargado


Abrimos una terminal y navegamos a la ruta (comando:¨cd¨) donde se ha descargado nuestro archivo en donde vamos a escribir de acuerdo con la documentación del sitio el comando ¨sh ./install_protege_4.1.bin¨ (sin comillas) para iniciar la instalación como se muestra en la figura 6.

Figura 6: Consola para la instalación de Protégé
 
Se nos abrirá una ventana como la de la figura 7 en donde iniciaremos con el instalador a seleccionar las opciones de nuestra instalación.

Figura 7: Iniciando las opciones de la instalación


Las opciones seleccionadas durante la instalación para este tutorial se presentan en las figuras 8-12.

 Figura 8: Carpeta de instalación


Figura 9: Carpeta donde se creara el link a la aplicación


Figura 10: Seleccionar Maquina Virtual de Java
 

Figura 11: Resumen de la instalación

Figura 12: Instalación completa
 
Una vez terminada la instalación podemos abrir la aplicación para iniciar con su uso. Para abrir la instalación debemos tomar en cuenta el lugar donde se ha instalado en este caso se instalo en la carpeta root. Sin embargo la carpeta solo se puede acceder siendo el usuario administrador.

Para ingresar a la carpeta abrimos un terminal y entrados al usuario administrador con el comando ¨sudo su¨ y nos solicitara la contraseña del usuario administrador la cual ingresaremos como se muestra en la figura 13.

Figura 13: Ingresando a la terminal como usuario administrador


Ahora debemos navegar a la carpeta root para esto usamos el comando ¨cd /¨ aquí estamos diciendo al comando que navegue a la carpeta ¨/¨ la cual es la raíz de nuestro árbol de carpetas en Linux esto se puede observar en la figura 14.

Figura 14: Navegando a la carpeta raíz



Ahora navegaremos a la carpeta root usando el mismo comando (cd) ahora utilizando root como parámetro del comando, si no sabemos el contenido de una carpeta podemos utilizar otro comando (ls) con el cual se muestran los archivos de carpeta actual un ejemplo de esto se ilustra en la figura 15.

Figura 15: Uso de comando ¨ls¨ y navegando a la carpeta root


Ahora debemos navegar a la carpeta Protege_4.1 para lo cual escribiremos el comando ¨cd Progege_4.1¨ sin comillas para navegar a la carpeta esto se presenta en la figura 16.

 Figura 16: Navegando a la carpeta Protege
 
Una vez hecho esto ejecutaremos el comando “ls”para ver los archivos de la carpeta en donde podemos apreciar los siguientes elementos: (ver figura 17)
  • bin
  • build.properties
  • bundles
  • config.xml
  • jre
  • lax.jar
  • log4j.xml
  • plugins
  • Protege
  • Protege_4.1_InstallLog.log
  • Protege.ico
  • Protege.lax
  • run.sh
  • UninstallProtege
Figura 17: Archivos de la carpeta Protege


Ahora unicamente debemos iniciar el archivo run.sh para esto ejecutamos el comando “sh ./run.sh” y obtendremos algo como la figura 18.

 Figura 18: Iniciando Protégé


Ahora se puede comenzar a utilizar Protégé para la creación de ontologías. Y así concluimos la primera parte del Tutorial.

Cabe destacar que es muy probable que Protégé nos solicite descargar actualizaciones una vez iniciado a lo cual debemos aceptar ya que en las actualizaciones se encuentra en razonador fact++ el cual no sera de utilidad en las siguientes secciones del tutorial.

Anexo
Creando un link para ejecutar Protégé. Para lo cual necesitamos navegar hasta nuestro archivo abrimos una terminal y navegamos a la carpeta raíz como ya se explico anteriormente ver figura 19.

Figura 19: Navegando a la carpeta raíz

Ahora navegaremos a la carpeta de Protege (Protege_4.1 para este caso) en donde se ejecuta el comando “ls” para mostrar los archivos de la carpeta y ahí encontraremos el archivo “run.sh” el cual vamos a editar agregando permisos de ejecución y ademas vamos a crear un link en el escritorio esto se aprecia en la figura 20.

Figura 20: Mostrando archivos de la carpeta Protege_4.1

Ahora vamos a ejecutar el comando “ch mod” el cual permite cambiar los permisos de un archivo en este caso el parámetro a utilizar es “+x lo que significa que se le dan permisos de ejecución esto se presenta en la figura 21.

Figura 21: Modificando permisos del archivo run.sh

Ahora se procede a generar un lanzador para la aplicación en nuestro escritorio y poder invocarla de manera más sencilla. Para esto debemos ingresar el siguiente comando en nuestra terminal “gnome-desktop-item-edit /path/to/the/folder --create-new” donde <path/to/the/folder> se debe sustituir por nuestro escritorio para el caso de este tutorial se utiliza la ruta /home/roque/Escritorio pero se debe utilizar la ruta donde se desea generar el lanzador y asi obtenemos el comando a utilizar “gnome-desktop-item-edit /home/roque/Escritorio/ --create-new”. Esto nos abrirá una ventana para indicar las demás opciones del lanzador, esto se muestra en la figura 22 y 23.

Figura 22: Creando un lanzador para Protégé

Figura 23: Opciones del lanzador

Se debe recordar que se tienen que dar permisos al usuario para acceder a las carpetas, de no se así el lanzador no funcionara adecuadamente. Finalmente al dar doble clic sobre el lanzador se ejecutara Protégé ver figuras 24, y 25.

Figura 25: Ejecutando el lanzador

Figura 26: Protégé abierto desde el lanzador
 
Listo se ha terminado esta primera parte de este gran tutorial espero que sea de utilidad para quien este buscando el como instalarlo esperen pronto la segunra y tercera parte en cuanto las tenga actualizare este post para colocar las ligas a los mismos. Un saludo y suerte.

Roque Rueda
Puedes encontrar este documento en:
QRCode