Como desenvolver software em ambientes adversos


    A algum tempo eu observo ambientes de trabalho em empresas de desenvolvimento de software. Em especial empresas que mantém muitos desenvolvedores em um espaços muito pequenos. São diferentes equipes , diferentes tecnologias, diferentes projetos, estimativas curtas e opiniões contrárias. Ou seja, a "palha" para explodir um ambiente. E como colocar fogo nisso? Conversando e muito.  Em uma empresa em especial observei um ambiente com 16 pessoas em uma sala de 24 metros quadrados incluindo banheiro e sala de reuniões de 5 lugares.

    As pessoas começavam a chegar no trabalho pelas 7h da manhã. Geralmente quem chegava primeiro fazia o primeiro café do dia. Detalhe: Com apenas uma cafeteira de 1.5 litros para todos. Isso por si só gera um custo altíssimo em torno de R$-8.000,00/ano levando-se am conta o custo/hora do profissional que pára de trabalhar para fazer café incluindo o custo de cada colher e outros fatores como a média de cafeteiras feitas por dia. Enquanto que se tivesse uma cafeteira de 6 ou 9 litros faria-se café apenas uma vez por dia e o custo baixaria para R$-1.500,00 por ano. Mas não irei detalhar este tipo de cálculo agora.

    Mas vamos a produtividade. É fato que num ambiente de desenvolvimento de software não se trabalha realmente mais do que 80% de todo o horário comercial. Pensando no tempo gasto indo ao banheriro, reuniões e ou discussões necessárias ou não. Se fosse sempre assim até seria uma boa média. Só que no final é pior porque, em média, apenas 50% dos dias em que se espera ter aqueles 80% produtivos são realmente assim. Pois nestes esperados(inesperados) 50% acontecem sempre coisas para diminuir nossas estimativas.

    Acontecem coisas como problemas de infra-estrutura, tempo de gerenciamento seja ele auto ou para a equipe, reuniões não programadas junto as estimativas ou que não sejam relacionadas ao trabalho de desenvolvimento, pessoas que chegam ao ambiente trazendo demandas ou cobrando algo para a equipe em voz alta ou achando que estão contribuindo para maior agilidade no cumprimento de tarefas. Sem falar em falhas técnicas ou no que menos se dá importância: Processos. Sim processos. Empresas que tem até uma lindíssima descrição, não seguem o seu próprio processo. Começando por aqueles que deveriam dar o exemplo infelizmente. Esquecem-se de que até uma reunião de RH deveria ter um agendamento e registro de participação dos envolvidos. Ou seja, MONITORAMENTO. Puro e simples.

    E, ao levar em conta o que foi mencionado no primeiro parágrafo sobre muitas pessoas em ambientes pequenos chega a diminuir a produtividade de algumas pessoas em mais de 50%(dos 50% já mencionados).

    Ou seja, uma pessoa que ganha R$-2.000,00 que renderia normalmente R$-1.600,00 tem seu rendimento baixado para R$-800,00 devido a acontecimentos inesperados e baixado para R$-400,00 devido perda de concentração em ambientes com muitas pessoas. Não esquecendo que a empresa continua com um custo em torno de R$-4.000,00 levando em conta os encargos que a empresa precisa arcar com o contratado.

    No final, há melhores maneiras para conseguir trabalhar em ambientes em que não possuem processos é montar seu próprio processo de trabalho individual. Utilizando uma ferramenta pessoal para se organizar. E para o barulho nada melhor do que, após organizar seu trabalho, colocar um bom ou excelente fone de ouvidos, programar suas músicas preferidas ou rádio e esquecer do resto da empresa. Para que assim voce consiga render por volta de 45/50% a mais daqueles primeiros já perdidos pela desorganização dos processos e perda de foco. Se você for um desenvolvedor que normalmente rende mais que o resto da equipe então tudo bem. Você voltou a média que deveria ter mantido. ;)







Como entender ligações SQL (How to learn SQL)

Simples e direto:

Aprenda visualizando esta imagem como funcionam as ligações na hora de criar um SQL. 
Indo além do "select * from tabela" com, no máximo um "where id = ?"


Java - The Alphabet (Sopa de Letrinhas)

Apresentação Sobre o Universo Java. 

The Beginning:

    O Java foi criado em 1992 por uma equipe de engenheiros de tecnologia da sun.


