domingo, 3 de dezembro de 2017

Emprego: Preparação técnica - QUICK SORT

A aí cafeinados, tudo certinho?

Como eu disse no post na parte mais "humana" da procura e contratação de emprego (nesse post), hoje eu vou começar a expor quais são os principais algorítimos que são utilizados pra dividir experiências e qualificações técnicas entre os candidatos.

É muito comum que elas existam e todos devemos sempre estar preparados para essas questões que sempre podem nos por a frente durante a decisão de um posto de trabalho.

A primeira que eu vou falar vai ser do quick sort.


Quick Sort

Um dos muitos métodos de ordenação de um vetor, o quick sort é sempre um bom começo quando estamos estudando análise de algorítimo.
Uma de suas muitas características é que ele utiliza a metodologia de "dividir para conquistar". O quick sort deverá ser implementado com algumas ideologias:

Propriedade de http://www.instanceofjava.com

Pivô

O pivô será utilizado como base da comparação com a primeira e a segunda parte da iteração corrente. Existem muitas formas de como escolher o pivô e cada um tem sua característica mas, muito comumente ele é escolhido no meio do vetor inicial.

Comparações e Troca

Aqui é o primeiro coração do algorítimo. Tudo o que ele se propõe é, através da comparação constante com o pivô, ele escolhe dois elementos onde um sempre será menor que o outro e troca as suas posições.

Subdivisão

O segundo coração do algorítimo, quando as comparações e trocas terminam seu processamento, o código separa o vetor inicial em pedaços menores e repete o processamento desde o começo (na escolha do pivô). Esse procedimento continua até o momento em que uma divisão de vetor resulte em elementos únicos.
No momento em que o tamanho dos vetores divididos forem 1, o vetor ordenado estará pronto!

Custo

Obviamente precisamos saber um pouco de análise de algorítimos para entendermos no que constitui o custo do código. 

Pior caso:  θ(n²).
Melhor caso: θ(log 2 n).

Código

Para ver o código do quick sort implementado em pseudo código entrar em:

É isso, pessoal, o quick sort é um algorítimo muito utilizado nas entrevistas de emprego. Por isso, entendam e mantenham sempre na mente ao menos a lógica. O resto vem com o tempo!

Até a próxima!

sábado, 18 de novembro de 2017

Procurando emprego: 3 dicas essenciais.

Olá, meus queridos cafeinados. Tudo bom com vocês?

Eu estou de férias :) E, finalmente, criei tempo pra voltar a escrever pra vocês.

Durante a trajetória profissional, nós nos encontramos constantemente tendo que nos provar para uma empresa para que ela veja valor em nos contratar. A visão que eu espero dar nesse post é do processo desde o início da procura do emprego até a efetivação do cargo pretendido.



1 - Que empresa procurar?


Pessoal, é obvio que isso depende muito do momento de vida que se está: desempregado a muito tempo, louco pra sair do emprego atual, sem reservas econômicas etc. Mas o que se deve procurar em uma empresa como profissional?

A resposta pra isso é sempre uma empresa que te tire do seu estado de conforto atual. Manter-se aprendendo é sempre o melhor que podemos fazer como profissionais. Imagine-se, portanto, sendo pago pra se aperfeiçoar por 8 horas ao dia?

Mas é necessário ter a contra-medida. É possível ser feliz sempre se forçando a não saber nada com o sentimento de impotência ao ajudar seu time? De forma alguma!
O melhor emprego está justamente aí. Uma contra-medida entre o desafio e o conservador. Quanto mais novo se é, maior é o risco que você pode se por ao lado do desafio. Com o passar do tempo, o conservadorismo vem naturalmente.


2 - Quanto devo pedir como salário?


Existem sites que lhe auxiliam nesse momento. Mas, obviamente, você deve saber seus limites de preço. Não se enganem. As empresas podem vender o mundo ideal em que trabalhadores felizes encontram-se com patrões sorridentes e trocas de informações seguem em direção ao mundo ideal do capitalismo!

Isso pode até acontecer. Mas o pé no chão deve existir!

Você é um ativo para a empresa e deve se ver como tal.

Sites como:
https://www.lovemondays.com.br/
http://www.salariobr.com.br/


