Reflexión Final

Ya estamos terminando el semestre, el año y con esto también la década, por lo que para mi es momento de reflexionar de lo que he aprendido a lo largo de este tiempo, por lo menos en esta materia, aunque no limitado.

Uno cuando piensa en los alumnos de la carrera de Sistemas Computacionales piensa en personas que siempre están frente a una computadora, sentados todo el día sin hablar con otra persona, mas con las que se comunica por medio de la misma computadora, que en parte es verdad, pero esto solo es una pequeña parte. Como alumno de esta carrera puedo dar otro punto de vista que muchas personas ni se podrían imaginar y que como yo lo veo es el colmo, este punto de vista es que en verdad esto no pasa, la verdad es que para poder trabajar de manera correcta se tiene que hablar con muchas personas tanto físicamente como virtualmente, esto se debe a que la gran mayoría de los proyectos se tienen que hacer en equipo por la complejidad de estos y porque, como todos sabemos, vivimos en una sociedad donde una persona no puede hacer todo, si no que tiene que ayudarse de los otros para poder lograr lo que quiere.

Ya declarado que los proyectos tienen que ser trabajados en equipo, se necesitan tanto tiempo como herramientas para poder comunicar el proyecto así como ponerse de acuerdo de el cuándo, dónde y cómo se va a trabajar, como he mencionado antes, la planeación lleva 1/3 parte de el tiempo total del proyecto, por lo que se han hecho muchas herramientas para poder hacer este proceso de manera correcta y con lo mínimo de errores posibles. Estas herramientas ayudan con cada parte de la planeación, por lo que van así:

  1. Ciclos de Vida del Software
PrepInsta, 2019. Page

La primera cosa que se tiene que decidir cuando se va a empezar con un proyecto nuevo es la manera en la cual se va a trabajar, dependiendo del modelo seleccionado es el orden en el que se harán las cosas, por ejemplo, si se va a hacer testing después de cada proceso o solo hasta el final. Los modelos más comunes son los siguientes:

    • Modelo de Cascada
    • Modelo en V
    • Modelo de Prototipos
    • Modelo en Espiral
    • Modelo Ágil
  1. Casos de Uso
Warren Lynch, 2015, Page

El siguiente paso es hacer los casos de uso, estos son diagramas que describen Quién va a usar cada parte de el software, Cómo se va a usar y de Qué manera va a afectar tanto a otros usuarios como a otras partes del software. Esto se hace para poder tener claro lo que se va a hacer, esto se le muestra al cliente para que pueda dar retro alimentación y que el proyecto no vaya por la dirección equivocada.

  1. Lenguajes de Modelado
GeeksForGeeks, Page

Ya que se tienen claras las acciones que el sistema debe de tener, se pasa a la fase del modelado de estas, dependiendo del enfoque del proyecto es el lenguaje que se debe de escoger, esto se debe a que como hay tantos tipos de software es necesario tener diferentes diagramas para poder plasmarlos de manera correcta. Los tipos de lenguajes que más comúnmente se usan son los siguientes:

    • Lenguaje de Modelado de Sistemas
    • Lenguaje de Modelado de Objetos
    • Lenguaje de Modelado de Datos
  1. Patrones de Diseño
Paul Ballard, 2015, Page

Así como se debe de escoger el Lenguaje de Modelado que se va a utilizar en el proyecto, también se debe de escoger el Patrón de Diseño que se va a utilizar, esto se refiere a las mejores prácticas adoptadas por desarrolladores con muchas experiencia en el paradigma orientado a objetos y se hacen para que se pueda seguir su ejemplo. Algunos ejemplos de estos patrones son los siguientes:

    • Patrón de Diseño Creacional
    • Patrón de Diseño Estructural
    • Patrón de Diseño basado en Comportamiento
  1. UML
UML, Page

El siguiente paso es crear diagramas que describan el sistema, de esta manera el grupo de desarrolladores tienen la misma imagen de lo que se tiene que va a hacer cada parte del software así como la comunicación entre ellas. Existen una gran cantidad de modelos UML ya que también hay una gran cantidad proyectos diferentes, y estos tratan de modelar de la mejor manera cada proyecto. Ejemplos de estos diagramas son los siguientes:

    • Diagramas Secuenciales
    • Diagramas de Clase
    • Diagramas de Objetos
    • Diagramas de Estado
    • Diagramas de Paquetes
    • Diagramas de Componentes
  1. De Diagrama a Código

Después de hacer tantos diagramas y tantos dibujitos por fin es la hora para ponerse a programar, ya con los diagramas sabemos qué es lo que tenemos que hacer y basta con solo saberlos leer e interpretar, que aunque suena sencillo, no lo es por el mero hecho de que hay muchos tipos de diagramas. Ya empezando a programar se vuelve diferente el trabajo, esto es lo que hemos aprendido a lo largo de toda la carrera y se supone que sabemos hacerlo de una manera correcta, pero para sacar errores está el siguiente paso.

  1. Revisión de Código
edx, Page

