<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rafael de Lima</title>
    <description>The latest articles on DEV Community by Rafael de Lima (@rafadev).</description>
    <link>https://dev.to/rafadev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1143369%2F4685a483-4f3a-491a-aeb3-07d4824d9bea.jpg</url>
      <title>DEV Community: Rafael de Lima</title>
      <link>https://dev.to/rafadev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rafadev"/>
    <language>en</language>
    <item>
      <title>Arquitetura antes do código: como planejar te faz codificar com confiança</title>
      <dc:creator>Rafael de Lima</dc:creator>
      <pubDate>Mon, 24 Mar 2025 23:59:54 +0000</pubDate>
      <link>https://dev.to/rafadev/arquitetura-antese-do-codigo-como-planejar-te-faz-codificar-com-confianca-2d42</link>
      <guid>https://dev.to/rafadev/arquitetura-antese-do-codigo-como-planejar-te-faz-codificar-com-confianca-2d42</guid>
      <description>&lt;p&gt;&lt;em&gt;"O código perfeito não nasce do acaso, mas de um plano bem estruturado"&lt;/em&gt;&lt;br&gt;
Durante meus estudos, algumas imersões, descobri que a &lt;strong&gt;maior revolução no desenvolvimento&lt;/strong&gt; não está nas linhas de código, mas no &lt;strong&gt;planejamento estratégico&lt;/strong&gt; que as antecede. Neste artigo, vou detalhar como organizar ideias, definir problemas e desenhar arquiteturas &lt;em&gt;antes de codificar&lt;/em&gt; transformou um projeto simples (um sistema de cadastro de eventos) em uma experiência de aprendizado estruturada e eficiente.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Índice&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Antes do Código: A Arte de Definir o Problema&lt;/li&gt;
&lt;li&gt;Organizando ideias: Do caos à Clareza&lt;/li&gt;
&lt;li&gt;Desenhando a Arquitetura: O Blueprint do Projeto&lt;/li&gt;
&lt;li&gt;Codificando com Propósito: Do Diagrama à Prática&lt;/li&gt;
&lt;li&gt;Lições Aprendidas (e Como Você Pode Aplicar)&lt;/li&gt;
&lt;li&gt;Conclusão: Por que Planejar Vale a Pena?&lt;/li&gt;
&lt;li&gt;Bônus: Checklist Pré-Codificação&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id="1"&gt; 1. Antes do Código: A Arte de Definir o Problema &lt;/h2&gt;

&lt;p&gt;Muitos desenvolvedores que estão iniciando na carreira pulam esta etapa, mas é aqui que a mágica começa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Escreva o problema claramente:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Exemplo: "Preciso de um sistema para cadastrar eventos, com datas, locais e participantes, garantindo que os dados sejam persistidos e acessíveis via API."&lt;br&gt;
Isso evita escopo aberto e direciona as decisões técnicas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Liste requisitos funcionais e não funcionais:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Funcionais: Cadastro de eventos, integração com banco de dados, endpoints REST.&lt;/li&gt;
&lt;li&gt;Não funcionais: Performance (resposta em &amp;lt; 2s), segurança (autenticação futura), escalabilidade.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Valide com stakeholders:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mesmo em projetos pessoais, simule perguntas como: "&lt;em&gt;O que é essencial para a versão 1.0?&lt;/em&gt;"&lt;/p&gt;

&lt;h2 id="2"&gt; 2. Organizando Ideias: Do Caos à Clareza &lt;/h2&gt;

&lt;p&gt;Antes de abrir o IDE, organize suas ideias em camadas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Separe responsabilidades:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Frontend: Interface do usuário.&lt;/li&gt;
&lt;li&gt;Backend: Lógica de negócio, APIs.&lt;/li&gt;
&lt;li&gt;Banco de Dados: Modelagem de tabelas.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Use ferramentas visuais (Draw.io/FigJam):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No projeto, desenhamos um diagrama com: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb30hzfoban50po65w5g8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb30hzfoban50po65w5g8.png" alt="Image description" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Isso ajudou a visualizar o fluxo de dados e como estruturar minhas pastas &lt;em&gt;antes mesmo de codificar&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id="3"&gt; 3. Desenhando a Arquitetura: O Blueprint do Projeto &lt;/h2&gt;