São ótimos pra esses momentos. Fora isso, na hora de procurar emprego, procure em muitas empresas. Isso vai lhe dar um sentimento bem preciso de como está o mercado em comparação com suas competências.

3 - Na hora da entrevista. Como agir?


Primeiro deve-se atentar para o óbvio: Existe a chance do não. E ela deve ser encarada de forma banal. 

Infelizmente, uma característica de profissionais da nossa área, é de pessoas introvertidas sem uma característica social muito forte. E isso é completamente o contrário que deve-se ser durante uma entrevista.

Sorria! Sinta-se confortável e só diga a verdade para todas as perguntas sem ser grosseiro e monossilábico!
O momento da entrevista pouco é para se analisar se o profissional é tecnicamente bom o suficiente. O RH está lá para saber se, ao ser posto junto da equipe já existente, você vai conseguir se habituar com a mesma assim como com a empresa.

De igual importância, você também deve fazer perguntas e analisar se a empresa é o que você esperava, se (e somente se) ambas as partes estiverem de acordo que os próximos passos da contratação devem ser tomados!

Então é isso, pessoal! 3 dicas para quem está pensando em procurar emprego.
Essa foi a parte humana da contratação. Os próximos posts vão se focar em lhe deixar preparado para a parte técnica!

quinta-feira, 8 de dezembro de 2016

FACULDADE: Qual matéria escolher?

Boa noite, meus cafezinhos especiais com gosto de canela, tudo bom?

Eu sei, é um absurdo o que fazem com a gente. No mesmo período, na faculdade, vemos calculo, física, álgebra, eletrônica, computação e o nosso cérebro começa a ficar maluco. Literalmente você não sabe o que fazer.

Mas pra toda escolha na vida, uma consequência.
Estou aqui pra tentar diminuir as consequências ruins aumentando o número de escolhas boas.

Então, quais são as matérias que mais devo me preocupar na faculdade?

Lembrem-se. Nem todas as matérias que eu falar aqui têm o mesmo nome exato que as de vocês. Mas a grande maioria das faculdades a possuem. Com o mesmo nome ou semelhantes :)




1 - Álgebra

Pode parecer que não. Mas álgebra tá em todas as grades curriculares por um motivo: Ela está por TODO o canto da computação. 
Os modelos matemáticos conceituados na matéria se aplicam com precisão cirúrgica nessa profissão. Sim: vocês vão ver integrais até o fim da vida na vida acadêmica, logo, estudem.

2 - Estruturas de Dados e Algorítimos

Eu acho bastante tácito isso estar aqui, mas...
Galera, é aqui que a mágica acontece. É aqui que o COMEÇO do conhecimento vai ser galgado. Infelizmente é bastante improvável que no fim da matéria (e até mesmo no fim da faculdade) você saia um expert em alguma linguagem ou em estrutura de dados.
Mais do que qualquer uma, essa é uma matéria que você precisa estudar com mais afinco que qualquer outra e treinar em casa ou trabalho.

No começo vai parecer estress desnecessário mas persista. Você vai ser um profissional bem mais completo e seguro das suas habilidades mais cedo ou mais tarde.

3 - Lógica Matemática

Aqui é onde a personalidade do programador é moldada.
Já ouviu a frase: "A mesma coisa pode ser obtida de formas diferentes." ?

Sim, é verdade. Isso é a maior verdade que vivenciamos na nossa programação. Mas sempre existirá caminhos menores, caminhos melhores, caminhos mais conhecidos... E você não quer ser o cara que vai até a Russia pra chegar em Miami.

Eu acredito em você!

4 - Análise de Algorítimos

Pessoalmente essa é a minha favorita.
Desde o início é possível ver o quanto essa matéria pode contribuir para um ambiente de desenvolvimento.
Ela te dá o poder de olhar pra um código e detectar características sobre ele.
Não é necessário que alguém o escreva, compile, teste pra saber que aquilo vai dar problema.

Um programador que estudou essa matérias sabe, de antemão, quando o código é bom, faz o que deve fazer da melhor maneira.

5 - Arquitetura de Computadores