La primera parte para revisar un código y sacar posibles errores que se cometieron en el momento del desarrollo es leerlo por tu mismo un poco de tiempo después, a veces se nos van errores obvios a la primera, pero a la segundo ya podemos verlos y arreglarlos.

La segunda parte es poner a un compañero a leer nuestro código, esto ayuda a que una persona con otra perspectiva pueda ver posibles errores, así como verificar que tu código pueda ser entendido por otra persona que no tiene el contexto que uno tiene, así verificando que nuestro código se pueda leer y de esta manera que sea escalable para otras personas, lo peor que puede pasar es que al momento de que se quiere cambiar un código, ya sea para crecerlo o porque los requerimientos cambiaron, este solo pueda ser cambiado por la persona que lo escribió, que es muy posible que ya ni trabaje en el mismo lugar.

La última parte es ya se podría decir la última alternativa, se hacen pruebas automáticas como si fuera un usuario y se hace una prueba de estrés al software para ver si es que puede llegar a fallar, si falla se tiene que corregir antes de que se entregue al cliente.


Después de haber tomado esta y otras clases parecidas me doy cuenta de la importancia de primero modelar lo que se va a hacer antes de querer ponerse a programar, uno dice, en la escuela primero nos ponen a programar así que lo primero que deberíamos de hacer es programar. Por esto considero que en la carrera las primeras clases que deberíamos de ver son estas, de esta manera nos enseñarían que primero debemos de tener claro lo que queremos hacer antes de ponernos directamente a la acción, esto evitaría muchos errores y nos ayudaría a ser mucho más ordenados, ya que actualmente lo que nos enseñan es primero programar y esto lleva a veces que no tenemos claro lo que haremos y nos tardamos más en las cosas que nos piden, así perdiendo el tiempo.

Testing en Software Orientado a Objetos

Uno de los paradigmas más comúnmente usados en estos días es el de Orientado a Objetos, este es muy común debido a que en sí es el más nuevo y el que más se enseña, ya que este está hecho para que se facilite el mantenimiento de los sistemas de software al hacerlos modulares, permitiendo que se pueda cambiar un elemento del sistema sin tener que hacer ningún movimiento a los demás elementos, ya que estos están divididos y se mantiene una estructura común.

Una de las partes importantes de un proyecto de desarrollo de software es probar que todo funciona como debería y cuando debería, a esto comúnmente se le llama por su nombre en inglés testing, se hacen estas pruebas para poder cerciorarse de que el sistema cumpla con los requerimientos establecidos en la documentación, entre otras cosas.

Como se he dicho anteriormente, hay muchos tipos de sistemas de software y dependiendo del sistema es lo que se tiene que hacer en cada proceso, en este post me enfocaré solamente en Software Orientado a Objetos y específicamente en el proceso de testing de este. Este se puede dividir en tres niveles que son:

Minigranth, Page
  • Testing de unidad: este se refiere al testing de las clases individuales, que los atributos estén implementados conforme a la documentación, así como que los métodos no tengan errores, es el nivel más bajo de la jerarquía.
  • Testing de subsistema: este se refiere al testing de módulos o subsistemas, los cuales están formados por grupos de unidades, también se tiene que probar la comunicación de este subsistema con otro.
  • Testing de sistema: este se refiere al testing de la unión de todos los subsistemas, este ya va enfocado en la funcionalidad total de los requerimientos, este paso es el más tardado por lo que se hacen equipos especializados para este.

El punto de dividir este proceso es que en el primero se resuelvan todos los errores que se presentan, pero como esto rara vez pasa, el siguiente paso se encarga de esto, haciendo así un sistema de tres filtros para que los errores no lleguen al cliente y el producto pueda ser entregado de manera satisfactoria.

Si se quiere saber más del tema, ya que este es muy extenso, incluyo un libro que habla sobre esto, aunque hay más de uno en el que se puede encontrar información debido a la importancia de este. Libro

Verificación y Validación

El proceso de desarrollo de software es muy variable, depende tanto del tamaño del proyecto como del enfoque de este mismo, por lo que el desarrollo no va a ser igual un proyecto que otro, pero hay varias cosas que definitivamente aplican para todos los proyectos, ya que estas no se enfocan en el tema del proyecto ni en algo muy concreto que se tiene que hacer, si no que manejan las partes generales del proyecto. Estas se deben de adaptar a cada proyecto, pero en sí el proceso va a ser muy parecido. Unas de estas cosas son la verificación y validación de software.

Para poder abordar este tema primero se tiene que definir lo que es verificación y validación, así como sus diferencias, ya que se suelen confundir. Primero se debe de declarar que estas dos forman parte de el testing de un sistema de software, por lo que se hacen pruebas de calidad, entendiendo esto podemos ir a las definiciones:

  • Verificación: este se refiere a las pruebas que se le hacen a un sistema en el proceso del desarrollo para poder comprobar que pase los requerimientos de la fase de trabajo.
  • Validación: este se refiere a las pruebas que se le hacen a un sistema cuando ya está terminado y listo para entregarlo, se prueba que se cumplan los requerimientos del cliente y no se haya hecho un proyecto que no cumpla a la totalidad lo que haya pedido al cliente o lo que se haya acordado en el contrato.
