Prazo é o que o contratante adora exigir e o programador odeio dar. Acho que depois da elicitação de requisitos, estibular prazo é a tarefa mais difícil na Engenharia de Software.
Mas porque é tão difícil dar um prazo? Simplesmente porque não sabemos ao certo o que temos que fazer e/ou quanto tempo levamos para realizar o trabalho.
Se o profissional não for precavido prazos podem se tornar coleira ou chicote para faze-lo trabalhar como um louco. Prazo também é como a história da corrente, sempre estoura no elo mais fraco, ou seja, o desenvolvedor.
E como lidar com este problema? Bem, dar prazos exatos é muito dificil, pra não dizer impossível, em desenvolvimento de software. Mas com experiencia passamos a aproximar cada vez mais as estimativas do valor real. O que aprendemos na verdade é lidar com especificações mal feitas e deixamos de aceitar requisitos de software ambiguos, inconsistentes, incompletos, e etc. Aprendemos a ler uma especificação de requisitos e sacar que ela não define bem o escopo nem oferece o subsidio necessário para desenvolver o software. Nestes casos o pior pecado que um programador pode cometer é presumir as coisas. Nossa cabeça nunca pensa como a do cliente e este tempo perdido com uma presunção errada não será pago.
Outra coisa que aprendemos a fazer é calcular o tempo médio de desenvolvimento de algumas rotinas base. Eu por exemplo sei quanto tempo eu levo para fazer um CRUD (Create, Retrieve, Updade e Delete) do zero com as diferentes frameworks e com determinados números de campos no banco de dados. Também sei quanto tempo eu levo para montar um front-end simples, quanto tempo levo para trabalhar com upload de arquivos e imagens, e etc. Este ‘time’ a gente pega com o tempo ou com mensuração. Mensurar estas coisas é o ideal. Sente no computador e cronometre o tempo que você leva para iniciar uma determinada rotina até termina-la, contando o tempo de pesquisas e tudo mais (só na vale ficar no MSN nem no Orkut). Depois jogue uns 30% de acrescimo.
Para facilitar, divida as rotinas em blocos menores de desenvolvimento. Por exemplo um cadastro de usuários poderia ser dividido em criação/consistencia do formulário front-end, depois a consistencia server-side, a persistencia do banco de dados e o tratamento dos erros. Cada etapa pode levar um X horas.
Outros comportamentos podem auxiliar não na estimativa, mas na preservação dela. Por exemplo, negar ou registrar interrupções no seu trabalho para realizar outras tarefas, registrar ou informar sempre que determinada rotina depender de informações do cliente, registrar ou negar mudanças de escopo, e ter em mente que você nunca vai trabalhar 8 horas por dia 5 dias por semana no código e que nem tudo depende de você, servidores podem sair do ar, HDs podem queimar, pode ter feriados na semana, reuniões gerenciais, etc.
Então, quando alguém lhe pedir um prazo da próxima vez, não dê a resposta no ato, a menos que esteja bastante confiante. Peça alguns dias e reflita sobre o caso. Seu chefe pode reclamar, mas diga que você não incorre em erro pedindo mais tempo para avaliar, mas pode comprometer a imagem da empresa estourando um prazo mal dado.
|
|
A maneira mais simples de evitar ataques por XSS é não permitir que códigos HTML não desejados sejam interpretados em suas páginas PHP. Para isto nós temos 3 funções muito úteis: htmlentities, htmlspecialchars e strip_tags Toda vez que uma informação vier de fontes externas não confiáveis é importante codifica-las usando htmlentities ou htmlspecialchars, que transformam os caracteres especiais em código ASCII, ou usar strip_tags que retira as tags HTML. Exemplo:
Mas as vezes queremos deixar passar algumas tags que não possuem código malicioso. Esta classe abaixo foi retirada do framework CodeIgniter e além de validar as informações vindas de GET, POST e COOKIE, ainda faz aquela validação $x = (isset($_POST/$_GET['x']))? …. É muito simples de usar. Salve o código num arquivo .php, por exemplo, validation.php, faça um include da classe em seus códigos e instancie a classe CI_Input.
XSS – Cross-Site Scripting Cross-site scripting (XSS) é um tipo de vulnerabilidade de segurança tipicamente encontrada em aplicações Web as quais permitem “injeções de código” por usuários web maliciosos dentro de páginas vistas por outros usuários. Exemplos de tais códigos incluem scritps client-side. A expressão “cross-site scripting” originou do fato que sites maliciosos podiam “carregar” outros sites dentro de frames ou janelas e então usar javascript para ler ou escrever informações neles. A definição gradualmente mudou para significar a injeção de HTML e javascript dentro de páginas Web, o que causou certa confusão visto que o nome não reflete a última definição. Também já foi chamado de CSS, mas para evitar confução com Cascading Style Sheets estaterminologia foi depreciada. XSS ultrapassou buffer overflow para tornar-se a vulnerabilidade mais comum reportada publicamente nos dias atuais, e pelo menos 68% dos websites são suscetíveis a ataques XSS de seus usuários. Ataques XSS são escritos em uma linguagem de script client-side, mais freqüentemente um dialeto de ECMAScript (por exemplo JavaScript, JScript), algumas vezes incluem alguma linguagem de marcação como HTML ou XHTML. Há três tipos de vulnerabilidades XSS : Não-persistente, Persistente e DOM-based (que pode ser tanto persistente como não-persistente); Não-Persistente A abertura para Cross-Site scripting não-persistente é também chamada como vulnerabilidade refletida, e é de longe o tipo mais comum. Esta abertura aparece quando informações fornecidas por um cliente Web é usada imediatamente pelo script Server-side para gerar uma página de resultado. Se informações não validadas fornecidas pelo usuário são incluídas em uma página sem codificação HTML, isto permitirá códigos client-side serem injetados dentro de páginas dinâmicas. Persistente A vulnerabilidade XSS persistente é também chamada como uma vulnerabilidade armazenada ou de segunda ordem, e permite o mais poderoso tipo de ataque. Este tipo de vulnerabilidade XSS existe quando informações fornecidas para uma aplicação Web por um usuário é primeiro persistida dentro do servidor (em um banco de dados, filesystem, ou outro tipo de local), e mais tarde mostrada para usuários em páginas Web sem serem codificadas usando HTML entities. Um exemplo clássico disto é com quadro de mensagem ou fóruns online, onde usuários são autorizados a postar mensagens formatadas com HTML para outros usuários lerem;
Dom-Based A vulnerabilidade DOM-based , também chamada como cross-site scripting local, é baseada sobre o Document Object Model (DOM). Com as vulnerabilidades cross-site scripting DOM-based, o problema existe dentro do próprio script client-side da página. Por exemplo, se uma parte do javascript acessa um parâmetro de uma requisição HTTP e usa esta informação para escrever algum HTML na própria página, e esta informação não é codificada usando HTML entities, uma abertura para XSS será criada, já que esta informação escrita pode ser re-interpretada pelo browser como HTML que pode incluir scripts client-side adicionais. Cenários de ataques Atacantes tentando explorar vulnerabilidades cross-site scripting podem aproveitar cada classe de vulnerabilidade diferentemente. Para cada classe, um ataque específico será descrito aqui, mas é óbvio que existem muito mais. Ataque de persistência simples
Ataque DOM-based
Ataque Não-persistente
Prevenção Evitar XSS requer ações por parte do usuário. Defesa contra XSS também é assunto para desenvolvedores de conteúdo e aplicação Web, além de fabricantes de navegadores. Usuários podem desabilitar os scripts, diversas boas práticas existem para desenvolvedores, aplicações Web podem ser testadas e revistas antes de serem lançadas, e alguns browser hoje implementam um pouco de controle de segurança; Este post tentou apresentar uma visão geral sobre este tipo de ataque, o conteúdo foi retirado daqui. Nos próximos posts entrarei em detalhes em como nós, desenvolvedores, podemos nos prevenir e como podemos testar nossas aplicações, fornecendo vários exemplos de ataques já conhecidos. Testando a documentação PHP, Java, .NET, Ruby e PythonPosted on 5 de agosto de 2009 by Editor in ComparandoEste teste não pretende demonstrar qual é a melhor documentação, mas pode servir como indicativo para a complexidade da curva de aprendizado de uma destas linguagens. É um teste simples. A metodologia não é muito cientifica, mas vou tentar não ser parcial. Escolherei um comando em cada linguagem, provavelmente algum correspondente ao ‘echo’ do PHP e partirei do Google. Farei uma busca pelo nome da linguagem, em seguida buscarei entre os resultados o site oficial e digitarei na caixa de busca o nome do comando. Vamos lá: PHP – echo
Java – print (System.out.print)
.Net C# – WriteLine (System.Console.WriteLine)
Ruby – puts
Python – print
Conclusão Ter uma boa ferramenta de suporte, com um conteúdo simples, objetivo e acessível pode fazer a diferença durante o aprendizado de uma linguagem. Também pode ser essencial em problemas que demandem recursos pouco usados no dia-dia do programador. São minutos que vão se somando e fazem a curva de aprendizagem ser grande ou o estudo de determinada solução ser demorado. Quem desenvolve a algum tempo já deve ter se deparado com a dúvida: Qual framework escolher? Eu conheço 5, que talvez sejam as mais utilizadas. São elas a ZendFramework, CakePHP, Symphony, PradoPHP e CodeIgniter. Destas, já tive a oportunidade de usar em projetos profissionais a CakePHP, ZendFramework e CodeIgniter. As outras eu estudei durante alguns projetos. Existe um fator importante neste assunto que é afinidade. Além de todas as características técnicas que diferem uma da outra ou que as tornam melhores ou piores em algumas situações, a afinidade costuma ser um ponto decisivo para a escolha. Afinidade que digo é o quanto você se sente a vontade usando a arquitetura que a framework oferece, os seus padrões e a sua documentação. Depois de usar estas frameworks acabei optando pela CodeIgniter. Além da afinidade que criei com ela, gostei muito de sua simplicidade. Sua curva de aprendizagem é pequena, rapidamente se aprende a desenvolver código robusto com produtividade. Sua documentação é bem organizada e traduzida para o português (apesar de eu preferir a versão em inglês). Ela não exige mudanças no servidor Web ou módulos adicionais no PHP. Não lhe obriga a seguir muitos padrões nem possui muitos arquivos de configuração. É leve, rápida e extremamente flexível. Muita gente pergunta sobre a ZendFramework. A Zend, empresa por trás do PHP, esta investindo muito dinheiro e tempo no aperfeiçoamento da tecnologia e na sua divulgação. Uma das suas qualidades esta na quantidade de módulos para acesso a serviços na Internet, como Google, Delicious e Flickr, e na sua integração com outras tecnologias como o Adobe Flash e o LDAP. Mas na minha opinião, o que pesa contra ela é sua complexidade. Ela exige o módulo PDO no PHP, possui uma arquitetura MVC onde o Model só esta tomando forma de umas versões para cá. Não acho a ZendFramework produtiva, me pareceu que a Zend esta querendo flertar com um tipo de filosofia parecida com a do Java. Não que isto seja ruim, mas pessoalmente não gostei. Contra a CodeIgniter só tem a falta de alguns recursos nativamente, como suporte a SOAP e REST, também há uma classe que controla a sessão baseada em COOKIE (particularmente ruim), mas nada que não possa ser adicionado/mudado com facilidade. Mas para você poder tomar uma decisão, não fique lendo artigos na Internet. Eles ajudam, com certeza, mas podem ser parciais. As pessoas muitas vezes criticam o que não conhecem direito. Então a melhor forma de escolher uma framework é baixando ela para o seu servidor local e utilizando-a numa aplicação simples, um formulário de cadastro, com opção de edição e exclusão de registros. Teste, leia a documentação, veja como ela trabalha, o quanto ela carrega o servidor e principalmente se é possível para você criar afinidade com ela. Pode ser ruim no começo, você irá gastar algumas horas, ou dias, fazendo testes. Mas irá me agradecer no futuro quando estiver no meio do desenvolvimento de um software e perceber que escolheu uma ótima ferramenta para lhe apoiar. Gostaria de compartilhar um pouco do que eu já vivenciei no mercado trabalhando com PHP. Estas informações não são “padrões” ou “verdades” do mercado de forma alguma. Salário é uma dúvida comum, principalmente para quem esta começando na profissão e tem pouca experiência. Salário de um profissional, qualquer que seja, varia de acordo com uma série de fatores. Na minha opinião os mais significativos para um programador PHP são: Competência, Localização e Tamanho.
Trabalhando com PHP eu já vi CLT variando de R$400 (interior de São Paulo, profissional junior) à R$4500 (Capital, profissional sênior) e PJ/Freelancer de R$4 à R$30 por hora. Talvez existam pessoas ganhando mais, talvez ganhando menos. Interessante ver também como variam o valor/hora das empresas que trabalham com PHP. Já vi empresas cobrando de R$90 à R$50 por hora na capital, no interior já vi até a R$25 por hora. Quanto maior a empresa, mais caro será seu valor hora, são mais impostos, mais funcionários e mais propaganda. Para saber exatamente quanto você precisa ganhar é necessário fazer alguns calculos e não pesquisar valores no mercado. Tanto profissionais quanto empresas precisam saber quanto vale seu “custo de vida”. Aluguel, telefone, água, seguro saúde, transporte, refeições são alguns dos custos que deve conhecer. Some tudo o que você gasta, depois adicione quanto você gostaria de “lucrar” (ou você quer trabalhar só para pagar as contas?), por fim adicione a carga tributária (INSS, ISS, etc…). Quando chegar a um valor divida por 160 horas e saberá quanto deverá ser seu valor/hora para viver como quer. |

Google: Java – Obviamente o resultado anterior não era o que esperava. Como sou um programador esperto, deduzi que não acharia a documentação do Java em java.com, então voltei para o Google digitei novamente java e fui para o quarto link do resultado java.sun.com
Busca: Não era exatamente o que eu queria, mas talvez aqui possa achar algo. Dou umas giradas no scroll do mouse e desisto de procurar manualmente, clico em Ctrl+F e busco por ‘print’. Encontro finalmente um print, mas é println. Resolvo clicar num link perto que me parece bastante promissor “PrintStream.println()”. Já dá pra entender o que print deve fazer, mas quero chegar na definição do método. Dentro do PrintStream.println() acho finalmente o print depois de uns giros do scroll. Acho que é o mesmo que System.out.print, apesar de não estar explicito;





Posts (RSS)