Tudo teve um começo. O computador que você usa hoje pra apertar um botão e começar uma partida de Lol já foi um emaranhado de fios que se conversavam com alavancas. Você deve saber como acontece lá por baixo.
Você confiaria em um médico que não sabe como o corpo humano funciona? Não!
Então porque o profissional da área de informática não deve saber?

Se olhar com mais proximidade dessa matéria você vai ver certos gênios que pensaram em algumas das coisas mais lindas da história :)

6 - Banco de Dados

Ah, a informação.
Tudo gera e todo mundo quer ela. Mas ... qual a melhor forma de guardar?
É aqui que tudo acontece. Técnicas e ferramentas para armazenar tudo o que você vai precisar em curto, médio e longo prazo. 
Numa visão fora da vida acadêmica, todos devem saber o mínimo de bancos de dados. Dê uma atenção especial pra essa matéria.

----

É isso, minha gente. Estão se sentindo mais motivados a estudar?
Eu espero que sim.
Qualquer dúvida ou recomendação, pode colocar nos comentários.

Abraços!




terça-feira, 29 de novembro de 2016

Gosto de computação mas não de programar

Calma, cafeinado. Eu sei que é difícil. Mas existe muito mais pra ver!

Boa noite, meus queridos leitores. Tudo bom?
É, eu sei. As vezes, por mais que tentemos, aquele trabalho da faculdade parece difícil demais, abstrato demais, longe demais pra ser alcançado.
Pra colocar a cereja no bolo, a cada pesquisa que fazemos no Google, achamos aquele estudante de primário que sabe fazer tudo o que você queria fazer de três formas diferentes.

É horrivel, eu sei. Dói e, as vezes, a gente se pega pensando, será que eu sou mesmo desse mundo?
Tudo depende de você mesmo!

Calma! Nesse post eu vou tentar expor pra vocês que existe muito mais no dia a dia do profissional de TI do que simplesmente o programador.




DBA

A sigla significa Database administrator. Esse cara está ligado fortemente com bancos de dados e garante que a segurança, gerenciamento, instalação, configuração, atualização e, por fim, monitoramento desse mundo que são bancos de dados.
A informação está toda na sua responsabilidade, muitos dos problemas que o programador tem no final da linha pode ser resolvido por um DBA. ele é de SUMA importância num ambiente sério de desenvolvimento.

CM

A sigla significa Confguration Manager. É o profissional que cria e mantém a consistência da performance da criação de um produto. Ele é a pessoa referência em versionamento de código, geração de builds e releases, tem a visão macro de onde exatamente o código começa e onde ele deve terminar. Nada (NADA) vai para o fim da linha sem passar pela mão dele e, quando a roda do desenvolvimento começar a dar problemas, pode ter certeza que é culpa do CM :)

Gerente de Projeto

Assim como qualquer outro cargo de gerência, o gerente de projeto comanda uma equipe de desenvolvedores com o objetivo máximo de entregar o projeto/produto em um tempo acordado com as capacidades que lhes é dado. A responsabilidade pela entrega é desta pessoa e, normalmente, é um cargo de muita confiança.
Por este motivo, dificilmente é um cargo de começo de carreira. O conhecimento do mundo de negócios e do mundo de programação precisa ser muito grande ao ponto de ambos acreditarem na sua capacidade.

Tester

Testadores - meu pior pesadelo -. Ruim com eles, absurdamente impossível sem eles. Esse pessoal garante a qualidade do produto que está sendo desenvolvido.
Constantemente vistos como programadores que não deram certo, (o que, na minha visão, é um completo absurdo) os testers trabalham lado a lado com os desenvolvedores para garantir que uma linha de código nova não vai acabar com todo um desenvolvimento a longo prazo.
A característica mais forte desse time é a minuciosidade, paciência e foco. 

Designer

É, eu resolvi colocar esse cara aqui. Muita gente pode não saber, mas o cérebro de um designer funciona (em determinados passos de criação) assim como o de um programador. O mercado de trabalho tem uma dificuldade absurda em encontrar designers que pensem como programadores e que consigam criar projetos ao ponto de ser um produto lucrativo ao utilizar exatamente as possibilidades que lhe são dadas.