April 19, 2018, Page

Después de definirlas nos podemos dar cuenta que ambas son completamente necesarias, ya que si son muy diferentes, pero se complementan, la verificación se necesita para darse cuenta que se va en la dirección correcta en el proceso y la validación se usa para comprobar si es que al final de todo el proceso en verdad se llegó a la meta esperada, si no se llegó se tendrán que hacer varios cambios en el proyecto hasta que esto se cumpla.

Por las diferencias en estos, se usan diferentes herramientas para evaluarlos:

  • Verificación:
    • Revisiones
    • Inspecciones
    • Ir paso a paso
    • Reuniones
  • Validación:
    • Testeo de caja negra
    • Testeo de caja blanca
    • Testeo de caja gris
    • Testeo de aceptación

Como se puede ver con el uso de las herramientas la verificación se puede hacer por las mismas personas que están desarrollando el sistema, mientras que la validación se tiene que hacer por un equipo especializado de testing, haciendo este proceso más largo y con mayor capacidad de detectar errores que se pudieron haber pasado por alto en la verificación.

Tanto la verificación como la validación son herramientas que no pueden faltar en el proyecto, ya sea grande o pequeño, ya que gracias a estas se comprueba que se haya hecho el trabajo como se debe y no que por un mal entendido se hiciera una cosa completamente diferente o que tenga detalles que pueden afectar al cliente y este no quede satisfecho con el trabajo.

Revisión de Código

Mind Bowser, Page

Como lo he dicho anteriormente, se tienen buscar escribir código de la mejor manera posible por varias razones, para que este pueda ser escalable, para que se pueda aprender de tu código, o simplemente para que se ve “bien”, al final de cuentas estas razones se traducen en para que pueda entenderse por otras personas que no saben en lo que estás o estabas pensando. Se siguen patrones de diseño para que puedan ser legibles desde un principio.

Como a todos nos ha pasado, escribimos lo que pensamos en el instante para que no se nos vaya al “inspiración”, pero esta técnica nos hace dejar de pensar en los patrones de diseño o escribir las cosas de manera errónea con tal de hacerlo rápido y que no se nos vayan las ideas, esto pasa en todos los ámbitos, un ejemplo es como le pasa escritores famosos y su técnica es grabar lo que quieren escribir y después transcribir a papel sus ideas. Pero como a nosotros se nos podría llegar a dificultar el grabar nuestras ideas por el hecho de que la programación puede llegar a ser bastante abstracta, se tiene otra técnica de que después de que escribimos nuestro código, que sea revisado.

Como se dice, uno ve los errores de otro, pero nunca los propios. Por esto es conveniente que para poder buscar errores en código o una optimización de estos, lo haga otra persona que pueda ser crítica en cuanto a los errores, esto tiene muchas ventajas, una de ellas es que como la persona no está completamente metida en el tema, tiene que entender lo que se trata de hacer desde un principio y ver como lo maneja la persona que está programando.

Revisar el código después de escribirlo puede ser de gran ayuda, puede evitar que tengamos memoria desperdiciada, código muerto, que estemos usando una estructura que no es la más eficiente en nuestro código y por lo tanto que tenga errores que se pueden evitar con otras, así como otros errores que se pueden evitar fácilmente.

Vaidehi Joshi, 2017, Page

Como esta práctica se ha vuelto común se pueden encontrar estas prácticas para facilitar la tarea y hacerla más eficiente:

  • Revisa aproximadamente 400 líneas de código.
    • Estudios han revelado que se deben de revisar entre 200 y 400 líneas de código en una sola vez, después de este punto el cerebro no puede analizar de manera correcta el código ya que no puede analizar tanta información a la vez y es posible que haya errores que no se vean.
  • Haz rachas de 60 minutos máximo.
    • Después de este tiempo el cerebro no se puede enfocar en la misma cosa, es mejor levantarte y relajarte y después seguir.
  • Da feedback que sirva, no que lastime.
    • Da un feedback constructivo, cómo se pueden mejorar las cosas, no solo apuntes los errores y digas que no funciona esa parte.
  • Pregunta al autor
    • No siempre es fácil entender lo que se trata de hacer, a pesar de usar las mejores prácticas para esto, hay proyectos tan complejos que simplemente no permiten esto y se tiene que preguntar.

Para finalizar estas técnicas son para poder ayudar a los demás con el código que escriben, por lo que me gustaría dejar en claro que aunque no se quiera trabajar en equipo, este es muy importante y pocas veces es posible trabajar solo, lo que si es que en estos casos pueden criticar lo que haces, pero es para poder mejorar lo que cada quien hace, ya que se busca poder dar el mejor producto final y no humillar a otro por lo que hizo.

Project Delivery 2

Team Name: The Three Amigos (Team three)

Project Name: Proper Course Selection

