Sem categoria

Quatro habilidades para se tornar um desenvolvedor web back-end

Quatro habilidades para se tornar um desenvolvedor web back-end - Atualmente muito se escuta que um desenvolvedor precisa ser full-stack, conhecer um pouco de tudo. Mas não é de agora que esse conhecimento é requerido do desenvolvedor web, vem de muito tempo já. Mesmo que seja “apenas” back-end, o desenvolvedor web precisa:

Quatro habilidades para se tornar um desenvolvedor web back-end – Atualmente muito se escuta que um desenvolvedor precisa ser full-stack, conhecer um pouco de tudo. Mas não é de agora que esse conhecimento é requerido do desenvolvedor web, vem de muito tempo já. Mesmo que seja “apenas” back-end, o desenvolvedor web precisa:

  • Escrever o HTML que apresentará os dados do usuário;
  • Criar uma aplicação web que responda as solicitações do usuário;
  • Persistir os dados do usuário em uma base de dados;
  • Fornecer dados por APIs de acesso;
  • Manter a aplicação sempre atualizada;

Neste artigo falei das quatro habilidades principais que um desenvolvedor necessita possuir caso queria ser um desenvolvedor back-end completo.

Primeira habilidade: conhecer uma linguagem de programação.

Vamos começar com um exemplo de uma aplicação web “simples”:

using System;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;

namespace WebApp
{
    public class Program
    {
        public static void Main(string[] args)
        {
            WebHost.CreateDefaultBuilder(args)
                .Configure(app => 
                {
                    app.Run(async (context) =>
                    {
                        await context.Response.WriteAsync("Bem-vindo ao site!");
                    });
                })
                .Build().Run();
        }
    }
}

Ao ser executada, a aplicação acima irá responder a qualquer requisição com a mensagem “Bem-vindo ao site!”:

Primeiramente escolhi desenvolver esta aplicação em uma linguagem de programação chamada C#, em conjunto como o framework .NET Core. Mas uma aplicação web simples, pode ser criada com uma grande gama de linguagens de programação: Java, JavaScript, Python, PHP, Ruby, entre muitas outras.

Quando o navegador acessa a aplicação, certamente é gerado uma requisição no servidor e este se encarrega de chamar o código correspondente, que irá processar a requisição e retornar uma resposta. Esta resposta é enviada pelo servidor para o navegador do usuário.

Para aprender como lidar com este processo é importante é conheça uma linguagem de programação que permita isso.

Segunda habilidade: Banco de dados e SQL

Caso a nossa aplicação seja um blog, isso poderia ser traduzido como a necessidade de armazenar artigos e exibi-los quando o usuário acessar a página.

Para isso, vamos definir um banco de dados. Pense no banco de dados como uma coleção de planilhas, onde cada tabela do banco é uma planilha, com dados salvos em linhas e colunas.

Tabela abaixo:

Para isso, vamos definir um banco de dados. Pense no banco de dados como uma coleção de planilhas, onde cada tabela do banco é uma planilha, com dados salvos em linhas e colunas.  Para a aplicação, foi definida a tabela abaixo:

Para exibir o conteúdo desta tabela, é necessário modificar a aplicação:

using System;
using System.Linq;
using System.Net;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Data.Sqlite;
using System.Text;

namespace WebApp
{
    public class Program
    {
        public struct Article
        {
            public string Title;
            public string Content;
        }
        public static void Main(string[] args)
        {

            WebHost.CreateDefaultBuilder(args)
                .Configure(app => 
                {
                    app.Run(async (context) =>
                    {

                        context.Response.ContentType = "text/html; charset=utf-8";

                        var content = new StringBuilder("<dl>");
                        foreach(var article in Articles())
                            content.Append($"<dt>{article.Title}</dt><dd>{article.Content}</dd>");
                        content.Append("</dt>");

                        await context.Response.WriteAsync(content.ToString());
                    });
                })
                .Build().Run();
        }