É isso :)
Não desistam de participar desse mundo, pessoal.
É recompensante de muitas maneiras!

segunda-feira, 31 de outubro de 2016

Debug - Meu código tem erro

Como achá-lo?

Boa noite, meus amores. Tudo bom?
Hoje o dia na empresa não foi um dos mais fáceis. O time de teste foi avisado que seria cortado mais da metade e todo o envolvimento de time foi afetado. 
Fora todo aquela torta de climão que fica no escritório, o que mais isso pode comprometer?

Não se enganem, testers não são programadores frustrados! Testers garantem a continua integração das suas linhas de código sem que vocês quebrem tudo o tempo todo.
E, acreditem, temos esse poder. 

"Para cada bug corrigido, três outros aparecem"

Isso é uma máxima utilizada pelo time de testes. Pode parecer brincadeira de primeira, mas é muito verdade.
Isso também dá uma noção muito maior de como devemos encarar os bugs que o time de testes mandam para nós.
Aqui segue uma receita de bolo de como encarar quando um bug novo chegar:


1 - Esse bug faz realmente sentido?

Olhe na documentação! Grande parte do time de testes trabalha em cima de métricas por bugs abertos. Diferente de programadores, a forma de medir produtividade dos testers é por bugs achados. Eles farão de tudo para chegar nessa métrica. Até inventar coisas que não devem ( =/ ).
Se embase fortemente na documentação e debata que muitas das vezes você vai conseguir terminar o bug com uma simples conversa.

2 - Vale a pena resolver esse bug?

Como já mencionei, resolver um bug está longe de tornar o código mais estável. Quanto mais experiente você se tornar, menos efeitos colaterais você vai gerar. (Mas eles SEMPRE estarão lá!)
Então pense bem e discuta com sua gerência se vale a pena resolver meter a mão naquele pedaço de código que pode trazer problemas pra você, pro seu time, pro projeto e uma dor de cabeça pra todo mundo.

3 - Resolva esse problema!

Grande parte de nossa vida mora aqui: Bugs. Eles são parte do seu dia a dia como profissional. Logo, trate-o com o devido respeito! 
Resolva sempre da melhor maneira, com o máximo de empenho ao considerar todos os possíveis pontos de entrada, formas de saída, tarefas assíncronas, síncronas, formas de apresentação (ufa ... ) enfim, TUDO.
Não entregue o trabalho meia boca. Você tem uma equipe que verá a sua produtividade a partir disso e a sua fama vai muito mais longe do que você pode ter controle. 

4 - Revisão de código.

Peça pro seu time revisar seu código e não tenha medo de consertá-lo quantas vezes for necessário. Os membros mais experientes do seu time já passaram por isso e podem lhe apontar o melhor caminho.
Várias vezes a discussão pode recair sobre um ponto filosófico onde ambas as respostas estão certas: considere a sua e defenda-a com afinco mas saiba quando soltar a corda. 


No fim desse processo, se Deus quiser, você vai ter um código melhor do que antes e com efeitos colaterais altamente contornáveis e que são menos preocupantes que o bug inicial.

Não tenha medo de perguntar, se comunique!
Boa noite, meus amigos cafeinados.
Um abraço!



sábado, 22 de outubro de 2016

Você é estagiário, júnior, pleno, sênior ou master?

Boa noite, meus queridos leitores imaginários.
Nessa data que vos falo vocês ainda não são muitos mas eu vos amo com afinco.


Tudo bom?

Como saber onde estou na hierarquia?

Não é uma tarefa fácil e nunca teremos uma regra em que todos os trabalhadores do mundo serão remunerados verdadeiramente pela posição que a pessoa tem na empresa.
Mas o intuito desse post é dar uma visão geral pra quem acha que merece mais e como fazer pra chegar lá ;)

Estagiário