Interviews:

Student 1:

  1. What do you think about the current course selection system?

It is an old system that to be updated immediately.

  1. Could you think about some pros about it?

It gets the job done, even if some people don’t like the way it is done.

  1. Could you think about some cons about it?

There are courses where you need a laboratory for it, but sometimes you can’t get one.

  1. Do you think a change is necessary?

Yes

  1. What would you change about it?

I would change the size of the classes to fit more people in the same schedule, make them lectures.

  1. Could you think about a time when you struggled with the system?

One time I needed to be in one super specific course and when I had to make my schedule the course was full and there was not another professor to choose, I needed to talk with my director to try and get in.

Student 2:

  1. What do you think about the current course selection system?

I think the system can be improved,. It can be a little glitchy and i hate when you try to access a course and it has been filled up, you have to reload the page and you lose all the courses you selected.

  1. Could you think about some pros about it?

It shows the courses in an interface.

  1. Could you think about some cons about it?

glitchy 

  1. Do you think a change is necessary?

It can be improved

  1. What would you change about it?

The UX, it has a poor interface, also the way it tells you when a course is full.

  1. Could you think about a time when you struggled with the system? 

This semester, when i tried to do my schedule, I tried for 3 hours but the system kept dumping me.

Student 3:

  1. What do you think about the current course selection system?

It works well most of the time, but many semesters I couldn’t even choose between more than 2 possible combinations between all my classes, and the turn selection it’s honestly a mess.

  1. Could you think about some pros about it?

It works well when you choose the schedule as the web page never goes down that day.

  1. Could you think about some cons about it?

You take hours waiting, the day you take your turn and it would be nice for the classes to be better synchronized with each other.

  1. Do you think a change is necessary?

Yes

  1. What would you change about it?

The turn picking day system.

  1. Could you think about a time when you struggled with the system? 

3 out of  5 semesters.

Professor:

  1. What do you think about the current course selection system?

We don’t have a system to ask for a schedule, we just receive our schedule without giving any information about when we have free time.

  1. Could you think about some pros about it?

The system gives us a schedule with the classrooms for them, even if we need a special laboratory. 

  1. Could you think about some cons about it?

The system doesn’t take our schedule.

  1. Do you think a change is necessary?

Yes

  1. What would you change about it?

The ability to choose a classroom and preferred hours of the day 


Questions

  • What did you learn about the project with these interviews?

That even when this system is not perfect it is good for now, but someone needs to start working in a new one to address all the problems that the students or professors are facing right now.

  • What did you learn about the process of interviewing?

That we always need to know the opinion of all the people involved in the problem to get their point of view that maybe we don’t have because we can’t see through their eyes, this opinion is super important to know because it could take the project to a new direction or to restate that the direction we are taking is the best one.

  • If you did more than one interview, how did you change for the other interview(s)?

It really changed a lot what one person told us compared to what told us another one because the experience between them are different, one person could get a good experience because he/she got an earlier time to make their schedule.

  • If you did another interview now, what would you change about the process?

We would change the questions for the professors because we didn’t know that they don’t have an automatic system to choose their schedule but their directives have the power to choose their schedule.

  • What do your use cases look like now? Did you have to remove some, change some, add some?

They changed by making from zero the professor part, and have an option to make them choose when they can give a course.

Reflexión Parcial 2

En este parcial de la materia de Análisis y Modelación de Sistemas de Software he aprendido la necesidad de poner en práctica el uso de herramientas para el modelado de requerimientos, ya que como los requerimientos suelen ser la parte más importante de un proyecto se han puesto a la disposición de todos una gran cantidad de herramientas para poder facilitar y estandarizar este proceso, con el objetivo de que en los proyectos, como la gran mayoría de veces son un trabajo en equipo, no se tenga que desperdiciar tiempo valioso explicando la representación de los requerimientos, en cambio, que sean sencillos de entender por todos.

Entre estas herramientas se encuentran los diagramas UML, estos son muy conocidos porque se lograron estandarizar en la práctica y se enseña en las universidades la importancia de estos, así como la forma de usarlos, por experiencia propia llevo 4 clases en las que mínimo se enfocan en un tipo de diagrama aproximadamente 3 semanas, ya que explican desde qué significa cada componente del diagrama hasta qué es lo que deben de llevar en cada parte. En una clase completa que uno no pensaría que se tiene que ver ese tema (Programación Orientada a Objetos) mis exámenes eran diagramas de clase UML que yo tenía que pasarlos a código, esto con la intención que no saliéramos al campo laboral sin la experiencia necesaria para poder empezar a trabajar. Por lo que a mi si me hizo ver la importancia de estos y me ha ayudado a lo largo de mi carrera y espero que también en mi vida profesional.

  • Patrones de Diseño