        public static List<Article> Articles() {
            var articles = new List<Article>();
            using (var connection = new SqliteConnection(new SqliteConnectionStringBuilder
                        {
                            DataSource = "data.db"
                        }.ToString()))
                {

                    connection.Open();

                    var command = connection.CreateCommand();
                    command.CommandText = "SELECT * FROM Article";
                    using (var reader = command.ExecuteReader())
                    {
                        Console.WriteLine(reader.RecordsAffected);
                        while (reader.Read())
                        {
                            Console.WriteLine(reader.ToString());
                            articles.Add(new Article { Title = reader["title"].ToString(), Content = reader["content"].ToString()});
                        }
                    }
            }

            return articles;
        }
    }
}

Para obter as informações do banco de dados utilizamos uma linguagem chamada de SQL (Structured Query Language):

SELECT * FROM Article

Ela basicamente informa ao banco que queremos obter todo conteúdo da tabela Article: os dados das colunas title e content. Ao executar a aplicação, este conteúdo é exibido no navegador:

Existem vários sistemas de gerenciamento de banco de dados: MySQL, PostgreSQL, SQL Server, Oracle, entre outros. Mas todos funcionam de uma forma muito parecida, ou seja, salvam dados em linhas e colunas de tabelas.

Existem vários sistemas de gerenciamento de banco de dados: MySQL, PostgreSQL, SQL Server, Oracle, entre outros. Mas todos funcionam de uma forma muito parecida, ou seja, salvam dados em linhas e colunas de tabelas.

As aplicações não possuem conteúdo estático. Elas não serão como o exemplo acima, que sempre retorna a mesma mensagem. É importante que a aplicação possa armazenar informações, geralmente informadas pelos usuários e exibi-las no navegador.

Como as aplicações não possuem apenas conteúdo estático, é importante que elas armazenem informações, geralmente informadas pelos usuários, e que as exibi-las no navegador. Assim como a nossa aplicação.

Como deve ter notado, aprender SQL é outra habilidade importante do desenvolvedor back-end.

Terceira habilidade: HTML

A aplicação está exibindo o conteúdo no navegador, mas ele não está muito bonito. Para melhorar isso, definirei um template, que utilizará HTML (HyperText Markup Language).

O HTML é uma linguagem de marcação, utilizada assim para formatar os dados que são exibidos no navegador. Na aplicação, ele será utilizado para formatar a exibição dos artigos do blog:

@model IEnumerable<WebApp.Program.Article>
<!DOCTYPE html>
<html>
  <head>
    <meta charset='UTF-8' />
    <title>Aplicação web simples! - Blog</title>
  </head>
  <body>
    <div>
        @foreach (var article in Model){
            <h2>@article.Title</h2>
            <p>@article.Content</p>
        }
    </div>
  </body>
</html>

Para mesclar isso com os dados vindos do banco, é necessário modificar o código:

using System;
using System.Linq;
using System.Net;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Data.Sqlite;
using System.Text;
using RazorLight;

namespace WebApp
{
    public class Program
    {
        public struct Article
        {
            public string Title;
            public string Content;
        }
        public static void Main(string[] args)
        {
            var engine = new RazorLightEngineBuilder()
                            .UseEmbeddedResourcesProject(typeof(Program))
                            .UseMemoryCachingProvider()
                            .Build();

            WebHost.CreateDefaultBuilder(args)
                .Configure(app => 
                {
                    app.Run(async (context) =>
                    {
                        
                        context.Response.ContentType = "text/html; charset=utf-8";

                        string result = await engine.CompileRenderAsync("Home.cshtml", Articles());

                        await context.Response.WriteAsync(result);
                    });
                })
                .Build().Run();
        }

        public static List<Article> Articles() {
            var articles = new List<Article>();
            using (var connection = new SqliteConnection(new SqliteConnectionStringBuilder
                        {
                            DataSource = "data.db"
                        }.ToString()))
                {
                
                    connection.Open();

                    var command = connection.CreateCommand();
                    command.CommandText = "SELECT * FROM Article";
                    using (var reader = command.ExecuteReader())
                    {
                        Console.WriteLine(reader.RecordsAffected);
                        while (reader.Read())
                        {
                            Console.WriteLine(reader.ToString());
                            articles.Add(new Article { Title = reader["title"].ToString(), Content = reader["content"].ToString()});
                        }
                    }
            }

            return articles;
        }
    }
}

Agora ao executar a aplicação, ela exibirá os artigos em um melhor formato:

Todo site possui HMTL, porque é isso que o navegador espera. Os desenvolvedores front-end são os responsáveis por definí-lo, mas mesmo que o desenvolvedor back-end não mexa muito nele, é importante que tenha conhecimento de HTML.