Aqui é o início de tudo. Você infelizmente não sabe de nada. Nunca teve experiência e o máximo que você tem é lógica básica e fez uns printf na faculdade (lol). 
Aqui não há como errar:

  • Seja pontual.
  • Obedeça fielmente as regras que seus superiores lhe passarem.
  • Gaste muito mais tempo aprendendo a fazer do que fazendo efetivamente.
  • Pergunte as coisas certas pras pessoas certas nas horas certas.
  • Seja grato por todo o ensinamento que as pessoas estão lhe dando.
  • Pessoas vão tentar se aproveitar da sua ingenuidade (infelizmente é a realidade) tente minimizar esses efeitos.
  • Não sirva café pra NINGUÉM. Mostre que, apesar de sua inexperiência, você é uma força de trabalho e não é inferior à ninguém da equipe.
O tempo máximo de permanência nesse cargo é de 2 anos ou até você se formar na faculdade.

Júnior

Aqui você já passou por grande parte da inexperiência. Provavelmente já participou de dois ou mais projetos do início ao fim e a equipe te reconhece como força técnica.
Mesmo que ainda precise de um mentor para grande parte de suas decisões, você é bastante valioso pra equipe e para o projeto final.
Seus códigos ainda precisam ser revisados com afinco, sua lógica ainda não é refinada e as suas soluções, muito provavelmente, não são as melhores.
Para melhorar:

  • Leia mais de uma vez o seu próprio código.
  • Imagine todas as possibilidades de utilização da feature que você está desenvolvendo e se proteja da GRANDE maioria.
  • Revise o código dos seus amigos de equipe; não existe ganho mais precioso. Aqui você refina sua lógica ao aprender jeitos certos de fazê-los.
  • Não espere que seus colegas de equipe deleguem suas atribuições, puxe-as para sí.
  • Continue perguntando para maiores hierarquias por ajuda quando precisar. Não se arrisque.
  • Seja mais político quando puder. Você não vai conseguir chegar lá em cima sozinho. Isso é coisa do passado. 
O tempo máximo aqui é de 3 a 4 anos. Aproveite bastante esse tempo.

Pleno

Aqui você é uma força reconhecida pela equipe e pela empresa. Você consegue levar projetos se assim pedirem e você vai começar a se comunicar muito mais com as decisões de projeto.
Muitas vezes, em um projeto, uma decisão não está certa e nem errada. A primeira pessoa que um júnior olha nessas horas é pra um dos plenos. Você deve saber responder com segurança sobre dúvidas de regras de negócios e passar a mensagem para os menos experientes.

Para sair deste cargo:

  • Saiba fazer diagramas UML.
  • Conheça duas ou mais linguagens de programação.
  • Tenha uma boa habilidade em comunicação e seja pró-ativo.
  • Observe bem a sua equipe para ver se alguém precisa de ajuda. Se os júniors são os braços, você deve ser as juntas. 
  • Passe status para instâncias superiores e faça dailies boas.
  • Reformate o código sempre que necessário visando problemas futuros que você já sabe que vai acontecer.
Aqui não tem tempo máximo de permanência. Muitas pessoas escolhem ficar nessa posição pro resto da vida. É o balanço bastante favorável sobre responsabilidades e reconhecimento financeiro. Se você não é um cara muito político e não almeja um cargo de gerência, gaste bastante tempo aqui.

Sênior

Você já tem mais de 20 anos de experiência, já participou de mais projetos que você pode lembrar, andou por algumas empresas, perdeu alguns fios de cabelo e não sabe quando sua barriga começou a crescer tanto.
Aqui é uma posição de destaque em uma equipe. Você é a força máxima do projeto, tem conhecimento dos requisitos (uma vez que você participou do concebimento dos mesmos), tem acesso livre ao cliente e todos da sua equipe olham pra você como uma segurança se os tempos difíceis vierem.

Características:
  • Seu code review é impecável.
  • No começo do projeto você ditará melhor arquitetura, tecnologia, linguagem, tempo de projeto e quem você acha melhor estar na sua equipe.
  • O sucesso ou falha do projeto depende unicamente de você e é seu dever manter a máquina (sua equipe) girando bem.
  • Lê livros sobre arquiteturas, gerência de projeto e está bem mais do lado humano do projeto do que do código. 
  • Você PRECISA ser mais político aqui. Uma vez que você estará bem mais próximo do seu gerente ou dono da empresa, você precisa estar preparado para todos os momentos ser companheiro dele.

Master

