Ingeniería de software es mucho más que simplemente escribir código.
Y la idea de este curso es explicarte todo lo que pasa detrás
de cómo funcionan nuestras computadoras.
Recientemente es muy común escuchar cosas como
nadie sabe cómo funciona internet,
nadie sabe cómo se hacen las computadoras,
eso es muy complejo y muy difícil
y nadie solo puede tener en su cabeza
cómo funciona un computador.
Pero eso es mentira.
Las personas que escriben software,
que construyen computadoras,
que crean software,
que crean computadoras,
que construyen redes, que crean internet,
por supuesto que lo saben.
Y este curso te va a enseñar desde lo más alto hasta lo más bajo
los fundamentos de la ingeniería del software.
Arrancando por algo muy fácil.
¿Cómo funciona cuando desde un computador,
cuando desde un laptop,
cuando desde un portátil o desde un desktop,
le envío un email y le llega una persona por un teléfono en un minuto?
Una persona manda un email desde un laptop,
va a la nube por internet y ¡pum!
le llega un teléfono y en ese teléfono aparece una notificación que dice
tienes un email.
Obviamente no funciona así,
la nube no existe,
la nube es el computador de otra persona que no es tuyo
y que está siendo compartido.
Veamos realmente lo que pasa por detrás a extremo detalle
cuando envías un mail.
Tienes un laptop, escribes tu email,
asumamos que lo hiciste en Gmail y oprimes Enter.
En el momento que oprimes Enter,
hay una cosa que se llama una señal del teclado.
La señal del teclado realmente lo que hace
es que en el instante en el que oprimes el botón
manda una señal eléctrica a la tarjeta madre de tu laptop.
Esa señal eléctrica es intervenida por el procesador,
también conocido como CPU.
La CPU es el centro de procesamiento de todo lo que hace tu computador.
Es básicamente un chip especial que procesa señales eléctricas
y operaciones matemáticas.
Es donde se ejecuta el código de programación.
El teclado le dice a la CPU ocurrió algo a través de la tarjeta madre.
La tarjeta madre es una placa electrónica por donde van todas las señales
de todos los dispositivos que funcionan con electricidad dentro de un computador.
Una vez el CPU recibe la señal eléctrica de que la tecla Enter fue oprimida,
la manda a una capa más arriba de la electricidad,
que es donde corre el sistema operativo.
Hay muchos tipos de sistemas operativos.
Asumamos que en este caso el laptop era un Windows.
Entonces Windows, a través de la CPU, recibe la señal de que el teclado fue oprimido.
Windows entiende que existe un teclado y que la señal significa Enter de un teclado
porque Windows y en general todos los sistemas operativos
tienen capas de software diseñadas para entender las señales eléctricas
de dispositivos externos de hardware.
Ese tipo de capas de software se llaman Drivers.
Una vez capturado, hay que enviárselo a alguien para que haga algo.
El sistema operativo entiende algo que se llama el estado.
En el instante en el que yo estoy, ¿dónde estoy? ¿Dónde tengo el foco?
Si estábamos en un navegador en Gmail escribiendo un email y oprimimos Enter,
estamos en el navegador.
Por ende, el sistema operativo sube una capa aún más arriba y en esa capa,
la capa del software en la que corre el sistema operativo,
le envía al navegador la señal alguien oprimió Enter.
Asumamos que ese navegador era Google Chrome.
Google Chrome es un navegador que entiende otra capa de software aún más arriba,
el software sobre el que corre Internet.
Internet normalmente, de cara a los usuarios,
usa algo que nosotros llamamos tecnologías de frontend,
que son HTML, CSS y JavaScript.
Un HTML es el representante del botón enviar
y JavaScript es el que hace algo.
Por ende, primero, el navegador a través de la CPU,
gracias al sistema operativo, representó el botón de enviar.
Pero como nosotros ya sabemos que estábamos escribiendo un email
y que lo único que hicimos fue oprimir Enter,
lo que ahora recibimos es una señal a través de JavaScript,
que significa enviar el email.
Por ende, ocurre algo que nosotros llamamos un evento.
Los eventos son súper importantes.
Los eventos son lo que disparan que algo ocurra en un sistema operativo moderno,
sobre todo en la programación orientada a objetos
y en la programación visual.
Un evento Enter es cuando un botón es oprimido,
cuando una tecla ocurre.
Pero también hay eventos como, por ejemplo, click,
cuando yo le doy click a un mouse.
Si yo tengo un teléfono, tengo el evento touch o el evento tap,
cuando lo toco con mis dedos.
Si estoy en una tablet y agarro la tablet así y le doy la vuelta,
eso es un evento de rotación traído del acelerómetro.
El acelerómetro sería una pieza de hardware dentro de la tablet
que indica la posición respecto a la gravedad de la tierra
con la que el usuario está agarrando la tablet
para que el sistema operativo cambie la representación en pantalla.
Y esto lo recibe el sistema operativo, igual como lo estamos viendo acá,
a través de una conexión con los drivers.
Así funciona casi todo en la programación.
El evento en este caso es el Enter,
y ese evento está pegado a un código de programación
que, como ya mencionamos, es JavaScript.
En el caso de JavaScript,
JavaScript va a tomar todo lo que nosotros escribimos en el navegador
y lo va a encapsular para enviárselo a internet, a la nube.
Pero realmente lo que está pasando por detrás
es que JavaScript usa una cosa llamada un API.
Y seguramente ustedes han escuchado antes este término,
API, Application Program Interface,
y se han preguntado eso qué significa.
Un API o Application Program Interface
es una cosa que usan los programadores
para comunicarse entre sí sin hablar entre ellos.
Es como el dinero.
El dinero es el API de nuestras sociedades.
Todos nosotros acordamos que le íbamos a asignar valor
a un pedazo de papel, a una moneda,
y que el intercambio de esos pedazos de papel o de esas monedas
iba a significar algo.
Si yo te doy 29 dólares,
tú me das todos los cursos de Platzi por un mes.
Eso es similar en el mundo de la programación.
Los navegadores le dijeron a los programadores,
nosotros vamos a crear un API que se llama AJAX.
Que, por cierto, si se quieren ir súper técnicos,
AJAX internamente significa
Asynchronous JavaScript and XML.
Y todo lo que tiene que ver con AJAX
lo aprenden en el curso definitivo de JavaScript.
El navegador le dice a los programadores,
con AJAX ustedes le pueden enviar cualquier cosa que quieran
a un servidor en internet sin necesidad de recargar la página.
Ese es nuestro API.
Igualmente, hay muchos APIs. Por ejemplo,
Twitter les puede decir, yo les doy este API
para que ustedes programen una aplicación de software
basada en lo que quieran que escriba tweets.
O también puede existir un API de Stripe
para poder cargar con tarjetas de crédito.
Tú me mandas a través de AJAX,
o a través de cualquier forma, puede ser muchas otras formas,
los datos de una tarjeta de crédito
y mi API los captura y los procesa.
Hay muchos tipos de APIs.
En este caso, vamos a usar múltiples de ellos.
Así que arranquemos por explicar AJAX.
AJAX es Asynchronous JavaScript and XML
y lo que realmente significa es,
voy a tomar todos los datos que yo escribí como usuario,
los voy a encapsular y se los voy a enviar al servidor.
Una tecnología llamada AJAX lo puede lograr.
Y eso es un API.
¿Cómo los encapsula? Hay muchas formas.
Esas formas se llaman formatos de archivo.
Cuando ustedes guardan un JPG, que sería una imagen,
ese es el formato de un archivo, JPG.
Cuando ustedes guardan un archivo de Word,
usan un formato de archivo llamado.doc,
o.doc, en los Office más modernos es.docx.
Cuando se transfiere información por Internet,
hay muchos formatos.
Uno que se llama HTML, otro que se llama XML,
y uno de los formatos más populares de nuestra época
es conocido como JSON.
JSON significa JavaScript Object Notation.
Para este curso no tienen que preocuparse por ello,
pero existe este formato.
Lo que hace AJAX y Java Escribe es que encapsulan
los datos del usuario, en este caso un e-mail,
en JSON y los envían por AJAX.
Pero ¿dónde lo envían? Lo envían a un servidor.
Y la forma de enviarlo al servidor es a través de
un protocolo preestablecido de envío de datos.
Ese protocolo normalmente es conocido como un API REST.
REST es una técnica para enviarle datos al servidor.
Eso es todo lo que es.
Por ahora no tenemos que preocuparnos de los detalles.
¿Y por dónde se envía?
Porque tiene que haber un camino por el que enviarlos,
un tubo, el tubo por el cual viajan.
Eso normalmente en Internet y en general en la computación
se llaman protocolos.
Y existe un protocolo de transferencia de hipertexto.
Ese protocolo se llama HTTP.
Entonces, una vez le doy Enter,
hay un evento que se dispara en el navegador
que a través de Java Escribe encapsula los datos
en formato JSON y usando AJAX los envía
a un API REST del lado del servidor
que se transmite por HTTP.
HTTP es muy interesante porque es como funciona Internet.
HTTP es eso que está al principio de todos los sitios web.
Así que ahí vamos a otra capa, la capa de Internet.
En esa capa, ustedes saben que existen direcciones.
Ustedes entraron a una dirección para ver este curso,
platzi.com.
Imaginemos que hay un lugar llamado gmail. com
slash enviar mail.
Las URL están compuestas de múltiples partes.
La primera de ellas es el protocolo a través del cual
yo estoy transmitiendo la información.
HTTP, HTTPS, FTP.
Hay muchos tipos de protocolos.
HTTP significa Hypertext Transfer Protocol
o protocolo de transferencia de hipertexto.
Es el protocolo a través del cual funciona Internet.
Pero si envías archivos grandes,
probablemente vas a usar en algún punto
un protocolo llamado FTP, File Transfer Protocol,
que está un poco obsoleto, pero todavía existe.
Cuando quieres controlar de manera remota un servidor
a través de una consola de texto, como un hacker,
tú usas algo llamado Telnet si vives en el pasado distante.
O en el mundo moderno usamos un protocolo llamado SSH,
también conocido como Secure Shell.
Cuando descargas distribuciones de Linux
u otros archivos de manera masiva, peer-to-peer,
usas un protocolo llamado BitTorrent.
Y BitTorrent es el mismo protocolo que usa, por ejemplo,
Blizzard para actualizar sus juegos,
como StarCraft, Warcraft, WoW, Overwatch, etc.
Y también es un protocolo usado para transmitir
la información de juegos multiplayer.
Hay muchos protocolos.
Y el protocolo fundamental de Internet,
por donde se mueve HTML, CSS, JavaScript,
AJAX, JSON, los APIs REST, se llama HTTP.
Y a veces tú encuentras una S enfrente.
Y esta S es súper importante,
porque la S significa que el protocolo va cifrado,
va encriptado.
Significa que del lado del servidor
se envió una llave y esa llave encriptó la conexión
para que solo tú y el servidor la vean
sin que nadie más la intervenga.
Hay un ataque muy común en el que hay personas
que intervienen en las conexiones de Internet
mientras están viajando.
Porque una conexión de Internet no viaja en línea recta.
Lo vamos a ver en un segundo.
La razón por la que existe HTTP seguro
es precisamente para evitar ese caso.
Luego encontramos el dominio.
Esto que ustedes ven acá que dice gmail.com.
El dominio es muy importante,
porque el dominio es el nombre
con el cual nosotros encontramos en Internet al servidor.
A él se llega a través de algo llamado DNS,
de lo que vamos a hablar en un segundo.
Y al final, como ya llegamos al servidor,
tenemos que saber qué instrucción mandarle.
Así es como ustedes encuentran sitios como
platzi.com.login para entrar a Platzi,
platzi.com.clases para ver todos los cursos que tiene Platzi
o platzi.com.agenda donde está toda la lista
de los cursos nuevos, clases en vivo,
clases grabadas, y lanzamientos que nosotros tenemos.
En el caso de Gmail, probablemente existe una URL
por este estilo y a veces son mucho más complejas.
El URL puede ser por ejemplo
send, un código increíble,
signo de interrogación, ampersand, etc.
a menos de que estés aprendiendo a ser un programador de backend.
Por ahora, solamente tienes que recordar que lo que va después del slash,
después del dominio, es la instrucción dentro del servidor.
Y esa instrucción es la que está directamente conectada
DNS, significa Domain Name Server, o servidor de nombres de dominio.
Como les mencioné hace un rato, gmail. com es un dominio.
Pero internamente, Internet no funciona así.
Internet funciona con direcciones IP, igual que en el mundo real,
ustedes dicen calle 128, carrera 16.
O como ustedes dicen, yo vivo en la casa 26 de la calle Obregón,
en la Ciudad de México.
Espero que nadie viva ahí.
Eso también funciona en Internet.
Los nombres luego se convierten en IPs, en direcciones exactas,
que es donde están los servidores.
Hay una serie de servidores globales, que es un proceso común
en el cual todas las personas de Internet y todos los países colaboran,
llamados DNS.
Es una base de datos gigantesca, que básicamente, internamente tiene esto.
Una IP, una dirección única en Internet, equivale a un nombre.
Si ustedes quieren saber a qué IP equivale un nombre en sus
computadores, es muy fácil.
Abran una terminal.
En Windows se hace haciendo la tecla Windows X y eligiendo Command Prompt,
o la terminal de comandos, o el PowerShell.
En Mac se hace buscando una aplicación llamada Terminal.
Y en Linux, ustedes saben mejor que yo.
En cualquiera de estos sistemas operativos, hagan este experimento.
Busquen, una vez lo hayan abierto, escriban este comando tal cual.
PING, en minúscula.
Espacio.
Google.com.
Les van a salir muchas cosas, pero una de esas cosas que les va a salir
una vez le den Enter, es una IP, que puede ser algo así como
xxx.xxx.xx.xx.
Y esto, las IPs, son direcciones de Internet donde está alojado Google.
El caso de Google es especial, porque lo más probable es que a ustedes
les salgan direcciones IP diferentes.
Google es especial porque Google depende del país donde ustedes intenten abrirlo,
va a cambiar la IP para buscar un servidor más cercano a tu país.
Si lo abres desde México, desde España, desde Japón,
vas a tener direcciones diferentes.
Esto es para tratar de ser más rápido.
Una vez encontrada la IP, yo lo que hago es mandar la petición al servidor.
El servidor puede ser una serie de computadores o un computador gigantesco,
donde normalmente es donde se ejecuta el código real con el que está escrito
Gmail.
Gmail es famosamente escrito en un lenguaje llamado Java.
Pero para llegar a Java, tenemos que pasar por varias capas antes de eso.
La primera capa es el sistema operativo.
El sistema operativo que corre un servidor es Linux.
Linux tiene drivers que le permiten conectarse a la electricidad del cable
de red.
La electricidad del cable de red, a través de una serie de routers,
switch, que son los que transmiten esta información de la IP,
son los que le dicen al servidor, mira esta electricidad,
haga lo que usted pueda hacer con ella.
El driver reinterpreta la electricidad en una capa de red.
Eso es lo que nosotros conocemos como Ethernet.
Ethernet envía esta señal a Linux.
Linux la convierte en datos.
Esos datos están encapsulados en un súper protocolo llamado TCPIP,
a través del cual se transmite todo sobre internet.
Luego, TCPIP crea los datos hacia el protocolo HTTP,
que es la forma en la que los navegadores se conectan.
HTTP es recibido por un servidor de HTTP dentro de Linux.
Uno de ellos es Nginx y otro de ellos es Apache.
Asumamos que alguno de esos corre internamente dentro de este
servidor.
Los servidores a nivel de software son aplicaciones que corren en
el sistema operativo.
En este caso de ejemplo, es Linux.
Y en ese sistema operativo, yo agarro HTTP,
agarro las señales que me llegan, como JSON, como HTTP,
como cualquier otra cosa que me mandó un navegador y las
proceso.
Pero el servidor no las procesa.
Las procesa el código de programación que yo programo.
Típicamente, el código de programación está hecho en
lenguajes como Java, pero también existen otros
lenguajes, como por ejemplo, existe PHP, existe Python,
existe Go.
Hay muchos lenguajes de programación que existen,
que corren del lado del servidor.
Y estos lenguajes lo que hacen es procesar los datos.
Aquí el lenguaje sabe que se le envió la orden de enviar un
email, porque el lenguaje también recibe la URL completa.
Esta URL que nosotros llamamos enviar email.
Por ende, con esos datos, sabe cómo enviarlos.
Y una de las primeras cosas que hace es mandar esto primero a
guardar a una base de datos.
Digamos que están usando MySQL.
Dudo eternamente en el alma que Google use MySQL como la base
de datos para guardar datos en Gmail.
Pero es una de ellas.
También existen otras bases de datos, como Oracle,
como Postgres, entre muchas otras.
Curiosamente, Google ha inventado sus propias bases de
datos.
¿Por qué se guardan una base de datos?
Porque ustedes van a querer acceder al archivo de esos
mails, ¿verdad?
Y necesitamos acceder de una manera estructurada en el
futuro.
Lo siguiente que hacemos es enviar el mail.
Y los emails tienen su propio protocolo y se envían con sus
propios servidores.
Para enviar ese email a internet en general,
tenemos que usar un servidor de correo.
El servidor de correo viene en la petición.
Entonces, digamos que estamos mandándole un mail a
cursos.platzi.com.
Y los mails funcionan muy similar a enviar una petición
web.
Tienen un dominio y a través de ese dominio yo sé cuál es la
IP a la cual me voy a conectar para mandar el correo.
Y luego tienen un nombre.
Y esa es la casilla de correo al que yo voy a enviarle mi
email.
Los emails normalmente funcionan con un protocolo diferente
HTTP.
Ese protocolo se tiende a llamar SMTP y POP.
Uno es de envío y otro es de recepción.
En el mundo moderno, los emails ya no funcionan tan fácil.
Hay muchas más cosas detrás.
Existen una cosa llamada llaves de Kym.
Existen verificaciones de SPF.
Existen listas blancas, listas negras, honeypots.
Los emails son un lío gigantesco y nadie debería estar
montando su propio server de correo.
La realidad es que como muchos corremos nuestros propios
correos en Gmail, Gmail nunca pasa por estos protocolos.
Simplemente se mantiene en la base de datos,
hace un cambio y luego manda las notificaciones sin pasar por
los protocolos innecesarios.
¿Por qué? ¿Para qué?
Pero cuando yo tengo que conectarme con otros servidores,
de todas formas debería hacerlo a través de los protocolos.
Y asumiendo que Platzi tiene sus propios servidores,
son estos protocolos, sumado a los otros protocolos nuevos que
existen para enviar correo, los que se conectan a un servidor
final.
Y con esto estamos llegando a la última etapa del envío del
mail.
Platzi puede tener un servidor de email y el servidor de email
no necesariamente es el mismo servidor de HTTP o es el mismo
servidor de otros protocolos.
Se pueden tener múltiples servidores diferentes.
Digamos que el servidor de email de Platzi corre Mac OS Server,
que no se lo recomiendo a nadie en esta época, pero que se
puede.
Ese sería el sistema operativo del servidor y funciona igual
que mandarle el mail a Gmail.
Llega un ADN, se cambia un IP, se conecta un protocolo,
el protocolo se conecta por una electricidad,
la electricidad luego es interpretada por un driver,
el driver le conecta al sistema operativo el mensaje,
el sistema operativo lo convierte en las diferentes capas de red,
TCP y IP, POP3 o SMTP, lo manda al servidor y luego,
¿quién entiende eso?
Así como HTTP es entendido por servidores llamados Nginx o
Apache o muchos otros, los servidores de email también
tienen nombres.
Uno de los más populares es Postfix.
Postfix toma este email y entiende a quién le mandaron el
email o se lo mandaron a cursos arroba Platzi,
no se lo mandaron a Fredin y a Christian.
Entonces, lo que tengo que hacer ahora es asignarlo a la base de
datos que internamente los servidores de correo llaman una
bandeja.
Y luego los servidores de correo crean una notificación de
email.
Les ha pasado que les llega el aviso, ¿verdad?
Pero las notificaciones de email no son magia negra.
Las notificaciones de email funcionan de dos maneras.
Si yo tengo mi propio servidor y tengo mi propia aplicación
corporativa para enviar correo, mi teléfono constantemente le
está preguntando al servidor, oiga, ¿hay correos?
Oiga, ¿hay correos?
Y eso lo pregunta a través de un protocolo, los protocolos SMTP,
POP3, etcétera, donde constantemente está preguntando
si hay cambios en la bandeja de entrada.
Y si los hay, dispara una notificación.
Esto es ineficiente porque tengo constantemente que estar
preguntándole a un servidor a pesar de que no hay nada.
Por ende, los desarrolladores de aplicaciones móviles y los
desarrolladores de sistemas operativos móviles se inventaron
una cosa que se llaman servidores de notificaciones.
Un servidor de notificaciones es un servidor por allá en Google
o en Apple o en quien sea, que lo que hace es saber en todo
momento dónde está el teléfono.
Y está escuchando servidores, servidores de email,
servidores de chat, servidores de Slack,
servidores de notificaciones, apps,
que se suscriben a ese servicio para enviar la notificación.
En este caso, funciona así.
Si asumamos que tengo un iPhone, aquí en algún lugar de internet
existe un servidor especial que nosotros lo vamos a llamar el
iOS Notification Server.
Ese servidor tiene una base de datos de todos los teléfonos.
¿Qué funciona así?
Tiene el teléfono, un ID único, en el caso de Apple puede ser el
Apple ID o los servicios que se han dado de alta con las apps.
Tiene la IP a la que yo estoy conectado con mi teléfono y
sabe cómo encontrarme a través de esa IP.
Y constantemente hay una conexión entre el teléfono y este
servidor.
Esa conexión usa un protocolo especial.
UDP es como TCPIP, es un protocolo que funciona a través
de IPs.
Pero es un protocolo diferente porque nunca espera respuesta.
La diferencia entre TCP y UDP es que un protocolo espera
respuesta y otro no.
Esto puede ser confuso al principio, pero no te preocupes,
esta es la introducción al curso.
Eventualmente vas a aprender todo esto y cómo funciona
realmente por dentro.
Y obviamente esto está conectado a través de un sistema
operativo.
Como en este caso del ejemplo tengo un iPhone,
el sistema operativo es iOS.
Y iOS es que se conecta al servidor de notificaciones.
El servidor de notificaciones es el que envía la notificación
y cómo la envía, muy fácil.
El servidor de notificaciones está esperando que el servidor
de email en algún lugar que sabe cómo enviar la notificación a
través de las apps, le avise a ese servidor, oiga,
envíe esa notificación.
¿Y cómo la avisa?
Porque sabe quién es el usuario a través del Apple ID o a
través del Google ID, que normalmente es conocido
simplemente como nuestro email de Gmail.
Y usando un protocolo interno de notificaciones que ellos
tienen, que también funciona con IP a través de HTTP,
recibe la notificación.
Y eso es lo que hace que nosotros nos llegue una
notificación directamente y nos diga, aquí arriba,
en nuestro teléfono, ¡pum!, tienes un mail.
¿Y saben qué?
Hay muchas cosas que me salte acá.
Porque igualmente que este lado, hay señales de clave,
hay tarjetas madres, hay CPUs, solamente que en los teléfonos
móviles no existe la CPU.
Existe un concepto llamado SOC, o System On a Chip,
que es el que tiene todo.
La CPU, la memoria RAM, el disco duro y muchas otras cosas
más.
Esto se puede poner mucho más complejo y mucho más simple,
porque tampoco hablamos, por ejemplo,
de cómo funciona el código binario,
de cómo funcionan los formatos de archivos,
de cómo funciona la transmisión de datos a través de internet,
de cómo funciona ASCII, de cómo funciona que un byte sea de 8
bits.
Pero de todo esto vamos a hablar en el curso de Fundamentos de
Ingeniería de Software.