&lt;p&gt;Aqui entra o Spring Boot, mas com propósito!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spring Boot vs Spring Framework:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Spring Boot: Foco em configuração automática (embedded Tomcat, starters),&lt;/li&gt;
&lt;li&gt;Spring Framework: Controle manual de dependências (ideal para projetos complexos).&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Camadas da aplicação (em detalhes):&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;1.&lt;strong&gt;Controller:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Responsável por receber requisições HTTP.&lt;/li&gt;
&lt;li&gt;Anotações: &lt;code&gt;@RestController, @RequestMapping&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2.&lt;strong&gt;Service:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lógica de negócio (validações, regras).&lt;/li&gt;
&lt;li&gt;Anotação: &lt;code&gt;@Service&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3.&lt;strong&gt;Repository:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Comunicação com o banco (JPA/Hibernate).&lt;/li&gt;
&lt;li&gt;Anotação: &lt;code&gt;@Repository&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;4.&lt;strong&gt;Model:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Entidades do banco (ex: &lt;code&gt;Evento&lt;/code&gt; com &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;nome&lt;/code&gt;, &lt;code&gt;data&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;MySQL + JPA:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configuração simplificada via &lt;code&gt;application.properties&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;User &lt;code&gt;@Query&lt;/code&gt;para consultas personalizadas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="4"&gt; 4. Codificando com Propósito: Do Diagrama à Prática &lt;/h2&gt;

&lt;p&gt;Com o plano pronto, codificar virou execução, não adivinhação.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo de fluxo:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Model
@Table(name = "tbl_event")
@Entity
public class Event {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "event_id")
    private Integer eventId;

    @Column(name = "title", length = 255, nullable = false)
    private String title;
    @Column(name = "pretty_name", length = 50, nullable = false, unique = true)
    private String prettyName;
    @Column(name = "location", length = 255, nullable = false)
    private String location;

    @Column(name = "price", nullable = false)
    private Double price;

    @Column(name = "start_date")
    private LocalDate startDate;
    @Column(name = "end_date")
    private LocalDate endDate;

    @Column(name = "start_time")
    private LocalTime startTime;
    @Column(name = "end_time")
    private LocalTime endTime;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
// Repository
public interface EventRepository extends CrudRepository&amp;lt;Event, Integer&amp;gt; {

    public Event findByPrettyName(String prettyName);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Service
@Service
public class EventService {

    @Autowired
    private EventRepository eventRepository;

    public Event addNewEvent(Event event) {
        event.setPrettyName(event.getTitle().toLowerCase().replaceAll(" ", "-"));
        return eventRepository.save(event);
    }

    public List&amp;lt;Event&amp;gt; getAllEvents() {
        return (List&amp;lt;Event&amp;gt;) eventRepository.findAll();
    }

    public Event getEventByPrettyName(String prettyName) {
        return eventRepository.findByPrettyName(prettyName);
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Controller
@RestController
public class EventController {

    @Autowired
    private EventService eventService;

    @PostMapping("/events")
    public Event addNewEvent(@RequestBody Event newEvent) {
        return eventService.addNewEvent(newEvent);
    }

    @GetMapping("/events")
    public List&amp;lt;Event&amp;gt; getAllEvents() {
        return eventService.getAllEvents();
    }

    @GetMapping("/events/{prettyName}")
    public ResponseEntity&amp;lt;Event&amp;gt; getEventByPrettyName(@PathVariable String prettyName) {
        Event event = eventService.getEventByPrettyName(prettyName);
        if (event != null) {
            return ResponseEntity.ok().body(event);
        }
        return ResponseEntity.notFound().build();
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2 id="5"&gt; 5. Lições Aprendidas (e Como Você Pode Aplicar) &lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Documente decisões técnicas:&lt;/strong&gt;&lt;br&gt;
Crie um &lt;code&gt;README.md&lt;/code&gt; com &lt;em&gt;porquês&lt;/em&gt; (ex: "Escolhemos Spring Boot para agilizar a configuração").&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Refatore sem medo:&lt;/strong&gt;&lt;br&gt;
O planejamento reduziu retrabalho, mas ajustes são normais. Ex: otimizamos queries após analisar logs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ferramentas que salvam:&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Draw.io para diagramas&lt;/li&gt;
&lt;li&gt;Postman para testar APIs durante o desenvolvimento&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2 id="6"&gt;6. Conclusão: Por que Planejar Vale a Pena? &lt;/h2&gt;

&lt;p&gt;Planejar a arquitetura e organizar ideias não é "perda de tempo" – é ganho de eficiência. No projeto, evitamos:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Classes "Deus" (com responsabilidades demais).&lt;/li&gt;
&lt;li&gt;Acoplamento excessivo entre camadas.&lt;/li&gt;
&lt;li&gt;Surpresas na integração com o banco.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;E você? Já usou alguma técnica de planejamento que mudou sua forma de codar? Compartilhe nos comentários! 👇&lt;/p&gt;

&lt;h2 id="7"&gt; 7. Bônus: Checklist Pré-Codificação &lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Defina o problema por escrito.&lt;/li&gt;
&lt;li&gt;Liste requisitos funcionais e não funcionais.&lt;/li&gt;
&lt;li&gt;Desenhe a arquitetura (fluxo de dados e camadas).&lt;/li&gt;
&lt;li&gt;Escolha tecnologias com base no escopo.&lt;/li&gt;
&lt;li&gt;Documente decisões técnicas.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>productivity</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