Inicialmente batizado de oak(carvalho) e em 1995 foi rebatizado para Java. Existem várias histórias sobre a origem do nome. Ela foi criada para ser uma linguagem limpa(green-sem poluição) e assim ser independente
de plataforma e poder rodar em dispositivos eletronicos como video-cassestes, televisores, etc.
Como foi criado para ser uma linguagem limpa o conceito de maquina virtual foi o principio de tudo. É a JVM(Java Virtual Machine) que faz a mágica acontecer. Que interpreta os arquivos java e assim começa o desenrolar do "Alfabeto Java".

JVM – Java Virtual Machine(Máquina Virtual Java)

    É responsável por carregar os programas e fazer a conversão do
bytecodes em Linguagem de Máquina, definida para cada estrutura de (SO)Sistema Operacional.
Trocando em miúdos, o desenvolvedor pode criar um código que será independente de SO.

JRE – Java Runtime Environment(Ambiente de Tempo de Execução)

    É o Java que vem instalado nos computadores novos. Serve para que os softwares feitos em
java possam rodar nos pcs.

JSE – Java Standard Edition(Java Edição Básico)

    Ambiente com a estrutura básica necessária para criação de programas Java, contém a JVM,
o compilador e as bibliotecas Java necessárias.

JEE – Java Enterprise Edition(Java Edição Empresarial)

    Assim como JSE, o JEE é uma edição do ambiente Java para desenvolvimento de programas,
porém, com número de recursos superior, permitindo o desenvolvimento em multicamadas,
componentes distribuídos, ambientes de internet, etc. Hoje se encontra na versão JEE6.

JME – Java Micro Edition(Java Micro Edição)

    Edição do Java voltado para dispositivos capacidade de memória compacta como
celulares, PDAs, e outros dispositivos.

JSDK – Java Standard Development Kit(Java Kit Básico de Desenvolvimento)

    Contém o JRE, JSE, os fontes das classes Java e o JavaDoc, com isto, fornecendo o
ambiente para desenvolvimento e execução de programas Java.

API - Application Programming Interface(Interface de Programação de Aplicativos)

    É o conjunto de padrões de programação que permite a construção de aplicativos e a sua
utilização de maneira não tão evidente para os usuários.
É um conjunto de Classes prontas disponíveis para uso.

JPA - Java Persistence API(API de Persistencia Java)

    É uma especificação para a persistencia de dados.
Ela define um padrão de mapeamento objeto-relacional que frameworks devem implementar para
poderem ser considerados frameworks padrão JEE.

Hibernate (Hibernador)

    Implementa a especificação JPA e facilita o mapeamento objeto-relacional além de inúmeras
outras utilidades que auxiliam no desenvolvimento Java.

Framework (FrameWork)

    É uma estrutura de suporte definida em que um outro projeto de software pode ser
organizado e desenvolvido para servir a outros. Ou seja, voce pode utilizar vários
frameworks para desenvolver seu software. Para desenvolvimento de telas,
de camadas de negócio, de cálculos, de persistência de dados, etc.

Alguns exemplos de Frameworks:

AWT - Abstract Window ToolKit(Kit de Ferramentas para Telas Abstratas)

    É um framework que contém uma gama de componentes básicos utilizados no desenvolvimento
de telas desktop. Alguns consideram o AWT uma API.

Exemplo tela com AWT:














SWING

    Possui uma diversidade maior de componentes para serem utilizados no desenvolvimento de
Telas Desktop.

Exemplo tela com Swing:













SWT - Standard Widget Toolkit(Kit de Ferramentas Básicas para Componentes Gráficos)

    É uma implementação feita pela IBM para o desenvolvimento de telas desktop.

Exemplo tela com SWT:



Servlet(Pequeno Servidor)

    São classes java que, ao serem configuradas e implantadas em um servidor ou
container Java vão o mesmo vai interpretar o código dessas classes  e montar uma
estrutura de retorno seguindo um protocolo web como o html criando assim páginas web.

EJB - 
Enterprise JavaBeans(Componentes de nìvel Empresarial)
    É um componente da plataforma JEE. Consiste em fornecer um desenvolvimento rápido e simplificado de aplicações Java, com base em componentes distribuídos, transacionais, seguros e portáveis.