Você é foda.
Você já tem uma história na empresa, já participou de projetos importantes e, pra infelicidade da empresa, eles não conseguem mais existir sem você.
Você tem domínio de mais de 3 linguagens e a linha de aprendizado quando te colocarem em alguma outra vai ser umas 5x mais rápido do que qualquer outra pessoa.
Sua lógica é refinadíssima e você é "macaco velho" para a grande maioria dos problemas.
Problemas esses que fogem de programação e estão em acrobacias em resolução de problemas.
(Sério, um master meu já resolveu um problema de rede manipulando bits em um pacote TCP.)

Conclusão

É isso galera, espero que você tenha conseguido uma noção maior de onde você está e/ou do que precisa fazer pra subir em sua empresa.
Infelizmente fatores como sucesso da empresa, momento econômico e uma pitada de sorte/azar podem fazer a velocidade de subir essa ladeira ser mais devagar ou mais rápida. Porém não desista! Se capacite e acredite em si. Vai dar tudo certo :D

Até mais, cafeinados!

segunda-feira, 17 de outubro de 2016

5 Características de um Bom programador

Boa noite, pessoal.
Tudo bom?

Hoje, numa mesa de almoço, eu e meus amigos entramos em um entrave ferrenho sobre o que faz um bom programador. O que realmente é importante pra você subir nessa estrada ingrime?

Algumas respostas cá estão:

1 - Fanático por ler código:

"Ah, mas eu leio código, Tiago".
Ah não lê não. 
O meu emprego atualmente envolve muito mais analise de código do que realmente efetivação do mesmo. Mesmo que eu esteja fazendo a mesma coisa há mais de 7 anos, eu me pego tendo PREGUIÇA de ler código constantemente.

É uma prática que deve ser estimulada desde o início. Pegue códigos na internet sobre exemplos de algo que vocês estejam aprendendo. Leiam linha por linha, englobem a logica por trás dela. Em muito pouco tempo suas capacidades tanto de lógica quanto de certeza no que vocês estarão programando, vai aumentar substancialmente.

2 - Design Pattern

Se vocês ainda não estão familiarizados com o termo, Design pattern deve ser a sua nova bíblia. Eles são regras de como resolver problemas com o conhecimento de caras que, em questão de idade, podem ser seus avôs.
Os caras passaram por todos os problemas que vocês tiveram/tem/terão durante a sua vida de programador.
Hoje, uma pessoa que fala pra mim que domina o conceito de design pattern, meu olho chega a brilhar!

3 - Ótimo em comunicação

Infelizmente, meus amigos, se você foi um daqueles que escolheu fazer faculdade de TI por que queria ficar longe de pessoas: você se deu mal.
Ser programador é viver em time. Você nunca será (e nem deve almejar ser) a estrela da equipe que faz tudo sozinho.
É comum a equipe fazer reuniões sobre desenvolvimento e, em diversas vezes, você vai ser posto cara a cara com o cliente e vai ter que defender uma série de interesses que vão além da programação.

Então, largue o Lol e vá ler um livro. :)

4 - Programar bem. Hoje, em duas línguas.

Haha, obvio não é mesmo?
Programar bem vai muito além de você se sentir firme com as suas capacidades.
Programar bem te dá visibilidade pro time, você se torna uma referência em tempos de dificuldades e é próximo do impossível você ser mal visto pela gerência.
Portanto, programe bem. Em mais de uma linguagem.
Hoje, por exemplo, Java e Python.

5 - Linux fag

Ah, galera. Desiste.
Windows é ótimo, eu adoro. Ele me permite jogar todos os meus jogos e nunca reclamou. (mentira)
Mas tá claro: pra você programar, use o Linux.

Esse sistema operacional te dá nativamente muitas das ferramentas que você vai precisar pra resolver seus problemas de uma maneira mais rápida e elegante.
Seus programas ficarão menores e você vai estar preparado pra programar mesmo que tenha uma pedra disponível.

A linha de aprendizado desse negócio é ABSURDAMENTE longa e dolorosa. Mas vai valer a pena, acredite.

--------------------

É isso, pessoal. 
Espero que tenha dado um norte pra vocês.

Mandem dúvidas :)

Atenciosamente,