E só para de programar Java 2008 quando comecei com o Ruby. Mas ainda contínuo, ainda assim entusiasta do Java. Acho que o Java tem uma linguagem muito sólida, tem muitos projetos que usam ainda. Embora, a gente tenha visto outras linguagens surgindo dentro da JVM. o Java como plataforma, não como mais linguagem. O Java como plataforma, então tá muito maduro. O próprio escala que na verdade roda dentro da JVM, o closure que é uma outra linguagem muito famosa. Agora o Kotlin que também tá sendo bastante difundido. Que bebe pouco dos conceitos do Java. O que eu vou falar pra vocês hoje, é sobre o Spring que existe, na verdade, o Spring tem até uma linha do tempo. Deixa eu aumentar pouco a tela. >> Você não está compartilhando sua tela né? Eu não estou. E eu falando aqui achando que eu tava e não tava. Gente me desculpa. Olha só que bobagem. Eu estava mostrando esse gráfico aqui pra vocês. Que me ajuda a me localizar. Então eu tava falando que o Java foi a linguagem que eu mais trabalhei. Comecei 1999 e trabalhei até 2008. Aí eu tenho tudo o que fiz na minha vida tecnológica, desde que quando ainda não tinha internet ainda. Quando eu entrei no IME a internet era uma coisa relativamente recente no Brasil. Eu comecei a utilizar a internet 1996, embora para as pessoas comuns a maioria das pessoas começaram a usar 1998, 1999 e ainda assim era bem limitado. Tinha que ter o modem discada, não ficava o dia inteiro na internet como é hoje conectividade 100%. E aí eu comecei a trabalhar com o Java quando tava no IME. Agora vocês estão vendo minha tela? O Spring ele surgiu mais ou menos se não me engano 2003, por aí. Esse é pouco da história dos conceitos que eu vou falar hoje. Eu vou falar sobre injeção de dependência. Vou mostrar exemplo de código para ilustrar bem o que seria injeção de dependência e porque isso é importante. E é importante desde o Bob Martin, que é conhecido como Uncle Bob. Ele escreveu artigo mais ou menos 1995. E aí o Joe Yoder escreveu aquele artigo famoso do Big Ball of Mud mais ou menos 1990. Já conhecem o Joe Yoder, Fábio? Já tiveram palestra do Joe? Não, não conhece. Era para ter, mas o Joe é consultor Americano que vem de vez quando no Brasil, mas por conta do Covid, cancelou as viagens. Então não tivemos. Se bem que agora podia fazer remotamente, né? >> Podia, Podia. Mas não teve nada do Joe. >> O Joe é uma pessoa ímpar, parceiro nosso aqui da USP, ele vem sempre dá palestra, ele dá consultoria várias empresas aqui no Brasil. Enfim. E aí o Spring surgiu mais ou menos 2000 e existe até hoje e foi evoluindo. E eu vou mostrar pouco o que é o Spring. Bom, o Spring na verdade ele é conjunto de várias bibliotecas. Você pode fazer várias coisas, tem vários módulos. Você tem a parte de acesso a dados, você tem a parte de mensagem, você tem a parte web do Spring então pra você fazer uma aplicação web, aí tem toda a aplicação web. Aí tem a parte core, que é chamam core, que é a manipulação de arquivos, configurações. Enfim. E tem também a parte de testes. O que a gente vai usar, é só. O que eu vou mostrar hoje aqui gestão de independência, é só o que basicamente está aqui no core, no beans, nessa parte aqui de gestão de dependência do Spring. Mas ele tem tudo, monte de coisas além do que vou falar aqui. É negócio muito complexo, eu mesmo não conheço tudo a fundo. Tem pessoas que são bem especialistas, mas eu conheço só poucas coisas. Quando eu comecei a usar não tinha tudo isso, foi evoluindo ao longo do tempo. Mas hoje o Spring serve para você criar aplicações Java de uma maneira muito rápida e muito customizada. Usando o conceito de convenção sobre configuração. Ou seja, você escreve menos código e o Spring, e aí várias coisas são assumptions. Você assume determinadas coisas E ele usa essas assumptions para fazer o código rodar. Então, você coloca uma anotação numa classe. Eles já viram anotação, Fábio? Alguma coisa de anotação? Peraí. Eles já viram teste automatizada com junit, que usa anotações, arroba teste, arroba before each. Então a gente viu exemplos, embora não teve uma aula de anotações. Só viram esses pequenos exemplos. >> É, o conceito de anotações, ele é uma coisa relativamente vamos assim nova. No Java, eu não tinha anotações. Mas anotações é muito prática, justamente para você marcar determinados pontos no seu código, onde a, eu quero que aconteça determinadas coisas meio que mágicas, acontece coisas mágicos por você anotar. Então anotações é jeito ortogonal de você inserir coisas no seu código, sem que o código explícito daquela coisa que você está inserindo esteja ali. Assim você consegue meio que comunicar partes. Então você tem framework de teste lá, o junit. E você não ter dentro do seu código vazar vamos dizer, conceitos do junit. Você quer simplesmente marcar com uma coisa simples, esse daqui é teste, pronto. Não preciso saber mais nada. Então, ele simplifica a maneira de você comunicar código com outro, sem ter muita dependência, muita amarração. Então, o Spring trabalha com o conceito de anotação também. Eu vou mostrar aqui para vocês como faz para criar uma aplicação Spring. Deixa eu abrir aqui. Spring Deixa eu abrir aqui o meu navegador. Esse aqui é o Spring, esse daqui é o site do Spring spring.io. Basicamente quando você quer criar projeto novo no Spring, ele tem jeito bem vamos dizer assim Quickstart. Você clica aqui quickstart. São três passos. Basicamente você entra nessa tela aqui. Eu vou abrir. Você escolhe qual o tipo de projeto, se você quer usar o Maven ou se você quer usar o Gradle. Que é basicamente uma ferramenta de building, ferramenta que construí o seu projeto. Você escreve se você quer usar o Groovy, Kotlin ou o Java. Eu vou deixar Java. A versão do Spring que você vai usar. No caso eu vou usar a mais nova, que é a versão 2.2.7. E aqui o nome do seu projeto. Eu vou deixar aqui o padrão com exemplo demo, você escreve aqui a descrição do projeto E você quer impactar ele como Jar ou War. Eu vou abaixar ele como War, eu quero que seja uma aplicação web. E aí a versão do Java. Eu vou deixar no oito. Eu nem sei se tenho instaladas as versões mais novas. Eu vou deixar no oito. E aí, se você quiser você pode adicionar dependências, mas você pode adicionar dependências depois. Aí você clica generate. Ele vai baixar [CROSSTALK] zip, que >> Você está para comentar essas dependências, é como se fosse outras bibliotecas? [CROSSTALK] É exatamente. >> Tipo eles fizeram exercício que tinha umas bibliotecas de PDF para gerar PDF, essas eram as dependências do projeto. E aí, eu vou pegar agora, eu vou abrir esse projeto aqui. Deixa eu abrir uma janela aqui para mostrar terminal. Daniel, acho que vai, isso aí, ou aumenta ou diminui a resolução da sua tela. Não, eu vou aumentar bem aqui. Pode ficar tranquilo. Então está aqui. Aí tenho demo. Eu vou dar unzip nesse demo, acho que já tinha demo aqui que já tinha baixado. Peraí, deixa eu apagar esse demo aqui. Então é projeto que veio. Aí basicamente as instruções falam assim, você baixa o projeto. Passo eu começo aqui. Aí eu vou adicionar meu código, aqui ele traz código de exemplo. Eu vou pegar o código que ele tem aqui. Basicamente ele já cria meio que uma estruturinha básica com todo o código. Eu vou mostrar pra vocês. Ele cria essa pasta. Ele cria arquivo pom, que é na verdade as coisas do Maven. Já trabalharam com Maven, Fábio? Não. [INCOMPREENSÍVEL] é bem comum, basicamente é arquivo PXML que tem todas as especificações do arquivo, ele baixa tudo o que tem de dependência sem você precisar se preocupar muito com baixar o arquivo, jogar num [INCOMPREENSÍVEL] ele faz isso meio que de forma automatizada. >> Eles trabalham dentro do Eclipse? >> É, o Eclipse faz isso sozinho. A vantagem de usar o Maven é que você não depende de [INCOMPREENSÍVEL], você pode colocar qualquer IDA que ele vai funcionar, pouco mais agnóstico de IDE. E aí ele já criou essa aplicaçãozinha só que ela não tem nada na verdade, então eu vou pegar só esse código extra, que é esse "getMapping" para criar "endPoint" "Rest". Então basicamente eu crio esse... O código basicamente ele tem o seguinte, eu estou dizendo que eu crio método que retorna uma "String", eu digo qual que é o RL onde vai estar esse retorno, então essa "String" vai ser a resposta de uma requisição que for feita nessa [INCOMPREENSÍVEL] /hello e aí eu tenho que colocar e anotar essa classe com essa anotação que é a "RestController" para dizer que ela vai ter Controller Rest aqui. >> Você está fazendo sistema web, certo? >> É, eu estou fazendo uma API que é servidor web, literalmente. Basicamente só vou dar isso aqui. Pronto, já está funcionando. Esse Maven faz isso, ele compila...Opa, deu algum pau. O que é que ele reclamou? Está faltando alguma importação, eu acho. RequestParam. O que ele está dizendo? "Cannot find symbol" [INCOMPREENSÍVEL] "DemoApplication class" Faltou salvar! Mas [INCOMPREENSÍVEL] usar o Eclipse. O Eclipse já ia mostrar o vermelhinho. Não, é que eu não tinha salvo o arquivo na verdade. Não tinha nenhum erro, eu é que não tinha salvo, eu tinha feito as mudanças mas eu não tinha salvo o arquivo, foi isso que aconteceu. E aí basicamente eu entro no "Local Host" na porta 8080 [INCOMPREENSÍVEL] Hello, e aqui está o "Hello World". Na verdade eu poderia fazer essa aplicação no meu...eu estou usando VS Code como editor mas vocês podem usar o editor que vocês quiserem. E eu posso também fazer "Run" desse projeto de dentro do próprio editor. Eu fiz ele pela linha de comando para mostrar como que era mas eu posso vir aqui e dar "Run" e ele vai rodar...é java... Vamos ver se ele vai rodar...Ele está rodando... A vantagem de rodar pelo editor assim como é pelo Eclipse, é que se eu entrar aqui no browser, ele está respondendo e se eu fizer uma mudança e colocar aqui alguma coisa nova, ele automaticamente deveria pelo menos recarregar mas acho que ele não recarregou. >> Professor, licença. O senhor tem que baixar alguma extensão para o VS Code ou você está rodando nativo no terminal do VS Code? >> É, eu tenho que instalar a extensão de java. >> Ele não precisa de nada para o Spring, ele entende sozinho? >> Não, porque é assim, como vem no pon, o que é que acontece, tendo a extensão de java, ele vai pegar o pon e o pon já tem todas as coisas do Spring e o Spring já baixa todos javas que precisa e ele roda. >> Entendi. >> Não é muito simples de criar uma coisa sem precisar... o projeto ele é meio que algo contido e o VS Code já está preparado para trabalhar com o Maven. Deixa eu rodar de novo. >> Muito obrigado. >> Daniel, você só mudou o String Daniel e já queria que aparecesse, você não precisa fazer o "build" de novo no sistema? >> É que o Eclipse, ele deveria ter feito, ele faz sozinho. Ele faz "Build" e reinicia o servidor sozinho. >> No navegador, não precisava? >> Quer ver? Eu vou abrir o outro projeto que eu tenho aqui que é esse aqui que eu ia mostrar para vocês. Esse aqui já está pouquinho mais... vou rodar ele de novo. [ÁUDIO BRANCO] Eu tenho aqui a minha Demo Application. Ela é basicamente a mesma coisa só que o Hello é pouquinho diferente, ele retorna uma lista de telefones. Mas essencialmente é a mesma coisa. Então se eu venho aqui e dou "run" [ÁUDIO BRANCO] eu tenho aqui a minha lista de telefones de mentirinha então se eu vier aqui naquele "EndPoint", ele retorna [INCOMPREENSÍVEL] com os telefones. Vou mudar aqui telefone, por exemplo. Mudei. Aí ele já recarregou e se eu vier no browser e recarregar ele já mudou. A vantagem de usar o editor é isso, você faz uma mudança no código e ele reinicia automaticamente o seu projeto sem você ter que ficar toda hora baixando e subindo o servidor web. Vou mostrar para vocês, voltando aqui nos slides, que são só esses três passos, só recapitulando. Eu venho aqui nesse cara, baixo zip, ele cria essa estrutura básica, eu copio código que basicamente eu só peguei essa linha aqui e coloquei na aplicação para dizer que isso é Controller Rest e criei getMapping para dizer que esse é o endPoint. No caso aqui tem parâmetro que você pode também passar como parâmetro. O exemplo daqui seria o seguinte, por exemplo, vamos supor que eu quero fazer a minha lista de telefones, ela recebe como uma empresa. Quero dizer que eu quero os telefones do "Pra Valer", por exemplo, aí eu venho aqui no código... [ÁUDIO BRANCO] Aqui na verdade eu vou mudar para "Company" e vou passar como parâmetro o "name". Vou mudar aqui também. "Company" aqui e aqui "Company" também. Pronto. Se eu não passar nada, ele vai assumir que o valor "default" é "World", como está aqui... [ÁUDIO BRANCO] ele deu pau porque provavelmente eu não devo estar preparado para uma lista que não tem nenhum E. É que eu estou fazendo print, deixa eu tirar esse print aqui. Tentar de novo. Ele retornou uma lista vazia. Basicamente, é assim que eu passo parâmetros para a requisição, usando esse RequestParam Parâmetro do método Hello ao parâmetro que veio no Request HTP e eu posso definir valor "default" ou posso não definir valor "default". E eu usei esse mesmo parâmetro que vem aqui para fazer a chamada no meu componente Lister, que na verdade é o motivo pelo qual eu tou vindo fazer essa palestra, que é para falar pouco de como esse cara veio parar aqui, que é justamente o conceito de injeção de dependência. Ficou claro? Alguém quer fazer alguma pergunta, até aqui? Deu para entender legal? Tranquilo? Sem perguntas? Qualquer coisa vocês vão me interrompendo. O exemplo que eu quero mostrar para vocês, uma vez que eu já criei aplicação... então segui esses passos, coloquei os parâmetros, rodei, está lá rodando, maravilhoso, agora eu quero criar uma aplicação e o exemplo que eu quero mostrar para vocês é o seguinte: imagina que eu tenho essa classe, que eu chamo de "PhoneLister". É Listador de Telefones. E que ele vai usar "Finder". E esse "Finder" é a minha classe que sabe acessar os dados dos telefones no banco de dados ou onde quer que esses dados estejam. Então esse "Finder" tem método chamado "findAll" e basicamente eu pego os telefones e eu itero por esses telefones e se esses telefones não forem da empresa que eu mandei como argumento nesse método, eu tiro da lista e retorno a lista só com os telefones da empresa. É exemplo meio, vamos dizer assim, bobinho, mas não se atenham muito ao que esse exemplo faz. Se atenham à ideia de que eu tenho aqui uma classe, que é objeto, que é o finder, que ele é de uma classe que esse PhoneLister usa. E aí o que acontece? Como é que eu faço para chegar nele? Como é que eu faço para instanciar esse PhoneFinder? O que eu poderia fazer ali? Eu tenho a minha classe, eu tenho uma interface PhoneFinder e eu tenho o meu fake PhoneFinder que implementa essa interface. Então jeito de fazer isso seria quando eu construir o meu PhoneListed, no construtor dele eu vou lá e inicializo o FakePhoneFinder. Qual que é o problema disso? O problema disso é que no momento que eu faço essa inicialização aqui eu estou criando acoplamento entre o meu PhoneListed, a minha classe PhoneListed e a classe FakePhoneFinder. Ou seja, o PhoneListed ele passa a não depender só da interface, que é o ideal, mas ele passa a ter que conhecer uma implementação de PhoneFinder, que é a FakePhoneFinder ou qualquer que fosse outra implementação. E isso é ruim porque se eu quiser mudar a implementação essa classe criou uma dependência, daí eu não queria que ela tivesse a dependência com a implementação si, eu queria que ela tivesse dependência só com a interface. Então está vendo, o PhoneListed ele depende da interface e ele depende do PhoneFinderImplementation porque ele cria dentro dele mesmo o objeto. E o que eu queria? Eu queria que de uma forma mágica o meu PhoneLister só dependesse do PhoneFinder, que é a interface e eu tivesse o que chamo de Assembler, tivesse alguém lá de fora que magicamente cria o meu objeto com a implementação real e ele passa para dentro do PhoneLister essa implementação sem eu precisar fazer nada, sem que o PhoneLister dependa da implementação. Então essa é a ideia básica do Assembler. E aí é para isso que a injeção de dependência serve. Quando você quer injetar dentro de uma classe valor que veio de fora. E aí como a gente faz isso? A gente faz tem três maneiras. Na verdade a gente usa mais a primeira e a segunda. A primeira é por construtor e a segunda é por setter. Então qual que seria a ideia? Eu vou voltar aqui no código. Está aqui o meu PhoneLister e aqui já está implementado a versão final. Então o que que eu faço? Uma das opções é aqui no construtor eu passo o finder como parâmetro, certo? Então ele não é mais uma Construtor vazio como era antes que fazia assim new Fake PhoneFinder. Estava assim aí eu mudei e fiz ele como parâmetro. Então esse seria a versão via Construtor. Uma outra forma de fazer seria via setter, que é vez de ter Construtor ele não tem construtor, então o construtor ele basicamente não faz nada. Eu posso até comentar esse Construtor e aí eu faço via setter. Eu crio setter, SetFinder que pega a propriedade do Finder e passa ele como parâmetro. Então esse Autowired aqui anotado já é como fazer isso usando Spring. Se eu não tivesse usando Spring estaria assim e aí eu teria que ter jeito mágico alguém tem que saber setar esse Finder e o jeito mágico que o Spring faz é anota a propriedade com essa com essa anotação Autowired que eu me encarrego de achar algum lugar uma implementação do PhoneFinder e do seu código. Então se tiver uma implementação do seu código de PhoneFinder eu já insiro ela ali, você não precisa se preocupar com isso. Então é isso que ele faz. Então como eu tenho FakePhoneFinder que implementa e é o único, se tiver dois ele vai entrar conflito e ele vai dizer " eu tenho duas implementações, não sei com qual explicitar", e aí você tem que algum lugar dizer, enfim, qual a implementação que você quer usar. Mas isso fora, vamos dizer assim, da classe. Você configura o Spring para que ele seja o único lugar que conheça todas as implementações. Então vez de você colocar a implementação todo mundo dependendo de todas as implementações você centraliza a dependência num único lugar que é as configurações dos Spring. E aí basicamente é isso. Então ele seta o Finder aqui. [BARULHO] Exemplo. Então tem que fazer na verdade duas coisas. Então primeiro eu anoto esse Autowire aqui no PhoneFinder e na minha classe FakePhoneFinder eu tenho que ter anotado ela como componente, porque se eu não anotar ela como componente ele não vai encontrar ela como uma opção de implementação de PhoneFinder. E aqui no caso ele é FakePhoneFinder, mas se eu tivesse SQL PhoneFinder, que busca os dados num banco de dados mais SQL ele poderia ser uma segunda opção de implementação. E aí o que que eu faço? Bom, eu não faço nada, é só isso. Basicamente está pronto o programa. Então qual que é a ideia do Spring? O Spring ele ajuda você a focar escrever código, escrever código do seu negócio, escrever as regras de negócio sem se preocupar muito com essa infraestrutura de quem instancia quem e tudo mais. Você simplesmente diz quem depende do que, você cria os objetos. Então se eu tenho uma interface PhoneFinder e o PhoneListed depende, eu simplesmente crio uma variável, coloco ela aqui e não preciso me preocupar como que vai chegar essa informação aqui. E veja, eu dei exemplo aqui bem pequeno com PhoneListed e o PhoneFinder, que são duas classes. Mas vamos supor que o PhoneFinder, que é esse meu FakePhoneFinder, vamos supor que ele dependesse de uma outra classe, sei lá vamos supor Public sei lá depende da classe FileSystem, sei lá, vou inventar aqui uma classe. FileSystemRegister. Eu inventei nome aqui. Então criei uma variável aqui. Essa classe nem existe. Vou criar E aí se essa classe PhoneFinder ela dependesse do FileSystemRegistry e eu quisesse fazer a mesma coisa com ele eu faria a mesma coisa. Eu venho aqui ou crio via Construtor, ou crio via aqui na verdade é private. Eu anoto ele como Autowired aqui crio setter. [BARULHO] crio setter, e aí ele está quebrando. porque eu não tenho a classe ainda feita. Cadê o meu FireSystemRegistry? Eu tenho que anotar ela como component e pronto. Feito isso tudo vai funcionar. Então se eu tivesse essa minha classe aqui provavelmente ela implementaria uma interface e tudo mais mas vou simplificar aqui, vamos supor que tenha método, sei lá, sayHello. Né. Eu tenho essa classe aqui e aí no meu FakePhoneFinder por algum motivo eu vou precisar usar aqui no telefone vou colocar aqui mais alguma coisa assim. Pronto. Vou entrar aqui e botar o nome da empresa que agora tem que colocar porque é parâmetro. Está vendo, ele já incluiu aqui. Ou seja, facilmente eu criei uma nova classe, criei uma dependência, no caso aqui eu criei uma dependência da implementação real, mas o certo seria criar a independência pela interface, mas o que eu quis ilustrar é que todo esse mapa de quem depende do quê e como inserir as instâncias, uma nova instância desse objeto dentro dos objetos que dependem dele é feito automaticamente pelo String. Então nenhum lugar eu escrevi NewFileSysteRegistry. Não tem nenhum NewFileSystemRegistry. Alguém criou ele para mim. >> Professor, do mesmo jeito que >> Oi. >> Tenho uma dúvida. >> Pode falar. >> E seu quisesse, por exemplo, usar o padrão Strategy para ter, nesse caso SystemRegistry de diferentes estratégias, de diferentes momentos. O Spring ajudaria nisso também? Sim, você pode usar o... eu não vou saber falar de cabeça porque faz certo tempo que eu não uso o Spring mas, seria alguma coisa [INCOMPREENSÍVEL] sentido, vamos supor que você tivesse aqui [ÁUDIO BRANCO] método que você usaria o Strategy. Então você tem aqui "FindFinder". E aí você vez de usar o Finder fixo. Desculpa, não era aqui. O Finder, automaticamente ia só, mas vamos supor que eu quisesse ter Strategy, onde, dependendo do caso eu escolho Finder ou o outro Finder. Então teria método aqui Finder, certo? E receberia o tipo que eu estou querendo usar. [ÁUDIO BRANCO] E aqui eu teria Switch Case onde, dependendo do tipo, eu ia retornar... Se for do tipo Fake eu retorno... o jeito padrão, se a gente não tivesse usando Spring eu faria assim: Se a [INCOMPREENSÍVEL] eu faria assim "New", PhoneFinder Desculpa, New Fake PhoneFinder. Se for o tipo mysql eu vou usar o New MySQLPhoneFinder Essa seria a maneira "não Spring" de fazer esse Strategy. Como eu vou estar usando o Spring, o que é que eu vou fazer? Eu só não vou lembrar o comando de cabeça mas a ideia do Spring é justamente isso aqui. Aqui eu vou fazer assim, eu vou ter jeito de acessar o contexto do Spring. SpringContext .getFinder e aí eu passo simplesmente o tipo e ele implementa lá dentro dele esse Strategy. De certa maneira ficaria simples assim, eu consigo usar o Strategy sem precisar implementar o Strategy. Eu escolho baseado num determiando tipo. Só simplesmente dizendo "Spring, eu quero agora Finder desse tipo" e ele me retorna. Só não lembro de cabeça como fazer isso porque faz muito tempo mas é essa a ideia. Beleza. E a vantagem de usar também o Spring e usar injeção de dependência é que a gente consegue facilmente criar testes. Porque aqui eu estou testando a minha própria aplicação...criei teste e eu posso fazer o [INCOMPREENSÍVEL], então eu posso também injetar no teste as coisas ou eu posso também fazer mocks, então vamos supor que eu estivesse esse... >> Gabriel está perguntando se você vai poder compartilhar o powerpoint depois. >> Sim, eu vou partilhar o powerpoint e eu partilho esse código também com vocês, eu vou jogar no BitHub depois o código. >> Legal. >> Então vamos supor que eu tivesse que testar a classe PhoneLister. Se eu não tivesse o Spring eu ia ver que o PhoneLister ia toda vez ter que criar e não ia ter isso, ia ter jeito sem injeção de dependência eu ia ter new FakePhoneFinder. Ou seja, toda vez que eu fosse fazer teste dessa classe PhoneLister eu ia ter que criar uma instância desse FakePhoneFinder e às vezes esse FakePhoneFinder pode ser uma coisa muito complexa. Eu queria injetar, por exemplo, Mock. Eu não queria que ele usasse uma implementação real no meu teste porque eu queira que ele só tivesse algum comportamento esperado. Então com injeção de dependência fica muito fácil criar o teste porque você injeta... No caso meu Fake já é Mock mas vamos supor que esse fosse de verdade. No teste usaria o Fake. E eu conseguiria fazer testes sem necessariamente ter que usar uma implementação real que... >> Você pode explicar [INCOMPREENSÍVEL] que eu não [INCOMPREENSÍVEL] esse termo "Mock". >> O Mock, quando você cria teste, por exemplo... Aqui esse Lister, o PhoneLister, o que é que é Mock? O Mock ele é jeito de você usar objeto de mentirinha. Vamos supor que esse PhoneLister ele é uma coisa complicada, acessa banco de dados ou ele vai na rede e faz uma requisição web e tem várias coisas que você não quer que rodem na hora do seu teste porque você não está testando esse cara específico, o que você está testando aqui é a aplicação. Caso esse cara retorne uma lista com três objetos, você está testando que imprimiu na tela, então dependendo de onde você tiver fazendo o teste, não faz sentido você ter que instanciar negócio complicado. Então o que é que é Mock? Mock é uma coisa do tipo assim... você tem objeto, que eu chamo de Mock, na verdade eu também não vou lembrar de cabeça como que é o Mock porque depende da implementação. O Spring tem jeito de fazer, o JUnit tem outro jeito, tem o JMock, tem várias bibliotecas de Mock. E como eu estou meio enferrujado no java eu não vou lembrar de cabeça. Mas a ideia dele é a seguinte: Você vai criar objeto do tipo Mock. Será que tem alguma coisa algum lugar aqui, deixa eu ver. Tem o Mockito aqui, eu não sei se vai funcionar. Vou arriscar usar o Mockito. E aí você faz o seguinte, o Mock é o Mock do quê? Quando você diz assim, esse Mock, você espera que ele... Desculpa gente, eu não vou saber fazer. Mas vamos fingir que é objeto e aí você vai chamar o objeto da classe real. Então vamos supor que o seu objeto, o seu PhoneLister, esse Mock ele implementa essa... Eu vou implementar o Mock não usando biblioteca, vou fazer uma coisa aqui. >> Olha no chat. No chat o Leonardo colocou o código para você. >> Valeu, obrigado. >> Eu só não sei o importe desse Mock. >> Isso exatamente, agora então seria alguma coisa do tipo assim, eu tenho o meu PhoneLister, é o Mock... Isso aqui, isso boa! Do PhoneLister que é a interface que eu quero. Então ele criou Mock, ele criou objeto de mentirinha, só que esse objeto ele tem [INCOMPREENSÍVEL] para todos os métodos. Então eu faço o seguinte, eu gravo ele. Eu falo assim "quando chamar o método Phones by Company, retorna isso aqui". Eu finjo retorno [INCOMPREENSÍVEL] e aí eu uso ele para fazer o teste sem me preocupar ter objeto real fazendo aquela coisa de verdade. Não sei se consegui explicar muito bem, talvez eu estou pouco enferrujado no java estou me enrolando pouco aqui. >> Coloquei o [INCOMPREENSÍVEL] Eu acho que ajuda. No chat. [INCOMPREENSÍVEL] >> É isso aí, boa, obrigado. Exatamente. Você faz assim, quando eu fizer chamar vazio e aí você retorna com ArrayList e Phone. Eu invento uma implementação Inventei uma... Eu tenho que importar o "when", também. >> A ideia é que quando você quer fazer teste e tem pedaço do teste que seria complicado mas não é o que você está focando de testar naquele momento, você usa esse Mock só para simular a execução daquele pedaço de forma que você possa se concentrar [INCOMPREENSÍVEL]. [FALA CRUZADA] >> Exatamente. E nesse caso, o Spring faz isso automaticamente para mim, então eu posso dizer qual que é a classe que eu quero usar de Mock e ele usa ela como Mock. Então ele não injeta o objeto real, ele injeta o Mock. E eu trabalho com moto. >> Tá melhor, pode continuar o resto. Eu que te interrompi. >> Bom E aí a vantagem também de usar o Spring é que a gente não precisa ficar criando vários Singletons. Então se a gente tiver determinadas classes que tem só único objeto. Classes, eles chegaram a aprender Singleton já, Fábio? >> Já sim. >> Então, vez de você ficar criando classes, Singletons e e ficar cessando elas, você usa o spring e ele mesmo cria. E você pode inclusive no Spring dizer se o que vai ser injetado é objeto Singleton, ou seja, sempre o mesmo objeto o o objeto que depende dele. Então, no caso aqui eu não sei qual que é o padrão dele, quando eu coloco componente eu não sei se ele cria o Singleton ou se ele cria objeto novo. Acho que é o Singleton. Mas você pode escolher usar, e aí você não tem mais que ficar fazendo os seus próprios Singletons. Você não precisa escrever nenhum tipo de arquivo de configuração, porque vocês viram que eu não criei os arquivos de configurações e a gente também facilita as boas práticas, ou seja, usar sempre a interface vez de usar a implementação. O código ele é bem pouco invasivo, então a parte as anotações eu não tenho mais nada, vamos dizer assim, dependendo do Spring. Então, é só uma anotação aqui o resto tudo código Java mesmo. Tudo isso aqui é Java, Java. Aí eu já entro pouco no detalhe do Spring Web, não é? Que eu acho que também dando uma palinha aqui. Não sei se vocês repararam mas olha que interessante o meu phones essa variável phones aqui, ela retorna o que? list de phones. Então, é objeto, na verdade é array list que a classe abstrata é a list de telefones. E aí, o que que aconteceu aqui? Eu retornei essa lista aqui no método e ele automaticamente ele imprimiu JSON. Olha que legal. Eu não precisei nenhum lugar converter isso aqui para JSON. Basicamente se eu tiver aí o que acontece? Vamos supor que na minha classe phone eu tenha uma nova propriedade. Vamos supor que eu tenha uma propriedade nova aqui de telefone que eu chamo de, sei lá, city city code. Então, eu vou incluir aqui. String, city code. Inclui, não é, o inclui o parâmetro novo e aí na hora que eu, deixa eu reimplementar o meu, o meu 'iii' aqui. Deixa eu apagar iss aqui. Eu vou colocar São Paulo. Rio de Janeiro, e sei lá qualquer estado, mas vocês entenderam a ideia. E aí quando eu recarrego acho que ele ainda está recompilando. Deixa eu ver se eu salvei tudo. Acho que eu não salvei tudo ainda. Cadê o meu phone? Faltou getter aqui. Isso é uma coisa importante. Se não tiver o getter ele não retorna. City code. City code. Olha, aí ele já inclui no JSON o código da cidade. Então, precisa ter, não adianta só ter o atributo ele tem que ter getter. Na verdade se ele tivesse outro getter aqui provavelmente ele mesmo se não tivesse a propriedade, sei lá. Vamos supor que eu tenho country. Sempre Brasil. Vamos supor que eu queira definir que é fixo Brasil. Pronto. É também não adiantou. Acho que ele precisa ter as duas coisas. Acho que ele precisa ter a propriedade, e ele precisa ter o getter. Não. Aqui tem que ser get country na verdade, acho que foi. Olha lá. Então, basta você ter getter. No seu objeto para que ele inclua ele no JSON como uma propriedade e ele faz toda a transformação aqui sem você precisar construir o JSON no dedo. E esse, e esse vamos dizer assim, essa propriedade ela pode ser complexa. Se fosse uma arraylist string, sei lá, get sei lá people. Limpei aqui negócio, tá? List. [SEM_ÁUDIO] Aí, a list na verdade está permutação. Porque a coisa é errada. Eu pegar 'iii' aqui. [SEM_ÁUDIO] E aí, está aqui o arraylist. Vamos dar list.put add, sei lá, Daniel Fábio eu reformo a lista e aí se eu vier aqui, está vendo, ele retorna no JSON, e aí como é uma lista ele já entende que é array e ele já bota as coisas dentro e isso sucessivamente então veja, isso aqui poderia ser objeto, e aí ele poderia ter objeto, array de objetos e assim sucessivamente, ou seja esse JSON ele é automaticamente criado usando o spring 'iii' para mim, sem maiores dificuldades. >> O Eduardo está perguntando se funcionaria com hashmap também. >> Funcionaria com hashmap? Provavelmente sim, a gente pode até testar aqui. Vamos ver. Map, string e integer. Vamos fazer map de string e integer? [SEM_AÚDIO] Olha, vocês estão testando toda a minha memória de trabalhar com Java cara, porque faz muito tempo que eu não trabalho com Java. String, integer. [SEM_ÁUDIO] [SEM_ÁUDIO] Vamos ver se deu certo. Deu certo, tá vendo? Olha. Ele retorna como objeto também. Então, sim. Respondendo a sua pergunta. >> O Eduardo falou DHR que é uma 'iii' que seja da hora. >> Da hora. [RISOS] Não sei, é isso? >> É isso mesmo. >> O que mais? Aqui. Bom, no fim a ideia do Spring. Ele é uma tecnologia que ajuda você. A construir as aplicações usando objetos puros. Você cria os componentes foca na sua lógica de negócios, enquanto o Spring toma conta das outras coisas importantes, e você não precisa ficar se preocupando criar JSON inserir objetos dentro do outro objetos. E você faz, você foca muito mais na sua lógica de negócios que essa é pouco a ideia dele. Então, os componentes eles não precisam procurar colaboradores. Tempo de execução, o código fica mais simples, com a lei de testes também. As dependencias elas são explicitas. Então, você explicitamente quando você chega no código e diz esse cara aqui, cadê o meu phone lister ele é componente e ele depende, tá vendo? Quando eu coloco o auto wired eu estou dizendo estou dizendo, ele depende de phone finder, da interface phone finder. Então eu estou sendo explícito dizer quem depende do que. Está muito claro no meu código onde estão todas as dependências. Depois, o Spring até tem jeito de você pegar todo o seu código e gerar diagrama com tudo que depende do que só usando as anotações que você tem. Eu não lembro de cabeça como faz isso mas eu sei que tem. Bom, isso aqui eu já falei na verdade. Bom, aí para entrar que tal o exemplo do código. O Spring não é o único framework, conhecido como arcabouço português. Também é arcabouço mas a gente usa framework. Não é o único arcabouço que cria, que você pode usar para fazer injeção de dependencia. Você pode usar também o PicoContainer, embora esteja pouquinho desatualizado e o Guice, que é do Google. Acho que os dois mais famosos são o Spring e o Guice. O Guice ainda é bem utilizado. O Pico também é utilizado. Pouquinho menos. E o Spring também é bem utilizado. A diferença é que o Spring, ele é pouquinho mais digamos assim, mais inflado. O Guice, a proposta dele, tanto do Pico quanto do Guice, é serem mais leves, vamos dizer assim. Então as vezes no seu projeto se você já está usando Spring para fazer coisas web e tudo mais, aí faz sentido você usar o Spring. Mas se as vezes você tem projeto que é bem simplesinho, é roda local e você não quer ocupar muita memória com monte de overhead do próprio Spring então às vezes vale a pena usar esses outros framers, que eles são bem leves termos de consumo de memória, de gasto de CPU na hora de rodar eles são pouquinho mais leves do que o Spring. >> Agora os alunos vão fazer projeto que envolve web, é sistema web. >> Tá. >> A gente está falando de usar o Spring se achar uma boa. >> Cara, eu usaria Rails. Eu faria Rails. >> Rails é linguagem Ruby. A gente está falando de Java. >> Eu acho que sim. Se for fazer Java eu com certeza usaria o Spring. Eu acho que ele facilita bastante. Facilita bastante. >> O Lucas já queria fazer Rail. >> Eu só não sei se a gente faria a parte do front usando o framework Javascript, ou sei lá, React da vida. Ou fazendo tipo HTML CSS put usando Javascript puro e fazendo o back-end Java, mas o front Javascript, que é uma coisa bem comum hoje dia. Não sei o quanto que isso aumentaria de complexidade para vocês. Porque se vocês forem fazer o front também no Java, aí você tem que usar algum tipo de template para renderizar HTML, TSP, ou alguma outra ferramenta para poder fazer a parte da visualização das informações. Não tem como fazer uma coisa web, a não ser que seja uma PI. Se for uma PI aí tudo bem. Aí você vai usar só objeto, vai retornar [VOZ CRUZADA] >> O próprio Spring tem o MVC, que também gera as views, a ideia era usar isso. >> Então beleza. Então dá para usar a Spring MVC. >> O Enzo tem uma pergunta, mas ele falou o que é meio relacionado ao projeto, não sei. Deixa eu ver. Faz aí Enzo a pergunta por voz. >> Eu estava dúvida relação a parte de front-end, porque pelo que eu entendi o Spring era mais para back-end e daí uma das primeiras partes do projeto é a gente construir o front-end. Aí eu não sei se dá para fazer isso com Java, ou se a gente teria que usar outra linguagem. [VOZ CRUZADA] >> Fala Daniel. >> Dá para usar o Spring MVC. Deixa eu entrar aqui. Não, entrei no lugar errado. Eu não estou achando. Espera aí. Então. O Spring tem o Spring Web MVC, tem aqui toda a documentação. E aí você pode fazer sua aplicação inteira usando o Spring. Aí você cria os recursos, você cria as views, deixa eu ver exemplo aqui. Olha, está vendo. Você cria HTML e aí você vai você vai ter essas propriedades do Spring, com tema e tudo mais. Aqui tem a documentação bem completa. Dá para usar o Spring Web e criar usando o Spring. A parte do front também. Dá para fazer. >> Então, quem quiser fazer com JavaScript pode, mas daí é uma coisa mais a aprender. É outra linguagem de programação. JavaScript não tem nada a ver com Java. Então eu não proíbo, mas sei lá, é mais coisas que vocês vão ter. Mas daí cada grupo pode decidir. Fique à vontade. >> Entendi. Obrigado. >> Mandei o link aqui to Spring Framework Web para vocês fazerem usando Spring Web. Como eu falei, o Spring ele é conjunto de várias coisas, então tem a parte toda a web aqui, Web Servlet. Tem inclusive WebSocket, para você fazer aplicação tempo real, que conecta com servidor e fica puxando pulling de dado, que o dado fica sendo atualizado tempo real, fazendo push notification, essas coisas, usando WebSocket. >> O Eduardo está perguntando se com o Spring MVC não precisa escrever HTML CSS. >> Não. Tem que escrever HTML CSS sim. Se você vai fazer sistema web você tem que ser HTML. A não ser que você use editor de HTML, sei lá, nem sei. Eu desconheço. Tem que escrever. Oi? >> Fábio, editor de HTML tipo Dreamweaver >> Dreamweaver. Word. Acho que tem que escrever HTML sim. Pelo menos o básico tem que ter. è óbvio que, assim, ele tem algumas coisas que facilitam, tipo tem uns templates prontos, tipo meio que parecido com o Bootstrap, algum desses framers Javascript que já tem monte de CSS pronto, que você não precisa ficar escrevendo CSS Roots. Você pode usar uma uma biblioteca de template meio pronta. Pode usar uma Tirol Design, pode usar o Bootstrap, acho que o próprio Spring tem formato de template deles meio que para você não precisar ter que fazer tudo do zero, mas alguma coisa de HTML você vai precisar escrever. O último comentário aqui só para falar pouco de qual que é a vantagem de usar quando como Construtor, ou como Setter, porque a gente tem essas duas opções. A vantagem de usar como Construtor é que deixa muito claro quem que aquela classe depende. Quando você deixa como Setter, apesar de ter lá o Autowired ele fica meio, principalmente quando você tem várias dependências, fica meio escondido a dependência. Mas também por outro lado, se você tiver muitas dependências você colocar tudo no Construtor também não é muito ideal, porque você vai ter Construtor com sei lá, cinco, seis parâmetros e aí eu já acho que vale mais a pena usar por Setter. Geral, o que a gente costuma fazer é colocar a dependência como Consultor quando tiver uma ou duas dependências, mas se começar a ficar muito complicado a gente muda para Setter. >> Professor, desculpa. Setter não deveria ser usado tipo só para coisas que, entre aspas, não são essenciais? Porque tipo, por exemplo, você está falando de número de telefone lá, por exemplo. Faz sentido você instanciar número de telefone sem número de telefone? >> Não faz sentido. Você tem razão nesse sentido. Mas aí é meio que assim, é uma ambiguidade. Acaba ficando meio que ambíguo mesmo, sabe. Se por lado o que não é essencial deveria ser Setter, mas se é essencial deveria estar no Construtor. Eu concordo com você nesse sentido. Mas por outro lado se você deixar, como o Spring ele meio que trata de popular tudo sem você ter que fazer nada, então você ganha, digamos assim, desconto nessa regra de " se é Setter não é obrigatório porque o Spring faz tudo por debaixo dos panos", entendeu? Como a gente está falando de dependência, então eu acho que tudo bem usar como Setter. Mas realmente é polêmico, porque esse ponto que você falou tem razão. Eu acho que assim, para objetos que são objetos de dados isso faz sentido. Então no caso aqui, esse objeto aqui, o fone, ele tem os dados e eles são obrigatórios. Então está no Construtor e assim que tem que ser. Mas para objetos que não são objetos de dados, que são objetos mais, digamos assim, de estrutura como é o caso dessas classes aqui de regra de negócio, talvez a gente possa ser pouco mais flexível nessa regra de tipos. Se tiver no Setter não é obrigatório, se tiver no Consultor é obrigatório. Mas realmente, não vou dizer que você está 100% errado no que você está falando, mas se você tiver Construtor com 50 parâmetros você vai falar "talvez seja melhor deixar nos Setter, porque este Construtor está muito feio", entendeu? E principalmente, também tem outro ponto que acho que é importante. Às vezes o fato de você ter no Setter não significa que ele é obrigatório e essa é a vantagem do String. Então por exemplo, o que o String faz por baixo dos panos, Aqui. Deixa eu pegar o meu PhoneLister. Se eu colocar o Finder no Construtor, como está aqui, o que vai acontecer é que ele é obrigatório. Então sempre vai ter finder de instanciado. Se eu deixar ele como Setter, o que vai acontecer? ele só vai popular esse finder se ele for tentar usar o finder algum momento. Então ele faz isso, ele consegue fazer isso tempo real, vamos dizer assim, quase tempo real, para garantir que ele é opcional, na verdade. Se eu fizer teste e não usar o finder ele não vai popular. Então de certa maneira ele é opcional, porque eu só vou popular ele quando eu precisar dele. Então ele é meio que tipo [INTELIGÍVEL] e também obrigatório. Entendeu? >> Sim. Obrigado, professor. >> Só uma coisa. Eu acho que na verdade para o Spring funcionar não precisa nem do Setter, nem do Construtor. Só o Autowider no Private acho que ele vai. >> Eu acho que não. Eu acho que não, mas eu posso fazer este teste aqui. Eu acho que tem que ter Setter sim. [VOZ CRUZADA] Se nao tiver nem Setter, nem Construtor, eu acho que não vai funcionar, mas Me pegou agora. Você tem razão. Também precisaria do "Setter", ele já magicamente está lá, então tem toda a razão. Mas isso é uma coisa nova, isso é uma coisa que eu não sabia, isso não existia antes. >> [RISO] >> Está vendo, você é velho também! >> É, eu também sou velho para caramba. Enfim, o Spring, falando pouco de mercado ele é bem usado hoje, é dos Frameworks mais famosos de java. Todo mundo que eu conheço ou usou ou vai usar. Quem trabalha com java, trabalha de alguma maneira com Spring, ele é muito difundido mesmo, sempre tem novas versões, então tem muita literatura, tem muita documentação, é Framework bem bacana. Aqui está o site, aqui está o link do artigo do Martin Fowler sobre injeção de dependência e tem esse livro aqui Agile Java Development with Spring, do Anil Hemrajani, como referência. [ÁUDIO BRANCO] Queria agradecer ao Fábio pelo convite. Se vocês tiverem alguma pergunta fico à disposição para vocês, depois o Fábio pode passar o meu contato também, vou deixar o meu Twiter também, que eu estou sempre no Twiter, twitando. O twitero. Vocês podem me achar por lá também. >> Legal. Então acho que o Enzo já tem uma pergunta. É isso? Fala aí Enzo. >> Então pelo que você falou dessa caminhada programação, você chegou a aprender java antes mesmo de existir o Spring, certo? Eu não sei se eu estou lembrando direito da Timeline. >> Da minha Timeline, na minha [INCOMPREENSÍVEL] profissional? Eu nasci muito tempo antes de existir o Spring. O Spring nasceu 2003 e eu comecei a trabalhar com java 98, então eu vi o Spring nascer, literalmente. E eu me empolguei quando ele nasceu. Eu falei, "Nossa, meu Deus, porque é que eu não tinha esse negócio antes?" para ver como a coisa evoluiu com o tempo. Antes a gente fazia tudo no dedo! Era sofrido. Eu até escondia os slides para não complicar demais mas a gente antes tinha conceito, padrão, que é o "Service Locator". Que é: Você tem lugar central onde todo mundo consulta, então vez de todo o mundo depender de todo o mundo, você tem só cara único, que é o repositório. Tem vários nomes que a gente pode dar para isso mas é o "Service Locator", que ele é responsável por saber onde é que está a implementação real e retornar para as classes. É jeito de usar também. Era meio que no dedo, que a gente fazia antes. >> A minha dúvida é que a gente está aprendendo java agora e a gente já vai aprender [INCOMPREENSÍVEL] FrameWork, que vai automatizar muita coisa que você aprendeu a fazer essas coisas no dedo. Você acha que isso pode gerar uma carência nas coisas que a gente deveria saber mas vai acabar não sabendo porque o Spring já vai automatizar tudo para a gente? Você [FALA CRUZADA] [FALA CRUZADA] >> Essa pergunta é maravilhosa. Porque do mesmo jeito que vocês... A gente até brinca que tem programador nutella e programador "Roots". Essa nova geração de programadores, vocês, querendo ou não, vocês acabam sendo nutella porque vocês nasceram já numa era da internet. Vocês nasceram numa era onde já existia telefone celular. Eu comecei escrevendo email carta, o Fábio começou escrevendo email na pedra. >> Não, eu mandava carta para universidade americana pedindo "paper" e botava no correio. Ia a pé até o correio e mandava. [ÁUDIO BRANCO] De maneira geral, você tem razão, vocês acabam perdendo pouco do funcionamento do que tem por baixo dos panos mas também acho que vai muito da iniciativa de cada de buscar "Como que esse negócio funciona?" e entrar lá no código de Spring, porque eu sei que é o PayService, e entender o que está acontecendo lá por trás. Então eu acho que sim, por lado vocês perdem, mas por isso que vocês estão fazendo também computação no [INCOMPREENSÍVEL], porque vocês estão aprendendo os conceitos e normalmente o [INCOMPREENSÍVEL] puxa pouco mais para o lado de ir mais no detalhe de como as coisas funcionam. Mas, por exemplo, hoje, do mesmo jeito que você está me perguntando isso, quando eu comecei a programar, eu não sabia Assembly, eu não sabia linguagem de máquina. E aí eu poderia estar perguntando, mas se eu estiver programando C, que eu só escrevo comando fora e ele automaticamente coloca as coisas no registrador e já faz as contas, isso é muito mágico. Eu acho que por lado você está certo, mas por outro a tecnologia vai evoluindo e a gente vai criando camadas cima de camadas e aí é pouco de escolha de para onde a gente quer ir. Se eu quiser ficar na camada superior, eu acho que tem muito espaço para crescer e se desenvolver. Se você quiser, você pode ser programador só de Front-end. Hoje o nível de detalhe que você precisa de saber para programar Front-end, você cria uma carreira cima disso! Se você quiser fazer só programação de máquina, você também tem mercado para trabalhar com circuito, para trabalhar com sensores e etc, com robótica. Então eu acho que vai muito do quanto cada quer se envolver dentro de cada camada. Então se você quer se aprofundar para entender como funciona, beleza, lindo, você vai se aprofundar. Se você não quer, e quer usar e quer ver funcionando e se tiver funcionando, idealmente, beleza, manda para a frente. Do mesmo jeito que hoje você aperta o botão na luz e acende a luz e ela acende/apaga e você não precisa saber de onde está vindo a energia e se a luz acaba, você só tem que ligar para alguém e falar "O que está acontecendo?", você não tem o que fazer. É pouco isso. O poder na sua mão versus a facilidade. Quanto mais poder você tem na sua mão, quanto mais facilidade você quer, menos poder você acaba tendo, então é "Trade-Off" que eu acho que sempre vai existir na tecnologia. Conforme ela vai evoluindo, vai saindo cada vez mais nesse sentido, é uma escolha. >> Legal. Tem uma pergunta do Eduardo, faz daí você a pergunta Eduardo. >> Eu só queria saber quando é que a gente deveria usar os packs no java, porque até então eu pelo menos não estava criando nenhum mas não sei se talvez num servidor web faça mais sentido ter package. >> É que o VS Code te obriga a criar o package, ele reclama se você não criar. Acho que foi por isso que o professor criou. >> O package que você está dizendo de ter essa estrutura aqui vez de criar a ISO? O que vocês estão chamando de package? >> Isso mesmo. >> Isso daqui é meio que uma convenção de nomenclatura, porque se você colocar tudo na raiz e rodar esse código... é boa prática a gente sempre criar o package porque quando eu vou trabalhar com códigos entre vários programadores ou várias empresas, cada costuma ter uma identidade. Então eu coloco com.pravaler, para dizer que isso aqui foi feito pelo Pra Valer. No caso, você pode colocar com.Daniel ou só daniel.cukier .spring. Posso por o nome que eu quiser, na verdade. Mas é legal ter uma identificação porque isso diferencia a sua classe PhoneLister, da classe do seu amigo Phone Lister. Então quando vocês rodarem os dois projetos juntos, não vai dar conflito. O problema de não colocar o package, é que se você coloca tudo na raiz, a chance de dar conflito quando [INCOMPREENSÍVEL] jars de pessoas diferentes é muito alta entãopor isso que é uma boa prática sempre criar pacote. >> Obrigado. [FALA CRUZADA] >> Pode ser tanto perguntas específicas de java quanto filosóficas ou sobre o mercado de emprego [FALA CRUZADA] Eu gosto das filosóficas. Vocês já aprenderam MVC? Vocês já viram MVC ou ainda não? >> Deveriam ter visto porque foi o papo da aula passada. >> [RISO] Tá bom. >> Quem não assistiu o vídeo, tem que assistir. Assista. >> Qual o vídeo da aula passada? >> Porque é que se perguntou [INCOMPREENSÍVEL]? >> Porque eu vou mandar vídeo para vocês de uma música que eu fiz de MVC. Vou mandar aqui no chat para vocês. >> Legal. Se for boa eu coloco no material didático da semana de MVC. >> Com certeza é boa. Imagina...não é boa... >> Eu tenho uma dúvida. >> Fala a dúvida. >> Voltando naquele ponto que foi levantado [INCOMPREENSÍVEL] Spring, [INCOMPREENSÍVEL] fazem esses trabalhos O trabalho por debaixo dos panos para gente, a gente pega as coisas mais fáceis por assim dizer. [BARULHO Acho que tem ponto também que a gente aprende as coisas, mas deixa de aprender essa parte de infra e, enfim, é uma parte difícil mesmo. Eu não, a gente acaba entendendo muito pouco disso, mas também os desafios atuais a gente consegue ser muito bem atendidos, assim, pensando mercado. Então ao ponto que o desenvolvedor perde conhecer a infra do projeto, assim, ele ganha talvez eficiência, rapidez de entregar projeto. Então acho que tem essa troca também, que no mercado é boa. Pensando talvez no desenvolvedor acaba sendo ruim, mas no produto acho que ajuda bem. Não sei nem se isso é uma pergunta, talvez. É mais ponto que eu tinha >> Não, mas é meio por aí, é bem por aí. De fato, se você não entra no detalhe da infra você entrega mais rápido. Porque é isso, as abstrações, as coisas começaram a ficar mais recentemente camadas de abstrações mais altas. Então você consegue fazer muito mais coisas Então pensa, do mesmo jeito que eu dei exemplo que antigamente você tinha que escrever código assembly. Na verdade é assim, antigamente você tinha que escrever. Pensa como tudo começou. Você ia ter que furar o cartão para levarem esse cartão para lugar para ele ser rodado num programa dentro da máquina. Aí depois eles evoluíram para você ter teclado, com monitor. Então você começou a ficar mais produtivo com teclado. Na verdade, no começo nem tinha monitor, tinha só uma impressora. Você conseguia digitar no teclado, mas você não via o que você digitava. Tinha que imprimir para ver o que você digitava. Depois veio o monitor. Aí depois veio a linguagem C, que foi primeiro grande marco, assim, termos de eficiência. Então eu não preciso mais falar a língua da máquina, eu posso falar uma linguagem pouquinho mais alto nível, que era o C. Hoje C já não é mais alto nível, o C já é baixíssimo nível. Você pode falar HTML. Tudo bem que HTML não é exatamente uma linguagem de programação, mas assim, você consegue criar coisas que são úteis para o mundo sem necessariamente tendo que ir lá no bit e byte da coisa. Acho que cada vez mais estão falando de machine learning. Hoje dia você não precisa ser expert de machine learning para conseguir criar efeito de machine learning. Então usar categorizador para poder classificar uma imagem e tudo mais. Então tem muita coisa hoje disponível no mercado de ferramenta, de biblioteca, de código que você simplesmente usa sem saber. É caixa preta, você usa e você por usar essa coisa que já está pronta você consegue. Então hoje o desafio não é mais como fazer isso ou aquilo específico, mas como juntar as várias coisas que você já tem disponível e criar uma solução original. Então acho que hoje o programador ele é muito mais criador de Frankensteins, que pega pouquinho ali, junto o Spring com o React, com o Material Design, com sei lá o quê, que são coisas bem de alto nível, mas que ele consegue compor de jeito que cria site super lindo, maravilhoso, que tem monte de coisa legal, muito rápido. Então é pouco por aí mesmo. >> Sim. Legal. Era mais nesse sentido mesmo de entender, talvez o papel do programador tenha mudado. Acho que pouco nesse ponto. Pelo menos quem trabalha com coisa de alto nível. Ainda tem programadores que mexem com código. >> Professor, eu tenho uma dúvida. >> Quem está falando? É o Enzo? >> Augusto. >> Augusto. >> Fala o Augusto, depois o Rafael Yokowo. >> Filosófica e >> Fala. >> É filosófica e sobre experiência de mercado. Você acha que ainda tem mercado e por quanto tempo vai durar esse mercado para o pessoal que gosta de ter todo o poder na mão para não ter essa facilidade. Gente que vai viver de reinventar a roda para continuar mantendo os sistemas melhores, os sistemas bons, os sistemas eficientes? >> Cara, eu acho que assim, o que eu percebo é que mercado acho vai existir durante muito tempo para tudo. Acho que tem espaço para tudo. Se você quer ser especialista bits e bytes, você tem empresas que fazem, sei lá, fabricam chips que estão procurando otimizar o bit do byte para conseguir fazer processador mais eficiente. Então tudo depende muito do contexto de onde você está trabalhando. Se você está trabalhando numa fábrica, você tem contexto. Se você está trabalhando numa empresa como Pravaler, que é banco, você está pensando num outro contexto. Se você está trabalhando com música, tem que saber processamento de sinais. Então para cada empresa que você tiver é tão diverso. Se for trabalhar com jogos você vai ter que se preocupar com outras coisas. Então tem tantos universos hoje dia, que eu diria que tem espaço para qualquer tipo de coisa que você quiser ser. Se você quiser ir no detalhe, do detalhe, lá da minúcia do compilador e criar novo compilador, se você criar computador que é melhor do que todos os computadores que existem hoje, tem mercado para isso, porque compilador é algo que ainda tem estudo, tem pesquisa e tudo mais. Então eu acho que vai muito do gosto de cada. Agora óbvio, você tem que entender o problema e o contexto onde você está. Então se você está numa empresa que quer fazer site e você quer ficar lá escovando bit, talvez você não esteja fazendo a coisa certa porque o objetivo da empresa não é escovar bits, é entregar o site para o cliente. Acho que uma coisa que falta muito nos desenvolvedores que eu vejo que entra no mercado é essa empatia com o propósito da empresa e a missão da empresa entregar aquilo que tem valor para o cliente da empresa e não alguma coisa que você quer fazer porque você quer aprender uma linguagem. Então tem muito desenvolvedor que acaba muito ficando no técnico, na parte tipo "quero essa linguagem" e aí fica discutindo qual é a melhor linguagem e tudo mais, quando no fim não importa muito qual é a linguagem. Importa é resolver o problema do cliente. Eu acho preferível sistema mal feito que resolve problema real de alguém, do que o sistema bem feito que não resolve o problema de ninguém. Mas óbvio que o ideal é fazer o sistema que resolve o problema de alguém bem feito, porque é isso que a gente quer ter, para poder ter manutenção, para poder evoluir com o tempo. Mas acho que geral, os programadores não tem muito essa conexão com o usuário final e eu acho que isso é bem importante para o mercado de trabalho hoje dia, pelo menos na minha opinião. >> Obrigado, professor. >> Legal. Rafael Yokowo Ele perguntou o que é a opinião sobre No Coach Programming. Eu não sei exatamente o que é isso Rafael. Você pode explicar pouco melhor? Eu nunca ouvi falar deste No Coach Programming. >> Se for o que eu acho que é, tem uns framers de design hoje dia que já criam código HTML CSS todo formatado. Tem uns que compilam até racket. >> Cara eu acho assim, para as coisas que são protótipos, para você criar protótipo, para você fazer uma coisa que não vai ter evolução, juro, eu vou mostrar para vocês uma coisa aqui. Cadê a minha apresentação que eu fiz ontem lá no Está aqui. Cara, eu comecei a programar com >> Tem que compartilhar a tela. >> Não estou compartilhando. Espera aí Cadê? Eu só vou precisar sair senão não vou conseguir almoçar. Eu vou ter uma reunião daqui a pouco, mas eu vou só compartilhar uma coisa aqui com vocês. Estão vendo a minha tela aí? Estão. >> Sim. >> Então eu comecei a programar numa tela desse tipo assim. Era uma tela azul e eu programava Clipper. E era editor de texto só teclado, não existia mouse. No começo da Computação não existia mouse, aliás não existia nem tela como eu falei, mas na minha época já existia a tela. Eu comecei por tela. O Fábio Kon talvez tenha começado sem tela. Mas cara, desde que eu me conheço por gente existe essa tentativa. Então essa é uma tela do VB, VB6, Visual Basic. De você fazer uma programação que cria a interface de forma gráfica sem você ter que programar a interface. E todas as tentativas que eu vi até hoje de fazer isso, elas nunca são escaláveis. Ou seja, você pode até criar essa tela, mas a dificuldade de dar manutenção nela é muito grande, porque o código que fica por trás dessa coisa manual, ele é tão feio, ele é tão horrível de mexer que você não consegue mexer mais. Então para fazer uma coisa, protótipo, funciona muito bem, mas aquilo fica meio travado no tempo e não consegue evoluir. Então, de maneira geral, eu nunca vi e existe essa tentativa desde 1995 de tentar criar uma coisa mágica. O próprio Flash, eu lembro que o Flash era a revolução. Aí criaram o tal do Flash, que você não precisa programar, você simplesmente bota, cria lá, arrasta e clica e programa só com o mouse. Mas eu acho isso pouco ilusório, sabe. Eu acho que na prática mesmo você tem que escrever código. Talvez você possa usar ou outro framer para te facilitar, mas eu acho que ainda está para nascer framework de criação visual que consiga ser robusto a ponto de você conseguir evoluir o O programa sem [INCOMPREENSÍVEL] totalmente macarrônico com o tempo. >> Eu quero complementar isso: Primeiro eu não sou tão velho como você acha, que não tinha monitor. Eu tinha monitor faz muito tempo, quando eu comecei a programar, >> [RISO] >> mas era monitor de fósforo verde, não era colorido e era só texto. >> Era esse aqui. >> É isso aí. [RISO] >> Esse aqui é meu primeiro computador, TK300. >> É dessa época. Você vê que não tem coisa gráfica. Esse desenho do videogame é feito com letras e com símbolo, com barras, não é [INCOMPREENSÍVEL]. >> [RISO] >> Mas naquela época já tinha termo, chamava geradores de aplicações. Que era isso, a ideia que você não ia programar numa maneira de programação, você usava programa que ia gerar as aplicações. [INCOMPREENSÍVEL] isso é década de 80. Provavelmente 1990 você falava linguagens de 4ª geração. Linguagem de 4ª geração também seria uma linguagem que você não programa, você só fala mais ou menos o que você quer e ele gera o programa, então isso aí se fala 40 anos e... >> É igual fim do mundo. Estão falando do fim do mundo já faz uns 200 anos mas não chegou ainda o fim do mundo. [RISO] >> Sempre se falou isso e você consegue até certo ponto mas o sistema que você gera sempre fica uma coisa meio amarrada que é difícil dar manutenção e você não tem muita flexibilidade É possível fazer coisas mas eu ainda acredito, por enquanto, pelo menos, abrir o editor de texto e digitar código porque o poder que a gente tem por enquanto ainda é muito maior, não vi surgir nada que tenha poder e uma flexibilidade e uma manutenibilidade tão boa quanto linguagens baseadas texto. Até o Gabriel comentou que tem umas linguagens de programação que são visuais, baseadas blocos. Você programa fazendo "drag and drop" de blocos e conexões entre os blocos e você pode entrar dentro de bloco e programar o bloco. Por exemplo, eu dou uma disciplina de computação musical e tem uma disciplina que chama PD (Pure Data) que é para processamento de música e de sinais de áudio e é uma linguagem de programação visual por blocos e que eu acho que é muito legal mas se você começa a fazer programa mais complicado fica [INCOMPREENSÍVEL] porque na sua tela tem 300 caixinhas com 258 linhas conectando as caixinhas e você não entende mais nada. Tem limite de complexidade que essas linguagens conseguem. Já java, tem sistemas com milhões de linhas de código que o pessoal trabalha numa boa. Você ia mostrar mais alguma coisa? Você está fazendo viagem no tempo com essas telas. >> Eu estava só mostrando para vocês como que a gente trabalhava no windows. Esse aqui é o windows 3.1. Está vendo? >> Isso é emulador do windows que você está rodando? >> É o windows mesmo, eu estou fazendo uma máquina virtual. >> Tá. >> Mas ele funciona mesmo. Tinha editor de texto, tinha "Paint Brush". Viagem no tempo. >> "Paint Brush" eu citei ele mais ou menos quando eu falei no padrão Prototyped. Não, do padrão State! Que o... Bota o Paint Brush aí de novo. Quando você clica numa ferramenta ele muda o estado do objeto e tem comportamento diferente. O Leonardo comentou que...você quer falar Leonardo? >> Se tiver tempo queria uma pergunta mas tem alguma pergunta pendente de aluno aí? >> Não, pode fazer sua pergunta. >> Tá, que é como o [INCOMPREENSÍVEL] incentiva bastante o empreendedorismo, o Daniel é empreendedor serial, acho que é relevante. Eu não entendi se você saiu da [INCOMPREENSÍVEL] ou se a [INCOMPREENSÍVEL] acabou. E se a [INCOMPREENSÍVEL] acabou, se você pudesse falar, porque ela acabou? >> A [INCOMPREENSÍVEL] não acabou, a [INCOMPREENSÍVEL] ainda existe. Eu decidi sair da [INCOMPREENSÍVEL], na verdade eu já estava na [INCOMPREENSÍVEL] já fazia 6 anos e foi uma decisão meio pessoal mesmo. Eu continuo como sócio da empresa, eu só saí do dia-a-dia. O time já estava muito bom e a empresa já estava andando meio que sozinha, estava se desenvolvendo numa velocidade que não estava indo tão rápido quanto eu gostaria como negócio e eu decidi pegar outro desafio para minha carreira. Acho que foi uma decisão de momento de vida, de decisão pessoal. Mas a empresa continua rodando continua indo bem e a gente continua tendo clientes grandes como a Globo...o YouTube é nosso cliente, a empresa está indo bem. Só que está num ritmo pouco mais lento do que eu gostaria para o meu gosto pessoal do momento. Por isso é que eu decidi...recebi uma proposta tentadora de trabalhar nessa empresa e com uma missão que eu acho que é incrível que é trabalhar com educação, ajudar mais pessoas a terem acesso a estudo e decidi vir para valer e estou realmente aprendendo muito, estou crescendo muito nessa empresa então para mim está valendo muito a pena. >> Valeu. >> Mas eu também gosto muito da [INCOMPREENSÍVEL], continuo o contato com as pessoas lá, de vez quando a gente se encontra e continuo contato com o time da [INCOMPREENSÍVEL] que é uma empresa que eu tenho bastante carinho também, obviamente, pois trabalhei seis anos lá. >> Deixa eu ver aqui... O Vitor perguntou o nome da disciplina de Computação Musical. A disciplina de Computação Musical se chama Computação Musical. Se não me engano acho que é MAC337. O Daniel fez a disciplina, certo? >> Há muitos anos atrás. Há século atrás. >> Eu fiz ela num mestrado ou no doutorado. Na verdade eu fiz no doutorado ela. >> E como foi? Você fez com outro professor, com Marcelo Queiroz, certo? >> É, eu fiz com Queiroz. Eu gostei muito, eu sou apaixonado por música, eu sou meio suspeito para falar mas eu adorei. Eu acho o Marcelo muito bom professor, ele é bem teórico. É uma disciplina que era pouco mais teórica do que a gente espera. Se você está querendo ir para a disciplina para ouvir música >> [RISO] >> e falar qual é que é a próxima coisa que vai bombar, você vai para a [INCOMPREENSÍVEL], você não vai para a disciplina de Marcelo Queiroz. Agora se você quiser saber pouco mais de algoritmo, processamento de sinais, entender como é que funciona por baixo dos panos, aquela coisa de saber o que tem por trás da música no computador, aí acho bem legal. Eu trabalhei com o PD também. A gente fez várias EPs integrado com o C, implementando os algoritmos de mudar tom da música, acelerar...é bem interessante, eu gostei bastante. Não sei como é que está hoje, faz mais de dez anos que eu fiz. >> Deu uma atualizada mas nessa linha ainda. >> Mas eu recomendo, eu me diverti muito. >> Tá. >> Eu fiquei de rec mas eu passei. [RISO] Passei com 10. Eu fiquei de rec e tirei 10 na rec. >> [RISO] >> Eu sempre fui assim. Eu não estudo durante o semestre e depois eu estudo durante a rec. [RISO] >> Tá bom. >> Algumas disciplinas, quando eu não tenho tempo de estudar. Mas não façam como eu, não sigam o meu exemplo, não é bom exemplo. [RISO] >> Definitivamente. >> Mas agora você não vai estudar mais. Você já vez graduação, mestrado e doutorado, não tem nada mais para estudar. >> Tenho muita coisa para estudar. Agora é que eu quero começar a estudar de verdade! Acho que a gente sempre tem que estudar. Eu adoro estudar, acho que nunca vou parar de estudar. >> Tá. Tem uma dúvida... [FALA CRUZADA] >> Até fazer essa apresentação de Spring foi legal, eu gostei, porque eu tive que estudar para fazer porque eu não lembrava nada. >> O Carlos Eduardo. Fala aí, Carlos Eduardo. >> Para empreendedorismo, vale fazer doutorado ou é melhor entrar no mercado mais cedo? >> Antes do [INAUDÍVEL] na provocação que eu sinto que ultimamente tem muita gente até falando que não dá nem para terminar a faculdade. >> Eu acho uma boa ideia terminar a faculdade. Essa coisa de que empreendedor não estudou, Steve Jobs fugiu da faculdade, isso é o maior mito. Acho que o Fábio já falou disso. 95% dos grandes empreendedores das empresas que deram certo têm ensino superior. Pegar caso e dizer que é a regra e você seguir esse caso, acho meio arriscado. Estatisticamente, pessoas que têm ensino superior elas tendem a ter mais sucesso como empreendedores. É que a gente olha só os casos específicos então não acho. E eu diria a mesma coisa relação ao mestrado. O doutorado ele vai muito no sentido de que se você quiser fazer uma coisa muito específica... Se você olhar os fundadores do Google, por exemplo, o Google saiu de doutorado. Se você for fazer algum doutorado e você que empreender, tenta focar o seu doutorado alguma pesquisa que tem alguma aplicação no mercado. Você tenta juntar as duas coisas, acho que o ideal seria isso. Agora, se você vai fazer negócio que não exige nenhuma grande inovação tecnológica, aí talvez não faça sentido fazer doutorado. Tudo vai muito do gosto de cada. Então se você quer criar novo algoritmo de machine learning ultrassofisticado para capturar o número de estrelas do céu e descobrir qual é a nova fórmula da Coca Cola beleza, faz doutorado. Se você quer fazer negócio e tem cliente e é negócio básico, que envolve tecnologia mas não é assim ultra tecnológico, talvez não faça sentido fazer doutorado, então acho que vai muito da onde cada quer seguir como carreira. Acho que não tem certo e errado, é mais o gosto pessoal de cada. Eu gostei de fazer doutorado porque eu queria entender o mundo de empreendedorismo então eu fiz o doutorado sobre empreendedorismo. Mas é porque eu queria entender como é que funcionavam, quem é que tinha, quem é que investia, como que eram os investidores, como é que funcionavam os ecossistemas, eu tinha esse interesse pessoal naquilo. Para mim era interessante saber isso, até para ser empreendedor dentro desse ambiente mas tem gente que gosta de computação musical e quer criar uma nova placa de áudio para fazer música eletrônica. Beleza, também é válido.