JSP - Java Server Pages(Servidor de Páginas Java)
    Foi uma das primeiras tecnologias Java para Web utilizadas para simplificar o processo de
desenvolvimento de páginas dinâmicas.

JSTL - Java Standard Tag Library(Biblioteca Básica para Etiquetas JavaServer)

    É um framework utilitário de desenvolvimento que estende a especificação JSP.
Era utilizado como complemento no desenvolvimento das páginas JSP.

JSF - Java Server Faces(Servidor Java de Faces)

    É um framework java usado para construção de interfaces de usuário baseadas em
componentes para aplicações web. O JSF é uma evolução do JSP pois além de possibilitar o
desenvolvimento de componentes customizados ele abstraiu a utilização de JSTL.
Ou seja, utilizando JSF o desenvolvimento realmente tornou-se ágil.

Implementções mais conhecidas de JSF:

RichFaces - http://showcase.richfaces.org/
Primefaces - http://primefaces.org/

Ajax - Asynchronous JavaScript And XML(Javascript Assíncrono e XML)

    Ajax é um conjunto de tecnologias (JavaScript, DOM, CSS e XML) que permite buscar de forma
assíncrona os dados requisitados no servidor sem ter que retornar todas as informações que
já estavam na tela. Ou seja, não causa o chamado “reload” na tela ou tela branca enquanto
carrega os dados da requisição.

Webservices(Serviços Web)

    Web service é uma solução utilizada na integração de sistemas e na comunicação entre
aplicações diferentes. Permitem que sistemas desenvolvidos em plataformas diferentes
sejam compatíveis.

REST - Representational State Transfer(Transferência de Estado Representacional)

   É um conjunto de princípios de arquitectura usado para desenvolver 
serviços web simplificados utilizando XML, HTTP, JSON, etc.
Com relativa facilidade de integração e Escalabilidade.

SOAP -Simple Object Access Protocol(Protocolo Simples de Acesso a Objetos)

    É um protocolo para troca de informações estruturadas em uma plataforma descentralizada e distribuída. É um um conjunto de regras codificadas que pode ser montado utilizando outros protocolos como RPC(Remote Procedure Call), XML e HTTP.

JSON - JavaScript Object Notation(Notação de Objeto Javascript)

    É uma estrutura de dados em javascript. Assim como o xml segue um padrão de estrutura de formatação de dados o json tem seu próprio padrão de estrutura. Por ser mais simples de trabalhar o json é muitas vezes mais rápido de trabalhar do que xml.

MAVEN

    É uma ferramenta de automação de compilação utilizada primariamente em projetos Java.
Ou seja, é uma ferramenta que serve para montar toda a estrutura de um projeto.

ANT - (Formiga)

    Também é uma ferramenta de compilação de projetos. É considerada o "pai" do maven. Mas com muito menos automação.

Versionadores(Controladores de versão) 

      Ferramentas para salvar e gerenciaar histórico de todas as alterações em arquivos e documentos.

CVS - Concurrent Versions System(Sistema de Versões Concorrentes)
     É um dos mais antigos e famosos sistemas de controle de versão.
SVN - Subversion(Subversão)
   É um sistema de controle de versão desenhado especificamente para ser um substituto moderno do CVS.

Git - "GIT" é uma gíria inglesa para “idiota, estúpido, ou pessoa que não vale a pena”
    É um sistema de controle de versão distribuído e um sistema de gerenciamento de código fonte, com ênfase em velocidade.

Servidores:
    Aplicações que rodam aplicativos comuns normalmente em rede. Também chamados de Containers.

Exemplos de Servidores:

GlassFish
    É o servidor padrão da especificação do Java. Ou seja, todos os outros servidores para serem considerados de padrão JEE devem ter, no mínimo, as mesmas funcionalidades do glassfish.

TomCat

    É um servidor Java, mas não é um servidor padrão JEE pois ele não faz tudo que o glassfish faz. Como rodar EJB.

JBoss - Versão atual é chamada de WildFly(Vôo Selvagem)

    É um servidor de aplicações enterprise JEE6. Considerado um dos melhores servidores de aplicações Java do mercado. Implementa a especificação, ou seja, ele segue o padrão mínimo do glassfish. Mas ele possui funcionalidades além do mesmo. Dividido em versões org(free) e eap(é free mas o suporte é pago).