De la misma manera que hay diagramas estandarizados para que la mayoría de la gente pueda entender los requerimientos, se han implementado patrones de diseño para el desarrollo de software, aunque estos no son tan comunes como los de requerimientos, estos tratan de normalizar el desarrollo de software al dar las mejores prácticas adoptadas por desarrolladores con mucha experiencia, por lo que se busca seguir estos patrones para que de esta manera cuando se escribe un código pueda ser entendido por otras personas tiempo después sin que se tenga que contactar a la persona que escribió este código. Esto se hace con el pensamiento de que el software es escalable dependiendo de las necesidades de quien lo usa y que no siempre la misma persona que escribió el código va a poder seguir editandolo, si no que otra persona pueda llegar y sin problemas agregarle a este. Por lo que los patrones más conocidos son los siguientes:

  • Patrón de Diseño Creacional
  • Patrón de Diseño Estructural
  • Patrón de Diseño basado en Comportamiento
  • UML
UML, Page

Como decía, UML es una herramienta muy importante ya que es muy bien reconocida y enseñada por las escuelas a los nuevos desarrolladores con la esperanza de que estos adopten esta herramienta y la puedan usar de manera eficiente, se escogió esta herramienta por la versatilidad que tiene, la gran cantidad de diagramas que maneja y facilidad de entendimiento de estos. El desarrollar software no es una sola cosa que se puede aprender de un día para otro o de un año para otro, ya que este se divide en tantos tipos que si me pongo a listarlos se necesitaría más que un solo post como este, si de por si está dividido en grandes secciones como Bases de Datos, Paradigmas de Programación, entre otros, estos tienen sub categorías y dentro de estas aún más hasta irse a los casos muy específicos.

Para esto nos ayuda UML con su gran cantidad de diagramas y herramientas que maneja y en mi experiencia he encontrado una herramienta muy útil, fácil de usar y que permite trabajar colaborativa mente en tiempo real, esta es LucidChart que ofrece una breve explicación de cada diagrama y las herramientas para poder crearlo. Pero ya yéndonos fuera de la creación de estos, hay muchos tipos de diagramas dependiendo de lo que se quiera desarrollar, siendo los más conocidos estos:

  • Diagramas secuenciales
  • Diagramas de clase
  • Diagramas de objetos
  • Diagramas de estado
  • Diagramas de paquetes
  • Diagramas de componentes
  • Diagramas de entidad relación
  • Diagramas de casos de uso
Tipos de, Page
  • El siguiente paso de los diagramas

Todos como desarrolladores la que pensamos primero cuando decidimos empezar a estudiar programación fue que estaríamos frente a una computadora escribiendo código ya sea de lo que nos pidieran o de lo que quisiéramos, en lo personal no me calló bien que me dijeran que primero se tienen que hacer diagramas y dibujitos para poder saber qué es lo que vas a hacer, se me hacía completamente innecesario tener que hacer estas cosas, yo pensaba en solo programar y hacer que las cosas funcionaran de una manera u otra, pero después de haber estudiado tanto por fin entiendo que si son completamente necesarios los diagramas y dibujitos, pero me preguntaba hasta cuando podría regresar a programar, pues este es el momento.

Después de desarrollar un diagrama para poder tener claros los requerimientos y la forma en la que se van a hacer las cosas en el equipo de trabajo o de manera individual ya por fin sigue ese momento, la programación, o por lo menos empezar con la estructura de esta, por lo que hay ciertos pasos para pasar de un diagrama a código o tablas, dependiendo de lo que se esté haciendo, tengo dos posts sobre esto que pueden ve aquí De Diagrama de Clase a Código y aquí De Diagrama a Tablas, pero en resumidas cuentas lo que dice es que primero se tienen que entender las partes de cada diagrama y los casos que cada parte representa, para así poder pasarlo a código, se escucha sencillo de hacer, pero en mi experiencia la primera vez no lo es, si no ves algo puede cambiar tu estructura y quedas con cosas que no tienen sentido, pero con la práctica lo puedes hacer hasta en automático sin necesidad de tener un manual junto a ti que te diga que significa cada cosa, todo es cuestión de práctica.


Esta clase me ha hecho darme cuenta que es completamente necesario entender lo que se pide, ya que sin esto se puede hacer una cosa completamente diferente y que como mucha gente ha sufrido con esto, se han creado herramientas y para poder entender de una manera más sencilla y de forma que otras personas también entiendan de la misma manera para que se pueda trabajar en equipo.

También me he dado cuenta de que es completamente necesario trabajar en equipo en la vida profesional, aunque los ingenieros en sistemas somo conocidos como antisociales, que nos encanta estar detrás de un escritorio todo nuestro día sin la necesidad de convivir con gente “real” (siempre por medio de la computadora), esto aunque puede llegar a pasar días que no queremos ver a nadie, es completamente falso ya que es casi imposible, o simplemente ineficiente, que una persona pueda hacer todo un proyecto solo, se tiene que trabajar en equipo todo el tiempo y es más, vemos proyectos tan grandes como Linux que es desarrollado por gente de todo el mundo, donde si una persona encuentra un error al usarlo puede arreglarlo y con eso ya mejoró Linux, pero siempre con la necesidad de estar trabajando en equipo.