Todo site possui HMTL, porque é isso que o navegador espera. Os desenvolvedores front-end são os responsáveis por definí-lo, mas mesmo que o desenvolvedor back-end não mexa muito nele, é importante que tenha conhecimento de HTML.

Quarta habilidade: JSON ou XML

Os navegadores não são os únicos programas que podem se comunicar com uma aplicação web. Cada vez mais, empresas disponibilizam aplicativos móveis que se comunicam com a aplicação. Ou definem aplicações baseadas no JavaScript (através de frameworks como React, Vue, Angular), que só possuem o front-end e obtém os dados de uma interface, comumente chamada de API.

O HTML é bom para formatar os dados que serão apresentados em um navegador, mas quando esses dados precisam ser enviados para outra aplicação, é necessário utilizar outro formato. Os dois formatos mais populares são XML (eXtensible Markup Language) e JSON (JavaScript Object Notation). Esses formatos foram criados para facilitar o envio de dados entre aplicações.

Nesses dois formados, os artigos do blog são representados da seguinte forma:

XML:

<Articles>
   <Article>
      <Title>Primeiro post</Title>
      <Content>Este é o primeiro post do nosso blog.</Content>
   </Article>
   <Article>
      <Title>O poder do C#</Title>
      <Content>Um site criado utilizando apenas um arquivo de código.</Content>
   </Article>
</Articles>

JSON:Copiar

[{"Title":"Primeiro post","Content":"Este é o primeiro post do nosso blog."},{"Title":"O poder do C#","Content":"Um site criado utilizando apenas um arquivo de código."}]

Para que a aplicação retorne os dados em um desses formatos, ela será modificada para:

using System;
using System.Linq;
using System.Net;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Data.Sqlite;
using System.Text;
using RazorLight;
using Newtonsoft.Json;

namespace WebApp
{
    public class Program
    {
        public struct Article
        {
            public string Title;
            public string Content;
        }
        public static void Main(string[] args)
        {
            var engine = new RazorLightEngineBuilder()
                            .UseEmbeddedResourcesProject(typeof(Program))
                            .UseMemoryCachingProvider()
                            .Build();

            WebHost.CreateDefaultBuilder(args)
                .Configure(app => 
                {
                    app.Map("/articles.json", conf => {
                        app.Run(async (context) => {
                            context.Response.ContentType = "text/json; charset=utf-8";
                            var result = JsonConvert.SerializeObject(Articles());

                            await context.Response.WriteAsync(result);
                        });
                    });

                    app.Run(async (context) =>
                    {
                       
                        context.Response.ContentType = "text/html; charset=utf-8";

                        string result = await engine.CompileRenderAsync("Home.cshtml", Articles());

                        await context.Response.WriteAsync(result);
                    });
                })
                .Build().Run();
        }

        public static List<Article> Articles() {
            var articles = new List<Article>();
            using (var connection = new SqliteConnection(new SqliteConnectionStringBuilder { DataSource = "data.db" }.ToString()))
                {
                    connection.Open();

                    var command = connection.CreateCommand();
                    command.CommandText = "SELECT * FROM Article";
                    using (var reader = command.ExecuteReader())
                    {
                        Console.WriteLine(reader.RecordsAffected);
                        while (reader.Read())
                        {
                            Console.WriteLine(reader.ToString());
                            articles.Add(new Article { Title = reader["title"].ToString(), Content = reader["content"].ToString()});
                        }
                    }
            }

            return articles;
        }
    }
}

Agora, ao executá-la e ao acessar o caminho /articles.json, os dados são exibidos em JSON:

Mesmo que as APIs possam ser acessadas no navegador, o seu principal beneficio, e objetivo, é quando são acessadas por outras aplicações. Assim, atualmente cada vez mais saber definir e utilizar APIs é uma importante habilidade.

Mesmo que as APIs possam ser acessadas no navegador, o seu principal beneficio, e objetivo, é quando são acessadas por outras aplicações. Assim, atualmente cada vez mais saber definir e utilizar APIs é uma importante habilidade.

Quatro habilidades para se tornar um desenvolvedor web back-end

Conheça nossos cursos!

Leia também: “Importância de pensar em design inclusivo”