La necesidad de trabajar en equipo nos ha llevado a tener que tomar en cuenta todo lo que he escrito arriba, patrones de diseño, para que se pueda entender un proyecto por más de una sola persona y se pueda trabajar de manera eficiente y sin perdidas de tiempo en explicaciones, ya que no podemos evitar que otra persona termine usando lo que ya hemos hecho, mejor empezar con el pie derecho y seguir estas normativas para que todos podamos seguir trabajando con todos.

De Diagrama de Clase a Código

Se han hecho herramientas poder tener una imagen clara de lo que se quiere hacer antes de poder ponerse a programar. Ya que primero se debe de hacer un diagrama de lo que se pide en el proyecto para poder entender lo que pide el cliente y poder ver claramente como se debe de abordar la situación, cuales herramientas se van a utilizar y cómo se va a dividir el proyecto para poder trabajar de una manera más cómoda y conforme a los patrones de la programación.

Para poder leer de una manera correcta los diagramas se debe de tener claro lo que significa cada de las partes que lo conforman, por lo que analizaremos un caso y veremos que significa cada cosa.

Salma, 2017, Page

En este caso primero tomaremos el recuadro superior, este está conformado por tres partes:

  1. Parte superior: esta parte contiene el nombre de la clase y siempre es requerido, no puede llevar otros elementos.
  2. Parte intermedia: esta parte contiene los atributos de la clase, donde primero va el nombre, dos puntos y el tipo de dato que es, se pueden inicializar haciendo uso de un signo de igual antes del valor.
  3. Parte inferior: esta parte contiene los métodos de la clase, se pone uno de los modificadores de acceso y el nombre del método, puede seguir por dos puntos para especificar el tipo de dato que regresa, no se desarrolla nada sobre el método en esta parte.
  • Modificadores de acceso:
    • ” + ” : público
    • ” – ” : privado
    • ” # ” : protegido
    • ” ~ ” : paquete
    • ” / ” : derivado
    • (subrayado) : estático

Aparte de lo que compone cada recuadro también es necesario saber qué significado tienen las flechas que juntan a los diferentes recuadros, ya que estas representan la relación que tiene cada recuadro, por consiguiente, cada clase.

  • Herencia: este es el proceso de que una clase hija o sub-clase tome funcionalidad o datos de la clase padre o super-clase. En este ejemplo la clase carro hereda de la clase vehículo.
UML Class Diagram Tutorial, Lucidchart, Page
  • Asociación: se refiere a que hay una conexión entre estas dos clases, donde también puede haber multiplicidad de la relación entre las clases.
Creately, 2019, Page
  • Composición: es la pertenencia de una clase a otra, con la obligación de que una no puede existir sin la otra, ya que son componentes completamente necesarios.
Aldo Partida, 2018
  • Agregación: es la pertenencia de una clase a otra, pero sin la obligación de que una no puede existir sin la otra.
Aldo Partida, 2018
  • Interfaces: estas son la implementación de las clases abstractas, una clase no puede implementar y heredar a la vez de otras, se tiene que elegir una.
Aldo Partida, 2018

A partir de ya como saber leer los diagramas de clase de UML se puede pasar de manera sencilla de un diagrama a ya el código, empezando con los recuadros a poner los elementos que se especifican como los atributos y los métodos, a partir de esto se puede hace el esqueleto de la clase, se continua con las relaciones entre las clases, para ya al final empezar a escribir el código en cada uno de los métodos.

Es muy importante empezar con los diagramas porque solo se piensa en objetos y en la relación que tienen, dejando al final la programación de las acciones de estos, por lo que al tener claro el diagrama de clases se puede saber qué métodos y atributos son necesarios, haciendo más claro este proceso.

De Diagrama a Tablas

Como hemos visto, es necesario hacer un diagrama con los requerimientos para un proyecto, o por lo menos eso se recomienda, por lo que para crear una base de datos no debe de dejarse a un lado la utilización de un diagrama para poder ordenar los datos que pide el cliente y aparte los que son necesarios para la creación de una base de datos funcional, UML también nos da la herramienta para crear los esquemas necesarios para una base de datos relacional como es SQL.

  • Diagrama Entidad Relación UML
Scott W. Ambler, 2003, Page

Este tipo de diagramas nos permite modelar la información que se tiene disponible para poder hacer tablas de una manera correcta y sin repetición de datos entre varias tablas, ya que esta es una de las más grandes ventajas que tiene la utilización de bases de datos, evitar la redundancia y malgasto de recursos. En este diagrama se especifican los datos que se van a incluir, la llave primaria, la llave foránea, las llaves secundarias si es que hay, la relación entre una tabla y otra así como la relación de cantidad que se tiene entre estas. Lucidchart ofrece una manera fácil de crear estos diagramas en su página.

  • Proceso de diagrama a tablas

Ya que se tiene el diagrama de Entidad-Relación formado se puede empezar a hacer las tablas, se tiene que tomar en cuenta que el diagrama es solo eso y la tabla puede cambiar cuando se está haciendo, ya que se puede descubrir que hacen falta datos o por cambios en los requerimientos, pero estos cambios siempre se tienen que actualizar con el diagrama para poder llevar un seguimiento. Por lo versátil que es este tipo de diagrama se han puesto pasos para no perderse en el proceso:

  1. Por cada entidad fuerte en el esquema, crear una tabla que incluya todos los atributos simples, incluir todos los atributos componentes de un atributo compuesto y escoger uno de los atributos como llave primaria.
Mtra. Ana Delia Esparza Soto
  1. Por cada entidad débil en el esquema, crear una tabla que incluya todos los atributos simples, incluir como atributos de la llave primaria la llave primaria de la entidad dueña y la llave parcial.
Mtra. Ana Delia Esparza Soto
  1. Por cada relación binaria 1:1 escoge una de las relaciones e incluye la llave primaria como llave foránea en la otra, incluye todos los atributos simples.
Mtra. Ana Delia Esparza Soto
  1. Por cada tipo de relación binaria 1:N identifica la relación con del lado N e incluye como llave foránea la llave primaria de la relación con el lado 1.
Mtra. Ana Delia Esparza Soto
Mtra. Ana Delia Esparza Soto
  1. Para cada relación M:N se crea una tabla aparte y la llave primaria se crea a partir de las llaves primarias de las dos entidades y se agregan los atributos de la relación.
Mtra. Ana Delia Esparza Soto
  1. Para cada atributo multivaluado, crear una nueva tabla donde su llave primaria es la composición de la llave primaria de la entidad correspondiente y el atributo.
Mtra. Ana Delia Esparza Soto

A pesar de tener estos pasos que son claros de entender, se pueden tener situaciones que no estén contempladas por estos y se tendrá que ver la manera de poder pasar del diagrama a la tabla, lo que se debe de hacer es juntar los pasos y así poder conseguirlo.

En las bases de datos no relacionales no se tiene un proceso como tal para poder conseguir las tablas, ya que estas bases de datos no son todas iguales, está Cassandra que se parece a las relacionales, está MongoDB que es completamente diferente, por lo que este proceso va a depender de la base de datos que se vaya a utilizar y del diagrama que se esté utilizando, ya que unos serán mejores para la base de datos elegida.

UML Parte 2

Este post es la continuación sobre lo que es UML, para qué nos sirve y la manera de utilizar los modelos más usados que tiene esta herramienta para organizar las partes de un proyecto en cuanto a sus requerimientos así como la estructura del código que se tiene planeado implementar, por lo que se pueden ver una explicación más detallada así como los otros modelos en mi post anterior.

Ya al dejar en claro que esta es la segunda parte de un post, pasamos a los demás diagramas que se quedaron pendientes, también incluiré una liga a la herramienta Lucidchart para una explicación más completa y la misma herramienta donde se pueden crear estos esquemas.

  • Diagramas de Estado
Agile Modeling, Page

Este tipo de diagramas se puede relacionar con las máquinas de Moore, estas se refieren a la parte de electrónica de dependiendo de la entrada y del estado donde se esté es la salida que se va a tener y el estado al que va a llegar, se podría ver como en una máquina expendedora, que depende de la cantidad de monedas que hayas insertado se pueden hacer disponibles ciertos productos para comprar y ya dependiendo del dinero disponible y del cambio que haya en la máquina se ve la cantidad de monedas que la máquina va a dar al usuario, si se quiere aprender más de las máquinas de Moore puede ir a esta página.

Moore State Machine, Simon Holt, Desing Spark, Page

En UML estos diagramas presentan la interacción del usuario u otro sistema con el sistema a desarrollar y se tomar en cuenta tanto las entradas al sistema como la parte de ejecución de donde se encuentra el sistema, llamando a estos los estados. De esta manera se puede saber cada paso que tendría el usuario al interactuar con el sistema y qué implica cada uno, para así poder anticipar errores que pueden llegar a suceder. Otro aspecto muy importante es que se tiene un estado inicial y un estado final, los cuales siempre tienen que suceder para poder concluir como exitosa la ejecución. Página de Lucidchart.

  • Diagramas de Paquetes
Agile Modeling, Page

Estos diagramas se usan para poder organizar los diagramas de clases, de casos de uso, de estado, entre otros en paquetes, para así poder tener un mejor manejo de un proyecto muy grande, ya que se puede ver como tener separado los proyectos en carpetas como separamos nuestros archivos en nuestras computadores, además de permitir la separación de proyectos muy grandes, puede ayudar a que se tengan claros los límites del proyecto y a tener una separación entre clases para que puedan ser lo más independientes posible entre ellas. Página de Lucidchart.

  • Diagramas de Componentes
Lucidchart, Page

Estos diagramas son como los anteriores, donde se hace la separación de las partes del proyecto para que sea más fácil de entender, pero este se centra en los proyectos que están orientados a componentes, los cuales se refieren a la forma de organizar el proyecto donde se hace por componentes que unidos hacen el sistema completo, se hace de esta manera para facilitar un cambio de algún componente y que el sistema no sea afectado por completo ya que se ponen entradas y salidas estándar que cada componente debe de seguir. En conclusión estos diagramas organizan los sistemas en componentes y se establecen las entradas y salidas de cada componente a otro. Página de Lucidchart.

Al haber presentado esta pequeña cantidad de diagramas se puede ver que hay más de uno para cada enfoque para un proyecto, pero existen más diagramas, ya sea unos más especializados para una situación que otros, así como hay diagramas que usan de manera más general y aplican en muchos escenarios. El punto de esto es que en verdad se tienen que usar diagramas para la planeación de un proyecto, y no se pueden poner pretextos de que los que existen no son los indicados para el proyecto, ya que hay una gran cantidad de estos y aún más, hay herramientas que te ayudan a entenderlos y a saber cómo hacerlos de manera correcta.

UML Parte 1

UML, Page

Como he comentado en posts anteriores, en el proceso del desarrollo de software el diseño es una parte muy importante y completamente necesaria sin importar el tamaño del proyecto que se tenga que hacer, ya que este ayuda con el manejo de la complejidad de proyectos extensos, pero a su vez es necesario para proyectos pequeños. Se ha hablado de la gran cantidad de herramientas que existen que facilitan este proceso, pero la más importante, con mayor alcance y la más predominante en el área es UML (Lenguaje Unificado de Modelado por sus siglas en inglés).

Al haber tantas herramientas que se pueden usar se llega a la discusión entre las personas que quieren usar uno y las otra que quieren usar otro, por lo que la utilización de UML ha hecho que esto sea cosa del pasado, se ha llegado a este acuerdo debido a las siguientes razones:

Se ha adoptado de manera positiva y general el uso de UML ya que este incluye diagramas los cuales modelan la información más importante para el desarrollo de un proyecto, por esto mismo se puede pensar que son diagramas complejos y difíciles de entender, pero por lo contrario, son fáciles de entender y de plasmar la información en ellos, la cual es otra razón por la que son tan usados. Y la ultima razón es el gran alcance que tiene UML, al tener una gran cantidad de diagramas para el modelado de los proyectos.

Este tema se va a dividir en dos partes debido a la gran cantidad de diagramas que ofrece UML y el uso de cada uno, por lo que presentaré 3 diagramas en este post y otros cuantos en el siguiente.

La página Lucidchart es una gran página para la creación de diagramas UML, ya que ofrece la plantilla así como la explicación de cada diagrama, por lo que después de cada tipo incluiré una liga por si se quiere conocer más sobre el diagrama y la herramienta para hacerlos.

  • Diagramas Secuenciales
GeeksforGeeks, Page

Con estos diagramas se describen las acciones entre los objetos de un sistema, se describe el orden que siguen esta acciones para poder tener una idea clara de lo que se tiene que hacer, así no saltar pasos y tener de una manera ordenada y clara lo que cada objeto produce, recibe, de quien recibe y a quien pasa su producto. Con esto se logra un análisis más eficiente si es que una parte del programa falla o si se quiere hacer un cambio aún después de la implementación de todas las partes del sistema, ya que se puede ver “con lupa” el proceso cuál es el punto donde se debe de hacer el cambio. Página de Lucidchart.

  • Diagramas de Clase
Salma, 2017, Page

Debido a que el diseño de un sistema de software puede llegar a ser muy grande en un principio, he incluso crecer aún más con el tiempo, el diseño de este se debe de dividir para que sea entendido por el personal que está desarrollando el proyecto, ya sea solo por el completo entendimiento o también para poder organizar el proyecto en partes y así poder dividir el trabajo entre varias personas, ya que es poco probable que un proyecto sea hecho por una sola persona. Los diagramas de clase nos ayudan en esta parte al poder modelar las clases necesarias para el proyecto, cuáles son atributos que tiene cada uno, los métodos, así como la comunicación con otras clases, permitiéndonos tener las especificaciones necesarias antes de empezar a programar. Página de Lucidchart.

  • Diagrama de Objetos
Lucidchart, 2018, Page

Estos diagramas pueden llegar a confundirse con los diagramas de clase, pero son diferentes, ya que estos modelan al objeto cuando ya fue creado y ya tiene datos que lo pueden diferenciar de otros, así como la relación que tiene con otros objetos que pueden ser del mismo tipo u otro, mientra que el diagrama de clases solo modela la clase de donde viene al objeto, por lo que este diagrama se puede ver como la instancia de la clase, donde puede haber varios objetos del mismo tipo. Página de Lucidchart.

GeeksforGeeks, Page

En esta imagen se muestra la diferencia entre el diagrama de clase la clase BankAccount y el diagrama de objeto del objeto Account1, donde se muestra que el objeto tiene los mismos tipos de datos que la clase, ya que este sale de la clase, pero ya tiene valores para cada atributo. Así dejando en claro que es una instancia de la clase, de la cual podría haber varias.

Design a site like this with WordPress.com
Get started